MME2 changes - Propped commits from openmme/paging branch. Added scripts
for code gen

Change-Id: Ie55032217232214ac8544ca76ea34335205329e4
diff --git a/src/cmn/Makefile b/src/cmn/Makefile
new file mode 100644
index 0000000..69bb798
--- /dev/null
+++ b/src/cmn/Makefile
@@ -0,0 +1,73 @@
+#
+# Copyright (c) 2019, Infosys Ltd.
+#
+# 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.
+#
+
+include ../../Makefile.common
+
+CC := g++
+CFLAGS += -std=c++11 
+
+ifeq ($(DEBUG),true)
+        CFLAGS += -g
+endif
+ifeq ($(DEBUG),false)
+        CFLAGS += -O3
+endif
+
+IPC_LIBNAME = $(LIBDIR)/libipcfwk.so
+DATAGROUPMGR_LIBNAME = $(LIBDIR)/libdatagroupmgr.so
+CMNUTILS_LIBNAME = $(LIBDIR)/libcmnUtils.so
+
+IPC_SRCS := ./ipcChannel.cpp  \
+            ./tipcSocket.cpp
+DATAGROUPMGR_SRCS := ./dataGroupManager.cpp
+CMNUTILS_SRCS := ./debug.cpp \
+		./msgBuffer.cpp
+
+SRCDIR := .
+SRCEXT := cpp
+IPC_OBJS := $(patsubst $(SRCDIR)/%,$(OBJDIR)/cmn/%,$(IPC_SRCS:.$(SRCEXT)=.o))
+DATAGROUPMGR_OBJS := $(patsubst $(SRCDIR)/%,$(OBJDIR)/cmn/%,$(DATAGROUPMGR_SRCS:.$(SRCEXT)=.o))
+CMNUTILS_OBJS := $(patsubst $(SRCDIR)/%,$(OBJDIR)/cmn/%,$(CMNUTILS_SRCS:.$(SRCEXT)=.o))
+
+
+OBJS := $(IPC_OBJS) \
+	$(DATAGROUPMGR_OBJS)\
+	$(CMNUTILS_OBJS)
+
+all : buildCommonLIBS
+
+buildCommonLIBS : $(OBJS)
+	@echo "Linking"
+	@mkdir -p $(LIBDIR)
+	$(CC) $(CFLAGS) $(IPC_OBJS) -shared -o $(IPC_LIBNAME)
+	$(CC) $(CFLAGS) $(DATAGROUPMGR_OBJS) -shared -o $(DATAGROUPMGR_LIBNAME)
+	$(CC) $(CFLAGS) $(CMNUTILS_OBJS) -shared -o $(CMNUTILS_LIBNAME)
+
+$(OBJS) : $(OBJDIR)/cmn/%.o : $(SRCDIR)/%.cpp
+	@mkdir -p $(OBJDIR)/cmn
+	$(CC) $(CFLAGS) $(INC_DIRS) -fPIC -c -o $@ $<
+
+install:all
+	-@mkdir -p $(TARGET_DIR)/lib
+	-@cp $(IPC_LIBNAME) $(TARGET_DIR)/lib
+	-@cp $(DATAGROUPMGR_LIBNAME) $(TARGET_DIR)/lib
+	-@cp $(CMNUTILS_LIBNAME) $(TARGET_DIR)/lib
+
+clean:
+	@echo " Cleaning...";
+	-@rm -rf $(OBJDIR)/cmn
+	-@rm -f $(IPC_LIBNAME) $(DATAGROUPMGR_LIBNAME) $(CMNUTILS_LIBNAME)
+
diff --git a/src/cmn/dataGroupManager.cpp b/src/cmn/dataGroupManager.cpp
new file mode 100644
index 0000000..9799c8a
--- /dev/null
+++ b/src/cmn/dataGroupManager.cpp
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include "dataGroupManager.h"
+#include "memPoolManager.h"
+
+namespace cmn {
+namespace DGM
+{
+	DataGroupManager::DataGroupManager():cbstore_m(NULL)
+	{
+
+	}
+	
+	DataGroupManager::~DataGroupManager()
+	{
+		delete[] cbstore_m;
+	}
+	
+	void DataGroupManager::initializeCBStore( int DataCount )
+	{
+		cbstore_m = new ControlBlock[DataCount];
+		for( int idx = 0; idx < DataCount; idx ++ )
+		{
+			freeQ_m.push_back( &cbstore_m[idx] );
+		}
+	}
+	
+	ControlBlock* DataGroupManager::allocateCB()
+	{
+		std::lock_guard<std::mutex> lock(mutex_m);
+
+		ControlBlock* cbp = freeQ_m.front();
+		freeQ_m.pop_front();
+
+		if (cbp != NULL)
+		{
+		    cbp->setControlBlockState(ALLOCATED);
+		}
+
+		return cbp;
+	}
+
+	ControlBlock* DataGroupManager::findControlBlock(uint32_t cbIndex)
+	{
+		ControlBlock* cbp = &cbstore_m[cbIndex - 1];
+		if (cbp != NULL && cbp->getControlBlockState() != FREE)
+		    return cbp;
+		else
+		    return NULL;
+	}
+	
+	void DataGroupManager::deAllocateCB( uint32_t cbIndex )
+	{
+        cbstore_m[cbIndex - 1].reset();
+
+		std::lock_guard<std::mutex> lock(mutex_m);
+		freeQ_m.push_back( &cbstore_m[cbIndex - 1]);
+	}
+};
+};
diff --git a/src/cmn/debug.cpp b/src/cmn/debug.cpp
new file mode 100644
index 0000000..b574468
--- /dev/null
+++ b/src/cmn/debug.cpp
@@ -0,0 +1,119 @@
+/*
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <debug.h>
+
+using namespace cmn::utils;
+
+Debug::Debug()
+{
+  indent = 0;
+  newLine = true;
+}
+
+Debug::~Debug()
+{
+  //TODO
+}
+
+void Debug::printDebugStream()
+{
+  fprintf(stderr, "%s" , stream.str().c_str());
+}
+
+void Debug::clearStream()
+{
+  stream.str("");
+}
+
+void Debug::printDebugStreamToFile()
+{
+  // TODO 
+}
+
+void Debug::add(char* data)
+{
+  if (newLine)
+     startNewLine();
+  stream << data;
+}
+
+void Debug::add(uint8_t data)
+{
+  if (newLine)
+     startNewLine();
+  stream << (uint16_t)data;
+}
+
+void Debug::add(uint16_t data)
+{
+  if (newLine)
+     startNewLine();
+  stream << data;
+}
+
+void Debug::add(uint32_t data)
+{
+  if (newLine)
+     startNewLine();
+  stream << data;
+}
+
+void Debug::add(uint64_t data)
+{
+  if (newLine)
+     startNewLine();
+  stream << data;
+}
+
+
+void Debug::endOfLine()
+{
+  stream <<"\n";
+  newLine = true;
+}
+
+void Debug::startNewLine()
+{
+  uint8_t i;
+  for (i = 0; i<= indent; i++)
+  {
+    stream <<"  ";
+  }
+  newLine = false;
+}
+
+void Debug::incrIndent()
+{
+  indent++;
+}
+
+void Debug::decrIndent()
+{
+  if (indent > 0)
+    indent --;
+}
+
+void Debug::setHexOutput()
+{
+  stream.setf(ios::hex, ios::basefield);
+}
+
+void Debug::unsetHexOutput()
+{
+  stream.unsetf(ios::hex);
+}
+
diff --git a/src/cmn/ipcChannel.cpp b/src/cmn/ipcChannel.cpp
new file mode 100644
index 0000000..7e5071d
--- /dev/null
+++ b/src/cmn/ipcChannel.cpp
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include "../../include/cmn/ipcChannel.h"
+
+namespace cmn {
+namespace ipc {
+
+IpcChannel::IpcChannel(IpcChannelType ipcType):
+		ipcType_m(ipcType),
+		ipcHdl_m()
+{
+
+}
+
+IpcChannel::~IpcChannel()
+{
+
+}
+
+IpcChannelType IpcChannel::getIpcChannelType() const
+{
+	return ipcType_m;
+}
+
+void IpcChannel::setIpcChannelType(const IpcChannelType ipcType)
+{
+	ipcType_m = ipcType;
+}
+
+IpcChannelHdl IpcChannel::getIpcChannelHdl() const
+{
+	return ipcHdl_m;
+}
+
+void IpcChannel::setIpcChannelHdl(const IpcChannelHdl ipcHdl, const IpcChannelType ipcType)
+{
+	if (ipcType == IpcChannelType::tipc_c)
+		ipcHdl_m.u32 = ipcHdl.u32;
+}
+
+} /* namespace ipc */
+} /* namespace cmn */
diff --git a/src/cmn/msgBuffer.cpp b/src/cmn/msgBuffer.cpp
new file mode 100644
index 0000000..2255b37
--- /dev/null
+++ b/src/cmn/msgBuffer.cpp
@@ -0,0 +1,378 @@
+/*
+ * msgBuffer.cpp
+ *
+ *  Created on: Dec 2012
+ *      Author: hariharanb
+ */
+
+#include <arpa/inet.h>
+#include <stdio.h>
+#include <string.h>
+#include <basicTypes.h>
+#include <msgBuffer.h>
+
+using namespace std;
+
+using namespace cmn::utils;
+
+MsgBuffer::MsgBuffer()
+{
+	initialize(DEFAULT_BUFF_SIZE);
+}
+
+MsgBuffer::MsgBuffer(uint16_t size)
+{
+	initialize(size);
+}
+
+MsgBuffer::~MsgBuffer()
+{
+	delete data_mp;
+}
+
+void MsgBuffer::initialize(uint16_t size)
+{
+	bufSize = size;
+	data_mp = new uint8_t[size];
+	memset(data_mp, 0, size);
+	bitIndex = 0;
+	byteIndex = 0;
+	length = 0;
+	bitLength = 0;
+}
+
+bool MsgBuffer::writeBits(uint8_t data, uint8_t size, bool append)
+{
+
+    uint8_t mask = (0xFF >> (8 - size));
+    data = data & mask;
+
+	if ((bitIndex + size) <= 8)
+	{
+		if (append)
+		{
+			goToEnd();
+		}
+
+		data_mp[byteIndex] = data_mp[byteIndex] | (data << (8-(bitIndex+size)));
+		incrBitIndex(size);
+
+		return true;
+
+	}
+	else
+	{
+		// Attempt to write beyond byte boundary
+		return false;
+	}
+}
+
+bool MsgBuffer::writeBytes(uint8_t* data, uint16_t size, bool append)
+{
+	bool rc = false;
+	if (bitIndex == 0)
+	{
+		if (append)
+		{
+			goToEnd();
+		}
+
+		if ((byteIndex + size) <= bufSize)
+		{
+			memcpy(&data_mp[byteIndex], data, size);
+			rc = incrByteIndex(size);
+			if (byteIndex > length)
+			{
+				length = byteIndex;
+			}
+		}
+	}
+	return rc;
+}
+
+bool MsgBuffer::writeUint8(uint8_t data,  bool append)
+{
+	return writeBytes(&data, sizeof(uint8_t), append);
+}
+
+bool MsgBuffer::writeUint16(uint16_t data,  bool append)
+{
+	uint16_t localData = htons(data);
+	return writeBytes((uint8_t*)&localData, sizeof(uint16_t), append);
+}
+
+bool MsgBuffer::writeUint32(uint32_t data,  bool append)
+{
+	uint32_t localData = htonl(data);
+	return writeBytes((uint8_t*)&localData, sizeof(uint32_t), append);
+}
+
+bool MsgBuffer::writeUint64(uint64_t data, bool append)
+{
+	uint64_t localData = htonl(data);
+	return writeBytes((uint8_t*)&localData, sizeof(uint64_t), append);
+}
+
+bool MsgBuffer::readBit()
+{
+	uint8_t byteValue = data_mp[byteIndex];
+	uint8_t bitMask = 0x80;
+	bitMask = bitMask >> bitIndex;
+
+	// Adjust the indices
+	incrBitIndex(1);
+
+	if (byteValue & bitMask)
+	{
+		return true;
+	}
+	else
+	{
+		return false;
+	}
+}
+
+void MsgBuffer::readUint8(uint8_t &data)
+{
+	data = data_mp[byteIndex];
+	nextByte();
+}
+
+bool MsgBuffer::readUint16(uint16_t &data)
+{
+	if ((byteIndex + sizeof(uint16_t)) <= length)
+	{
+		memcpy(&data, &data_mp[byteIndex], sizeof(uint16_t));
+		data = ntohs(data);
+		incrByteIndex(sizeof(uint16_t));
+		return true;
+	}
+	else
+	{
+		return false;
+	}
+}
+
+bool MsgBuffer::readUint32(uint32_t &data)
+{
+	if ((byteIndex + sizeof(uint32_t)) <= length)
+	{
+		memcpy(&data, &data_mp[byteIndex], sizeof(uint32_t));
+		data = ntohl(data);
+		incrByteIndex(sizeof(uint32_t));
+		return true;
+	}
+	else
+	{
+		return false;
+	}
+}
+
+bool MsgBuffer::readUint64(uint64_t &data)
+{
+	if ((byteIndex + sizeof(uint64_t)) <= length)
+	{
+		memcpy(&data, &data_mp[byteIndex], sizeof(uint64_t));
+		data = ntohl(data);
+		incrByteIndex(sizeof(uint64_t));
+		return true;
+	}
+	else
+	{
+		return false;
+	}
+}
+
+uint8_t MsgBuffer::readBits(uint16_t size)
+{
+	uint8_t data = 0;
+
+	if ((bitIndex + size) > 8)
+	{
+		cout << "Attempt to read beyond byte boundary";
+		return 0;
+	}
+
+	uint16_t i;
+	for (i = 0; i <size; i++)
+	{
+		data = data << 1;
+		if (readBit())
+		{
+			data = data | 0x0001;
+		}
+	}
+	return data;
+}
+
+
+bool MsgBuffer::readBytes(uint8_t* data, uint16_t size)
+{
+	if ((byteIndex + size) <= length)
+	{
+		memcpy(data, &data_mp[byteIndex], size);
+		byteIndex += size;
+		bitIndex   = 0;
+		return true;
+	}
+	else
+	{
+		return false;
+	}
+
+
+}
+
+void MsgBuffer::rewind()
+{
+	bitIndex = 0;
+	byteIndex = 0;
+}
+
+void MsgBuffer::reset()
+{
+	memset(data_mp, 0, length);
+	rewind();
+    length = 0;
+    bitLength = 0;
+}
+
+void MsgBuffer::skipBits(uint8_t size)
+{
+	incrBitIndex(size);
+}
+
+void MsgBuffer::skipBytes(uint16_t size)
+{
+	incrByteIndex(size);
+}
+
+void MsgBuffer::display(Debug &stream)
+{
+
+}
+
+bool MsgBuffer::incrBitIndex(uint8_t size)
+{
+    bool rc = false;
+    if ((bitIndex + size) <= 8)
+    {
+    	uint16_t savedBitIndex = bitIndex;
+    	bitIndex += size;
+        rc = true;
+    	if (bitIndex == 8)
+    	{
+    	  rc = incrByteIndex(1);
+          bitIndex = 0;
+    	}
+
+    	if (!rc)
+    	{
+    		bitIndex = savedBitIndex;
+    	}
+    }
+    // adjust the length now
+    if ((byteIndex == length)&&(bitIndex > bitLength))
+    {
+      bitLength = bitIndex;
+    }
+    else if (byteIndex > length)
+    {
+      length = byteIndex;
+      bitLength = bitIndex;
+    }
+    return rc;
+}
+
+bool MsgBuffer::incrByteIndex(uint16_t size)
+{
+	if ((byteIndex + size) <= bufSize)
+	{
+		byteIndex += size;
+		return true;
+	}
+	else
+	{
+		return false;
+	}
+}
+
+void MsgBuffer::nextByte()
+{
+	byteIndex++;
+	if (byteIndex > length)
+	{
+		byteIndex = 0;
+	}
+	bitIndex = 0;
+}
+
+void MsgBuffer::goToEnd()
+{
+	byteIndex = length;
+	bitIndex = bitLength;
+}
+
+uint16_t MsgBuffer::getLength()
+{
+       if (bitIndex == 0)
+           return length;
+       else
+           return (length + 1);
+}
+
+uint16_t MsgBuffer::getBufferSize()
+{
+  return bufSize;
+}
+
+uint16_t MsgBuffer::getCurrentIndex()
+{
+       return byteIndex;
+}
+
+void MsgBuffer::goToIndex(uint16_t idx)
+{
+       byteIndex = idx;
+}
+
+uint16_t MsgBuffer::lengthLeft()
+{
+  return (length - byteIndex);
+}
+
+uint16_t MsgBuffer::sizeLeft()
+{
+  return (bufSize - byteIndex);
+}
+
+void* MsgBuffer::getDataPointer() 
+{
+  return data_mp;
+}
+
+void MsgBuffer::setLength(uint16_t bufLen)
+{
+  length = bufLen;
+}
+
+uint8_t MsgBuffer::charToHex (uint8_t x)
+{
+  if ((x >= '0') && (x <= '9'))
+  {
+    return (x - '0');
+  }
+  else if ((x >= 'a') && (x <= 'f'))
+  {
+    return (x - 'a' + 10);
+  }
+  else if ((x >= 'A') && (x <= 'F'))
+  {
+    return (x - 'A' + 10);
+  }
+  else
+  {
+    return 0;
+  }
+}
+
diff --git a/src/cmn/tipcSocket.cpp b/src/cmn/tipcSocket.cpp
new file mode 100644
index 0000000..044dcd2
--- /dev/null
+++ b/src/cmn/tipcSocket.cpp
@@ -0,0 +1,119 @@
+/*
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include "../../include/cmn/tipcSocket.h"
+#include "../../include/cmn/tipcTypes.h"
+#include "../../include/common/log.h"
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <unistd.h>
+#include <linux/tipc.h>
+
+#define TIPC_SERVICE_ADDR       2
+
+namespace cmn {
+namespace ipc {
+
+TipcSocket::TipcSocket():IpcChannel(IpcChannelType::tipc_c)
+{
+	initialize();
+}
+
+TipcSocket::~TipcSocket()
+{
+	if (ipcHdl_m.u32 > 0)
+		close(ipcHdl_m.u32);
+}
+
+void TipcSocket::initialize()
+{
+	ipcHdl_m.u32 = socket(AF_TIPC, SOCK_RDM, 0);
+    if (ipcHdl_m.u32 <= 0)
+        log_msg(LOG_ERROR, "Failed to create TIPC socket. error: %s", strerror(errno));
+
+    return;
+}
+
+bool TipcSocket::bindTipcSocket(IpcAddress myAddress)
+{
+	if (ipcHdl_m.u32 <= 0)
+	{
+		log_msg(LOG_ERROR, "Invalid socket fd");
+		return false;
+	}
+
+    struct sockaddr_tipc server;
+
+    server.family = AF_TIPC;
+    server.addrtype = TIPC_SERVICE_ADDR;
+    server.scope = TIPC_CLUSTER_SCOPE;
+    server.addr.name.name.type = tipcServiceAddressType_c;
+    server.addr.name.name.instance = myAddress.u32;
+
+    bool rc = true;
+
+    if (0 != bind(ipcHdl_m.u32, (sockaddr*)&server, sizeof(server)))
+    {
+    	log_msg(LOG_ERROR, "Failed to bind TIPC socket. error: %s", strerror(errno));
+        rc = false;
+    }
+    return rc;
+}
+
+void TipcSocket::sendMsgTo(void * buffer, uint32_t len, IpcAddress destAddress)
+{
+    struct sockaddr_tipc dest;
+    dest.family = AF_TIPC;
+    dest.addrtype = TIPC_SERVICE_ADDR;
+    dest.scope = TIPC_CLUSTER_SCOPE;
+    dest.addr.name.domain = 0;
+    dest.addr.name.name.type = tipcServiceAddressType_c;
+    dest.addr.name.name.instance = destAddress.u32;
+
+
+   if (0 > sendto(ipcHdl_m.u32, buffer, len, 0, (sockaddr*)&dest, sizeof(dest)))
+   {
+	   log_msg(LOG_ERROR, "Failed to send message via TIPC socket. error: %s", strerror(errno));
+   }
+   else
+   {
+	   log_msg(LOG_INFO, "Message sent successfully");
+   }
+}
+
+
+uint32_t TipcSocket::recvMsgFrom(void * buffer, uint32_t len, IpcAddress& srcAddr)
+{
+    uint32_t bytesRead = 0;
+
+    struct sockaddr_tipc client;
+    socklen_t alen = sizeof(client);
+
+    if ((bytesRead = recvfrom(ipcHdl_m.u32, buffer, len, 0,
+			    (struct sockaddr *)&client, &alen)) > 0) 
+    {
+    	srcAddr.u32 = client.addr.name.name.instance;
+    }
+
+    return bytesRead;
+}
+
+} /* namespace ipc */
+} /* namespace cmn */
diff --git a/src/common/Makefile b/src/common/Makefile
new file mode 100644
index 0000000..1d5521b
--- /dev/null
+++ b/src/common/Makefile
@@ -0,0 +1,85 @@
+#
+# Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+# Copyright (c) 2017 Intel Corporation
+# Copyright (c) 2019, Infosys Ltd.
+#
+# 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.
+#
+include ../../Makefile.common
+
+ifeq ($(DEBUG),true)
+	CFLAGS += -g
+endif
+
+ifeq ($(DEBUG),false)
+	CFLAGS += -O3
+endif
+
+IF_LIBNAME = $(LIBDIR)/libinterface.so
+JSON_PARSER_LIBNAME = $(LIBDIR)/libjson.so
+LOG_LIBNAME = $(LIBDIR)/liblog.a
+TPOOL_LIBNAME = $(LIBDIR)/libthreadpool.a
+UTIL_LIBNAME = $(LIBDIR)/libsecutil.so
+
+IF_SRC = ./ipc_api.c
+LOG_SRC = ./log.c
+TPOOL_SRC = ./thread_pool.c ./tpool_queue.c
+JSON_PARSER_SRC = ./json_parser.c
+UTIL_SRC = ./snow_3g.c ./f8.c ./f9.c
+
+SRCDIR := .
+SRCEXT := c
+IF_OBJS := $(patsubst $(SRCDIR)/%,$(OBJDIR)/common/%,$(IF_SRC:.$(SRCEXT)=.o))
+LOG_OBJS := $(patsubst $(SRCDIR)/%,$(OBJDIR)/common/%,$(LOG_SRC:.$(SRCEXT)=.o))
+TPOOL_OBJS := $(patsubst $(SRCDIR)/%,$(OBJDIR)/common/%,$(TPOOL_SRC:.$(SRCEXT)=.o))
+JSON_PARSER_OBJS := $(patsubst $(SRCDIR)/%,$(OBJDIR)/common/%,$(JSON_PARSER_SRC:.$(SRCEXT)=.o))
+UTIL_OBJS := $(patsubst $(SRCDIR)/%,$(OBJDIR)/common/%,$(UTIL_SRC:.$(SRCEXT)=.o))
+
+OBJS := $(IF_OBJS) \
+        $(LOG_OBJS)\
+        $(TPOOL_OBJS) \
+	$(JSON_PARSER_OBJS) \
+	$(UTIL_OBJS)
+
+build_commonLibs: $(OBJS)
+	-@echo "Linking..."
+	-@mkdir -p $(LIBDIR)
+	$(CC) $(CFLAGS) $(IF_OBJS) -shared -o $(IF_LIBNAME)
+	$(CC) $(CFLAGS) $(JSON_PARSER_OBJS) -shared -o $(JSON_PARSER_LIBNAME)
+	$(CC) $(CFLAGS) $(UTIL_OBJS) -shared -o $(UTIL_LIBNAME)
+	ar rcs $(LOG_LIBNAME) $(LOG_OBJS)
+	ar rcs $(TPOOL_LIBNAME) $(TPOOL_OBJS)
+
+$(OBJS) : $(OBJDIR)/common/%.o : $(SRCDIR)/%.c
+	-@mkdir -p $(OBJDIR)/common
+	$(CC) $(CFLAGS) $(INC_DIRS) -fPIC -c -o $@ $<
+
+all: build_commonLibs
+
+install:all
+	-@mkdir -p $(TARGET_DIR)/lib
+	-@mkdir -p $(TARGET_DIR)/conf
+	-@cp $(IF_LIBNAME) $(TARGET_DIR)/lib
+	-@cp $(LOG_LIBNAME) $(TARGET_DIR)/lib
+	-@cp $(JSON_PARSER_LIBNAME) $(TARGET_DIR)/lib
+	-@cp $(UTIL_LIBNAME) $(TARGET_DIR)/lib
+	-@cp $(TPOOL_LIBNAME) $(TARGET_DIR)/lib
+
+clean:
+	rm -f $(OBJDIR)/common
+	rm -f $(IF_LIBNAME) \
+	      $(JSON_PARSER_LIBNAME) \
+	      $(UTIL_LIBNAME) \
+	      $(LOG_LIBNAME) \
+	      $(TPOOL_LIBNAME)
+
diff --git a/src/common/f8.c b/src/common/f8.c
new file mode 100644
index 0000000..dd43c42
--- /dev/null
+++ b/src/common/f8.c
@@ -0,0 +1,80 @@
+
+#include "f8.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+
+/* The code has been referred from
+ *
+ * 1.https://www.gsma.com/aboutus/wp-content/uploads/2014/12/uea2uia2d1v21.pdf
+ * 2.https://www.gsma.com/aboutus/wp-content/uploads/2014/12/snow3gspec.pdf
+ *
+ */
+
+
+
+/* f8.
+ * Input key: 128 bit Confidentiality Key.
+ * Input count:32-bit Count, Frame dependent input.
+ * Input bearer: 5-bit Bearer identity (in the LSB side).
+ * Input dir:1 bit, direction of transmission.
+ * Input data: length number of bits, input bit stream.
+ * Input length: 32 bit Length, i.e., the number of bits to be encrypted or
+ * decrypted.
+ * Output data: Output bit stream. Assumes data is suitably memory
+ * allocated.
+ * Encrypts/decrypts blocks of data between 1 and 2^32 bits in length as
+ * defined in Section 3.
+ */
+
+void f8( u8 *key, u32 count, u32 bearer, u32 dir, u8 *data, u32 length )
+{
+	u32 K[4],IV[4];
+	int n = ( length + 31 ) / 32;
+	int i=0;
+	u32 *KS;
+
+	/*Initialisation*/
+
+	/* Load the confidentiality key for SNOW 3G initialization as in section
+		3.4.(https://www.gsma.com/aboutus/wp-content/uploads/2014/12/snow3gspec.pdf)
+	*/
+
+	for (i=0; i<4; i++)
+		K[3-i] = (key[4*i] << 24) ^ (key[4*i+1] << 16) ^ (key[4*i+2] << 8) ^
+		(key[4*i+3]);
+
+	/* Prepare the initialization vector (IV) for SNOW 3G initialization as in
+	section 3.4.(https://www.gsma.com/aboutus/wp-content/uploads/2014/12/snow3gspec.pdf) */
+
+
+	IV[3] = count;
+	IV[2] = (bearer << 27) | ((dir & 0x1) << 26);
+	IV[1] = IV[3];
+	IV[0] = IV[2];
+
+	/* Run SNOW 3G algorithm to generate sequence of key stream bits KS*/
+
+	Initialize(K,IV);
+	KS = (u32 *)malloc(4*n);
+	GenerateKeystream(n,(u32*)KS);
+
+	/* Exclusive-OR the input data with keystream to generate the output bit
+	stream */
+
+	for (i=0; i<n; i++)
+	{
+		data[4*i+0] ^= (u8) (KS[i] >> 24) & 0xff;
+		data[4*i+1] ^= (u8) (KS[i] >> 16) & 0xff;
+		data[4*i+2] ^= (u8) (KS[i] >> 8) & 0xff;
+		data[4*i+3] ^= (u8) (KS[i] ) & 0xff;
+	}
+
+	free(KS);
+
+}
+/* End of f8.c */
+
+
diff --git a/src/common/f9.c b/src/common/f9.c
new file mode 100644
index 0000000..c001641
--- /dev/null
+++ b/src/common/f9.c
@@ -0,0 +1,210 @@
+#include <stdio.h>
+#include <math.h>
+#include <string.h>
+
+#include "f9.h"
+
+/* The code has been referred from
+ * 1.https://www.gsma.com/aboutus/wp-content/uploads/2014/12/uea2uia2d1v21.pdf
+ * 2.https://www.gsma.com/aboutus/wp-content/uploads/2014/12/snow3gspec.pdf
+ *
+ */
+
+
+/* MUL64x.
+ * Input V: a 64-bit input.
+ * Input c: a 64-bit input.
+ * Output : a 64-bit output.
+ * A 64-bit memory is allocated which is to be freed by the calling
+ * function.
+ * See section 4.3.2
+ * (https://www.gsma.com/aboutus/wp-content/uploads/2014/12/snow3gspec.pdf)
+ * for more details.
+ */
+
+
+u64 MUL64x(u64 V, u64 c)
+{
+	if ( V & 0x8000000000000000 )
+	return (V << 1) ^ c;
+	else
+	return V << 1;
+}
+
+/* MUL64xPOW.
+ * Input V: a 64-bit input.
+ * Input i: a positive integer.
+ * Input c: a 64-bit input.
+ * Output : a 64-bit output.
+ * A 64-bit memory is allocated which is to be freed by the calling
+	function.
+ * See section 4.3.3
+ * (https://www.gsma.com/aboutus/wp-content/uploads/2014/12/snow3gspec.pdf)
+ * for more details.
+ */
+
+u64 MUL64xPOW(u64 V, u8 i, u64 c)
+{
+	if ( i == 0)
+		return V;
+	else
+		return MUL64x( MUL64xPOW(V,i-1,c) , c);
+
+	return V;
+}
+
+/* MUL64.
+ * Input V: a 64-bit input.
+ * Input P: a 64-bit input.
+ * Input c: a 64-bit input.
+ * Output : a 64-bit output.
+ * A 64-bit memory is allocated which is to be freed by the calling
+ * function.
+ * See section 4.3.4
+ * (https://www.gsma.com/aboutus/wp-content/uploads/2014/12/snow3gspec.pdf)
+ * for more details.
+ */
+
+
+u64 MUL64(u64 V, u64 P, u64 c)
+{
+	u64 result = 0;
+	int i = 0;
+	for ( i=0; i<64; i++)
+	{
+		if( ( P>>i ) & 0x1 )
+			result ^= MUL64xPOW(V,i,c);
+	}
+
+	return result;
+}
+
+
+/* mask8bit.
+ * Input n: an integer in 1-7.
+ * Output : an 8 bit mask.
+ * Prepares an 8 bit mask with required number of 1 bits on the MSB side.
+ */
+
+u8 mask8bit(int n)
+{
+	return 0xFF ^ ((1<<(8-n)) - 1);
+}
+
+/* f9.
+ * Input key: 128 bit Integrity Key.
+ * Input count:32-bit Count, Frame dependent input.
+ * Input fresh: 32-bit Random number.
+ * Input dir:1 bit, direction of transmission (in the LSB).
+ * Input data: length number of bits, input bit stream.
+ * Input length: 64 bit Length, i.e., the number of bits to be MAC'd.
+ * Output : 32 bit block used as MAC
+ * Generates 32-bit MAC using UIA2 algorithm as defined in Section 4.
+ */
+
+u8* f9( u8* key, u32 count, u32 fresh, u32 dir, u8 *data, u64 length)
+{
+	u32 K[4],IV[4], z[5];
+	u32 i=0,D;
+	static u8 MAC_I[4] = {0,0,0,0}; /* static memory for the result */
+	u64 EVAL;
+	u64 V;
+	u64 P;
+	u64 Q;
+	u64 c;
+	u64 M_D_2;
+	int rem_bits = 0;
+
+	/* Load the Integrity Key for SNOW3G initialization as in section 4.4. */
+
+	 for (i=0; i<4; i++)
+		 K[3-i] = (key[4*i] << 24) ^ (key[4*i+1] << 16) ^ (key[4*i+2] << 8) ^
+		 (key[4*i+3]);
+
+
+	/* Prepare the Initialization Vector (IV) for SNOW3G initialization as in
+		section 4.4 of
+		(https://www.gsma.com/aboutus/wp-content/uploads/2014/12/snow3gspec.pdf).
+	*/
+
+	IV[3] = count;
+	IV[2] = fresh;
+	IV[1] = count ^ ( dir << 31 ) ;
+	IV[0] = fresh ^ (dir << 15);
+	z[0] = z[1] = z[2] = z[3] = z[4] = 0;
+
+	/* Run SNOW 3G to produce 5 keystream words z_1, z_2, z_3, z_4 and z_5. */
+
+	Initialize(K,IV);
+	GenerateKeystream(5,z);
+
+	P = (u64)z[0] << 32 | (u64)z[1];
+	Q = (u64)z[2] << 32 | (u64)z[3];
+
+	/* Calculation */
+
+	if ((length % 64) == 0)
+		D = (length>>6) + 1;
+	else
+		D = (length>>6) + 2;
+
+	EVAL = 0;
+	c = 0x1b;
+
+	/* for 0 <= i <= D-3 */
+
+	for (i=0;i<D-2;i++)
+	{
+		V = EVAL ^ ( (u64)data[8*i ]<<56 | (u64)data[8*i+1]<<48 |
+			       (u64)data[8*i+2]<<40 | (u64)data[8*i+3]<<32 |
+			       (u64)data[8*i+4]<<24 | (u64)data[8*i+5]<<16 |
+			       (u64)data[8*i+6]<< 8 | (u64)data[8*i+7] );
+
+		EVAL = MUL64(V,P,c);
+	}
+
+	/* for D-2 */
+
+	rem_bits = length % 64;
+	if (rem_bits == 0)
+		rem_bits = 64;
+
+	M_D_2 = 0;
+	i = 0;
+
+	while (rem_bits > 7)
+	{
+		M_D_2 |= (u64)data[8*(D-2)+i] << (8*(7-i));
+		rem_bits -= 8;
+		i++;
+	}
+
+	if (rem_bits > 0)
+		M_D_2 |= (u64)(data[8*(D-2)+i] & mask8bit(rem_bits)) << (8*(7-i));
+
+	V = EVAL ^ M_D_2;
+	EVAL = MUL64(V,P,c);
+
+	/* for D-1 */
+
+	EVAL ^= length;
+
+	/* Multiply by Q */
+
+	EVAL = MUL64(EVAL,Q,c);
+
+	for (i=0; i<4; i++) {
+
+		/* GSLab-Intel modification to the specs reference code
+		 * https://www.gsma.com/aboutus/wp-content/uploads/2014/12/uea2uia2d1v21.pdf
+		 * which forgot to XOR z[5]
+		*/
+
+		MAC_I[i] = ((EVAL >> (8 * (7-i))) ^ (z[4] >> (8 * (3-i)))) & 0xff;
+
+	}
+	return MAC_I;
+
+}
+/* End of f9.c */
+/*------------------------------------------------------------------------*/
diff --git a/src/common/ipc_api.c b/src/common/ipc_api.c
new file mode 100644
index 0000000..f682c18
--- /dev/null
+++ b/src/common/ipc_api.c
@@ -0,0 +1,203 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <linux/tipc.h>
+#include <stdint.h>
+#include "log.h"
+#include "ipc_api.h"
+#include "err_codes.h"
+
+#include <sys/socket.h>
+#include <string.h>
+
+#define TIPC_SERVICE_ADDR       2
+
+int
+create_ipc_channel(char *name)
+{
+	if (mkfifo (name, IPC_MODE) == -1) {
+		log_msg(LOG_ERROR, "Error in create_ipc_channel %s\n", name);
+		perror("Error:");
+		return -1;
+	}
+
+	return 0;
+}
+
+int
+open_ipc_channel(char *name, enum ipc_access_mode access_mode)
+{
+	int mode = O_RDONLY;
+	int fd;
+
+	if (access_mode == IPC_WRITE)
+		mode = O_WRONLY;
+
+	if ((fd = open(name, mode)) == -1) {
+		log_msg(LOG_ERROR, "Error in create_ipc_channel %s\n",name);
+		perror("Error:");
+		return -E_FAIL;
+	}
+
+	return fd;
+}
+
+int
+create_open_ipc_channel(char *name, enum ipc_access_mode access_mode)
+{
+	if (create_ipc_channel(name) != 0)
+		return -1;
+
+	return open_ipc_channel(name, access_mode);
+}
+
+int
+read_ipc_channel(ipc_handle fd, char *buffer, size_t size)
+{
+	int len = read(fd, buffer, size);
+	switch (len) {
+	case -1:
+            // case -1 means pipe is empty and errono
+            // set EAGAIN
+		if (errno == EAGAIN) {
+		log_msg(LOG_ERROR, "pipe empty \n");
+                usleep(5);
+                return -1;
+            }
+            else { perror("read");
+                exit(4);
+            }
+
+        // case 0 means all bytes are read and EOF(end of conv.)
+        case 0:
+            log_msg(LOG_ERROR, "End of conversation\n");
+
+            // read link
+            //close(p[0]);
+
+            exit(0);
+        default:
+            // text read
+            // by default return no. of bytes
+            // which read call read at that time
+            return len;
+        }
+}
+
+int
+write_ipc_channel(ipc_handle fd, char *buffer, size_t size)
+{
+	return write(fd, buffer, size);
+}
+
+int
+close_ipc_channel(ipc_handle fd)
+{
+	if (close(fd) == -1)
+		return -1;
+
+	return 0;
+}
+
+int
+create_tipc_socket()
+{
+    int sockFd = socket(AF_TIPC, SOCK_RDM, 0);
+
+    if (sockFd <= 0)
+    {
+        log_msg(LOG_INFO, "Failed to create tipc socket error: %s", strerror(errno));
+    }
+
+    return sockFd;
+}
+
+int
+bind_tipc_socket(int sockFd, uint32_t instanceNum)
+{
+    struct sockaddr_tipc server;
+
+    server.family = AF_TIPC;
+    server.addrtype = TIPC_SERVICE_ADDR;
+    server.scope = TIPC_CLUSTER_SCOPE;
+    server.addr.name.name.type = tipcServiceAddressType_c;
+    server.addr.name.name.instance = instanceNum;
+
+    int rc = 1;
+    if (0 != bind(sockFd, (void *)&server, sizeof(server)))
+    {
+        log_msg(LOG_ERROR, "Server: failed to bind port name %s\n", strerror(errno));
+        rc = -1;
+    }
+    else
+    {
+	log_msg(LOG_INFO, "Server: Success %s %d\n", strerror(errno), rc);
+    }
+    return rc;
+}
+
+int
+send_tipc_message(int sd, uint32_t destAddr, void * buf, int len)
+{
+    struct sockaddr_tipc server;
+    server.family = AF_TIPC;
+    server.addrtype = TIPC_SERVICE_ADDR;
+    server.scope = TIPC_CLUSTER_SCOPE;
+    server.addr.name.domain = 0;
+    server.addr.name.name.type = tipcServiceAddressType_c;
+    server.addr.name.name.instance = destAddr;
+
+    int rc = 0;
+    if (0 > sendto(sd, buf, len, 0, (void*)&server, sizeof(server)))
+    {
+    	log_msg(LOG_ERROR, "FAILED TO SENT TIPC MESSAGE %s\n", strerror(errno));
+    } else {
+    	rc = 1;
+    	log_msg(LOG_INFO, "TIPC Message sent successfully to %d\n", destAddr);
+    }
+
+    return rc;
+}
+
+int
+read_tipc_msg(int sockFd, void * buf, int len)
+{
+    int bytesRead = 0;
+
+    if ((bytesRead = recv(sockFd, buf, len, 0)) <= 0)
+    {
+    	log_msg(LOG_ERROR, "FAILED TO READ TIPC MESSAGE %s\n", strerror(errno));
+    }
+    return bytesRead;
+}
+
+void
+close_tipc_socket(int sockFd)
+{
+	close(sockFd);
+}
+
+
+
diff --git a/src/common/json_parser.c b/src/common/json_parser.c
new file mode 100644
index 0000000..a968ba6
--- /dev/null
+++ b/src/common/json_parser.c
@@ -0,0 +1,159 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#include "log.h"
+
+FILE *json_fp;
+
+static char *
+seek_to_tag(char *name)
+{
+	char *tmp = name;
+	char tag[64] = {0};
+		char last_iteration = 0;
+
+	rewind(json_fp);
+
+	tmp = strchr(name, '.');
+	strncpy(tag, name, tmp-name);
+	++tmp;
+
+	while(1) {
+		char tag_not_found = 1;
+		char *line =(char *) calloc(1, 128);
+		char *entry;
+		char *tmp2;
+
+		while(tag_not_found) {
+			if (NULL == fgets(line, 128, json_fp)) return NULL;
+			if(NULL != (entry = strstr(line, tag))) {
+				tag_not_found = 0; /*found*/
+				if(last_iteration) return line;
+				break;
+			}
+			if(feof(json_fp)) return NULL;
+		}
+#if 0
+		if(NULL == strchr(tmp, '.')) {
+					/*This is the last tag*/
+					return line;
+				}
+#endif
+		tmp2 = strchr(tmp, '.');
+		if(NULL == tmp2) {
+			last_iteration = 1;
+			tmp2 = tmp+strlen(tmp);
+		}
+		memset(tag, 0, 64);
+		strncpy(tag, tmp, tmp2-tmp);
+		tmp = tmp2+1;
+		tag_not_found = 1;/*seach for next tag*/
+	}
+
+}
+
+char *
+get_string_scalar(char *path)
+{
+	char *entry = seek_to_tag(path);
+	char *value = calloc(1, 128);
+
+	if(NULL == entry) {
+		log_msg(LOG_ERROR, "%s: entry not found\n", path);
+		free(value);
+		return NULL;
+	}
+
+	if (NULL == value)
+	{
+		log_msg(LOG_ERROR,"calloc function fail");
+		return NULL;
+	}
+	char *tmp = strchr(entry, ':');
+	sscanf(tmp, ": \"%[^\"]", value);
+	log_msg(LOG_INFO, "%s = %s\n", path, value);
+	return value;
+}
+
+int
+get_int_scalar(char *path)
+{
+	char *entry = seek_to_tag(path);
+	unsigned int i = 0;
+
+	if(NULL == entry) {
+		log_msg(LOG_ERROR, "%s: entry not found\n", path);
+		return -1;
+	}
+	char *tmp = strchr(entry, ':');
+
+	i = atoi(tmp+1);
+
+	free(entry);
+	log_msg(LOG_INFO, "%s = %d\n", path, i);
+	return i;
+}
+
+
+int
+get_ip_scalar(char *path)
+{
+	char *val = get_string_scalar(path);
+	unsigned int addr = 0;
+
+	if(NULL == val) addr = -1;
+	else addr = inet_addr(val);
+
+	free(val);
+	return ntohl(addr);
+}
+
+int
+load_json(char *filename)
+{
+	json_fp = fopen(filename, "r");
+
+	if(NULL == json_fp) {
+		log_msg(LOG_ERROR, "Error opening json file\n");
+		perror("Error:");
+		return -1;
+	}
+
+	return 0;
+}
+
+/** TEST CODE
+void
+main()
+{
+
+	load_json("test.json");
+	get_string_scalar("root.scalar1");
+	get_string_scalar("root.scalar2");
+	get_string_scalar("root.scalarx");
+	get_string_scalar("root.scalar3");
+	get_string_scalar("root.scalar4");
+	get_string_scalar("root.nested.scalar5");
+}
+**/
diff --git a/src/common/log.c b/src/common/log.c
new file mode 100644
index 0000000..cad7e36
--- /dev/null
+++ b/src/common/log.c
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <time.h>
+#include <stdbool.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include "log.h"
+#include <sys/syscall.h>
+
+bool g_nolog = false;
+enum log_levels g_log_level = LOG_INFO;
+
+int pid = 0;
+char processName[255] = {0};
+
+static const char *log_level_name[] = { "INFO", "DEBUG", "WARN", "ERROR" };
+
+void log_message(int l, const char *file, int line, const char *fmt, ...)
+{
+	va_list arg;
+	if (g_nolog) return;
+	if(g_log_level > l) return;
+
+	FILE *fp = fopen("/tmp/mmelogs.txt", "a+");
+        if (fp == NULL)
+        {
+                printf("Could not open log file");
+                exit(0);
+        }
+
+	fprintf(fp,"%s(%d:%ld):%s-%s:%d:", processName, pid, syscall(SYS_gettid), log_level_name[l], file, line);
+	va_start(arg, fmt);
+//	vfprintf(stderr, fmt, arg);
+	vfprintf(fp, fmt, arg);
+	va_end(arg);
+	fclose(fp);
+//	fprintf(stderr, "\n");
+}
+
diff --git a/src/common/snow_3g.c b/src/common/snow_3g.c
new file mode 100644
index 0000000..045a10e
--- /dev/null
+++ b/src/common/snow_3g.c
@@ -0,0 +1,406 @@
+/*------------------------------------------------------------------
+*				SNOW_3G.c
+*-------------------------------------------------------------------*/
+
+/*
+ * The code has been referred from
+ * 1. https://www.gsma.com/aboutus/wp-content/uploads/2014/12/snow3gspec.pdf
+ * 2. https://www.gsma.com/aboutus/wp-content/uploads/2014/12/uea2uia2d1v21.pdf
+*/
+
+
+#include "snow_3g.h"
+
+/* LFSR */
+
+u32 LFSR_S0 = 0x00;
+u32 LFSR_S1 = 0x00;
+u32 LFSR_S2 = 0x00;
+u32 LFSR_S3 = 0x00;
+u32 LFSR_S4 = 0x00;
+u32 LFSR_S5 = 0x00;
+u32 LFSR_S6 = 0x00;
+u32 LFSR_S7 = 0x00;
+u32 LFSR_S8 = 0x00;
+u32 LFSR_S9 = 0x00;
+u32 LFSR_S10 = 0x00;
+u32 LFSR_S11 = 0x00;
+u32 LFSR_S12 = 0x00;
+u32 LFSR_S13 = 0x00;
+u32 LFSR_S14 = 0x00;
+u32 LFSR_S15 = 0x00;
+
+/* FSM */
+
+u32 FSM_R1 = 0x00;
+u32 FSM_R2 = 0x00;
+u32 FSM_R3 = 0x00;
+
+
+/* Rijndael S-box SR */
+
+u8 SR[256] = {
+0x63,0x7C,0x77,0x7B,0xF2,0x6B,0x6F,0xC5,0x30,0x01,0x67,0x2B,0xFE,0xD7,0xAB,0x76,
+0xCA,0x82,0xC9,0x7D,0xFA,0x59,0x47,0xF0,0xAD,0xD4,0xA2,0xAF,0x9C,0xA4,0x72,0xC0,
+0xB7,0xFD,0x93,0x26,0x36,0x3F,0xF7,0xCC,0x34,0xA5,0xE5,0xF1,0x71,0xD8,0x31,0x15,
+0x04,0xC7,0x23,0xC3,0x18,0x96,0x05,0x9A,0x07,0x12,0x80,0xE2,0xEB,0x27,0xB2,0x75,
+0x09,0x83,0x2C,0x1A,0x1B,0x6E,0x5A,0xA0,0x52,0x3B,0xD6,0xB3,0x29,0xE3,0x2F,0x84,
+0x53,0xD1,0x00,0xED,0x20,0xFC,0xB1,0x5B,0x6A,0xCB,0xBE,0x39,0x4A,0x4C,0x58,0xCF,
+0xD0,0xEF,0xAA,0xFB,0x43,0x4D,0x33,0x85,0x45,0xF9,0x02,0x7F,0x50,0x3C,0x9F,0xA8,
+0x51,0xA3,0x40,0x8F,0x92,0x9D,0x38,0xF5,0xBC,0xB6,0xDA,0x21,0x10,0xFF,0xF3,0xD2,
+0xCD,0x0C,0x13,0xEC,0x5F,0x97,0x44,0x17,0xC4,0xA7,0x7E,0x3D,0x64,0x5D,0x19,0x73,
+0x60,0x81,0x4F,0xDC,0x22,0x2A,0x90,0x88,0x46,0xEE,0xB8,0x14,0xDE,0x5E,0x0B,0xDB,
+0xE0,0x32,0x3A,0x0A,0x49,0x06,0x24,0x5C,0xC2,0xD3,0xAC,0x62,0x91,0x95,0xE4,0x79,
+0xE7,0xC8,0x37,0x6D,0x8D,0xD5,0x4E,0xA9,0x6C,0x56,0xF4,0xEA,0x65,0x7A,0xAE,0x08,
+0xBA,0x78,0x25,0x2E,0x1C,0xA6,0xB4,0xC6,0xE8,0xDD,0x74,0x1F,0x4B,0xBD,0x8B,0x8A,
+0x70,0x3E,0xB5,0x66,0x48,0x03,0xF6,0x0E,0x61,0x35,0x57,0xB9,0x86,0xC1,0x1D,0x9E,
+0xE1,0xF8,0x98,0x11,0x69,0xD9,0x8E,0x94,0x9B,0x1E,0x87,0xE9,0xCE,0x55,0x28,0xDF,
+0x8C,0xA1,0x89,0x0D,0xBF,0xE6,0x42,0x68,0x41,0x99,0x2D,0x0F,0xB0,0x54,0xBB,0x16
+};
+
+/* S-box SQ */
+
+u8 SQ[256] = {
+0x25,0x24,0x73,0x67,0xD7,0xAE,0x5C,0x30,0xA4,0xEE,0x6E,0xCB,0x7D,0xB5,0x82,0xDB,
+0xE4,0x8E,0x48,0x49,0x4F,0x5D,0x6A,0x78,0x70,0x88,0xE8,0x5F,0x5E,0x84,0x65,0xE2,
+0xD8,0xE9,0xCC,0xED,0x40,0x2F,0x11,0x28,0x57,0xD2,0xAC,0xE3,0x4A,0x15,0x1B,0xB9,
+0xB2,0x80,0x85,0xA6,0x2E,0x02,0x47,0x29,0x07,0x4B,0x0E,0xC1,0x51,0xAA,0x89,0xD4,
+0xCA,0x01,0x46,0xB3,0xEF,0xDD,0x44,0x7B,0xC2,0x7F,0xBE,0xC3,0x9F,0x20,0x4C,0x64,
+0x83,0xA2,0x68,0x42,0x13,0xB4,0x41,0xCD,0xBA,0xC6,0xBB,0x6D,0x4D,0x71,0x21,0xF4,
+0x8D,0xB0,0xE5,0x93,0xFE,0x8F,0xE6,0xCF,0x43,0x45,0x31,0x22,0x37,0x36,0x96,0xFA,
+0xBC,0x0F,0x08,0x52,0x1D,0x55,0x1A,0xC5,0x4E,0x23,0x69,0x7A,0x92,0xFF,0x5B,0x5A,
+0xEB,0x9A,0x1C,0xA9,0xD1,0x7E,0x0D,0xFC,0x50,0x8A,0xB6,0x62,0xF5,0x0A,0xF8,0xDC,
+0x03,0x3C,0x0C,0x39,0xF1,0xB8,0xF3,0x3D,0xF2,0xD5,0x97,0x66,0x81,0x32,0xA0,0x00,
+0x06,0xCE,0xF6,0xEA,0xB7,0x17,0xF7,0x8C,0x79,0xD6,0xA7,0xBF,0x8B,0x3F,0x1F,0x53,
+0x63,0x75,0x35,0x2C,0x60,0xFD,0x27,0xD3,0x94,0xA5,0x7C,0xA1,0x05,0x58,0x2D,0xBD,
+0xD9,0xC7,0xAF,0x6B,0x54,0x0B,0xE0,0x38,0x04,0xC8,0x9D,0xE7,0x14,0xB1,0x87,0x9C,
+0xDF,0x6F,0xF9,0xDA,0x2A,0xC4,0x59,0x16,0x74,0x91,0xAB,0x26,0x61,0x76,0x34,0x2B,
+0xAD,0x99,0xFB,0x72,0xEC,0x33,0x12,0xDE,0x98,0x3B,0xC0,0x9B,0x3E,0x18,0x10,0x3A,
+0x56,0xE1,0x77,0xC9,0x1E,0x9E,0x95,0xA3,0x90,0x19,0xA8,0x6C,0x09,0xD0,0xF0,0x86
+};
+
+
+/* MULx.
+ * Input V: an 8-bit input.
+ * Input c: an 8-bit input.
+ * Output : an 8-bit output.
+ * See section 3.1.1 of
+ * https://www.gsma.com/aboutus/wp-content/uploads/2014/12/snow3gspec.pdf
+ * for details.
+ */
+
+
+u8 MULx(u8 V, u8 c)
+{
+	if ( V & 0x80 )
+		return ( (V << 1) ^ c);
+	else
+		return ( V << 1);
+}
+
+/* MULxPOW.
+ * Input V: an 8-bit input.
+ * Input i: a positive integer.
+ * Input c: an 8-bit input.
+ * Output : an 8-bit output.
+ * See section 3.1.2
+ * https://www.gsma.com/aboutus/wp-content/uploads/2014/12/snow3gspec.pdf
+ * for details.
+ */
+
+
+u8 MULxPOW(u8 V, u8 i, u8 c)
+{
+	/*GSLab-Intel modification to avoid recurssion*/
+	 while(i > 0) {
+		  V = ( V & 0x80 ) ? ( (V << 1) ^ c): ( V << 1);
+		  --i;
+	}
+	return V;
+
+}
+/* The function MUL alpha.
+ * Input c: 8-bit input.
+ * Output : 32-bit output.
+ * See section 3.4.2
+ * https://www.gsma.com/aboutus/wp-content/uploads/2014/12/snow3gspec.pdf
+ * for details.
+ */
+
+u32 MULalpha(u8 c)
+{
+	return ( ( ((u32)MULxPOW(c, 23, 0xa9)) << 24 ) |
+		   ( ((u32)MULxPOW(c, 245, 0xa9)) << 16 ) |
+		   ( ((u32)MULxPOW(c, 48, 0xa9)) << 8 ) |
+	       ((u32)MULxPOW(c, 239, 0xa9)) )  ;
+}
+
+/* The function DIV alpha.
+ * Input c: 8-bit input.
+ * Output : 32-bit output.
+ * See section 3.4.3
+ * https://www.gsma.com/aboutus/wp-content/uploads/2014/12/snow3gspec.pdf
+ * for details.
+ */
+
+u32 DIValpha(u8 c)
+{
+	return ( ( ((u32)MULxPOW(c, 16, 0xa9)) << 24 ) |
+		   ( ((u32)MULxPOW(c, 39, 0xa9)) << 16 ) |
+		   ( ((u32)MULxPOW(c, 6, 0xa9)) << 8 ) |
+		   ( ((u32)MULxPOW(c, 64, 0xa9)) ) ) ;
+}
+
+/* The 32x32-bit S-Box S1
+ * Input: a 32-bit input.
+ * Output: a 32-bit output of S1 box.
+ * See section 3.3.1
+ * https://www.gsma.com/aboutus/wp-content/uploads/2014/12/snow3gspec.pdf
+ * for details.
+ */
+
+u32 S1(u32 w)
+{
+	u8 r0=0, r1=0, r2=0, r3=0;
+	u8 srw0 = SR[ (u8)((w >> 24) & 0xff) ];
+	u8 srw1 = SR[ (u8)((w >> 16) & 0xff) ];
+	u8 srw2 = SR[ (u8)((w >> 8) & 0xff) ];
+	u8 srw3 = SR[ (u8)((w) & 0xff) ];
+
+	r0 = ( ( MULx( srw0 , 0x1b) ) ^
+		   ( srw1 ) ^
+		   ( srw2 ) ^
+	       ( (MULx( srw3, 0x1b)) ^ srw3 )
+		);
+
+	r1 = ( ( ( MULx( srw0 , 0x1b) ) ^ srw0 ) ^
+		   ( MULx(srw1, 0x1b) ) ^
+		   ( srw2 ) ^
+		   ( srw3 )
+		 );
+
+	r2 = ( ( srw0 ) ^
+		   ( ( MULx( srw1 , 0x1b) ) ^ srw1 ) ^
+	       ( MULx(srw2, 0x1b) ) ^
+	       ( srw3 )
+	     );
+
+	r3 = ( ( srw0 ) ^
+		   ( srw1 ) ^
+	       ( ( MULx( srw2 , 0x1b) ) ^ srw2 ) ^
+	       ( MULx( srw3, 0x1b) )
+		 );
+
+	return ( ( ((u32)r0) << 24 ) | ( ((u32)r1) << 16 ) | ( ((u32)r2) << 8 ) |
+		   ( ((u32)r3) ) );
+
+}
+
+/* The 32x32-bit S-Box S2
+ * Input: a 32-bit input.
+ * Output: a 32-bit output of S2 box.
+ * See section 3.3.2
+ * https://www.gsma.com/aboutus/wp-content/uploads/2014/12/snow3gspec.pdf
+ * for details.
+ */
+
+u32 S2(u32 w)
+{
+	u8 r0=0, r1=0, r2=0, r3=0;
+	u8 sqw0 = SQ[ (u8)((w >> 24) & 0xff) ];
+	u8 sqw1 = SQ[ (u8)((w >> 16) & 0xff) ];
+	u8 sqw2 = SQ[ (u8)((w >> 8) & 0xff) ];
+	u8 sqw3 = SQ[ (u8)((w) & 0xff) ];
+
+
+	r0 = ( ( MULx( sqw0 , 0x69) ) ^
+		   ( sqw1 ) ^
+		   ( sqw2 ) ^
+		   ( (MULx( sqw3, 0x69)) ^ sqw3 )
+		 );
+
+
+	r1 = ( ( ( MULx( sqw0 , 0x69) ) ^ sqw0 ) ^
+	       ( MULx(sqw1, 0x69) ) ^
+	       ( sqw2 ) ^
+	       ( sqw3 )
+	     );
+
+	r2 = ( ( sqw0 ) ^
+	       ( ( MULx( sqw1 , 0x69) ) ^ sqw1 ) ^
+	       ( MULx(sqw2, 0x69) ) ^
+		   ( sqw3 )
+		 );
+
+	r3 = ( ( sqw0 ) ^
+		   ( sqw1 ) ^
+		   ( ( MULx( sqw2 , 0x69) ) ^ sqw2 ) ^
+		   ( MULx( sqw3, 0x69) )
+		 );
+
+
+	return ( ( ((u32)r0) << 24 ) | ( ((u32)r1) << 16 ) | ( ((u32)r2) << 8 ) |
+		   ( ((u32)r3) ) );
+
+}
+
+/* Clocking LFSR in initialization mode.
+ * LFSR Registers S0 to S15 are updated as the LFSR receives a single clock.
+ * Input F: a 32-bit word comes from output of FSM.
+ * See section 3.4.4
+ * https://www.gsma.com/aboutus/wp-content/uploads/2014/12/snow3gspec.pdf
+ * for details.
+ */
+
+void ClockLFSRInitializationMode(u32 F)
+{
+	u32 v = ( ( (LFSR_S0 << 8) & 0xffffff00 ) ^
+			  ( MULalpha( (u8)((LFSR_S0>>24) & 0xff) ) ) ^
+			  ( LFSR_S2 ) ^
+			  ( (LFSR_S11 >> 8) & 0x00ffffff ) ^
+			  ( DIValpha( (u8)( ( LFSR_S11) & 0xff ) ) ) ^
+			  ( F )
+			);
+
+	LFSR_S0 = LFSR_S1;
+	LFSR_S1 = LFSR_S2;
+	LFSR_S2 = LFSR_S3;
+	LFSR_S3 = LFSR_S4;
+	LFSR_S4 = LFSR_S5;
+	LFSR_S5 = LFSR_S6;
+	LFSR_S6 = LFSR_S7;
+	LFSR_S7 = LFSR_S8;
+	LFSR_S8 = LFSR_S9;
+	LFSR_S9 = LFSR_S10;
+	LFSR_S10 = LFSR_S11;
+	LFSR_S11 = LFSR_S12;
+	LFSR_S12 = LFSR_S13;
+	LFSR_S13 = LFSR_S14;
+	LFSR_S14 = LFSR_S15;
+	LFSR_S15 = v;
+}
+
+/* Clocking LFSR in keystream mode.
+ * LFSR Registers S0 to S15 are updated as the LFSR receives a single clock.
+ * See section 3.4.5
+ * https://www.gsma.com/aboutus/wp-content/uploads/2014/12/snow3gspec.pdf
+ * for details.
+ */
+
+void ClockLFSRKeyStreamMode()
+{
+	u32 v = ( ( (LFSR_S0 << 8) & 0xffffff00 ) ^
+			  ( MULalpha( (u8)((LFSR_S0>>24) & 0xff) ) ) ^
+			  ( LFSR_S2 ) ^
+			  ( (LFSR_S11 >> 8) & 0x00ffffff ) ^
+			  ( DIValpha( (u8)( ( LFSR_S11) & 0xff ) ) )
+			);
+
+
+	LFSR_S0 = LFSR_S1;
+	LFSR_S1 = LFSR_S2;
+	LFSR_S2 = LFSR_S3;
+	LFSR_S3 = LFSR_S4;
+	LFSR_S4 = LFSR_S5;
+	LFSR_S5 = LFSR_S6;
+	LFSR_S6 = LFSR_S7;
+	LFSR_S7 = LFSR_S8;
+	LFSR_S8 = LFSR_S9;
+	LFSR_S9 = LFSR_S10;
+	LFSR_S10 = LFSR_S11;
+	LFSR_S11 = LFSR_S12;
+	LFSR_S12 = LFSR_S13;
+	LFSR_S13 = LFSR_S14;
+	LFSR_S14 = LFSR_S15;
+	LFSR_S15 = v;
+}
+
+/* Clocking FSM.
+ * Produces a 32-bit word F.
+ * Updates FSM registers R1, R2, R3.
+ * See Section 3.4.6 of
+ * https://www.gsma.com/aboutus/wp-content/uploads/2014/12/snow3gspec.pdf
+ * for details.
+ */
+
+u32 ClockFSM()
+{
+	u32 F = ( ( LFSR_S15 + FSM_R1 ) & 0xffffffff ) ^ FSM_R2 ;
+	u32 r = ( FSM_R2 + ( FSM_R3 ^ LFSR_S5 ) ) & 0xffffffff ;
+	FSM_R3 = S2(FSM_R2);
+	FSM_R2 = S1(FSM_R1);
+	FSM_R1 = r;
+	return F;
+}
+
+/* Initialization.
+ * Input k[4]: Four 32-bit words making up 128-bit key.
+ * Input IV[4]: Four 32-bit words making 128-bit initialization variable.
+ * Output: All the LFSRs and FSM are initialized for key generation.
+ * See Section 4.1 of
+ * https://www.gsma.com/aboutus/wp-content/uploads/2014/12/snow3gspec.pdf
+ * for details.
+ */
+
+void Initialize(u32 k[4], u32 IV[4])
+{
+	u8 i=0;
+	u32 F = 0x0;
+	LFSR_S15 = k[3] ^ IV[0];
+	LFSR_S14 = k[2];
+	LFSR_S13 = k[1];
+	LFSR_S12 = k[0] ^ IV[1];
+	LFSR_S11 = k[3] ^ 0xffffffff;
+	LFSR_S10 = k[2] ^ 0xffffffff ^ IV[2];
+	LFSR_S9 = k[1] ^ 0xffffffff ^ IV[3];
+	LFSR_S8 = k[0] ^ 0xffffffff;
+	LFSR_S7 = k[3];
+	LFSR_S6 = k[2];
+	LFSR_S5 = k[1];
+	LFSR_S4 = k[0];
+	LFSR_S3 = k[3] ^ 0xffffffff;
+	LFSR_S2 = k[2] ^ 0xffffffff;
+	LFSR_S1 = k[1] ^ 0xffffffff;
+	LFSR_S0 = k[0] ^ 0xffffffff;
+	FSM_R1 = 0x0;
+	FSM_R2 = 0x0;
+	FSM_R3 = 0x0;
+
+	for(i=0;i<32;i++)
+	{
+		F = ClockFSM();
+		ClockLFSRInitializationMode(F);
+	}
+}
+
+
+/* Generation of Keystream.
+ * input n: number of 32-bit words of keystream.
+ * input z: space for the generated keystream, assumes
+ * memory is allocated already.
+ * output: generated keystream which is filled in z
+ * See section 4.2 of
+ * https://www.gsma.com/aboutus/wp-content/uploads/2014/12/snow3gspec.pdf
+ * for details.
+ */
+
+void GenerateKeystream(u32 n, u32 *ks)
+{
+	u32 t = 0;
+	u32 F = 0x0;
+	ClockFSM(); /* Clock FSM once. Discard the output. */
+	ClockLFSRKeyStreamMode(); /* Clock LFSR in keystream mode once. */
+
+	for ( t=0; t<n; t++)
+	{
+		F = ClockFSM();/* STEP 1 */
+		ks[t] = F ^ LFSR_S0; /* STEP 2 */
+
+		/* Note that ks[t] corresponds to z_{t+1} in section 4.2 of
+		 * https://www.gsma.com/aboutus/wp-content/uploads/2014/12/snow3gspec.pdf
+		*/
+
+		ClockLFSRKeyStreamMode(); /* STEP 3 */
+	}
+}
+/*------------------------------------------------------------------*/
diff --git a/src/common/thread_pool.c b/src/common/thread_pool.c
new file mode 100644
index 0000000..aa44e31
--- /dev/null
+++ b/src/common/thread_pool.c
@@ -0,0 +1,188 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <pthread.h>
+#include <unistd.h>
+#include "thread_pool.h"
+#include "tpool_queue.h"
+
+struct Job *create_job(JobFunction function, void *arg)
+{
+	struct Job *job;
+	job = (struct Job *)malloc(sizeof(struct Job));
+	if(job == NULL) {
+#ifdef DEBUG
+		log_msg(LOG_ERROR, "failed to allocate memory\n");
+#endif
+		return NULL;
+	}
+	job->function = function;
+	job->arg = arg;
+	return job;
+}
+
+static void *worker_thread(void *userdata)
+{
+	void *arg;
+	struct Job *job;
+	JobFunction function;
+	struct thread_pool *pool;
+
+	pool = (struct thread_pool *)userdata;
+
+	while(1) {
+		pthread_mutex_lock(&pool->queue_mutex);
+
+		/* waiting until dispatch thread signals for new job */
+		pthread_cond_wait(&pool->job_received, &pool->queue_mutex);
+		job = queue_pop_head(pool->job_queue);
+		pthread_mutex_unlock(&pool->queue_mutex);
+
+		if(job != NULL) {
+			function = job->function;
+			arg = job->arg;
+			free(job);
+
+			/* atomically updating idle_threads */
+			__sync_fetch_and_sub(&pool->idle_threads, 1);
+
+			function(arg);
+
+			__sync_fetch_and_add(&pool->idle_threads, 1);
+		}
+	}
+	return NULL;
+}
+
+/* If queue has pending jobs and 
+ * thread is idle then signal the thread
+ * to process the job
+ */
+static void *dispatch_if_idle(void *userdata)
+{
+	struct thread_pool *pool;
+
+	pool = (struct thread_pool *)userdata;
+
+	while(1) {
+		if((pool->idle_threads > 0) &&
+			pool->job_queue->length > 0 ) {
+			pthread_cond_signal(&pool->job_received);
+		} else usleep(10);
+	}
+	return NULL;
+}
+
+/* creates a thread and pushes into queue */
+static int spawn_thread(struct thread_pool *pool)
+{
+	int status;
+	pthread_t thread;
+
+	status = pthread_create(&thread, NULL, worker_thread, pool);
+	if(status < 0)
+		return status;
+
+	queue_push_tail(pool->thread_queue, &thread);
+
+	return 0;
+}
+
+/* pushes job into queue */
+int insert_job(struct thread_pool *pool, JobFunction function, void *userdata)
+{
+	struct Job *job;
+	
+	if(pool == NULL)
+		return -1;
+
+	job = create_job(function, userdata);
+	if(job == NULL)
+		return -ENOMEM;
+
+	pthread_mutex_lock(&pool->queue_mutex);
+	queue_push_tail(pool->job_queue, job);
+	pthread_mutex_unlock(&pool->queue_mutex);
+
+	return 0;
+}
+
+struct thread_pool *thread_pool_new(int count)
+{
+	int i, status;
+	pthread_t thread;
+	struct thread_pool *pool;
+
+	pool = (struct thread_pool *)malloc(sizeof(struct thread_pool));
+	if(pool == NULL) {
+#ifdef DEBUG
+		log_msg(LOG_ERROR, "failed to allocate memory\n");
+#endif
+		errno = ENOMEM;
+		return NULL;
+	}
+	pool->idle_threads = count;
+	pool->job_queue = queue_new();
+	pool->thread_queue = queue_new();
+
+	pthread_mutex_init(&pool->queue_mutex, NULL);
+	pthread_cond_init(&pool->job_received, NULL);
+
+	status = pthread_create(&thread, NULL, dispatch_if_idle, pool);
+	if(status < 0) {
+#ifdef DEBUG
+		log_msg(LOG_ERROR, "failed to spawn dispatch thread, stopping\n");
+#endif
+		return NULL;
+	}
+	pool->dispatch_thread = thread;
+
+	i = 0;
+	while(i < count)
+		if (spawn_thread(pool) == 0)
+			i++;
+
+	return pool;
+}
+
+int thread_pool_destroy(struct thread_pool *pool)
+{
+	pthread_t *thread;
+
+	if(pool == NULL)
+		return -1;
+
+	pthread_cancel(pool->dispatch_thread);
+	while((thread = queue_pop_head(pool->job_queue)) != NULL) {
+		pthread_cancel(*thread);	
+	}
+
+	queue_destroy(pool->job_queue, free);
+	queue_destroy(pool->thread_queue, NULL);
+	pthread_mutex_destroy(&pool->queue_mutex);
+	pthread_cond_destroy(&pool->job_received);
+
+	free(pool);
+	return 0;
+}
+
+
diff --git a/src/common/tpool_queue.c b/src/common/tpool_queue.c
new file mode 100644
index 0000000..f8e0092
--- /dev/null
+++ b/src/common/tpool_queue.c
@@ -0,0 +1,146 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+#include "thread_pool.h"
+#include "tpool_queue.h"
+
+/* allocates memory for node and initialize it */
+static struct node *createnode(void *data)
+{
+	struct node *entry;
+
+	entry = (struct node *)malloc(sizeof(struct node));
+	if(entry == NULL) {
+#ifdef DEBUG
+		log_msg(LOG_ERROR, "failed to allocate memory\n");
+#endif
+		return NULL;
+	}
+
+	entry->data = data;
+	entry->next = NULL;
+
+	return entry;
+}
+
+/* push data to queue tail */
+int queue_push_tail(struct Queue *queue, void *data)
+{
+	struct node *entry;
+
+	if(queue == NULL)
+		return -1;
+
+	entry = createnode(data);
+	if(entry == NULL) {
+		return -ENOMEM;
+	}
+
+	/* For empty queue */
+	if(queue->head == NULL)
+		queue->head = entry;
+	else
+		queue->tail->next = entry;
+	queue->tail = entry;
+
+	/* atomic increment */
+	__sync_fetch_and_add(&queue->length, 1);
+	return 0;
+}
+
+/* removes head and return its data */
+void *queue_pop_head(struct Queue *queue)
+{
+	void *data;
+	struct node *entry;
+
+	if(queue == NULL || queue->length == 0)
+		return NULL;
+
+	if(queue->head == NULL) {
+		return NULL;
+	}
+
+	entry = queue->head;
+	queue->head = queue->head->next;
+	data = entry->data;
+	/* atomic decrement */
+	__sync_fetch_and_sub(&queue->length, 1);
+	free(entry);
+
+	return data;
+}
+
+int queue_get_length(struct Queue *queue)
+{
+	if (queue == NULL)
+		return 0;
+
+	return queue->length;
+}
+
+struct Queue *queue_new()
+{
+	struct Queue *queue;
+
+	queue = (struct Queue *)malloc(sizeof(struct Queue));
+	if(queue == NULL) {
+#ifdef DEBUG
+		log_msg(LOG_ERROR, "failed to allocate memory\n");
+#endif
+		return NULL;
+	}
+
+	queue->length = 0;
+	queue->head = NULL;
+	queue->tail = NULL;
+
+	return queue;
+}
+
+void queue_destroy(struct Queue *queue, QueueDataFreeFunc function)
+{
+	struct node *tmp;
+
+	if(queue == NULL || queue->length == 0)
+	{
+		free(queue);
+		return;
+	}
+
+	if(queue->head == NULL)
+		free(queue);
+	else {
+		tmp = queue->head;
+		while(queue->head != NULL) {
+			tmp = queue->head->next;
+			if (function != NULL)
+				function(queue->head->data);
+			free(queue->head);
+			queue->head=tmp;
+		}
+	}
+
+}
+
+
diff --git a/src/gtpV2Codec/Makefile b/src/gtpV2Codec/Makefile
new file mode 100644
index 0000000..0247d73
--- /dev/null
+++ b/src/gtpV2Codec/Makefile
@@ -0,0 +1,197 @@
+#
+# Copyright 2019-present, Infosys Limited.
+#
+# 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.
+
+include ../../Makefile.common
+
+gtpV2CodecOBJDIR := $(OBJDIR)/gtpV2Codec/
+
+gtpV2CodecLIB := $(LIBDIR)/libgtpV2Codec.so
+
+gtpV2CodecOBJS := $(addprefix $(gtpV2CodecOBJDIR), \
+	ieClasses/imsiIe.o \
+	ieClasses/gtpV2IeFactory.o \
+	ieClasses/dataTypeCodecUtils.o \
+	ieClasses/manual/gtpV2Ie.o \
+	ieClasses/causeIe.o \
+	ieClasses/msisdnIe.o \
+	ieClasses/meiIe.o \
+	ieClasses/uliIe.o \
+	ieClasses/servingNetworkIe.o \
+	ieClasses/ratTypeIe.o \
+	ieClasses/indicationIe.o \
+	ieClasses/fTeidIe.o \
+	ieClasses/apnIe.o \
+	ieClasses/selectionModeIe.o \
+	ieClasses/pdnTypeIe.o \
+	ieClasses/paaIe.o \
+	ieClasses/apnRestrictionIe.o \
+	ieClasses/ambrMmbrIe.o \
+	ieClasses/ambrIe.o \
+	ieClasses/ebiIe.o \
+	ieClasses/pcoIe.o \
+	ieClasses/traceInformationIe.o \
+	ieClasses/recoveryIe.o \
+	ieClasses/ueTimeZoneIe.o \
+	ieClasses/uciIe.o \
+	ieClasses/chargingCharacteristicsIe.o \
+	ieClasses/localDistinguishedNameIe.o \
+	ieClasses/signallingPriorityIndicationIe.o \
+	ieClasses/additionalProtocolConfigurationOptionsIe.o \
+	ieClasses/fqCsidIe.o \
+	ieClasses/bearerTftIe.o \
+	ieClasses/bearerQosIe.o \
+	ieClasses/changeReportingActionIe.o \
+	ieClasses/csgInformationReportingActionIe.o \
+	ieClasses/fqdnIe.o \
+	ieClasses/epcTimerIe.o \
+	ieClasses/chargingIdIe.o \
+	ieClasses/bearerFlagsIe.o \
+	ieClasses/ipAddressIe.o \
+	ieClasses/delayValueIe.o \
+	ieClasses/portNumberIe.o \
+	ieClasses/cnOperatorSelectionEntityIe.o \
+	ieClasses/servingPlmnRateControlIe.o \
+	ieClasses/counterIe.o \
+	ieClasses/twanIdentifierIe.o \
+	ieClasses/twanIdentifierTimestampIe.o \
+	ieClasses/secondaryRatUsageDataReportIe.o \
+	ieClasses/ranNasCauseIe.o \
+	ieClasses/epcoIe.o \
+	ieClasses/maximumPacketLossRateIe.o \
+	ieClasses/fContainerIe.o \
+	ieClasses/nodeIdentifierIe.o \
+	ieClasses/upFunctionSelectionIndicationFlagsIe.o \
+	ieClasses/henbInformationReportingIe.o \
+	ieClasses/ip4cpIe.o \
+	ieClasses/presenceReportingAreaActionIe.o \
+	ieClasses/nodeTypeIe.o \
+	ieClasses/ptiIe.o \
+	ieClasses/twmiIe.o \
+	ieClasses/millisecondTimeStampIe.o \
+	ieClasses/integerNumberIe.o \
+	ieClasses/mappedUeUsageTypeIe.o \
+	ieClasses/uliTimestampIe.o \
+	ieClasses/metricIe.o \
+	ieClasses/remoteUserIdIe.o \
+	ieClasses/remoteUeIpInformationIe.o \
+	ieClasses/sequenceNumberIe.o \
+	ieClasses/apnAndRelativeCapacityIe.o \
+	ieClasses/arpIe.o \
+	ieClasses/throttlingIe.o \
+	ieClasses/pagingAndServiceInformationIe.o \
+	msgClasses/createSessionRequestMsg.o \
+	msgClasses/gtpV2MsgFactory.o \
+	gtpV2Stack.o \
+	msgClasses/manual/gtpV2Message.o \
+	msgClasses/createSessionResponseMsg.o \
+	msgClasses/modifyBearerRequestMsg.o \
+	msgClasses/modifyBearerResponseMsg.o \
+	msgClasses/deleteSessionRequestMsg.o \
+	msgClasses/deleteSessionResponseMsg.o \
+	msgClasses/releaseAccessBearersRequestMsg.o \
+	msgClasses/releaseAccessBearersResponseMsg.o \
+	msgClasses/createBearerRequestMsg.o \
+	msgClasses/createBearerResponseMsg.o \
+	msgClasses/deleteBearerRequestMsg.o \
+	msgClasses/deleteBearerResponseMsg.o \
+	msgClasses/downlinkDataNotificationMsg.o \
+	msgClasses/downlinkDataNotificationAcknowledgeMsg.o \
+	msgClasses/downlinkDataNotificationFailureIndicationMsg.o \
+	ieClasses/bearerContextsToBeModifiedInModifyBearerRequest.o \
+	ieClasses/bearerContextIe.o \
+	ieClasses/manual/gtpV2GroupedIe.o \
+	ieClasses/bearerContextsToBeRemovedInModifyBearerRequest.o \
+	ieClasses/bearerContextsMarkedForRemovalInModifyBearerResponse.o \
+	ieClasses/bearerContextsModifiedInModifyBearerResponse.o \
+	ieClasses/bearerContextsToBeCreatedInCreateSessionRequest.o \
+	ieClasses/bearerContextsToBeRemovedInCreateSessionRequest.o \
+	ieClasses/bearerContextsCreatedInCreateSessionResponse.o \
+	ieClasses/bearerContextsMarkedForRemovalInCreateSessionResponse.o \
+	ieClasses/sgwsOverloadControlInformationInCreateSessionRequest.o \
+	ieClasses/overloadControlInformationIe.o \
+	ieClasses/twanEpdgsOverloadControlInformationInCreateSessionRequest.o \
+	ieClasses/mmeS4SgsnsOverloadControlInformationInCreateSessionRequest.o \
+	ieClasses/remoteUeContextConnectedInCreateSessionRequest.o \
+	ieClasses/remoteUeContextIe.o \
+	ieClasses/pgwsOverloadControlInformationInCreateSessionResponse.o \
+	ieClasses/sgwsOverloadControlInformationInCreateSessionResponse.o \
+	ieClasses/pgwsNodeLevelLoadControlInformationInCreateSessionResponse.o \
+	ieClasses/loadControlInformationIe.o \
+	ieClasses/pgwsApnLevelLoadControlInformationInCreateSessionResponse.o \
+	ieClasses/sgwsNodeLevelLoadControlInformationInCreateSessionResponse.o \
+	ieClasses/mmeS4SgsnsOverloadControlInformationInModifyBearerRequest.o \
+	ieClasses/sgwsOverloadControlInformationInModifyBearerRequest.o \
+	ieClasses/epdgsOverloadControlInformationInModifyBearerRequest.o \
+	ieClasses/sgwsOverloadControlInformationInModifyBearerResponse.o \
+	ieClasses/pgwsOverloadControlInformationInModifyBearerResponse.o \
+	ieClasses/sgwsNodeLevelLoadControlInformationInModifyBearerResponse.o \
+	ieClasses/pgwsApnLevelLoadControlInformationInModifyBearerResponse.o \
+	ieClasses/pgwsNodeLevelLoadControlInformationInModifyBearerResponse.o \
+	ieClasses/mmeS4SgsnsOverloadControlInformationInDeleteSessionRequest.o \
+	ieClasses/sgwsOverloadControlInformationInDeleteSessionRequest.o \
+	ieClasses/twanEpdgsOverloadControlInformationInDeleteSessionRequest.o \
+	ieClasses/sgwsOverloadControlInformationInDeleteSessionResponse.o \
+	ieClasses/pgwsOverloadControlInformationInDeleteSessionResponse.o \
+	ieClasses/pgwsNodeLevelLoadControlInformationInDeleteSessionResponse.o \
+	ieClasses/pgwsApnLevelLoadControlInformationInDeleteSessionResponse.o \
+	ieClasses/sgwsNodeLevelLoadControlInformationInDeleteSessionResponse.o \
+	ieClasses/sgwsOverloadControlInformationInReleaseAccessBearersResponse.o \
+	ieClasses/sgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponse.o \
+	ieClasses/bearerContextsInCreateBearerRequest.o \
+	ieClasses/pgwsNodeLevelLoadControlInformationInCreateBearerRequest.o \
+	ieClasses/pgwsApnLevelLoadControlInformationInCreateBearerRequest.o \
+	ieClasses/sgwsNodeLevelLoadControlInformationInCreateBearerRequest.o \
+	ieClasses/pgwsOverloadControlInformationInCreateBearerRequest.o \
+	ieClasses/sgwsOverloadControlInformationInCreateBearerRequest.o \
+	ieClasses/bearerContextsInCreateBearerResponse.o \
+	ieClasses/mmeS4SgsnsOverloadControlInformationInCreateBearerResponse.o \
+	ieClasses/sgwsOverloadControlInformationInCreateBearerResponse.o \
+	ieClasses/twanEpdgsOverloadControlInformationInCreateBearerResponse.o \
+	ieClasses/failedBearerContextsInDeleteBearerRequest.o \
+	ieClasses/pgwsNodeLevelLoadControlInformationInDeleteBearerRequest.o \
+	ieClasses/pgwsApnLevelLoadControlInformationInDeleteBearerRequest.o \
+	ieClasses/sgwsNodeLevelLoadControlInformationInDeleteBearerRequest.o \
+	ieClasses/pgwsOverloadControlInformationInDeleteBearerRequest.o \
+	ieClasses/sgwsOverloadControlInformationInDeleteBearerRequest.o \
+	ieClasses/bearerContextsInDeleteBearerResponse.o \
+	ieClasses/mmeS4SgsnsOverloadControlInformationInDeleteBearerResponse.o \
+	ieClasses/sgwsOverloadControlInformationInDeleteBearerResponse.o \
+	ieClasses/twanEpdgsOverloadControlInformationInDeleteBearerResponse.o \
+	ieClasses/sgwsNodeLevelLoadControlInformationInDownlinkDataNotification.o \
+	ieClasses/sgwsOverloadControlInformationInDownlinkDataNotification.o \
+	ieClasses/manual/dataTypeCodecUtils_manual.o \
+	gtpV2StackWrappers.o )
+all :  $(gtpV2CodecLIB)
+
+.PHONY : all
+
+$(gtpV2CodecLIB) : $(gtpV2CodecOBJS)
+	mkdir -p $(LIBDIR)
+	$(CC) $(CFLAGS) -shared -o $(gtpV2CodecLIB) $(gtpV2CodecOBJS)
+
+$(gtpV2CodecOBJS) : $(OBJDIR)/gtpV2Codec/%.o : %.cpp
+	echo "$@ from $< "
+	mkdir -p $(gtpV2CodecOBJDIR)/ieClasses/manual
+	mkdir -p $(gtpV2CodecOBJDIR)/msgClasses/manual
+	$(CC) $(CFLAGS) $(INC_DIRS) -fPIC -c $< -o $@
+
+install:
+	mkdir -p $(TOPDIR)/target/lib
+	cp -rf  $(gtpV2CodecLIB) $(TOPDIR)/target/lib
+
+clean :
+	rm -rf $(gtpV2CodecLIB)
+	rm -rf $(gtpV2CodecOBJDIR)
+
+.PHONY : clean
\ No newline at end of file
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;
+        }
+    }
+}
diff --git a/src/gtpV2Codec/gtpV2Stack.h b/src/gtpV2Codec/gtpV2Stack.h
new file mode 100644
index 0000000..39b1c91
--- /dev/null
+++ b/src/gtpV2Codec/gtpV2Stack.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+/******************************************************************************
+ *
+ * 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.h.tt>
+ ******************************************************************************/
+#ifndef GTPV2STACK_H_
+#define GTPV2STACK_H_
+
+#include <sstream>
+#include <basicTypes.h>
+#include <msgBuffer.h>
+#include "msgClasses/gtpV2MsgDataTypes.h"
+
+class GtpV2Stack {
+public:
+    GtpV2Stack();
+    virtual ~GtpV2Stack();
+
+    // Public datastructures that hold decoded data or data to be encoded
+    CreateSessionRequestMsgData createSessionRequestStackData;
+    CreateSessionResponseMsgData createSessionResponseStackData;
+    ModifyBearerRequestMsgData modifyBearerRequestStackData;
+    ModifyBearerResponseMsgData modifyBearerResponseStackData;
+    DeleteSessionRequestMsgData deleteSessionRequestStackData;
+    DeleteSessionResponseMsgData deleteSessionResponseStackData;
+    ReleaseAccessBearersRequestMsgData releaseAccessBearersRequestStackData;
+    ReleaseAccessBearersResponseMsgData releaseAccessBearersResponseStackData;
+    CreateBearerRequestMsgData createBearerRequestStackData;
+    CreateBearerResponseMsgData createBearerResponseStackData;
+    DeleteBearerRequestMsgData deleteBearerRequestStackData;
+    DeleteBearerResponseMsgData deleteBearerResponseStackData;
+    DownlinkDataNotificationMsgData downlinkDataNotificationStackData;
+    DownlinkDataNotificationAcknowledgeMsgData downlinkDataNotificationAcknowledgeStackData;
+    DownlinkDataNotificationFailureIndicationMsgData downlinkDataNotificationFailureIndicationStackData;
+
+    bool encodeMessage(GtpV2MessageHeader& msgHeader, MsgBuffer& buffer,
+                 void* data_p = NULL);
+	bool decodeGtpMessageHeader(GtpV2MessageHeader& msgHeader, MsgBuffer& buffer);
+    bool decodeMessage(GtpV2MessageHeader& msgHeader, MsgBuffer& buffer,
+                 void* data_p = NULL);
+    void display_v(Uint8 msgType, Debug& stream, void* data_p = NULL);
+};
+
+#endif /* GTPV2STACK_H_ */
diff --git a/src/gtpV2Codec/gtpV2StackWrappers.cpp b/src/gtpV2Codec/gtpV2StackWrappers.cpp
new file mode 100644
index 0000000..c8447fe
--- /dev/null
+++ b/src/gtpV2Codec/gtpV2StackWrappers.cpp
@@ -0,0 +1,85 @@
+#include "gtpV2Stack.h"
+#include "msgBuffer.h"
+#include "gtpV2StackWrappers.h"
+
+extern "C" 
+{
+        GtpV2Stack* createGtpV2Stack() 
+        {
+        	return new GtpV2Stack();
+        }
+
+        MsgBuffer* createMsgBuffer(uint16_t size)
+        {
+        	return new MsgBuffer();
+        }
+        
+        void MsgBuffer_free(MsgBuffer* buf_p)
+        {
+        	delete  buf_p;
+        }
+
+        void* MsgBuffer_getDataPointer(MsgBuffer* buf_p)
+        {
+        	return buf_p->getDataPointer();
+        }
+
+        uint16_t MsgBuffer_getBufLen(MsgBuffer* buf_p)
+        {
+        	return buf_p->getLength();
+        }
+
+        void MsgBuffer_reset(MsgBuffer* buf_p)
+        {
+        	return buf_p->reset();
+        }
+
+        bool MsgBuffer_writeBytes(MsgBuffer* msgBuf_p, Uint8* data, Uint16 size, bool append)
+        {
+        	return msgBuf_p->writeBytes(data, size, append);
+        }
+
+        void MsgBuffer_rewind(MsgBuffer* msgBuf_p)
+        {
+        	return msgBuf_p->rewind();
+        }
+
+        bool GtpV2Stack_buildGtpV2Message(
+            GtpV2Stack* stack_p,
+            MsgBuffer* buf_p,
+            GtpV2MessageHeader* msgHeader_p,
+            void* data_p)
+        {
+        	bool rc = stack_p->encodeMessage(*msgHeader_p, *buf_p, data_p);
+        	if (rc == false)
+        	{
+        		errorStream.printDebugStream();
+        	} else
+        	{
+        		cout << "GTP Encode Success" << endl;
+        	}
+        	return rc;
+        }
+
+        bool GtpV2Stack_decodeMessageHeader(GtpV2Stack* stack_p, GtpV2MessageHeader* hdr_p, MsgBuffer* msgBuf_p)
+        {
+        	return stack_p->decodeGtpMessageHeader(*hdr_p, *msgBuf_p);
+        }
+
+    	bool GtpV2Stack_decodeMessage(GtpV2Stack* stack_p,
+    			GtpV2MessageHeader* msgHeader,
+    			MsgBuffer* buffer,
+                void* data_p)
+    	{
+        	bool rc = stack_p->decodeMessage(*msgHeader, *buffer, data_p);
+        	if (rc == false)
+        	{
+        		errorStream.printDebugStream();
+        	} else
+        	{
+        		cout << "GTP Decode Success" << endl;
+        	}
+        	return rc;
+    	}
+
+}
diff --git a/src/gtpV2Codec/gtpV2StackWrappers.h b/src/gtpV2Codec/gtpV2StackWrappers.h
new file mode 100644
index 0000000..4aa5f72
--- /dev/null
+++ b/src/gtpV2Codec/gtpV2StackWrappers.h
@@ -0,0 +1,45 @@
+#ifndef __GtpStackWrappers_H
+#define __GtpStackWrappers_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include <stdint.h>
+#include "msgClasses/gtpV2MsgDataTypes.h"
+
+	typedef struct GtpV2Stack GtpV2Stack;
+	typedef struct MsgBuffer MsgBuffer;
+
+	GtpV2Stack* createGtpV2Stack();
+	MsgBuffer* createMsgBuffer(uint16_t size);
+
+	void* MsgBuffer_getDataPointer(MsgBuffer* buf_p);
+
+	uint16_t MsgBuffer_getBufLen(MsgBuffer* buf_p);
+
+	void MsgBuffer_reset(MsgBuffer* buf_p);
+
+	bool MsgBuffer_writeBytes(MsgBuffer* msgBuf_p, Uint8* data, Uint16 size, bool append);
+
+	void MsgBuffer_rewind(MsgBuffer* msgBuf_p);
+
+	void MsgBuffer_free(MsgBuffer* buf_p);
+
+	bool GtpV2Stack_decodeMessageHeader(GtpV2Stack* stack_p,
+			GtpV2MessageHeader* hdr_p,
+			MsgBuffer* msgBuf_p);
+
+	bool GtpV2Stack_decodeMessage(GtpV2Stack* stack_p,
+			GtpV2MessageHeader* msgHeader_p,
+			MsgBuffer* buffer_p,
+            void* data_p);
+
+	bool GtpV2Stack_buildGtpV2Message(GtpV2Stack* stack_p,
+						MsgBuffer* buf_p,
+						GtpV2MessageHeader* hdr_p,
+						void* data_p);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/src/gtpV2Codec/ieClasses/additionalProtocolConfigurationOptionsIe.cpp b/src/gtpV2Codec/ieClasses/additionalProtocolConfigurationOptionsIe.cpp
new file mode 100644
index 0000000..cd941db
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/additionalProtocolConfigurationOptionsIe.cpp
@@ -0,0 +1,78 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "additionalProtocolConfigurationOptionsIe.h"
+#include "dataTypeCodecUtils.h"
+
+AdditionalProtocolConfigurationOptionsIe::AdditionalProtocolConfigurationOptionsIe() 
+{
+    ieType = 163;
+    // TODO
+
+}
+
+AdditionalProtocolConfigurationOptionsIe::~AdditionalProtocolConfigurationOptionsIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool AdditionalProtocolConfigurationOptionsIe::encodeAdditionalProtocolConfigurationOptionsIe(MsgBuffer &buffer, AdditionalProtocolConfigurationOptionsIeData const &data)
+{
+    if (!(DataTypeCodecUtils::encodeUint8Array16(buffer, data.apco)))
+    {
+    errorStream.add((char *)"Encoding of apco failed\n");
+    return false;
+    }
+
+    return true;
+}
+
+bool AdditionalProtocolConfigurationOptionsIe::decodeAdditionalProtocolConfigurationOptionsIe(MsgBuffer &buffer, AdditionalProtocolConfigurationOptionsIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+
+    Uint16 lengthLeft = length;
+    lengthLeft = ieBoundary - buffer.getCurrentIndex();
+    if (!(DataTypeCodecUtils::decodeUint8Array16(buffer, data.apco, lengthLeft, 0)))
+    {
+        errorStream.add((char *)"Failed to decode: apco\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE AdditionalProtocolConfigurationOptionsIe\n");
+        return false;
+    }
+}
+void AdditionalProtocolConfigurationOptionsIe::displayAdditionalProtocolConfigurationOptionsIe_v(AdditionalProtocolConfigurationOptionsIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"AdditionalProtocolConfigurationOptionsIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add((char *)"apco:");
+    stream.endOfLine();
+    DataTypeCodecUtils::displayUint8Array16_v(data.apco, stream);
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/additionalProtocolConfigurationOptionsIe.h b/src/gtpV2Codec/ieClasses/additionalProtocolConfigurationOptionsIe.h
new file mode 100644
index 0000000..43e8ea1
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/additionalProtocolConfigurationOptionsIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef ADDITIONALPROTOCOLCONFIGURATIONOPTIONSIE_H_
+#define ADDITIONALPROTOCOLCONFIGURATIONOPTIONSIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class AdditionalProtocolConfigurationOptionsIe: public GtpV2Ie {
+public:
+    AdditionalProtocolConfigurationOptionsIe();
+    virtual ~AdditionalProtocolConfigurationOptionsIe();
+
+    bool encodeAdditionalProtocolConfigurationOptionsIe(MsgBuffer &buffer,
+                 AdditionalProtocolConfigurationOptionsIeData const &data);
+    bool decodeAdditionalProtocolConfigurationOptionsIe(MsgBuffer &buffer,
+                 AdditionalProtocolConfigurationOptionsIeData &data, Uint16 length);
+    void displayAdditionalProtocolConfigurationOptionsIe_v(AdditionalProtocolConfigurationOptionsIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* ADDITIONALPROTOCOLCONFIGURATIONOPTIONSIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/ambrIe.cpp b/src/gtpV2Codec/ieClasses/ambrIe.cpp
new file mode 100644
index 0000000..3ae5cd1
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/ambrIe.cpp
@@ -0,0 +1,93 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "ambrIe.h"
+#include "dataTypeCodecUtils.h"
+
+AmbrIe::AmbrIe() 
+{
+    ieType = 72;
+    // TODO
+
+}
+
+AmbrIe::~AmbrIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool AmbrIe::encodeAmbrIe(MsgBuffer &buffer, AmbrIeData const &data)
+{
+    if (!(buffer.writeUint32(data.maxMbrUplink)))
+    {
+        errorStream.add((char *)"Encoding of maxMbrUplink failed\n");
+        return false;
+    }
+    if (!(buffer.writeUint32(data.maxMbrDownlink)))
+    {
+        errorStream.add((char *)"Encoding of maxMbrDownlink failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool AmbrIe::decodeAmbrIe(MsgBuffer &buffer, AmbrIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+
+    buffer.readUint32(data.maxMbrUplink);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: maxMbrUplink\n");
+        return false;
+    }
+
+    buffer.readUint32(data.maxMbrDownlink);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: maxMbrDownlink\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE AmbrIe\n");
+        return false;
+    }
+}
+void AmbrIe::displayAmbrIe_v(AmbrIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"AmbrIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add((char *)"maxMbrUplink: ");
+    stream.add(data.maxMbrUplink);
+    stream.endOfLine();
+  
+    stream.add((char *)"maxMbrDownlink: ");
+    stream.add(data.maxMbrDownlink);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/ambrIe.h b/src/gtpV2Codec/ieClasses/ambrIe.h
new file mode 100644
index 0000000..0cd108b
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/ambrIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef AMBRIE_H_
+#define AMBRIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class AmbrIe: public GtpV2Ie {
+public:
+    AmbrIe();
+    virtual ~AmbrIe();
+
+    bool encodeAmbrIe(MsgBuffer &buffer,
+                 AmbrIeData const &data);
+    bool decodeAmbrIe(MsgBuffer &buffer,
+                 AmbrIeData &data, Uint16 length);
+    void displayAmbrIe_v(AmbrIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* AMBRIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/ambrMmbrIe.cpp b/src/gtpV2Codec/ieClasses/ambrMmbrIe.cpp
new file mode 100644
index 0000000..5deb43e
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/ambrMmbrIe.cpp
@@ -0,0 +1,93 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "ambrMmbrIe.h"
+#include "dataTypeCodecUtils.h"
+
+AmbrMmbrIe::AmbrMmbrIe() 
+{
+    ieType = 161;
+    // TODO
+
+}
+
+AmbrMmbrIe::~AmbrMmbrIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool AmbrMmbrIe::encodeAmbrMmbrIe(MsgBuffer &buffer, AmbrMmbrIeData const &data)
+{
+    if (!(buffer.writeUint32(data.maxMbrUplink)))
+    {
+        errorStream.add((char *)"Encoding of maxMbrUplink failed\n");
+        return false;
+    }
+    if (!(buffer.writeUint32(data.maxMbrDownlink)))
+    {
+        errorStream.add((char *)"Encoding of maxMbrDownlink failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool AmbrMmbrIe::decodeAmbrMmbrIe(MsgBuffer &buffer, AmbrMmbrIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+
+    buffer.readUint32(data.maxMbrUplink);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: maxMbrUplink\n");
+        return false;
+    }
+
+    buffer.readUint32(data.maxMbrDownlink);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: maxMbrDownlink\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE AmbrMmbrIe\n");
+        return false;
+    }
+}
+void AmbrMmbrIe::displayAmbrMmbrIe_v(AmbrMmbrIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"AmbrMmbrIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add((char *)"maxMbrUplink: ");
+    stream.add(data.maxMbrUplink);
+    stream.endOfLine();
+  
+    stream.add((char *)"maxMbrDownlink: ");
+    stream.add(data.maxMbrDownlink);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/ambrMmbrIe.h b/src/gtpV2Codec/ieClasses/ambrMmbrIe.h
new file mode 100644
index 0000000..41540b4
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/ambrMmbrIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef AMBRMMBRIE_H_
+#define AMBRMMBRIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class AmbrMmbrIe: public GtpV2Ie {
+public:
+    AmbrMmbrIe();
+    virtual ~AmbrMmbrIe();
+
+    bool encodeAmbrMmbrIe(MsgBuffer &buffer,
+                 AmbrMmbrIeData const &data);
+    bool decodeAmbrMmbrIe(MsgBuffer &buffer,
+                 AmbrMmbrIeData &data, Uint16 length);
+    void displayAmbrMmbrIe_v(AmbrMmbrIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* AMBRMMBRIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/apnAndRelativeCapacityIe.cpp b/src/gtpV2Codec/ieClasses/apnAndRelativeCapacityIe.cpp
new file mode 100644
index 0000000..fe6d129
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/apnAndRelativeCapacityIe.cpp
@@ -0,0 +1,120 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "apnAndRelativeCapacityIe.h"
+#include "dataTypeCodecUtils.h"
+
+ApnAndRelativeCapacityIe::ApnAndRelativeCapacityIe() 
+{
+    ieType = 184;
+    // TODO
+
+}
+
+ApnAndRelativeCapacityIe::~ApnAndRelativeCapacityIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool ApnAndRelativeCapacityIe::encodeApnAndRelativeCapacityIe(MsgBuffer &buffer, ApnAndRelativeCapacityIeData const &data)
+{
+    if (!(data.relativeCapacity>= 1 && data.relativeCapacity<= 100))
+    {
+        errorStream.add((char *)"Data validation failure: relativeCapacity\n");
+        return false; 
+    }
+    if (!(buffer.writeUint8(data.relativeCapacity)))
+    {
+        errorStream.add((char *)"Encoding of relativeCapacity failed\n");
+        return false;
+    }
+    if (!(buffer.writeUint8(data.apnLength)))
+    {
+        errorStream.add((char *)"Encoding of apnLength failed\n");
+        return false;
+    }
+    if (!(DataTypeCodecUtils::encodeUint8Array32(buffer, data.apn)))
+    {
+    errorStream.add((char *)"Encoding of apn failed\n");
+    return false;
+    }
+
+    return true;
+}
+
+bool ApnAndRelativeCapacityIe::decodeApnAndRelativeCapacityIe(MsgBuffer &buffer, ApnAndRelativeCapacityIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+
+    buffer.readUint8(data.relativeCapacity);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: relativeCapacity\n");
+        return false;
+    }
+    if (!(data.relativeCapacity>= 1 && data.relativeCapacity<= 100))
+    {
+        errorStream.add((char *)"Data validation failure : relativeCapacity\n");
+        return false; //TODO need to add validations
+    }
+
+    buffer.readUint8(data.apnLength);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: apnLength\n");
+        return false;
+    }
+
+    Uint16 lengthLeft = length;
+    lengthLeft = ieBoundary - buffer.getCurrentIndex();
+    if (!(DataTypeCodecUtils::decodeUint8Array32(buffer, data.apn, lengthLeft, 0)))
+    {
+        errorStream.add((char *)"Failed to decode: apn\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE ApnAndRelativeCapacityIe\n");
+        return false;
+    }
+}
+void ApnAndRelativeCapacityIe::displayApnAndRelativeCapacityIe_v(ApnAndRelativeCapacityIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"ApnAndRelativeCapacityIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add((char *)"relativeCapacity: ");
+    stream.add(data.relativeCapacity);
+    stream.endOfLine();
+  
+    stream.add((char *)"apnLength: ");
+    stream.add(data.apnLength);
+    stream.endOfLine();
+  
+    stream.add((char *)"apn:");
+    stream.endOfLine();
+    DataTypeCodecUtils::displayUint8Array32_v(data.apn, stream);
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/apnAndRelativeCapacityIe.h b/src/gtpV2Codec/ieClasses/apnAndRelativeCapacityIe.h
new file mode 100644
index 0000000..5928d19
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/apnAndRelativeCapacityIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef APNANDRELATIVECAPACITYIE_H_
+#define APNANDRELATIVECAPACITYIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class ApnAndRelativeCapacityIe: public GtpV2Ie {
+public:
+    ApnAndRelativeCapacityIe();
+    virtual ~ApnAndRelativeCapacityIe();
+
+    bool encodeApnAndRelativeCapacityIe(MsgBuffer &buffer,
+                 ApnAndRelativeCapacityIeData const &data);
+    bool decodeApnAndRelativeCapacityIe(MsgBuffer &buffer,
+                 ApnAndRelativeCapacityIeData &data, Uint16 length);
+    void displayApnAndRelativeCapacityIe_v(ApnAndRelativeCapacityIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* APNANDRELATIVECAPACITYIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/apnIe.cpp b/src/gtpV2Codec/ieClasses/apnIe.cpp
new file mode 100644
index 0000000..243b9dc
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/apnIe.cpp
@@ -0,0 +1,78 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "apnIe.h"
+#include "dataTypeCodecUtils.h"
+
+ApnIe::ApnIe() 
+{
+    ieType = 71;
+    // TODO
+
+}
+
+ApnIe::~ApnIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool ApnIe::encodeApnIe(MsgBuffer &buffer, ApnIeData const &data)
+{
+    if (!(DataTypeCodecUtils::encodeUint8Array32(buffer, data.apnValue)))
+    {
+    errorStream.add((char *)"Encoding of apnValue failed\n");
+    return false;
+    }
+
+    return true;
+}
+
+bool ApnIe::decodeApnIe(MsgBuffer &buffer, ApnIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+
+    Uint16 lengthLeft = length;
+    lengthLeft = ieBoundary - buffer.getCurrentIndex();
+    if (!(DataTypeCodecUtils::decodeUint8Array32(buffer, data.apnValue, lengthLeft, 0)))
+    {
+        errorStream.add((char *)"Failed to decode: apnValue\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE ApnIe\n");
+        return false;
+    }
+}
+void ApnIe::displayApnIe_v(ApnIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"ApnIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add((char *)"apnValue:");
+    stream.endOfLine();
+    DataTypeCodecUtils::displayUint8Array32_v(data.apnValue, stream);
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/apnIe.h b/src/gtpV2Codec/ieClasses/apnIe.h
new file mode 100644
index 0000000..9237e48
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/apnIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef APNIE_H_
+#define APNIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class ApnIe: public GtpV2Ie {
+public:
+    ApnIe();
+    virtual ~ApnIe();
+
+    bool encodeApnIe(MsgBuffer &buffer,
+                 ApnIeData const &data);
+    bool decodeApnIe(MsgBuffer &buffer,
+                 ApnIeData &data, Uint16 length);
+    void displayApnIe_v(ApnIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* APNIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/apnRestrictionIe.cpp b/src/gtpV2Codec/ieClasses/apnRestrictionIe.cpp
new file mode 100644
index 0000000..d4b018c
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/apnRestrictionIe.cpp
@@ -0,0 +1,77 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "apnRestrictionIe.h"
+#include "dataTypeCodecUtils.h"
+
+ApnRestrictionIe::ApnRestrictionIe() 
+{
+    ieType = 127;
+    // TODO
+
+}
+
+ApnRestrictionIe::~ApnRestrictionIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool ApnRestrictionIe::encodeApnRestrictionIe(MsgBuffer &buffer, ApnRestrictionIeData const &data)
+{
+    if (!(buffer.writeUint8(data.restrictionValue)))
+    {
+        errorStream.add((char *)"Encoding of restrictionValue failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool ApnRestrictionIe::decodeApnRestrictionIe(MsgBuffer &buffer, ApnRestrictionIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+
+    buffer.readUint8(data.restrictionValue);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: restrictionValue\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE ApnRestrictionIe\n");
+        return false;
+    }
+}
+void ApnRestrictionIe::displayApnRestrictionIe_v(ApnRestrictionIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"ApnRestrictionIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add((char *)"restrictionValue: ");
+    stream.add(data.restrictionValue);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/apnRestrictionIe.h b/src/gtpV2Codec/ieClasses/apnRestrictionIe.h
new file mode 100644
index 0000000..b8ae71b
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/apnRestrictionIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef APNRESTRICTIONIE_H_
+#define APNRESTRICTIONIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class ApnRestrictionIe: public GtpV2Ie {
+public:
+    ApnRestrictionIe();
+    virtual ~ApnRestrictionIe();
+
+    bool encodeApnRestrictionIe(MsgBuffer &buffer,
+                 ApnRestrictionIeData const &data);
+    bool decodeApnRestrictionIe(MsgBuffer &buffer,
+                 ApnRestrictionIeData &data, Uint16 length);
+    void displayApnRestrictionIe_v(ApnRestrictionIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* APNRESTRICTIONIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/arpIe.cpp b/src/gtpV2Codec/ieClasses/arpIe.cpp
new file mode 100644
index 0000000..3d307ef
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/arpIe.cpp
@@ -0,0 +1,127 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "arpIe.h"
+#include "dataTypeCodecUtils.h"
+
+ArpIe::ArpIe() 
+{
+    ieType = 155;
+    // TODO
+
+}
+
+ArpIe::~ArpIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool ArpIe::encodeArpIe(MsgBuffer &buffer, ArpIeData const &data)
+{
+    buffer.skipBits(1);
+
+    if(!(buffer.writeBits(data.pci, 1)))
+    {
+        errorStream.add((char *)"Encoding of pci failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.pl, 4)))
+    {
+        errorStream.add((char *)"Encoding of pl failed\n");
+        return false;
+    }
+    buffer.skipBits(1);
+
+    if(!(buffer.writeBits(data.pvi, 1)))
+    {
+        errorStream.add((char *)"Encoding of pvi failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool ArpIe::decodeArpIe(MsgBuffer &buffer, ArpIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+    buffer.skipBits(1);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: \n");
+        return false;
+    }
+
+    data.pci = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: pci\n");
+        return false;
+    }
+    data.pl = buffer.readBits(4);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: pl\n");
+        return false;
+    }
+    buffer.skipBits(1);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: \n");
+        return false;
+    }
+
+    data.pvi = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: pvi\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE ArpIe\n");
+        return false;
+    }
+}
+void ArpIe::displayArpIe_v(ArpIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"ArpIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add( (char *)"pci: "); 
+    stream.add((Uint8)data.pci);
+    stream.endOfLine();
+  
+    stream.add( (char *)"pl: "); 
+    stream.add((Uint8)data.pl);
+    stream.endOfLine();
+  
+    stream.add( (char *)"pvi: "); 
+    stream.add((Uint8)data.pvi);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/arpIe.h b/src/gtpV2Codec/ieClasses/arpIe.h
new file mode 100644
index 0000000..3cb200f
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/arpIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef ARPIE_H_
+#define ARPIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class ArpIe: public GtpV2Ie {
+public:
+    ArpIe();
+    virtual ~ArpIe();
+
+    bool encodeArpIe(MsgBuffer &buffer,
+                 ArpIeData const &data);
+    bool decodeArpIe(MsgBuffer &buffer,
+                 ArpIeData &data, Uint16 length);
+    void displayArpIe_v(ArpIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* ARPIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/bearerContextIe.cpp b/src/gtpV2Codec/ieClasses/bearerContextIe.cpp
new file mode 100644
index 0000000..8fd846d
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/bearerContextIe.cpp
@@ -0,0 +1,82 @@
+/*
+ * 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/grpietemplate.cpp.tt>
+ ******************************************************************************/
+#include "bearerContextIe.h"
+#include "gtpV2GrpIeDataTypes.h"
+#include "manual/gtpV2GroupedIe.h"
+
+#include "bearerContextsToBeModifiedInModifyBearerRequest.h"
+#include "bearerContextsToBeRemovedInModifyBearerRequest.h"
+#include "bearerContextsMarkedForRemovalInModifyBearerResponse.h"
+#include "bearerContextsModifiedInModifyBearerResponse.h"
+#include "bearerContextsToBeCreatedInCreateSessionRequest.h"
+#include "bearerContextsToBeRemovedInCreateSessionRequest.h"
+#include "bearerContextsCreatedInCreateSessionResponse.h"
+#include "bearerContextsMarkedForRemovalInCreateSessionResponse.h"
+#include "bearerContextsInCreateBearerRequest.h"
+#include "bearerContextsInCreateBearerResponse.h"
+#include "failedBearerContextsInDeleteBearerRequest.h"
+#include "bearerContextsInDeleteBearerResponse.h"
+
+BearerContextIe::BearerContextIe()
+{
+    ieType = BearerContextIeType;
+   
+    BearerContextsToBeModifiedInModifyBearerRequest* bearerContextsToBeModifiedInModifyBearerRequest_p = new (BearerContextsToBeModifiedInModifyBearerRequest);
+    insertGroupedIeObject(ModifyBearerRequestMsgType, 0, bearerContextsToBeModifiedInModifyBearerRequest_p);
+    BearerContextsToBeRemovedInModifyBearerRequest* bearerContextsToBeRemovedInModifyBearerRequest_p = new (BearerContextsToBeRemovedInModifyBearerRequest);
+    insertGroupedIeObject(ModifyBearerRequestMsgType, 1, bearerContextsToBeRemovedInModifyBearerRequest_p);
+    BearerContextsMarkedForRemovalInModifyBearerResponse* bearerContextsMarkedForRemovalInModifyBearerResponse_p = new (BearerContextsMarkedForRemovalInModifyBearerResponse);
+    insertGroupedIeObject(ModifyBearerResponseMsgType, 1, bearerContextsMarkedForRemovalInModifyBearerResponse_p);
+    BearerContextsModifiedInModifyBearerResponse* bearerContextsModifiedInModifyBearerResponse_p = new (BearerContextsModifiedInModifyBearerResponse);
+    insertGroupedIeObject(ModifyBearerResponseMsgType, 0, bearerContextsModifiedInModifyBearerResponse_p);
+    BearerContextsToBeCreatedInCreateSessionRequest* bearerContextsToBeCreatedInCreateSessionRequest_p = new (BearerContextsToBeCreatedInCreateSessionRequest);
+    insertGroupedIeObject(CreateSessionRequestMsgType, 0, bearerContextsToBeCreatedInCreateSessionRequest_p);
+    BearerContextsToBeRemovedInCreateSessionRequest* bearerContextsToBeRemovedInCreateSessionRequest_p = new (BearerContextsToBeRemovedInCreateSessionRequest);
+    insertGroupedIeObject(CreateSessionRequestMsgType, 1, bearerContextsToBeRemovedInCreateSessionRequest_p);
+    BearerContextsCreatedInCreateSessionResponse* bearerContextsCreatedInCreateSessionResponse_p = new (BearerContextsCreatedInCreateSessionResponse);
+    insertGroupedIeObject(CreateSessionResponseMsgType, 0, bearerContextsCreatedInCreateSessionResponse_p);
+    BearerContextsMarkedForRemovalInCreateSessionResponse* bearerContextsMarkedForRemovalInCreateSessionResponse_p = new (BearerContextsMarkedForRemovalInCreateSessionResponse);
+    insertGroupedIeObject(CreateSessionResponseMsgType, 1, bearerContextsMarkedForRemovalInCreateSessionResponse_p);
+    BearerContextsInCreateBearerRequest* bearerContextsInCreateBearerRequest_p = new (BearerContextsInCreateBearerRequest);
+    insertGroupedIeObject(CreateBearerRequestMsgType, 0, bearerContextsInCreateBearerRequest_p);
+    BearerContextsInCreateBearerResponse* bearerContextsInCreateBearerResponse_p = new (BearerContextsInCreateBearerResponse);
+    insertGroupedIeObject(CreateBearerResponseMsgType, 0, bearerContextsInCreateBearerResponse_p);
+    FailedBearerContextsInDeleteBearerRequest* failedBearerContextsInDeleteBearerRequest_p = new (FailedBearerContextsInDeleteBearerRequest);
+    insertGroupedIeObject(DeleteBearerRequestMsgType, 0, failedBearerContextsInDeleteBearerRequest_p);
+    BearerContextsInDeleteBearerResponse* bearerContextsInDeleteBearerResponse_p = new (BearerContextsInDeleteBearerResponse);
+    insertGroupedIeObject(DeleteBearerResponseMsgType, 0, bearerContextsInDeleteBearerResponse_p);
+}
+
+BearerContextIe::~BearerContextIe() {
+// TODO Auto-generated destructor stub
+}
+
+GtpV2GroupedIe& BearerContextIe::getGroupedIe(Uint8 msgType, Uint8 instance)
+{
+    std::map<Uint16, GtpV2GroupedIe*>::iterator it;
+    Uint16 key = msgType;
+    key = (key << 8) + instance;
+    it = groupedIeObjectContainer.find(key);
+    return *(it->second);
+}
+
+void BearerContextIe::insertGroupedIeObject(Uint8 msgType, Uint8 instance, GtpV2GroupedIe* grpIe_p)
+{
+
+    Uint16 key = msgType;
+    key = (key << 8) + instance;
+
+    groupedIeObjectContainer.insert(std::pair<Uint16, GtpV2GroupedIe*>(key, grpIe_p));
+
+}  
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/bearerContextIe.h b/src/gtpV2Codec/ieClasses/bearerContextIe.h
new file mode 100644
index 0000000..9e1b2b5
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/bearerContextIe.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/grpietemplate.h.tt>
+ ******************************************************************************/
+#ifndef BEARERCONTEXTIE_H_
+#define BEARERCONTEXTIE_H_
+
+#include <map>
+#include "manual/gtpV2Ie.h"
+#include "manual/gtpV2GroupedIe.h"
+#include "gtpV2DataTypes.h"
+
+class BearerContextIe:public GtpV2Ie
+{
+public:
+    BearerContextIe ();
+    virtual ~ BearerContextIe ();
+
+    GtpV2GroupedIe & getGroupedIe (Uint8 msgType, Uint8 instance);
+    void insertGroupedIeObject (Uint8 msgType, Uint8 instance,
+                GtpV2GroupedIe * grpIe_p);
+
+private:
+    map < Uint16, GtpV2GroupedIe * >groupedIeObjectContainer;   // map[msgType || instance]
+};
+
+#endif
diff --git a/src/gtpV2Codec/ieClasses/bearerContextsCreatedInCreateSessionResponse.cpp b/src/gtpV2Codec/ieClasses/bearerContextsCreatedInCreateSessionResponse.cpp
new file mode 100644
index 0000000..13e056e
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/bearerContextsCreatedInCreateSessionResponse.cpp
@@ -0,0 +1,852 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "bearerContextsCreatedInCreateSessionResponse.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "ebiIe.h"
+#include "causeIe.h"
+#include "fTeidIe.h"
+#include "fTeidIe.h"
+#include "fTeidIe.h"
+#include "fTeidIe.h"
+#include "fTeidIe.h"
+#include "fTeidIe.h"
+#include "bearerQosIe.h"
+#include "chargingIdIe.h"
+#include "bearerFlagsIe.h"
+#include "fTeidIe.h"
+
+BearerContextsCreatedInCreateSessionResponse::
+BearerContextsCreatedInCreateSessionResponse()
+{
+    Uint16 mandIe;
+    mandIe = EbiIeType;
+    mandIe = (mandIe << 8) | 0; // epsBearerId
+    mandatoryIeSet.insert(mandIe);
+    mandIe = CauseIeType;
+    mandIe = (mandIe << 8) | 0; // cause
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+BearerContextsCreatedInCreateSessionResponse::
+~BearerContextsCreatedInCreateSessionResponse()
+{
+
+}
+bool BearerContextsCreatedInCreateSessionResponse::
+encodeBearerContextsCreatedInCreateSessionResponse(MsgBuffer &buffer,
+                         BearerContextsCreatedInCreateSessionResponseData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = EbiIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    EbiIe ebi=
+    dynamic_cast<
+    EbiIe&>(GtpV2IeFactory::getInstance().getIeObject(EbiIeType));
+    rc = ebi.encodeEbiIe(buffer, data.epsBearerId);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: epsBearerId\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = CauseIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    CauseIe cause=
+    dynamic_cast<
+    CauseIe&>(GtpV2IeFactory::getInstance().getIeObject(CauseIeType));
+    rc = cause.encodeCauseIe(buffer, data.cause);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: cause\n");
+        return false;
+    }
+
+    if (data.s1USgwFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.s1USgwFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: s1USgwFTeid\n");
+          return false;
+        }
+    }
+
+    if (data.s4USgwFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.s4USgwFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: s4USgwFTeid\n");
+          return false;
+        }
+    }
+
+    if (data.s5S8UPgwFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 2;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.s5S8UPgwFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: s5S8UPgwFTeid\n");
+          return false;
+        }
+    }
+
+    if (data.s12SgwFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 3;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.s12SgwFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: s12SgwFTeid\n");
+          return false;
+        }
+    }
+
+    if (data.s2bUPgwFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 4;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.s2bUPgwFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: s2bUPgwFTeid\n");
+          return false;
+        }
+    }
+
+    if (data.s2aUPgwFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 5;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.s2aUPgwFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: s2aUPgwFTeid\n");
+          return false;
+        }
+    }
+
+    if (data.bearerLevelQosIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = BearerQosIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        BearerQosIe bearerQos=
+        dynamic_cast<
+        BearerQosIe&>(GtpV2IeFactory::getInstance().getIeObject(BearerQosIeType));
+        rc = bearerQos.encodeBearerQosIe(buffer, data.bearerLevelQos);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: bearerLevelQos\n");
+          return false;
+        }
+    }
+
+    if (data.chargingIdIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = ChargingIdIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        ChargingIdIe chargingId=
+        dynamic_cast<
+        ChargingIdIe&>(GtpV2IeFactory::getInstance().getIeObject(ChargingIdIeType));
+        rc = chargingId.encodeChargingIdIe(buffer, data.chargingId);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: chargingId\n");
+          return false;
+        }
+    }
+
+    if (data.bearerFlagsIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = BearerFlagsIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        BearerFlagsIe bearerFlags=
+        dynamic_cast<
+        BearerFlagsIe&>(GtpV2IeFactory::getInstance().getIeObject(BearerFlagsIeType));
+        rc = bearerFlags.encodeBearerFlagsIe(buffer, data.bearerFlags);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: bearerFlags\n");
+          return false;
+        }
+    }
+
+    if (data.s11USgwFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 6;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.s11USgwFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: s11USgwFTeid\n");
+          return false;
+        }
+    }
+    return rc;
+}
+
+bool BearerContextsCreatedInCreateSessionResponse::
+decodeBearerContextsCreatedInCreateSessionResponse(MsgBuffer &buffer,
+                         BearerContextsCreatedInCreateSessionResponseData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case EbiIeType:
+            {
+                EbiIe ieObject =
+                dynamic_cast<
+                EbiIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(EbiIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeEbiIe(buffer, data.epsBearerId, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: epsBearerId\n");
+                        return false;
+                    }
+                    Uint16 mandIe = EbiIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case CauseIeType:
+            {
+                CauseIe ieObject =
+                dynamic_cast<
+                CauseIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(CauseIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeCauseIe(buffer, data.cause, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: cause\n");
+                        return false;
+                    }
+                    Uint16 mandIe = CauseIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case FTeidIeType:
+            {
+                FTeidIe ieObject =
+                dynamic_cast<
+                FTeidIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(FTeidIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeFTeidIe(buffer, data.s1USgwFTeid, ieHeader.length);
+
+                    data.s1USgwFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: s1USgwFTeid\n");
+                        return false;
+                    }
+                }
+
+                else if(ieHeader.instance == 1)
+                {
+
+                					rc = ieObject.decodeFTeidIe(buffer, data.s4USgwFTeid, ieHeader.length);
+
+                    data.s4USgwFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: s4USgwFTeid\n");
+                        return false;
+                    }
+                }
+
+                else if(ieHeader.instance == 2)
+                {
+
+                					rc = ieObject.decodeFTeidIe(buffer, data.s5S8UPgwFTeid, ieHeader.length);
+
+                    data.s5S8UPgwFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: s5S8UPgwFTeid\n");
+                        return false;
+                    }
+                }
+
+                else if(ieHeader.instance == 3)
+                {
+
+                					rc = ieObject.decodeFTeidIe(buffer, data.s12SgwFTeid, ieHeader.length);
+
+                    data.s12SgwFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: s12SgwFTeid\n");
+                        return false;
+                    }
+                }
+
+                else if(ieHeader.instance == 4)
+                {
+
+                					rc = ieObject.decodeFTeidIe(buffer, data.s2bUPgwFTeid, ieHeader.length);
+
+                    data.s2bUPgwFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: s2bUPgwFTeid\n");
+                        return false;
+                    }
+                }
+
+                else if(ieHeader.instance == 5)
+                {
+
+                					rc = ieObject.decodeFTeidIe(buffer, data.s2aUPgwFTeid, ieHeader.length);
+
+                    data.s2aUPgwFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: s2aUPgwFTeid\n");
+                        return false;
+                    }
+                }
+
+                else if(ieHeader.instance == 6)
+                {
+
+                					rc = ieObject.decodeFTeidIe(buffer, data.s11USgwFTeid, ieHeader.length);
+
+                    data.s11USgwFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: s11USgwFTeid\n");
+                        return false;
+                    }
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case BearerQosIeType:
+            {
+                BearerQosIe ieObject =
+                dynamic_cast<
+                BearerQosIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(BearerQosIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeBearerQosIe(buffer, data.bearerLevelQos, ieHeader.length);
+
+                    data.bearerLevelQosIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: bearerLevelQos\n");
+                        return false;
+                    }
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case ChargingIdIeType:
+            {
+                ChargingIdIe ieObject =
+                dynamic_cast<
+                ChargingIdIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(ChargingIdIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeChargingIdIe(buffer, data.chargingId, ieHeader.length);
+
+                    data.chargingIdIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: chargingId\n");
+                        return false;
+                    }
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case BearerFlagsIeType:
+            {
+                BearerFlagsIe ieObject =
+                dynamic_cast<
+                BearerFlagsIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(BearerFlagsIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeBearerFlagsIe(buffer, data.bearerFlags, ieHeader.length);
+
+                    data.bearerFlagsIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: bearerFlags\n");
+                        return false;
+                    }
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void BearerContextsCreatedInCreateSessionResponse::
+displayBearerContextsCreatedInCreateSessionResponseData_v
+(BearerContextsCreatedInCreateSessionResponseData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"BearerContextsCreatedInCreateSessionResponse:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+    if (data.s1USgwFTeidIePresent)
+    {
+
+        stream.add((char *)"s1USgwFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.s1USgwFTeid, stream);
+
+    }
+
+    if (data.s4USgwFTeidIePresent)
+    {
+
+        stream.add((char *)"s4USgwFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.s4USgwFTeid, stream);
+
+    }
+
+    if (data.s5S8UPgwFTeidIePresent)
+    {
+
+        stream.add((char *)"s5S8UPgwFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.s5S8UPgwFTeid, stream);
+
+    }
+
+    if (data.s12SgwFTeidIePresent)
+    {
+
+        stream.add((char *)"s12SgwFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.s12SgwFTeid, stream);
+
+    }
+
+    if (data.s2bUPgwFTeidIePresent)
+    {
+
+        stream.add((char *)"s2bUPgwFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.s2bUPgwFTeid, stream);
+
+    }
+
+    if (data.s2aUPgwFTeidIePresent)
+    {
+
+        stream.add((char *)"s2aUPgwFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.s2aUPgwFTeid, stream);
+
+    }
+
+    if (data.bearerLevelQosIePresent)
+    {
+
+        stream.add((char *)"bearerLevelQos:");
+        stream.endOfLine();
+        BearerQosIe bearerQos=
+        dynamic_cast<
+        BearerQosIe&>(GtpV2IeFactory::getInstance().getIeObject(BearerQosIeType));
+        bearerQos.displayBearerQosIe_v(data.bearerLevelQos, stream);
+
+    }
+
+    if (data.chargingIdIePresent)
+    {
+
+        stream.add((char *)"chargingId:");
+        stream.endOfLine();
+        ChargingIdIe chargingId=
+        dynamic_cast<
+        ChargingIdIe&>(GtpV2IeFactory::getInstance().getIeObject(ChargingIdIeType));
+        chargingId.displayChargingIdIe_v(data.chargingId, stream);
+
+    }
+
+    if (data.bearerFlagsIePresent)
+    {
+
+        stream.add((char *)"bearerFlags:");
+        stream.endOfLine();
+        BearerFlagsIe bearerFlags=
+        dynamic_cast<
+        BearerFlagsIe&>(GtpV2IeFactory::getInstance().getIeObject(BearerFlagsIeType));
+        bearerFlags.displayBearerFlagsIe_v(data.bearerFlags, stream);
+
+    }
+
+    if (data.s11USgwFTeidIePresent)
+    {
+
+        stream.add((char *)"s11USgwFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.s11USgwFTeid, stream);
+
+    }
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/bearerContextsCreatedInCreateSessionResponse.h b/src/gtpV2Codec/ieClasses/bearerContextsCreatedInCreateSessionResponse.h
new file mode 100644
index 0000000..74c0ab2
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/bearerContextsCreatedInCreateSessionResponse.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef BEARERCONTEXTSCREATEDINCREATESESSIONRESPONSE_H_
+#define BEARERCONTEXTSCREATEDINCREATESESSIONRESPONSE_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class BearerContextsCreatedInCreateSessionResponse:public GtpV2GroupedIe
+{
+public:
+    BearerContextsCreatedInCreateSessionResponse();
+    virtual ~BearerContextsCreatedInCreateSessionResponse();
+    bool encodeBearerContextsCreatedInCreateSessionResponse(MsgBuffer &buffer,
+                             BearerContextsCreatedInCreateSessionResponseData
+                              const &data);
+
+    bool decodeBearerContextsCreatedInCreateSessionResponse (MsgBuffer &buffer,
+                             BearerContextsCreatedInCreateSessionResponseData 
+                             & data, Uint16 length);
+
+    void displayBearerContextsCreatedInCreateSessionResponseData_v
+    (BearerContextsCreatedInCreateSessionResponseData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/bearerContextsInCreateBearerRequest.cpp b/src/gtpV2Codec/ieClasses/bearerContextsInCreateBearerRequest.cpp
new file mode 100644
index 0000000..c87ec60
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/bearerContextsInCreateBearerRequest.cpp
@@ -0,0 +1,1002 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "bearerContextsInCreateBearerRequest.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "ebiIe.h"
+#include "bearerTftIe.h"
+#include "fTeidIe.h"
+#include "fTeidIe.h"
+#include "fTeidIe.h"
+#include "fTeidIe.h"
+#include "fTeidIe.h"
+#include "fTeidIe.h"
+#include "bearerQosIe.h"
+#include "chargingIdIe.h"
+#include "bearerFlagsIe.h"
+#include "pcoIe.h"
+#include "epcoIe.h"
+#include "maximumPacketLossRateIe.h"
+
+BearerContextsInCreateBearerRequest::
+BearerContextsInCreateBearerRequest()
+{
+    Uint16 mandIe;
+    mandIe = EbiIeType;
+    mandIe = (mandIe << 8) | 0; // epsBearerId
+    mandatoryIeSet.insert(mandIe);
+    mandIe = BearerTftIeType;
+    mandIe = (mandIe << 8) | 0; // tft
+    mandatoryIeSet.insert(mandIe);
+    mandIe = BearerQosIeType;
+    mandIe = (mandIe << 8) | 0; // bearerLevelQos
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+BearerContextsInCreateBearerRequest::
+~BearerContextsInCreateBearerRequest()
+{
+
+}
+bool BearerContextsInCreateBearerRequest::
+encodeBearerContextsInCreateBearerRequest(MsgBuffer &buffer,
+                         BearerContextsInCreateBearerRequestData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = EbiIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    EbiIe ebi=
+    dynamic_cast<
+    EbiIe&>(GtpV2IeFactory::getInstance().getIeObject(EbiIeType));
+    rc = ebi.encodeEbiIe(buffer, data.epsBearerId);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: epsBearerId\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = BearerTftIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    BearerTftIe bearerTft=
+    dynamic_cast<
+    BearerTftIe&>(GtpV2IeFactory::getInstance().getIeObject(BearerTftIeType));
+    rc = bearerTft.encodeBearerTftIe(buffer, data.tft);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: tft\n");
+        return false;
+    }
+
+    if (data.s1USgwFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.s1USgwFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: s1USgwFTeid\n");
+          return false;
+        }
+    }
+
+    if (data.s58UPgwFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.s58UPgwFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: s58UPgwFTeid\n");
+          return false;
+        }
+    }
+
+    if (data.s12SgwFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 2;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.s12SgwFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: s12SgwFTeid\n");
+          return false;
+        }
+    }
+
+    if (data.s4USgwFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 3;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.s4USgwFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: s4USgwFTeid\n");
+          return false;
+        }
+    }
+
+    if (data.s2bUPgwFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 4;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.s2bUPgwFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: s2bUPgwFTeid\n");
+          return false;
+        }
+    }
+
+    if (data.s2aUPgwFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 5;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.s2aUPgwFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: s2aUPgwFTeid\n");
+          return false;
+        }
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = BearerQosIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    BearerQosIe bearerQos=
+    dynamic_cast<
+    BearerQosIe&>(GtpV2IeFactory::getInstance().getIeObject(BearerQosIeType));
+    rc = bearerQos.encodeBearerQosIe(buffer, data.bearerLevelQos);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: bearerLevelQos\n");
+        return false;
+    }
+
+    if (data.chargingIdIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = ChargingIdIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        ChargingIdIe chargingId=
+        dynamic_cast<
+        ChargingIdIe&>(GtpV2IeFactory::getInstance().getIeObject(ChargingIdIeType));
+        rc = chargingId.encodeChargingIdIe(buffer, data.chargingId);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: chargingId\n");
+          return false;
+        }
+    }
+
+    if (data.bearerFlagsIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = BearerFlagsIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        BearerFlagsIe bearerFlags=
+        dynamic_cast<
+        BearerFlagsIe&>(GtpV2IeFactory::getInstance().getIeObject(BearerFlagsIeType));
+        rc = bearerFlags.encodeBearerFlagsIe(buffer, data.bearerFlags);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: bearerFlags\n");
+          return false;
+        }
+    }
+
+    if (data.protocolConfigurationOptionsIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = PcoIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        PcoIe pco=
+        dynamic_cast<
+        PcoIe&>(GtpV2IeFactory::getInstance().getIeObject(PcoIeType));
+        rc = pco.encodePcoIe(buffer, data.protocolConfigurationOptions);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: protocolConfigurationOptions\n");
+          return false;
+        }
+    }
+
+    if (data.extendedProtocolConfigurationOptionsIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = EpcoIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        EpcoIe epco=
+        dynamic_cast<
+        EpcoIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcoIeType));
+        rc = epco.encodeEpcoIe(buffer, data.extendedProtocolConfigurationOptions);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: extendedProtocolConfigurationOptions\n");
+          return false;
+        }
+    }
+
+    if (data.maximumPacketLossRateIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = MaximumPacketLossRateIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        MaximumPacketLossRateIe maximumPacketLossRate=
+        dynamic_cast<
+        MaximumPacketLossRateIe&>(GtpV2IeFactory::getInstance().getIeObject(MaximumPacketLossRateIeType));
+        rc = maximumPacketLossRate.encodeMaximumPacketLossRateIe(buffer, data.maximumPacketLossRate);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: maximumPacketLossRate\n");
+          return false;
+        }
+    }
+    return rc;
+}
+
+bool BearerContextsInCreateBearerRequest::
+decodeBearerContextsInCreateBearerRequest(MsgBuffer &buffer,
+                         BearerContextsInCreateBearerRequestData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case EbiIeType:
+            {
+                EbiIe ieObject =
+                dynamic_cast<
+                EbiIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(EbiIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeEbiIe(buffer, data.epsBearerId, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: epsBearerId\n");
+                        return false;
+                    }
+                    Uint16 mandIe = EbiIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case BearerTftIeType:
+            {
+                BearerTftIe ieObject =
+                dynamic_cast<
+                BearerTftIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(BearerTftIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeBearerTftIe(buffer, data.tft, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: tft\n");
+                        return false;
+                    }
+                    Uint16 mandIe = BearerTftIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case FTeidIeType:
+            {
+                FTeidIe ieObject =
+                dynamic_cast<
+                FTeidIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(FTeidIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeFTeidIe(buffer, data.s1USgwFTeid, ieHeader.length);
+
+                    data.s1USgwFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: s1USgwFTeid\n");
+                        return false;
+                    }
+                }
+
+                else if(ieHeader.instance == 1)
+                {
+
+                					rc = ieObject.decodeFTeidIe(buffer, data.s58UPgwFTeid, ieHeader.length);
+
+                    data.s58UPgwFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: s58UPgwFTeid\n");
+                        return false;
+                    }
+                }
+
+                else if(ieHeader.instance == 2)
+                {
+
+                					rc = ieObject.decodeFTeidIe(buffer, data.s12SgwFTeid, ieHeader.length);
+
+                    data.s12SgwFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: s12SgwFTeid\n");
+                        return false;
+                    }
+                }
+
+                else if(ieHeader.instance == 3)
+                {
+
+                					rc = ieObject.decodeFTeidIe(buffer, data.s4USgwFTeid, ieHeader.length);
+
+                    data.s4USgwFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: s4USgwFTeid\n");
+                        return false;
+                    }
+                }
+
+                else if(ieHeader.instance == 4)
+                {
+
+                					rc = ieObject.decodeFTeidIe(buffer, data.s2bUPgwFTeid, ieHeader.length);
+
+                    data.s2bUPgwFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: s2bUPgwFTeid\n");
+                        return false;
+                    }
+                }
+
+                else if(ieHeader.instance == 5)
+                {
+
+                					rc = ieObject.decodeFTeidIe(buffer, data.s2aUPgwFTeid, ieHeader.length);
+
+                    data.s2aUPgwFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: s2aUPgwFTeid\n");
+                        return false;
+                    }
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case BearerQosIeType:
+            {
+                BearerQosIe ieObject =
+                dynamic_cast<
+                BearerQosIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(BearerQosIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeBearerQosIe(buffer, data.bearerLevelQos, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: bearerLevelQos\n");
+                        return false;
+                    }
+                    Uint16 mandIe = BearerQosIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case ChargingIdIeType:
+            {
+                ChargingIdIe ieObject =
+                dynamic_cast<
+                ChargingIdIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(ChargingIdIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeChargingIdIe(buffer, data.chargingId, ieHeader.length);
+
+                    data.chargingIdIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: chargingId\n");
+                        return false;
+                    }
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case BearerFlagsIeType:
+            {
+                BearerFlagsIe ieObject =
+                dynamic_cast<
+                BearerFlagsIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(BearerFlagsIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeBearerFlagsIe(buffer, data.bearerFlags, ieHeader.length);
+
+                    data.bearerFlagsIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: bearerFlags\n");
+                        return false;
+                    }
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case PcoIeType:
+            {
+                PcoIe ieObject =
+                dynamic_cast<
+                PcoIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(PcoIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodePcoIe(buffer, data.protocolConfigurationOptions, ieHeader.length);
+
+                    data.protocolConfigurationOptionsIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: protocolConfigurationOptions\n");
+                        return false;
+                    }
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case EpcoIeType:
+            {
+                EpcoIe ieObject =
+                dynamic_cast<
+                EpcoIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(EpcoIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeEpcoIe(buffer, data.extendedProtocolConfigurationOptions, ieHeader.length);
+
+                    data.extendedProtocolConfigurationOptionsIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: extendedProtocolConfigurationOptions\n");
+                        return false;
+                    }
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MaximumPacketLossRateIeType:
+            {
+                MaximumPacketLossRateIe ieObject =
+                dynamic_cast<
+                MaximumPacketLossRateIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MaximumPacketLossRateIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMaximumPacketLossRateIe(buffer, data.maximumPacketLossRate, ieHeader.length);
+
+                    data.maximumPacketLossRateIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: maximumPacketLossRate\n");
+                        return false;
+                    }
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void BearerContextsInCreateBearerRequest::
+displayBearerContextsInCreateBearerRequestData_v
+(BearerContextsInCreateBearerRequestData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"BearerContextsInCreateBearerRequest:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+    if (data.s1USgwFTeidIePresent)
+    {
+
+        stream.add((char *)"s1USgwFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.s1USgwFTeid, stream);
+
+    }
+
+    if (data.s58UPgwFTeidIePresent)
+    {
+
+        stream.add((char *)"s58UPgwFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.s58UPgwFTeid, stream);
+
+    }
+
+    if (data.s12SgwFTeidIePresent)
+    {
+
+        stream.add((char *)"s12SgwFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.s12SgwFTeid, stream);
+
+    }
+
+    if (data.s4USgwFTeidIePresent)
+    {
+
+        stream.add((char *)"s4USgwFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.s4USgwFTeid, stream);
+
+    }
+
+    if (data.s2bUPgwFTeidIePresent)
+    {
+
+        stream.add((char *)"s2bUPgwFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.s2bUPgwFTeid, stream);
+
+    }
+
+    if (data.s2aUPgwFTeidIePresent)
+    {
+
+        stream.add((char *)"s2aUPgwFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.s2aUPgwFTeid, stream);
+
+    }
+
+
+    if (data.chargingIdIePresent)
+    {
+
+        stream.add((char *)"chargingId:");
+        stream.endOfLine();
+        ChargingIdIe chargingId=
+        dynamic_cast<
+        ChargingIdIe&>(GtpV2IeFactory::getInstance().getIeObject(ChargingIdIeType));
+        chargingId.displayChargingIdIe_v(data.chargingId, stream);
+
+    }
+
+    if (data.bearerFlagsIePresent)
+    {
+
+        stream.add((char *)"bearerFlags:");
+        stream.endOfLine();
+        BearerFlagsIe bearerFlags=
+        dynamic_cast<
+        BearerFlagsIe&>(GtpV2IeFactory::getInstance().getIeObject(BearerFlagsIeType));
+        bearerFlags.displayBearerFlagsIe_v(data.bearerFlags, stream);
+
+    }
+
+    if (data.protocolConfigurationOptionsIePresent)
+    {
+
+        stream.add((char *)"protocolConfigurationOptions:");
+        stream.endOfLine();
+        PcoIe pco=
+        dynamic_cast<
+        PcoIe&>(GtpV2IeFactory::getInstance().getIeObject(PcoIeType));
+        pco.displayPcoIe_v(data.protocolConfigurationOptions, stream);
+
+    }
+
+    if (data.extendedProtocolConfigurationOptionsIePresent)
+    {
+
+        stream.add((char *)"extendedProtocolConfigurationOptions:");
+        stream.endOfLine();
+        EpcoIe epco=
+        dynamic_cast<
+        EpcoIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcoIeType));
+        epco.displayEpcoIe_v(data.extendedProtocolConfigurationOptions, stream);
+
+    }
+
+    if (data.maximumPacketLossRateIePresent)
+    {
+
+        stream.add((char *)"maximumPacketLossRate:");
+        stream.endOfLine();
+        MaximumPacketLossRateIe maximumPacketLossRate=
+        dynamic_cast<
+        MaximumPacketLossRateIe&>(GtpV2IeFactory::getInstance().getIeObject(MaximumPacketLossRateIeType));
+        maximumPacketLossRate.displayMaximumPacketLossRateIe_v(data.maximumPacketLossRate, stream);
+
+    }
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/bearerContextsInCreateBearerRequest.h b/src/gtpV2Codec/ieClasses/bearerContextsInCreateBearerRequest.h
new file mode 100644
index 0000000..c38ef45
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/bearerContextsInCreateBearerRequest.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef BEARERCONTEXTSINCREATEBEARERREQUEST_H_
+#define BEARERCONTEXTSINCREATEBEARERREQUEST_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class BearerContextsInCreateBearerRequest:public GtpV2GroupedIe
+{
+public:
+    BearerContextsInCreateBearerRequest();
+    virtual ~BearerContextsInCreateBearerRequest();
+    bool encodeBearerContextsInCreateBearerRequest(MsgBuffer &buffer,
+                             BearerContextsInCreateBearerRequestData
+                              const &data);
+
+    bool decodeBearerContextsInCreateBearerRequest (MsgBuffer &buffer,
+                             BearerContextsInCreateBearerRequestData 
+                             & data, Uint16 length);
+
+    void displayBearerContextsInCreateBearerRequestData_v
+    (BearerContextsInCreateBearerRequestData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/bearerContextsInCreateBearerResponse.cpp b/src/gtpV2Codec/ieClasses/bearerContextsInCreateBearerResponse.cpp
new file mode 100644
index 0000000..0c897e9
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/bearerContextsInCreateBearerResponse.cpp
@@ -0,0 +1,1122 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "bearerContextsInCreateBearerResponse.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "ebiIe.h"
+#include "causeIe.h"
+#include "fTeidIe.h"
+#include "fTeidIe.h"
+#include "fTeidIe.h"
+#include "fTeidIe.h"
+#include "fTeidIe.h"
+#include "fTeidIe.h"
+#include "fTeidIe.h"
+#include "fTeidIe.h"
+#include "fTeidIe.h"
+#include "fTeidIe.h"
+#include "fTeidIe.h"
+#include "fTeidIe.h"
+#include "pcoIe.h"
+#include "ranNasCauseIe.h"
+#include "epcoIe.h"
+
+BearerContextsInCreateBearerResponse::
+BearerContextsInCreateBearerResponse()
+{
+    Uint16 mandIe;
+    mandIe = EbiIeType;
+    mandIe = (mandIe << 8) | 0; // epsBearerId
+    mandatoryIeSet.insert(mandIe);
+    mandIe = CauseIeType;
+    mandIe = (mandIe << 8) | 0; // cause
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+BearerContextsInCreateBearerResponse::
+~BearerContextsInCreateBearerResponse()
+{
+
+}
+bool BearerContextsInCreateBearerResponse::
+encodeBearerContextsInCreateBearerResponse(MsgBuffer &buffer,
+                         BearerContextsInCreateBearerResponseData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = EbiIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    EbiIe ebi=
+    dynamic_cast<
+    EbiIe&>(GtpV2IeFactory::getInstance().getIeObject(EbiIeType));
+    rc = ebi.encodeEbiIe(buffer, data.epsBearerId);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: epsBearerId\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = CauseIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    CauseIe cause=
+    dynamic_cast<
+    CauseIe&>(GtpV2IeFactory::getInstance().getIeObject(CauseIeType));
+    rc = cause.encodeCauseIe(buffer, data.cause);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: cause\n");
+        return false;
+    }
+
+    if (data.s1UEnodebFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.s1UEnodebFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: s1UEnodebFTeid\n");
+          return false;
+        }
+    }
+
+    if (data.s1USgwFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.s1USgwFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: s1USgwFTeid\n");
+          return false;
+        }
+    }
+
+    if (data.s58USgwFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 2;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.s58USgwFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: s58USgwFTeid\n");
+          return false;
+        }
+    }
+
+    if (data.s58UPgwFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 3;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.s58UPgwFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: s58UPgwFTeid\n");
+          return false;
+        }
+    }
+
+    if (data.s12RncFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 4;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.s12RncFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: s12RncFTeid\n");
+          return false;
+        }
+    }
+
+    if (data.s12SgwFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 5;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.s12SgwFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: s12SgwFTeid\n");
+          return false;
+        }
+    }
+
+    if (data.s4USgsnFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 6;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.s4USgsnFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: s4USgsnFTeid\n");
+          return false;
+        }
+    }
+
+    if (data.s4USgwFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 7;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.s4USgwFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: s4USgwFTeid\n");
+          return false;
+        }
+    }
+
+    if (data.s2bUEpdgFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 8;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.s2bUEpdgFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: s2bUEpdgFTeid\n");
+          return false;
+        }
+    }
+
+    if (data.s2bUPgwFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 9;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.s2bUPgwFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: s2bUPgwFTeid\n");
+          return false;
+        }
+    }
+
+    if (data.s2aUTwanFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 10;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.s2aUTwanFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: s2aUTwanFTeid\n");
+          return false;
+        }
+    }
+
+    if (data.s2aUPgwFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 11;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.s2aUPgwFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: s2aUPgwFTeid\n");
+          return false;
+        }
+    }
+
+    if (data.protocolConfigurationOptionsIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = PcoIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        PcoIe pco=
+        dynamic_cast<
+        PcoIe&>(GtpV2IeFactory::getInstance().getIeObject(PcoIeType));
+        rc = pco.encodePcoIe(buffer, data.protocolConfigurationOptions);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: protocolConfigurationOptions\n");
+          return false;
+        }
+    }
+
+    if (data.ranNasCauseIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = RanNasCauseIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        RanNasCauseIe ranNasCause=
+        dynamic_cast<
+        RanNasCauseIe&>(GtpV2IeFactory::getInstance().getIeObject(RanNasCauseIeType));
+        rc = ranNasCause.encodeRanNasCauseIe(buffer, data.ranNasCause);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: ranNasCause\n");
+          return false;
+        }
+    }
+
+    if (data.extendedProtocolConfigurationOptionsIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = EpcoIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        EpcoIe epco=
+        dynamic_cast<
+        EpcoIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcoIeType));
+        rc = epco.encodeEpcoIe(buffer, data.extendedProtocolConfigurationOptions);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: extendedProtocolConfigurationOptions\n");
+          return false;
+        }
+    }
+    return rc;
+}
+
+bool BearerContextsInCreateBearerResponse::
+decodeBearerContextsInCreateBearerResponse(MsgBuffer &buffer,
+                         BearerContextsInCreateBearerResponseData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case EbiIeType:
+            {
+                EbiIe ieObject =
+                dynamic_cast<
+                EbiIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(EbiIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeEbiIe(buffer, data.epsBearerId, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: epsBearerId\n");
+                        return false;
+                    }
+                    Uint16 mandIe = EbiIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case CauseIeType:
+            {
+                CauseIe ieObject =
+                dynamic_cast<
+                CauseIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(CauseIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeCauseIe(buffer, data.cause, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: cause\n");
+                        return false;
+                    }
+                    Uint16 mandIe = CauseIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case FTeidIeType:
+            {
+                FTeidIe ieObject =
+                dynamic_cast<
+                FTeidIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(FTeidIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeFTeidIe(buffer, data.s1UEnodebFTeid, ieHeader.length);
+
+                    data.s1UEnodebFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: s1UEnodebFTeid\n");
+                        return false;
+                    }
+                }
+
+                else if(ieHeader.instance == 1)
+                {
+
+                					rc = ieObject.decodeFTeidIe(buffer, data.s1USgwFTeid, ieHeader.length);
+
+                    data.s1USgwFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: s1USgwFTeid\n");
+                        return false;
+                    }
+                }
+
+                else if(ieHeader.instance == 2)
+                {
+
+                					rc = ieObject.decodeFTeidIe(buffer, data.s58USgwFTeid, ieHeader.length);
+
+                    data.s58USgwFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: s58USgwFTeid\n");
+                        return false;
+                    }
+                }
+
+                else if(ieHeader.instance == 3)
+                {
+
+                					rc = ieObject.decodeFTeidIe(buffer, data.s58UPgwFTeid, ieHeader.length);
+
+                    data.s58UPgwFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: s58UPgwFTeid\n");
+                        return false;
+                    }
+                }
+
+                else if(ieHeader.instance == 4)
+                {
+
+                					rc = ieObject.decodeFTeidIe(buffer, data.s12RncFTeid, ieHeader.length);
+
+                    data.s12RncFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: s12RncFTeid\n");
+                        return false;
+                    }
+                }
+
+                else if(ieHeader.instance == 5)
+                {
+
+                					rc = ieObject.decodeFTeidIe(buffer, data.s12SgwFTeid, ieHeader.length);
+
+                    data.s12SgwFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: s12SgwFTeid\n");
+                        return false;
+                    }
+                }
+
+                else if(ieHeader.instance == 6)
+                {
+
+                					rc = ieObject.decodeFTeidIe(buffer, data.s4USgsnFTeid, ieHeader.length);
+
+                    data.s4USgsnFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: s4USgsnFTeid\n");
+                        return false;
+                    }
+                }
+
+                else if(ieHeader.instance == 7)
+                {
+
+                					rc = ieObject.decodeFTeidIe(buffer, data.s4USgwFTeid, ieHeader.length);
+
+                    data.s4USgwFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: s4USgwFTeid\n");
+                        return false;
+                    }
+                }
+
+                else if(ieHeader.instance == 8)
+                {
+
+                					rc = ieObject.decodeFTeidIe(buffer, data.s2bUEpdgFTeid, ieHeader.length);
+
+                    data.s2bUEpdgFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: s2bUEpdgFTeid\n");
+                        return false;
+                    }
+                }
+
+                else if(ieHeader.instance == 9)
+                {
+
+                					rc = ieObject.decodeFTeidIe(buffer, data.s2bUPgwFTeid, ieHeader.length);
+
+                    data.s2bUPgwFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: s2bUPgwFTeid\n");
+                        return false;
+                    }
+                }
+
+                else if(ieHeader.instance == 10)
+                {
+
+                					rc = ieObject.decodeFTeidIe(buffer, data.s2aUTwanFTeid, ieHeader.length);
+
+                    data.s2aUTwanFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: s2aUTwanFTeid\n");
+                        return false;
+                    }
+                }
+
+                else if(ieHeader.instance == 11)
+                {
+
+                					rc = ieObject.decodeFTeidIe(buffer, data.s2aUPgwFTeid, ieHeader.length);
+
+                    data.s2aUPgwFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: s2aUPgwFTeid\n");
+                        return false;
+                    }
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case PcoIeType:
+            {
+                PcoIe ieObject =
+                dynamic_cast<
+                PcoIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(PcoIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodePcoIe(buffer, data.protocolConfigurationOptions, ieHeader.length);
+
+                    data.protocolConfigurationOptionsIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: protocolConfigurationOptions\n");
+                        return false;
+                    }
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case RanNasCauseIeType:
+            {
+                RanNasCauseIe ieObject =
+                dynamic_cast<
+                RanNasCauseIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(RanNasCauseIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeRanNasCauseIe(buffer, data.ranNasCause, ieHeader.length);
+
+                    data.ranNasCauseIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: ranNasCause\n");
+                        return false;
+                    }
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case EpcoIeType:
+            {
+                EpcoIe ieObject =
+                dynamic_cast<
+                EpcoIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(EpcoIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeEpcoIe(buffer, data.extendedProtocolConfigurationOptions, ieHeader.length);
+
+                    data.extendedProtocolConfigurationOptionsIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: extendedProtocolConfigurationOptions\n");
+                        return false;
+                    }
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void BearerContextsInCreateBearerResponse::
+displayBearerContextsInCreateBearerResponseData_v
+(BearerContextsInCreateBearerResponseData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"BearerContextsInCreateBearerResponse:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+    if (data.s1UEnodebFTeidIePresent)
+    {
+
+        stream.add((char *)"s1UEnodebFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.s1UEnodebFTeid, stream);
+
+    }
+
+    if (data.s1USgwFTeidIePresent)
+    {
+
+        stream.add((char *)"s1USgwFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.s1USgwFTeid, stream);
+
+    }
+
+    if (data.s58USgwFTeidIePresent)
+    {
+
+        stream.add((char *)"s58USgwFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.s58USgwFTeid, stream);
+
+    }
+
+    if (data.s58UPgwFTeidIePresent)
+    {
+
+        stream.add((char *)"s58UPgwFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.s58UPgwFTeid, stream);
+
+    }
+
+    if (data.s12RncFTeidIePresent)
+    {
+
+        stream.add((char *)"s12RncFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.s12RncFTeid, stream);
+
+    }
+
+    if (data.s12SgwFTeidIePresent)
+    {
+
+        stream.add((char *)"s12SgwFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.s12SgwFTeid, stream);
+
+    }
+
+    if (data.s4USgsnFTeidIePresent)
+    {
+
+        stream.add((char *)"s4USgsnFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.s4USgsnFTeid, stream);
+
+    }
+
+    if (data.s4USgwFTeidIePresent)
+    {
+
+        stream.add((char *)"s4USgwFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.s4USgwFTeid, stream);
+
+    }
+
+    if (data.s2bUEpdgFTeidIePresent)
+    {
+
+        stream.add((char *)"s2bUEpdgFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.s2bUEpdgFTeid, stream);
+
+    }
+
+    if (data.s2bUPgwFTeidIePresent)
+    {
+
+        stream.add((char *)"s2bUPgwFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.s2bUPgwFTeid, stream);
+
+    }
+
+    if (data.s2aUTwanFTeidIePresent)
+    {
+
+        stream.add((char *)"s2aUTwanFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.s2aUTwanFTeid, stream);
+
+    }
+
+    if (data.s2aUPgwFTeidIePresent)
+    {
+
+        stream.add((char *)"s2aUPgwFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.s2aUPgwFTeid, stream);
+
+    }
+
+    if (data.protocolConfigurationOptionsIePresent)
+    {
+
+        stream.add((char *)"protocolConfigurationOptions:");
+        stream.endOfLine();
+        PcoIe pco=
+        dynamic_cast<
+        PcoIe&>(GtpV2IeFactory::getInstance().getIeObject(PcoIeType));
+        pco.displayPcoIe_v(data.protocolConfigurationOptions, stream);
+
+    }
+
+    if (data.ranNasCauseIePresent)
+    {
+
+        stream.add((char *)"ranNasCause:");
+        stream.endOfLine();
+        RanNasCauseIe ranNasCause=
+        dynamic_cast<
+        RanNasCauseIe&>(GtpV2IeFactory::getInstance().getIeObject(RanNasCauseIeType));
+        ranNasCause.displayRanNasCauseIe_v(data.ranNasCause, stream);
+
+    }
+
+    if (data.extendedProtocolConfigurationOptionsIePresent)
+    {
+
+        stream.add((char *)"extendedProtocolConfigurationOptions:");
+        stream.endOfLine();
+        EpcoIe epco=
+        dynamic_cast<
+        EpcoIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcoIeType));
+        epco.displayEpcoIe_v(data.extendedProtocolConfigurationOptions, stream);
+
+    }
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/bearerContextsInCreateBearerResponse.h b/src/gtpV2Codec/ieClasses/bearerContextsInCreateBearerResponse.h
new file mode 100644
index 0000000..4bf8ec4
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/bearerContextsInCreateBearerResponse.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef BEARERCONTEXTSINCREATEBEARERRESPONSE_H_
+#define BEARERCONTEXTSINCREATEBEARERRESPONSE_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class BearerContextsInCreateBearerResponse:public GtpV2GroupedIe
+{
+public:
+    BearerContextsInCreateBearerResponse();
+    virtual ~BearerContextsInCreateBearerResponse();
+    bool encodeBearerContextsInCreateBearerResponse(MsgBuffer &buffer,
+                             BearerContextsInCreateBearerResponseData
+                              const &data);
+
+    bool decodeBearerContextsInCreateBearerResponse (MsgBuffer &buffer,
+                             BearerContextsInCreateBearerResponseData 
+                             & data, Uint16 length);
+
+    void displayBearerContextsInCreateBearerResponseData_v
+    (BearerContextsInCreateBearerResponseData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/bearerContextsInDeleteBearerResponse.cpp b/src/gtpV2Codec/ieClasses/bearerContextsInDeleteBearerResponse.cpp
new file mode 100644
index 0000000..87d3028
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/bearerContextsInDeleteBearerResponse.cpp
@@ -0,0 +1,457 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "bearerContextsInDeleteBearerResponse.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "ebiIe.h"
+#include "causeIe.h"
+#include "pcoIe.h"
+#include "ranNasCauseIe.h"
+#include "epcoIe.h"
+
+BearerContextsInDeleteBearerResponse::
+BearerContextsInDeleteBearerResponse()
+{
+    Uint16 mandIe;
+    mandIe = EbiIeType;
+    mandIe = (mandIe << 8) | 0; // epsBearerId
+    mandatoryIeSet.insert(mandIe);
+    mandIe = CauseIeType;
+    mandIe = (mandIe << 8) | 0; // cause
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+BearerContextsInDeleteBearerResponse::
+~BearerContextsInDeleteBearerResponse()
+{
+
+}
+bool BearerContextsInDeleteBearerResponse::
+encodeBearerContextsInDeleteBearerResponse(MsgBuffer &buffer,
+                         BearerContextsInDeleteBearerResponseData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = EbiIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    EbiIe ebi=
+    dynamic_cast<
+    EbiIe&>(GtpV2IeFactory::getInstance().getIeObject(EbiIeType));
+    rc = ebi.encodeEbiIe(buffer, data.epsBearerId);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: epsBearerId\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = CauseIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    CauseIe cause=
+    dynamic_cast<
+    CauseIe&>(GtpV2IeFactory::getInstance().getIeObject(CauseIeType));
+    rc = cause.encodeCauseIe(buffer, data.cause);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: cause\n");
+        return false;
+    }
+
+    if (data.protocolConfigurationOptionsIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = PcoIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        PcoIe pco=
+        dynamic_cast<
+        PcoIe&>(GtpV2IeFactory::getInstance().getIeObject(PcoIeType));
+        rc = pco.encodePcoIe(buffer, data.protocolConfigurationOptions);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: protocolConfigurationOptions\n");
+          return false;
+        }
+    }
+
+    if (data.ranNasCauseIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = RanNasCauseIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        RanNasCauseIe ranNasCause=
+        dynamic_cast<
+        RanNasCauseIe&>(GtpV2IeFactory::getInstance().getIeObject(RanNasCauseIeType));
+        rc = ranNasCause.encodeRanNasCauseIe(buffer, data.ranNasCause);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: ranNasCause\n");
+          return false;
+        }
+    }
+
+    if (data.extendedProtocolConfigurationOptionsIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = EpcoIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        EpcoIe epco=
+        dynamic_cast<
+        EpcoIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcoIeType));
+        rc = epco.encodeEpcoIe(buffer, data.extendedProtocolConfigurationOptions);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: extendedProtocolConfigurationOptions\n");
+          return false;
+        }
+    }
+    return rc;
+}
+
+bool BearerContextsInDeleteBearerResponse::
+decodeBearerContextsInDeleteBearerResponse(MsgBuffer &buffer,
+                         BearerContextsInDeleteBearerResponseData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case EbiIeType:
+            {
+                EbiIe ieObject =
+                dynamic_cast<
+                EbiIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(EbiIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeEbiIe(buffer, data.epsBearerId, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: epsBearerId\n");
+                        return false;
+                    }
+                    Uint16 mandIe = EbiIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case CauseIeType:
+            {
+                CauseIe ieObject =
+                dynamic_cast<
+                CauseIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(CauseIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeCauseIe(buffer, data.cause, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: cause\n");
+                        return false;
+                    }
+                    Uint16 mandIe = CauseIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case PcoIeType:
+            {
+                PcoIe ieObject =
+                dynamic_cast<
+                PcoIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(PcoIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodePcoIe(buffer, data.protocolConfigurationOptions, ieHeader.length);
+
+                    data.protocolConfigurationOptionsIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: protocolConfigurationOptions\n");
+                        return false;
+                    }
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case RanNasCauseIeType:
+            {
+                RanNasCauseIe ieObject =
+                dynamic_cast<
+                RanNasCauseIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(RanNasCauseIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeRanNasCauseIe(buffer, data.ranNasCause, ieHeader.length);
+
+                    data.ranNasCauseIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: ranNasCause\n");
+                        return false;
+                    }
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case EpcoIeType:
+            {
+                EpcoIe ieObject =
+                dynamic_cast<
+                EpcoIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(EpcoIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeEpcoIe(buffer, data.extendedProtocolConfigurationOptions, ieHeader.length);
+
+                    data.extendedProtocolConfigurationOptionsIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: extendedProtocolConfigurationOptions\n");
+                        return false;
+                    }
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void BearerContextsInDeleteBearerResponse::
+displayBearerContextsInDeleteBearerResponseData_v
+(BearerContextsInDeleteBearerResponseData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"BearerContextsInDeleteBearerResponse:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+    if (data.protocolConfigurationOptionsIePresent)
+    {
+
+        stream.add((char *)"protocolConfigurationOptions:");
+        stream.endOfLine();
+        PcoIe pco=
+        dynamic_cast<
+        PcoIe&>(GtpV2IeFactory::getInstance().getIeObject(PcoIeType));
+        pco.displayPcoIe_v(data.protocolConfigurationOptions, stream);
+
+    }
+
+    if (data.ranNasCauseIePresent)
+    {
+
+        stream.add((char *)"ranNasCause:");
+        stream.endOfLine();
+        RanNasCauseIe ranNasCause=
+        dynamic_cast<
+        RanNasCauseIe&>(GtpV2IeFactory::getInstance().getIeObject(RanNasCauseIeType));
+        ranNasCause.displayRanNasCauseIe_v(data.ranNasCause, stream);
+
+    }
+
+    if (data.extendedProtocolConfigurationOptionsIePresent)
+    {
+
+        stream.add((char *)"extendedProtocolConfigurationOptions:");
+        stream.endOfLine();
+        EpcoIe epco=
+        dynamic_cast<
+        EpcoIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcoIeType));
+        epco.displayEpcoIe_v(data.extendedProtocolConfigurationOptions, stream);
+
+    }
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/bearerContextsInDeleteBearerResponse.h b/src/gtpV2Codec/ieClasses/bearerContextsInDeleteBearerResponse.h
new file mode 100644
index 0000000..fde62ee
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/bearerContextsInDeleteBearerResponse.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef BEARERCONTEXTSINDELETEBEARERRESPONSE_H_
+#define BEARERCONTEXTSINDELETEBEARERRESPONSE_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class BearerContextsInDeleteBearerResponse:public GtpV2GroupedIe
+{
+public:
+    BearerContextsInDeleteBearerResponse();
+    virtual ~BearerContextsInDeleteBearerResponse();
+    bool encodeBearerContextsInDeleteBearerResponse(MsgBuffer &buffer,
+                             BearerContextsInDeleteBearerResponseData
+                              const &data);
+
+    bool decodeBearerContextsInDeleteBearerResponse (MsgBuffer &buffer,
+                             BearerContextsInDeleteBearerResponseData 
+                             & data, Uint16 length);
+
+    void displayBearerContextsInDeleteBearerResponseData_v
+    (BearerContextsInDeleteBearerResponseData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/bearerContextsMarkedForRemovalInCreateSessionResponse.cpp b/src/gtpV2Codec/ieClasses/bearerContextsMarkedForRemovalInCreateSessionResponse.cpp
new file mode 100644
index 0000000..532b064
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/bearerContextsMarkedForRemovalInCreateSessionResponse.cpp
@@ -0,0 +1,244 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "bearerContextsMarkedForRemovalInCreateSessionResponse.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "ebiIe.h"
+#include "causeIe.h"
+
+BearerContextsMarkedForRemovalInCreateSessionResponse::
+BearerContextsMarkedForRemovalInCreateSessionResponse()
+{
+    Uint16 mandIe;
+    mandIe = EbiIeType;
+    mandIe = (mandIe << 8) | 0; // epsBearerId
+    mandatoryIeSet.insert(mandIe);
+    mandIe = CauseIeType;
+    mandIe = (mandIe << 8) | 0; // cause
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+BearerContextsMarkedForRemovalInCreateSessionResponse::
+~BearerContextsMarkedForRemovalInCreateSessionResponse()
+{
+
+}
+bool BearerContextsMarkedForRemovalInCreateSessionResponse::
+encodeBearerContextsMarkedForRemovalInCreateSessionResponse(MsgBuffer &buffer,
+                         BearerContextsMarkedForRemovalInCreateSessionResponseData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = EbiIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    EbiIe ebi=
+    dynamic_cast<
+    EbiIe&>(GtpV2IeFactory::getInstance().getIeObject(EbiIeType));
+    rc = ebi.encodeEbiIe(buffer, data.epsBearerId);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: epsBearerId\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = CauseIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    CauseIe cause=
+    dynamic_cast<
+    CauseIe&>(GtpV2IeFactory::getInstance().getIeObject(CauseIeType));
+    rc = cause.encodeCauseIe(buffer, data.cause);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: cause\n");
+        return false;
+    }
+    return rc;
+}
+
+bool BearerContextsMarkedForRemovalInCreateSessionResponse::
+decodeBearerContextsMarkedForRemovalInCreateSessionResponse(MsgBuffer &buffer,
+                         BearerContextsMarkedForRemovalInCreateSessionResponseData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case EbiIeType:
+            {
+                EbiIe ieObject =
+                dynamic_cast<
+                EbiIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(EbiIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeEbiIe(buffer, data.epsBearerId, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: epsBearerId\n");
+                        return false;
+                    }
+                    Uint16 mandIe = EbiIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case CauseIeType:
+            {
+                CauseIe ieObject =
+                dynamic_cast<
+                CauseIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(CauseIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeCauseIe(buffer, data.cause, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: cause\n");
+                        return false;
+                    }
+                    Uint16 mandIe = CauseIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void BearerContextsMarkedForRemovalInCreateSessionResponse::
+displayBearerContextsMarkedForRemovalInCreateSessionResponseData_v
+(BearerContextsMarkedForRemovalInCreateSessionResponseData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"BearerContextsMarkedForRemovalInCreateSessionResponse:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/bearerContextsMarkedForRemovalInCreateSessionResponse.h b/src/gtpV2Codec/ieClasses/bearerContextsMarkedForRemovalInCreateSessionResponse.h
new file mode 100644
index 0000000..a528d97
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/bearerContextsMarkedForRemovalInCreateSessionResponse.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef BEARERCONTEXTSMARKEDFORREMOVALINCREATESESSIONRESPONSE_H_
+#define BEARERCONTEXTSMARKEDFORREMOVALINCREATESESSIONRESPONSE_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class BearerContextsMarkedForRemovalInCreateSessionResponse:public GtpV2GroupedIe
+{
+public:
+    BearerContextsMarkedForRemovalInCreateSessionResponse();
+    virtual ~BearerContextsMarkedForRemovalInCreateSessionResponse();
+    bool encodeBearerContextsMarkedForRemovalInCreateSessionResponse(MsgBuffer &buffer,
+                             BearerContextsMarkedForRemovalInCreateSessionResponseData
+                              const &data);
+
+    bool decodeBearerContextsMarkedForRemovalInCreateSessionResponse (MsgBuffer &buffer,
+                             BearerContextsMarkedForRemovalInCreateSessionResponseData 
+                             & data, Uint16 length);
+
+    void displayBearerContextsMarkedForRemovalInCreateSessionResponseData_v
+    (BearerContextsMarkedForRemovalInCreateSessionResponseData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/bearerContextsMarkedForRemovalInModifyBearerResponse.cpp b/src/gtpV2Codec/ieClasses/bearerContextsMarkedForRemovalInModifyBearerResponse.cpp
new file mode 100644
index 0000000..19dcda3
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/bearerContextsMarkedForRemovalInModifyBearerResponse.cpp
@@ -0,0 +1,244 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "bearerContextsMarkedForRemovalInModifyBearerResponse.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "ebiIe.h"
+#include "causeIe.h"
+
+BearerContextsMarkedForRemovalInModifyBearerResponse::
+BearerContextsMarkedForRemovalInModifyBearerResponse()
+{
+    Uint16 mandIe;
+    mandIe = EbiIeType;
+    mandIe = (mandIe << 8) | 0; // epsBearerId
+    mandatoryIeSet.insert(mandIe);
+    mandIe = CauseIeType;
+    mandIe = (mandIe << 8) | 0; // cause
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+BearerContextsMarkedForRemovalInModifyBearerResponse::
+~BearerContextsMarkedForRemovalInModifyBearerResponse()
+{
+
+}
+bool BearerContextsMarkedForRemovalInModifyBearerResponse::
+encodeBearerContextsMarkedForRemovalInModifyBearerResponse(MsgBuffer &buffer,
+                         BearerContextsMarkedForRemovalInModifyBearerResponseData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = EbiIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    EbiIe ebi=
+    dynamic_cast<
+    EbiIe&>(GtpV2IeFactory::getInstance().getIeObject(EbiIeType));
+    rc = ebi.encodeEbiIe(buffer, data.epsBearerId);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: epsBearerId\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = CauseIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    CauseIe cause=
+    dynamic_cast<
+    CauseIe&>(GtpV2IeFactory::getInstance().getIeObject(CauseIeType));
+    rc = cause.encodeCauseIe(buffer, data.cause);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: cause\n");
+        return false;
+    }
+    return rc;
+}
+
+bool BearerContextsMarkedForRemovalInModifyBearerResponse::
+decodeBearerContextsMarkedForRemovalInModifyBearerResponse(MsgBuffer &buffer,
+                         BearerContextsMarkedForRemovalInModifyBearerResponseData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case EbiIeType:
+            {
+                EbiIe ieObject =
+                dynamic_cast<
+                EbiIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(EbiIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeEbiIe(buffer, data.epsBearerId, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: epsBearerId\n");
+                        return false;
+                    }
+                    Uint16 mandIe = EbiIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case CauseIeType:
+            {
+                CauseIe ieObject =
+                dynamic_cast<
+                CauseIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(CauseIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeCauseIe(buffer, data.cause, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: cause\n");
+                        return false;
+                    }
+                    Uint16 mandIe = CauseIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void BearerContextsMarkedForRemovalInModifyBearerResponse::
+displayBearerContextsMarkedForRemovalInModifyBearerResponseData_v
+(BearerContextsMarkedForRemovalInModifyBearerResponseData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"BearerContextsMarkedForRemovalInModifyBearerResponse:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/bearerContextsMarkedForRemovalInModifyBearerResponse.h b/src/gtpV2Codec/ieClasses/bearerContextsMarkedForRemovalInModifyBearerResponse.h
new file mode 100644
index 0000000..e94afcb
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/bearerContextsMarkedForRemovalInModifyBearerResponse.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef BEARERCONTEXTSMARKEDFORREMOVALINMODIFYBEARERRESPONSE_H_
+#define BEARERCONTEXTSMARKEDFORREMOVALINMODIFYBEARERRESPONSE_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class BearerContextsMarkedForRemovalInModifyBearerResponse:public GtpV2GroupedIe
+{
+public:
+    BearerContextsMarkedForRemovalInModifyBearerResponse();
+    virtual ~BearerContextsMarkedForRemovalInModifyBearerResponse();
+    bool encodeBearerContextsMarkedForRemovalInModifyBearerResponse(MsgBuffer &buffer,
+                             BearerContextsMarkedForRemovalInModifyBearerResponseData
+                              const &data);
+
+    bool decodeBearerContextsMarkedForRemovalInModifyBearerResponse (MsgBuffer &buffer,
+                             BearerContextsMarkedForRemovalInModifyBearerResponseData 
+                             & data, Uint16 length);
+
+    void displayBearerContextsMarkedForRemovalInModifyBearerResponseData_v
+    (BearerContextsMarkedForRemovalInModifyBearerResponseData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/bearerContextsModifiedInModifyBearerResponse.cpp b/src/gtpV2Codec/ieClasses/bearerContextsModifiedInModifyBearerResponse.cpp
new file mode 100644
index 0000000..b3ec936
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/bearerContextsModifiedInModifyBearerResponse.cpp
@@ -0,0 +1,619 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "bearerContextsModifiedInModifyBearerResponse.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "ebiIe.h"
+#include "causeIe.h"
+#include "fTeidIe.h"
+#include "fTeidIe.h"
+#include "fTeidIe.h"
+#include "chargingIdIe.h"
+#include "bearerFlagsIe.h"
+#include "fTeidIe.h"
+
+BearerContextsModifiedInModifyBearerResponse::
+BearerContextsModifiedInModifyBearerResponse()
+{
+    Uint16 mandIe;
+    mandIe = EbiIeType;
+    mandIe = (mandIe << 8) | 0; // epsBearerId
+    mandatoryIeSet.insert(mandIe);
+    mandIe = CauseIeType;
+    mandIe = (mandIe << 8) | 0; // cause
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+BearerContextsModifiedInModifyBearerResponse::
+~BearerContextsModifiedInModifyBearerResponse()
+{
+
+}
+bool BearerContextsModifiedInModifyBearerResponse::
+encodeBearerContextsModifiedInModifyBearerResponse(MsgBuffer &buffer,
+                         BearerContextsModifiedInModifyBearerResponseData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = EbiIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    EbiIe ebi=
+    dynamic_cast<
+    EbiIe&>(GtpV2IeFactory::getInstance().getIeObject(EbiIeType));
+    rc = ebi.encodeEbiIe(buffer, data.epsBearerId);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: epsBearerId\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = CauseIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    CauseIe cause=
+    dynamic_cast<
+    CauseIe&>(GtpV2IeFactory::getInstance().getIeObject(CauseIeType));
+    rc = cause.encodeCauseIe(buffer, data.cause);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: cause\n");
+        return false;
+    }
+
+    if (data.s1USgwFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.s1USgwFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: s1USgwFTeid\n");
+          return false;
+        }
+    }
+
+    if (data.s12SgwFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.s12SgwFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: s12SgwFTeid\n");
+          return false;
+        }
+    }
+
+    if (data.s4USgwFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 2;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.s4USgwFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: s4USgwFTeid\n");
+          return false;
+        }
+    }
+
+    if (data.chargingIdIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = ChargingIdIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        ChargingIdIe chargingId=
+        dynamic_cast<
+        ChargingIdIe&>(GtpV2IeFactory::getInstance().getIeObject(ChargingIdIeType));
+        rc = chargingId.encodeChargingIdIe(buffer, data.chargingId);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: chargingId\n");
+          return false;
+        }
+    }
+
+    if (data.bearerFlagsIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = BearerFlagsIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        BearerFlagsIe bearerFlags=
+        dynamic_cast<
+        BearerFlagsIe&>(GtpV2IeFactory::getInstance().getIeObject(BearerFlagsIeType));
+        rc = bearerFlags.encodeBearerFlagsIe(buffer, data.bearerFlags);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: bearerFlags\n");
+          return false;
+        }
+    }
+
+    if (data.s11USgwFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 3;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.s11USgwFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: s11USgwFTeid\n");
+          return false;
+        }
+    }
+    return rc;
+}
+
+bool BearerContextsModifiedInModifyBearerResponse::
+decodeBearerContextsModifiedInModifyBearerResponse(MsgBuffer &buffer,
+                         BearerContextsModifiedInModifyBearerResponseData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case EbiIeType:
+            {
+                EbiIe ieObject =
+                dynamic_cast<
+                EbiIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(EbiIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeEbiIe(buffer, data.epsBearerId, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: epsBearerId\n");
+                        return false;
+                    }
+                    Uint16 mandIe = EbiIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case CauseIeType:
+            {
+                CauseIe ieObject =
+                dynamic_cast<
+                CauseIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(CauseIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeCauseIe(buffer, data.cause, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: cause\n");
+                        return false;
+                    }
+                    Uint16 mandIe = CauseIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case FTeidIeType:
+            {
+                FTeidIe ieObject =
+                dynamic_cast<
+                FTeidIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(FTeidIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeFTeidIe(buffer, data.s1USgwFTeid, ieHeader.length);
+
+                    data.s1USgwFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: s1USgwFTeid\n");
+                        return false;
+                    }
+                }
+
+                else if(ieHeader.instance == 1)
+                {
+
+                					rc = ieObject.decodeFTeidIe(buffer, data.s12SgwFTeid, ieHeader.length);
+
+                    data.s12SgwFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: s12SgwFTeid\n");
+                        return false;
+                    }
+                }
+
+                else if(ieHeader.instance == 2)
+                {
+
+                					rc = ieObject.decodeFTeidIe(buffer, data.s4USgwFTeid, ieHeader.length);
+
+                    data.s4USgwFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: s4USgwFTeid\n");
+                        return false;
+                    }
+                }
+
+                else if(ieHeader.instance == 3)
+                {
+
+                					rc = ieObject.decodeFTeidIe(buffer, data.s11USgwFTeid, ieHeader.length);
+
+                    data.s11USgwFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: s11USgwFTeid\n");
+                        return false;
+                    }
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case ChargingIdIeType:
+            {
+                ChargingIdIe ieObject =
+                dynamic_cast<
+                ChargingIdIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(ChargingIdIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeChargingIdIe(buffer, data.chargingId, ieHeader.length);
+
+                    data.chargingIdIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: chargingId\n");
+                        return false;
+                    }
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case BearerFlagsIeType:
+            {
+                BearerFlagsIe ieObject =
+                dynamic_cast<
+                BearerFlagsIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(BearerFlagsIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeBearerFlagsIe(buffer, data.bearerFlags, ieHeader.length);
+
+                    data.bearerFlagsIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: bearerFlags\n");
+                        return false;
+                    }
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void BearerContextsModifiedInModifyBearerResponse::
+displayBearerContextsModifiedInModifyBearerResponseData_v
+(BearerContextsModifiedInModifyBearerResponseData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"BearerContextsModifiedInModifyBearerResponse:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+    if (data.s1USgwFTeidIePresent)
+    {
+
+        stream.add((char *)"s1USgwFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.s1USgwFTeid, stream);
+
+    }
+
+    if (data.s12SgwFTeidIePresent)
+    {
+
+        stream.add((char *)"s12SgwFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.s12SgwFTeid, stream);
+
+    }
+
+    if (data.s4USgwFTeidIePresent)
+    {
+
+        stream.add((char *)"s4USgwFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.s4USgwFTeid, stream);
+
+    }
+
+    if (data.chargingIdIePresent)
+    {
+
+        stream.add((char *)"chargingId:");
+        stream.endOfLine();
+        ChargingIdIe chargingId=
+        dynamic_cast<
+        ChargingIdIe&>(GtpV2IeFactory::getInstance().getIeObject(ChargingIdIeType));
+        chargingId.displayChargingIdIe_v(data.chargingId, stream);
+
+    }
+
+    if (data.bearerFlagsIePresent)
+    {
+
+        stream.add((char *)"bearerFlags:");
+        stream.endOfLine();
+        BearerFlagsIe bearerFlags=
+        dynamic_cast<
+        BearerFlagsIe&>(GtpV2IeFactory::getInstance().getIeObject(BearerFlagsIeType));
+        bearerFlags.displayBearerFlagsIe_v(data.bearerFlags, stream);
+
+    }
+
+    if (data.s11USgwFTeidIePresent)
+    {
+
+        stream.add((char *)"s11USgwFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.s11USgwFTeid, stream);
+
+    }
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/bearerContextsModifiedInModifyBearerResponse.h b/src/gtpV2Codec/ieClasses/bearerContextsModifiedInModifyBearerResponse.h
new file mode 100644
index 0000000..9bb5ac9
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/bearerContextsModifiedInModifyBearerResponse.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef BEARERCONTEXTSMODIFIEDINMODIFYBEARERRESPONSE_H_
+#define BEARERCONTEXTSMODIFIEDINMODIFYBEARERRESPONSE_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class BearerContextsModifiedInModifyBearerResponse:public GtpV2GroupedIe
+{
+public:
+    BearerContextsModifiedInModifyBearerResponse();
+    virtual ~BearerContextsModifiedInModifyBearerResponse();
+    bool encodeBearerContextsModifiedInModifyBearerResponse(MsgBuffer &buffer,
+                             BearerContextsModifiedInModifyBearerResponseData
+                              const &data);
+
+    bool decodeBearerContextsModifiedInModifyBearerResponse (MsgBuffer &buffer,
+                             BearerContextsModifiedInModifyBearerResponseData 
+                             & data, Uint16 length);
+
+    void displayBearerContextsModifiedInModifyBearerResponseData_v
+    (BearerContextsModifiedInModifyBearerResponseData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/bearerContextsToBeCreatedInCreateSessionRequest.cpp b/src/gtpV2Codec/ieClasses/bearerContextsToBeCreatedInCreateSessionRequest.cpp
new file mode 100644
index 0000000..2aeac30
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/bearerContextsToBeCreatedInCreateSessionRequest.cpp
@@ -0,0 +1,764 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "bearerContextsToBeCreatedInCreateSessionRequest.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "ebiIe.h"
+#include "bearerTftIe.h"
+#include "fTeidIe.h"
+#include "fTeidIe.h"
+#include "fTeidIe.h"
+#include "fTeidIe.h"
+#include "fTeidIe.h"
+#include "fTeidIe.h"
+#include "fTeidIe.h"
+#include "bearerQosIe.h"
+#include "fTeidIe.h"
+
+BearerContextsToBeCreatedInCreateSessionRequest::
+BearerContextsToBeCreatedInCreateSessionRequest()
+{
+    Uint16 mandIe;
+    mandIe = EbiIeType;
+    mandIe = (mandIe << 8) | 0; // epsBearerId
+    mandatoryIeSet.insert(mandIe);
+    mandIe = BearerQosIeType;
+    mandIe = (mandIe << 8) | 0; // bearerLevelQos
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+BearerContextsToBeCreatedInCreateSessionRequest::
+~BearerContextsToBeCreatedInCreateSessionRequest()
+{
+
+}
+bool BearerContextsToBeCreatedInCreateSessionRequest::
+encodeBearerContextsToBeCreatedInCreateSessionRequest(MsgBuffer &buffer,
+                         BearerContextsToBeCreatedInCreateSessionRequestData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = EbiIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    EbiIe ebi=
+    dynamic_cast<
+    EbiIe&>(GtpV2IeFactory::getInstance().getIeObject(EbiIeType));
+    rc = ebi.encodeEbiIe(buffer, data.epsBearerId);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: epsBearerId\n");
+        return false;
+    }
+
+    if (data.tftIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = BearerTftIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        BearerTftIe bearerTft=
+        dynamic_cast<
+        BearerTftIe&>(GtpV2IeFactory::getInstance().getIeObject(BearerTftIeType));
+        rc = bearerTft.encodeBearerTftIe(buffer, data.tft);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: tft\n");
+          return false;
+        }
+    }
+
+    if (data.s1UEnodebFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.s1UEnodebFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: s1UEnodebFTeid\n");
+          return false;
+        }
+    }
+
+    if (data.s4USgsnFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.s4USgsnFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: s4USgsnFTeid\n");
+          return false;
+        }
+    }
+
+    if (data.s5S8USgwFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 2;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.s5S8USgwFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: s5S8USgwFTeid\n");
+          return false;
+        }
+    }
+
+    if (data.s5S8UPgwFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 3;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.s5S8UPgwFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: s5S8UPgwFTeid\n");
+          return false;
+        }
+    }
+
+    if (data.s12RncFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 4;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.s12RncFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: s12RncFTeid\n");
+          return false;
+        }
+    }
+
+    if (data.s2bUEpdgFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 5;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.s2bUEpdgFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: s2bUEpdgFTeid\n");
+          return false;
+        }
+    }
+
+    if (data.s2aUTwanFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 6;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.s2aUTwanFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: s2aUTwanFTeid\n");
+          return false;
+        }
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = BearerQosIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    BearerQosIe bearerQos=
+    dynamic_cast<
+    BearerQosIe&>(GtpV2IeFactory::getInstance().getIeObject(BearerQosIeType));
+    rc = bearerQos.encodeBearerQosIe(buffer, data.bearerLevelQos);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: bearerLevelQos\n");
+        return false;
+    }
+
+    if (data.s11UMmeFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 7;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.s11UMmeFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: s11UMmeFTeid\n");
+          return false;
+        }
+    }
+    return rc;
+}
+
+bool BearerContextsToBeCreatedInCreateSessionRequest::
+decodeBearerContextsToBeCreatedInCreateSessionRequest(MsgBuffer &buffer,
+                         BearerContextsToBeCreatedInCreateSessionRequestData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case EbiIeType:
+            {
+                EbiIe ieObject =
+                dynamic_cast<
+                EbiIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(EbiIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeEbiIe(buffer, data.epsBearerId, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: epsBearerId\n");
+                        return false;
+                    }
+                    Uint16 mandIe = EbiIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case BearerTftIeType:
+            {
+                BearerTftIe ieObject =
+                dynamic_cast<
+                BearerTftIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(BearerTftIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeBearerTftIe(buffer, data.tft, ieHeader.length);
+
+                    data.tftIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: tft\n");
+                        return false;
+                    }
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case FTeidIeType:
+            {
+                FTeidIe ieObject =
+                dynamic_cast<
+                FTeidIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(FTeidIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeFTeidIe(buffer, data.s1UEnodebFTeid, ieHeader.length);
+
+                    data.s1UEnodebFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: s1UEnodebFTeid\n");
+                        return false;
+                    }
+                }
+
+                else if(ieHeader.instance == 1)
+                {
+
+                					rc = ieObject.decodeFTeidIe(buffer, data.s4USgsnFTeid, ieHeader.length);
+
+                    data.s4USgsnFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: s4USgsnFTeid\n");
+                        return false;
+                    }
+                }
+
+                else if(ieHeader.instance == 2)
+                {
+
+                					rc = ieObject.decodeFTeidIe(buffer, data.s5S8USgwFTeid, ieHeader.length);
+
+                    data.s5S8USgwFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: s5S8USgwFTeid\n");
+                        return false;
+                    }
+                }
+
+                else if(ieHeader.instance == 3)
+                {
+
+                					rc = ieObject.decodeFTeidIe(buffer, data.s5S8UPgwFTeid, ieHeader.length);
+
+                    data.s5S8UPgwFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: s5S8UPgwFTeid\n");
+                        return false;
+                    }
+                }
+
+                else if(ieHeader.instance == 4)
+                {
+
+                					rc = ieObject.decodeFTeidIe(buffer, data.s12RncFTeid, ieHeader.length);
+
+                    data.s12RncFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: s12RncFTeid\n");
+                        return false;
+                    }
+                }
+
+                else if(ieHeader.instance == 5)
+                {
+
+                					rc = ieObject.decodeFTeidIe(buffer, data.s2bUEpdgFTeid, ieHeader.length);
+
+                    data.s2bUEpdgFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: s2bUEpdgFTeid\n");
+                        return false;
+                    }
+                }
+
+                else if(ieHeader.instance == 6)
+                {
+
+                					rc = ieObject.decodeFTeidIe(buffer, data.s2aUTwanFTeid, ieHeader.length);
+
+                    data.s2aUTwanFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: s2aUTwanFTeid\n");
+                        return false;
+                    }
+                }
+
+                else if(ieHeader.instance == 7)
+                {
+
+                					rc = ieObject.decodeFTeidIe(buffer, data.s11UMmeFTeid, ieHeader.length);
+
+                    data.s11UMmeFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: s11UMmeFTeid\n");
+                        return false;
+                    }
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case BearerQosIeType:
+            {
+                BearerQosIe ieObject =
+                dynamic_cast<
+                BearerQosIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(BearerQosIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeBearerQosIe(buffer, data.bearerLevelQos, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: bearerLevelQos\n");
+                        return false;
+                    }
+                    Uint16 mandIe = BearerQosIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void BearerContextsToBeCreatedInCreateSessionRequest::
+displayBearerContextsToBeCreatedInCreateSessionRequestData_v
+(BearerContextsToBeCreatedInCreateSessionRequestData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"BearerContextsToBeCreatedInCreateSessionRequest:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+    if (data.tftIePresent)
+    {
+
+        stream.add((char *)"tft:");
+        stream.endOfLine();
+        BearerTftIe bearerTft=
+        dynamic_cast<
+        BearerTftIe&>(GtpV2IeFactory::getInstance().getIeObject(BearerTftIeType));
+        bearerTft.displayBearerTftIe_v(data.tft, stream);
+
+    }
+
+    if (data.s1UEnodebFTeidIePresent)
+    {
+
+        stream.add((char *)"s1UEnodebFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.s1UEnodebFTeid, stream);
+
+    }
+
+    if (data.s4USgsnFTeidIePresent)
+    {
+
+        stream.add((char *)"s4USgsnFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.s4USgsnFTeid, stream);
+
+    }
+
+    if (data.s5S8USgwFTeidIePresent)
+    {
+
+        stream.add((char *)"s5S8USgwFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.s5S8USgwFTeid, stream);
+
+    }
+
+    if (data.s5S8UPgwFTeidIePresent)
+    {
+
+        stream.add((char *)"s5S8UPgwFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.s5S8UPgwFTeid, stream);
+
+    }
+
+    if (data.s12RncFTeidIePresent)
+    {
+
+        stream.add((char *)"s12RncFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.s12RncFTeid, stream);
+
+    }
+
+    if (data.s2bUEpdgFTeidIePresent)
+    {
+
+        stream.add((char *)"s2bUEpdgFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.s2bUEpdgFTeid, stream);
+
+    }
+
+    if (data.s2aUTwanFTeidIePresent)
+    {
+
+        stream.add((char *)"s2aUTwanFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.s2aUTwanFTeid, stream);
+
+    }
+
+
+    if (data.s11UMmeFTeidIePresent)
+    {
+
+        stream.add((char *)"s11UMmeFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.s11UMmeFTeid, stream);
+
+    }
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/bearerContextsToBeCreatedInCreateSessionRequest.h b/src/gtpV2Codec/ieClasses/bearerContextsToBeCreatedInCreateSessionRequest.h
new file mode 100644
index 0000000..a63caf5
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/bearerContextsToBeCreatedInCreateSessionRequest.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef BEARERCONTEXTSTOBECREATEDINCREATESESSIONREQUEST_H_
+#define BEARERCONTEXTSTOBECREATEDINCREATESESSIONREQUEST_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class BearerContextsToBeCreatedInCreateSessionRequest:public GtpV2GroupedIe
+{
+public:
+    BearerContextsToBeCreatedInCreateSessionRequest();
+    virtual ~BearerContextsToBeCreatedInCreateSessionRequest();
+    bool encodeBearerContextsToBeCreatedInCreateSessionRequest(MsgBuffer &buffer,
+                             BearerContextsToBeCreatedInCreateSessionRequestData
+                              const &data);
+
+    bool decodeBearerContextsToBeCreatedInCreateSessionRequest (MsgBuffer &buffer,
+                             BearerContextsToBeCreatedInCreateSessionRequestData 
+                             & data, Uint16 length);
+
+    void displayBearerContextsToBeCreatedInCreateSessionRequestData_v
+    (BearerContextsToBeCreatedInCreateSessionRequestData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/bearerContextsToBeModifiedInModifyBearerRequest.cpp b/src/gtpV2Codec/ieClasses/bearerContextsToBeModifiedInModifyBearerRequest.cpp
new file mode 100644
index 0000000..5e3680c
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/bearerContextsToBeModifiedInModifyBearerRequest.cpp
@@ -0,0 +1,469 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "bearerContextsToBeModifiedInModifyBearerRequest.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "ebiIe.h"
+#include "fTeidIe.h"
+#include "fTeidIe.h"
+#include "fTeidIe.h"
+#include "fTeidIe.h"
+#include "fTeidIe.h"
+
+BearerContextsToBeModifiedInModifyBearerRequest::
+BearerContextsToBeModifiedInModifyBearerRequest()
+{
+    Uint16 mandIe;
+    mandIe = EbiIeType;
+    mandIe = (mandIe << 8) | 0; // epsBearerId
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+BearerContextsToBeModifiedInModifyBearerRequest::
+~BearerContextsToBeModifiedInModifyBearerRequest()
+{
+
+}
+bool BearerContextsToBeModifiedInModifyBearerRequest::
+encodeBearerContextsToBeModifiedInModifyBearerRequest(MsgBuffer &buffer,
+                         BearerContextsToBeModifiedInModifyBearerRequestData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = EbiIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    EbiIe ebi=
+    dynamic_cast<
+    EbiIe&>(GtpV2IeFactory::getInstance().getIeObject(EbiIeType));
+    rc = ebi.encodeEbiIe(buffer, data.epsBearerId);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: epsBearerId\n");
+        return false;
+    }
+
+    if (data.s1EnodebFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.s1EnodebFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: s1EnodebFTeid\n");
+          return false;
+        }
+    }
+
+    if (data.s58USgwFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.s58USgwFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: s58USgwFTeid\n");
+          return false;
+        }
+    }
+
+    if (data.s12RncFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 2;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.s12RncFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: s12RncFTeid\n");
+          return false;
+        }
+    }
+
+    if (data.s4USgsnFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 3;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.s4USgsnFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: s4USgsnFTeid\n");
+          return false;
+        }
+    }
+
+    if (data.s11UMmeFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 4;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.s11UMmeFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: s11UMmeFTeid\n");
+          return false;
+        }
+    }
+    return rc;
+}
+
+bool BearerContextsToBeModifiedInModifyBearerRequest::
+decodeBearerContextsToBeModifiedInModifyBearerRequest(MsgBuffer &buffer,
+                         BearerContextsToBeModifiedInModifyBearerRequestData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case EbiIeType:
+            {
+                EbiIe ieObject =
+                dynamic_cast<
+                EbiIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(EbiIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeEbiIe(buffer, data.epsBearerId, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: epsBearerId\n");
+                        return false;
+                    }
+                    Uint16 mandIe = EbiIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case FTeidIeType:
+            {
+                FTeidIe ieObject =
+                dynamic_cast<
+                FTeidIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(FTeidIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeFTeidIe(buffer, data.s1EnodebFTeid, ieHeader.length);
+
+                    data.s1EnodebFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: s1EnodebFTeid\n");
+                        return false;
+                    }
+                }
+
+                else if(ieHeader.instance == 1)
+                {
+
+                					rc = ieObject.decodeFTeidIe(buffer, data.s58USgwFTeid, ieHeader.length);
+
+                    data.s58USgwFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: s58USgwFTeid\n");
+                        return false;
+                    }
+                }
+
+                else if(ieHeader.instance == 2)
+                {
+
+                					rc = ieObject.decodeFTeidIe(buffer, data.s12RncFTeid, ieHeader.length);
+
+                    data.s12RncFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: s12RncFTeid\n");
+                        return false;
+                    }
+                }
+
+                else if(ieHeader.instance == 3)
+                {
+
+                					rc = ieObject.decodeFTeidIe(buffer, data.s4USgsnFTeid, ieHeader.length);
+
+                    data.s4USgsnFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: s4USgsnFTeid\n");
+                        return false;
+                    }
+                }
+
+                else if(ieHeader.instance == 4)
+                {
+
+                					rc = ieObject.decodeFTeidIe(buffer, data.s11UMmeFTeid, ieHeader.length);
+
+                    data.s11UMmeFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: s11UMmeFTeid\n");
+                        return false;
+                    }
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void BearerContextsToBeModifiedInModifyBearerRequest::
+displayBearerContextsToBeModifiedInModifyBearerRequestData_v
+(BearerContextsToBeModifiedInModifyBearerRequestData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"BearerContextsToBeModifiedInModifyBearerRequest:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+    if (data.s1EnodebFTeidIePresent)
+    {
+
+        stream.add((char *)"s1EnodebFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.s1EnodebFTeid, stream);
+
+    }
+
+    if (data.s58USgwFTeidIePresent)
+    {
+
+        stream.add((char *)"s58USgwFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.s58USgwFTeid, stream);
+
+    }
+
+    if (data.s12RncFTeidIePresent)
+    {
+
+        stream.add((char *)"s12RncFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.s12RncFTeid, stream);
+
+    }
+
+    if (data.s4USgsnFTeidIePresent)
+    {
+
+        stream.add((char *)"s4USgsnFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.s4USgsnFTeid, stream);
+
+    }
+
+    if (data.s11UMmeFTeidIePresent)
+    {
+
+        stream.add((char *)"s11UMmeFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.s11UMmeFTeid, stream);
+
+    }
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/bearerContextsToBeModifiedInModifyBearerRequest.h b/src/gtpV2Codec/ieClasses/bearerContextsToBeModifiedInModifyBearerRequest.h
new file mode 100644
index 0000000..ad0fa8a
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/bearerContextsToBeModifiedInModifyBearerRequest.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef BEARERCONTEXTSTOBEMODIFIEDINMODIFYBEARERREQUEST_H_
+#define BEARERCONTEXTSTOBEMODIFIEDINMODIFYBEARERREQUEST_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class BearerContextsToBeModifiedInModifyBearerRequest:public GtpV2GroupedIe
+{
+public:
+    BearerContextsToBeModifiedInModifyBearerRequest();
+    virtual ~BearerContextsToBeModifiedInModifyBearerRequest();
+    bool encodeBearerContextsToBeModifiedInModifyBearerRequest(MsgBuffer &buffer,
+                             BearerContextsToBeModifiedInModifyBearerRequestData
+                              const &data);
+
+    bool decodeBearerContextsToBeModifiedInModifyBearerRequest (MsgBuffer &buffer,
+                             BearerContextsToBeModifiedInModifyBearerRequestData 
+                             & data, Uint16 length);
+
+    void displayBearerContextsToBeModifiedInModifyBearerRequestData_v
+    (BearerContextsToBeModifiedInModifyBearerRequestData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/bearerContextsToBeRemovedInCreateSessionRequest.cpp b/src/gtpV2Codec/ieClasses/bearerContextsToBeRemovedInCreateSessionRequest.cpp
new file mode 100644
index 0000000..946f035
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/bearerContextsToBeRemovedInCreateSessionRequest.cpp
@@ -0,0 +1,253 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "bearerContextsToBeRemovedInCreateSessionRequest.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "ebiIe.h"
+#include "fTeidIe.h"
+
+BearerContextsToBeRemovedInCreateSessionRequest::
+BearerContextsToBeRemovedInCreateSessionRequest()
+{
+    Uint16 mandIe;
+    mandIe = EbiIeType;
+    mandIe = (mandIe << 8) | 0; // epsBearerId
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+BearerContextsToBeRemovedInCreateSessionRequest::
+~BearerContextsToBeRemovedInCreateSessionRequest()
+{
+
+}
+bool BearerContextsToBeRemovedInCreateSessionRequest::
+encodeBearerContextsToBeRemovedInCreateSessionRequest(MsgBuffer &buffer,
+                         BearerContextsToBeRemovedInCreateSessionRequestData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = EbiIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    EbiIe ebi=
+    dynamic_cast<
+    EbiIe&>(GtpV2IeFactory::getInstance().getIeObject(EbiIeType));
+    rc = ebi.encodeEbiIe(buffer, data.epsBearerId);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: epsBearerId\n");
+        return false;
+    }
+
+    if (data.s4USgsnFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.s4USgsnFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: s4USgsnFTeid\n");
+          return false;
+        }
+    }
+    return rc;
+}
+
+bool BearerContextsToBeRemovedInCreateSessionRequest::
+decodeBearerContextsToBeRemovedInCreateSessionRequest(MsgBuffer &buffer,
+                         BearerContextsToBeRemovedInCreateSessionRequestData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case EbiIeType:
+            {
+                EbiIe ieObject =
+                dynamic_cast<
+                EbiIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(EbiIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeEbiIe(buffer, data.epsBearerId, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: epsBearerId\n");
+                        return false;
+                    }
+                    Uint16 mandIe = EbiIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case FTeidIeType:
+            {
+                FTeidIe ieObject =
+                dynamic_cast<
+                FTeidIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(FTeidIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeFTeidIe(buffer, data.s4USgsnFTeid, ieHeader.length);
+
+                    data.s4USgsnFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: s4USgsnFTeid\n");
+                        return false;
+                    }
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void BearerContextsToBeRemovedInCreateSessionRequest::
+displayBearerContextsToBeRemovedInCreateSessionRequestData_v
+(BearerContextsToBeRemovedInCreateSessionRequestData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"BearerContextsToBeRemovedInCreateSessionRequest:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+    if (data.s4USgsnFTeidIePresent)
+    {
+
+        stream.add((char *)"s4USgsnFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.s4USgsnFTeid, stream);
+
+    }
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/bearerContextsToBeRemovedInCreateSessionRequest.h b/src/gtpV2Codec/ieClasses/bearerContextsToBeRemovedInCreateSessionRequest.h
new file mode 100644
index 0000000..0e9383d
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/bearerContextsToBeRemovedInCreateSessionRequest.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef BEARERCONTEXTSTOBEREMOVEDINCREATESESSIONREQUEST_H_
+#define BEARERCONTEXTSTOBEREMOVEDINCREATESESSIONREQUEST_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class BearerContextsToBeRemovedInCreateSessionRequest:public GtpV2GroupedIe
+{
+public:
+    BearerContextsToBeRemovedInCreateSessionRequest();
+    virtual ~BearerContextsToBeRemovedInCreateSessionRequest();
+    bool encodeBearerContextsToBeRemovedInCreateSessionRequest(MsgBuffer &buffer,
+                             BearerContextsToBeRemovedInCreateSessionRequestData
+                              const &data);
+
+    bool decodeBearerContextsToBeRemovedInCreateSessionRequest (MsgBuffer &buffer,
+                             BearerContextsToBeRemovedInCreateSessionRequestData 
+                             & data, Uint16 length);
+
+    void displayBearerContextsToBeRemovedInCreateSessionRequestData_v
+    (BearerContextsToBeRemovedInCreateSessionRequestData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/bearerContextsToBeRemovedInModifyBearerRequest.cpp b/src/gtpV2Codec/ieClasses/bearerContextsToBeRemovedInModifyBearerRequest.cpp
new file mode 100644
index 0000000..7d545ac
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/bearerContextsToBeRemovedInModifyBearerRequest.cpp
@@ -0,0 +1,182 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "bearerContextsToBeRemovedInModifyBearerRequest.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "ebiIe.h"
+
+BearerContextsToBeRemovedInModifyBearerRequest::
+BearerContextsToBeRemovedInModifyBearerRequest()
+{
+    Uint16 mandIe;
+    mandIe = EbiIeType;
+    mandIe = (mandIe << 8) | 0; // epsBearerId
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+BearerContextsToBeRemovedInModifyBearerRequest::
+~BearerContextsToBeRemovedInModifyBearerRequest()
+{
+
+}
+bool BearerContextsToBeRemovedInModifyBearerRequest::
+encodeBearerContextsToBeRemovedInModifyBearerRequest(MsgBuffer &buffer,
+                         BearerContextsToBeRemovedInModifyBearerRequestData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = EbiIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    EbiIe ebi=
+    dynamic_cast<
+    EbiIe&>(GtpV2IeFactory::getInstance().getIeObject(EbiIeType));
+    rc = ebi.encodeEbiIe(buffer, data.epsBearerId);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: epsBearerId\n");
+        return false;
+    }
+    return rc;
+}
+
+bool BearerContextsToBeRemovedInModifyBearerRequest::
+decodeBearerContextsToBeRemovedInModifyBearerRequest(MsgBuffer &buffer,
+                         BearerContextsToBeRemovedInModifyBearerRequestData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case EbiIeType:
+            {
+                EbiIe ieObject =
+                dynamic_cast<
+                EbiIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(EbiIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeEbiIe(buffer, data.epsBearerId, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: epsBearerId\n");
+                        return false;
+                    }
+                    Uint16 mandIe = EbiIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void BearerContextsToBeRemovedInModifyBearerRequest::
+displayBearerContextsToBeRemovedInModifyBearerRequestData_v
+(BearerContextsToBeRemovedInModifyBearerRequestData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"BearerContextsToBeRemovedInModifyBearerRequest:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/bearerContextsToBeRemovedInModifyBearerRequest.h b/src/gtpV2Codec/ieClasses/bearerContextsToBeRemovedInModifyBearerRequest.h
new file mode 100644
index 0000000..578f489
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/bearerContextsToBeRemovedInModifyBearerRequest.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef BEARERCONTEXTSTOBEREMOVEDINMODIFYBEARERREQUEST_H_
+#define BEARERCONTEXTSTOBEREMOVEDINMODIFYBEARERREQUEST_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class BearerContextsToBeRemovedInModifyBearerRequest:public GtpV2GroupedIe
+{
+public:
+    BearerContextsToBeRemovedInModifyBearerRequest();
+    virtual ~BearerContextsToBeRemovedInModifyBearerRequest();
+    bool encodeBearerContextsToBeRemovedInModifyBearerRequest(MsgBuffer &buffer,
+                             BearerContextsToBeRemovedInModifyBearerRequestData
+                              const &data);
+
+    bool decodeBearerContextsToBeRemovedInModifyBearerRequest (MsgBuffer &buffer,
+                             BearerContextsToBeRemovedInModifyBearerRequestData 
+                             & data, Uint16 length);
+
+    void displayBearerContextsToBeRemovedInModifyBearerRequestData_v
+    (BearerContextsToBeRemovedInModifyBearerRequestData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/bearerFlagsIe.cpp b/src/gtpV2Codec/ieClasses/bearerFlagsIe.cpp
new file mode 100644
index 0000000..a404ebb
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/bearerFlagsIe.cpp
@@ -0,0 +1,102 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "bearerFlagsIe.h"
+#include "dataTypeCodecUtils.h"
+
+BearerFlagsIe::BearerFlagsIe() 
+{
+    ieType = 97;
+    // TODO
+
+}
+
+BearerFlagsIe::~BearerFlagsIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool BearerFlagsIe::encodeBearerFlagsIe(MsgBuffer &buffer, BearerFlagsIeData const &data)
+{
+    buffer.skipBits(6);
+
+    if(!(buffer.writeBits(data.vb, 1)))
+    {
+        errorStream.add((char *)"Encoding of vb failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.ppc, 1)))
+    {
+        errorStream.add((char *)"Encoding of ppc failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool BearerFlagsIe::decodeBearerFlagsIe(MsgBuffer &buffer, BearerFlagsIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+    buffer.skipBits(6);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: \n");
+        return false;
+    }
+
+    data.vb = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: vb\n");
+        return false;
+    }
+    data.ppc = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: ppc\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE BearerFlagsIe\n");
+        return false;
+    }
+}
+void BearerFlagsIe::displayBearerFlagsIe_v(BearerFlagsIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"BearerFlagsIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add( (char *)"vb: "); 
+    stream.add((Uint8)data.vb);
+    stream.endOfLine();
+  
+    stream.add( (char *)"ppc: "); 
+    stream.add((Uint8)data.ppc);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/bearerFlagsIe.h b/src/gtpV2Codec/ieClasses/bearerFlagsIe.h
new file mode 100644
index 0000000..cb4d7d1
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/bearerFlagsIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef BEARERFLAGSIE_H_
+#define BEARERFLAGSIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class BearerFlagsIe: public GtpV2Ie {
+public:
+    BearerFlagsIe();
+    virtual ~BearerFlagsIe();
+
+    bool encodeBearerFlagsIe(MsgBuffer &buffer,
+                 BearerFlagsIeData const &data);
+    bool decodeBearerFlagsIe(MsgBuffer &buffer,
+                 BearerFlagsIeData &data, Uint16 length);
+    void displayBearerFlagsIe_v(BearerFlagsIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* BEARERFLAGSIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/bearerQosIe.cpp b/src/gtpV2Codec/ieClasses/bearerQosIe.cpp
new file mode 100644
index 0000000..023e0ba
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/bearerQosIe.cpp
@@ -0,0 +1,205 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "bearerQosIe.h"
+#include "dataTypeCodecUtils.h"
+
+BearerQosIe::BearerQosIe() 
+{
+    ieType = 80;
+    // TODO
+
+}
+
+BearerQosIe::~BearerQosIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool BearerQosIe::encodeBearerQosIe(MsgBuffer &buffer, BearerQosIeData const &data)
+{
+    buffer.skipBits(1);
+
+    if(!(buffer.writeBits(data.pci, 1)))
+    {
+        errorStream.add((char *)"Encoding of pci failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.pl, 4)))
+    {
+        errorStream.add((char *)"Encoding of pl failed\n");
+        return false;
+    }
+    buffer.skipBits(1);
+
+    if(!(buffer.writeBits(data.pvi, 1)))
+    {
+        errorStream.add((char *)"Encoding of pvi failed\n");
+        return false;
+    }
+    if (!(buffer.writeUint8(data.qci)))
+    {
+        errorStream.add((char *)"Encoding of qci failed\n");
+        return false;
+    }
+    if (!(DataTypeCodecUtils::encodeUint8Array5(buffer, data.maxBitRateUl)))
+    {
+    errorStream.add((char *)"Encoding of maxBitRateUl failed\n");
+    return false;
+    }
+    if (!(DataTypeCodecUtils::encodeUint8Array5(buffer, data.maxBitRateDl)))
+    {
+    errorStream.add((char *)"Encoding of maxBitRateDl failed\n");
+    return false;
+    }
+    if (!(DataTypeCodecUtils::encodeUint8Array5(buffer, data.guraranteedBitRateUl)))
+    {
+    errorStream.add((char *)"Encoding of guraranteedBitRateUl failed\n");
+    return false;
+    }
+    if (!(DataTypeCodecUtils::encodeUint8Array5(buffer, data.guaranteedBitRateDl)))
+    {
+    errorStream.add((char *)"Encoding of guaranteedBitRateDl failed\n");
+    return false;
+    }
+
+    return true;
+}
+
+bool BearerQosIe::decodeBearerQosIe(MsgBuffer &buffer, BearerQosIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+    buffer.skipBits(1);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: \n");
+        return false;
+    }
+
+    data.pci = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: pci\n");
+        return false;
+    }
+    data.pl = buffer.readBits(4);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: pl\n");
+        return false;
+    }
+    buffer.skipBits(1);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: \n");
+        return false;
+    }
+
+    data.pvi = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: pvi\n");
+        return false;
+    }
+
+    buffer.readUint8(data.qci);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: qci\n");
+        return false;
+    }
+
+    Uint16 lengthLeft = length;
+    lengthLeft = ieBoundary - buffer.getCurrentIndex();
+    if (!(DataTypeCodecUtils::decodeUint8Array5(buffer, data.maxBitRateUl, lengthLeft, 5)))
+    {
+        errorStream.add((char *)"Failed to decode: maxBitRateUl\n");
+        return false;
+    }
+    lengthLeft = ieBoundary - buffer.getCurrentIndex();
+    if (!(DataTypeCodecUtils::decodeUint8Array5(buffer, data.maxBitRateDl, lengthLeft, 5)))
+    {
+        errorStream.add((char *)"Failed to decode: maxBitRateDl\n");
+        return false;
+    }
+    lengthLeft = ieBoundary - buffer.getCurrentIndex();
+    if (!(DataTypeCodecUtils::decodeUint8Array5(buffer, data.guraranteedBitRateUl, lengthLeft, 5)))
+    {
+        errorStream.add((char *)"Failed to decode: guraranteedBitRateUl\n");
+        return false;
+    }
+    lengthLeft = ieBoundary - buffer.getCurrentIndex();
+    if (!(DataTypeCodecUtils::decodeUint8Array5(buffer, data.guaranteedBitRateDl, lengthLeft, 5)))
+    {
+        errorStream.add((char *)"Failed to decode: guaranteedBitRateDl\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE BearerQosIe\n");
+        return false;
+    }
+}
+void BearerQosIe::displayBearerQosIe_v(BearerQosIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"BearerQosIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add( (char *)"pci: "); 
+    stream.add((Uint8)data.pci);
+    stream.endOfLine();
+  
+    stream.add( (char *)"pl: "); 
+    stream.add((Uint8)data.pl);
+    stream.endOfLine();
+  
+    stream.add( (char *)"pvi: "); 
+    stream.add((Uint8)data.pvi);
+    stream.endOfLine();
+  
+    stream.add((char *)"qci: ");
+    stream.add(data.qci);
+    stream.endOfLine();
+  
+    stream.add((char *)"maxBitRateUl:");
+    stream.endOfLine();
+    DataTypeCodecUtils::displayUint8Array5_v(data.maxBitRateUl, stream);
+  
+    stream.add((char *)"maxBitRateDl:");
+    stream.endOfLine();
+    DataTypeCodecUtils::displayUint8Array5_v(data.maxBitRateDl, stream);
+  
+    stream.add((char *)"guraranteedBitRateUl:");
+    stream.endOfLine();
+    DataTypeCodecUtils::displayUint8Array5_v(data.guraranteedBitRateUl, stream);
+  
+    stream.add((char *)"guaranteedBitRateDl:");
+    stream.endOfLine();
+    DataTypeCodecUtils::displayUint8Array5_v(data.guaranteedBitRateDl, stream);
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/bearerQosIe.h b/src/gtpV2Codec/ieClasses/bearerQosIe.h
new file mode 100644
index 0000000..a998ea7
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/bearerQosIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef BEARERQOSIE_H_
+#define BEARERQOSIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class BearerQosIe: public GtpV2Ie {
+public:
+    BearerQosIe();
+    virtual ~BearerQosIe();
+
+    bool encodeBearerQosIe(MsgBuffer &buffer,
+                 BearerQosIeData const &data);
+    bool decodeBearerQosIe(MsgBuffer &buffer,
+                 BearerQosIeData &data, Uint16 length);
+    void displayBearerQosIe_v(BearerQosIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* BEARERQOSIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/bearerTftIe.cpp b/src/gtpV2Codec/ieClasses/bearerTftIe.cpp
new file mode 100644
index 0000000..a20fe38
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/bearerTftIe.cpp
@@ -0,0 +1,78 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "bearerTftIe.h"
+#include "dataTypeCodecUtils.h"
+
+BearerTftIe::BearerTftIe() 
+{
+    ieType = 84;
+    // TODO
+
+}
+
+BearerTftIe::~BearerTftIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool BearerTftIe::encodeBearerTftIe(MsgBuffer &buffer, BearerTftIeData const &data)
+{
+    if (!(DataTypeCodecUtils::encodeUint8Array16(buffer, data.tft)))
+    {
+    errorStream.add((char *)"Encoding of tft failed\n");
+    return false;
+    }
+
+    return true;
+}
+
+bool BearerTftIe::decodeBearerTftIe(MsgBuffer &buffer, BearerTftIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+
+    Uint16 lengthLeft = length;
+    lengthLeft = ieBoundary - buffer.getCurrentIndex();
+    if (!(DataTypeCodecUtils::decodeUint8Array16(buffer, data.tft, lengthLeft, 0)))
+    {
+        errorStream.add((char *)"Failed to decode: tft\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE BearerTftIe\n");
+        return false;
+    }
+}
+void BearerTftIe::displayBearerTftIe_v(BearerTftIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"BearerTftIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add((char *)"tft:");
+    stream.endOfLine();
+    DataTypeCodecUtils::displayUint8Array16_v(data.tft, stream);
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/bearerTftIe.h b/src/gtpV2Codec/ieClasses/bearerTftIe.h
new file mode 100644
index 0000000..8d2a322
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/bearerTftIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef BEARERTFTIE_H_
+#define BEARERTFTIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class BearerTftIe: public GtpV2Ie {
+public:
+    BearerTftIe();
+    virtual ~BearerTftIe();
+
+    bool encodeBearerTftIe(MsgBuffer &buffer,
+                 BearerTftIeData const &data);
+    bool decodeBearerTftIe(MsgBuffer &buffer,
+                 BearerTftIeData &data, Uint16 length);
+    void displayBearerTftIe_v(BearerTftIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* BEARERTFTIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/causeIe.cpp b/src/gtpV2Codec/ieClasses/causeIe.cpp
new file mode 100644
index 0000000..7629c05
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/causeIe.cpp
@@ -0,0 +1,162 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "causeIe.h"
+#include "dataTypeCodecUtils.h"
+
+CauseIe::CauseIe() 
+{
+    ieType = 2;
+    // TODO
+
+}
+
+CauseIe::~CauseIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool CauseIe::encodeCauseIe(MsgBuffer &buffer, CauseIeData const &data)
+{
+    if (!(buffer.writeUint8(data.causeValue)))
+    {
+        errorStream.add((char *)"Encoding of causeValue failed\n");
+        return false;
+    }
+    buffer.skipBits(5);
+
+    if(!(buffer.writeBits(data.pce, 1)))
+    {
+        errorStream.add((char *)"Encoding of pce failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.pbe, 1)))
+    {
+        errorStream.add((char *)"Encoding of pbe failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.cs, 1)))
+    {
+        errorStream.add((char *)"Encoding of cs failed\n");
+        return false;
+    }
+    if (data.offendingIeDataPresent)
+    {
+        if (!(DataTypeCodecUtils::encodeOffendingIeData(buffer, data.offendingIeData)))
+        {
+            errorStream.add((char *)"Encoding of offendingIeData failed\n");
+            return false;
+        }
+    }
+
+    return true;
+}
+
+bool CauseIe::decodeCauseIe(MsgBuffer &buffer, CauseIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+
+    buffer.readUint8(data.causeValue);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: causeValue\n");
+        return false;
+    }
+    buffer.skipBits(5);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: \n");
+        return false;
+    }
+
+    data.pce = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: pce\n");
+        return false;
+    }
+    data.pbe = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: pbe\n");
+        return false;
+    }
+    data.cs = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: cs\n");
+        return false;
+    }
+
+    Uint16 lengthLeft = length;
+
+    if (length == 6)
+    {
+        lengthLeft = ieBoundary - buffer.getCurrentIndex();
+        if (!(DataTypeCodecUtils::decodeOffendingIeData(buffer, data.offendingIeData, lengthLeft)))
+        {
+            errorStream.add((char *)"Failed to decode: offendingIeData\n");
+            return false;
+        }
+        data.offendingIeDataPresent = true;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE CauseIe\n");
+        return false;
+    }
+}
+void CauseIe::displayCauseIe_v(CauseIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"CauseIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add((char *)"causeValue: ");
+    stream.add(data.causeValue);
+    stream.endOfLine();
+  
+    stream.add( (char *)"pce: "); 
+    stream.add((Uint8)data.pce);
+    stream.endOfLine();
+  
+    stream.add( (char *)"pbe: "); 
+    stream.add((Uint8)data.pbe);
+    stream.endOfLine();
+  
+    stream.add( (char *)"cs: "); 
+    stream.add((Uint8)data.cs);
+    stream.endOfLine();
+  
+    if (data.offendingIeDataPresent)
+    {
+        stream.add((char *)"offendingIeData:");
+        stream.endOfLine();
+        DataTypeCodecUtils::displayOffendingIeData_v(data.offendingIeData, stream);
+    }   
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/causeIe.h b/src/gtpV2Codec/ieClasses/causeIe.h
new file mode 100644
index 0000000..597ab2f
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/causeIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef CAUSEIE_H_
+#define CAUSEIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class CauseIe: public GtpV2Ie {
+public:
+    CauseIe();
+    virtual ~CauseIe();
+
+    bool encodeCauseIe(MsgBuffer &buffer,
+                 CauseIeData const &data);
+    bool decodeCauseIe(MsgBuffer &buffer,
+                 CauseIeData &data, Uint16 length);
+    void displayCauseIe_v(CauseIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* CAUSEIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/changeReportingActionIe.cpp b/src/gtpV2Codec/ieClasses/changeReportingActionIe.cpp
new file mode 100644
index 0000000..e217b7a
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/changeReportingActionIe.cpp
@@ -0,0 +1,87 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "changeReportingActionIe.h"
+#include "dataTypeCodecUtils.h"
+
+ChangeReportingActionIe::ChangeReportingActionIe() 
+{
+    ieType = 131;
+    // TODO
+
+}
+
+ChangeReportingActionIe::~ChangeReportingActionIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool ChangeReportingActionIe::encodeChangeReportingActionIe(MsgBuffer &buffer, ChangeReportingActionIeData const &data)
+{
+    if (!(data.action< 7))
+    {
+        errorStream.add((char *)"Data validation failure: action\n");
+        return false; 
+    }
+    if (!(buffer.writeUint8(data.action)))
+    {
+        errorStream.add((char *)"Encoding of action failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool ChangeReportingActionIe::decodeChangeReportingActionIe(MsgBuffer &buffer, ChangeReportingActionIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+
+    buffer.readUint8(data.action);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: action\n");
+        return false;
+    }
+    if (!(data.action< 7))
+    {
+        errorStream.add((char *)"Data validation failure : action\n");
+        return false; //TODO need to add validations
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE ChangeReportingActionIe\n");
+        return false;
+    }
+}
+void ChangeReportingActionIe::displayChangeReportingActionIe_v(ChangeReportingActionIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"ChangeReportingActionIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add((char *)"action: ");
+    stream.add(data.action);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/changeReportingActionIe.h b/src/gtpV2Codec/ieClasses/changeReportingActionIe.h
new file mode 100644
index 0000000..ec9a520
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/changeReportingActionIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef CHANGEREPORTINGACTIONIE_H_
+#define CHANGEREPORTINGACTIONIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class ChangeReportingActionIe: public GtpV2Ie {
+public:
+    ChangeReportingActionIe();
+    virtual ~ChangeReportingActionIe();
+
+    bool encodeChangeReportingActionIe(MsgBuffer &buffer,
+                 ChangeReportingActionIeData const &data);
+    bool decodeChangeReportingActionIe(MsgBuffer &buffer,
+                 ChangeReportingActionIeData &data, Uint16 length);
+    void displayChangeReportingActionIe_v(ChangeReportingActionIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* CHANGEREPORTINGACTIONIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/chargingCharacteristicsIe.cpp b/src/gtpV2Codec/ieClasses/chargingCharacteristicsIe.cpp
new file mode 100644
index 0000000..9724634
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/chargingCharacteristicsIe.cpp
@@ -0,0 +1,77 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "chargingCharacteristicsIe.h"
+#include "dataTypeCodecUtils.h"
+
+ChargingCharacteristicsIe::ChargingCharacteristicsIe() 
+{
+    ieType = 95;
+    // TODO
+
+}
+
+ChargingCharacteristicsIe::~ChargingCharacteristicsIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool ChargingCharacteristicsIe::encodeChargingCharacteristicsIe(MsgBuffer &buffer, ChargingCharacteristicsIeData const &data)
+{
+    if (!(buffer.writeUint16(data.value)))
+    {
+        errorStream.add((char *)"Encoding of value failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool ChargingCharacteristicsIe::decodeChargingCharacteristicsIe(MsgBuffer &buffer, ChargingCharacteristicsIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+
+    buffer.readUint16(data.value);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: value\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE ChargingCharacteristicsIe\n");
+        return false;
+    }
+}
+void ChargingCharacteristicsIe::displayChargingCharacteristicsIe_v(ChargingCharacteristicsIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"ChargingCharacteristicsIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add((char *)"value: ");
+    stream.add(data.value);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/chargingCharacteristicsIe.h b/src/gtpV2Codec/ieClasses/chargingCharacteristicsIe.h
new file mode 100644
index 0000000..9e7eec5
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/chargingCharacteristicsIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef CHARGINGCHARACTERISTICSIE_H_
+#define CHARGINGCHARACTERISTICSIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class ChargingCharacteristicsIe: public GtpV2Ie {
+public:
+    ChargingCharacteristicsIe();
+    virtual ~ChargingCharacteristicsIe();
+
+    bool encodeChargingCharacteristicsIe(MsgBuffer &buffer,
+                 ChargingCharacteristicsIeData const &data);
+    bool decodeChargingCharacteristicsIe(MsgBuffer &buffer,
+                 ChargingCharacteristicsIeData &data, Uint16 length);
+    void displayChargingCharacteristicsIe_v(ChargingCharacteristicsIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* CHARGINGCHARACTERISTICSIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/chargingIdIe.cpp b/src/gtpV2Codec/ieClasses/chargingIdIe.cpp
new file mode 100644
index 0000000..c0585a4
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/chargingIdIe.cpp
@@ -0,0 +1,77 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "chargingIdIe.h"
+#include "dataTypeCodecUtils.h"
+
+ChargingIdIe::ChargingIdIe() 
+{
+    ieType = 94;
+    // TODO
+
+}
+
+ChargingIdIe::~ChargingIdIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool ChargingIdIe::encodeChargingIdIe(MsgBuffer &buffer, ChargingIdIeData const &data)
+{
+    if (!(buffer.writeUint32(data.chargingIdValue)))
+    {
+        errorStream.add((char *)"Encoding of chargingIdValue failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool ChargingIdIe::decodeChargingIdIe(MsgBuffer &buffer, ChargingIdIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+
+    buffer.readUint32(data.chargingIdValue);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: chargingIdValue\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE ChargingIdIe\n");
+        return false;
+    }
+}
+void ChargingIdIe::displayChargingIdIe_v(ChargingIdIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"ChargingIdIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add((char *)"chargingIdValue: ");
+    stream.add(data.chargingIdValue);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/chargingIdIe.h b/src/gtpV2Codec/ieClasses/chargingIdIe.h
new file mode 100644
index 0000000..ef9ac61
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/chargingIdIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef CHARGINGIDIE_H_
+#define CHARGINGIDIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class ChargingIdIe: public GtpV2Ie {
+public:
+    ChargingIdIe();
+    virtual ~ChargingIdIe();
+
+    bool encodeChargingIdIe(MsgBuffer &buffer,
+                 ChargingIdIeData const &data);
+    bool decodeChargingIdIe(MsgBuffer &buffer,
+                 ChargingIdIeData &data, Uint16 length);
+    void displayChargingIdIe_v(ChargingIdIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* CHARGINGIDIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/cnOperatorSelectionEntityIe.cpp b/src/gtpV2Codec/ieClasses/cnOperatorSelectionEntityIe.cpp
new file mode 100644
index 0000000..5cd6480
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/cnOperatorSelectionEntityIe.cpp
@@ -0,0 +1,96 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "cnOperatorSelectionEntityIe.h"
+#include "dataTypeCodecUtils.h"
+
+CnOperatorSelectionEntityIe::CnOperatorSelectionEntityIe() 
+{
+    ieType = 173;
+    // TODO
+
+}
+
+CnOperatorSelectionEntityIe::~CnOperatorSelectionEntityIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool CnOperatorSelectionEntityIe::encodeCnOperatorSelectionEntityIe(MsgBuffer &buffer, CnOperatorSelectionEntityIeData const &data)
+{
+    buffer.skipBits(6);
+
+    if (!(data.cnOpselectionEntity<= 3))
+    {
+        errorStream.add((char *)"Data validation failure: cnOpselectionEntity\n");
+        return false; 
+    }
+    if(!(buffer.writeBits(data.cnOpselectionEntity, 2)))
+    {
+        errorStream.add((char *)"Encoding of cnOpselectionEntity failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool CnOperatorSelectionEntityIe::decodeCnOperatorSelectionEntityIe(MsgBuffer &buffer, CnOperatorSelectionEntityIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+    buffer.skipBits(6);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: \n");
+        return false;
+    }
+
+    data.cnOpselectionEntity = buffer.readBits(2);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: cnOpselectionEntity\n");
+        return false;
+    }
+    if (!(data.cnOpselectionEntity<= 3))
+    {
+        errorStream.add((char *)"Data validation failure : cnOpselectionEntity\n");
+        return false; //TODO need to add validations
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE CnOperatorSelectionEntityIe\n");
+        return false;
+    }
+}
+void CnOperatorSelectionEntityIe::displayCnOperatorSelectionEntityIe_v(CnOperatorSelectionEntityIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"CnOperatorSelectionEntityIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add( (char *)"cnOpselectionEntity: "); 
+    stream.add((Uint8)data.cnOpselectionEntity);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/cnOperatorSelectionEntityIe.h b/src/gtpV2Codec/ieClasses/cnOperatorSelectionEntityIe.h
new file mode 100644
index 0000000..c6402f3
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/cnOperatorSelectionEntityIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef CNOPERATORSELECTIONENTITYIE_H_
+#define CNOPERATORSELECTIONENTITYIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class CnOperatorSelectionEntityIe: public GtpV2Ie {
+public:
+    CnOperatorSelectionEntityIe();
+    virtual ~CnOperatorSelectionEntityIe();
+
+    bool encodeCnOperatorSelectionEntityIe(MsgBuffer &buffer,
+                 CnOperatorSelectionEntityIeData const &data);
+    bool decodeCnOperatorSelectionEntityIe(MsgBuffer &buffer,
+                 CnOperatorSelectionEntityIeData &data, Uint16 length);
+    void displayCnOperatorSelectionEntityIe_v(CnOperatorSelectionEntityIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* CNOPERATORSELECTIONENTITYIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/counterIe.cpp b/src/gtpV2Codec/ieClasses/counterIe.cpp
new file mode 100644
index 0000000..51bd2fa
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/counterIe.cpp
@@ -0,0 +1,93 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "counterIe.h"
+#include "dataTypeCodecUtils.h"
+
+CounterIe::CounterIe() 
+{
+    ieType = 199;
+    // TODO
+
+}
+
+CounterIe::~CounterIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool CounterIe::encodeCounterIe(MsgBuffer &buffer, CounterIeData const &data)
+{
+    if (!(buffer.writeUint32(data.timeStampValue)))
+    {
+        errorStream.add((char *)"Encoding of timeStampValue failed\n");
+        return false;
+    }
+    if (!(buffer.writeUint8(data.counterValue)))
+    {
+        errorStream.add((char *)"Encoding of counterValue failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool CounterIe::decodeCounterIe(MsgBuffer &buffer, CounterIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+
+    buffer.readUint32(data.timeStampValue);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: timeStampValue\n");
+        return false;
+    }
+
+    buffer.readUint8(data.counterValue);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: counterValue\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE CounterIe\n");
+        return false;
+    }
+}
+void CounterIe::displayCounterIe_v(CounterIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"CounterIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add((char *)"timeStampValue: ");
+    stream.add(data.timeStampValue);
+    stream.endOfLine();
+  
+    stream.add((char *)"counterValue: ");
+    stream.add(data.counterValue);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/counterIe.h b/src/gtpV2Codec/ieClasses/counterIe.h
new file mode 100644
index 0000000..3d92082
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/counterIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef COUNTERIE_H_
+#define COUNTERIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class CounterIe: public GtpV2Ie {
+public:
+    CounterIe();
+    virtual ~CounterIe();
+
+    bool encodeCounterIe(MsgBuffer &buffer,
+                 CounterIeData const &data);
+    bool decodeCounterIe(MsgBuffer &buffer,
+                 CounterIeData &data, Uint16 length);
+    void displayCounterIe_v(CounterIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* COUNTERIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/csgInformationReportingActionIe.cpp b/src/gtpV2Codec/ieClasses/csgInformationReportingActionIe.cpp
new file mode 100644
index 0000000..4bd1461
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/csgInformationReportingActionIe.cpp
@@ -0,0 +1,118 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "csgInformationReportingActionIe.h"
+#include "dataTypeCodecUtils.h"
+
+CsgInformationReportingActionIe::CsgInformationReportingActionIe() 
+{
+    ieType = 146;
+    // TODO
+
+}
+
+CsgInformationReportingActionIe::~CsgInformationReportingActionIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool CsgInformationReportingActionIe::encodeCsgInformationReportingActionIe(MsgBuffer &buffer, CsgInformationReportingActionIeData const &data)
+{
+    buffer.skipBits(5);
+
+    if(!(buffer.writeBits(data.uciuhc, 1)))
+    {
+        errorStream.add((char *)"Encoding of uciuhc failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.ucishc, 1)))
+    {
+        errorStream.add((char *)"Encoding of ucishc failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.ucicsg, 1)))
+    {
+        errorStream.add((char *)"Encoding of ucicsg failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool CsgInformationReportingActionIe::decodeCsgInformationReportingActionIe(MsgBuffer &buffer, CsgInformationReportingActionIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+    buffer.skipBits(5);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: \n");
+        return false;
+    }
+
+    data.uciuhc = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: uciuhc\n");
+        return false;
+    }
+    data.ucishc = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: ucishc\n");
+        return false;
+    }
+    data.ucicsg = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: ucicsg\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE CsgInformationReportingActionIe\n");
+        return false;
+    }
+}
+void CsgInformationReportingActionIe::displayCsgInformationReportingActionIe_v(CsgInformationReportingActionIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"CsgInformationReportingActionIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add( (char *)"uciuhc: "); 
+    stream.add((Uint8)data.uciuhc);
+    stream.endOfLine();
+  
+    stream.add( (char *)"ucishc: "); 
+    stream.add((Uint8)data.ucishc);
+    stream.endOfLine();
+  
+    stream.add( (char *)"ucicsg: "); 
+    stream.add((Uint8)data.ucicsg);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/csgInformationReportingActionIe.h b/src/gtpV2Codec/ieClasses/csgInformationReportingActionIe.h
new file mode 100644
index 0000000..30499ae
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/csgInformationReportingActionIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef CSGINFORMATIONREPORTINGACTIONIE_H_
+#define CSGINFORMATIONREPORTINGACTIONIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class CsgInformationReportingActionIe: public GtpV2Ie {
+public:
+    CsgInformationReportingActionIe();
+    virtual ~CsgInformationReportingActionIe();
+
+    bool encodeCsgInformationReportingActionIe(MsgBuffer &buffer,
+                 CsgInformationReportingActionIeData const &data);
+    bool decodeCsgInformationReportingActionIe(MsgBuffer &buffer,
+                 CsgInformationReportingActionIeData &data, Uint16 length);
+    void displayCsgInformationReportingActionIe_v(CsgInformationReportingActionIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* CSGINFORMATIONREPORTINGACTIONIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/dataTypeCodecUtils.cpp b/src/gtpV2Codec/ieClasses/dataTypeCodecUtils.cpp
new file mode 100644
index 0000000..5444c3c
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/dataTypeCodecUtils.cpp
@@ -0,0 +1,1408 @@
+/*
+ * 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/datatypetemplate.cpp.tt>
+ ******************************************************************************/
+#include "dataTypeCodecUtils.h"
+
+// TODO
+
+DataTypeCodecUtils::DataTypeCodecUtils()
+{
+    // TODO
+}
+
+DataTypeCodecUtils::~DataTypeCodecUtils() {
+    // TODO Auto-generated destructor stub
+}
+
+
+bool DataTypeCodecUtils::encodeCgiField(MsgBuffer &buffer, CgiField const &data)
+{
+    buffer.writeBits(data.mccDigit2, 4);
+    buffer.writeBits(data.mccDigit1, 4);
+    buffer.writeBits(data.mncDigit3, 4);
+    buffer.writeBits(data.mccDigit3, 4);
+    buffer.writeBits(data.mncDigit2, 4);
+    buffer.writeBits(data.mncDigit1, 4);
+    buffer.writeUint16(data.locationAreaCode);
+    buffer.writeUint16(data.cellIdentity);
+    return true;
+}
+
+bool DataTypeCodecUtils::decodeCgiField(MsgBuffer &buffer,CgiField &data,
+                         Uint16 length)
+{
+    
+    Uint16 typeBoundary = buffer.getCurrentIndex() + length;
+    data.mccDigit2 = buffer.readBits(4);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: mccDigit2\n");
+         return false;
+    }
+    data.mccDigit1 = buffer.readBits(4);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: mccDigit1\n");
+         return false;
+    }
+    data.mncDigit3 = buffer.readBits(4);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: mncDigit3\n");
+         return false;
+    }
+    data.mccDigit3 = buffer.readBits(4);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: mccDigit3\n");
+         return false;
+    }
+    data.mncDigit2 = buffer.readBits(4);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: mncDigit2\n");
+         return false;
+    }
+    data.mncDigit1 = buffer.readBits(4);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: mncDigit1\n");
+         return false;
+    }
+
+    buffer.readUint16(data.locationAreaCode);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: locationAreaCode\n");
+         return false;
+    }
+
+    buffer.readUint16(data.cellIdentity);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: cellIdentity\n");
+         return false;
+    }
+
+  return true;
+}
+
+void DataTypeCodecUtils::displayCgiField_v(CgiField const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"CgiField:");
+    stream.incrIndent();
+    stream.endOfLine();
+    stream.add((char *)"mccDigit2 = ");
+    stream.add(data.mccDigit2);
+    stream.endOfLine();
+    stream.add((char *)"mccDigit1 = ");
+    stream.add(data.mccDigit1);
+    stream.endOfLine();
+    stream.add((char *)"mncDigit3 = ");
+    stream.add(data.mncDigit3);
+    stream.endOfLine();
+    stream.add((char *)"mccDigit3 = ");
+    stream.add(data.mccDigit3);
+    stream.endOfLine();
+    stream.add((char *)"mncDigit2 = ");
+    stream.add(data.mncDigit2);
+    stream.endOfLine();
+    stream.add((char *)"mncDigit1 = ");
+    stream.add(data.mncDigit1);
+    stream.endOfLine();
+    stream.add((char *)"locationAreaCode = ");
+    stream.add(data.locationAreaCode);
+    stream.endOfLine();
+    stream.add((char *)"cellIdentity = ");
+    stream.add(data.cellIdentity);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+bool DataTypeCodecUtils::encodeOffendingIeData(MsgBuffer &buffer, OffendingIeData const &data)
+{
+    buffer.writeUint8(data.typeOfOffendingIe);
+    buffer.skipBits(4);
+
+    buffer.writeUint16(data.lengthOfOffendingIe);
+    buffer.writeBits(data.instanceOfOffendingIe, 4);
+    return true;
+}
+
+bool DataTypeCodecUtils::decodeOffendingIeData(MsgBuffer &buffer,OffendingIeData &data,
+                         Uint16 length)
+{
+    
+    Uint16 typeBoundary = buffer.getCurrentIndex() + length;
+
+    buffer.readUint8(data.typeOfOffendingIe);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: typeOfOffendingIe\n");
+         return false;
+    }
+    buffer.skipBits(4);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond type boundary: \n");
+        return false;
+    }
+
+    buffer.readUint16(data.lengthOfOffendingIe);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: lengthOfOffendingIe\n");
+         return false;
+    }
+    data.instanceOfOffendingIe = buffer.readBits(4);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: instanceOfOffendingIe\n");
+         return false;
+    }
+
+  return true;
+}
+
+void DataTypeCodecUtils::displayOffendingIeData_v(OffendingIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"OffendingIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+    stream.add((char *)"typeOfOffendingIe = ");
+    stream.add(data.typeOfOffendingIe);
+    stream.endOfLine();
+    stream.add((char *)"lengthOfOffendingIe = ");
+    stream.add(data.lengthOfOffendingIe);
+    stream.endOfLine();
+    stream.add((char *)"instanceOfOffendingIe = ");
+    stream.add(data.instanceOfOffendingIe);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+bool DataTypeCodecUtils::encodeSaiField(MsgBuffer &buffer, SaiField const &data)
+{
+    buffer.writeBits(data.mccDigit2, 4);
+    buffer.writeBits(data.mccDigit1, 4);
+    buffer.writeBits(data.mncDigit3, 4);
+    buffer.writeBits(data.mccDigit3, 4);
+    buffer.writeBits(data.mncDigit2, 4);
+    buffer.writeBits(data.mncDigit1, 4);
+    buffer.writeUint16(data.locationAreaCode);
+    buffer.writeUint16(data.serviceAreaCode);
+    return true;
+}
+
+bool DataTypeCodecUtils::decodeSaiField(MsgBuffer &buffer,SaiField &data,
+                         Uint16 length)
+{
+    
+    Uint16 typeBoundary = buffer.getCurrentIndex() + length;
+    data.mccDigit2 = buffer.readBits(4);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: mccDigit2\n");
+         return false;
+    }
+    data.mccDigit1 = buffer.readBits(4);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: mccDigit1\n");
+         return false;
+    }
+    data.mncDigit3 = buffer.readBits(4);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: mncDigit3\n");
+         return false;
+    }
+    data.mccDigit3 = buffer.readBits(4);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: mccDigit3\n");
+         return false;
+    }
+    data.mncDigit2 = buffer.readBits(4);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: mncDigit2\n");
+         return false;
+    }
+    data.mncDigit1 = buffer.readBits(4);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: mncDigit1\n");
+         return false;
+    }
+
+    buffer.readUint16(data.locationAreaCode);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: locationAreaCode\n");
+         return false;
+    }
+
+    buffer.readUint16(data.serviceAreaCode);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: serviceAreaCode\n");
+         return false;
+    }
+
+  return true;
+}
+
+void DataTypeCodecUtils::displaySaiField_v(SaiField const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"SaiField:");
+    stream.incrIndent();
+    stream.endOfLine();
+    stream.add((char *)"mccDigit2 = ");
+    stream.add(data.mccDigit2);
+    stream.endOfLine();
+    stream.add((char *)"mccDigit1 = ");
+    stream.add(data.mccDigit1);
+    stream.endOfLine();
+    stream.add((char *)"mncDigit3 = ");
+    stream.add(data.mncDigit3);
+    stream.endOfLine();
+    stream.add((char *)"mccDigit3 = ");
+    stream.add(data.mccDigit3);
+    stream.endOfLine();
+    stream.add((char *)"mncDigit2 = ");
+    stream.add(data.mncDigit2);
+    stream.endOfLine();
+    stream.add((char *)"mncDigit1 = ");
+    stream.add(data.mncDigit1);
+    stream.endOfLine();
+    stream.add((char *)"locationAreaCode = ");
+    stream.add(data.locationAreaCode);
+    stream.endOfLine();
+    stream.add((char *)"serviceAreaCode = ");
+    stream.add(data.serviceAreaCode);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+bool DataTypeCodecUtils::encodeRaiField(MsgBuffer &buffer, RaiField const &data)
+{
+    buffer.writeBits(data.mccDigit2, 4);
+    buffer.writeBits(data.mccDigit1, 4);
+    buffer.writeBits(data.mncDigit3, 4);
+    buffer.writeBits(data.mccDigit3, 4);
+    buffer.writeBits(data.mncDigit2, 4);
+    buffer.writeBits(data.mncDigit1, 4);
+    buffer.writeUint16(data.locationAreaCode);
+    buffer.writeUint16(data.routintAreaCode);
+    return true;
+}
+
+bool DataTypeCodecUtils::decodeRaiField(MsgBuffer &buffer,RaiField &data,
+                         Uint16 length)
+{
+    
+    Uint16 typeBoundary = buffer.getCurrentIndex() + length;
+    data.mccDigit2 = buffer.readBits(4);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: mccDigit2\n");
+         return false;
+    }
+    data.mccDigit1 = buffer.readBits(4);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: mccDigit1\n");
+         return false;
+    }
+    data.mncDigit3 = buffer.readBits(4);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: mncDigit3\n");
+         return false;
+    }
+    data.mccDigit3 = buffer.readBits(4);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: mccDigit3\n");
+         return false;
+    }
+    data.mncDigit2 = buffer.readBits(4);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: mncDigit2\n");
+         return false;
+    }
+    data.mncDigit1 = buffer.readBits(4);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: mncDigit1\n");
+         return false;
+    }
+
+    buffer.readUint16(data.locationAreaCode);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: locationAreaCode\n");
+         return false;
+    }
+
+    buffer.readUint16(data.routintAreaCode);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: routintAreaCode\n");
+         return false;
+    }
+
+  return true;
+}
+
+void DataTypeCodecUtils::displayRaiField_v(RaiField const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"RaiField:");
+    stream.incrIndent();
+    stream.endOfLine();
+    stream.add((char *)"mccDigit2 = ");
+    stream.add(data.mccDigit2);
+    stream.endOfLine();
+    stream.add((char *)"mccDigit1 = ");
+    stream.add(data.mccDigit1);
+    stream.endOfLine();
+    stream.add((char *)"mncDigit3 = ");
+    stream.add(data.mncDigit3);
+    stream.endOfLine();
+    stream.add((char *)"mccDigit3 = ");
+    stream.add(data.mccDigit3);
+    stream.endOfLine();
+    stream.add((char *)"mncDigit2 = ");
+    stream.add(data.mncDigit2);
+    stream.endOfLine();
+    stream.add((char *)"mncDigit1 = ");
+    stream.add(data.mncDigit1);
+    stream.endOfLine();
+    stream.add((char *)"locationAreaCode = ");
+    stream.add(data.locationAreaCode);
+    stream.endOfLine();
+    stream.add((char *)"routintAreaCode = ");
+    stream.add(data.routintAreaCode);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+bool DataTypeCodecUtils::encodeTaiField(MsgBuffer &buffer, TaiField const &data)
+{
+    buffer.writeBits(data.mccDigit2, 4);
+    buffer.writeBits(data.mccDigit1, 4);
+    buffer.writeBits(data.mncDigit3, 4);
+    buffer.writeBits(data.mccDigit3, 4);
+    buffer.writeBits(data.mncDigit2, 4);
+    buffer.writeBits(data.mncDigit1, 4);
+    buffer.writeUint16(data.trackingAreaCode);
+    return true;
+}
+
+bool DataTypeCodecUtils::decodeTaiField(MsgBuffer &buffer,TaiField &data,
+                         Uint16 length)
+{
+    
+    Uint16 typeBoundary = buffer.getCurrentIndex() + length;
+    data.mccDigit2 = buffer.readBits(4);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: mccDigit2\n");
+         return false;
+    }
+    data.mccDigit1 = buffer.readBits(4);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: mccDigit1\n");
+         return false;
+    }
+    data.mncDigit3 = buffer.readBits(4);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: mncDigit3\n");
+         return false;
+    }
+    data.mccDigit3 = buffer.readBits(4);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: mccDigit3\n");
+         return false;
+    }
+    data.mncDigit2 = buffer.readBits(4);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: mncDigit2\n");
+         return false;
+    }
+    data.mncDigit1 = buffer.readBits(4);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: mncDigit1\n");
+         return false;
+    }
+
+    buffer.readUint16(data.trackingAreaCode);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: trackingAreaCode\n");
+         return false;
+    }
+
+  return true;
+}
+
+void DataTypeCodecUtils::displayTaiField_v(TaiField const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"TaiField:");
+    stream.incrIndent();
+    stream.endOfLine();
+    stream.add((char *)"mccDigit2 = ");
+    stream.add(data.mccDigit2);
+    stream.endOfLine();
+    stream.add((char *)"mccDigit1 = ");
+    stream.add(data.mccDigit1);
+    stream.endOfLine();
+    stream.add((char *)"mncDigit3 = ");
+    stream.add(data.mncDigit3);
+    stream.endOfLine();
+    stream.add((char *)"mccDigit3 = ");
+    stream.add(data.mccDigit3);
+    stream.endOfLine();
+    stream.add((char *)"mncDigit2 = ");
+    stream.add(data.mncDigit2);
+    stream.endOfLine();
+    stream.add((char *)"mncDigit1 = ");
+    stream.add(data.mncDigit1);
+    stream.endOfLine();
+    stream.add((char *)"trackingAreaCode = ");
+    stream.add(data.trackingAreaCode);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+bool DataTypeCodecUtils::encodeEcgiField(MsgBuffer &buffer, EcgiField const &data)
+{
+    buffer.writeBits(data.mccDigit2, 4);
+    buffer.writeBits(data.mccDigit1, 4);
+    buffer.writeBits(data.mncDigit3, 4);
+    buffer.writeBits(data.mccDigit3, 4);
+    buffer.writeBits(data.mncDigit2, 4);
+    buffer.writeBits(data.mncDigit1, 4);
+    if (!(data.eUtranCellId<0x0FFFFFFF))
+    {
+         errorStream.add((char *)"Data validation failure: eUtranCellId\n"); 
+         return false; //TODO need to add validations
+    }
+    buffer.writeUint32(data.eUtranCellId);
+    return true;
+}
+
+bool DataTypeCodecUtils::decodeEcgiField(MsgBuffer &buffer,EcgiField &data,
+                         Uint16 length)
+{
+    
+    Uint16 typeBoundary = buffer.getCurrentIndex() + length;
+    data.mccDigit2 = buffer.readBits(4);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: mccDigit2\n");
+         return false;
+    }
+    data.mccDigit1 = buffer.readBits(4);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: mccDigit1\n");
+         return false;
+    }
+    data.mncDigit3 = buffer.readBits(4);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: mncDigit3\n");
+         return false;
+    }
+    data.mccDigit3 = buffer.readBits(4);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: mccDigit3\n");
+         return false;
+    }
+    data.mncDigit2 = buffer.readBits(4);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: mncDigit2\n");
+         return false;
+    }
+    data.mncDigit1 = buffer.readBits(4);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: mncDigit1\n");
+         return false;
+    }
+
+    buffer.readUint32(data.eUtranCellId);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: eUtranCellId\n");
+         return false;
+    }
+    if (!(data.eUtranCellId<0x0FFFFFFF))
+    {
+         errorStream.add((char *)"Data validation failure: eUtranCellId\n");
+         return false; //TODO need to add validations
+    }
+
+  return true;
+}
+
+void DataTypeCodecUtils::displayEcgiField_v(EcgiField const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"EcgiField:");
+    stream.incrIndent();
+    stream.endOfLine();
+    stream.add((char *)"mccDigit2 = ");
+    stream.add(data.mccDigit2);
+    stream.endOfLine();
+    stream.add((char *)"mccDigit1 = ");
+    stream.add(data.mccDigit1);
+    stream.endOfLine();
+    stream.add((char *)"mncDigit3 = ");
+    stream.add(data.mncDigit3);
+    stream.endOfLine();
+    stream.add((char *)"mccDigit3 = ");
+    stream.add(data.mccDigit3);
+    stream.endOfLine();
+    stream.add((char *)"mncDigit2 = ");
+    stream.add(data.mncDigit2);
+    stream.endOfLine();
+    stream.add((char *)"mncDigit1 = ");
+    stream.add(data.mncDigit1);
+    stream.endOfLine();
+    stream.add((char *)"eUtranCellId = ");
+    stream.add(data.eUtranCellId);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+bool DataTypeCodecUtils::encodeLaiField(MsgBuffer &buffer, LaiField const &data)
+{
+    buffer.writeBits(data.mccDigit2, 4);
+    buffer.writeBits(data.mccDigit1, 4);
+    buffer.writeBits(data.mncDigit3, 4);
+    buffer.writeBits(data.mccDigit3, 4);
+    buffer.writeBits(data.mncDigit2, 4);
+    buffer.writeBits(data.mncDigit1, 4);
+    buffer.writeUint16(data.locationAreaCode);
+    return true;
+}
+
+bool DataTypeCodecUtils::decodeLaiField(MsgBuffer &buffer,LaiField &data,
+                         Uint16 length)
+{
+    
+    Uint16 typeBoundary = buffer.getCurrentIndex() + length;
+    data.mccDigit2 = buffer.readBits(4);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: mccDigit2\n");
+         return false;
+    }
+    data.mccDigit1 = buffer.readBits(4);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: mccDigit1\n");
+         return false;
+    }
+    data.mncDigit3 = buffer.readBits(4);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: mncDigit3\n");
+         return false;
+    }
+    data.mccDigit3 = buffer.readBits(4);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: mccDigit3\n");
+         return false;
+    }
+    data.mncDigit2 = buffer.readBits(4);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: mncDigit2\n");
+         return false;
+    }
+    data.mncDigit1 = buffer.readBits(4);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: mncDigit1\n");
+         return false;
+    }
+
+    buffer.readUint16(data.locationAreaCode);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: locationAreaCode\n");
+         return false;
+    }
+
+  return true;
+}
+
+void DataTypeCodecUtils::displayLaiField_v(LaiField const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"LaiField:");
+    stream.incrIndent();
+    stream.endOfLine();
+    stream.add((char *)"mccDigit2 = ");
+    stream.add(data.mccDigit2);
+    stream.endOfLine();
+    stream.add((char *)"mccDigit1 = ");
+    stream.add(data.mccDigit1);
+    stream.endOfLine();
+    stream.add((char *)"mncDigit3 = ");
+    stream.add(data.mncDigit3);
+    stream.endOfLine();
+    stream.add((char *)"mccDigit3 = ");
+    stream.add(data.mccDigit3);
+    stream.endOfLine();
+    stream.add((char *)"mncDigit2 = ");
+    stream.add(data.mncDigit2);
+    stream.endOfLine();
+    stream.add((char *)"mncDigit1 = ");
+    stream.add(data.mncDigit1);
+    stream.endOfLine();
+    stream.add((char *)"locationAreaCode = ");
+    stream.add(data.locationAreaCode);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+bool DataTypeCodecUtils::encodeIpAddressV4(MsgBuffer &buffer, IpAddressV4 const &data)
+{
+    buffer.writeUint32(data.ipValue);
+    return true;
+}
+
+bool DataTypeCodecUtils::decodeIpAddressV4(MsgBuffer &buffer,IpAddressV4 &data,
+                         Uint16 length)
+{
+    
+    Uint16 typeBoundary = buffer.getCurrentIndex() + length;
+
+    buffer.readUint32(data.ipValue);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: ipValue\n");
+         return false;
+    }
+
+  return true;
+}
+
+void DataTypeCodecUtils::displayIpAddressV4_v(IpAddressV4 const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"IpAddressV4:");
+    stream.incrIndent();
+    stream.endOfLine();
+    stream.add((char *)"ipValue = ");
+    stream.add(data.ipValue);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+bool DataTypeCodecUtils::encodeIpAddressV6(MsgBuffer &buffer, IpAddressV6 const &data)
+{
+    if (!(DataTypeCodecUtils::encodeUint8Array16(buffer, data.ipValue)))
+    {
+        errorStream.add((char *)"Failed to encode ipValue\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool DataTypeCodecUtils::decodeIpAddressV6(MsgBuffer &buffer,IpAddressV6 &data,
+                         Uint16 length)
+{
+    
+    Uint16 typeBoundary = buffer.getCurrentIndex() + length;
+ Uint16   lengthLeft = typeBoundary - buffer.getCurrentIndex();
+    if (!(DataTypeCodecUtils::decodeUint8Array16(buffer, data.ipValue, lengthLeft, 0)))
+    {
+        errorStream.add((char *)"Failed to decode: ipValue\n");
+        return false;
+    }
+
+  return true;
+}
+
+void DataTypeCodecUtils::displayIpAddressV6_v(IpAddressV6 const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"IpAddressV6:");
+    stream.incrIndent();
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+bool DataTypeCodecUtils::encodeUint16Array16(MsgBuffer &buffer,
+ Uint16Array16 const &data)
+{
+    Uint16 i;
+    for (i = 0; i < data.count; i++)
+    {
+        buffer.writeUint16(data.values[i]);
+    }
+    return true;
+}
+
+bool DataTypeCodecUtils::decodeUint16Array16(MsgBuffer &buffer,
+ Uint16Array16 &data, Uint16 length, Uint16 count)
+{
+    Uint16 i = 0;
+    data.count = 0;
+    bool readTillEnd = (count == 0);
+    Uint16 startIndex = buffer.getCurrentIndex();
+    Uint16 typeBoundary = startIndex+length;
+    
+    while ((i < count)||(readTillEnd && (buffer.getCurrentIndex() < typeBoundary)))
+    {
+        buffer.readUint16(data.values[i]);
+        if (buffer.getCurrentIndex() > typeBoundary)
+        {
+            errorStream.add((char *)"Attempt to read beyond type boundary:Uint16Array16\n");
+            return false;
+        }
+        data.count++;
+        i++;
+    }
+	return true;
+}
+
+void DataTypeCodecUtils::displayUint16Array16_v(Uint16Array16 const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"Uint16Array16: Count: ");
+    stream.add(data.count);
+    stream.incrIndent();
+    stream.endOfLine();
+    Uint16 i;
+    for (i = 0; i < data.count; i++)
+    {
+        stream.add(data.values[i]);
+        stream.endOfLine();     
+    }
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+bool DataTypeCodecUtils::encodeUint8Array16(MsgBuffer &buffer,
+ Uint8Array16 const &data)
+{
+    Uint16 i;
+    for (i = 0; i < data.count; i++)
+    {
+        buffer.writeUint8(data.values[i]);
+    }
+    return true;
+}
+
+bool DataTypeCodecUtils::decodeUint8Array16(MsgBuffer &buffer,
+ Uint8Array16 &data, Uint16 length, Uint16 count)
+{
+    Uint16 i = 0;
+    data.count = 0;
+    bool readTillEnd = (count == 0);
+    Uint16 startIndex = buffer.getCurrentIndex();
+    Uint16 typeBoundary = startIndex+length;
+    
+    while ((i < count)||(readTillEnd && (buffer.getCurrentIndex() < typeBoundary)))
+    {
+        buffer.readUint8(data.values[i]);
+        if (buffer.getCurrentIndex() > typeBoundary)
+        {
+            errorStream.add((char *)"Attempt to read beyond type boundary:Uint8Array16\n");
+            return false;
+        }
+        data.count++;
+        i++;
+    }
+	return true;
+}
+
+void DataTypeCodecUtils::displayUint8Array16_v(Uint8Array16 const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"Uint8Array16: Count: ");
+    stream.add(data.count);
+    stream.incrIndent();
+    stream.endOfLine();
+    Uint16 i;
+    for (i = 0; i < data.count; i++)
+    {
+        stream.add(data.values[i]);
+        stream.endOfLine();     
+    }
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+bool DataTypeCodecUtils::encodeUint8Array32(MsgBuffer &buffer,
+ Uint8Array32 const &data)
+{
+    Uint16 i;
+    for (i = 0; i < data.count; i++)
+    {
+        buffer.writeUint8(data.values[i]);
+    }
+    return true;
+}
+
+bool DataTypeCodecUtils::decodeUint8Array32(MsgBuffer &buffer,
+ Uint8Array32 &data, Uint16 length, Uint16 count)
+{
+    Uint16 i = 0;
+    data.count = 0;
+    bool readTillEnd = (count == 0);
+    Uint16 startIndex = buffer.getCurrentIndex();
+    Uint16 typeBoundary = startIndex+length;
+    
+    while ((i < count)||(readTillEnd && (buffer.getCurrentIndex() < typeBoundary)))
+    {
+        buffer.readUint8(data.values[i]);
+        if (buffer.getCurrentIndex() > typeBoundary)
+        {
+            errorStream.add((char *)"Attempt to read beyond type boundary:Uint8Array32\n");
+            return false;
+        }
+        data.count++;
+        i++;
+    }
+	return true;
+}
+
+void DataTypeCodecUtils::displayUint8Array32_v(Uint8Array32 const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"Uint8Array32: Count: ");
+    stream.add(data.count);
+    stream.incrIndent();
+    stream.endOfLine();
+    Uint16 i;
+    for (i = 0; i < data.count; i++)
+    {
+        stream.add(data.values[i]);
+        stream.endOfLine();     
+    }
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+bool DataTypeCodecUtils::encodeUint8Array5(MsgBuffer &buffer,
+ Uint8Array5 const &data)
+{
+    Uint16 i;
+    for (i = 0; i < data.count; i++)
+    {
+        buffer.writeUint8(data.values[i]);
+    }
+    return true;
+}
+
+bool DataTypeCodecUtils::decodeUint8Array5(MsgBuffer &buffer,
+ Uint8Array5 &data, Uint16 length, Uint16 count)
+{
+    Uint16 i = 0;
+    data.count = 0;
+    bool readTillEnd = (count == 0);
+    Uint16 startIndex = buffer.getCurrentIndex();
+    Uint16 typeBoundary = startIndex+length;
+    
+    while ((i < count)||(readTillEnd && (buffer.getCurrentIndex() < typeBoundary)))
+    {
+        buffer.readUint8(data.values[i]);
+        if (buffer.getCurrentIndex() > typeBoundary)
+        {
+            errorStream.add((char *)"Attempt to read beyond type boundary:Uint8Array5\n");
+            return false;
+        }
+        data.count++;
+        i++;
+    }
+	return true;
+}
+
+void DataTypeCodecUtils::displayUint8Array5_v(Uint8Array5 const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"Uint8Array5: Count: ");
+    stream.add(data.count);
+    stream.incrIndent();
+    stream.endOfLine();
+    Uint16 i;
+    for (i = 0; i < data.count; i++)
+    {
+        stream.add(data.values[i]);
+        stream.endOfLine();     
+    }
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+bool DataTypeCodecUtils::encodeUint8Array4(MsgBuffer &buffer,
+ Uint8Array4 const &data)
+{
+    Uint16 i;
+    for (i = 0; i < data.count; i++)
+    {
+        buffer.writeUint8(data.values[i]);
+    }
+    return true;
+}
+
+bool DataTypeCodecUtils::decodeUint8Array4(MsgBuffer &buffer,
+ Uint8Array4 &data, Uint16 length, Uint16 count)
+{
+    Uint16 i = 0;
+    data.count = 0;
+    bool readTillEnd = (count == 0);
+    Uint16 startIndex = buffer.getCurrentIndex();
+    Uint16 typeBoundary = startIndex+length;
+    
+    while ((i < count)||(readTillEnd && (buffer.getCurrentIndex() < typeBoundary)))
+    {
+        buffer.readUint8(data.values[i]);
+        if (buffer.getCurrentIndex() > typeBoundary)
+        {
+            errorStream.add((char *)"Attempt to read beyond type boundary:Uint8Array4\n");
+            return false;
+        }
+        data.count++;
+        i++;
+    }
+	return true;
+}
+
+void DataTypeCodecUtils::displayUint8Array4_v(Uint8Array4 const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"Uint8Array4: Count: ");
+    stream.add(data.count);
+    stream.incrIndent();
+    stream.endOfLine();
+    Uint16 i;
+    for (i = 0; i < data.count; i++)
+    {
+        stream.add(data.values[i]);
+        stream.endOfLine();     
+    }
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+bool DataTypeCodecUtils::encodeUint8Array512(MsgBuffer &buffer,
+ Uint8Array512 const &data)
+{
+    Uint16 i;
+    for (i = 0; i < data.count; i++)
+    {
+        buffer.writeUint8(data.values[i]);
+    }
+    return true;
+}
+
+bool DataTypeCodecUtils::decodeUint8Array512(MsgBuffer &buffer,
+ Uint8Array512 &data, Uint16 length, Uint16 count)
+{
+    Uint16 i = 0;
+    data.count = 0;
+    bool readTillEnd = (count == 0);
+    Uint16 startIndex = buffer.getCurrentIndex();
+    Uint16 typeBoundary = startIndex+length;
+    
+    while ((i < count)||(readTillEnd && (buffer.getCurrentIndex() < typeBoundary)))
+    {
+        buffer.readUint8(data.values[i]);
+        if (buffer.getCurrentIndex() > typeBoundary)
+        {
+            errorStream.add((char *)"Attempt to read beyond type boundary:Uint8Array512\n");
+            return false;
+        }
+        data.count++;
+        i++;
+    }
+	return true;
+}
+
+void DataTypeCodecUtils::displayUint8Array512_v(Uint8Array512 const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"Uint8Array512: Count: ");
+    stream.add(data.count);
+    stream.incrIndent();
+    stream.endOfLine();
+    Uint16 i;
+    for (i = 0; i < data.count; i++)
+    {
+        stream.add(data.values[i]);
+        stream.endOfLine();     
+    }
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+bool DataTypeCodecUtils::encodeUint8Array255(MsgBuffer &buffer,
+ Uint8Array255 const &data)
+{
+    Uint16 i;
+    for (i = 0; i < data.count; i++)
+    {
+        buffer.writeUint8(data.values[i]);
+    }
+    return true;
+}
+
+bool DataTypeCodecUtils::decodeUint8Array255(MsgBuffer &buffer,
+ Uint8Array255 &data, Uint16 length, Uint16 count)
+{
+    Uint16 i = 0;
+    data.count = 0;
+    bool readTillEnd = (count == 0);
+    Uint16 startIndex = buffer.getCurrentIndex();
+    Uint16 typeBoundary = startIndex+length;
+    
+    while ((i < count)||(readTillEnd && (buffer.getCurrentIndex() < typeBoundary)))
+    {
+        buffer.readUint8(data.values[i]);
+        if (buffer.getCurrentIndex() > typeBoundary)
+        {
+            errorStream.add((char *)"Attempt to read beyond type boundary:Uint8Array255\n");
+            return false;
+        }
+        data.count++;
+        i++;
+    }
+	return true;
+}
+
+void DataTypeCodecUtils::displayUint8Array255_v(Uint8Array255 const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"Uint8Array255: Count: ");
+    stream.add(data.count);
+    stream.incrIndent();
+    stream.endOfLine();
+    Uint16 i;
+    for (i = 0; i < data.count; i++)
+    {
+        stream.add(data.values[i]);
+        stream.endOfLine();     
+    }
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+bool DataTypeCodecUtils::encodeCgiFieldArray64(MsgBuffer &buffer,
+ CgiFieldArray64 const &data)
+{
+    Uint16 i;
+    for (i = 0; i < data.count; i++)
+    {
+        if (!(DataTypeCodecUtils::encodeCgiField(buffer, data.values[i])))
+        {
+            errorStream.add((char *)"Failed to encode CgiFieldArray64\n");
+            return false;
+        }
+    }
+    return true;
+}
+
+bool DataTypeCodecUtils::decodeCgiFieldArray64(MsgBuffer &buffer,
+ CgiFieldArray64 &data, Uint16 length, Uint16 count)
+{
+    Uint16 i = 0;
+    data.count = 0;
+    bool readTillEnd = (count == 0);
+    Uint16 startIndex = buffer.getCurrentIndex();
+    Uint16 typeBoundary = startIndex+length;
+    
+    while ((i < count)||(readTillEnd && (buffer.getCurrentIndex() < typeBoundary)))
+    {
+        Uint16 lengthLeft = typeBoundary - buffer.getCurrentIndex();
+                 if (!(DataTypeCodecUtils::decodeCgiField(buffer, data.values[i], lengthLeft)))
+                 
+        {
+            errorStream.add((char *)"Failed to encode CgiFieldArray64\n");
+            return false;
+        }
+        if (buffer.getCurrentIndex() > typeBoundary)
+        {
+            errorStream.add((char *)"Attempt to read beyond type boundary:CgiFieldArray64\n");
+            return false;
+        }
+        data.count++;
+        i++;
+    }
+	return true;
+}
+
+void DataTypeCodecUtils::displayCgiFieldArray64_v(CgiFieldArray64 const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"CgiFieldArray64: Count: ");
+    stream.add(data.count);
+    stream.incrIndent();
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+bool DataTypeCodecUtils::encodeSaiFieldArray64(MsgBuffer &buffer,
+ SaiFieldArray64 const &data)
+{
+    Uint16 i;
+    for (i = 0; i < data.count; i++)
+    {
+        if (!(DataTypeCodecUtils::encodeSaiField(buffer, data.values[i])))
+        {
+            errorStream.add((char *)"Failed to encode SaiFieldArray64\n");
+            return false;
+        }
+    }
+    return true;
+}
+
+bool DataTypeCodecUtils::decodeSaiFieldArray64(MsgBuffer &buffer,
+ SaiFieldArray64 &data, Uint16 length, Uint16 count)
+{
+    Uint16 i = 0;
+    data.count = 0;
+    bool readTillEnd = (count == 0);
+    Uint16 startIndex = buffer.getCurrentIndex();
+    Uint16 typeBoundary = startIndex+length;
+    
+    while ((i < count)||(readTillEnd && (buffer.getCurrentIndex() < typeBoundary)))
+    {
+        Uint16 lengthLeft = typeBoundary - buffer.getCurrentIndex();
+                 if (!(DataTypeCodecUtils::decodeSaiField(buffer, data.values[i], lengthLeft)))
+                 
+        {
+            errorStream.add((char *)"Failed to encode SaiFieldArray64\n");
+            return false;
+        }
+        if (buffer.getCurrentIndex() > typeBoundary)
+        {
+            errorStream.add((char *)"Attempt to read beyond type boundary:SaiFieldArray64\n");
+            return false;
+        }
+        data.count++;
+        i++;
+    }
+	return true;
+}
+
+void DataTypeCodecUtils::displaySaiFieldArray64_v(SaiFieldArray64 const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"SaiFieldArray64: Count: ");
+    stream.add(data.count);
+    stream.incrIndent();
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+bool DataTypeCodecUtils::encodeEcgiFieldArray64(MsgBuffer &buffer,
+ EcgiFieldArray64 const &data)
+{
+    Uint16 i;
+    for (i = 0; i < data.count; i++)
+    {
+        if (!(DataTypeCodecUtils::encodeEcgiField(buffer, data.values[i])))
+        {
+            errorStream.add((char *)"Failed to encode EcgiFieldArray64\n");
+            return false;
+        }
+    }
+    return true;
+}
+
+bool DataTypeCodecUtils::decodeEcgiFieldArray64(MsgBuffer &buffer,
+ EcgiFieldArray64 &data, Uint16 length, Uint16 count)
+{
+    Uint16 i = 0;
+    data.count = 0;
+    bool readTillEnd = (count == 0);
+    Uint16 startIndex = buffer.getCurrentIndex();
+    Uint16 typeBoundary = startIndex+length;
+    
+    while ((i < count)||(readTillEnd && (buffer.getCurrentIndex() < typeBoundary)))
+    {
+        Uint16 lengthLeft = typeBoundary - buffer.getCurrentIndex();
+                 if (!(DataTypeCodecUtils::decodeEcgiField(buffer, data.values[i], lengthLeft)))
+                 
+        {
+            errorStream.add((char *)"Failed to encode EcgiFieldArray64\n");
+            return false;
+        }
+        if (buffer.getCurrentIndex() > typeBoundary)
+        {
+            errorStream.add((char *)"Attempt to read beyond type boundary:EcgiFieldArray64\n");
+            return false;
+        }
+        data.count++;
+        i++;
+    }
+	return true;
+}
+
+void DataTypeCodecUtils::displayEcgiFieldArray64_v(EcgiFieldArray64 const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"EcgiFieldArray64: Count: ");
+    stream.add(data.count);
+    stream.incrIndent();
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+bool DataTypeCodecUtils::encodeTaiFieldArray15(MsgBuffer &buffer,
+ TaiFieldArray15 const &data)
+{
+    Uint16 i;
+    for (i = 0; i < data.count; i++)
+    {
+        if (!(DataTypeCodecUtils::encodeTaiField(buffer, data.values[i])))
+        {
+            errorStream.add((char *)"Failed to encode TaiFieldArray15\n");
+            return false;
+        }
+    }
+    return true;
+}
+
+bool DataTypeCodecUtils::decodeTaiFieldArray15(MsgBuffer &buffer,
+ TaiFieldArray15 &data, Uint16 length, Uint16 count)
+{
+    Uint16 i = 0;
+    data.count = 0;
+    bool readTillEnd = (count == 0);
+    Uint16 startIndex = buffer.getCurrentIndex();
+    Uint16 typeBoundary = startIndex+length;
+    
+    while ((i < count)||(readTillEnd && (buffer.getCurrentIndex() < typeBoundary)))
+    {
+        Uint16 lengthLeft = typeBoundary - buffer.getCurrentIndex();
+                 if (!(DataTypeCodecUtils::decodeTaiField(buffer, data.values[i], lengthLeft)))
+                 
+        {
+            errorStream.add((char *)"Failed to encode TaiFieldArray15\n");
+            return false;
+        }
+        if (buffer.getCurrentIndex() > typeBoundary)
+        {
+            errorStream.add((char *)"Attempt to read beyond type boundary:TaiFieldArray15\n");
+            return false;
+        }
+        data.count++;
+        i++;
+    }
+	return true;
+}
+
+void DataTypeCodecUtils::displayTaiFieldArray15_v(TaiFieldArray15 const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"TaiFieldArray15: Count: ");
+    stream.add(data.count);
+    stream.incrIndent();
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+bool DataTypeCodecUtils::encodeRaiFieldArray15(MsgBuffer &buffer,
+ RaiFieldArray15 const &data)
+{
+    Uint16 i;
+    for (i = 0; i < data.count; i++)
+    {
+        if (!(DataTypeCodecUtils::encodeRaiField(buffer, data.values[i])))
+        {
+            errorStream.add((char *)"Failed to encode RaiFieldArray15\n");
+            return false;
+        }
+    }
+    return true;
+}
+
+bool DataTypeCodecUtils::decodeRaiFieldArray15(MsgBuffer &buffer,
+ RaiFieldArray15 &data, Uint16 length, Uint16 count)
+{
+    Uint16 i = 0;
+    data.count = 0;
+    bool readTillEnd = (count == 0);
+    Uint16 startIndex = buffer.getCurrentIndex();
+    Uint16 typeBoundary = startIndex+length;
+    
+    while ((i < count)||(readTillEnd && (buffer.getCurrentIndex() < typeBoundary)))
+    {
+        Uint16 lengthLeft = typeBoundary - buffer.getCurrentIndex();
+                 if (!(DataTypeCodecUtils::decodeRaiField(buffer, data.values[i], lengthLeft)))
+                 
+        {
+            errorStream.add((char *)"Failed to encode RaiFieldArray15\n");
+            return false;
+        }
+        if (buffer.getCurrentIndex() > typeBoundary)
+        {
+            errorStream.add((char *)"Attempt to read beyond type boundary:RaiFieldArray15\n");
+            return false;
+        }
+        data.count++;
+        i++;
+    }
+	return true;
+}
+
+void DataTypeCodecUtils::displayRaiFieldArray15_v(RaiFieldArray15 const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"RaiFieldArray15: Count: ");
+    stream.add(data.count);
+    stream.incrIndent();
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/dataTypeCodecUtils.h b/src/gtpV2Codec/ieClasses/dataTypeCodecUtils.h
new file mode 100644
index 0000000..d5ac028
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/dataTypeCodecUtils.h
@@ -0,0 +1,171 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/datatypetemplate.h.tt>
+ ******************************************************************************/
+
+#ifndef DATATYPECODECUTILS_H_
+#define DATATYPECODECUTILS_H_
+
+#include <sstream>
+#include <msgBuffer.h>
+#include "gtpV2IeDataTypes.h"
+#include "gtpV2DataTypes.h"
+#include "manual/gtpV2DataTypes_Manual.h"
+
+//TODO Includes
+
+class DataTypeCodecUtils {
+public:
+    DataTypeCodecUtils();
+    virtual ~DataTypeCodecUtils();
+
+
+    static bool encodeCgiField(MsgBuffer &buffer, CgiField const &data);
+    static bool decodeCgiField(MsgBuffer &buffer, CgiField &data,
+                 Uint16 length);
+    static void displayCgiField_v(CgiField const &data, Debug &stream);
+
+    static bool encodeOffendingIeData(MsgBuffer &buffer, OffendingIeData const &data);
+    static bool decodeOffendingIeData(MsgBuffer &buffer, OffendingIeData &data,
+                 Uint16 length);
+    static void displayOffendingIeData_v(OffendingIeData const &data, Debug &stream);
+
+    static bool encodeSaiField(MsgBuffer &buffer, SaiField const &data);
+    static bool decodeSaiField(MsgBuffer &buffer, SaiField &data,
+                 Uint16 length);
+    static void displaySaiField_v(SaiField const &data, Debug &stream);
+
+    static bool encodeRaiField(MsgBuffer &buffer, RaiField const &data);
+    static bool decodeRaiField(MsgBuffer &buffer, RaiField &data,
+                 Uint16 length);
+    static void displayRaiField_v(RaiField const &data, Debug &stream);
+
+    static bool encodeTaiField(MsgBuffer &buffer, TaiField const &data);
+    static bool decodeTaiField(MsgBuffer &buffer, TaiField &data,
+                 Uint16 length);
+    static void displayTaiField_v(TaiField const &data, Debug &stream);
+
+    static bool encodeEcgiField(MsgBuffer &buffer, EcgiField const &data);
+    static bool decodeEcgiField(MsgBuffer &buffer, EcgiField &data,
+                 Uint16 length);
+    static void displayEcgiField_v(EcgiField const &data, Debug &stream);
+
+    static bool encodeLaiField(MsgBuffer &buffer, LaiField const &data);
+    static bool decodeLaiField(MsgBuffer &buffer, LaiField &data,
+                 Uint16 length);
+    static void displayLaiField_v(LaiField const &data, Debug &stream);
+
+    static bool encodeIpAddressV4(MsgBuffer &buffer, IpAddressV4 const &data);
+    static bool decodeIpAddressV4(MsgBuffer &buffer, IpAddressV4 &data,
+                 Uint16 length);
+    static void displayIpAddressV4_v(IpAddressV4 const &data, Debug &stream);
+
+    static bool encodeIpAddressV6(MsgBuffer &buffer, IpAddressV6 const &data);
+    static bool decodeIpAddressV6(MsgBuffer &buffer, IpAddressV6 &data,
+                 Uint16 length);
+    static void displayIpAddressV6_v(IpAddressV6 const &data, Debug &stream);
+
+
+    // The following methods are generated to encode, decode and display array types
+
+    static bool encodeUint16Array16(MsgBuffer &buffer, Uint16Array16 const &data);
+    static bool decodeUint16Array16(MsgBuffer &buffer, Uint16Array16 &data,
+                 Uint16 length, Uint16 count);
+    static void displayUint16Array16_v(Uint16Array16 const &data, Debug &stream);
+
+
+    static bool encodeUint8Array16(MsgBuffer &buffer, Uint8Array16 const &data);
+    static bool decodeUint8Array16(MsgBuffer &buffer, Uint8Array16 &data,
+                 Uint16 length, Uint16 count);
+    static void displayUint8Array16_v(Uint8Array16 const &data, Debug &stream);
+
+
+    static bool encodeUint8Array32(MsgBuffer &buffer, Uint8Array32 const &data);
+    static bool decodeUint8Array32(MsgBuffer &buffer, Uint8Array32 &data,
+                 Uint16 length, Uint16 count);
+    static void displayUint8Array32_v(Uint8Array32 const &data, Debug &stream);
+
+
+    static bool encodeUint8Array5(MsgBuffer &buffer, Uint8Array5 const &data);
+    static bool decodeUint8Array5(MsgBuffer &buffer, Uint8Array5 &data,
+                 Uint16 length, Uint16 count);
+    static void displayUint8Array5_v(Uint8Array5 const &data, Debug &stream);
+
+
+    static bool encodeUint8Array4(MsgBuffer &buffer, Uint8Array4 const &data);
+    static bool decodeUint8Array4(MsgBuffer &buffer, Uint8Array4 &data,
+                 Uint16 length, Uint16 count);
+    static void displayUint8Array4_v(Uint8Array4 const &data, Debug &stream);
+
+
+    static bool encodeUint8Array512(MsgBuffer &buffer, Uint8Array512 const &data);
+    static bool decodeUint8Array512(MsgBuffer &buffer, Uint8Array512 &data,
+                 Uint16 length, Uint16 count);
+    static void displayUint8Array512_v(Uint8Array512 const &data, Debug &stream);
+
+
+    static bool encodeUint8Array255(MsgBuffer &buffer, Uint8Array255 const &data);
+    static bool decodeUint8Array255(MsgBuffer &buffer, Uint8Array255 &data,
+                 Uint16 length, Uint16 count);
+    static void displayUint8Array255_v(Uint8Array255 const &data, Debug &stream);
+
+
+    static bool encodeCgiFieldArray64(MsgBuffer &buffer, CgiFieldArray64 const &data);
+    static bool decodeCgiFieldArray64(MsgBuffer &buffer, CgiFieldArray64 &data,
+                 Uint16 length, Uint16 count);
+    static void displayCgiFieldArray64_v(CgiFieldArray64 const &data, Debug &stream);
+
+
+    static bool encodeSaiFieldArray64(MsgBuffer &buffer, SaiFieldArray64 const &data);
+    static bool decodeSaiFieldArray64(MsgBuffer &buffer, SaiFieldArray64 &data,
+                 Uint16 length, Uint16 count);
+    static void displaySaiFieldArray64_v(SaiFieldArray64 const &data, Debug &stream);
+
+
+    static bool encodeEcgiFieldArray64(MsgBuffer &buffer, EcgiFieldArray64 const &data);
+    static bool decodeEcgiFieldArray64(MsgBuffer &buffer, EcgiFieldArray64 &data,
+                 Uint16 length, Uint16 count);
+    static void displayEcgiFieldArray64_v(EcgiFieldArray64 const &data, Debug &stream);
+
+
+    static bool encodeTaiFieldArray15(MsgBuffer &buffer, TaiFieldArray15 const &data);
+    static bool decodeTaiFieldArray15(MsgBuffer &buffer, TaiFieldArray15 &data,
+                 Uint16 length, Uint16 count);
+    static void displayTaiFieldArray15_v(TaiFieldArray15 const &data, Debug &stream);
+
+
+    static bool encodeRaiFieldArray15(MsgBuffer &buffer, RaiFieldArray15 const &data);
+    static bool decodeRaiFieldArray15(MsgBuffer &buffer, RaiFieldArray15 &data,
+                 Uint16 length, Uint16 count);
+    static void displayRaiFieldArray15_v(RaiFieldArray15 const &data, Debug &stream);
+
+
+    // The following methods are to be written manually
+    // See DataTypeCodecUtils_Manual.cc for implementation
+
+    static bool encodeDigitRegister(MsgBuffer &buffer, DigitRegister const &data);
+    static bool decodeDigitRegister(MsgBuffer &buffer, DigitRegister &data,
+                 Uint16 length);
+    static void displayDigitRegister_v(DigitRegister const &data, Debug &stream);
+
+         
+};
+
+#endif /*DATATYPECODECUTILS_H_*/
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/delayValueIe.cpp b/src/gtpV2Codec/ieClasses/delayValueIe.cpp
new file mode 100644
index 0000000..a6504d4
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/delayValueIe.cpp
@@ -0,0 +1,87 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "delayValueIe.h"
+#include "dataTypeCodecUtils.h"
+
+DelayValueIe::DelayValueIe() 
+{
+    ieType = 92;
+    // TODO
+
+}
+
+DelayValueIe::~DelayValueIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool DelayValueIe::encodeDelayValueIe(MsgBuffer &buffer, DelayValueIeData const &data)
+{
+    if (!(data.delayValue% 50 == 0 || data.delayValue== 0))
+    {
+        errorStream.add((char *)"Data validation failure: delayValue\n");
+        return false; 
+    }
+    if (!(buffer.writeUint8(data.delayValue)))
+    {
+        errorStream.add((char *)"Encoding of delayValue failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool DelayValueIe::decodeDelayValueIe(MsgBuffer &buffer, DelayValueIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+
+    buffer.readUint8(data.delayValue);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: delayValue\n");
+        return false;
+    }
+    if (!(data.delayValue% 50 == 0 || data.delayValue== 0))
+    {
+        errorStream.add((char *)"Data validation failure : delayValue\n");
+        return false; //TODO need to add validations
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE DelayValueIe\n");
+        return false;
+    }
+}
+void DelayValueIe::displayDelayValueIe_v(DelayValueIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"DelayValueIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add((char *)"delayValue: ");
+    stream.add(data.delayValue);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/delayValueIe.h b/src/gtpV2Codec/ieClasses/delayValueIe.h
new file mode 100644
index 0000000..ff01eaf
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/delayValueIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef DELAYVALUEIE_H_
+#define DELAYVALUEIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class DelayValueIe: public GtpV2Ie {
+public:
+    DelayValueIe();
+    virtual ~DelayValueIe();
+
+    bool encodeDelayValueIe(MsgBuffer &buffer,
+                 DelayValueIeData const &data);
+    bool decodeDelayValueIe(MsgBuffer &buffer,
+                 DelayValueIeData &data, Uint16 length);
+    void displayDelayValueIe_v(DelayValueIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* DELAYVALUEIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/ebiIe.cpp b/src/gtpV2Codec/ieClasses/ebiIe.cpp
new file mode 100644
index 0000000..f58c7ad
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/ebiIe.cpp
@@ -0,0 +1,86 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "ebiIe.h"
+#include "dataTypeCodecUtils.h"
+
+EbiIe::EbiIe() 
+{
+    ieType = 73;
+    // TODO
+
+}
+
+EbiIe::~EbiIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool EbiIe::encodeEbiIe(MsgBuffer &buffer, EbiIeData const &data)
+{
+    buffer.skipBits(4);
+
+    if(!(buffer.writeBits(data.epsBearerId, 4)))
+    {
+        errorStream.add((char *)"Encoding of epsBearerId failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool EbiIe::decodeEbiIe(MsgBuffer &buffer, EbiIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+    buffer.skipBits(4);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: \n");
+        return false;
+    }
+
+    data.epsBearerId = buffer.readBits(4);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: epsBearerId\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE EbiIe\n");
+        return false;
+    }
+}
+void EbiIe::displayEbiIe_v(EbiIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"EbiIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add( (char *)"epsBearerId: "); 
+    stream.add((Uint8)data.epsBearerId);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/ebiIe.h b/src/gtpV2Codec/ieClasses/ebiIe.h
new file mode 100644
index 0000000..32ca2cc
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/ebiIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef EBIIE_H_
+#define EBIIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class EbiIe: public GtpV2Ie {
+public:
+    EbiIe();
+    virtual ~EbiIe();
+
+    bool encodeEbiIe(MsgBuffer &buffer,
+                 EbiIeData const &data);
+    bool decodeEbiIe(MsgBuffer &buffer,
+                 EbiIeData &data, Uint16 length);
+    void displayEbiIe_v(EbiIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* EBIIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/epcTimerIe.cpp b/src/gtpV2Codec/ieClasses/epcTimerIe.cpp
new file mode 100644
index 0000000..06309be
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/epcTimerIe.cpp
@@ -0,0 +1,93 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "epcTimerIe.h"
+#include "dataTypeCodecUtils.h"
+
+EpcTimerIe::EpcTimerIe() 
+{
+    ieType = 156;
+    // TODO
+
+}
+
+EpcTimerIe::~EpcTimerIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool EpcTimerIe::encodeEpcTimerIe(MsgBuffer &buffer, EpcTimerIeData const &data)
+{
+    if(!(buffer.writeBits(data.timerUnit, 3)))
+    {
+        errorStream.add((char *)"Encoding of timerUnit failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.timerValue, 5)))
+    {
+        errorStream.add((char *)"Encoding of timerValue failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool EpcTimerIe::decodeEpcTimerIe(MsgBuffer &buffer, EpcTimerIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+    data.timerUnit = buffer.readBits(3);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: timerUnit\n");
+        return false;
+    }
+    data.timerValue = buffer.readBits(5);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: timerValue\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE EpcTimerIe\n");
+        return false;
+    }
+}
+void EpcTimerIe::displayEpcTimerIe_v(EpcTimerIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"EpcTimerIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add( (char *)"timerUnit: "); 
+    stream.add((Uint8)data.timerUnit);
+    stream.endOfLine();
+  
+    stream.add( (char *)"timerValue: "); 
+    stream.add((Uint8)data.timerValue);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/epcTimerIe.h b/src/gtpV2Codec/ieClasses/epcTimerIe.h
new file mode 100644
index 0000000..cdb6056
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/epcTimerIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef EPCTIMERIE_H_
+#define EPCTIMERIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class EpcTimerIe: public GtpV2Ie {
+public:
+    EpcTimerIe();
+    virtual ~EpcTimerIe();
+
+    bool encodeEpcTimerIe(MsgBuffer &buffer,
+                 EpcTimerIeData const &data);
+    bool decodeEpcTimerIe(MsgBuffer &buffer,
+                 EpcTimerIeData &data, Uint16 length);
+    void displayEpcTimerIe_v(EpcTimerIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* EPCTIMERIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/epcoIe.cpp b/src/gtpV2Codec/ieClasses/epcoIe.cpp
new file mode 100644
index 0000000..8c9ed11
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/epcoIe.cpp
@@ -0,0 +1,78 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "epcoIe.h"
+#include "dataTypeCodecUtils.h"
+
+EpcoIe::EpcoIe() 
+{
+    ieType = 197;
+    // TODO
+
+}
+
+EpcoIe::~EpcoIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool EpcoIe::encodeEpcoIe(MsgBuffer &buffer, EpcoIeData const &data)
+{
+    if (!(DataTypeCodecUtils::encodeUint8Array16(buffer, data.epco)))
+    {
+    errorStream.add((char *)"Encoding of epco failed\n");
+    return false;
+    }
+
+    return true;
+}
+
+bool EpcoIe::decodeEpcoIe(MsgBuffer &buffer, EpcoIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+
+    Uint16 lengthLeft = length;
+    lengthLeft = ieBoundary - buffer.getCurrentIndex();
+    if (!(DataTypeCodecUtils::decodeUint8Array16(buffer, data.epco, lengthLeft, 0)))
+    {
+        errorStream.add((char *)"Failed to decode: epco\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE EpcoIe\n");
+        return false;
+    }
+}
+void EpcoIe::displayEpcoIe_v(EpcoIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"EpcoIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add((char *)"epco:");
+    stream.endOfLine();
+    DataTypeCodecUtils::displayUint8Array16_v(data.epco, stream);
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/epcoIe.h b/src/gtpV2Codec/ieClasses/epcoIe.h
new file mode 100644
index 0000000..2661c45
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/epcoIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef EPCOIE_H_
+#define EPCOIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class EpcoIe: public GtpV2Ie {
+public:
+    EpcoIe();
+    virtual ~EpcoIe();
+
+    bool encodeEpcoIe(MsgBuffer &buffer,
+                 EpcoIeData const &data);
+    bool decodeEpcoIe(MsgBuffer &buffer,
+                 EpcoIeData &data, Uint16 length);
+    void displayEpcoIe_v(EpcoIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* EPCOIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/epdgsOverloadControlInformationInModifyBearerRequest.cpp b/src/gtpV2Codec/ieClasses/epdgsOverloadControlInformationInModifyBearerRequest.cpp
new file mode 100644
index 0000000..9d7477c
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/epdgsOverloadControlInformationInModifyBearerRequest.cpp
@@ -0,0 +1,306 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "epdgsOverloadControlInformationInModifyBearerRequest.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+#include "epcTimerIe.h"
+
+EpdgsOverloadControlInformationInModifyBearerRequest::
+EpdgsOverloadControlInformationInModifyBearerRequest()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // overloadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // overloadReductionMetric
+    mandatoryIeSet.insert(mandIe);
+    mandIe = EpcTimerIeType;
+    mandIe = (mandIe << 8) | 0; // periodOfValidity
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+EpdgsOverloadControlInformationInModifyBearerRequest::
+~EpdgsOverloadControlInformationInModifyBearerRequest()
+{
+
+}
+bool EpdgsOverloadControlInformationInModifyBearerRequest::
+encodeEpdgsOverloadControlInformationInModifyBearerRequest(MsgBuffer &buffer,
+                         EpdgsOverloadControlInformationInModifyBearerRequestData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.overloadReductionMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadReductionMetric\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = EpcTimerIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    EpcTimerIe epcTimer=
+    dynamic_cast<
+    EpcTimerIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcTimerIeType));
+    rc = epcTimer.encodeEpcTimerIe(buffer, data.periodOfValidity);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: periodOfValidity\n");
+        return false;
+    }
+    return rc;
+}
+
+bool EpdgsOverloadControlInformationInModifyBearerRequest::
+decodeEpdgsOverloadControlInformationInModifyBearerRequest(MsgBuffer &buffer,
+                         EpdgsOverloadControlInformationInModifyBearerRequestData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.overloadReductionMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadReductionMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case EpcTimerIeType:
+            {
+                EpcTimerIe ieObject =
+                dynamic_cast<
+                EpcTimerIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(EpcTimerIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeEpcTimerIe(buffer, data.periodOfValidity, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: periodOfValidity\n");
+                        return false;
+                    }
+                    Uint16 mandIe = EpcTimerIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void EpdgsOverloadControlInformationInModifyBearerRequest::
+displayEpdgsOverloadControlInformationInModifyBearerRequestData_v
+(EpdgsOverloadControlInformationInModifyBearerRequestData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"EpdgsOverloadControlInformationInModifyBearerRequest:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/epdgsOverloadControlInformationInModifyBearerRequest.h b/src/gtpV2Codec/ieClasses/epdgsOverloadControlInformationInModifyBearerRequest.h
new file mode 100644
index 0000000..fe8f7f9
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/epdgsOverloadControlInformationInModifyBearerRequest.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef EPDGSOVERLOADCONTROLINFORMATIONINMODIFYBEARERREQUEST_H_
+#define EPDGSOVERLOADCONTROLINFORMATIONINMODIFYBEARERREQUEST_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class EpdgsOverloadControlInformationInModifyBearerRequest:public GtpV2GroupedIe
+{
+public:
+    EpdgsOverloadControlInformationInModifyBearerRequest();
+    virtual ~EpdgsOverloadControlInformationInModifyBearerRequest();
+    bool encodeEpdgsOverloadControlInformationInModifyBearerRequest(MsgBuffer &buffer,
+                             EpdgsOverloadControlInformationInModifyBearerRequestData
+                              const &data);
+
+    bool decodeEpdgsOverloadControlInformationInModifyBearerRequest (MsgBuffer &buffer,
+                             EpdgsOverloadControlInformationInModifyBearerRequestData 
+                             & data, Uint16 length);
+
+    void displayEpdgsOverloadControlInformationInModifyBearerRequestData_v
+    (EpdgsOverloadControlInformationInModifyBearerRequestData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/fContainerIe.cpp b/src/gtpV2Codec/ieClasses/fContainerIe.cpp
new file mode 100644
index 0000000..a387c44
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/fContainerIe.cpp
@@ -0,0 +1,112 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "fContainerIe.h"
+#include "dataTypeCodecUtils.h"
+
+FContainerIe::FContainerIe() 
+{
+    ieType = 118;
+    // TODO
+
+}
+
+FContainerIe::~FContainerIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool FContainerIe::encodeFContainerIe(MsgBuffer &buffer, FContainerIeData const &data)
+{
+    buffer.skipBits(4);
+
+    if (!(data.containerType<= 4))
+    {
+        errorStream.add((char *)"Data validation failure: containerType\n");
+        return false; 
+    }
+    if(!(buffer.writeBits(data.containerType, 4)))
+    {
+        errorStream.add((char *)"Encoding of containerType failed\n");
+        return false;
+    }
+    if (!(buffer.writeUint8(data.fContainerField)))
+    {
+        errorStream.add((char *)"Encoding of fContainerField failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool FContainerIe::decodeFContainerIe(MsgBuffer &buffer, FContainerIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+    buffer.skipBits(4);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: \n");
+        return false;
+    }
+
+    data.containerType = buffer.readBits(4);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: containerType\n");
+        return false;
+    }
+    if (!(data.containerType<= 4))
+    {
+        errorStream.add((char *)"Data validation failure : containerType\n");
+        return false; //TODO need to add validations
+    }
+
+    buffer.readUint8(data.fContainerField);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: fContainerField\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE FContainerIe\n");
+        return false;
+    }
+}
+void FContainerIe::displayFContainerIe_v(FContainerIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"FContainerIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add( (char *)"containerType: "); 
+    stream.add((Uint8)data.containerType);
+    stream.endOfLine();
+  
+    stream.add((char *)"fContainerField: ");
+    stream.add(data.fContainerField);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/fContainerIe.h b/src/gtpV2Codec/ieClasses/fContainerIe.h
new file mode 100644
index 0000000..298cbe2
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/fContainerIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef FCONTAINERIE_H_
+#define FCONTAINERIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class FContainerIe: public GtpV2Ie {
+public:
+    FContainerIe();
+    virtual ~FContainerIe();
+
+    bool encodeFContainerIe(MsgBuffer &buffer,
+                 FContainerIeData const &data);
+    bool decodeFContainerIe(MsgBuffer &buffer,
+                 FContainerIeData &data, Uint16 length);
+    void displayFContainerIe_v(FContainerIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* FCONTAINERIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/fTeidIe.cpp b/src/gtpV2Codec/ieClasses/fTeidIe.cpp
new file mode 100644
index 0000000..250d168
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/fTeidIe.cpp
@@ -0,0 +1,177 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "fTeidIe.h"
+#include "dataTypeCodecUtils.h"
+
+FTeidIe::FTeidIe() 
+{
+    ieType = 87;
+    // TODO
+
+}
+
+FTeidIe::~FTeidIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool FTeidIe::encodeFTeidIe(MsgBuffer &buffer, FTeidIeData const &data)
+{
+    if(!(buffer.writeBits(data.ipv4present, 1)))
+    {
+        errorStream.add((char *)"Encoding of ipv4present failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.ipv6present, 1)))
+    {
+        errorStream.add((char *)"Encoding of ipv6present failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.interfaceType, 6)))
+    {
+        errorStream.add((char *)"Encoding of interfaceType failed\n");
+        return false;
+    }
+    if (!(buffer.writeUint32(data.teidGreKey)))
+    {
+        errorStream.add((char *)"Encoding of teidGreKey failed\n");
+        return false;
+    }
+    if (data.ipv4present)
+    {
+        if (!(DataTypeCodecUtils::encodeIpAddressV4(buffer, data.ipV4Address)))
+        {
+            errorStream.add((char *)"Encoding of ipV4Address failed\n");
+            return false;
+        }
+    }
+    if (data.ipv6present)
+    {
+        if (!(DataTypeCodecUtils::encodeIpAddressV6(buffer, data.ipV6Address)))
+        {
+            errorStream.add((char *)"Encoding of ipV6Address failed\n");
+            return false;
+        }
+    }
+
+    return true;
+}
+
+bool FTeidIe::decodeFTeidIe(MsgBuffer &buffer, FTeidIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+    data.ipv4present = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: ipv4present\n");
+        return false;
+    }
+    data.ipv6present = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: ipv6present\n");
+        return false;
+    }
+    data.interfaceType = buffer.readBits(6);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: interfaceType\n");
+        return false;
+    }
+
+    buffer.readUint32(data.teidGreKey);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: teidGreKey\n");
+        return false;
+    }
+
+    Uint16 lengthLeft = length;
+
+    if (data.ipv4present)
+    {
+        lengthLeft = ieBoundary - buffer.getCurrentIndex();
+        if (!(DataTypeCodecUtils::decodeIpAddressV4(buffer, data.ipV4Address, lengthLeft)))
+        {
+            errorStream.add((char *)"Failed to decode: ipV4Address\n");
+            return false;
+        }
+    }
+
+    if (data.ipv6present)
+    {
+        lengthLeft = ieBoundary - buffer.getCurrentIndex();
+        if (!(DataTypeCodecUtils::decodeIpAddressV6(buffer, data.ipV6Address, lengthLeft)))
+        {
+            errorStream.add((char *)"Failed to decode: ipV6Address\n");
+            return false;
+        }
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE FTeidIe\n");
+        return false;
+    }
+}
+void FTeidIe::displayFTeidIe_v(FTeidIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"FTeidIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add( (char *)"ipv4present: "); 
+    stream.add((Uint8)data.ipv4present);
+    stream.endOfLine();
+  
+    stream.add( (char *)"ipv6present: "); 
+    stream.add((Uint8)data.ipv6present);
+    stream.endOfLine();
+  
+    stream.add( (char *)"interfaceType: "); 
+    stream.add((Uint8)data.interfaceType);
+    stream.endOfLine();
+  
+    stream.add((char *)"teidGreKey: ");
+    stream.add(data.teidGreKey);
+    stream.endOfLine();
+  
+    if (data.ipv4present)
+    {
+        stream.add((char *)"ipV4Address:");
+        stream.endOfLine();
+        DataTypeCodecUtils::displayIpAddressV4_v(data.ipV4Address, stream);
+    }
+  
+    if (data.ipv6present)
+    {
+        stream.add((char *)"ipV6Address:");
+        stream.endOfLine();
+        DataTypeCodecUtils::displayIpAddressV6_v(data.ipV6Address, stream);
+    }
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/fTeidIe.h b/src/gtpV2Codec/ieClasses/fTeidIe.h
new file mode 100644
index 0000000..8e8d75c
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/fTeidIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef FTEIDIE_H_
+#define FTEIDIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class FTeidIe: public GtpV2Ie {
+public:
+    FTeidIe();
+    virtual ~FTeidIe();
+
+    bool encodeFTeidIe(MsgBuffer &buffer,
+                 FTeidIeData const &data);
+    bool decodeFTeidIe(MsgBuffer &buffer,
+                 FTeidIeData &data, Uint16 length);
+    void displayFTeidIe_v(FTeidIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* FTEIDIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/failedBearerContextsInDeleteBearerRequest.cpp b/src/gtpV2Codec/ieClasses/failedBearerContextsInDeleteBearerRequest.cpp
new file mode 100644
index 0000000..522341c
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/failedBearerContextsInDeleteBearerRequest.cpp
@@ -0,0 +1,244 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "failedBearerContextsInDeleteBearerRequest.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "ebiIe.h"
+#include "causeIe.h"
+
+FailedBearerContextsInDeleteBearerRequest::
+FailedBearerContextsInDeleteBearerRequest()
+{
+    Uint16 mandIe;
+    mandIe = EbiIeType;
+    mandIe = (mandIe << 8) | 0; // epsBearerId
+    mandatoryIeSet.insert(mandIe);
+    mandIe = CauseIeType;
+    mandIe = (mandIe << 8) | 0; // cause
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+FailedBearerContextsInDeleteBearerRequest::
+~FailedBearerContextsInDeleteBearerRequest()
+{
+
+}
+bool FailedBearerContextsInDeleteBearerRequest::
+encodeFailedBearerContextsInDeleteBearerRequest(MsgBuffer &buffer,
+                         FailedBearerContextsInDeleteBearerRequestData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = EbiIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    EbiIe ebi=
+    dynamic_cast<
+    EbiIe&>(GtpV2IeFactory::getInstance().getIeObject(EbiIeType));
+    rc = ebi.encodeEbiIe(buffer, data.epsBearerId);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: epsBearerId\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = CauseIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    CauseIe cause=
+    dynamic_cast<
+    CauseIe&>(GtpV2IeFactory::getInstance().getIeObject(CauseIeType));
+    rc = cause.encodeCauseIe(buffer, data.cause);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: cause\n");
+        return false;
+    }
+    return rc;
+}
+
+bool FailedBearerContextsInDeleteBearerRequest::
+decodeFailedBearerContextsInDeleteBearerRequest(MsgBuffer &buffer,
+                         FailedBearerContextsInDeleteBearerRequestData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case EbiIeType:
+            {
+                EbiIe ieObject =
+                dynamic_cast<
+                EbiIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(EbiIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeEbiIe(buffer, data.epsBearerId, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: epsBearerId\n");
+                        return false;
+                    }
+                    Uint16 mandIe = EbiIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case CauseIeType:
+            {
+                CauseIe ieObject =
+                dynamic_cast<
+                CauseIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(CauseIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeCauseIe(buffer, data.cause, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: cause\n");
+                        return false;
+                    }
+                    Uint16 mandIe = CauseIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void FailedBearerContextsInDeleteBearerRequest::
+displayFailedBearerContextsInDeleteBearerRequestData_v
+(FailedBearerContextsInDeleteBearerRequestData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"FailedBearerContextsInDeleteBearerRequest:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/failedBearerContextsInDeleteBearerRequest.h b/src/gtpV2Codec/ieClasses/failedBearerContextsInDeleteBearerRequest.h
new file mode 100644
index 0000000..c2c9ea0
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/failedBearerContextsInDeleteBearerRequest.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef FAILEDBEARERCONTEXTSINDELETEBEARERREQUEST_H_
+#define FAILEDBEARERCONTEXTSINDELETEBEARERREQUEST_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class FailedBearerContextsInDeleteBearerRequest:public GtpV2GroupedIe
+{
+public:
+    FailedBearerContextsInDeleteBearerRequest();
+    virtual ~FailedBearerContextsInDeleteBearerRequest();
+    bool encodeFailedBearerContextsInDeleteBearerRequest(MsgBuffer &buffer,
+                             FailedBearerContextsInDeleteBearerRequestData
+                              const &data);
+
+    bool decodeFailedBearerContextsInDeleteBearerRequest (MsgBuffer &buffer,
+                             FailedBearerContextsInDeleteBearerRequestData 
+                             & data, Uint16 length);
+
+    void displayFailedBearerContextsInDeleteBearerRequestData_v
+    (FailedBearerContextsInDeleteBearerRequestData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/fqCsidIe.cpp b/src/gtpV2Codec/ieClasses/fqCsidIe.cpp
new file mode 100644
index 0000000..aa43dbe
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/fqCsidIe.cpp
@@ -0,0 +1,186 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "fqCsidIe.h"
+#include "dataTypeCodecUtils.h"
+
+FqCsidIe::FqCsidIe() 
+{
+    ieType = 132;
+    // TODO
+
+}
+
+FqCsidIe::~FqCsidIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool FqCsidIe::encodeFqCsidIe(MsgBuffer &buffer, FqCsidIeData const &data)
+{
+    if(!(buffer.writeBits(data.nodeIdType, 4)))
+    {
+        errorStream.add((char *)"Encoding of nodeIdType failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.numberOfCsids, 4)))
+    {
+        errorStream.add((char *)"Encoding of numberOfCsids failed\n");
+        return false;
+    }
+    if (data.nodeIdType == 0)
+    {
+        if (!(DataTypeCodecUtils::encodeIpAddressV4(buffer, data.nodeIdIpv4)))
+        {
+            errorStream.add((char *)"Encoding of nodeIdIpv4 failed\n");
+            return false;
+        }
+    }
+    if (data.nodeIdType == 1)
+    {
+        if (!(DataTypeCodecUtils::encodeIpAddressV6(buffer, data.nodeIdIpv6)))
+        {
+            errorStream.add((char *)"Encoding of nodeIdIpv6 failed\n");
+            return false;
+        }
+    }
+    if (data.nodeIdType == 2)
+    {
+        if (!(buffer.writeUint32(data.nodeIdUint32)))
+        {
+    errorStream.add((char *)"Encoding of nodeIdUint32 failed\n");
+    return false;
+        }
+    }
+    if (!(DataTypeCodecUtils::encodeUint16Array16(buffer, data.csidList)))
+    {
+    errorStream.add((char *)"Encoding of csidList failed\n");
+    return false;
+    }
+
+    return true;
+}
+
+bool FqCsidIe::decodeFqCsidIe(MsgBuffer &buffer, FqCsidIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+    data.nodeIdType = buffer.readBits(4);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: nodeIdType\n");
+        return false;
+    }
+    data.numberOfCsids = buffer.readBits(4);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: numberOfCsids\n");
+        return false;
+    }
+
+    Uint16 lengthLeft = length;
+
+    if (data.nodeIdType == 0)
+    {
+        lengthLeft = ieBoundary - buffer.getCurrentIndex();
+        if (!(DataTypeCodecUtils::decodeIpAddressV4(buffer, data.nodeIdIpv4, lengthLeft)))
+        {
+            errorStream.add((char *)"Failed to decode: nodeIdIpv4\n");
+            return false;
+        }
+    }
+
+    if (data.nodeIdType == 1)
+    {
+        lengthLeft = ieBoundary - buffer.getCurrentIndex();
+        if (!(DataTypeCodecUtils::decodeIpAddressV6(buffer, data.nodeIdIpv6, lengthLeft)))
+        {
+            errorStream.add((char *)"Failed to decode: nodeIdIpv6\n");
+            return false;
+        }
+    }
+
+    if (data.nodeIdType == 2)
+    {
+
+        buffer.readUint32(data.nodeIdUint32);
+        if (buffer.getCurrentIndex() > ieBoundary)
+        {
+            errorStream.add((char *)"Attempt to read beyond IE boundary: nodeIdUint32\n");
+            return false;
+        }
+    }
+    lengthLeft = ieBoundary - buffer.getCurrentIndex();
+    if (!(DataTypeCodecUtils::decodeUint16Array16(buffer, data.csidList, lengthLeft, data.numberOfCsids)))
+    {
+        errorStream.add((char *)"Failed to decode: csidList\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE FqCsidIe\n");
+        return false;
+    }
+}
+void FqCsidIe::displayFqCsidIe_v(FqCsidIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"FqCsidIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add( (char *)"nodeIdType: "); 
+    stream.add((Uint8)data.nodeIdType);
+    stream.endOfLine();
+  
+    stream.add( (char *)"numberOfCsids: "); 
+    stream.add((Uint8)data.numberOfCsids);
+    stream.endOfLine();
+  
+    if (data.nodeIdType == 0)
+    {
+        stream.add((char *)"nodeIdIpv4:");
+        stream.endOfLine();
+        DataTypeCodecUtils::displayIpAddressV4_v(data.nodeIdIpv4, stream);
+    }
+  
+    if (data.nodeIdType == 1)
+    {
+        stream.add((char *)"nodeIdIpv6:");
+        stream.endOfLine();
+        DataTypeCodecUtils::displayIpAddressV6_v(data.nodeIdIpv6, stream);
+    }
+  
+    if (data.nodeIdType == 2)
+    {
+        stream.add((char *)"nodeIdUint32: ");
+        stream.add(data.nodeIdUint32);
+        stream.endOfLine();
+    }
+  
+    stream.add((char *)"csidList:");
+    stream.endOfLine();
+    DataTypeCodecUtils::displayUint16Array16_v(data.csidList, stream);
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/fqCsidIe.h b/src/gtpV2Codec/ieClasses/fqCsidIe.h
new file mode 100644
index 0000000..316673b
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/fqCsidIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef FQCSIDIE_H_
+#define FQCSIDIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class FqCsidIe: public GtpV2Ie {
+public:
+    FqCsidIe();
+    virtual ~FqCsidIe();
+
+    bool encodeFqCsidIe(MsgBuffer &buffer,
+                 FqCsidIeData const &data);
+    bool decodeFqCsidIe(MsgBuffer &buffer,
+                 FqCsidIeData &data, Uint16 length);
+    void displayFqCsidIe_v(FqCsidIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* FQCSIDIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/fqdnIe.cpp b/src/gtpV2Codec/ieClasses/fqdnIe.cpp
new file mode 100644
index 0000000..377c73f
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/fqdnIe.cpp
@@ -0,0 +1,78 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "fqdnIe.h"
+#include "dataTypeCodecUtils.h"
+
+FqdnIe::FqdnIe() 
+{
+    ieType = 136;
+    // TODO
+
+}
+
+FqdnIe::~FqdnIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool FqdnIe::encodeFqdnIe(MsgBuffer &buffer, FqdnIeData const &data)
+{
+    if (!(DataTypeCodecUtils::encodeUint8Array32(buffer, data.fqdn)))
+    {
+    errorStream.add((char *)"Encoding of fqdn failed\n");
+    return false;
+    }
+
+    return true;
+}
+
+bool FqdnIe::decodeFqdnIe(MsgBuffer &buffer, FqdnIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+
+    Uint16 lengthLeft = length;
+    lengthLeft = ieBoundary - buffer.getCurrentIndex();
+    if (!(DataTypeCodecUtils::decodeUint8Array32(buffer, data.fqdn, lengthLeft, 0)))
+    {
+        errorStream.add((char *)"Failed to decode: fqdn\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE FqdnIe\n");
+        return false;
+    }
+}
+void FqdnIe::displayFqdnIe_v(FqdnIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"FqdnIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add((char *)"fqdn:");
+    stream.endOfLine();
+    DataTypeCodecUtils::displayUint8Array32_v(data.fqdn, stream);
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/fqdnIe.h b/src/gtpV2Codec/ieClasses/fqdnIe.h
new file mode 100644
index 0000000..d9095f0
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/fqdnIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef FQDNIE_H_
+#define FQDNIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class FqdnIe: public GtpV2Ie {
+public:
+    FqdnIe();
+    virtual ~FqdnIe();
+
+    bool encodeFqdnIe(MsgBuffer &buffer,
+                 FqdnIeData const &data);
+    bool decodeFqdnIe(MsgBuffer &buffer,
+                 FqdnIeData &data, Uint16 length);
+    void displayFqdnIe_v(FqdnIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* FQDNIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/gtpV2DataTypes.h b/src/gtpV2Codec/ieClasses/gtpV2DataTypes.h
new file mode 100644
index 0000000..6b3ef1c
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/gtpV2DataTypes.h
@@ -0,0 +1,200 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/v2DataTypetemplate.h.tt>
+ ******************************************************************************/
+#ifndef GTPV2DATATYPES_H_
+#define GTPV2DATATYPES_H_
+#include <basicTypes.h>
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
+typedef struct
+{
+    Uint16 count;
+    Uint8 values[16];
+
+}Uint8Array16;
+    
+typedef struct
+{
+    Uint8 mccDigit2;
+    Uint8 mccDigit1;
+    Uint8 mncDigit3;
+    Uint8 mccDigit3;
+    Uint8 mncDigit2;
+    Uint8 mncDigit1;
+    Uint16 locationAreaCode;
+    Uint16 cellIdentity;
+}CgiField;
+
+typedef struct
+{
+    Uint8 typeOfOffendingIe;
+    Uint16 lengthOfOffendingIe;
+    Uint8 instanceOfOffendingIe;
+}OffendingIeData;
+
+typedef struct
+{
+    Uint8 mccDigit2;
+    Uint8 mccDigit1;
+    Uint8 mncDigit3;
+    Uint8 mccDigit3;
+    Uint8 mncDigit2;
+    Uint8 mncDigit1;
+    Uint16 locationAreaCode;
+    Uint16 serviceAreaCode;
+}SaiField;
+
+typedef struct
+{
+    Uint8 mccDigit2;
+    Uint8 mccDigit1;
+    Uint8 mncDigit3;
+    Uint8 mccDigit3;
+    Uint8 mncDigit2;
+    Uint8 mncDigit1;
+    Uint16 locationAreaCode;
+    Uint16 routintAreaCode;
+}RaiField;
+
+typedef struct
+{
+    Uint8 mccDigit2;
+    Uint8 mccDigit1;
+    Uint8 mncDigit3;
+    Uint8 mccDigit3;
+    Uint8 mncDigit2;
+    Uint8 mncDigit1;
+    Uint16 trackingAreaCode;
+}TaiField;
+
+typedef struct
+{
+    Uint8 mccDigit2;
+    Uint8 mccDigit1;
+    Uint8 mncDigit3;
+    Uint8 mccDigit3;
+    Uint8 mncDigit2;
+    Uint8 mncDigit1;
+    Uint32 eUtranCellId;
+}EcgiField;
+
+typedef struct
+{
+    Uint8 mccDigit2;
+    Uint8 mccDigit1;
+    Uint8 mncDigit3;
+    Uint8 mccDigit3;
+    Uint8 mncDigit2;
+    Uint8 mncDigit1;
+    Uint16 locationAreaCode;
+}LaiField;
+
+typedef struct
+{
+    Uint32 ipValue;
+}IpAddressV4;
+
+typedef struct
+{
+    Uint8Array16 ipValue;
+}IpAddressV6;
+
+
+                        
+typedef struct
+{
+    Uint16 count;
+    Uint16 values[16];
+
+}Uint16Array16;
+                    
+            
+                                        
+typedef struct
+{
+    Uint16 count;
+    Uint8 values[32];
+
+}Uint8Array32;
+                            
+typedef struct
+{
+    Uint16 count;
+    Uint8 values[5];
+
+}Uint8Array5;
+                            
+typedef struct
+{
+    Uint16 count;
+    Uint8 values[4];
+
+}Uint8Array4;
+                            
+typedef struct
+{
+    Uint16 count;
+    Uint8 values[512];
+
+}Uint8Array512;
+                            
+typedef struct
+{
+    Uint16 count;
+    Uint8 values[255];
+
+}Uint8Array255;
+                            
+typedef struct
+{
+    Uint16 count;
+    CgiField values[64];
+
+}CgiFieldArray64;
+                            
+typedef struct
+{
+    Uint16 count;
+    SaiField values[64];
+
+}SaiFieldArray64;
+                            
+typedef struct
+{
+    Uint16 count;
+    EcgiField values[64];
+
+}EcgiFieldArray64;
+                            
+typedef struct
+{
+    Uint16 count;
+    TaiField values[15];
+
+}TaiFieldArray15;
+                            
+typedef struct
+{
+    Uint16 count;
+    RaiField values[15];
+
+}RaiFieldArray15;
+    
+#endif 
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/gtpV2GrpIeDataTypes.h b/src/gtpV2Codec/ieClasses/gtpV2GrpIeDataTypes.h
new file mode 100644
index 0000000..3d8f880
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/gtpV2GrpIeDataTypes.h
@@ -0,0 +1,677 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/grpIeDataTypetemplate.h.tt>
+ ******************************************************************************/
+#ifndef GTPV2GRPIEDATATYPES_H_
+#define GTPV2GRPIEDATATYPES_H_
+
+#include "../../gtpV2Codec/ieClasses/gtpV2IeDataTypes.h"
+
+typedef struct
+{
+    bool s1EnodebFTeidIePresent;    
+    bool s58USgwFTeidIePresent;    
+    bool s12RncFTeidIePresent;    
+    bool s4USgsnFTeidIePresent;    
+    bool s11UMmeFTeidIePresent;    
+
+    EbiIeData epsBearerId;    
+    FTeidIeData s1EnodebFTeid;    
+    FTeidIeData s58USgwFTeid;    
+    FTeidIeData s12RncFTeid;    
+    FTeidIeData s4USgsnFTeid;    
+    FTeidIeData s11UMmeFTeid;    
+
+}BearerContextsToBeModifiedInModifyBearerRequestData;
+
+typedef struct
+{
+
+    EbiIeData epsBearerId;    
+
+}BearerContextsToBeRemovedInModifyBearerRequestData;
+
+typedef struct
+{
+
+    EbiIeData epsBearerId;    
+    CauseIeData cause;    
+
+}BearerContextsMarkedForRemovalInModifyBearerResponseData;
+
+typedef struct
+{
+    bool s1USgwFTeidIePresent;    
+    bool s12SgwFTeidIePresent;    
+    bool s4USgwFTeidIePresent;    
+    bool chargingIdIePresent;    
+    bool bearerFlagsIePresent;    
+    bool s11USgwFTeidIePresent;    
+
+    EbiIeData epsBearerId;    
+    CauseIeData cause;    
+    FTeidIeData s1USgwFTeid;    
+    FTeidIeData s12SgwFTeid;    
+    FTeidIeData s4USgwFTeid;    
+    ChargingIdIeData chargingId;    
+    BearerFlagsIeData bearerFlags;    
+    FTeidIeData s11USgwFTeid;    
+
+}BearerContextsModifiedInModifyBearerResponseData;
+
+typedef struct
+{
+    bool tftIePresent;    
+    bool s1UEnodebFTeidIePresent;    
+    bool s4USgsnFTeidIePresent;    
+    bool s5S8USgwFTeidIePresent;    
+    bool s5S8UPgwFTeidIePresent;    
+    bool s12RncFTeidIePresent;    
+    bool s2bUEpdgFTeidIePresent;    
+    bool s2aUTwanFTeidIePresent;    
+    bool s11UMmeFTeidIePresent;    
+
+    EbiIeData epsBearerId;    
+    BearerTftIeData tft;    
+    FTeidIeData s1UEnodebFTeid;    
+    FTeidIeData s4USgsnFTeid;    
+    FTeidIeData s5S8USgwFTeid;    
+    FTeidIeData s5S8UPgwFTeid;    
+    FTeidIeData s12RncFTeid;    
+    FTeidIeData s2bUEpdgFTeid;    
+    FTeidIeData s2aUTwanFTeid;    
+    BearerQosIeData bearerLevelQos;    
+    FTeidIeData s11UMmeFTeid;    
+
+}BearerContextsToBeCreatedInCreateSessionRequestData;
+
+typedef struct
+{
+    bool s4USgsnFTeidIePresent;    
+
+    EbiIeData epsBearerId;    
+    FTeidIeData s4USgsnFTeid;    
+
+}BearerContextsToBeRemovedInCreateSessionRequestData;
+
+typedef struct
+{
+    bool s1USgwFTeidIePresent;    
+    bool s4USgwFTeidIePresent;    
+    bool s5S8UPgwFTeidIePresent;    
+    bool s12SgwFTeidIePresent;    
+    bool s2bUPgwFTeidIePresent;    
+    bool s2aUPgwFTeidIePresent;    
+    bool bearerLevelQosIePresent;    
+    bool chargingIdIePresent;    
+    bool bearerFlagsIePresent;    
+    bool s11USgwFTeidIePresent;    
+
+    EbiIeData epsBearerId;    
+    CauseIeData cause;    
+    FTeidIeData s1USgwFTeid;    
+    FTeidIeData s4USgwFTeid;    
+    FTeidIeData s5S8UPgwFTeid;    
+    FTeidIeData s12SgwFTeid;    
+    FTeidIeData s2bUPgwFTeid;    
+    FTeidIeData s2aUPgwFTeid;    
+    BearerQosIeData bearerLevelQos;    
+    ChargingIdIeData chargingId;    
+    BearerFlagsIeData bearerFlags;    
+    FTeidIeData s11USgwFTeid;    
+
+}BearerContextsCreatedInCreateSessionResponseData;
+
+typedef struct
+{
+
+    EbiIeData epsBearerId;    
+    CauseIeData cause;    
+
+}BearerContextsMarkedForRemovalInCreateSessionResponseData;
+
+typedef struct
+{
+
+    SequenceNumberIeData overloadControlSequenceNumber;    
+    MetricIeData overloadReductionMetric;    
+    EpcTimerIeData periodOfValidity;    
+
+}SgwsOverloadControlInformationInCreateSessionRequestData;
+
+typedef struct
+{
+
+    SequenceNumberIeData overloadControlSequenceNumber;    
+    MetricIeData overloadReductionMetric;    
+    EpcTimerIeData periodOfValidity;    
+
+}TwanEpdgsOverloadControlInformationInCreateSessionRequestData;
+
+typedef struct
+{
+
+    SequenceNumberIeData overloadControlSequenceNumber;    
+    MetricIeData overloadReductionMetric;    
+    EpcTimerIeData periodOfValidity;    
+
+}MmeS4SgsnsOverloadControlInformationInCreateSessionRequestData;
+
+typedef struct
+{
+
+    RemoteUserIdIeData remoteUserId;    
+    RemoteUeIpInformationIeData remoteUeIpInformation;    
+
+}RemoteUeContextConnectedInCreateSessionRequestData;
+
+typedef struct
+{
+    bool listOfAccessPointNameIePresent;    
+
+    SequenceNumberIeData overloadControlSequenceNumber;    
+    MetricIeData overloadReductionMetric;    
+    EpcTimerIeData periodOfValidity;    
+    ApnIeData listOfAccessPointName;    
+
+}PgwsOverloadControlInformationInCreateSessionResponseData;
+
+typedef struct
+{
+    bool listOfAccessPointNameIePresent;    
+
+    SequenceNumberIeData overloadControlSequenceNumber;    
+    MetricIeData overloadReductionMetric;    
+    EpcTimerIeData periodOfValidity;    
+    ApnIeData listOfAccessPointName;    
+
+}SgwsOverloadControlInformationInCreateSessionResponseData;
+
+typedef struct
+{
+
+    SequenceNumberIeData loadControlSequenceNumber;    
+    MetricIeData loadMetric;    
+    ApnAndRelativeCapacityIeData listOfApnAndRelativeCapacity;    
+
+}PgwsNodeLevelLoadControlInformationInCreateSessionResponseData;
+
+typedef struct
+{
+
+    SequenceNumberIeData loadControlSequenceNumber;    
+    MetricIeData loadMetric;    
+    ApnAndRelativeCapacityIeData listOfApnAndRelativeCapacity;    
+
+}PgwsApnLevelLoadControlInformationInCreateSessionResponseData;
+
+typedef struct
+{
+
+    SequenceNumberIeData loadControlSequenceNumber;    
+    MetricIeData loadMetric;    
+    ApnAndRelativeCapacityIeData listOfApnAndRelativeCapacity;    
+
+}SgwsNodeLevelLoadControlInformationInCreateSessionResponseData;
+
+typedef struct
+{
+
+    SequenceNumberIeData overloadControlSequenceNumber;    
+    MetricIeData overloadReductionMetric;    
+    EpcTimerIeData periodOfValidity;    
+
+}MmeS4SgsnsOverloadControlInformationInModifyBearerRequestData;
+
+typedef struct
+{
+
+    SequenceNumberIeData overloadControlSequenceNumber;    
+    MetricIeData overloadReductionMetric;    
+    EpcTimerIeData periodOfValidity;    
+
+}SgwsOverloadControlInformationInModifyBearerRequestData;
+
+typedef struct
+{
+
+    SequenceNumberIeData overloadControlSequenceNumber;    
+    MetricIeData overloadReductionMetric;    
+    EpcTimerIeData periodOfValidity;    
+
+}EpdgsOverloadControlInformationInModifyBearerRequestData;
+
+typedef struct
+{
+    bool listOfAccessPointNameIePresent;    
+
+    SequenceNumberIeData overloadControlSequenceNumber;    
+    MetricIeData overloadReductionMetric;    
+    EpcTimerIeData periodOfValidity;    
+    ApnIeData listOfAccessPointName;    
+
+}SgwsOverloadControlInformationInModifyBearerResponseData;
+
+typedef struct
+{
+    bool listOfAccessPointNameIePresent;    
+
+    SequenceNumberIeData overloadControlSequenceNumber;    
+    MetricIeData overloadReductionMetric;    
+    EpcTimerIeData periodOfValidity;    
+    ApnIeData listOfAccessPointName;    
+
+}PgwsOverloadControlInformationInModifyBearerResponseData;
+
+typedef struct
+{
+
+    SequenceNumberIeData loadControlSequenceNumber;    
+    MetricIeData loadMetric;    
+    ApnAndRelativeCapacityIeData listOfApnAndRelativeCapacity;    
+
+}SgwsNodeLevelLoadControlInformationInModifyBearerResponseData;
+
+typedef struct
+{
+
+    SequenceNumberIeData loadControlSequenceNumber;    
+    MetricIeData loadMetric;    
+    ApnAndRelativeCapacityIeData listOfApnAndRelativeCapacity;    
+
+}PgwsApnLevelLoadControlInformationInModifyBearerResponseData;
+
+typedef struct
+{
+
+    SequenceNumberIeData loadControlSequenceNumber;    
+    MetricIeData loadMetric;    
+    ApnAndRelativeCapacityIeData listOfApnAndRelativeCapacity;    
+
+}PgwsNodeLevelLoadControlInformationInModifyBearerResponseData;
+
+typedef struct
+{
+
+    SequenceNumberIeData overloadControlSequenceNumber;    
+    MetricIeData overloadReductionMetric;    
+    EpcTimerIeData periodOfValidity;    
+
+}MmeS4SgsnsOverloadControlInformationInDeleteSessionRequestData;
+
+typedef struct
+{
+
+    SequenceNumberIeData overloadControlSequenceNumber;    
+    MetricIeData overloadReductionMetric;    
+    EpcTimerIeData periodOfValidity;    
+
+}SgwsOverloadControlInformationInDeleteSessionRequestData;
+
+typedef struct
+{
+
+    SequenceNumberIeData overloadControlSequenceNumber;    
+    MetricIeData overloadReductionMetric;    
+    EpcTimerIeData periodOfValidity;    
+
+}TwanEpdgsOverloadControlInformationInDeleteSessionRequestData;
+
+typedef struct
+{
+    bool listOfAccessPointNameIePresent;    
+
+    SequenceNumberIeData overloadControlSequenceNumber;    
+    MetricIeData overloadReductionMetric;    
+    EpcTimerIeData periodOfValidity;    
+    ApnIeData listOfAccessPointName;    
+
+}SgwsOverloadControlInformationInDeleteSessionResponseData;
+
+typedef struct
+{
+    bool listOfAccessPointNameIePresent;    
+
+    SequenceNumberIeData overloadControlSequenceNumber;    
+    MetricIeData overloadReductionMetric;    
+    EpcTimerIeData periodOfValidity;    
+    ApnIeData listOfAccessPointName;    
+
+}PgwsOverloadControlInformationInDeleteSessionResponseData;
+
+typedef struct
+{
+
+    SequenceNumberIeData loadControlSequenceNumber;    
+    MetricIeData loadMetric;    
+    ApnAndRelativeCapacityIeData listOfApnAndRelativeCapacity;    
+
+}PgwsNodeLevelLoadControlInformationInDeleteSessionResponseData;
+
+typedef struct
+{
+
+    SequenceNumberIeData loadControlSequenceNumber;    
+    MetricIeData loadMetric;    
+    ApnAndRelativeCapacityIeData listOfApnAndRelativeCapacity;    
+
+}PgwsApnLevelLoadControlInformationInDeleteSessionResponseData;
+
+typedef struct
+{
+
+    SequenceNumberIeData loadControlSequenceNumber;    
+    MetricIeData loadMetric;    
+    ApnAndRelativeCapacityIeData listOfApnAndRelativeCapacity;    
+
+}SgwsNodeLevelLoadControlInformationInDeleteSessionResponseData;
+
+typedef struct
+{
+    bool listOfAccessPointNameIePresent;    
+
+    SequenceNumberIeData overloadControlSequenceNumber;    
+    MetricIeData overloadReductionMetric;    
+    EpcTimerIeData periodOfValidity;    
+    ApnIeData listOfAccessPointName;    
+
+}SgwsOverloadControlInformationInReleaseAccessBearersResponseData;
+
+typedef struct
+{
+
+    SequenceNumberIeData loadControlSequenceNumber;    
+    MetricIeData loadMetric;    
+    ApnAndRelativeCapacityIeData listOfApnAndRelativeCapacity;    
+
+}SgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponseData;
+
+typedef struct
+{
+    bool s1USgwFTeidIePresent;    
+    bool s58UPgwFTeidIePresent;    
+    bool s12SgwFTeidIePresent;    
+    bool s4USgwFTeidIePresent;    
+    bool s2bUPgwFTeidIePresent;    
+    bool s2aUPgwFTeidIePresent;    
+    bool chargingIdIePresent;    
+    bool bearerFlagsIePresent;    
+    bool protocolConfigurationOptionsIePresent;    
+    bool extendedProtocolConfigurationOptionsIePresent;    
+    bool maximumPacketLossRateIePresent;    
+
+    EbiIeData epsBearerId;    
+    BearerTftIeData tft;    
+    FTeidIeData s1USgwFTeid;    
+    FTeidIeData s58UPgwFTeid;    
+    FTeidIeData s12SgwFTeid;    
+    FTeidIeData s4USgwFTeid;    
+    FTeidIeData s2bUPgwFTeid;    
+    FTeidIeData s2aUPgwFTeid;    
+    BearerQosIeData bearerLevelQos;    
+    ChargingIdIeData chargingId;    
+    BearerFlagsIeData bearerFlags;    
+    PcoIeData protocolConfigurationOptions;    
+    EpcoIeData extendedProtocolConfigurationOptions;    
+    MaximumPacketLossRateIeData maximumPacketLossRate;    
+
+}BearerContextsInCreateBearerRequestData;
+
+typedef struct
+{
+
+    SequenceNumberIeData loadControlSequenceNumber;    
+    MetricIeData loadMetric;    
+    ApnAndRelativeCapacityIeData listOfApnAndRelativeCapacity;    
+
+}PgwsNodeLevelLoadControlInformationInCreateBearerRequestData;
+
+typedef struct
+{
+
+    SequenceNumberIeData loadControlSequenceNumber;    
+    MetricIeData loadMetric;    
+    ApnAndRelativeCapacityIeData listOfApnAndRelativeCapacity;    
+
+}PgwsApnLevelLoadControlInformationInCreateBearerRequestData;
+
+typedef struct
+{
+
+    SequenceNumberIeData loadControlSequenceNumber;    
+    MetricIeData loadMetric;    
+    ApnAndRelativeCapacityIeData listOfApnAndRelativeCapacity;    
+
+}SgwsNodeLevelLoadControlInformationInCreateBearerRequestData;
+
+typedef struct
+{
+    bool listOfAccessPointNameIePresent;    
+
+    SequenceNumberIeData overloadControlSequenceNumber;    
+    MetricIeData overloadReductionMetric;    
+    EpcTimerIeData periodOfValidity;    
+    ApnIeData listOfAccessPointName;    
+
+}PgwsOverloadControlInformationInCreateBearerRequestData;
+
+typedef struct
+{
+    bool listOfAccessPointNameIePresent;    
+
+    SequenceNumberIeData overloadControlSequenceNumber;    
+    MetricIeData overloadReductionMetric;    
+    EpcTimerIeData periodOfValidity;    
+    ApnIeData listOfAccessPointName;    
+
+}SgwsOverloadControlInformationInCreateBearerRequestData;
+
+typedef struct
+{
+    bool s1UEnodebFTeidIePresent;    
+    bool s1USgwFTeidIePresent;    
+    bool s58USgwFTeidIePresent;    
+    bool s58UPgwFTeidIePresent;    
+    bool s12RncFTeidIePresent;    
+    bool s12SgwFTeidIePresent;    
+    bool s4USgsnFTeidIePresent;    
+    bool s4USgwFTeidIePresent;    
+    bool s2bUEpdgFTeidIePresent;    
+    bool s2bUPgwFTeidIePresent;    
+    bool s2aUTwanFTeidIePresent;    
+    bool s2aUPgwFTeidIePresent;    
+    bool protocolConfigurationOptionsIePresent;    
+    bool ranNasCauseIePresent;    
+    bool extendedProtocolConfigurationOptionsIePresent;    
+
+    EbiIeData epsBearerId;    
+    CauseIeData cause;    
+    FTeidIeData s1UEnodebFTeid;    
+    FTeidIeData s1USgwFTeid;    
+    FTeidIeData s58USgwFTeid;    
+    FTeidIeData s58UPgwFTeid;    
+    FTeidIeData s12RncFTeid;    
+    FTeidIeData s12SgwFTeid;    
+    FTeidIeData s4USgsnFTeid;    
+    FTeidIeData s4USgwFTeid;    
+    FTeidIeData s2bUEpdgFTeid;    
+    FTeidIeData s2bUPgwFTeid;    
+    FTeidIeData s2aUTwanFTeid;    
+    FTeidIeData s2aUPgwFTeid;    
+    PcoIeData protocolConfigurationOptions;    
+    RanNasCauseIeData ranNasCause;    
+    EpcoIeData extendedProtocolConfigurationOptions;    
+
+}BearerContextsInCreateBearerResponseData;
+
+typedef struct
+{
+
+    SequenceNumberIeData overloadControlSequenceNumber;    
+    MetricIeData overloadReductionMetric;    
+    EpcTimerIeData periodOfValidity;    
+
+}MmeS4SgsnsOverloadControlInformationInCreateBearerResponseData;
+
+typedef struct
+{
+
+    SequenceNumberIeData overloadControlSequenceNumber;    
+    MetricIeData overloadReductionMetric;    
+    EpcTimerIeData periodOfValidity;    
+
+}SgwsOverloadControlInformationInCreateBearerResponseData;
+
+typedef struct
+{
+
+    SequenceNumberIeData overloadControlSequenceNumber;    
+    MetricIeData overloadReductionMetric;    
+    EpcTimerIeData periodOfValidity;    
+
+}TwanEpdgsOverloadControlInformationInCreateBearerResponseData;
+
+typedef struct
+{
+
+    EbiIeData epsBearerId;    
+    CauseIeData cause;    
+
+}FailedBearerContextsInDeleteBearerRequestData;
+
+typedef struct
+{
+    bool listOfApnAndRelativeCapacityIePresent;    
+
+    SequenceNumberIeData loadControlSequenceNumber;    
+    MetricIeData loadMetric;    
+    ApnAndRelativeCapacityIeData listOfApnAndRelativeCapacity;    
+
+}PgwsNodeLevelLoadControlInformationInDeleteBearerRequestData;
+
+typedef struct
+{
+    bool listOfApnAndRelativeCapacityIePresent;    
+
+    SequenceNumberIeData loadControlSequenceNumber;    
+    MetricIeData loadMetric;    
+    ApnAndRelativeCapacityIeData listOfApnAndRelativeCapacity;    
+
+}PgwsApnLevelLoadControlInformationInDeleteBearerRequestData;
+
+typedef struct
+{
+    bool listOfApnAndRelativeCapacityIePresent;    
+
+    SequenceNumberIeData loadControlSequenceNumber;    
+    MetricIeData loadMetric;    
+    ApnAndRelativeCapacityIeData listOfApnAndRelativeCapacity;    
+
+}SgwsNodeLevelLoadControlInformationInDeleteBearerRequestData;
+
+typedef struct
+{
+    bool listOfAccessPointNameIePresent;    
+
+    SequenceNumberIeData overloadControlSequenceNumber;    
+    MetricIeData overloadReductionMetric;    
+    EpcTimerIeData periodOfValidity;    
+    ApnIeData listOfAccessPointName;    
+
+}PgwsOverloadControlInformationInDeleteBearerRequestData;
+
+typedef struct
+{
+    bool listOfAccessPointNameIePresent;    
+
+    SequenceNumberIeData overloadControlSequenceNumber;    
+    MetricIeData overloadReductionMetric;    
+    EpcTimerIeData periodOfValidity;    
+    ApnIeData listOfAccessPointName;    
+
+}SgwsOverloadControlInformationInDeleteBearerRequestData;
+
+typedef struct
+{
+    bool protocolConfigurationOptionsIePresent;    
+    bool ranNasCauseIePresent;    
+    bool extendedProtocolConfigurationOptionsIePresent;    
+
+    EbiIeData epsBearerId;    
+    CauseIeData cause;    
+    PcoIeData protocolConfigurationOptions;    
+    RanNasCauseIeData ranNasCause;    
+    EpcoIeData extendedProtocolConfigurationOptions;    
+
+}BearerContextsInDeleteBearerResponseData;
+
+typedef struct
+{
+
+    SequenceNumberIeData overloadControlSequenceNumber;    
+    MetricIeData overloadReductionMetric;    
+    EpcTimerIeData periodOfValidity;    
+
+}MmeS4SgsnsOverloadControlInformationInDeleteBearerResponseData;
+
+typedef struct
+{
+
+    SequenceNumberIeData overloadControlSequenceNumber;    
+    MetricIeData overloadReductionMetric;    
+    EpcTimerIeData periodOfValidity;    
+
+}SgwsOverloadControlInformationInDeleteBearerResponseData;
+
+typedef struct
+{
+
+    SequenceNumberIeData overloadControlSequenceNumber;    
+    MetricIeData overloadReductionMetric;    
+    EpcTimerIeData periodOfValidity;    
+
+}TwanEpdgsOverloadControlInformationInDeleteBearerResponseData;
+
+typedef struct
+{
+
+    SequenceNumberIeData loadControlSequenceNumber;    
+    MetricIeData loadMetric;    
+
+}SgwsNodeLevelLoadControlInformationInDownlinkDataNotificationData;
+
+typedef struct
+{
+
+    SequenceNumberIeData overloadControlSequenceNumber;    
+    MetricIeData overloadReductionMetric;    
+    EpcTimerIeData periodOfValidity;    
+
+}SgwsOverloadControlInformationInDownlinkDataNotificationData;
+
+
+//Ie Type Constants
+static const  Uint8  BearerContextIeType = 93;    
+static const  Uint8  OverloadControlInformationIeType = 180;    
+static const  Uint8  RemoteUeContextIeType = 191;    
+static const  Uint8  LoadControlInformationIeType = 181;    
+
+
+#endif 
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/gtpV2IeDataTypes.h b/src/gtpV2Codec/ieClasses/gtpV2IeDataTypes.h
new file mode 100644
index 0000000..ec076e5
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/gtpV2IeDataTypes.h
@@ -0,0 +1,667 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ieDataTypetemplate.h.tt>
+ ******************************************************************************/
+#ifndef GTPV2IEDATATYPES_H_
+#define GTPV2IEDATATYPES_H_
+
+#include "gtpV2DataTypes.h"
+#include "manual/gtpV2DataTypes_Manual.h"
+
+typedef struct
+{
+    DigitRegister imsiValue;    
+
+}ImsiIeData;
+
+typedef struct
+{
+    Uint8 causeValue;    
+    bool pce;    
+    bool pbe;    
+    bool cs;    
+    bool offendingIeDataPresent;
+    OffendingIeData offendingIeData;    
+
+}CauseIeData;
+
+typedef struct
+{
+    DigitRegister msisdnValue;    
+
+}MsisdnIeData;
+
+typedef struct
+{
+    DigitRegister imeiSvValue;    
+
+}MeiIeData;
+
+typedef struct
+{
+    bool laipresent;    
+    bool ecgipresent;    
+    bool taipresent;    
+    bool raipresent;    
+    bool saipresent;    
+    bool cgipresent;    
+    CgiField cgi;    
+    SaiField sai;    
+    RaiField rai;    
+    TaiField tai;    
+    EcgiField ecgi;    
+    LaiField lai;    
+
+}UliIeData;
+
+typedef struct
+{
+    Uint8 mccDigit2;    
+    Uint8 mccDigit1;    
+    Uint8 mncDigit3;    
+    Uint8 mccDigit3;    
+    Uint8 mncDigit2;    
+    Uint8 mncDigit1;    
+
+}ServingNetworkIeData;
+
+typedef struct
+{
+    Uint8 ratType;    
+
+}RatTypeIeData;
+
+typedef struct
+{
+    bool iDAF;    
+    bool iDTF;    
+    bool iHI;    
+    bool iDFI;    
+    bool iOI;    
+    bool iISRSI;    
+    bool iISRAI;    
+    bool iSGWCI;    
+    bool iSQCI;    
+    bool iUIMSI;    
+    bool iCFSI;    
+    bool iCRSI;    
+    bool iP;    
+    bool iPT;    
+    bool iSI;    
+    bool iMSV;    
+    bool iS6AF;    
+    bool iS4AF;    
+    bool iMBMDT;    
+    bool iISRAU;    
+    bool iCCRSI;    
+
+}IndicationIeData;
+
+typedef struct
+{
+    bool ipv4present;    
+    bool ipv6present;    
+    Uint8 interfaceType;    
+    Uint32 teidGreKey;    
+    IpAddressV4 ipV4Address;    
+    IpAddressV6 ipV6Address;    
+
+}FTeidIeData;
+
+typedef struct
+{
+    Uint8Array32 apnValue;    
+
+}ApnIeData;
+
+typedef struct
+{
+    Uint8 selectionMode;    
+
+}SelectionModeIeData;
+
+typedef struct
+{
+    Uint8 pdnType;    
+
+}PdnTypeIeData;
+
+typedef struct
+{
+    Uint8 pdnType;    
+    Uint8 ipv6PrefixLength;    
+    IpAddressV6 ipV6Address;    
+    IpAddressV4 ipV4Address;    
+
+}PaaIeData;
+
+typedef struct
+{
+    Uint8 restrictionValue;    
+
+}ApnRestrictionIeData;
+
+typedef struct
+{
+    Uint32 maxMbrUplink;    
+    Uint32 maxMbrDownlink;    
+
+}AmbrMmbrIeData;
+
+typedef struct
+{
+    Uint32 maxMbrUplink;    
+    Uint32 maxMbrDownlink;    
+
+}AmbrIeData;
+
+typedef struct
+{
+    Uint8 epsBearerId;    
+
+}EbiIeData;
+
+typedef struct
+{
+    Uint8Array255 pcoValue;    
+
+}PcoIeData;
+
+typedef struct
+{
+    Uint8 mccDigit2;    
+    Uint8 mccDigit1;    
+    Uint8 mncDigit3;    
+    Uint8 mccDigit3;    
+    Uint8 mncDigit2;    
+    Uint8 mncDigit1;    
+    Uint8Array4 traceId;    
+    Uint8Array16 triggeringEvents;    
+    Uint16 listOfNeTypes;    
+    Uint8 sessionTraceDepth;    
+    Uint8Array16 listOfInterfaces;    
+    IpAddressV4 ipAddressOfTce;    
+
+}TraceInformationIeData;
+
+typedef struct
+{
+    Uint8 restartCounter;    
+
+}RecoveryIeData;
+
+typedef struct
+{
+    Uint8 daylightSavingTime;    
+
+}UeTimeZoneIeData;
+
+typedef struct
+{
+    Uint8 mccDigit2;    
+    Uint8 mccDigit1;    
+    Uint8 mncDigit3;    
+    Uint8 mccDigit3;    
+    Uint8 mncDigit2;    
+    Uint8 mncDigit1;    
+    Uint32 csgId;    
+    Uint8 accessMode;    
+    Uint8 lcsg;    
+    Uint8 cmi;    
+
+}UciIeData;
+
+typedef struct
+{
+    Uint16 value;    
+
+}ChargingCharacteristicsIeData;
+
+typedef struct
+{
+    Uint8Array512 ldn;    
+
+}LocalDistinguishedNameIeData;
+
+typedef struct
+{
+
+}SignallingPriorityIndicationIeData;
+
+typedef struct
+{
+    Uint8Array16 apco;    
+
+}AdditionalProtocolConfigurationOptionsIeData;
+
+typedef struct
+{
+    Uint8 nodeIdType;    
+    Uint8 numberOfCsids;    
+    IpAddressV4 nodeIdIpv4;    
+    IpAddressV6 nodeIdIpv6;    
+    Uint32 nodeIdUint32;    
+    Uint16Array16 csidList;    
+
+}FqCsidIeData;
+
+typedef struct
+{
+    Uint8Array16 tft;    
+
+}BearerTftIeData;
+
+typedef struct
+{
+    Uint8 pci;    
+    Uint8 pl;    
+    Uint8 pvi;    
+    Uint8 qci;    
+    Uint8Array5 maxBitRateUl;    
+    Uint8Array5 maxBitRateDl;    
+    Uint8Array5 guraranteedBitRateUl;    
+    Uint8Array5 guaranteedBitRateDl;    
+
+}BearerQosIeData;
+
+typedef struct
+{
+    Uint8 action;    
+
+}ChangeReportingActionIeData;
+
+typedef struct
+{
+    bool uciuhc;    
+    bool ucishc;    
+    bool ucicsg;    
+
+}CsgInformationReportingActionIeData;
+
+typedef struct
+{
+    Uint8Array32 fqdn;    
+
+}FqdnIeData;
+
+typedef struct
+{
+    Uint8 timerUnit;    
+    Uint8 timerValue;    
+
+}EpcTimerIeData;
+
+typedef struct
+{
+    Uint32 chargingIdValue;    
+
+}ChargingIdIeData;
+
+typedef struct
+{
+    bool vb;    
+    bool ppc;    
+
+}BearerFlagsIeData;
+
+typedef struct
+{
+    bool ipAddressV4Present;
+    IpAddressV4 ipAddressV4;    
+    bool ipAddressV6Present;
+    IpAddressV6 ipAddressV6;    
+
+}IpAddressIeData;
+
+typedef struct
+{
+    Uint8 delayValue;    
+
+}DelayValueIeData;
+
+typedef struct
+{
+    Uint16 portNumber;    
+
+}PortNumberIeData;
+
+typedef struct
+{
+    Uint8 cnOpselectionEntity;    
+
+}CnOperatorSelectionEntityIeData;
+
+typedef struct
+{
+    Uint16 uplinkRateLimit;    
+    Uint16 downlinkRateLimit;    
+
+}ServingPlmnRateControlIeData;
+
+typedef struct
+{
+    Uint32 timeStampValue;    
+    Uint8 counterValue;    
+
+}CounterIeData;
+
+typedef struct
+{
+    bool laiipresent;    
+    bool opnaipresent;    
+    bool plmnipresent;    
+    bool civaipresent;    
+    bool bssidipresent;    
+    Uint64 ssidLength;    
+    Uint8 ssid;    
+    Uint8 bssid;    
+    Uint8 civicAddressLength;    
+    Uint8 civicAddressInformation;    
+    Uint8 twanplmnid;    
+    Uint8 twanOperatorNameLength;    
+    Uint8 twanOperatorName;    
+    Uint8 relayIdentityType;    
+    Uint8 relayIdentityLength;    
+    Uint8 relayIdentity;    
+    Uint8 circuitIDLength;    
+    Uint8 circuitID;    
+
+}TwanIdentifierIeData;
+
+typedef struct
+{
+    Uint32 twanIdentifierTimestampvalue;    
+
+}TwanIdentifierTimestampIeData;
+
+typedef struct
+{
+    bool irsgw;    
+    bool irpgw;    
+    Uint8 secondaryRatType;    
+    Uint8 epsBearerId;    
+    Uint32 starttimestamp;    
+    Uint32 endtimestamp;    
+    Uint64 usageDataDL;    
+    Uint64 usageDataUL;    
+
+}SecondaryRatUsageDataReportIeData;
+
+typedef struct
+{
+    Uint8 protocolType;    
+    Uint8 causeType;    
+    Uint8 causeValue;    
+
+}RanNasCauseIeData;
+
+typedef struct
+{
+    Uint8Array16 epco;    
+
+}EpcoIeData;
+
+typedef struct
+{
+    Uint8 dl;    
+    Uint8 ul;    
+    Uint16 ulValue;    
+    Uint16 dlValue;    
+
+}MaximumPacketLossRateIeData;
+
+typedef struct
+{
+    Uint8 containerType;    
+    Uint8 fContainerField;    
+
+}FContainerIeData;
+
+typedef struct
+{
+    Uint8 lengthOfNodeName;    
+    Uint8 nodeName;    
+    Uint8 lengthOfNodeRealm;    
+    Uint8 nodeRealm;    
+
+}NodeIdentifierIeData;
+
+typedef struct
+{
+    bool dcnr;    
+
+}UpFunctionSelectionIndicationFlagsIeData;
+
+typedef struct
+{
+    bool fti;    
+
+}HenbInformationReportingIeData;
+
+typedef struct
+{
+    Uint8 subnetPrefixLength;    
+    IpAddressV4 iPv4DefaultRouterAddress;    
+
+}Ip4cpIeData;
+
+typedef struct
+{
+    bool inapra;    
+    Uint8 action;    
+    Uint32 presenceReportingAreaIdentifier;    
+    Uint8 numberOfTAI;    
+    Uint8 numberOfRAI;    
+    Uint8 numberOfMacroeNodeB;    
+    Uint8 numberOfHomeeNodeB;    
+    Uint8 numberOfECGI;    
+    Uint8 numberOfSAI;    
+    Uint8 numberOfCGI;    
+    TaiFieldArray15 tais;    
+    Uint8 macroeNBIds;    
+    Uint8 homeeNBIds;    
+    EcgiFieldArray64 ecgis;    
+    RaiFieldArray15 raiss;    
+    SaiFieldArray64 saiss;    
+    CgiFieldArray64 cgiss;    
+    Uint8 numberOfExtendedMacroeNodeB;    
+    Uint8 extendedMacroeNBIds;    
+
+}PresenceReportingAreaActionIeData;
+
+typedef struct
+{
+    Uint8 nodeType;    
+
+}NodeTypeIeData;
+
+typedef struct
+{
+    Uint8 procedureTransactionId;    
+
+}PtiIeData;
+
+typedef struct
+{
+    bool mcm;    
+    bool scm;    
+
+}TwmiIeData;
+
+typedef struct
+{
+    Uint64 millisecondTimeStampValue;    
+
+}MillisecondTimeStampIeData;
+
+typedef struct
+{
+    Uint64 integerNumberValue;    
+
+}IntegerNumberIeData;
+
+typedef struct
+{
+    Uint16 mappedUEUsageType;    
+
+}MappedUeUsageTypeIeData;
+
+typedef struct
+{
+    Uint32 uliTimestampvalue;    
+
+}UliTimestampIeData;
+
+typedef struct
+{
+    Uint8 metric;    
+
+}MetricIeData;
+
+typedef struct
+{
+    bool imeifpresent;    
+    bool msisdnfpresent;    
+    Uint8 lengthofIMSI;    
+    DigitRegister imsi;    
+    Uint8 lengthOfMSISDN;    
+    DigitRegister msisdn;    
+    Uint8 lengthOfIMEI;    
+    DigitRegister imei;    
+
+}RemoteUserIdIeData;
+
+typedef struct
+{
+    Uint64 remoteUeIpInformation;    
+
+}RemoteUeIpInformationIeData;
+
+typedef struct
+{
+    Uint32 sequenceNumber;    
+
+}SequenceNumberIeData;
+
+typedef struct
+{
+    Uint8 relativeCapacity;    
+    Uint8 apnLength;    
+    Uint8Array32 apn;    
+
+}ApnAndRelativeCapacityIeData;
+
+typedef struct
+{
+    Uint8 pci;    
+    Uint8 pl;    
+    Uint8 pvi;    
+
+}ArpIeData;
+
+typedef struct
+{
+    Uint8 throttlingDelayUnit;    
+    Uint8 throttlingDelayValue;    
+    Uint8 throttlingFactor;    
+
+}ThrottlingIeData;
+
+typedef struct
+{
+    Uint8 epsBearerId;    
+    Uint8 ppi;    
+    Uint8 ppiValue;    
+
+}PagingAndServiceInformationIeData;
+
+
+//Ie Type Constants
+static const  Uint8  ImsiIeType = 1;    
+static const  Uint8  CauseIeType = 2;    
+static const  Uint8  MsisdnIeType = 76;    
+static const  Uint8  MeiIeType = 75;    
+static const  Uint8  UliIeType = 86;    
+static const  Uint8  ServingNetworkIeType = 83;    
+static const  Uint8  RatTypeIeType = 82;    
+static const  Uint8  IndicationIeType = 77;    
+static const  Uint8  FTeidIeType = 87;    
+static const  Uint8  ApnIeType = 71;    
+static const  Uint8  SelectionModeIeType = 128;    
+static const  Uint8  PdnTypeIeType = 99;    
+static const  Uint8  PaaIeType = 79;    
+static const  Uint8  ApnRestrictionIeType = 127;    
+static const  Uint8  AmbrMmbrIeType = 161;    
+static const  Uint8  AmbrIeType = 72;    
+static const  Uint8  EbiIeType = 73;    
+static const  Uint8  PcoIeType = 78;    
+static const  Uint8  TraceInformationIeType = 96;    
+static const  Uint8  RecoveryIeType = 3;    
+static const  Uint8  UeTimeZoneIeType = 114;    
+static const  Uint8  UciIeType = 145;    
+static const  Uint8  ChargingCharacteristicsIeType = 95;    
+static const  Uint8  LocalDistinguishedNameIeType = 151;    
+static const  Uint8  SignallingPriorityIndicationIeType = 157;    
+static const  Uint8  AdditionalProtocolConfigurationOptionsIeType = 163;    
+static const  Uint8  FqCsidIeType = 132;    
+static const  Uint8  BearerTftIeType = 84;    
+static const  Uint8  BearerQosIeType = 80;    
+static const  Uint8  ChangeReportingActionIeType = 131;    
+static const  Uint8  CsgInformationReportingActionIeType = 146;    
+static const  Uint8  FqdnIeType = 136;    
+static const  Uint8  EpcTimerIeType = 156;    
+static const  Uint8  ChargingIdIeType = 94;    
+static const  Uint8  BearerFlagsIeType = 97;    
+static const  Uint8  IpAddressIeType = 74;    
+static const  Uint8  DelayValueIeType = 92;    
+static const  Uint8  PortNumberIeType = 126;    
+static const  Uint8  CnOperatorSelectionEntityIeType = 173;    
+static const  Uint8  ServingPlmnRateControlIeType = 198;    
+static const  Uint8  CounterIeType = 199;    
+static const  Uint8  TwanIdentifierIeType = 169;    
+static const  Uint8  TwanIdentifierTimestampIeType = 179;    
+static const  Uint8  SecondaryRatUsageDataReportIeType = 201;    
+static const  Uint8  RanNasCauseIeType = 172;    
+static const  Uint8  EpcoIeType = 197;    
+static const  Uint8  MaximumPacketLossRateIeType = 203;    
+static const  Uint8  FContainerIeType = 118;    
+static const  Uint8  NodeIdentifierIeType = 176;    
+static const  Uint8  UpFunctionSelectionIndicationFlagsIeType = 202;    
+static const  Uint8  HenbInformationReportingIeType = 165;    
+static const  Uint8  Ip4cpIeType = 166;    
+static const  Uint8  PresenceReportingAreaActionIeType = 177;    
+static const  Uint8  NodeTypeIeType = 135;    
+static const  Uint8  PtiIeType = 100;    
+static const  Uint8  TwmiIeType = 174;    
+static const  Uint8  MillisecondTimeStampIeType = 188;    
+static const  Uint8  IntegerNumberIeType = 187;    
+static const  Uint8  MappedUeUsageTypeIeType = 200;    
+static const  Uint8  UliTimestampIeType = 170;    
+static const  Uint8  MetricIeType = 182;    
+static const  Uint8  RemoteUserIdIeType = 192;    
+static const  Uint8  RemoteUeIpInformationIeType = 193;    
+static const  Uint8  SequenceNumberIeType = 183;    
+static const  Uint8  ApnAndRelativeCapacityIeType = 184;    
+static const  Uint8  ArpIeType = 155;    
+static const  Uint8  ThrottlingIeType = 154;    
+static const  Uint8  PagingAndServiceInformationIeType = 186;    
+
+
+#endif 
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/gtpV2IeFactory.cpp b/src/gtpV2Codec/ieClasses/gtpV2IeFactory.cpp
new file mode 100644
index 0000000..f10109f
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/gtpV2IeFactory.cpp
@@ -0,0 +1,329 @@
+/*
+ * 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/iefactorytemplate.cpp.tt>
+ ******************************************************************************/
+
+#include <map>
+#include "gtpV2IeFactory.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2GrpIeDataTypes.h"
+#include "imsiIe.h"
+#include "causeIe.h"
+#include "msisdnIe.h"
+#include "meiIe.h"
+#include "uliIe.h"
+#include "servingNetworkIe.h"
+#include "ratTypeIe.h"
+#include "indicationIe.h"
+#include "fTeidIe.h"
+#include "apnIe.h"
+#include "selectionModeIe.h"
+#include "pdnTypeIe.h"
+#include "paaIe.h"
+#include "apnRestrictionIe.h"
+#include "ambrMmbrIe.h"
+#include "ambrIe.h"
+#include "ebiIe.h"
+#include "pcoIe.h"
+#include "traceInformationIe.h"
+#include "recoveryIe.h"
+#include "ueTimeZoneIe.h"
+#include "uciIe.h"
+#include "chargingCharacteristicsIe.h"
+#include "localDistinguishedNameIe.h"
+#include "signallingPriorityIndicationIe.h"
+#include "additionalProtocolConfigurationOptionsIe.h"
+#include "fqCsidIe.h"
+#include "bearerTftIe.h"
+#include "bearerQosIe.h"
+#include "changeReportingActionIe.h"
+#include "csgInformationReportingActionIe.h"
+#include "fqdnIe.h"
+#include "epcTimerIe.h"
+#include "chargingIdIe.h"
+#include "bearerFlagsIe.h"
+#include "ipAddressIe.h"
+#include "delayValueIe.h"
+#include "portNumberIe.h"
+#include "cnOperatorSelectionEntityIe.h"
+#include "servingPlmnRateControlIe.h"
+#include "counterIe.h"
+#include "twanIdentifierIe.h"
+#include "twanIdentifierTimestampIe.h"
+#include "secondaryRatUsageDataReportIe.h"
+#include "ranNasCauseIe.h"
+#include "epcoIe.h"
+#include "maximumPacketLossRateIe.h"
+#include "fContainerIe.h"
+#include "nodeIdentifierIe.h"
+#include "upFunctionSelectionIndicationFlagsIe.h"
+#include "henbInformationReportingIe.h"
+#include "ip4cpIe.h"
+#include "presenceReportingAreaActionIe.h"
+#include "nodeTypeIe.h"
+#include "ptiIe.h"
+#include "twmiIe.h"
+#include "millisecondTimeStampIe.h"
+#include "integerNumberIe.h"
+#include "mappedUeUsageTypeIe.h"
+#include "uliTimestampIe.h"
+#include "metricIe.h"
+#include "remoteUserIdIe.h"
+#include "remoteUeIpInformationIe.h"
+#include "sequenceNumberIe.h"
+#include "apnAndRelativeCapacityIe.h"
+#include "arpIe.h"
+#include "throttlingIe.h"
+#include "pagingAndServiceInformationIe.h"
+#include "bearerContextIe.h"
+#include "overloadControlInformationIe.h"
+#include "loadControlInformationIe.h"
+#include "remoteUeContextIe.h"
+
+GtpV2IeFactory::GtpV2IeFactory() 
+{
+    //Create Message Objects    
+    ImsiIe* imsiIe_p = new (ImsiIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(ImsiIeType, imsiIe_p));
+
+    CauseIe* causeIe_p = new (CauseIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(CauseIeType, causeIe_p));
+
+    MsisdnIe* msisdnIe_p = new (MsisdnIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(MsisdnIeType, msisdnIe_p));
+
+    MeiIe* meiIe_p = new (MeiIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(MeiIeType, meiIe_p));
+
+    UliIe* uliIe_p = new (UliIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(UliIeType, uliIe_p));
+
+    ServingNetworkIe* servingNetworkIe_p = new (ServingNetworkIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(ServingNetworkIeType, servingNetworkIe_p));
+
+    RatTypeIe* ratTypeIe_p = new (RatTypeIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(RatTypeIeType, ratTypeIe_p));
+
+    IndicationIe* indicationIe_p = new (IndicationIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(IndicationIeType, indicationIe_p));
+
+    FTeidIe* fTeidIe_p = new (FTeidIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(FTeidIeType, fTeidIe_p));
+
+    ApnIe* apnIe_p = new (ApnIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(ApnIeType, apnIe_p));
+
+    SelectionModeIe* selectionModeIe_p = new (SelectionModeIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(SelectionModeIeType, selectionModeIe_p));
+
+    PdnTypeIe* pdnTypeIe_p = new (PdnTypeIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(PdnTypeIeType, pdnTypeIe_p));
+
+    PaaIe* paaIe_p = new (PaaIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(PaaIeType, paaIe_p));
+
+    ApnRestrictionIe* apnRestrictionIe_p = new (ApnRestrictionIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(ApnRestrictionIeType, apnRestrictionIe_p));
+
+    AmbrMmbrIe* ambrMmbrIe_p = new (AmbrMmbrIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(AmbrMmbrIeType, ambrMmbrIe_p));
+
+    AmbrIe* ambrIe_p = new (AmbrIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(AmbrIeType, ambrIe_p));
+
+    EbiIe* ebiIe_p = new (EbiIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(EbiIeType, ebiIe_p));
+
+    PcoIe* pcoIe_p = new (PcoIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(PcoIeType, pcoIe_p));
+
+    TraceInformationIe* traceInformationIe_p = new (TraceInformationIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(TraceInformationIeType, traceInformationIe_p));
+
+    RecoveryIe* recoveryIe_p = new (RecoveryIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(RecoveryIeType, recoveryIe_p));
+
+    UeTimeZoneIe* ueTimeZoneIe_p = new (UeTimeZoneIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(UeTimeZoneIeType, ueTimeZoneIe_p));
+
+    UciIe* uciIe_p = new (UciIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(UciIeType, uciIe_p));
+
+    ChargingCharacteristicsIe* chargingCharacteristicsIe_p = new (ChargingCharacteristicsIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(ChargingCharacteristicsIeType, chargingCharacteristicsIe_p));
+
+    LocalDistinguishedNameIe* localDistinguishedNameIe_p = new (LocalDistinguishedNameIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(LocalDistinguishedNameIeType, localDistinguishedNameIe_p));
+
+    SignallingPriorityIndicationIe* signallingPriorityIndicationIe_p = new (SignallingPriorityIndicationIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(SignallingPriorityIndicationIeType, signallingPriorityIndicationIe_p));
+
+    AdditionalProtocolConfigurationOptionsIe* additionalProtocolConfigurationOptionsIe_p = new (AdditionalProtocolConfigurationOptionsIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(AdditionalProtocolConfigurationOptionsIeType, additionalProtocolConfigurationOptionsIe_p));
+
+    FqCsidIe* fqCsidIe_p = new (FqCsidIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(FqCsidIeType, fqCsidIe_p));
+
+    BearerTftIe* bearerTftIe_p = new (BearerTftIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(BearerTftIeType, bearerTftIe_p));
+
+    BearerQosIe* bearerQosIe_p = new (BearerQosIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(BearerQosIeType, bearerQosIe_p));
+
+    ChangeReportingActionIe* changeReportingActionIe_p = new (ChangeReportingActionIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(ChangeReportingActionIeType, changeReportingActionIe_p));
+
+    CsgInformationReportingActionIe* csgInformationReportingActionIe_p = new (CsgInformationReportingActionIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(CsgInformationReportingActionIeType, csgInformationReportingActionIe_p));
+
+    FqdnIe* fqdnIe_p = new (FqdnIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(FqdnIeType, fqdnIe_p));
+
+    EpcTimerIe* epcTimerIe_p = new (EpcTimerIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(EpcTimerIeType, epcTimerIe_p));
+
+    ChargingIdIe* chargingIdIe_p = new (ChargingIdIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(ChargingIdIeType, chargingIdIe_p));
+
+    BearerFlagsIe* bearerFlagsIe_p = new (BearerFlagsIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(BearerFlagsIeType, bearerFlagsIe_p));
+
+    IpAddressIe* ipAddressIe_p = new (IpAddressIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(IpAddressIeType, ipAddressIe_p));
+
+    DelayValueIe* delayValueIe_p = new (DelayValueIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(DelayValueIeType, delayValueIe_p));
+
+    PortNumberIe* portNumberIe_p = new (PortNumberIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(PortNumberIeType, portNumberIe_p));
+
+    CnOperatorSelectionEntityIe* cnOperatorSelectionEntityIe_p = new (CnOperatorSelectionEntityIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(CnOperatorSelectionEntityIeType, cnOperatorSelectionEntityIe_p));
+
+    ServingPlmnRateControlIe* servingPlmnRateControlIe_p = new (ServingPlmnRateControlIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(ServingPlmnRateControlIeType, servingPlmnRateControlIe_p));
+
+    CounterIe* counterIe_p = new (CounterIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(CounterIeType, counterIe_p));
+
+    TwanIdentifierIe* twanIdentifierIe_p = new (TwanIdentifierIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(TwanIdentifierIeType, twanIdentifierIe_p));
+
+    TwanIdentifierTimestampIe* twanIdentifierTimestampIe_p = new (TwanIdentifierTimestampIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(TwanIdentifierTimestampIeType, twanIdentifierTimestampIe_p));
+
+    SecondaryRatUsageDataReportIe* secondaryRatUsageDataReportIe_p = new (SecondaryRatUsageDataReportIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(SecondaryRatUsageDataReportIeType, secondaryRatUsageDataReportIe_p));
+
+    RanNasCauseIe* ranNasCauseIe_p = new (RanNasCauseIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(RanNasCauseIeType, ranNasCauseIe_p));
+
+    EpcoIe* epcoIe_p = new (EpcoIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(EpcoIeType, epcoIe_p));
+
+    MaximumPacketLossRateIe* maximumPacketLossRateIe_p = new (MaximumPacketLossRateIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(MaximumPacketLossRateIeType, maximumPacketLossRateIe_p));
+
+    FContainerIe* fContainerIe_p = new (FContainerIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(FContainerIeType, fContainerIe_p));
+
+    NodeIdentifierIe* nodeIdentifierIe_p = new (NodeIdentifierIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(NodeIdentifierIeType, nodeIdentifierIe_p));
+
+    UpFunctionSelectionIndicationFlagsIe* upFunctionSelectionIndicationFlagsIe_p = new (UpFunctionSelectionIndicationFlagsIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(UpFunctionSelectionIndicationFlagsIeType, upFunctionSelectionIndicationFlagsIe_p));
+
+    HenbInformationReportingIe* henbInformationReportingIe_p = new (HenbInformationReportingIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(HenbInformationReportingIeType, henbInformationReportingIe_p));
+
+    Ip4cpIe* ip4cpIe_p = new (Ip4cpIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(Ip4cpIeType, ip4cpIe_p));
+
+    PresenceReportingAreaActionIe* presenceReportingAreaActionIe_p = new (PresenceReportingAreaActionIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(PresenceReportingAreaActionIeType, presenceReportingAreaActionIe_p));
+
+    NodeTypeIe* nodeTypeIe_p = new (NodeTypeIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(NodeTypeIeType, nodeTypeIe_p));
+
+    PtiIe* ptiIe_p = new (PtiIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(PtiIeType, ptiIe_p));
+
+    TwmiIe* twmiIe_p = new (TwmiIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(TwmiIeType, twmiIe_p));
+
+    MillisecondTimeStampIe* millisecondTimeStampIe_p = new (MillisecondTimeStampIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(MillisecondTimeStampIeType, millisecondTimeStampIe_p));
+
+    IntegerNumberIe* integerNumberIe_p = new (IntegerNumberIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(IntegerNumberIeType, integerNumberIe_p));
+
+    MappedUeUsageTypeIe* mappedUeUsageTypeIe_p = new (MappedUeUsageTypeIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(MappedUeUsageTypeIeType, mappedUeUsageTypeIe_p));
+
+    UliTimestampIe* uliTimestampIe_p = new (UliTimestampIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(UliTimestampIeType, uliTimestampIe_p));
+
+    MetricIe* metricIe_p = new (MetricIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(MetricIeType, metricIe_p));
+
+    RemoteUserIdIe* remoteUserIdIe_p = new (RemoteUserIdIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(RemoteUserIdIeType, remoteUserIdIe_p));
+
+    RemoteUeIpInformationIe* remoteUeIpInformationIe_p = new (RemoteUeIpInformationIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(RemoteUeIpInformationIeType, remoteUeIpInformationIe_p));
+
+    SequenceNumberIe* sequenceNumberIe_p = new (SequenceNumberIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(SequenceNumberIeType, sequenceNumberIe_p));
+
+    ApnAndRelativeCapacityIe* apnAndRelativeCapacityIe_p = new (ApnAndRelativeCapacityIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(ApnAndRelativeCapacityIeType, apnAndRelativeCapacityIe_p));
+
+    ArpIe* arpIe_p = new (ArpIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(ArpIeType, arpIe_p));
+
+    ThrottlingIe* throttlingIe_p = new (ThrottlingIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(ThrottlingIeType, throttlingIe_p));
+
+    PagingAndServiceInformationIe* pagingAndServiceInformationIe_p = new (PagingAndServiceInformationIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(PagingAndServiceInformationIeType, pagingAndServiceInformationIe_p));
+
+    BearerContextIe* bearerContextIe_p = new (BearerContextIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(BearerContextIeType, bearerContextIe_p));
+
+    OverloadControlInformationIe* overloadControlInformationIe_p = new (OverloadControlInformationIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(OverloadControlInformationIeType, overloadControlInformationIe_p));
+
+    LoadControlInformationIe* loadControlInformationIe_p = new (LoadControlInformationIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(LoadControlInformationIeType, loadControlInformationIe_p));
+
+    RemoteUeContextIe* remoteUeContextIe_p = new (RemoteUeContextIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(RemoteUeContextIeType, remoteUeContextIe_p));
+
+
+}
+
+GtpV2IeFactory::~GtpV2IeFactory() {
+    // TODO clean up the allocated memory for message objects
+}
+
+GtpV2IeFactory& GtpV2IeFactory::getInstance()
+{
+    static GtpV2IeFactory gtpV2IeFactory;
+    return gtpV2IeFactory;
+}
+
+GtpV2Ie& GtpV2IeFactory::getIeObject(Uint8 ieType)
+{
+    std::map<Uint8, GtpV2Ie*>::iterator it;
+    it = ieObjectContainer.find(ieType);
+    return *(it->second);
+}
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/gtpV2IeFactory.h b/src/gtpV2Codec/ieClasses/gtpV2IeFactory.h
new file mode 100644
index 0000000..b04eb47
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/gtpV2IeFactory.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/iefactorytemplate.h.tt>
+ ******************************************************************************/
+#ifndef GTPV2IEFACTORY_H_
+#define GTPV2IEFACTORY_H_
+
+#include <map>
+#include "manual/gtpV2Ie.h"
+
+class GtpV2IeFactory {
+public:
+    GtpV2IeFactory();
+    virtual ~GtpV2IeFactory();
+
+    static GtpV2IeFactory& getInstance();
+
+    GtpV2Ie& getIeObject(Uint8 ieType);
+
+private:
+
+    map<Uint8, GtpV2Ie*> ieObjectContainer;
+
+};
+
+
+#endif /* GTPV2MSGFACTORY_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/henbInformationReportingIe.cpp b/src/gtpV2Codec/ieClasses/henbInformationReportingIe.cpp
new file mode 100644
index 0000000..80ceccc
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/henbInformationReportingIe.cpp
@@ -0,0 +1,86 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "henbInformationReportingIe.h"
+#include "dataTypeCodecUtils.h"
+
+HenbInformationReportingIe::HenbInformationReportingIe() 
+{
+    ieType = 165;
+    // TODO
+
+}
+
+HenbInformationReportingIe::~HenbInformationReportingIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool HenbInformationReportingIe::encodeHenbInformationReportingIe(MsgBuffer &buffer, HenbInformationReportingIeData const &data)
+{
+    buffer.skipBits(4);
+
+    if(!(buffer.writeBits(data.fti, 4)))
+    {
+        errorStream.add((char *)"Encoding of fti failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool HenbInformationReportingIe::decodeHenbInformationReportingIe(MsgBuffer &buffer, HenbInformationReportingIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+    buffer.skipBits(4);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: \n");
+        return false;
+    }
+
+    data.fti = buffer.readBits(4);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: fti\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE HenbInformationReportingIe\n");
+        return false;
+    }
+}
+void HenbInformationReportingIe::displayHenbInformationReportingIe_v(HenbInformationReportingIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"HenbInformationReportingIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add( (char *)"fti: "); 
+    stream.add((Uint8)data.fti);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/henbInformationReportingIe.h b/src/gtpV2Codec/ieClasses/henbInformationReportingIe.h
new file mode 100644
index 0000000..1c16062
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/henbInformationReportingIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef HENBINFORMATIONREPORTINGIE_H_
+#define HENBINFORMATIONREPORTINGIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class HenbInformationReportingIe: public GtpV2Ie {
+public:
+    HenbInformationReportingIe();
+    virtual ~HenbInformationReportingIe();
+
+    bool encodeHenbInformationReportingIe(MsgBuffer &buffer,
+                 HenbInformationReportingIeData const &data);
+    bool decodeHenbInformationReportingIe(MsgBuffer &buffer,
+                 HenbInformationReportingIeData &data, Uint16 length);
+    void displayHenbInformationReportingIe_v(HenbInformationReportingIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* HENBINFORMATIONREPORTINGIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/imsiIe.cpp b/src/gtpV2Codec/ieClasses/imsiIe.cpp
new file mode 100644
index 0000000..1991b06
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/imsiIe.cpp
@@ -0,0 +1,88 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "imsiIe.h"
+#include "dataTypeCodecUtils.h"
+
+ImsiIe::ImsiIe() 
+{
+    ieType = 1;
+    // TODO
+
+}
+
+ImsiIe::~ImsiIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool ImsiIe::encodeImsiIe(MsgBuffer &buffer, ImsiIeData const &data)
+{
+    if (!(data.imsiValue.length>=9 && data.imsiValue.length <=15))
+    {
+        errorStream.add((char *)"Data validation failure: imsiValue\n");
+        return false; 
+    }
+    if (!(DataTypeCodecUtils::encodeDigitRegister(buffer, data.imsiValue)))
+    {
+    errorStream.add((char *)"Encoding of imsiValue failed\n");
+    return false;
+    }
+
+    return true;
+}
+
+bool ImsiIe::decodeImsiIe(MsgBuffer &buffer, ImsiIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+
+    Uint16 lengthLeft = length;
+    lengthLeft = ieBoundary - buffer.getCurrentIndex();
+    if (!(DataTypeCodecUtils::decodeDigitRegister(buffer, data.imsiValue, lengthLeft)))
+    {
+        errorStream.add((char *)"Failed to decode: imsiValue\n");
+        return false;
+    }
+    if (!(data.imsiValue.length>=9 && data.imsiValue.length <=15))
+    {
+        errorStream.add((char *)"Data validation failure : imsiValue\n");
+        return false; //TODO need to add validations
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE ImsiIe\n");
+        return false;
+    }
+}
+void ImsiIe::displayImsiIe_v(ImsiIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"ImsiIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add((char *)"imsiValue:");
+    stream.endOfLine();
+    DataTypeCodecUtils::displayDigitRegister_v(data.imsiValue, stream);
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/imsiIe.h b/src/gtpV2Codec/ieClasses/imsiIe.h
new file mode 100644
index 0000000..c7bc17d
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/imsiIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef IMSIIE_H_
+#define IMSIIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class ImsiIe: public GtpV2Ie {
+public:
+    ImsiIe();
+    virtual ~ImsiIe();
+
+    bool encodeImsiIe(MsgBuffer &buffer,
+                 ImsiIeData const &data);
+    bool decodeImsiIe(MsgBuffer &buffer,
+                 ImsiIeData &data, Uint16 length);
+    void displayImsiIe_v(ImsiIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* IMSIIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/indicationIe.cpp b/src/gtpV2Codec/ieClasses/indicationIe.cpp
new file mode 100644
index 0000000..b70471c
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/indicationIe.cpp
@@ -0,0 +1,406 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "indicationIe.h"
+#include "dataTypeCodecUtils.h"
+
+IndicationIe::IndicationIe() 
+{
+    ieType = 77;
+    // TODO
+
+}
+
+IndicationIe::~IndicationIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool IndicationIe::encodeIndicationIe(MsgBuffer &buffer, IndicationIeData const &data)
+{
+    if(!(buffer.writeBits(data.iDAF, 1)))
+    {
+        errorStream.add((char *)"Encoding of iDAF failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.iDTF, 1)))
+    {
+        errorStream.add((char *)"Encoding of iDTF failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.iHI, 1)))
+    {
+        errorStream.add((char *)"Encoding of iHI failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.iDFI, 1)))
+    {
+        errorStream.add((char *)"Encoding of iDFI failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.iOI, 1)))
+    {
+        errorStream.add((char *)"Encoding of iOI failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.iISRSI, 1)))
+    {
+        errorStream.add((char *)"Encoding of iISRSI failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.iISRAI, 1)))
+    {
+        errorStream.add((char *)"Encoding of iISRAI failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.iSGWCI, 1)))
+    {
+        errorStream.add((char *)"Encoding of iSGWCI failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.iSQCI, 1)))
+    {
+        errorStream.add((char *)"Encoding of iSQCI failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.iUIMSI, 1)))
+    {
+        errorStream.add((char *)"Encoding of iUIMSI failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.iCFSI, 1)))
+    {
+        errorStream.add((char *)"Encoding of iCFSI failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.iCRSI, 1)))
+    {
+        errorStream.add((char *)"Encoding of iCRSI failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.iP, 1)))
+    {
+        errorStream.add((char *)"Encoding of iP failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.iPT, 1)))
+    {
+        errorStream.add((char *)"Encoding of iPT failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.iSI, 1)))
+    {
+        errorStream.add((char *)"Encoding of iSI failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.iMSV, 1)))
+    {
+        errorStream.add((char *)"Encoding of iMSV failed\n");
+        return false;
+    }
+    buffer.skipBits(3);
+
+    if(!(buffer.writeBits(data.iS6AF, 1)))
+    {
+        errorStream.add((char *)"Encoding of iS6AF failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.iS4AF, 1)))
+    {
+        errorStream.add((char *)"Encoding of iS4AF failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.iMBMDT, 1)))
+    {
+        errorStream.add((char *)"Encoding of iMBMDT failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.iISRAU, 1)))
+    {
+        errorStream.add((char *)"Encoding of iISRAU failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.iCCRSI, 1)))
+    {
+        errorStream.add((char *)"Encoding of iCCRSI failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool IndicationIe::decodeIndicationIe(MsgBuffer &buffer, IndicationIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+    data.iDAF = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: iDAF\n");
+        return false;
+    }
+    data.iDTF = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: iDTF\n");
+        return false;
+    }
+    data.iHI = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: iHI\n");
+        return false;
+    }
+    data.iDFI = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: iDFI\n");
+        return false;
+    }
+    data.iOI = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: iOI\n");
+        return false;
+    }
+    data.iISRSI = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: iISRSI\n");
+        return false;
+    }
+    data.iISRAI = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: iISRAI\n");
+        return false;
+    }
+    data.iSGWCI = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: iSGWCI\n");
+        return false;
+    }
+    data.iSQCI = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: iSQCI\n");
+        return false;
+    }
+    data.iUIMSI = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: iUIMSI\n");
+        return false;
+    }
+    data.iCFSI = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: iCFSI\n");
+        return false;
+    }
+    data.iCRSI = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: iCRSI\n");
+        return false;
+    }
+    data.iP = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: iP\n");
+        return false;
+    }
+    data.iPT = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: iPT\n");
+        return false;
+    }
+    data.iSI = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: iSI\n");
+        return false;
+    }
+    data.iMSV = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: iMSV\n");
+        return false;
+    }
+    buffer.skipBits(3);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: \n");
+        return false;
+    }
+
+    data.iS6AF = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: iS6AF\n");
+        return false;
+    }
+    data.iS4AF = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: iS4AF\n");
+        return false;
+    }
+    data.iMBMDT = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: iMBMDT\n");
+        return false;
+    }
+    data.iISRAU = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: iISRAU\n");
+        return false;
+    }
+    data.iCCRSI = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: iCCRSI\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE IndicationIe\n");
+        return false;
+    }
+}
+void IndicationIe::displayIndicationIe_v(IndicationIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"IndicationIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add( (char *)"iDAF: "); 
+    stream.add((Uint8)data.iDAF);
+    stream.endOfLine();
+  
+    stream.add( (char *)"iDTF: "); 
+    stream.add((Uint8)data.iDTF);
+    stream.endOfLine();
+  
+    stream.add( (char *)"iHI: "); 
+    stream.add((Uint8)data.iHI);
+    stream.endOfLine();
+  
+    stream.add( (char *)"iDFI: "); 
+    stream.add((Uint8)data.iDFI);
+    stream.endOfLine();
+  
+    stream.add( (char *)"iOI: "); 
+    stream.add((Uint8)data.iOI);
+    stream.endOfLine();
+  
+    stream.add( (char *)"iISRSI: "); 
+    stream.add((Uint8)data.iISRSI);
+    stream.endOfLine();
+  
+    stream.add( (char *)"iISRAI: "); 
+    stream.add((Uint8)data.iISRAI);
+    stream.endOfLine();
+  
+    stream.add( (char *)"iSGWCI: "); 
+    stream.add((Uint8)data.iSGWCI);
+    stream.endOfLine();
+  
+    stream.add( (char *)"iSQCI: "); 
+    stream.add((Uint8)data.iSQCI);
+    stream.endOfLine();
+  
+    stream.add( (char *)"iUIMSI: "); 
+    stream.add((Uint8)data.iUIMSI);
+    stream.endOfLine();
+  
+    stream.add( (char *)"iCFSI: "); 
+    stream.add((Uint8)data.iCFSI);
+    stream.endOfLine();
+  
+    stream.add( (char *)"iCRSI: "); 
+    stream.add((Uint8)data.iCRSI);
+    stream.endOfLine();
+  
+    stream.add( (char *)"iP: "); 
+    stream.add((Uint8)data.iP);
+    stream.endOfLine();
+  
+    stream.add( (char *)"iPT: "); 
+    stream.add((Uint8)data.iPT);
+    stream.endOfLine();
+  
+    stream.add( (char *)"iSI: "); 
+    stream.add((Uint8)data.iSI);
+    stream.endOfLine();
+  
+    stream.add( (char *)"iMSV: "); 
+    stream.add((Uint8)data.iMSV);
+    stream.endOfLine();
+  
+    stream.add( (char *)"iS6AF: "); 
+    stream.add((Uint8)data.iS6AF);
+    stream.endOfLine();
+  
+    stream.add( (char *)"iS4AF: "); 
+    stream.add((Uint8)data.iS4AF);
+    stream.endOfLine();
+  
+    stream.add( (char *)"iMBMDT: "); 
+    stream.add((Uint8)data.iMBMDT);
+    stream.endOfLine();
+  
+    stream.add( (char *)"iISRAU: "); 
+    stream.add((Uint8)data.iISRAU);
+    stream.endOfLine();
+  
+    stream.add( (char *)"iCCRSI: "); 
+    stream.add((Uint8)data.iCCRSI);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/indicationIe.h b/src/gtpV2Codec/ieClasses/indicationIe.h
new file mode 100644
index 0000000..d328db0
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/indicationIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef INDICATIONIE_H_
+#define INDICATIONIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class IndicationIe: public GtpV2Ie {
+public:
+    IndicationIe();
+    virtual ~IndicationIe();
+
+    bool encodeIndicationIe(MsgBuffer &buffer,
+                 IndicationIeData const &data);
+    bool decodeIndicationIe(MsgBuffer &buffer,
+                 IndicationIeData &data, Uint16 length);
+    void displayIndicationIe_v(IndicationIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* INDICATIONIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/integerNumberIe.cpp b/src/gtpV2Codec/ieClasses/integerNumberIe.cpp
new file mode 100644
index 0000000..c9201c0
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/integerNumberIe.cpp
@@ -0,0 +1,77 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "integerNumberIe.h"
+#include "dataTypeCodecUtils.h"
+
+IntegerNumberIe::IntegerNumberIe() 
+{
+    ieType = 187;
+    // TODO
+
+}
+
+IntegerNumberIe::~IntegerNumberIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool IntegerNumberIe::encodeIntegerNumberIe(MsgBuffer &buffer, IntegerNumberIeData const &data)
+{
+    if (!(buffer.writeUint64(data.integerNumberValue)))
+    {
+        errorStream.add((char *)"Encoding of integerNumberValue failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool IntegerNumberIe::decodeIntegerNumberIe(MsgBuffer &buffer, IntegerNumberIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+
+    buffer.readUint64(data.integerNumberValue);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: integerNumberValue\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE IntegerNumberIe\n");
+        return false;
+    }
+}
+void IntegerNumberIe::displayIntegerNumberIe_v(IntegerNumberIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"IntegerNumberIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add((char *)"integerNumberValue: ");
+    stream.add(data.integerNumberValue);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/integerNumberIe.h b/src/gtpV2Codec/ieClasses/integerNumberIe.h
new file mode 100644
index 0000000..f7bac42
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/integerNumberIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef INTEGERNUMBERIE_H_
+#define INTEGERNUMBERIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class IntegerNumberIe: public GtpV2Ie {
+public:
+    IntegerNumberIe();
+    virtual ~IntegerNumberIe();
+
+    bool encodeIntegerNumberIe(MsgBuffer &buffer,
+                 IntegerNumberIeData const &data);
+    bool decodeIntegerNumberIe(MsgBuffer &buffer,
+                 IntegerNumberIeData &data, Uint16 length);
+    void displayIntegerNumberIe_v(IntegerNumberIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* INTEGERNUMBERIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/ip4cpIe.cpp b/src/gtpV2Codec/ieClasses/ip4cpIe.cpp
new file mode 100644
index 0000000..c3a216f
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/ip4cpIe.cpp
@@ -0,0 +1,94 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "ip4cpIe.h"
+#include "dataTypeCodecUtils.h"
+
+Ip4cpIe::Ip4cpIe() 
+{
+    ieType = 166;
+    // TODO
+
+}
+
+Ip4cpIe::~Ip4cpIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool Ip4cpIe::encodeIp4cpIe(MsgBuffer &buffer, Ip4cpIeData const &data)
+{
+    if (!(buffer.writeUint8(data.subnetPrefixLength)))
+    {
+        errorStream.add((char *)"Encoding of subnetPrefixLength failed\n");
+        return false;
+    }
+    if (!(DataTypeCodecUtils::encodeIpAddressV4(buffer, data.iPv4DefaultRouterAddress)))
+    {
+    errorStream.add((char *)"Encoding of iPv4DefaultRouterAddress failed\n");
+    return false;
+    }
+
+    return true;
+}
+
+bool Ip4cpIe::decodeIp4cpIe(MsgBuffer &buffer, Ip4cpIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+
+    buffer.readUint8(data.subnetPrefixLength);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: subnetPrefixLength\n");
+        return false;
+    }
+
+    Uint16 lengthLeft = length;
+    lengthLeft = ieBoundary - buffer.getCurrentIndex();
+    if (!(DataTypeCodecUtils::decodeIpAddressV4(buffer, data.iPv4DefaultRouterAddress, lengthLeft)))
+    {
+        errorStream.add((char *)"Failed to decode: iPv4DefaultRouterAddress\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE Ip4cpIe\n");
+        return false;
+    }
+}
+void Ip4cpIe::displayIp4cpIe_v(Ip4cpIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"Ip4cpIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add((char *)"subnetPrefixLength: ");
+    stream.add(data.subnetPrefixLength);
+    stream.endOfLine();
+  
+    stream.add((char *)"iPv4DefaultRouterAddress:");
+    stream.endOfLine();
+    DataTypeCodecUtils::displayIpAddressV4_v(data.iPv4DefaultRouterAddress, stream);
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/ip4cpIe.h b/src/gtpV2Codec/ieClasses/ip4cpIe.h
new file mode 100644
index 0000000..e41936b
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/ip4cpIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef IP4CPIE_H_
+#define IP4CPIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class Ip4cpIe: public GtpV2Ie {
+public:
+    Ip4cpIe();
+    virtual ~Ip4cpIe();
+
+    bool encodeIp4cpIe(MsgBuffer &buffer,
+                 Ip4cpIeData const &data);
+    bool decodeIp4cpIe(MsgBuffer &buffer,
+                 Ip4cpIeData &data, Uint16 length);
+    void displayIp4cpIe_v(Ip4cpIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* IP4CPIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/ipAddressIe.cpp b/src/gtpV2Codec/ieClasses/ipAddressIe.cpp
new file mode 100644
index 0000000..21e6264
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/ipAddressIe.cpp
@@ -0,0 +1,115 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "ipAddressIe.h"
+#include "dataTypeCodecUtils.h"
+
+IpAddressIe::IpAddressIe() 
+{
+    ieType = 74;
+    // TODO
+
+}
+
+IpAddressIe::~IpAddressIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool IpAddressIe::encodeIpAddressIe(MsgBuffer &buffer, IpAddressIeData const &data)
+{
+    if (data.ipAddressV4Present)
+    {
+        if (!(DataTypeCodecUtils::encodeIpAddressV4(buffer, data.ipAddressV4)))
+        {
+            errorStream.add((char *)"Encoding of ipAddressV4 failed\n");
+            return false;
+        }
+    }
+    if (data.ipAddressV6Present)
+    {
+        if (!(DataTypeCodecUtils::encodeIpAddressV6(buffer, data.ipAddressV6)))
+        {
+            errorStream.add((char *)"Encoding of ipAddressV6 failed\n");
+            return false;
+        }
+    }
+
+    return true;
+}
+
+bool IpAddressIe::decodeIpAddressIe(MsgBuffer &buffer, IpAddressIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+
+    Uint16 lengthLeft = length;
+
+    if (length == 4)
+    {
+        lengthLeft = ieBoundary - buffer.getCurrentIndex();
+        if (!(DataTypeCodecUtils::decodeIpAddressV4(buffer, data.ipAddressV4, lengthLeft)))
+        {
+            errorStream.add((char *)"Failed to decode: ipAddressV4\n");
+            return false;
+        }
+        data.ipAddressV4Present = true;
+    }
+
+    if (length == 6)
+    {
+        lengthLeft = ieBoundary - buffer.getCurrentIndex();
+        if (!(DataTypeCodecUtils::decodeIpAddressV6(buffer, data.ipAddressV6, lengthLeft)))
+        {
+            errorStream.add((char *)"Failed to decode: ipAddressV6\n");
+            return false;
+        }
+        data.ipAddressV6Present = true;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE IpAddressIe\n");
+        return false;
+    }
+}
+void IpAddressIe::displayIpAddressIe_v(IpAddressIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"IpAddressIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    if (data.ipAddressV4Present)
+    {
+        stream.add((char *)"ipAddressV4:");
+        stream.endOfLine();
+        DataTypeCodecUtils::displayIpAddressV4_v(data.ipAddressV4, stream);
+    }   
+  
+    if (data.ipAddressV6Present)
+    {
+        stream.add((char *)"ipAddressV6:");
+        stream.endOfLine();
+        DataTypeCodecUtils::displayIpAddressV6_v(data.ipAddressV6, stream);
+    }   
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/ipAddressIe.h b/src/gtpV2Codec/ieClasses/ipAddressIe.h
new file mode 100644
index 0000000..6d6fdfd
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/ipAddressIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef IPADDRESSIE_H_
+#define IPADDRESSIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class IpAddressIe: public GtpV2Ie {
+public:
+    IpAddressIe();
+    virtual ~IpAddressIe();
+
+    bool encodeIpAddressIe(MsgBuffer &buffer,
+                 IpAddressIeData const &data);
+    bool decodeIpAddressIe(MsgBuffer &buffer,
+                 IpAddressIeData &data, Uint16 length);
+    void displayIpAddressIe_v(IpAddressIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* IPADDRESSIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/loadControlInformationIe.cpp b/src/gtpV2Codec/ieClasses/loadControlInformationIe.cpp
new file mode 100644
index 0000000..1c1e8e3
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/loadControlInformationIe.cpp
@@ -0,0 +1,97 @@
+/*
+ * 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/grpietemplate.cpp.tt>
+ ******************************************************************************/
+#include "loadControlInformationIe.h"
+#include "gtpV2GrpIeDataTypes.h"
+#include "manual/gtpV2GroupedIe.h"
+
+#include "pgwsNodeLevelLoadControlInformationInCreateSessionResponse.h"
+#include "pgwsApnLevelLoadControlInformationInCreateSessionResponse.h"
+#include "sgwsNodeLevelLoadControlInformationInCreateSessionResponse.h"
+#include "sgwsNodeLevelLoadControlInformationInModifyBearerResponse.h"
+#include "pgwsApnLevelLoadControlInformationInModifyBearerResponse.h"
+#include "pgwsNodeLevelLoadControlInformationInModifyBearerResponse.h"
+#include "pgwsNodeLevelLoadControlInformationInDeleteSessionResponse.h"
+#include "pgwsApnLevelLoadControlInformationInDeleteSessionResponse.h"
+#include "sgwsNodeLevelLoadControlInformationInDeleteSessionResponse.h"
+#include "sgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponse.h"
+#include "pgwsNodeLevelLoadControlInformationInCreateBearerRequest.h"
+#include "pgwsApnLevelLoadControlInformationInCreateBearerRequest.h"
+#include "sgwsNodeLevelLoadControlInformationInCreateBearerRequest.h"
+#include "pgwsNodeLevelLoadControlInformationInDeleteBearerRequest.h"
+#include "pgwsApnLevelLoadControlInformationInDeleteBearerRequest.h"
+#include "sgwsNodeLevelLoadControlInformationInDeleteBearerRequest.h"
+#include "sgwsNodeLevelLoadControlInformationInDownlinkDataNotification.h"
+
+LoadControlInformationIe::LoadControlInformationIe()
+{
+    ieType = LoadControlInformationIeType;
+   
+    PgwsNodeLevelLoadControlInformationInCreateSessionResponse* pgwsNodeLevelLoadControlInformationInCreateSessionResponse_p = new (PgwsNodeLevelLoadControlInformationInCreateSessionResponse);
+    insertGroupedIeObject(CreateSessionResponseMsgType, 0, pgwsNodeLevelLoadControlInformationInCreateSessionResponse_p);
+    PgwsApnLevelLoadControlInformationInCreateSessionResponse* pgwsApnLevelLoadControlInformationInCreateSessionResponse_p = new (PgwsApnLevelLoadControlInformationInCreateSessionResponse);
+    insertGroupedIeObject(CreateSessionResponseMsgType, 1, pgwsApnLevelLoadControlInformationInCreateSessionResponse_p);
+    SgwsNodeLevelLoadControlInformationInCreateSessionResponse* sgwsNodeLevelLoadControlInformationInCreateSessionResponse_p = new (SgwsNodeLevelLoadControlInformationInCreateSessionResponse);
+    insertGroupedIeObject(CreateSessionResponseMsgType, 2, sgwsNodeLevelLoadControlInformationInCreateSessionResponse_p);
+    SgwsNodeLevelLoadControlInformationInModifyBearerResponse* sgwsNodeLevelLoadControlInformationInModifyBearerResponse_p = new (SgwsNodeLevelLoadControlInformationInModifyBearerResponse);
+    insertGroupedIeObject(ModifyBearerResponseMsgType, 2, sgwsNodeLevelLoadControlInformationInModifyBearerResponse_p);
+    PgwsApnLevelLoadControlInformationInModifyBearerResponse* pgwsApnLevelLoadControlInformationInModifyBearerResponse_p = new (PgwsApnLevelLoadControlInformationInModifyBearerResponse);
+    insertGroupedIeObject(ModifyBearerResponseMsgType, 1, pgwsApnLevelLoadControlInformationInModifyBearerResponse_p);
+    PgwsNodeLevelLoadControlInformationInModifyBearerResponse* pgwsNodeLevelLoadControlInformationInModifyBearerResponse_p = new (PgwsNodeLevelLoadControlInformationInModifyBearerResponse);
+    insertGroupedIeObject(ModifyBearerResponseMsgType, 0, pgwsNodeLevelLoadControlInformationInModifyBearerResponse_p);
+    PgwsNodeLevelLoadControlInformationInDeleteSessionResponse* pgwsNodeLevelLoadControlInformationInDeleteSessionResponse_p = new (PgwsNodeLevelLoadControlInformationInDeleteSessionResponse);
+    insertGroupedIeObject(DeleteSessionResponseMsgType, 0, pgwsNodeLevelLoadControlInformationInDeleteSessionResponse_p);
+    PgwsApnLevelLoadControlInformationInDeleteSessionResponse* pgwsApnLevelLoadControlInformationInDeleteSessionResponse_p = new (PgwsApnLevelLoadControlInformationInDeleteSessionResponse);
+    insertGroupedIeObject(DeleteSessionResponseMsgType, 1, pgwsApnLevelLoadControlInformationInDeleteSessionResponse_p);
+    SgwsNodeLevelLoadControlInformationInDeleteSessionResponse* sgwsNodeLevelLoadControlInformationInDeleteSessionResponse_p = new (SgwsNodeLevelLoadControlInformationInDeleteSessionResponse);
+    insertGroupedIeObject(DeleteSessionResponseMsgType, 2, sgwsNodeLevelLoadControlInformationInDeleteSessionResponse_p);
+    SgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponse* sgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponse_p = new (SgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponse);
+    insertGroupedIeObject(ReleaseAccessBearersResponseMsgType, 0, sgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponse_p);
+    PgwsNodeLevelLoadControlInformationInCreateBearerRequest* pgwsNodeLevelLoadControlInformationInCreateBearerRequest_p = new (PgwsNodeLevelLoadControlInformationInCreateBearerRequest);
+    insertGroupedIeObject(CreateBearerRequestMsgType, 0, pgwsNodeLevelLoadControlInformationInCreateBearerRequest_p);
+    PgwsApnLevelLoadControlInformationInCreateBearerRequest* pgwsApnLevelLoadControlInformationInCreateBearerRequest_p = new (PgwsApnLevelLoadControlInformationInCreateBearerRequest);
+    insertGroupedIeObject(CreateBearerRequestMsgType, 1, pgwsApnLevelLoadControlInformationInCreateBearerRequest_p);
+    SgwsNodeLevelLoadControlInformationInCreateBearerRequest* sgwsNodeLevelLoadControlInformationInCreateBearerRequest_p = new (SgwsNodeLevelLoadControlInformationInCreateBearerRequest);
+    insertGroupedIeObject(CreateBearerRequestMsgType, 2, sgwsNodeLevelLoadControlInformationInCreateBearerRequest_p);
+    PgwsNodeLevelLoadControlInformationInDeleteBearerRequest* pgwsNodeLevelLoadControlInformationInDeleteBearerRequest_p = new (PgwsNodeLevelLoadControlInformationInDeleteBearerRequest);
+    insertGroupedIeObject(DeleteBearerRequestMsgType, 0, pgwsNodeLevelLoadControlInformationInDeleteBearerRequest_p);
+    PgwsApnLevelLoadControlInformationInDeleteBearerRequest* pgwsApnLevelLoadControlInformationInDeleteBearerRequest_p = new (PgwsApnLevelLoadControlInformationInDeleteBearerRequest);
+    insertGroupedIeObject(DeleteBearerRequestMsgType, 1, pgwsApnLevelLoadControlInformationInDeleteBearerRequest_p);
+    SgwsNodeLevelLoadControlInformationInDeleteBearerRequest* sgwsNodeLevelLoadControlInformationInDeleteBearerRequest_p = new (SgwsNodeLevelLoadControlInformationInDeleteBearerRequest);
+    insertGroupedIeObject(DeleteBearerRequestMsgType, 2, sgwsNodeLevelLoadControlInformationInDeleteBearerRequest_p);
+    SgwsNodeLevelLoadControlInformationInDownlinkDataNotification* sgwsNodeLevelLoadControlInformationInDownlinkDataNotification_p = new (SgwsNodeLevelLoadControlInformationInDownlinkDataNotification);
+    insertGroupedIeObject(DownlinkDataNotificationMsgType, 0, sgwsNodeLevelLoadControlInformationInDownlinkDataNotification_p);
+}
+
+LoadControlInformationIe::~LoadControlInformationIe() {
+// TODO Auto-generated destructor stub
+}
+
+GtpV2GroupedIe& LoadControlInformationIe::getGroupedIe(Uint8 msgType, Uint8 instance)
+{
+    std::map<Uint16, GtpV2GroupedIe*>::iterator it;
+    Uint16 key = msgType;
+    key = (key << 8) + instance;
+    it = groupedIeObjectContainer.find(key);
+    return *(it->second);
+}
+
+void LoadControlInformationIe::insertGroupedIeObject(Uint8 msgType, Uint8 instance, GtpV2GroupedIe* grpIe_p)
+{
+
+    Uint16 key = msgType;
+    key = (key << 8) + instance;
+
+    groupedIeObjectContainer.insert(std::pair<Uint16, GtpV2GroupedIe*>(key, grpIe_p));
+
+}  
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/loadControlInformationIe.h b/src/gtpV2Codec/ieClasses/loadControlInformationIe.h
new file mode 100644
index 0000000..dbd7b52
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/loadControlInformationIe.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/grpietemplate.h.tt>
+ ******************************************************************************/
+#ifndef LOADCONTROLINFORMATIONIE_H_
+#define LOADCONTROLINFORMATIONIE_H_
+
+#include <map>
+#include "manual/gtpV2Ie.h"
+#include "manual/gtpV2GroupedIe.h"
+#include "gtpV2DataTypes.h"
+
+class LoadControlInformationIe:public GtpV2Ie
+{
+public:
+    LoadControlInformationIe ();
+    virtual ~ LoadControlInformationIe ();
+
+    GtpV2GroupedIe & getGroupedIe (Uint8 msgType, Uint8 instance);
+    void insertGroupedIeObject (Uint8 msgType, Uint8 instance,
+                GtpV2GroupedIe * grpIe_p);
+
+private:
+    map < Uint16, GtpV2GroupedIe * >groupedIeObjectContainer;   // map[msgType || instance]
+};
+
+#endif
diff --git a/src/gtpV2Codec/ieClasses/localDistinguishedNameIe.cpp b/src/gtpV2Codec/ieClasses/localDistinguishedNameIe.cpp
new file mode 100644
index 0000000..a5a450c
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/localDistinguishedNameIe.cpp
@@ -0,0 +1,78 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "localDistinguishedNameIe.h"
+#include "dataTypeCodecUtils.h"
+
+LocalDistinguishedNameIe::LocalDistinguishedNameIe() 
+{
+    ieType = 151;
+    // TODO
+
+}
+
+LocalDistinguishedNameIe::~LocalDistinguishedNameIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool LocalDistinguishedNameIe::encodeLocalDistinguishedNameIe(MsgBuffer &buffer, LocalDistinguishedNameIeData const &data)
+{
+    if (!(DataTypeCodecUtils::encodeUint8Array512(buffer, data.ldn)))
+    {
+    errorStream.add((char *)"Encoding of ldn failed\n");
+    return false;
+    }
+
+    return true;
+}
+
+bool LocalDistinguishedNameIe::decodeLocalDistinguishedNameIe(MsgBuffer &buffer, LocalDistinguishedNameIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+
+    Uint16 lengthLeft = length;
+    lengthLeft = ieBoundary - buffer.getCurrentIndex();
+    if (!(DataTypeCodecUtils::decodeUint8Array512(buffer, data.ldn, lengthLeft, 0)))
+    {
+        errorStream.add((char *)"Failed to decode: ldn\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE LocalDistinguishedNameIe\n");
+        return false;
+    }
+}
+void LocalDistinguishedNameIe::displayLocalDistinguishedNameIe_v(LocalDistinguishedNameIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"LocalDistinguishedNameIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add((char *)"ldn:");
+    stream.endOfLine();
+    DataTypeCodecUtils::displayUint8Array512_v(data.ldn, stream);
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/localDistinguishedNameIe.h b/src/gtpV2Codec/ieClasses/localDistinguishedNameIe.h
new file mode 100644
index 0000000..cdfd380
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/localDistinguishedNameIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef LOCALDISTINGUISHEDNAMEIE_H_
+#define LOCALDISTINGUISHEDNAMEIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class LocalDistinguishedNameIe: public GtpV2Ie {
+public:
+    LocalDistinguishedNameIe();
+    virtual ~LocalDistinguishedNameIe();
+
+    bool encodeLocalDistinguishedNameIe(MsgBuffer &buffer,
+                 LocalDistinguishedNameIeData const &data);
+    bool decodeLocalDistinguishedNameIe(MsgBuffer &buffer,
+                 LocalDistinguishedNameIeData &data, Uint16 length);
+    void displayLocalDistinguishedNameIe_v(LocalDistinguishedNameIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* LOCALDISTINGUISHEDNAMEIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/manual/dataTypeCodecUtils_manual.cpp b/src/gtpV2Codec/ieClasses/manual/dataTypeCodecUtils_manual.cpp
new file mode 100644
index 0000000..b15a798
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/manual/dataTypeCodecUtils_manual.cpp
@@ -0,0 +1,99 @@
+ /*
+Copyright 2019-present Infosys Limited  
+   
+SPDX-License-Identifier: Apache-2.0  
+  
+*/ 
+
+
+#include "../../../gtpV2Codec/ieClasses/dataTypeCodecUtils.h"
+#include "../../../gtpV2Codec/ieClasses/manual/gtpV2DataTypes_Manual.h"
+
+bool
+DataTypeCodecUtils::encodeDigitRegister (MsgBuffer & buffer,
+                                     DigitRegister const & data)
+{
+  Uint8 i;
+  for (i = 0; i< data.length; i+= 2)
+  {
+    Uint8 digit1 = data.digits[i];
+    Uint8 digit2 = data.digits[i+1];
+   
+    if (digit1 >9 || (digit2 > 9 && digit2 != 0x0F))
+    {
+      errorStream.add((char *)"Data validation failure: Non BCD digit encountered in DigitRegister\n");
+      return false;
+    }
+    else
+    {
+      buffer.writeBits(digit2, 4);
+      buffer.writeBits(digit1, 4);
+    }
+  }
+  return true;
+}
+
+bool
+DataTypeCodecUtils::decodeDigitRegister (MsgBuffer & buffer,
+                                     DigitRegister & data, 
+                                     Uint16 length)
+{
+  Uint8 i;
+  Uint8 digitLength = 0;
+  if (length > 8)
+  { 
+    errorStream.add((char *)"Data validation failure:DigitRegister.Length\n");
+    return false;
+  }
+  for (i = 0; i < length; i ++)
+  {
+     Uint8 digit1;
+     Uint8 digit2;
+     digit2 = buffer.readBits(4);
+     digit1 = buffer.readBits(4);
+     if (digit1 >9 || (digit2 > 9 && digit2 != 0x0F))
+     {
+       errorStream.add((char *)"Data validation failure: Non BCD Digit in DigitRegister\n");
+       return false;
+     }
+     else
+     {
+       data.digits[i*2] = digit1;
+       data.digits[i*2+1] = digit2;
+     }
+     digitLength += 2;
+     if (digit2 == 0x0F)
+     { 
+       // Reached the last digit stop here
+       digitLength--;
+       break;
+     }
+  }
+  data.length = digitLength;
+  return true;
+
+}
+
+void
+DataTypeCodecUtils::displayDigitRegister_v (DigitRegister const & data,
+                                            Debug & stream)
+{
+  stream.incrIndent();
+  stream.add((char *)"DigitRegister:");
+  stream.endOfLine();
+  stream.incrIndent();
+  stream.add((char *)"Length:");
+  stream.add(data.length);
+  stream.endOfLine();
+  Uint8 i;
+  for (i = 0; i < data.length; i++)
+  {
+    stream.add(data.digits[i]);
+    stream.add((char *)"  ");
+  }
+  stream.endOfLine();
+  stream.decrIndent();
+  stream.decrIndent();
+}
+
+
diff --git a/src/gtpV2Codec/ieClasses/manual/gtpV2DataTypes_Manual.h b/src/gtpV2Codec/ieClasses/manual/gtpV2DataTypes_Manual.h
new file mode 100644
index 0000000..2c7e5f9
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/manual/gtpV2DataTypes_Manual.h
@@ -0,0 +1,40 @@
+ /*
+Copyright 2019-present Infosys Limited  
+   
+SPDX-License-Identifier: Apache-2.0  
+  
+*/ 
+
+
+
+
+#ifndef GTPV2DATATYPES_MANUAL_H_
+#define GTPV2DATATYPES_MANUAL_H_
+
+typedef struct
+{
+  Uint8 length;
+  Uint8 digits[16];
+}DigitRegister;
+
+typedef struct
+{
+  Uint16 length;
+  Uint8 octets[16];
+}OctetArraySmall;
+
+
+typedef struct
+{
+  Uint16 length;
+  Uint8 octets[64];
+}OctetArrayMedium;
+
+typedef struct
+{
+  Uint16 length;
+  Uint8 octets[256];
+}OctetArrayLarge;
+
+
+#endif /*GTPV2DATATYPES_MANUAL_H_*/
diff --git a/src/gtpV2Codec/ieClasses/manual/gtpV2GroupedIe.cpp b/src/gtpV2Codec/ieClasses/manual/gtpV2GroupedIe.cpp
new file mode 100644
index 0000000..ee0c2c1
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/manual/gtpV2GroupedIe.cpp
@@ -0,0 +1,20 @@
+ /*
+Copyright 2019-present Infosys Limited  
+   
+SPDX-License-Identifier: Apache-2.0  
+  
+*/ 
+
+
+
+#include "../../../gtpV2Codec/ieClasses/manual/gtpV2GroupedIe.h"
+
+GtpV2GroupedIe::GtpV2GroupedIe() {
+	// TODO Auto-generated constructor stub
+
+}
+
+GtpV2GroupedIe::~GtpV2GroupedIe() {
+	// TODO Auto-generated destructor stub
+}
+
diff --git a/src/gtpV2Codec/ieClasses/manual/gtpV2GroupedIe.h b/src/gtpV2Codec/ieClasses/manual/gtpV2GroupedIe.h
new file mode 100644
index 0000000..df4da85
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/manual/gtpV2GroupedIe.h
@@ -0,0 +1,18 @@
+ /*
+Copyright 2019-present Infosys Limited  
+   
+SPDX-License-Identifier: Apache-2.0  
+  
+*/ 
+
+
+#ifndef GTPV2GROUPEDIE_H_
+#define GTPV2GROUPEDIE_H_
+
+class GtpV2GroupedIe {
+public:
+	GtpV2GroupedIe();
+	virtual ~GtpV2GroupedIe();
+};
+
+#endif /* GTPV2GROUPEDIE_H_ */
diff --git a/src/gtpV2Codec/ieClasses/manual/gtpV2Ie.cpp b/src/gtpV2Codec/ieClasses/manual/gtpV2Ie.cpp
new file mode 100644
index 0000000..a82512e
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/manual/gtpV2Ie.cpp
@@ -0,0 +1,45 @@
+ /*
+Copyright 2019-present Infosys Limited  
+   
+SPDX-License-Identifier: Apache-2.0  
+  
+*/ 
+ 
+
+
+#include "../../../gtpV2Codec/ieClasses/manual/gtpV2Ie.h"
+
+#include "msgBuffer.h"
+
+#define GTP_V2_IE_HEADER_LENGTH 4
+GtpV2Ie::GtpV2Ie() {
+	// TODO Auto-generated constructor stub
+
+}
+
+GtpV2Ie::~GtpV2Ie() {
+	// TODO Auto-generated destructor stub
+}
+
+void GtpV2Ie::decodeGtpV2IeHeader(MsgBuffer &buffer, GtpV2IeHeader &data)
+{
+	// Assume that the pointer in the MsgBuffer is pointing to the start of the IE
+	buffer.readUint8(data.ieType);
+	buffer.readUint16(data.length);
+	buffer.skipBits(4);
+	data.instance = buffer.readBits(4);
+}
+
+void GtpV2Ie::encodeGtpV2IeHeader(MsgBuffer &buffer, GtpV2IeHeader const &data)
+{
+	// Assume that the pointer in the MsgBuffer is pointing to the start of the IE
+	buffer.writeUint8(data.ieType, false);
+	buffer.writeUint16(data.length, false);
+	buffer.skipBits(4);
+	buffer.writeBits(data.instance, 4, false);
+}
+
+void GtpV2Ie::reserveHeaderSpace(MsgBuffer &buffer)
+{
+	buffer.skipBytes(GTP_V2_IE_HEADER_LENGTH);
+}
diff --git a/src/gtpV2Codec/ieClasses/manual/gtpV2Ie.h b/src/gtpV2Codec/ieClasses/manual/gtpV2Ie.h
new file mode 100644
index 0000000..6de3172
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/manual/gtpV2Ie.h
@@ -0,0 +1,39 @@
+ /*
+Copyright 2019-present Infosys Limited  
+   
+SPDX-License-Identifier: Apache-2.0  
+  
+*/ 
+
+
+
+#ifndef GTPV2IE_H_
+#define GTPV2IE_H_
+
+#include "basicTypes.h"
+#include "msgBuffer.h"
+#include "../gtpV2IeDataTypes.h"
+
+#define IE_HEADER_SIZE 4
+
+typedef struct
+{
+  Uint8  ieType;
+  Uint16 length;
+  Uint8  instance;
+}GtpV2IeHeader;
+
+class GtpV2Ie {
+public:
+	GtpV2Ie();
+	virtual ~GtpV2Ie();
+
+	static void encodeGtpV2IeHeader(MsgBuffer &buffer, GtpV2IeHeader const &data);
+	static void decodeGtpV2IeHeader(MsgBuffer &buffer, GtpV2IeHeader &data);
+	static void reserveHeaderSpace(MsgBuffer &buffer);
+
+protected:
+	Uint8 ieType;
+};
+
+#endif /* GTPV2IE_H_ */
diff --git a/src/gtpV2Codec/ieClasses/mappedUeUsageTypeIe.cpp b/src/gtpV2Codec/ieClasses/mappedUeUsageTypeIe.cpp
new file mode 100644
index 0000000..170e237
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/mappedUeUsageTypeIe.cpp
@@ -0,0 +1,77 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "mappedUeUsageTypeIe.h"
+#include "dataTypeCodecUtils.h"
+
+MappedUeUsageTypeIe::MappedUeUsageTypeIe() 
+{
+    ieType = 200;
+    // TODO
+
+}
+
+MappedUeUsageTypeIe::~MappedUeUsageTypeIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool MappedUeUsageTypeIe::encodeMappedUeUsageTypeIe(MsgBuffer &buffer, MappedUeUsageTypeIeData const &data)
+{
+    if (!(buffer.writeUint16(data.mappedUEUsageType)))
+    {
+        errorStream.add((char *)"Encoding of mappedUEUsageType failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool MappedUeUsageTypeIe::decodeMappedUeUsageTypeIe(MsgBuffer &buffer, MappedUeUsageTypeIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+
+    buffer.readUint16(data.mappedUEUsageType);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: mappedUEUsageType\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE MappedUeUsageTypeIe\n");
+        return false;
+    }
+}
+void MappedUeUsageTypeIe::displayMappedUeUsageTypeIe_v(MappedUeUsageTypeIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"MappedUeUsageTypeIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add((char *)"mappedUEUsageType: ");
+    stream.add(data.mappedUEUsageType);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/mappedUeUsageTypeIe.h b/src/gtpV2Codec/ieClasses/mappedUeUsageTypeIe.h
new file mode 100644
index 0000000..ae9749a
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/mappedUeUsageTypeIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef MAPPEDUEUSAGETYPEIE_H_
+#define MAPPEDUEUSAGETYPEIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class MappedUeUsageTypeIe: public GtpV2Ie {
+public:
+    MappedUeUsageTypeIe();
+    virtual ~MappedUeUsageTypeIe();
+
+    bool encodeMappedUeUsageTypeIe(MsgBuffer &buffer,
+                 MappedUeUsageTypeIeData const &data);
+    bool decodeMappedUeUsageTypeIe(MsgBuffer &buffer,
+                 MappedUeUsageTypeIeData &data, Uint16 length);
+    void displayMappedUeUsageTypeIe_v(MappedUeUsageTypeIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* MAPPEDUEUSAGETYPEIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/maximumPacketLossRateIe.cpp b/src/gtpV2Codec/ieClasses/maximumPacketLossRateIe.cpp
new file mode 100644
index 0000000..5c7f762
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/maximumPacketLossRateIe.cpp
@@ -0,0 +1,154 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "maximumPacketLossRateIe.h"
+#include "dataTypeCodecUtils.h"
+
+MaximumPacketLossRateIe::MaximumPacketLossRateIe() 
+{
+    ieType = 203;
+    // TODO
+
+}
+
+MaximumPacketLossRateIe::~MaximumPacketLossRateIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool MaximumPacketLossRateIe::encodeMaximumPacketLossRateIe(MsgBuffer &buffer, MaximumPacketLossRateIeData const &data)
+{
+    buffer.skipBits(6);
+
+    if(!(buffer.writeBits(data.dl, 1)))
+    {
+        errorStream.add((char *)"Encoding of dl failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.ul, 1)))
+    {
+        errorStream.add((char *)"Encoding of ul failed\n");
+        return false;
+    }
+    if (!(data.ulValue> 0 && data.ulValue<1000))
+    {
+        errorStream.add((char *)"Data validation failure: ulValue\n");
+        return false; 
+    }
+    if (!(buffer.writeUint16(data.ulValue)))
+    {
+        errorStream.add((char *)"Encoding of ulValue failed\n");
+        return false;
+    }
+    if (!(data.dlValue> 0 && data.dlValue<1000))
+    {
+        errorStream.add((char *)"Data validation failure: dlValue\n");
+        return false; 
+    }
+    if (!(buffer.writeUint16(data.dlValue)))
+    {
+        errorStream.add((char *)"Encoding of dlValue failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool MaximumPacketLossRateIe::decodeMaximumPacketLossRateIe(MsgBuffer &buffer, MaximumPacketLossRateIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+    buffer.skipBits(6);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: \n");
+        return false;
+    }
+
+    data.dl = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: dl\n");
+        return false;
+    }
+    data.ul = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: ul\n");
+        return false;
+    }
+
+    buffer.readUint16(data.ulValue);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: ulValue\n");
+        return false;
+    }
+    if (!(data.ulValue> 0 && data.ulValue<1000))
+    {
+        errorStream.add((char *)"Data validation failure : ulValue\n");
+        return false; //TODO need to add validations
+    }
+
+    buffer.readUint16(data.dlValue);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: dlValue\n");
+        return false;
+    }
+    if (!(data.dlValue> 0 && data.dlValue<1000))
+    {
+        errorStream.add((char *)"Data validation failure : dlValue\n");
+        return false; //TODO need to add validations
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE MaximumPacketLossRateIe\n");
+        return false;
+    }
+}
+void MaximumPacketLossRateIe::displayMaximumPacketLossRateIe_v(MaximumPacketLossRateIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"MaximumPacketLossRateIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add( (char *)"dl: "); 
+    stream.add((Uint8)data.dl);
+    stream.endOfLine();
+  
+    stream.add( (char *)"ul: "); 
+    stream.add((Uint8)data.ul);
+    stream.endOfLine();
+  
+    stream.add((char *)"ulValue: ");
+    stream.add(data.ulValue);
+    stream.endOfLine();
+  
+    stream.add((char *)"dlValue: ");
+    stream.add(data.dlValue);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/maximumPacketLossRateIe.h b/src/gtpV2Codec/ieClasses/maximumPacketLossRateIe.h
new file mode 100644
index 0000000..2f9cba1
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/maximumPacketLossRateIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef MAXIMUMPACKETLOSSRATEIE_H_
+#define MAXIMUMPACKETLOSSRATEIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class MaximumPacketLossRateIe: public GtpV2Ie {
+public:
+    MaximumPacketLossRateIe();
+    virtual ~MaximumPacketLossRateIe();
+
+    bool encodeMaximumPacketLossRateIe(MsgBuffer &buffer,
+                 MaximumPacketLossRateIeData const &data);
+    bool decodeMaximumPacketLossRateIe(MsgBuffer &buffer,
+                 MaximumPacketLossRateIeData &data, Uint16 length);
+    void displayMaximumPacketLossRateIe_v(MaximumPacketLossRateIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* MAXIMUMPACKETLOSSRATEIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/meiIe.cpp b/src/gtpV2Codec/ieClasses/meiIe.cpp
new file mode 100644
index 0000000..9fb328a
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/meiIe.cpp
@@ -0,0 +1,88 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "meiIe.h"
+#include "dataTypeCodecUtils.h"
+
+MeiIe::MeiIe() 
+{
+    ieType = 75;
+    // TODO
+
+}
+
+MeiIe::~MeiIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool MeiIe::encodeMeiIe(MsgBuffer &buffer, MeiIeData const &data)
+{
+    if (!(data.imeiSvValue.length ==15 || data.imeiSvValue.length == 16))
+    {
+        errorStream.add((char *)"Data validation failure: imeiSvValue\n");
+        return false; 
+    }
+    if (!(DataTypeCodecUtils::encodeDigitRegister(buffer, data.imeiSvValue)))
+    {
+    errorStream.add((char *)"Encoding of imeiSvValue failed\n");
+    return false;
+    }
+
+    return true;
+}
+
+bool MeiIe::decodeMeiIe(MsgBuffer &buffer, MeiIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+
+    Uint16 lengthLeft = length;
+    lengthLeft = ieBoundary - buffer.getCurrentIndex();
+    if (!(DataTypeCodecUtils::decodeDigitRegister(buffer, data.imeiSvValue, lengthLeft)))
+    {
+        errorStream.add((char *)"Failed to decode: imeiSvValue\n");
+        return false;
+    }
+    if (!(data.imeiSvValue.length ==15 || data.imeiSvValue.length == 16))
+    {
+        errorStream.add((char *)"Data validation failure : imeiSvValue\n");
+        return false; //TODO need to add validations
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE MeiIe\n");
+        return false;
+    }
+}
+void MeiIe::displayMeiIe_v(MeiIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"MeiIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add((char *)"imeiSvValue:");
+    stream.endOfLine();
+    DataTypeCodecUtils::displayDigitRegister_v(data.imeiSvValue, stream);
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/meiIe.h b/src/gtpV2Codec/ieClasses/meiIe.h
new file mode 100644
index 0000000..39988d8
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/meiIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef MEIIE_H_
+#define MEIIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class MeiIe: public GtpV2Ie {
+public:
+    MeiIe();
+    virtual ~MeiIe();
+
+    bool encodeMeiIe(MsgBuffer &buffer,
+                 MeiIeData const &data);
+    bool decodeMeiIe(MsgBuffer &buffer,
+                 MeiIeData &data, Uint16 length);
+    void displayMeiIe_v(MeiIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* MEIIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/metricIe.cpp b/src/gtpV2Codec/ieClasses/metricIe.cpp
new file mode 100644
index 0000000..acaefea
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/metricIe.cpp
@@ -0,0 +1,77 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "metricIe.h"
+#include "dataTypeCodecUtils.h"
+
+MetricIe::MetricIe() 
+{
+    ieType = 182;
+    // TODO
+
+}
+
+MetricIe::~MetricIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool MetricIe::encodeMetricIe(MsgBuffer &buffer, MetricIeData const &data)
+{
+    if (!(buffer.writeUint8(data.metric)))
+    {
+        errorStream.add((char *)"Encoding of metric failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool MetricIe::decodeMetricIe(MsgBuffer &buffer, MetricIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+
+    buffer.readUint8(data.metric);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: metric\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE MetricIe\n");
+        return false;
+    }
+}
+void MetricIe::displayMetricIe_v(MetricIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"MetricIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add((char *)"metric: ");
+    stream.add(data.metric);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/metricIe.h b/src/gtpV2Codec/ieClasses/metricIe.h
new file mode 100644
index 0000000..bfdc86e
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/metricIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef METRICIE_H_
+#define METRICIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class MetricIe: public GtpV2Ie {
+public:
+    MetricIe();
+    virtual ~MetricIe();
+
+    bool encodeMetricIe(MsgBuffer &buffer,
+                 MetricIeData const &data);
+    bool decodeMetricIe(MsgBuffer &buffer,
+                 MetricIeData &data, Uint16 length);
+    void displayMetricIe_v(MetricIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* METRICIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/millisecondTimeStampIe.cpp b/src/gtpV2Codec/ieClasses/millisecondTimeStampIe.cpp
new file mode 100644
index 0000000..111085a
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/millisecondTimeStampIe.cpp
@@ -0,0 +1,77 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "millisecondTimeStampIe.h"
+#include "dataTypeCodecUtils.h"
+
+MillisecondTimeStampIe::MillisecondTimeStampIe() 
+{
+    ieType = 188;
+    // TODO
+
+}
+
+MillisecondTimeStampIe::~MillisecondTimeStampIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool MillisecondTimeStampIe::encodeMillisecondTimeStampIe(MsgBuffer &buffer, MillisecondTimeStampIeData const &data)
+{
+    if (!(buffer.writeUint64(data.millisecondTimeStampValue)))
+    {
+        errorStream.add((char *)"Encoding of millisecondTimeStampValue failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool MillisecondTimeStampIe::decodeMillisecondTimeStampIe(MsgBuffer &buffer, MillisecondTimeStampIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+
+    buffer.readUint64(data.millisecondTimeStampValue);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: millisecondTimeStampValue\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE MillisecondTimeStampIe\n");
+        return false;
+    }
+}
+void MillisecondTimeStampIe::displayMillisecondTimeStampIe_v(MillisecondTimeStampIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"MillisecondTimeStampIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add((char *)"millisecondTimeStampValue: ");
+    stream.add(data.millisecondTimeStampValue);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/millisecondTimeStampIe.h b/src/gtpV2Codec/ieClasses/millisecondTimeStampIe.h
new file mode 100644
index 0000000..32d4c5e
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/millisecondTimeStampIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef MILLISECONDTIMESTAMPIE_H_
+#define MILLISECONDTIMESTAMPIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class MillisecondTimeStampIe: public GtpV2Ie {
+public:
+    MillisecondTimeStampIe();
+    virtual ~MillisecondTimeStampIe();
+
+    bool encodeMillisecondTimeStampIe(MsgBuffer &buffer,
+                 MillisecondTimeStampIeData const &data);
+    bool decodeMillisecondTimeStampIe(MsgBuffer &buffer,
+                 MillisecondTimeStampIeData &data, Uint16 length);
+    void displayMillisecondTimeStampIe_v(MillisecondTimeStampIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* MILLISECONDTIMESTAMPIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/mmeS4SgsnsOverloadControlInformationInCreateBearerResponse.cpp b/src/gtpV2Codec/ieClasses/mmeS4SgsnsOverloadControlInformationInCreateBearerResponse.cpp
new file mode 100644
index 0000000..be7326d
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/mmeS4SgsnsOverloadControlInformationInCreateBearerResponse.cpp
@@ -0,0 +1,306 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "mmeS4SgsnsOverloadControlInformationInCreateBearerResponse.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+#include "epcTimerIe.h"
+
+MmeS4SgsnsOverloadControlInformationInCreateBearerResponse::
+MmeS4SgsnsOverloadControlInformationInCreateBearerResponse()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // overloadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // overloadReductionMetric
+    mandatoryIeSet.insert(mandIe);
+    mandIe = EpcTimerIeType;
+    mandIe = (mandIe << 8) | 0; // periodOfValidity
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+MmeS4SgsnsOverloadControlInformationInCreateBearerResponse::
+~MmeS4SgsnsOverloadControlInformationInCreateBearerResponse()
+{
+
+}
+bool MmeS4SgsnsOverloadControlInformationInCreateBearerResponse::
+encodeMmeS4SgsnsOverloadControlInformationInCreateBearerResponse(MsgBuffer &buffer,
+                         MmeS4SgsnsOverloadControlInformationInCreateBearerResponseData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.overloadReductionMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadReductionMetric\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = EpcTimerIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    EpcTimerIe epcTimer=
+    dynamic_cast<
+    EpcTimerIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcTimerIeType));
+    rc = epcTimer.encodeEpcTimerIe(buffer, data.periodOfValidity);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: periodOfValidity\n");
+        return false;
+    }
+    return rc;
+}
+
+bool MmeS4SgsnsOverloadControlInformationInCreateBearerResponse::
+decodeMmeS4SgsnsOverloadControlInformationInCreateBearerResponse(MsgBuffer &buffer,
+                         MmeS4SgsnsOverloadControlInformationInCreateBearerResponseData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.overloadReductionMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadReductionMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case EpcTimerIeType:
+            {
+                EpcTimerIe ieObject =
+                dynamic_cast<
+                EpcTimerIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(EpcTimerIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeEpcTimerIe(buffer, data.periodOfValidity, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: periodOfValidity\n");
+                        return false;
+                    }
+                    Uint16 mandIe = EpcTimerIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void MmeS4SgsnsOverloadControlInformationInCreateBearerResponse::
+displayMmeS4SgsnsOverloadControlInformationInCreateBearerResponseData_v
+(MmeS4SgsnsOverloadControlInformationInCreateBearerResponseData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"MmeS4SgsnsOverloadControlInformationInCreateBearerResponse:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/mmeS4SgsnsOverloadControlInformationInCreateBearerResponse.h b/src/gtpV2Codec/ieClasses/mmeS4SgsnsOverloadControlInformationInCreateBearerResponse.h
new file mode 100644
index 0000000..97a2aeb
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/mmeS4SgsnsOverloadControlInformationInCreateBearerResponse.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef MMES4SGSNSOVERLOADCONTROLINFORMATIONINCREATEBEARERRESPONSE_H_
+#define MMES4SGSNSOVERLOADCONTROLINFORMATIONINCREATEBEARERRESPONSE_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class MmeS4SgsnsOverloadControlInformationInCreateBearerResponse:public GtpV2GroupedIe
+{
+public:
+    MmeS4SgsnsOverloadControlInformationInCreateBearerResponse();
+    virtual ~MmeS4SgsnsOverloadControlInformationInCreateBearerResponse();
+    bool encodeMmeS4SgsnsOverloadControlInformationInCreateBearerResponse(MsgBuffer &buffer,
+                             MmeS4SgsnsOverloadControlInformationInCreateBearerResponseData
+                              const &data);
+
+    bool decodeMmeS4SgsnsOverloadControlInformationInCreateBearerResponse (MsgBuffer &buffer,
+                             MmeS4SgsnsOverloadControlInformationInCreateBearerResponseData 
+                             & data, Uint16 length);
+
+    void displayMmeS4SgsnsOverloadControlInformationInCreateBearerResponseData_v
+    (MmeS4SgsnsOverloadControlInformationInCreateBearerResponseData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/mmeS4SgsnsOverloadControlInformationInCreateSessionRequest.cpp b/src/gtpV2Codec/ieClasses/mmeS4SgsnsOverloadControlInformationInCreateSessionRequest.cpp
new file mode 100644
index 0000000..4206a97
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/mmeS4SgsnsOverloadControlInformationInCreateSessionRequest.cpp
@@ -0,0 +1,306 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "mmeS4SgsnsOverloadControlInformationInCreateSessionRequest.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+#include "epcTimerIe.h"
+
+MmeS4SgsnsOverloadControlInformationInCreateSessionRequest::
+MmeS4SgsnsOverloadControlInformationInCreateSessionRequest()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // overloadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // overloadReductionMetric
+    mandatoryIeSet.insert(mandIe);
+    mandIe = EpcTimerIeType;
+    mandIe = (mandIe << 8) | 0; // periodOfValidity
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+MmeS4SgsnsOverloadControlInformationInCreateSessionRequest::
+~MmeS4SgsnsOverloadControlInformationInCreateSessionRequest()
+{
+
+}
+bool MmeS4SgsnsOverloadControlInformationInCreateSessionRequest::
+encodeMmeS4SgsnsOverloadControlInformationInCreateSessionRequest(MsgBuffer &buffer,
+                         MmeS4SgsnsOverloadControlInformationInCreateSessionRequestData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.overloadReductionMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadReductionMetric\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = EpcTimerIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    EpcTimerIe epcTimer=
+    dynamic_cast<
+    EpcTimerIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcTimerIeType));
+    rc = epcTimer.encodeEpcTimerIe(buffer, data.periodOfValidity);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: periodOfValidity\n");
+        return false;
+    }
+    return rc;
+}
+
+bool MmeS4SgsnsOverloadControlInformationInCreateSessionRequest::
+decodeMmeS4SgsnsOverloadControlInformationInCreateSessionRequest(MsgBuffer &buffer,
+                         MmeS4SgsnsOverloadControlInformationInCreateSessionRequestData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.overloadReductionMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadReductionMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case EpcTimerIeType:
+            {
+                EpcTimerIe ieObject =
+                dynamic_cast<
+                EpcTimerIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(EpcTimerIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeEpcTimerIe(buffer, data.periodOfValidity, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: periodOfValidity\n");
+                        return false;
+                    }
+                    Uint16 mandIe = EpcTimerIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void MmeS4SgsnsOverloadControlInformationInCreateSessionRequest::
+displayMmeS4SgsnsOverloadControlInformationInCreateSessionRequestData_v
+(MmeS4SgsnsOverloadControlInformationInCreateSessionRequestData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"MmeS4SgsnsOverloadControlInformationInCreateSessionRequest:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/mmeS4SgsnsOverloadControlInformationInCreateSessionRequest.h b/src/gtpV2Codec/ieClasses/mmeS4SgsnsOverloadControlInformationInCreateSessionRequest.h
new file mode 100644
index 0000000..1c6abbb
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/mmeS4SgsnsOverloadControlInformationInCreateSessionRequest.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef MMES4SGSNSOVERLOADCONTROLINFORMATIONINCREATESESSIONREQUEST_H_
+#define MMES4SGSNSOVERLOADCONTROLINFORMATIONINCREATESESSIONREQUEST_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class MmeS4SgsnsOverloadControlInformationInCreateSessionRequest:public GtpV2GroupedIe
+{
+public:
+    MmeS4SgsnsOverloadControlInformationInCreateSessionRequest();
+    virtual ~MmeS4SgsnsOverloadControlInformationInCreateSessionRequest();
+    bool encodeMmeS4SgsnsOverloadControlInformationInCreateSessionRequest(MsgBuffer &buffer,
+                             MmeS4SgsnsOverloadControlInformationInCreateSessionRequestData
+                              const &data);
+
+    bool decodeMmeS4SgsnsOverloadControlInformationInCreateSessionRequest (MsgBuffer &buffer,
+                             MmeS4SgsnsOverloadControlInformationInCreateSessionRequestData 
+                             & data, Uint16 length);
+
+    void displayMmeS4SgsnsOverloadControlInformationInCreateSessionRequestData_v
+    (MmeS4SgsnsOverloadControlInformationInCreateSessionRequestData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/mmeS4SgsnsOverloadControlInformationInDeleteBearerResponse.cpp b/src/gtpV2Codec/ieClasses/mmeS4SgsnsOverloadControlInformationInDeleteBearerResponse.cpp
new file mode 100644
index 0000000..c7dde91
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/mmeS4SgsnsOverloadControlInformationInDeleteBearerResponse.cpp
@@ -0,0 +1,306 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "mmeS4SgsnsOverloadControlInformationInDeleteBearerResponse.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+#include "epcTimerIe.h"
+
+MmeS4SgsnsOverloadControlInformationInDeleteBearerResponse::
+MmeS4SgsnsOverloadControlInformationInDeleteBearerResponse()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // overloadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // overloadReductionMetric
+    mandatoryIeSet.insert(mandIe);
+    mandIe = EpcTimerIeType;
+    mandIe = (mandIe << 8) | 0; // periodOfValidity
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+MmeS4SgsnsOverloadControlInformationInDeleteBearerResponse::
+~MmeS4SgsnsOverloadControlInformationInDeleteBearerResponse()
+{
+
+}
+bool MmeS4SgsnsOverloadControlInformationInDeleteBearerResponse::
+encodeMmeS4SgsnsOverloadControlInformationInDeleteBearerResponse(MsgBuffer &buffer,
+                         MmeS4SgsnsOverloadControlInformationInDeleteBearerResponseData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.overloadReductionMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadReductionMetric\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = EpcTimerIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    EpcTimerIe epcTimer=
+    dynamic_cast<
+    EpcTimerIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcTimerIeType));
+    rc = epcTimer.encodeEpcTimerIe(buffer, data.periodOfValidity);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: periodOfValidity\n");
+        return false;
+    }
+    return rc;
+}
+
+bool MmeS4SgsnsOverloadControlInformationInDeleteBearerResponse::
+decodeMmeS4SgsnsOverloadControlInformationInDeleteBearerResponse(MsgBuffer &buffer,
+                         MmeS4SgsnsOverloadControlInformationInDeleteBearerResponseData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.overloadReductionMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadReductionMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case EpcTimerIeType:
+            {
+                EpcTimerIe ieObject =
+                dynamic_cast<
+                EpcTimerIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(EpcTimerIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeEpcTimerIe(buffer, data.periodOfValidity, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: periodOfValidity\n");
+                        return false;
+                    }
+                    Uint16 mandIe = EpcTimerIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void MmeS4SgsnsOverloadControlInformationInDeleteBearerResponse::
+displayMmeS4SgsnsOverloadControlInformationInDeleteBearerResponseData_v
+(MmeS4SgsnsOverloadControlInformationInDeleteBearerResponseData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"MmeS4SgsnsOverloadControlInformationInDeleteBearerResponse:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/mmeS4SgsnsOverloadControlInformationInDeleteBearerResponse.h b/src/gtpV2Codec/ieClasses/mmeS4SgsnsOverloadControlInformationInDeleteBearerResponse.h
new file mode 100644
index 0000000..5943324
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/mmeS4SgsnsOverloadControlInformationInDeleteBearerResponse.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef MMES4SGSNSOVERLOADCONTROLINFORMATIONINDELETEBEARERRESPONSE_H_
+#define MMES4SGSNSOVERLOADCONTROLINFORMATIONINDELETEBEARERRESPONSE_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class MmeS4SgsnsOverloadControlInformationInDeleteBearerResponse:public GtpV2GroupedIe
+{
+public:
+    MmeS4SgsnsOverloadControlInformationInDeleteBearerResponse();
+    virtual ~MmeS4SgsnsOverloadControlInformationInDeleteBearerResponse();
+    bool encodeMmeS4SgsnsOverloadControlInformationInDeleteBearerResponse(MsgBuffer &buffer,
+                             MmeS4SgsnsOverloadControlInformationInDeleteBearerResponseData
+                              const &data);
+
+    bool decodeMmeS4SgsnsOverloadControlInformationInDeleteBearerResponse (MsgBuffer &buffer,
+                             MmeS4SgsnsOverloadControlInformationInDeleteBearerResponseData 
+                             & data, Uint16 length);
+
+    void displayMmeS4SgsnsOverloadControlInformationInDeleteBearerResponseData_v
+    (MmeS4SgsnsOverloadControlInformationInDeleteBearerResponseData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/mmeS4SgsnsOverloadControlInformationInDeleteSessionRequest.cpp b/src/gtpV2Codec/ieClasses/mmeS4SgsnsOverloadControlInformationInDeleteSessionRequest.cpp
new file mode 100644
index 0000000..53915de
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/mmeS4SgsnsOverloadControlInformationInDeleteSessionRequest.cpp
@@ -0,0 +1,306 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "mmeS4SgsnsOverloadControlInformationInDeleteSessionRequest.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+#include "epcTimerIe.h"
+
+MmeS4SgsnsOverloadControlInformationInDeleteSessionRequest::
+MmeS4SgsnsOverloadControlInformationInDeleteSessionRequest()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // overloadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // overloadReductionMetric
+    mandatoryIeSet.insert(mandIe);
+    mandIe = EpcTimerIeType;
+    mandIe = (mandIe << 8) | 0; // periodOfValidity
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+MmeS4SgsnsOverloadControlInformationInDeleteSessionRequest::
+~MmeS4SgsnsOverloadControlInformationInDeleteSessionRequest()
+{
+
+}
+bool MmeS4SgsnsOverloadControlInformationInDeleteSessionRequest::
+encodeMmeS4SgsnsOverloadControlInformationInDeleteSessionRequest(MsgBuffer &buffer,
+                         MmeS4SgsnsOverloadControlInformationInDeleteSessionRequestData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.overloadReductionMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadReductionMetric\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = EpcTimerIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    EpcTimerIe epcTimer=
+    dynamic_cast<
+    EpcTimerIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcTimerIeType));
+    rc = epcTimer.encodeEpcTimerIe(buffer, data.periodOfValidity);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: periodOfValidity\n");
+        return false;
+    }
+    return rc;
+}
+
+bool MmeS4SgsnsOverloadControlInformationInDeleteSessionRequest::
+decodeMmeS4SgsnsOverloadControlInformationInDeleteSessionRequest(MsgBuffer &buffer,
+                         MmeS4SgsnsOverloadControlInformationInDeleteSessionRequestData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.overloadReductionMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadReductionMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case EpcTimerIeType:
+            {
+                EpcTimerIe ieObject =
+                dynamic_cast<
+                EpcTimerIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(EpcTimerIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeEpcTimerIe(buffer, data.periodOfValidity, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: periodOfValidity\n");
+                        return false;
+                    }
+                    Uint16 mandIe = EpcTimerIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void MmeS4SgsnsOverloadControlInformationInDeleteSessionRequest::
+displayMmeS4SgsnsOverloadControlInformationInDeleteSessionRequestData_v
+(MmeS4SgsnsOverloadControlInformationInDeleteSessionRequestData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"MmeS4SgsnsOverloadControlInformationInDeleteSessionRequest:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/mmeS4SgsnsOverloadControlInformationInDeleteSessionRequest.h b/src/gtpV2Codec/ieClasses/mmeS4SgsnsOverloadControlInformationInDeleteSessionRequest.h
new file mode 100644
index 0000000..5863e87
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/mmeS4SgsnsOverloadControlInformationInDeleteSessionRequest.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef MMES4SGSNSOVERLOADCONTROLINFORMATIONINDELETESESSIONREQUEST_H_
+#define MMES4SGSNSOVERLOADCONTROLINFORMATIONINDELETESESSIONREQUEST_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class MmeS4SgsnsOverloadControlInformationInDeleteSessionRequest:public GtpV2GroupedIe
+{
+public:
+    MmeS4SgsnsOverloadControlInformationInDeleteSessionRequest();
+    virtual ~MmeS4SgsnsOverloadControlInformationInDeleteSessionRequest();
+    bool encodeMmeS4SgsnsOverloadControlInformationInDeleteSessionRequest(MsgBuffer &buffer,
+                             MmeS4SgsnsOverloadControlInformationInDeleteSessionRequestData
+                              const &data);
+
+    bool decodeMmeS4SgsnsOverloadControlInformationInDeleteSessionRequest (MsgBuffer &buffer,
+                             MmeS4SgsnsOverloadControlInformationInDeleteSessionRequestData 
+                             & data, Uint16 length);
+
+    void displayMmeS4SgsnsOverloadControlInformationInDeleteSessionRequestData_v
+    (MmeS4SgsnsOverloadControlInformationInDeleteSessionRequestData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/mmeS4SgsnsOverloadControlInformationInModifyBearerRequest.cpp b/src/gtpV2Codec/ieClasses/mmeS4SgsnsOverloadControlInformationInModifyBearerRequest.cpp
new file mode 100644
index 0000000..f85223e
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/mmeS4SgsnsOverloadControlInformationInModifyBearerRequest.cpp
@@ -0,0 +1,306 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "mmeS4SgsnsOverloadControlInformationInModifyBearerRequest.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+#include "epcTimerIe.h"
+
+MmeS4SgsnsOverloadControlInformationInModifyBearerRequest::
+MmeS4SgsnsOverloadControlInformationInModifyBearerRequest()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // overloadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // overloadReductionMetric
+    mandatoryIeSet.insert(mandIe);
+    mandIe = EpcTimerIeType;
+    mandIe = (mandIe << 8) | 0; // periodOfValidity
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+MmeS4SgsnsOverloadControlInformationInModifyBearerRequest::
+~MmeS4SgsnsOverloadControlInformationInModifyBearerRequest()
+{
+
+}
+bool MmeS4SgsnsOverloadControlInformationInModifyBearerRequest::
+encodeMmeS4SgsnsOverloadControlInformationInModifyBearerRequest(MsgBuffer &buffer,
+                         MmeS4SgsnsOverloadControlInformationInModifyBearerRequestData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.overloadReductionMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadReductionMetric\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = EpcTimerIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    EpcTimerIe epcTimer=
+    dynamic_cast<
+    EpcTimerIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcTimerIeType));
+    rc = epcTimer.encodeEpcTimerIe(buffer, data.periodOfValidity);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: periodOfValidity\n");
+        return false;
+    }
+    return rc;
+}
+
+bool MmeS4SgsnsOverloadControlInformationInModifyBearerRequest::
+decodeMmeS4SgsnsOverloadControlInformationInModifyBearerRequest(MsgBuffer &buffer,
+                         MmeS4SgsnsOverloadControlInformationInModifyBearerRequestData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.overloadReductionMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadReductionMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case EpcTimerIeType:
+            {
+                EpcTimerIe ieObject =
+                dynamic_cast<
+                EpcTimerIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(EpcTimerIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeEpcTimerIe(buffer, data.periodOfValidity, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: periodOfValidity\n");
+                        return false;
+                    }
+                    Uint16 mandIe = EpcTimerIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void MmeS4SgsnsOverloadControlInformationInModifyBearerRequest::
+displayMmeS4SgsnsOverloadControlInformationInModifyBearerRequestData_v
+(MmeS4SgsnsOverloadControlInformationInModifyBearerRequestData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"MmeS4SgsnsOverloadControlInformationInModifyBearerRequest:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/mmeS4SgsnsOverloadControlInformationInModifyBearerRequest.h b/src/gtpV2Codec/ieClasses/mmeS4SgsnsOverloadControlInformationInModifyBearerRequest.h
new file mode 100644
index 0000000..7bb9db6
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/mmeS4SgsnsOverloadControlInformationInModifyBearerRequest.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef MMES4SGSNSOVERLOADCONTROLINFORMATIONINMODIFYBEARERREQUEST_H_
+#define MMES4SGSNSOVERLOADCONTROLINFORMATIONINMODIFYBEARERREQUEST_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class MmeS4SgsnsOverloadControlInformationInModifyBearerRequest:public GtpV2GroupedIe
+{
+public:
+    MmeS4SgsnsOverloadControlInformationInModifyBearerRequest();
+    virtual ~MmeS4SgsnsOverloadControlInformationInModifyBearerRequest();
+    bool encodeMmeS4SgsnsOverloadControlInformationInModifyBearerRequest(MsgBuffer &buffer,
+                             MmeS4SgsnsOverloadControlInformationInModifyBearerRequestData
+                              const &data);
+
+    bool decodeMmeS4SgsnsOverloadControlInformationInModifyBearerRequest (MsgBuffer &buffer,
+                             MmeS4SgsnsOverloadControlInformationInModifyBearerRequestData 
+                             & data, Uint16 length);
+
+    void displayMmeS4SgsnsOverloadControlInformationInModifyBearerRequestData_v
+    (MmeS4SgsnsOverloadControlInformationInModifyBearerRequestData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/msisdnIe.cpp b/src/gtpV2Codec/ieClasses/msisdnIe.cpp
new file mode 100644
index 0000000..8e8f751
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/msisdnIe.cpp
@@ -0,0 +1,88 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "msisdnIe.h"
+#include "dataTypeCodecUtils.h"
+
+MsisdnIe::MsisdnIe() 
+{
+    ieType = 76;
+    // TODO
+
+}
+
+MsisdnIe::~MsisdnIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool MsisdnIe::encodeMsisdnIe(MsgBuffer &buffer, MsisdnIeData const &data)
+{
+    if (!(data.msisdnValue.length>=9 && data.msisdnValue.length <=15))
+    {
+        errorStream.add((char *)"Data validation failure: msisdnValue\n");
+        return false; 
+    }
+    if (!(DataTypeCodecUtils::encodeDigitRegister(buffer, data.msisdnValue)))
+    {
+    errorStream.add((char *)"Encoding of msisdnValue failed\n");
+    return false;
+    }
+
+    return true;
+}
+
+bool MsisdnIe::decodeMsisdnIe(MsgBuffer &buffer, MsisdnIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+
+    Uint16 lengthLeft = length;
+    lengthLeft = ieBoundary - buffer.getCurrentIndex();
+    if (!(DataTypeCodecUtils::decodeDigitRegister(buffer, data.msisdnValue, lengthLeft)))
+    {
+        errorStream.add((char *)"Failed to decode: msisdnValue\n");
+        return false;
+    }
+    if (!(data.msisdnValue.length>=9 && data.msisdnValue.length <=15))
+    {
+        errorStream.add((char *)"Data validation failure : msisdnValue\n");
+        return false; //TODO need to add validations
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE MsisdnIe\n");
+        return false;
+    }
+}
+void MsisdnIe::displayMsisdnIe_v(MsisdnIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"MsisdnIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add((char *)"msisdnValue:");
+    stream.endOfLine();
+    DataTypeCodecUtils::displayDigitRegister_v(data.msisdnValue, stream);
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/msisdnIe.h b/src/gtpV2Codec/ieClasses/msisdnIe.h
new file mode 100644
index 0000000..1a8486d
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/msisdnIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef MSISDNIE_H_
+#define MSISDNIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class MsisdnIe: public GtpV2Ie {
+public:
+    MsisdnIe();
+    virtual ~MsisdnIe();
+
+    bool encodeMsisdnIe(MsgBuffer &buffer,
+                 MsisdnIeData const &data);
+    bool decodeMsisdnIe(MsgBuffer &buffer,
+                 MsisdnIeData &data, Uint16 length);
+    void displayMsisdnIe_v(MsisdnIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* MSISDNIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/nodeIdentifierIe.cpp b/src/gtpV2Codec/ieClasses/nodeIdentifierIe.cpp
new file mode 100644
index 0000000..07f92de
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/nodeIdentifierIe.cpp
@@ -0,0 +1,145 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "nodeIdentifierIe.h"
+#include "dataTypeCodecUtils.h"
+
+NodeIdentifierIe::NodeIdentifierIe() 
+{
+    ieType = 176;
+    // TODO
+
+}
+
+NodeIdentifierIe::~NodeIdentifierIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool NodeIdentifierIe::encodeNodeIdentifierIe(MsgBuffer &buffer, NodeIdentifierIeData const &data)
+{
+    if (!(data.lengthOfNodeName!=0))
+    {
+        errorStream.add((char *)"Data validation failure: lengthOfNodeName\n");
+        return false; 
+    }
+    if (!(buffer.writeUint8(data.lengthOfNodeName)))
+    {
+        errorStream.add((char *)"Encoding of lengthOfNodeName failed\n");
+        return false;
+    }
+    if (!(buffer.writeUint8(data.nodeName)))
+    {
+        errorStream.add((char *)"Encoding of nodeName failed\n");
+        return false;
+    }
+    if (!(data.lengthOfNodeRealm!=0))
+    {
+        errorStream.add((char *)"Data validation failure: lengthOfNodeRealm\n");
+        return false; 
+    }
+    if (!(buffer.writeUint8(data.lengthOfNodeRealm)))
+    {
+        errorStream.add((char *)"Encoding of lengthOfNodeRealm failed\n");
+        return false;
+    }
+    if (!(buffer.writeUint8(data.nodeRealm)))
+    {
+        errorStream.add((char *)"Encoding of nodeRealm failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool NodeIdentifierIe::decodeNodeIdentifierIe(MsgBuffer &buffer, NodeIdentifierIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+
+    buffer.readUint8(data.lengthOfNodeName);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: lengthOfNodeName\n");
+        return false;
+    }
+    if (!(data.lengthOfNodeName!=0))
+    {
+        errorStream.add((char *)"Data validation failure : lengthOfNodeName\n");
+        return false; //TODO need to add validations
+    }
+
+    buffer.readUint8(data.nodeName);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: nodeName\n");
+        return false;
+    }
+
+    buffer.readUint8(data.lengthOfNodeRealm);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: lengthOfNodeRealm\n");
+        return false;
+    }
+    if (!(data.lengthOfNodeRealm!=0))
+    {
+        errorStream.add((char *)"Data validation failure : lengthOfNodeRealm\n");
+        return false; //TODO need to add validations
+    }
+
+    buffer.readUint8(data.nodeRealm);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: nodeRealm\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE NodeIdentifierIe\n");
+        return false;
+    }
+}
+void NodeIdentifierIe::displayNodeIdentifierIe_v(NodeIdentifierIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"NodeIdentifierIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add((char *)"lengthOfNodeName: ");
+    stream.add(data.lengthOfNodeName);
+    stream.endOfLine();
+  
+    stream.add((char *)"nodeName: ");
+    stream.add(data.nodeName);
+    stream.endOfLine();
+  
+    stream.add((char *)"lengthOfNodeRealm: ");
+    stream.add(data.lengthOfNodeRealm);
+    stream.endOfLine();
+  
+    stream.add((char *)"nodeRealm: ");
+    stream.add(data.nodeRealm);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/nodeIdentifierIe.h b/src/gtpV2Codec/ieClasses/nodeIdentifierIe.h
new file mode 100644
index 0000000..98067da
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/nodeIdentifierIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef NODEIDENTIFIERIE_H_
+#define NODEIDENTIFIERIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class NodeIdentifierIe: public GtpV2Ie {
+public:
+    NodeIdentifierIe();
+    virtual ~NodeIdentifierIe();
+
+    bool encodeNodeIdentifierIe(MsgBuffer &buffer,
+                 NodeIdentifierIeData const &data);
+    bool decodeNodeIdentifierIe(MsgBuffer &buffer,
+                 NodeIdentifierIeData &data, Uint16 length);
+    void displayNodeIdentifierIe_v(NodeIdentifierIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* NODEIDENTIFIERIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/nodeTypeIe.cpp b/src/gtpV2Codec/ieClasses/nodeTypeIe.cpp
new file mode 100644
index 0000000..3de9de9
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/nodeTypeIe.cpp
@@ -0,0 +1,87 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "nodeTypeIe.h"
+#include "dataTypeCodecUtils.h"
+
+NodeTypeIe::NodeTypeIe() 
+{
+    ieType = 135;
+    // TODO
+
+}
+
+NodeTypeIe::~NodeTypeIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool NodeTypeIe::encodeNodeTypeIe(MsgBuffer &buffer, NodeTypeIeData const &data)
+{
+    if (!(data.nodeType==0||data.nodeType==1))
+    {
+        errorStream.add((char *)"Data validation failure: nodeType\n");
+        return false; 
+    }
+    if (!(buffer.writeUint8(data.nodeType)))
+    {
+        errorStream.add((char *)"Encoding of nodeType failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool NodeTypeIe::decodeNodeTypeIe(MsgBuffer &buffer, NodeTypeIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+
+    buffer.readUint8(data.nodeType);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: nodeType\n");
+        return false;
+    }
+    if (!(data.nodeType==0||data.nodeType==1))
+    {
+        errorStream.add((char *)"Data validation failure : nodeType\n");
+        return false; //TODO need to add validations
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE NodeTypeIe\n");
+        return false;
+    }
+}
+void NodeTypeIe::displayNodeTypeIe_v(NodeTypeIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"NodeTypeIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add((char *)"nodeType: ");
+    stream.add(data.nodeType);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/nodeTypeIe.h b/src/gtpV2Codec/ieClasses/nodeTypeIe.h
new file mode 100644
index 0000000..f3896e1
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/nodeTypeIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef NODETYPEIE_H_
+#define NODETYPEIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class NodeTypeIe: public GtpV2Ie {
+public:
+    NodeTypeIe();
+    virtual ~NodeTypeIe();
+
+    bool encodeNodeTypeIe(MsgBuffer &buffer,
+                 NodeTypeIeData const &data);
+    bool decodeNodeTypeIe(MsgBuffer &buffer,
+                 NodeTypeIeData &data, Uint16 length);
+    void displayNodeTypeIe_v(NodeTypeIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* NODETYPEIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/overloadControlInformationIe.cpp b/src/gtpV2Codec/ieClasses/overloadControlInformationIe.cpp
new file mode 100644
index 0000000..d2c81ab
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/overloadControlInformationIe.cpp
@@ -0,0 +1,127 @@
+/*
+ * 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/grpietemplate.cpp.tt>
+ ******************************************************************************/
+#include "overloadControlInformationIe.h"
+#include "gtpV2GrpIeDataTypes.h"
+#include "manual/gtpV2GroupedIe.h"
+
+#include "sgwsOverloadControlInformationInCreateSessionRequest.h"
+#include "twanEpdgsOverloadControlInformationInCreateSessionRequest.h"
+#include "mmeS4SgsnsOverloadControlInformationInCreateSessionRequest.h"
+#include "pgwsOverloadControlInformationInCreateSessionResponse.h"
+#include "sgwsOverloadControlInformationInCreateSessionResponse.h"
+#include "mmeS4SgsnsOverloadControlInformationInModifyBearerRequest.h"
+#include "sgwsOverloadControlInformationInModifyBearerRequest.h"
+#include "epdgsOverloadControlInformationInModifyBearerRequest.h"
+#include "sgwsOverloadControlInformationInModifyBearerResponse.h"
+#include "pgwsOverloadControlInformationInModifyBearerResponse.h"
+#include "mmeS4SgsnsOverloadControlInformationInDeleteSessionRequest.h"
+#include "sgwsOverloadControlInformationInDeleteSessionRequest.h"
+#include "twanEpdgsOverloadControlInformationInDeleteSessionRequest.h"
+#include "sgwsOverloadControlInformationInDeleteSessionResponse.h"
+#include "pgwsOverloadControlInformationInDeleteSessionResponse.h"
+#include "sgwsOverloadControlInformationInReleaseAccessBearersResponse.h"
+#include "pgwsOverloadControlInformationInCreateBearerRequest.h"
+#include "sgwsOverloadControlInformationInCreateBearerRequest.h"
+#include "mmeS4SgsnsOverloadControlInformationInCreateBearerResponse.h"
+#include "sgwsOverloadControlInformationInCreateBearerResponse.h"
+#include "twanEpdgsOverloadControlInformationInCreateBearerResponse.h"
+#include "pgwsOverloadControlInformationInDeleteBearerRequest.h"
+#include "sgwsOverloadControlInformationInDeleteBearerRequest.h"
+#include "mmeS4SgsnsOverloadControlInformationInDeleteBearerResponse.h"
+#include "sgwsOverloadControlInformationInDeleteBearerResponse.h"
+#include "twanEpdgsOverloadControlInformationInDeleteBearerResponse.h"
+#include "sgwsOverloadControlInformationInDownlinkDataNotification.h"
+
+OverloadControlInformationIe::OverloadControlInformationIe()
+{
+    ieType = OverloadControlInformationIeType;
+   
+    SgwsOverloadControlInformationInCreateSessionRequest* sgwsOverloadControlInformationInCreateSessionRequest_p = new (SgwsOverloadControlInformationInCreateSessionRequest);
+    insertGroupedIeObject(CreateSessionRequestMsgType, 1, sgwsOverloadControlInformationInCreateSessionRequest_p);
+    TwanEpdgsOverloadControlInformationInCreateSessionRequest* twanEpdgsOverloadControlInformationInCreateSessionRequest_p = new (TwanEpdgsOverloadControlInformationInCreateSessionRequest);
+    insertGroupedIeObject(CreateSessionRequestMsgType, 2, twanEpdgsOverloadControlInformationInCreateSessionRequest_p);
+    MmeS4SgsnsOverloadControlInformationInCreateSessionRequest* mmeS4SgsnsOverloadControlInformationInCreateSessionRequest_p = new (MmeS4SgsnsOverloadControlInformationInCreateSessionRequest);
+    insertGroupedIeObject(CreateSessionRequestMsgType, 0, mmeS4SgsnsOverloadControlInformationInCreateSessionRequest_p);
+    PgwsOverloadControlInformationInCreateSessionResponse* pgwsOverloadControlInformationInCreateSessionResponse_p = new (PgwsOverloadControlInformationInCreateSessionResponse);
+    insertGroupedIeObject(CreateSessionResponseMsgType, 0, pgwsOverloadControlInformationInCreateSessionResponse_p);
+    SgwsOverloadControlInformationInCreateSessionResponse* sgwsOverloadControlInformationInCreateSessionResponse_p = new (SgwsOverloadControlInformationInCreateSessionResponse);
+    insertGroupedIeObject(CreateSessionResponseMsgType, 1, sgwsOverloadControlInformationInCreateSessionResponse_p);
+    MmeS4SgsnsOverloadControlInformationInModifyBearerRequest* mmeS4SgsnsOverloadControlInformationInModifyBearerRequest_p = new (MmeS4SgsnsOverloadControlInformationInModifyBearerRequest);
+    insertGroupedIeObject(ModifyBearerRequestMsgType, 0, mmeS4SgsnsOverloadControlInformationInModifyBearerRequest_p);
+    SgwsOverloadControlInformationInModifyBearerRequest* sgwsOverloadControlInformationInModifyBearerRequest_p = new (SgwsOverloadControlInformationInModifyBearerRequest);
+    insertGroupedIeObject(ModifyBearerRequestMsgType, 1, sgwsOverloadControlInformationInModifyBearerRequest_p);
+    EpdgsOverloadControlInformationInModifyBearerRequest* epdgsOverloadControlInformationInModifyBearerRequest_p = new (EpdgsOverloadControlInformationInModifyBearerRequest);
+    insertGroupedIeObject(ModifyBearerRequestMsgType, 2, epdgsOverloadControlInformationInModifyBearerRequest_p);
+    SgwsOverloadControlInformationInModifyBearerResponse* sgwsOverloadControlInformationInModifyBearerResponse_p = new (SgwsOverloadControlInformationInModifyBearerResponse);
+    insertGroupedIeObject(ModifyBearerResponseMsgType, 1, sgwsOverloadControlInformationInModifyBearerResponse_p);
+    PgwsOverloadControlInformationInModifyBearerResponse* pgwsOverloadControlInformationInModifyBearerResponse_p = new (PgwsOverloadControlInformationInModifyBearerResponse);
+    insertGroupedIeObject(ModifyBearerResponseMsgType, 0, pgwsOverloadControlInformationInModifyBearerResponse_p);
+    MmeS4SgsnsOverloadControlInformationInDeleteSessionRequest* mmeS4SgsnsOverloadControlInformationInDeleteSessionRequest_p = new (MmeS4SgsnsOverloadControlInformationInDeleteSessionRequest);
+    insertGroupedIeObject(DeleteSessionRequestMsgType, 0, mmeS4SgsnsOverloadControlInformationInDeleteSessionRequest_p);
+    SgwsOverloadControlInformationInDeleteSessionRequest* sgwsOverloadControlInformationInDeleteSessionRequest_p = new (SgwsOverloadControlInformationInDeleteSessionRequest);
+    insertGroupedIeObject(DeleteSessionRequestMsgType, 1, sgwsOverloadControlInformationInDeleteSessionRequest_p);
+    TwanEpdgsOverloadControlInformationInDeleteSessionRequest* twanEpdgsOverloadControlInformationInDeleteSessionRequest_p = new (TwanEpdgsOverloadControlInformationInDeleteSessionRequest);
+    insertGroupedIeObject(DeleteSessionRequestMsgType, 2, twanEpdgsOverloadControlInformationInDeleteSessionRequest_p);
+    SgwsOverloadControlInformationInDeleteSessionResponse* sgwsOverloadControlInformationInDeleteSessionResponse_p = new (SgwsOverloadControlInformationInDeleteSessionResponse);
+    insertGroupedIeObject(DeleteSessionResponseMsgType, 1, sgwsOverloadControlInformationInDeleteSessionResponse_p);
+    PgwsOverloadControlInformationInDeleteSessionResponse* pgwsOverloadControlInformationInDeleteSessionResponse_p = new (PgwsOverloadControlInformationInDeleteSessionResponse);
+    insertGroupedIeObject(DeleteSessionResponseMsgType, 0, pgwsOverloadControlInformationInDeleteSessionResponse_p);
+    SgwsOverloadControlInformationInReleaseAccessBearersResponse* sgwsOverloadControlInformationInReleaseAccessBearersResponse_p = new (SgwsOverloadControlInformationInReleaseAccessBearersResponse);
+    insertGroupedIeObject(ReleaseAccessBearersResponseMsgType, 0, sgwsOverloadControlInformationInReleaseAccessBearersResponse_p);
+    PgwsOverloadControlInformationInCreateBearerRequest* pgwsOverloadControlInformationInCreateBearerRequest_p = new (PgwsOverloadControlInformationInCreateBearerRequest);
+    insertGroupedIeObject(CreateBearerRequestMsgType, 0, pgwsOverloadControlInformationInCreateBearerRequest_p);
+    SgwsOverloadControlInformationInCreateBearerRequest* sgwsOverloadControlInformationInCreateBearerRequest_p = new (SgwsOverloadControlInformationInCreateBearerRequest);
+    insertGroupedIeObject(CreateBearerRequestMsgType, 1, sgwsOverloadControlInformationInCreateBearerRequest_p);
+    MmeS4SgsnsOverloadControlInformationInCreateBearerResponse* mmeS4SgsnsOverloadControlInformationInCreateBearerResponse_p = new (MmeS4SgsnsOverloadControlInformationInCreateBearerResponse);
+    insertGroupedIeObject(CreateBearerResponseMsgType, 0, mmeS4SgsnsOverloadControlInformationInCreateBearerResponse_p);
+    SgwsOverloadControlInformationInCreateBearerResponse* sgwsOverloadControlInformationInCreateBearerResponse_p = new (SgwsOverloadControlInformationInCreateBearerResponse);
+    insertGroupedIeObject(CreateBearerResponseMsgType, 1, sgwsOverloadControlInformationInCreateBearerResponse_p);
+    TwanEpdgsOverloadControlInformationInCreateBearerResponse* twanEpdgsOverloadControlInformationInCreateBearerResponse_p = new (TwanEpdgsOverloadControlInformationInCreateBearerResponse);
+    insertGroupedIeObject(CreateBearerResponseMsgType, 2, twanEpdgsOverloadControlInformationInCreateBearerResponse_p);
+    PgwsOverloadControlInformationInDeleteBearerRequest* pgwsOverloadControlInformationInDeleteBearerRequest_p = new (PgwsOverloadControlInformationInDeleteBearerRequest);
+    insertGroupedIeObject(DeleteBearerRequestMsgType, 0, pgwsOverloadControlInformationInDeleteBearerRequest_p);
+    SgwsOverloadControlInformationInDeleteBearerRequest* sgwsOverloadControlInformationInDeleteBearerRequest_p = new (SgwsOverloadControlInformationInDeleteBearerRequest);
+    insertGroupedIeObject(DeleteBearerRequestMsgType, 1, sgwsOverloadControlInformationInDeleteBearerRequest_p);
+    MmeS4SgsnsOverloadControlInformationInDeleteBearerResponse* mmeS4SgsnsOverloadControlInformationInDeleteBearerResponse_p = new (MmeS4SgsnsOverloadControlInformationInDeleteBearerResponse);
+    insertGroupedIeObject(DeleteBearerResponseMsgType, 0, mmeS4SgsnsOverloadControlInformationInDeleteBearerResponse_p);
+    SgwsOverloadControlInformationInDeleteBearerResponse* sgwsOverloadControlInformationInDeleteBearerResponse_p = new (SgwsOverloadControlInformationInDeleteBearerResponse);
+    insertGroupedIeObject(DeleteBearerResponseMsgType, 1, sgwsOverloadControlInformationInDeleteBearerResponse_p);
+    TwanEpdgsOverloadControlInformationInDeleteBearerResponse* twanEpdgsOverloadControlInformationInDeleteBearerResponse_p = new (TwanEpdgsOverloadControlInformationInDeleteBearerResponse);
+    insertGroupedIeObject(DeleteBearerResponseMsgType, 2, twanEpdgsOverloadControlInformationInDeleteBearerResponse_p);
+    SgwsOverloadControlInformationInDownlinkDataNotification* sgwsOverloadControlInformationInDownlinkDataNotification_p = new (SgwsOverloadControlInformationInDownlinkDataNotification);
+    insertGroupedIeObject(DownlinkDataNotificationMsgType, 0, sgwsOverloadControlInformationInDownlinkDataNotification_p);
+}
+
+OverloadControlInformationIe::~OverloadControlInformationIe() {
+// TODO Auto-generated destructor stub
+}
+
+GtpV2GroupedIe& OverloadControlInformationIe::getGroupedIe(Uint8 msgType, Uint8 instance)
+{
+    std::map<Uint16, GtpV2GroupedIe*>::iterator it;
+    Uint16 key = msgType;
+    key = (key << 8) + instance;
+    it = groupedIeObjectContainer.find(key);
+    return *(it->second);
+}
+
+void OverloadControlInformationIe::insertGroupedIeObject(Uint8 msgType, Uint8 instance, GtpV2GroupedIe* grpIe_p)
+{
+
+    Uint16 key = msgType;
+    key = (key << 8) + instance;
+
+    groupedIeObjectContainer.insert(std::pair<Uint16, GtpV2GroupedIe*>(key, grpIe_p));
+
+}  
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/overloadControlInformationIe.h b/src/gtpV2Codec/ieClasses/overloadControlInformationIe.h
new file mode 100644
index 0000000..7db8dad
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/overloadControlInformationIe.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/grpietemplate.h.tt>
+ ******************************************************************************/
+#ifndef OVERLOADCONTROLINFORMATIONIE_H_
+#define OVERLOADCONTROLINFORMATIONIE_H_
+
+#include <map>
+#include "manual/gtpV2Ie.h"
+#include "manual/gtpV2GroupedIe.h"
+#include "gtpV2DataTypes.h"
+
+class OverloadControlInformationIe:public GtpV2Ie
+{
+public:
+    OverloadControlInformationIe ();
+    virtual ~ OverloadControlInformationIe ();
+
+    GtpV2GroupedIe & getGroupedIe (Uint8 msgType, Uint8 instance);
+    void insertGroupedIeObject (Uint8 msgType, Uint8 instance,
+                GtpV2GroupedIe * grpIe_p);
+
+private:
+    map < Uint16, GtpV2GroupedIe * >groupedIeObjectContainer;   // map[msgType || instance]
+};
+
+#endif
diff --git a/src/gtpV2Codec/ieClasses/paaIe.cpp b/src/gtpV2Codec/ieClasses/paaIe.cpp
new file mode 100644
index 0000000..887abb1
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/paaIe.cpp
@@ -0,0 +1,174 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "paaIe.h"
+#include "dataTypeCodecUtils.h"
+
+PaaIe::PaaIe() 
+{
+    ieType = 79;
+    // TODO
+
+}
+
+PaaIe::~PaaIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool PaaIe::encodePaaIe(MsgBuffer &buffer, PaaIeData const &data)
+{
+    buffer.skipBits(5);
+
+    if (!(data.pdnType<= 3))
+    {
+        errorStream.add((char *)"Data validation failure: pdnType\n");
+        return false; 
+    }
+    if(!(buffer.writeBits(data.pdnType, 3)))
+    {
+        errorStream.add((char *)"Encoding of pdnType failed\n");
+        return false;
+    }
+    if (data.pdnType == 2 || data.pdnType == 3)
+    {
+        if (!(buffer.writeUint8(data.ipv6PrefixLength)))
+        {
+    errorStream.add((char *)"Encoding of ipv6PrefixLength failed\n");
+    return false;
+        }
+    }
+    if (data.pdnType == 2 || data.pdnType == 3)
+    {
+        if (!(DataTypeCodecUtils::encodeIpAddressV6(buffer, data.ipV6Address)))
+        {
+            errorStream.add((char *)"Encoding of ipV6Address failed\n");
+            return false;
+        }
+    }
+    if (data.pdnType == 1)
+    {
+        if (!(DataTypeCodecUtils::encodeIpAddressV4(buffer, data.ipV4Address)))
+        {
+            errorStream.add((char *)"Encoding of ipV4Address failed\n");
+            return false;
+        }
+    }
+
+    return true;
+}
+
+bool PaaIe::decodePaaIe(MsgBuffer &buffer, PaaIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+    buffer.skipBits(5);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: \n");
+        return false;
+    }
+
+    data.pdnType = buffer.readBits(3);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: pdnType\n");
+        return false;
+    }
+    if (!(data.pdnType<= 3))
+    {
+        errorStream.add((char *)"Data validation failure : pdnType\n");
+        return false; //TODO need to add validations
+    }
+
+    if (data.pdnType == 2 || data.pdnType == 3)
+    {
+
+        buffer.readUint8(data.ipv6PrefixLength);
+        if (buffer.getCurrentIndex() > ieBoundary)
+        {
+            errorStream.add((char *)"Attempt to read beyond IE boundary: ipv6PrefixLength\n");
+            return false;
+        }
+    }
+
+    Uint16 lengthLeft = length;
+
+    if (data.pdnType == 2 || data.pdnType == 3)
+    {
+        lengthLeft = ieBoundary - buffer.getCurrentIndex();
+        if (!(DataTypeCodecUtils::decodeIpAddressV6(buffer, data.ipV6Address, lengthLeft)))
+        {
+            errorStream.add((char *)"Failed to decode: ipV6Address\n");
+            return false;
+        }
+    }
+
+    if (data.pdnType == 1)
+    {
+        lengthLeft = ieBoundary - buffer.getCurrentIndex();
+        if (!(DataTypeCodecUtils::decodeIpAddressV4(buffer, data.ipV4Address, lengthLeft)))
+        {
+            errorStream.add((char *)"Failed to decode: ipV4Address\n");
+            return false;
+        }
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE PaaIe\n");
+        return false;
+    }
+}
+void PaaIe::displayPaaIe_v(PaaIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"PaaIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add( (char *)"pdnType: "); 
+    stream.add((Uint8)data.pdnType);
+    stream.endOfLine();
+  
+    if (data.pdnType == 2 || data.pdnType == 3)
+    {
+        stream.add((char *)"ipv6PrefixLength: ");
+        stream.add(data.ipv6PrefixLength);
+        stream.endOfLine();
+    }
+  
+    if (data.pdnType == 2 || data.pdnType == 3)
+    {
+        stream.add((char *)"ipV6Address:");
+        stream.endOfLine();
+        DataTypeCodecUtils::displayIpAddressV6_v(data.ipV6Address, stream);
+    }
+  
+    if (data.pdnType == 1)
+    {
+        stream.add((char *)"ipV4Address:");
+        stream.endOfLine();
+        DataTypeCodecUtils::displayIpAddressV4_v(data.ipV4Address, stream);
+    }
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/paaIe.h b/src/gtpV2Codec/ieClasses/paaIe.h
new file mode 100644
index 0000000..9be7b3e
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/paaIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef PAAIE_H_
+#define PAAIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class PaaIe: public GtpV2Ie {
+public:
+    PaaIe();
+    virtual ~PaaIe();
+
+    bool encodePaaIe(MsgBuffer &buffer,
+                 PaaIeData const &data);
+    bool decodePaaIe(MsgBuffer &buffer,
+                 PaaIeData &data, Uint16 length);
+    void displayPaaIe_v(PaaIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* PAAIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/pagingAndServiceInformationIe.cpp b/src/gtpV2Codec/ieClasses/pagingAndServiceInformationIe.cpp
new file mode 100644
index 0000000..8fa4625
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/pagingAndServiceInformationIe.cpp
@@ -0,0 +1,146 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "pagingAndServiceInformationIe.h"
+#include "dataTypeCodecUtils.h"
+
+PagingAndServiceInformationIe::PagingAndServiceInformationIe() 
+{
+    ieType = 186;
+    // TODO
+
+}
+
+PagingAndServiceInformationIe::~PagingAndServiceInformationIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool PagingAndServiceInformationIe::encodePagingAndServiceInformationIe(MsgBuffer &buffer, PagingAndServiceInformationIeData const &data)
+{
+    buffer.skipBits(4);
+
+    if(!(buffer.writeBits(data.epsBearerId, 4)))
+    {
+        errorStream.add((char *)"Encoding of epsBearerId failed\n");
+        return false;
+    }
+    buffer.skipBits(7);
+
+    if(!(buffer.writeBits(data.ppi, 1)))
+    {
+        errorStream.add((char *)"Encoding of ppi failed\n");
+        return false;
+    }
+    buffer.skipBits(2);
+
+    if (!(data.ppiValue==1))
+    {
+        errorStream.add((char *)"Data validation failure: ppiValue\n");
+        return false; 
+    }
+    if(!(buffer.writeBits(data.ppiValue, 6)))
+    {
+        errorStream.add((char *)"Encoding of ppiValue failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool PagingAndServiceInformationIe::decodePagingAndServiceInformationIe(MsgBuffer &buffer, PagingAndServiceInformationIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+    buffer.skipBits(4);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: \n");
+        return false;
+    }
+
+    data.epsBearerId = buffer.readBits(4);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: epsBearerId\n");
+        return false;
+    }
+    buffer.skipBits(7);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: \n");
+        return false;
+    }
+
+    data.ppi = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: ppi\n");
+        return false;
+    }
+    buffer.skipBits(2);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: \n");
+        return false;
+    }
+
+    data.ppiValue = buffer.readBits(6);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: ppiValue\n");
+        return false;
+    }
+    if (!(data.ppiValue==1))
+    {
+        errorStream.add((char *)"Data validation failure : ppiValue\n");
+        return false; //TODO need to add validations
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE PagingAndServiceInformationIe\n");
+        return false;
+    }
+}
+void PagingAndServiceInformationIe::displayPagingAndServiceInformationIe_v(PagingAndServiceInformationIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"PagingAndServiceInformationIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add( (char *)"epsBearerId: "); 
+    stream.add((Uint8)data.epsBearerId);
+    stream.endOfLine();
+  
+    stream.add( (char *)"ppi: "); 
+    stream.add((Uint8)data.ppi);
+    stream.endOfLine();
+  
+    stream.add( (char *)"ppiValue: "); 
+    stream.add((Uint8)data.ppiValue);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/pagingAndServiceInformationIe.h b/src/gtpV2Codec/ieClasses/pagingAndServiceInformationIe.h
new file mode 100644
index 0000000..e4fe140
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/pagingAndServiceInformationIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef PAGINGANDSERVICEINFORMATIONIE_H_
+#define PAGINGANDSERVICEINFORMATIONIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class PagingAndServiceInformationIe: public GtpV2Ie {
+public:
+    PagingAndServiceInformationIe();
+    virtual ~PagingAndServiceInformationIe();
+
+    bool encodePagingAndServiceInformationIe(MsgBuffer &buffer,
+                 PagingAndServiceInformationIeData const &data);
+    bool decodePagingAndServiceInformationIe(MsgBuffer &buffer,
+                 PagingAndServiceInformationIeData &data, Uint16 length);
+    void displayPagingAndServiceInformationIe_v(PagingAndServiceInformationIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* PAGINGANDSERVICEINFORMATIONIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/pcoIe.cpp b/src/gtpV2Codec/ieClasses/pcoIe.cpp
new file mode 100644
index 0000000..cecb1c2
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/pcoIe.cpp
@@ -0,0 +1,78 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "pcoIe.h"
+#include "dataTypeCodecUtils.h"
+
+PcoIe::PcoIe() 
+{
+    ieType = 78;
+    // TODO
+
+}
+
+PcoIe::~PcoIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool PcoIe::encodePcoIe(MsgBuffer &buffer, PcoIeData const &data)
+{
+    if (!(DataTypeCodecUtils::encodeUint8Array255(buffer, data.pcoValue)))
+    {
+    errorStream.add((char *)"Encoding of pcoValue failed\n");
+    return false;
+    }
+
+    return true;
+}
+
+bool PcoIe::decodePcoIe(MsgBuffer &buffer, PcoIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+
+    Uint16 lengthLeft = length;
+    lengthLeft = ieBoundary - buffer.getCurrentIndex();
+    if (!(DataTypeCodecUtils::decodeUint8Array255(buffer, data.pcoValue, lengthLeft, 0)))
+    {
+        errorStream.add((char *)"Failed to decode: pcoValue\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE PcoIe\n");
+        return false;
+    }
+}
+void PcoIe::displayPcoIe_v(PcoIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"PcoIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add((char *)"pcoValue:");
+    stream.endOfLine();
+    DataTypeCodecUtils::displayUint8Array255_v(data.pcoValue, stream);
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/pcoIe.h b/src/gtpV2Codec/ieClasses/pcoIe.h
new file mode 100644
index 0000000..4b3b9a6
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/pcoIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef PCOIE_H_
+#define PCOIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class PcoIe: public GtpV2Ie {
+public:
+    PcoIe();
+    virtual ~PcoIe();
+
+    bool encodePcoIe(MsgBuffer &buffer,
+                 PcoIeData const &data);
+    bool decodePcoIe(MsgBuffer &buffer,
+                 PcoIeData &data, Uint16 length);
+    void displayPcoIe_v(PcoIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* PCOIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/pdnTypeIe.cpp b/src/gtpV2Codec/ieClasses/pdnTypeIe.cpp
new file mode 100644
index 0000000..35a8682
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/pdnTypeIe.cpp
@@ -0,0 +1,96 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "pdnTypeIe.h"
+#include "dataTypeCodecUtils.h"
+
+PdnTypeIe::PdnTypeIe() 
+{
+    ieType = 99;
+    // TODO
+
+}
+
+PdnTypeIe::~PdnTypeIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool PdnTypeIe::encodePdnTypeIe(MsgBuffer &buffer, PdnTypeIeData const &data)
+{
+    buffer.skipBits(5);
+
+    if (!(data.pdnType<= 3))
+    {
+        errorStream.add((char *)"Data validation failure: pdnType\n");
+        return false; 
+    }
+    if(!(buffer.writeBits(data.pdnType, 3)))
+    {
+        errorStream.add((char *)"Encoding of pdnType failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool PdnTypeIe::decodePdnTypeIe(MsgBuffer &buffer, PdnTypeIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+    buffer.skipBits(5);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: \n");
+        return false;
+    }
+
+    data.pdnType = buffer.readBits(3);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: pdnType\n");
+        return false;
+    }
+    if (!(data.pdnType<= 3))
+    {
+        errorStream.add((char *)"Data validation failure : pdnType\n");
+        return false; //TODO need to add validations
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE PdnTypeIe\n");
+        return false;
+    }
+}
+void PdnTypeIe::displayPdnTypeIe_v(PdnTypeIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"PdnTypeIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add( (char *)"pdnType: "); 
+    stream.add((Uint8)data.pdnType);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/pdnTypeIe.h b/src/gtpV2Codec/ieClasses/pdnTypeIe.h
new file mode 100644
index 0000000..d245bad
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/pdnTypeIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef PDNTYPEIE_H_
+#define PDNTYPEIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class PdnTypeIe: public GtpV2Ie {
+public:
+    PdnTypeIe();
+    virtual ~PdnTypeIe();
+
+    bool encodePdnTypeIe(MsgBuffer &buffer,
+                 PdnTypeIeData const &data);
+    bool decodePdnTypeIe(MsgBuffer &buffer,
+                 PdnTypeIeData &data, Uint16 length);
+    void displayPdnTypeIe_v(PdnTypeIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* PDNTYPEIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/pgwsApnLevelLoadControlInformationInCreateBearerRequest.cpp b/src/gtpV2Codec/ieClasses/pgwsApnLevelLoadControlInformationInCreateBearerRequest.cpp
new file mode 100644
index 0000000..75b9136
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/pgwsApnLevelLoadControlInformationInCreateBearerRequest.cpp
@@ -0,0 +1,306 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "pgwsApnLevelLoadControlInformationInCreateBearerRequest.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+#include "apnAndRelativeCapacityIe.h"
+
+PgwsApnLevelLoadControlInformationInCreateBearerRequest::
+PgwsApnLevelLoadControlInformationInCreateBearerRequest()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // loadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // loadMetric
+    mandatoryIeSet.insert(mandIe);
+    mandIe = ApnAndRelativeCapacityIeType;
+    mandIe = (mandIe << 8) | 0; // listOfApnAndRelativeCapacity
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+PgwsApnLevelLoadControlInformationInCreateBearerRequest::
+~PgwsApnLevelLoadControlInformationInCreateBearerRequest()
+{
+
+}
+bool PgwsApnLevelLoadControlInformationInCreateBearerRequest::
+encodePgwsApnLevelLoadControlInformationInCreateBearerRequest(MsgBuffer &buffer,
+                         PgwsApnLevelLoadControlInformationInCreateBearerRequestData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.loadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: loadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.loadMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: loadMetric\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = ApnAndRelativeCapacityIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    ApnAndRelativeCapacityIe apnAndRelativeCapacity=
+    dynamic_cast<
+    ApnAndRelativeCapacityIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnAndRelativeCapacityIeType));
+    rc = apnAndRelativeCapacity.encodeApnAndRelativeCapacityIe(buffer, data.listOfApnAndRelativeCapacity);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: listOfApnAndRelativeCapacity\n");
+        return false;
+    }
+    return rc;
+}
+
+bool PgwsApnLevelLoadControlInformationInCreateBearerRequest::
+decodePgwsApnLevelLoadControlInformationInCreateBearerRequest(MsgBuffer &buffer,
+                         PgwsApnLevelLoadControlInformationInCreateBearerRequestData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.loadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: loadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.loadMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: loadMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case ApnAndRelativeCapacityIeType:
+            {
+                ApnAndRelativeCapacityIe ieObject =
+                dynamic_cast<
+                ApnAndRelativeCapacityIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(ApnAndRelativeCapacityIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeApnAndRelativeCapacityIe(buffer, data.listOfApnAndRelativeCapacity, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: listOfApnAndRelativeCapacity\n");
+                        return false;
+                    }
+                    Uint16 mandIe = ApnAndRelativeCapacityIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void PgwsApnLevelLoadControlInformationInCreateBearerRequest::
+displayPgwsApnLevelLoadControlInformationInCreateBearerRequestData_v
+(PgwsApnLevelLoadControlInformationInCreateBearerRequestData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"PgwsApnLevelLoadControlInformationInCreateBearerRequest:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/pgwsApnLevelLoadControlInformationInCreateBearerRequest.h b/src/gtpV2Codec/ieClasses/pgwsApnLevelLoadControlInformationInCreateBearerRequest.h
new file mode 100644
index 0000000..153f759
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/pgwsApnLevelLoadControlInformationInCreateBearerRequest.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef PGWSAPNLEVELLOADCONTROLINFORMATIONINCREATEBEARERREQUEST_H_
+#define PGWSAPNLEVELLOADCONTROLINFORMATIONINCREATEBEARERREQUEST_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class PgwsApnLevelLoadControlInformationInCreateBearerRequest:public GtpV2GroupedIe
+{
+public:
+    PgwsApnLevelLoadControlInformationInCreateBearerRequest();
+    virtual ~PgwsApnLevelLoadControlInformationInCreateBearerRequest();
+    bool encodePgwsApnLevelLoadControlInformationInCreateBearerRequest(MsgBuffer &buffer,
+                             PgwsApnLevelLoadControlInformationInCreateBearerRequestData
+                              const &data);
+
+    bool decodePgwsApnLevelLoadControlInformationInCreateBearerRequest (MsgBuffer &buffer,
+                             PgwsApnLevelLoadControlInformationInCreateBearerRequestData 
+                             & data, Uint16 length);
+
+    void displayPgwsApnLevelLoadControlInformationInCreateBearerRequestData_v
+    (PgwsApnLevelLoadControlInformationInCreateBearerRequestData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/pgwsApnLevelLoadControlInformationInCreateSessionResponse.cpp b/src/gtpV2Codec/ieClasses/pgwsApnLevelLoadControlInformationInCreateSessionResponse.cpp
new file mode 100644
index 0000000..a004c0a
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/pgwsApnLevelLoadControlInformationInCreateSessionResponse.cpp
@@ -0,0 +1,306 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "pgwsApnLevelLoadControlInformationInCreateSessionResponse.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+#include "apnAndRelativeCapacityIe.h"
+
+PgwsApnLevelLoadControlInformationInCreateSessionResponse::
+PgwsApnLevelLoadControlInformationInCreateSessionResponse()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // loadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // loadMetric
+    mandatoryIeSet.insert(mandIe);
+    mandIe = ApnAndRelativeCapacityIeType;
+    mandIe = (mandIe << 8) | 0; // listOfApnAndRelativeCapacity
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+PgwsApnLevelLoadControlInformationInCreateSessionResponse::
+~PgwsApnLevelLoadControlInformationInCreateSessionResponse()
+{
+
+}
+bool PgwsApnLevelLoadControlInformationInCreateSessionResponse::
+encodePgwsApnLevelLoadControlInformationInCreateSessionResponse(MsgBuffer &buffer,
+                         PgwsApnLevelLoadControlInformationInCreateSessionResponseData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.loadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: loadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.loadMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: loadMetric\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = ApnAndRelativeCapacityIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    ApnAndRelativeCapacityIe apnAndRelativeCapacity=
+    dynamic_cast<
+    ApnAndRelativeCapacityIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnAndRelativeCapacityIeType));
+    rc = apnAndRelativeCapacity.encodeApnAndRelativeCapacityIe(buffer, data.listOfApnAndRelativeCapacity);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: listOfApnAndRelativeCapacity\n");
+        return false;
+    }
+    return rc;
+}
+
+bool PgwsApnLevelLoadControlInformationInCreateSessionResponse::
+decodePgwsApnLevelLoadControlInformationInCreateSessionResponse(MsgBuffer &buffer,
+                         PgwsApnLevelLoadControlInformationInCreateSessionResponseData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.loadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: loadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.loadMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: loadMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case ApnAndRelativeCapacityIeType:
+            {
+                ApnAndRelativeCapacityIe ieObject =
+                dynamic_cast<
+                ApnAndRelativeCapacityIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(ApnAndRelativeCapacityIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeApnAndRelativeCapacityIe(buffer, data.listOfApnAndRelativeCapacity, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: listOfApnAndRelativeCapacity\n");
+                        return false;
+                    }
+                    Uint16 mandIe = ApnAndRelativeCapacityIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void PgwsApnLevelLoadControlInformationInCreateSessionResponse::
+displayPgwsApnLevelLoadControlInformationInCreateSessionResponseData_v
+(PgwsApnLevelLoadControlInformationInCreateSessionResponseData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"PgwsApnLevelLoadControlInformationInCreateSessionResponse:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/pgwsApnLevelLoadControlInformationInCreateSessionResponse.h b/src/gtpV2Codec/ieClasses/pgwsApnLevelLoadControlInformationInCreateSessionResponse.h
new file mode 100644
index 0000000..b9ac321
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/pgwsApnLevelLoadControlInformationInCreateSessionResponse.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef PGWSAPNLEVELLOADCONTROLINFORMATIONINCREATESESSIONRESPONSE_H_
+#define PGWSAPNLEVELLOADCONTROLINFORMATIONINCREATESESSIONRESPONSE_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class PgwsApnLevelLoadControlInformationInCreateSessionResponse:public GtpV2GroupedIe
+{
+public:
+    PgwsApnLevelLoadControlInformationInCreateSessionResponse();
+    virtual ~PgwsApnLevelLoadControlInformationInCreateSessionResponse();
+    bool encodePgwsApnLevelLoadControlInformationInCreateSessionResponse(MsgBuffer &buffer,
+                             PgwsApnLevelLoadControlInformationInCreateSessionResponseData
+                              const &data);
+
+    bool decodePgwsApnLevelLoadControlInformationInCreateSessionResponse (MsgBuffer &buffer,
+                             PgwsApnLevelLoadControlInformationInCreateSessionResponseData 
+                             & data, Uint16 length);
+
+    void displayPgwsApnLevelLoadControlInformationInCreateSessionResponseData_v
+    (PgwsApnLevelLoadControlInformationInCreateSessionResponseData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/pgwsApnLevelLoadControlInformationInDeleteBearerRequest.cpp b/src/gtpV2Codec/ieClasses/pgwsApnLevelLoadControlInformationInDeleteBearerRequest.cpp
new file mode 100644
index 0000000..d2fb9f5
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/pgwsApnLevelLoadControlInformationInDeleteBearerRequest.cpp
@@ -0,0 +1,315 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "pgwsApnLevelLoadControlInformationInDeleteBearerRequest.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+#include "apnAndRelativeCapacityIe.h"
+
+PgwsApnLevelLoadControlInformationInDeleteBearerRequest::
+PgwsApnLevelLoadControlInformationInDeleteBearerRequest()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // loadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // loadMetric
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+PgwsApnLevelLoadControlInformationInDeleteBearerRequest::
+~PgwsApnLevelLoadControlInformationInDeleteBearerRequest()
+{
+
+}
+bool PgwsApnLevelLoadControlInformationInDeleteBearerRequest::
+encodePgwsApnLevelLoadControlInformationInDeleteBearerRequest(MsgBuffer &buffer,
+                         PgwsApnLevelLoadControlInformationInDeleteBearerRequestData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.loadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: loadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.loadMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: loadMetric\n");
+        return false;
+    }
+
+    if (data.listOfApnAndRelativeCapacityIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = ApnAndRelativeCapacityIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        ApnAndRelativeCapacityIe apnAndRelativeCapacity=
+        dynamic_cast<
+        ApnAndRelativeCapacityIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnAndRelativeCapacityIeType));
+        rc = apnAndRelativeCapacity.encodeApnAndRelativeCapacityIe(buffer, data.listOfApnAndRelativeCapacity);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: listOfApnAndRelativeCapacity\n");
+          return false;
+        }
+    }
+    return rc;
+}
+
+bool PgwsApnLevelLoadControlInformationInDeleteBearerRequest::
+decodePgwsApnLevelLoadControlInformationInDeleteBearerRequest(MsgBuffer &buffer,
+                         PgwsApnLevelLoadControlInformationInDeleteBearerRequestData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.loadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: loadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.loadMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: loadMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case ApnAndRelativeCapacityIeType:
+            {
+                ApnAndRelativeCapacityIe ieObject =
+                dynamic_cast<
+                ApnAndRelativeCapacityIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(ApnAndRelativeCapacityIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeApnAndRelativeCapacityIe(buffer, data.listOfApnAndRelativeCapacity, ieHeader.length);
+
+                    data.listOfApnAndRelativeCapacityIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: listOfApnAndRelativeCapacity\n");
+                        return false;
+                    }
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void PgwsApnLevelLoadControlInformationInDeleteBearerRequest::
+displayPgwsApnLevelLoadControlInformationInDeleteBearerRequestData_v
+(PgwsApnLevelLoadControlInformationInDeleteBearerRequestData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"PgwsApnLevelLoadControlInformationInDeleteBearerRequest:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+    if (data.listOfApnAndRelativeCapacityIePresent)
+    {
+
+        stream.add((char *)"listOfApnAndRelativeCapacity:");
+        stream.endOfLine();
+        ApnAndRelativeCapacityIe apnAndRelativeCapacity=
+        dynamic_cast<
+        ApnAndRelativeCapacityIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnAndRelativeCapacityIeType));
+        apnAndRelativeCapacity.displayApnAndRelativeCapacityIe_v(data.listOfApnAndRelativeCapacity, stream);
+
+    }
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/pgwsApnLevelLoadControlInformationInDeleteBearerRequest.h b/src/gtpV2Codec/ieClasses/pgwsApnLevelLoadControlInformationInDeleteBearerRequest.h
new file mode 100644
index 0000000..6df0f59
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/pgwsApnLevelLoadControlInformationInDeleteBearerRequest.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef PGWSAPNLEVELLOADCONTROLINFORMATIONINDELETEBEARERREQUEST_H_
+#define PGWSAPNLEVELLOADCONTROLINFORMATIONINDELETEBEARERREQUEST_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class PgwsApnLevelLoadControlInformationInDeleteBearerRequest:public GtpV2GroupedIe
+{
+public:
+    PgwsApnLevelLoadControlInformationInDeleteBearerRequest();
+    virtual ~PgwsApnLevelLoadControlInformationInDeleteBearerRequest();
+    bool encodePgwsApnLevelLoadControlInformationInDeleteBearerRequest(MsgBuffer &buffer,
+                             PgwsApnLevelLoadControlInformationInDeleteBearerRequestData
+                              const &data);
+
+    bool decodePgwsApnLevelLoadControlInformationInDeleteBearerRequest (MsgBuffer &buffer,
+                             PgwsApnLevelLoadControlInformationInDeleteBearerRequestData 
+                             & data, Uint16 length);
+
+    void displayPgwsApnLevelLoadControlInformationInDeleteBearerRequestData_v
+    (PgwsApnLevelLoadControlInformationInDeleteBearerRequestData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/pgwsApnLevelLoadControlInformationInDeleteSessionResponse.cpp b/src/gtpV2Codec/ieClasses/pgwsApnLevelLoadControlInformationInDeleteSessionResponse.cpp
new file mode 100644
index 0000000..602332b
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/pgwsApnLevelLoadControlInformationInDeleteSessionResponse.cpp
@@ -0,0 +1,306 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "pgwsApnLevelLoadControlInformationInDeleteSessionResponse.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+#include "apnAndRelativeCapacityIe.h"
+
+PgwsApnLevelLoadControlInformationInDeleteSessionResponse::
+PgwsApnLevelLoadControlInformationInDeleteSessionResponse()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // loadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // loadMetric
+    mandatoryIeSet.insert(mandIe);
+    mandIe = ApnAndRelativeCapacityIeType;
+    mandIe = (mandIe << 8) | 0; // listOfApnAndRelativeCapacity
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+PgwsApnLevelLoadControlInformationInDeleteSessionResponse::
+~PgwsApnLevelLoadControlInformationInDeleteSessionResponse()
+{
+
+}
+bool PgwsApnLevelLoadControlInformationInDeleteSessionResponse::
+encodePgwsApnLevelLoadControlInformationInDeleteSessionResponse(MsgBuffer &buffer,
+                         PgwsApnLevelLoadControlInformationInDeleteSessionResponseData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.loadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: loadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.loadMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: loadMetric\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = ApnAndRelativeCapacityIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    ApnAndRelativeCapacityIe apnAndRelativeCapacity=
+    dynamic_cast<
+    ApnAndRelativeCapacityIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnAndRelativeCapacityIeType));
+    rc = apnAndRelativeCapacity.encodeApnAndRelativeCapacityIe(buffer, data.listOfApnAndRelativeCapacity);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: listOfApnAndRelativeCapacity\n");
+        return false;
+    }
+    return rc;
+}
+
+bool PgwsApnLevelLoadControlInformationInDeleteSessionResponse::
+decodePgwsApnLevelLoadControlInformationInDeleteSessionResponse(MsgBuffer &buffer,
+                         PgwsApnLevelLoadControlInformationInDeleteSessionResponseData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.loadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: loadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.loadMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: loadMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case ApnAndRelativeCapacityIeType:
+            {
+                ApnAndRelativeCapacityIe ieObject =
+                dynamic_cast<
+                ApnAndRelativeCapacityIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(ApnAndRelativeCapacityIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeApnAndRelativeCapacityIe(buffer, data.listOfApnAndRelativeCapacity, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: listOfApnAndRelativeCapacity\n");
+                        return false;
+                    }
+                    Uint16 mandIe = ApnAndRelativeCapacityIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void PgwsApnLevelLoadControlInformationInDeleteSessionResponse::
+displayPgwsApnLevelLoadControlInformationInDeleteSessionResponseData_v
+(PgwsApnLevelLoadControlInformationInDeleteSessionResponseData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"PgwsApnLevelLoadControlInformationInDeleteSessionResponse:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/pgwsApnLevelLoadControlInformationInDeleteSessionResponse.h b/src/gtpV2Codec/ieClasses/pgwsApnLevelLoadControlInformationInDeleteSessionResponse.h
new file mode 100644
index 0000000..15c357d
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/pgwsApnLevelLoadControlInformationInDeleteSessionResponse.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef PGWSAPNLEVELLOADCONTROLINFORMATIONINDELETESESSIONRESPONSE_H_
+#define PGWSAPNLEVELLOADCONTROLINFORMATIONINDELETESESSIONRESPONSE_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class PgwsApnLevelLoadControlInformationInDeleteSessionResponse:public GtpV2GroupedIe
+{
+public:
+    PgwsApnLevelLoadControlInformationInDeleteSessionResponse();
+    virtual ~PgwsApnLevelLoadControlInformationInDeleteSessionResponse();
+    bool encodePgwsApnLevelLoadControlInformationInDeleteSessionResponse(MsgBuffer &buffer,
+                             PgwsApnLevelLoadControlInformationInDeleteSessionResponseData
+                              const &data);
+
+    bool decodePgwsApnLevelLoadControlInformationInDeleteSessionResponse (MsgBuffer &buffer,
+                             PgwsApnLevelLoadControlInformationInDeleteSessionResponseData 
+                             & data, Uint16 length);
+
+    void displayPgwsApnLevelLoadControlInformationInDeleteSessionResponseData_v
+    (PgwsApnLevelLoadControlInformationInDeleteSessionResponseData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/pgwsApnLevelLoadControlInformationInModifyBearerResponse.cpp b/src/gtpV2Codec/ieClasses/pgwsApnLevelLoadControlInformationInModifyBearerResponse.cpp
new file mode 100644
index 0000000..0b831d2
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/pgwsApnLevelLoadControlInformationInModifyBearerResponse.cpp
@@ -0,0 +1,306 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "pgwsApnLevelLoadControlInformationInModifyBearerResponse.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+#include "apnAndRelativeCapacityIe.h"
+
+PgwsApnLevelLoadControlInformationInModifyBearerResponse::
+PgwsApnLevelLoadControlInformationInModifyBearerResponse()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // loadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // loadMetric
+    mandatoryIeSet.insert(mandIe);
+    mandIe = ApnAndRelativeCapacityIeType;
+    mandIe = (mandIe << 8) | 0; // listOfApnAndRelativeCapacity
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+PgwsApnLevelLoadControlInformationInModifyBearerResponse::
+~PgwsApnLevelLoadControlInformationInModifyBearerResponse()
+{
+
+}
+bool PgwsApnLevelLoadControlInformationInModifyBearerResponse::
+encodePgwsApnLevelLoadControlInformationInModifyBearerResponse(MsgBuffer &buffer,
+                         PgwsApnLevelLoadControlInformationInModifyBearerResponseData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.loadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: loadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.loadMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: loadMetric\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = ApnAndRelativeCapacityIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    ApnAndRelativeCapacityIe apnAndRelativeCapacity=
+    dynamic_cast<
+    ApnAndRelativeCapacityIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnAndRelativeCapacityIeType));
+    rc = apnAndRelativeCapacity.encodeApnAndRelativeCapacityIe(buffer, data.listOfApnAndRelativeCapacity);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: listOfApnAndRelativeCapacity\n");
+        return false;
+    }
+    return rc;
+}
+
+bool PgwsApnLevelLoadControlInformationInModifyBearerResponse::
+decodePgwsApnLevelLoadControlInformationInModifyBearerResponse(MsgBuffer &buffer,
+                         PgwsApnLevelLoadControlInformationInModifyBearerResponseData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.loadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: loadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.loadMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: loadMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case ApnAndRelativeCapacityIeType:
+            {
+                ApnAndRelativeCapacityIe ieObject =
+                dynamic_cast<
+                ApnAndRelativeCapacityIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(ApnAndRelativeCapacityIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeApnAndRelativeCapacityIe(buffer, data.listOfApnAndRelativeCapacity, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: listOfApnAndRelativeCapacity\n");
+                        return false;
+                    }
+                    Uint16 mandIe = ApnAndRelativeCapacityIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void PgwsApnLevelLoadControlInformationInModifyBearerResponse::
+displayPgwsApnLevelLoadControlInformationInModifyBearerResponseData_v
+(PgwsApnLevelLoadControlInformationInModifyBearerResponseData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"PgwsApnLevelLoadControlInformationInModifyBearerResponse:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/pgwsApnLevelLoadControlInformationInModifyBearerResponse.h b/src/gtpV2Codec/ieClasses/pgwsApnLevelLoadControlInformationInModifyBearerResponse.h
new file mode 100644
index 0000000..e2bbaa8
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/pgwsApnLevelLoadControlInformationInModifyBearerResponse.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef PGWSAPNLEVELLOADCONTROLINFORMATIONINMODIFYBEARERRESPONSE_H_
+#define PGWSAPNLEVELLOADCONTROLINFORMATIONINMODIFYBEARERRESPONSE_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class PgwsApnLevelLoadControlInformationInModifyBearerResponse:public GtpV2GroupedIe
+{
+public:
+    PgwsApnLevelLoadControlInformationInModifyBearerResponse();
+    virtual ~PgwsApnLevelLoadControlInformationInModifyBearerResponse();
+    bool encodePgwsApnLevelLoadControlInformationInModifyBearerResponse(MsgBuffer &buffer,
+                             PgwsApnLevelLoadControlInformationInModifyBearerResponseData
+                              const &data);
+
+    bool decodePgwsApnLevelLoadControlInformationInModifyBearerResponse (MsgBuffer &buffer,
+                             PgwsApnLevelLoadControlInformationInModifyBearerResponseData 
+                             & data, Uint16 length);
+
+    void displayPgwsApnLevelLoadControlInformationInModifyBearerResponseData_v
+    (PgwsApnLevelLoadControlInformationInModifyBearerResponseData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/pgwsNodeLevelLoadControlInformationInCreateBearerRequest.cpp b/src/gtpV2Codec/ieClasses/pgwsNodeLevelLoadControlInformationInCreateBearerRequest.cpp
new file mode 100644
index 0000000..df900fe
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/pgwsNodeLevelLoadControlInformationInCreateBearerRequest.cpp
@@ -0,0 +1,306 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "pgwsNodeLevelLoadControlInformationInCreateBearerRequest.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+#include "apnAndRelativeCapacityIe.h"
+
+PgwsNodeLevelLoadControlInformationInCreateBearerRequest::
+PgwsNodeLevelLoadControlInformationInCreateBearerRequest()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // loadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // loadMetric
+    mandatoryIeSet.insert(mandIe);
+    mandIe = ApnAndRelativeCapacityIeType;
+    mandIe = (mandIe << 8) | 0; // listOfApnAndRelativeCapacity
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+PgwsNodeLevelLoadControlInformationInCreateBearerRequest::
+~PgwsNodeLevelLoadControlInformationInCreateBearerRequest()
+{
+
+}
+bool PgwsNodeLevelLoadControlInformationInCreateBearerRequest::
+encodePgwsNodeLevelLoadControlInformationInCreateBearerRequest(MsgBuffer &buffer,
+                         PgwsNodeLevelLoadControlInformationInCreateBearerRequestData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.loadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: loadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.loadMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: loadMetric\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = ApnAndRelativeCapacityIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    ApnAndRelativeCapacityIe apnAndRelativeCapacity=
+    dynamic_cast<
+    ApnAndRelativeCapacityIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnAndRelativeCapacityIeType));
+    rc = apnAndRelativeCapacity.encodeApnAndRelativeCapacityIe(buffer, data.listOfApnAndRelativeCapacity);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: listOfApnAndRelativeCapacity\n");
+        return false;
+    }
+    return rc;
+}
+
+bool PgwsNodeLevelLoadControlInformationInCreateBearerRequest::
+decodePgwsNodeLevelLoadControlInformationInCreateBearerRequest(MsgBuffer &buffer,
+                         PgwsNodeLevelLoadControlInformationInCreateBearerRequestData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.loadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: loadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.loadMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: loadMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case ApnAndRelativeCapacityIeType:
+            {
+                ApnAndRelativeCapacityIe ieObject =
+                dynamic_cast<
+                ApnAndRelativeCapacityIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(ApnAndRelativeCapacityIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeApnAndRelativeCapacityIe(buffer, data.listOfApnAndRelativeCapacity, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: listOfApnAndRelativeCapacity\n");
+                        return false;
+                    }
+                    Uint16 mandIe = ApnAndRelativeCapacityIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void PgwsNodeLevelLoadControlInformationInCreateBearerRequest::
+displayPgwsNodeLevelLoadControlInformationInCreateBearerRequestData_v
+(PgwsNodeLevelLoadControlInformationInCreateBearerRequestData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"PgwsNodeLevelLoadControlInformationInCreateBearerRequest:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/pgwsNodeLevelLoadControlInformationInCreateBearerRequest.h b/src/gtpV2Codec/ieClasses/pgwsNodeLevelLoadControlInformationInCreateBearerRequest.h
new file mode 100644
index 0000000..c6c87a3
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/pgwsNodeLevelLoadControlInformationInCreateBearerRequest.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef PGWSNODELEVELLOADCONTROLINFORMATIONINCREATEBEARERREQUEST_H_
+#define PGWSNODELEVELLOADCONTROLINFORMATIONINCREATEBEARERREQUEST_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class PgwsNodeLevelLoadControlInformationInCreateBearerRequest:public GtpV2GroupedIe
+{
+public:
+    PgwsNodeLevelLoadControlInformationInCreateBearerRequest();
+    virtual ~PgwsNodeLevelLoadControlInformationInCreateBearerRequest();
+    bool encodePgwsNodeLevelLoadControlInformationInCreateBearerRequest(MsgBuffer &buffer,
+                             PgwsNodeLevelLoadControlInformationInCreateBearerRequestData
+                              const &data);
+
+    bool decodePgwsNodeLevelLoadControlInformationInCreateBearerRequest (MsgBuffer &buffer,
+                             PgwsNodeLevelLoadControlInformationInCreateBearerRequestData 
+                             & data, Uint16 length);
+
+    void displayPgwsNodeLevelLoadControlInformationInCreateBearerRequestData_v
+    (PgwsNodeLevelLoadControlInformationInCreateBearerRequestData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/pgwsNodeLevelLoadControlInformationInCreateSessionResponse.cpp b/src/gtpV2Codec/ieClasses/pgwsNodeLevelLoadControlInformationInCreateSessionResponse.cpp
new file mode 100644
index 0000000..b983ef4
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/pgwsNodeLevelLoadControlInformationInCreateSessionResponse.cpp
@@ -0,0 +1,306 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "pgwsNodeLevelLoadControlInformationInCreateSessionResponse.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+#include "apnAndRelativeCapacityIe.h"
+
+PgwsNodeLevelLoadControlInformationInCreateSessionResponse::
+PgwsNodeLevelLoadControlInformationInCreateSessionResponse()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // loadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // loadMetric
+    mandatoryIeSet.insert(mandIe);
+    mandIe = ApnAndRelativeCapacityIeType;
+    mandIe = (mandIe << 8) | 0; // listOfApnAndRelativeCapacity
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+PgwsNodeLevelLoadControlInformationInCreateSessionResponse::
+~PgwsNodeLevelLoadControlInformationInCreateSessionResponse()
+{
+
+}
+bool PgwsNodeLevelLoadControlInformationInCreateSessionResponse::
+encodePgwsNodeLevelLoadControlInformationInCreateSessionResponse(MsgBuffer &buffer,
+                         PgwsNodeLevelLoadControlInformationInCreateSessionResponseData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.loadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: loadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.loadMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: loadMetric\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = ApnAndRelativeCapacityIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    ApnAndRelativeCapacityIe apnAndRelativeCapacity=
+    dynamic_cast<
+    ApnAndRelativeCapacityIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnAndRelativeCapacityIeType));
+    rc = apnAndRelativeCapacity.encodeApnAndRelativeCapacityIe(buffer, data.listOfApnAndRelativeCapacity);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: listOfApnAndRelativeCapacity\n");
+        return false;
+    }
+    return rc;
+}
+
+bool PgwsNodeLevelLoadControlInformationInCreateSessionResponse::
+decodePgwsNodeLevelLoadControlInformationInCreateSessionResponse(MsgBuffer &buffer,
+                         PgwsNodeLevelLoadControlInformationInCreateSessionResponseData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.loadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: loadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.loadMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: loadMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case ApnAndRelativeCapacityIeType:
+            {
+                ApnAndRelativeCapacityIe ieObject =
+                dynamic_cast<
+                ApnAndRelativeCapacityIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(ApnAndRelativeCapacityIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeApnAndRelativeCapacityIe(buffer, data.listOfApnAndRelativeCapacity, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: listOfApnAndRelativeCapacity\n");
+                        return false;
+                    }
+                    Uint16 mandIe = ApnAndRelativeCapacityIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void PgwsNodeLevelLoadControlInformationInCreateSessionResponse::
+displayPgwsNodeLevelLoadControlInformationInCreateSessionResponseData_v
+(PgwsNodeLevelLoadControlInformationInCreateSessionResponseData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"PgwsNodeLevelLoadControlInformationInCreateSessionResponse:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/pgwsNodeLevelLoadControlInformationInCreateSessionResponse.h b/src/gtpV2Codec/ieClasses/pgwsNodeLevelLoadControlInformationInCreateSessionResponse.h
new file mode 100644
index 0000000..58eb8ca
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/pgwsNodeLevelLoadControlInformationInCreateSessionResponse.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef PGWSNODELEVELLOADCONTROLINFORMATIONINCREATESESSIONRESPONSE_H_
+#define PGWSNODELEVELLOADCONTROLINFORMATIONINCREATESESSIONRESPONSE_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class PgwsNodeLevelLoadControlInformationInCreateSessionResponse:public GtpV2GroupedIe
+{
+public:
+    PgwsNodeLevelLoadControlInformationInCreateSessionResponse();
+    virtual ~PgwsNodeLevelLoadControlInformationInCreateSessionResponse();
+    bool encodePgwsNodeLevelLoadControlInformationInCreateSessionResponse(MsgBuffer &buffer,
+                             PgwsNodeLevelLoadControlInformationInCreateSessionResponseData
+                              const &data);
+
+    bool decodePgwsNodeLevelLoadControlInformationInCreateSessionResponse (MsgBuffer &buffer,
+                             PgwsNodeLevelLoadControlInformationInCreateSessionResponseData 
+                             & data, Uint16 length);
+
+    void displayPgwsNodeLevelLoadControlInformationInCreateSessionResponseData_v
+    (PgwsNodeLevelLoadControlInformationInCreateSessionResponseData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/pgwsNodeLevelLoadControlInformationInDeleteBearerRequest.cpp b/src/gtpV2Codec/ieClasses/pgwsNodeLevelLoadControlInformationInDeleteBearerRequest.cpp
new file mode 100644
index 0000000..6ea59b8
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/pgwsNodeLevelLoadControlInformationInDeleteBearerRequest.cpp
@@ -0,0 +1,315 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "pgwsNodeLevelLoadControlInformationInDeleteBearerRequest.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+#include "apnAndRelativeCapacityIe.h"
+
+PgwsNodeLevelLoadControlInformationInDeleteBearerRequest::
+PgwsNodeLevelLoadControlInformationInDeleteBearerRequest()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // loadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // loadMetric
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+PgwsNodeLevelLoadControlInformationInDeleteBearerRequest::
+~PgwsNodeLevelLoadControlInformationInDeleteBearerRequest()
+{
+
+}
+bool PgwsNodeLevelLoadControlInformationInDeleteBearerRequest::
+encodePgwsNodeLevelLoadControlInformationInDeleteBearerRequest(MsgBuffer &buffer,
+                         PgwsNodeLevelLoadControlInformationInDeleteBearerRequestData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.loadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: loadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.loadMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: loadMetric\n");
+        return false;
+    }
+
+    if (data.listOfApnAndRelativeCapacityIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = ApnAndRelativeCapacityIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        ApnAndRelativeCapacityIe apnAndRelativeCapacity=
+        dynamic_cast<
+        ApnAndRelativeCapacityIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnAndRelativeCapacityIeType));
+        rc = apnAndRelativeCapacity.encodeApnAndRelativeCapacityIe(buffer, data.listOfApnAndRelativeCapacity);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: listOfApnAndRelativeCapacity\n");
+          return false;
+        }
+    }
+    return rc;
+}
+
+bool PgwsNodeLevelLoadControlInformationInDeleteBearerRequest::
+decodePgwsNodeLevelLoadControlInformationInDeleteBearerRequest(MsgBuffer &buffer,
+                         PgwsNodeLevelLoadControlInformationInDeleteBearerRequestData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.loadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: loadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.loadMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: loadMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case ApnAndRelativeCapacityIeType:
+            {
+                ApnAndRelativeCapacityIe ieObject =
+                dynamic_cast<
+                ApnAndRelativeCapacityIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(ApnAndRelativeCapacityIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeApnAndRelativeCapacityIe(buffer, data.listOfApnAndRelativeCapacity, ieHeader.length);
+
+                    data.listOfApnAndRelativeCapacityIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: listOfApnAndRelativeCapacity\n");
+                        return false;
+                    }
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void PgwsNodeLevelLoadControlInformationInDeleteBearerRequest::
+displayPgwsNodeLevelLoadControlInformationInDeleteBearerRequestData_v
+(PgwsNodeLevelLoadControlInformationInDeleteBearerRequestData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"PgwsNodeLevelLoadControlInformationInDeleteBearerRequest:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+    if (data.listOfApnAndRelativeCapacityIePresent)
+    {
+
+        stream.add((char *)"listOfApnAndRelativeCapacity:");
+        stream.endOfLine();
+        ApnAndRelativeCapacityIe apnAndRelativeCapacity=
+        dynamic_cast<
+        ApnAndRelativeCapacityIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnAndRelativeCapacityIeType));
+        apnAndRelativeCapacity.displayApnAndRelativeCapacityIe_v(data.listOfApnAndRelativeCapacity, stream);
+
+    }
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/pgwsNodeLevelLoadControlInformationInDeleteBearerRequest.h b/src/gtpV2Codec/ieClasses/pgwsNodeLevelLoadControlInformationInDeleteBearerRequest.h
new file mode 100644
index 0000000..e5d6d5e
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/pgwsNodeLevelLoadControlInformationInDeleteBearerRequest.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef PGWSNODELEVELLOADCONTROLINFORMATIONINDELETEBEARERREQUEST_H_
+#define PGWSNODELEVELLOADCONTROLINFORMATIONINDELETEBEARERREQUEST_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class PgwsNodeLevelLoadControlInformationInDeleteBearerRequest:public GtpV2GroupedIe
+{
+public:
+    PgwsNodeLevelLoadControlInformationInDeleteBearerRequest();
+    virtual ~PgwsNodeLevelLoadControlInformationInDeleteBearerRequest();
+    bool encodePgwsNodeLevelLoadControlInformationInDeleteBearerRequest(MsgBuffer &buffer,
+                             PgwsNodeLevelLoadControlInformationInDeleteBearerRequestData
+                              const &data);
+
+    bool decodePgwsNodeLevelLoadControlInformationInDeleteBearerRequest (MsgBuffer &buffer,
+                             PgwsNodeLevelLoadControlInformationInDeleteBearerRequestData 
+                             & data, Uint16 length);
+
+    void displayPgwsNodeLevelLoadControlInformationInDeleteBearerRequestData_v
+    (PgwsNodeLevelLoadControlInformationInDeleteBearerRequestData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/pgwsNodeLevelLoadControlInformationInDeleteSessionResponse.cpp b/src/gtpV2Codec/ieClasses/pgwsNodeLevelLoadControlInformationInDeleteSessionResponse.cpp
new file mode 100644
index 0000000..301b92e
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/pgwsNodeLevelLoadControlInformationInDeleteSessionResponse.cpp
@@ -0,0 +1,306 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "pgwsNodeLevelLoadControlInformationInDeleteSessionResponse.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+#include "apnAndRelativeCapacityIe.h"
+
+PgwsNodeLevelLoadControlInformationInDeleteSessionResponse::
+PgwsNodeLevelLoadControlInformationInDeleteSessionResponse()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // loadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // loadMetric
+    mandatoryIeSet.insert(mandIe);
+    mandIe = ApnAndRelativeCapacityIeType;
+    mandIe = (mandIe << 8) | 0; // listOfApnAndRelativeCapacity
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+PgwsNodeLevelLoadControlInformationInDeleteSessionResponse::
+~PgwsNodeLevelLoadControlInformationInDeleteSessionResponse()
+{
+
+}
+bool PgwsNodeLevelLoadControlInformationInDeleteSessionResponse::
+encodePgwsNodeLevelLoadControlInformationInDeleteSessionResponse(MsgBuffer &buffer,
+                         PgwsNodeLevelLoadControlInformationInDeleteSessionResponseData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.loadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: loadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.loadMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: loadMetric\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = ApnAndRelativeCapacityIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    ApnAndRelativeCapacityIe apnAndRelativeCapacity=
+    dynamic_cast<
+    ApnAndRelativeCapacityIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnAndRelativeCapacityIeType));
+    rc = apnAndRelativeCapacity.encodeApnAndRelativeCapacityIe(buffer, data.listOfApnAndRelativeCapacity);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: listOfApnAndRelativeCapacity\n");
+        return false;
+    }
+    return rc;
+}
+
+bool PgwsNodeLevelLoadControlInformationInDeleteSessionResponse::
+decodePgwsNodeLevelLoadControlInformationInDeleteSessionResponse(MsgBuffer &buffer,
+                         PgwsNodeLevelLoadControlInformationInDeleteSessionResponseData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.loadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: loadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.loadMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: loadMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case ApnAndRelativeCapacityIeType:
+            {
+                ApnAndRelativeCapacityIe ieObject =
+                dynamic_cast<
+                ApnAndRelativeCapacityIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(ApnAndRelativeCapacityIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeApnAndRelativeCapacityIe(buffer, data.listOfApnAndRelativeCapacity, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: listOfApnAndRelativeCapacity\n");
+                        return false;
+                    }
+                    Uint16 mandIe = ApnAndRelativeCapacityIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void PgwsNodeLevelLoadControlInformationInDeleteSessionResponse::
+displayPgwsNodeLevelLoadControlInformationInDeleteSessionResponseData_v
+(PgwsNodeLevelLoadControlInformationInDeleteSessionResponseData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"PgwsNodeLevelLoadControlInformationInDeleteSessionResponse:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/pgwsNodeLevelLoadControlInformationInDeleteSessionResponse.h b/src/gtpV2Codec/ieClasses/pgwsNodeLevelLoadControlInformationInDeleteSessionResponse.h
new file mode 100644
index 0000000..a3a1edf
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/pgwsNodeLevelLoadControlInformationInDeleteSessionResponse.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef PGWSNODELEVELLOADCONTROLINFORMATIONINDELETESESSIONRESPONSE_H_
+#define PGWSNODELEVELLOADCONTROLINFORMATIONINDELETESESSIONRESPONSE_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class PgwsNodeLevelLoadControlInformationInDeleteSessionResponse:public GtpV2GroupedIe
+{
+public:
+    PgwsNodeLevelLoadControlInformationInDeleteSessionResponse();
+    virtual ~PgwsNodeLevelLoadControlInformationInDeleteSessionResponse();
+    bool encodePgwsNodeLevelLoadControlInformationInDeleteSessionResponse(MsgBuffer &buffer,
+                             PgwsNodeLevelLoadControlInformationInDeleteSessionResponseData
+                              const &data);
+
+    bool decodePgwsNodeLevelLoadControlInformationInDeleteSessionResponse (MsgBuffer &buffer,
+                             PgwsNodeLevelLoadControlInformationInDeleteSessionResponseData 
+                             & data, Uint16 length);
+
+    void displayPgwsNodeLevelLoadControlInformationInDeleteSessionResponseData_v
+    (PgwsNodeLevelLoadControlInformationInDeleteSessionResponseData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/pgwsNodeLevelLoadControlInformationInModifyBearerResponse.cpp b/src/gtpV2Codec/ieClasses/pgwsNodeLevelLoadControlInformationInModifyBearerResponse.cpp
new file mode 100644
index 0000000..9400e86
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/pgwsNodeLevelLoadControlInformationInModifyBearerResponse.cpp
@@ -0,0 +1,306 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "pgwsNodeLevelLoadControlInformationInModifyBearerResponse.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+#include "apnAndRelativeCapacityIe.h"
+
+PgwsNodeLevelLoadControlInformationInModifyBearerResponse::
+PgwsNodeLevelLoadControlInformationInModifyBearerResponse()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // loadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // loadMetric
+    mandatoryIeSet.insert(mandIe);
+    mandIe = ApnAndRelativeCapacityIeType;
+    mandIe = (mandIe << 8) | 0; // listOfApnAndRelativeCapacity
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+PgwsNodeLevelLoadControlInformationInModifyBearerResponse::
+~PgwsNodeLevelLoadControlInformationInModifyBearerResponse()
+{
+
+}
+bool PgwsNodeLevelLoadControlInformationInModifyBearerResponse::
+encodePgwsNodeLevelLoadControlInformationInModifyBearerResponse(MsgBuffer &buffer,
+                         PgwsNodeLevelLoadControlInformationInModifyBearerResponseData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.loadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: loadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.loadMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: loadMetric\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = ApnAndRelativeCapacityIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    ApnAndRelativeCapacityIe apnAndRelativeCapacity=
+    dynamic_cast<
+    ApnAndRelativeCapacityIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnAndRelativeCapacityIeType));
+    rc = apnAndRelativeCapacity.encodeApnAndRelativeCapacityIe(buffer, data.listOfApnAndRelativeCapacity);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: listOfApnAndRelativeCapacity\n");
+        return false;
+    }
+    return rc;
+}
+
+bool PgwsNodeLevelLoadControlInformationInModifyBearerResponse::
+decodePgwsNodeLevelLoadControlInformationInModifyBearerResponse(MsgBuffer &buffer,
+                         PgwsNodeLevelLoadControlInformationInModifyBearerResponseData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.loadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: loadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.loadMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: loadMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case ApnAndRelativeCapacityIeType:
+            {
+                ApnAndRelativeCapacityIe ieObject =
+                dynamic_cast<
+                ApnAndRelativeCapacityIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(ApnAndRelativeCapacityIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeApnAndRelativeCapacityIe(buffer, data.listOfApnAndRelativeCapacity, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: listOfApnAndRelativeCapacity\n");
+                        return false;
+                    }
+                    Uint16 mandIe = ApnAndRelativeCapacityIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void PgwsNodeLevelLoadControlInformationInModifyBearerResponse::
+displayPgwsNodeLevelLoadControlInformationInModifyBearerResponseData_v
+(PgwsNodeLevelLoadControlInformationInModifyBearerResponseData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"PgwsNodeLevelLoadControlInformationInModifyBearerResponse:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/pgwsNodeLevelLoadControlInformationInModifyBearerResponse.h b/src/gtpV2Codec/ieClasses/pgwsNodeLevelLoadControlInformationInModifyBearerResponse.h
new file mode 100644
index 0000000..7d47ec7
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/pgwsNodeLevelLoadControlInformationInModifyBearerResponse.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef PGWSNODELEVELLOADCONTROLINFORMATIONINMODIFYBEARERRESPONSE_H_
+#define PGWSNODELEVELLOADCONTROLINFORMATIONINMODIFYBEARERRESPONSE_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class PgwsNodeLevelLoadControlInformationInModifyBearerResponse:public GtpV2GroupedIe
+{
+public:
+    PgwsNodeLevelLoadControlInformationInModifyBearerResponse();
+    virtual ~PgwsNodeLevelLoadControlInformationInModifyBearerResponse();
+    bool encodePgwsNodeLevelLoadControlInformationInModifyBearerResponse(MsgBuffer &buffer,
+                             PgwsNodeLevelLoadControlInformationInModifyBearerResponseData
+                              const &data);
+
+    bool decodePgwsNodeLevelLoadControlInformationInModifyBearerResponse (MsgBuffer &buffer,
+                             PgwsNodeLevelLoadControlInformationInModifyBearerResponseData 
+                             & data, Uint16 length);
+
+    void displayPgwsNodeLevelLoadControlInformationInModifyBearerResponseData_v
+    (PgwsNodeLevelLoadControlInformationInModifyBearerResponseData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/pgwsOverloadControlInformationInCreateBearerRequest.cpp b/src/gtpV2Codec/ieClasses/pgwsOverloadControlInformationInCreateBearerRequest.cpp
new file mode 100644
index 0000000..62dc0c2
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/pgwsOverloadControlInformationInCreateBearerRequest.cpp
@@ -0,0 +1,377 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "pgwsOverloadControlInformationInCreateBearerRequest.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+#include "epcTimerIe.h"
+#include "apnIe.h"
+
+PgwsOverloadControlInformationInCreateBearerRequest::
+PgwsOverloadControlInformationInCreateBearerRequest()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // overloadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // overloadReductionMetric
+    mandatoryIeSet.insert(mandIe);
+    mandIe = EpcTimerIeType;
+    mandIe = (mandIe << 8) | 0; // periodOfValidity
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+PgwsOverloadControlInformationInCreateBearerRequest::
+~PgwsOverloadControlInformationInCreateBearerRequest()
+{
+
+}
+bool PgwsOverloadControlInformationInCreateBearerRequest::
+encodePgwsOverloadControlInformationInCreateBearerRequest(MsgBuffer &buffer,
+                         PgwsOverloadControlInformationInCreateBearerRequestData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.overloadReductionMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadReductionMetric\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = EpcTimerIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    EpcTimerIe epcTimer=
+    dynamic_cast<
+    EpcTimerIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcTimerIeType));
+    rc = epcTimer.encodeEpcTimerIe(buffer, data.periodOfValidity);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: periodOfValidity\n");
+        return false;
+    }
+
+    if (data.listOfAccessPointNameIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = ApnIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        ApnIe apn=
+        dynamic_cast<
+        ApnIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnIeType));
+        rc = apn.encodeApnIe(buffer, data.listOfAccessPointName);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: listOfAccessPointName\n");
+          return false;
+        }
+    }
+    return rc;
+}
+
+bool PgwsOverloadControlInformationInCreateBearerRequest::
+decodePgwsOverloadControlInformationInCreateBearerRequest(MsgBuffer &buffer,
+                         PgwsOverloadControlInformationInCreateBearerRequestData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.overloadReductionMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadReductionMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case EpcTimerIeType:
+            {
+                EpcTimerIe ieObject =
+                dynamic_cast<
+                EpcTimerIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(EpcTimerIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeEpcTimerIe(buffer, data.periodOfValidity, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: periodOfValidity\n");
+                        return false;
+                    }
+                    Uint16 mandIe = EpcTimerIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case ApnIeType:
+            {
+                ApnIe ieObject =
+                dynamic_cast<
+                ApnIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(ApnIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeApnIe(buffer, data.listOfAccessPointName, ieHeader.length);
+
+                    data.listOfAccessPointNameIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: listOfAccessPointName\n");
+                        return false;
+                    }
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void PgwsOverloadControlInformationInCreateBearerRequest::
+displayPgwsOverloadControlInformationInCreateBearerRequestData_v
+(PgwsOverloadControlInformationInCreateBearerRequestData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"PgwsOverloadControlInformationInCreateBearerRequest:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+
+    if (data.listOfAccessPointNameIePresent)
+    {
+
+        stream.add((char *)"listOfAccessPointName:");
+        stream.endOfLine();
+        ApnIe apn=
+        dynamic_cast<
+        ApnIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnIeType));
+        apn.displayApnIe_v(data.listOfAccessPointName, stream);
+
+    }
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/pgwsOverloadControlInformationInCreateBearerRequest.h b/src/gtpV2Codec/ieClasses/pgwsOverloadControlInformationInCreateBearerRequest.h
new file mode 100644
index 0000000..929cfbb
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/pgwsOverloadControlInformationInCreateBearerRequest.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef PGWSOVERLOADCONTROLINFORMATIONINCREATEBEARERREQUEST_H_
+#define PGWSOVERLOADCONTROLINFORMATIONINCREATEBEARERREQUEST_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class PgwsOverloadControlInformationInCreateBearerRequest:public GtpV2GroupedIe
+{
+public:
+    PgwsOverloadControlInformationInCreateBearerRequest();
+    virtual ~PgwsOverloadControlInformationInCreateBearerRequest();
+    bool encodePgwsOverloadControlInformationInCreateBearerRequest(MsgBuffer &buffer,
+                             PgwsOverloadControlInformationInCreateBearerRequestData
+                              const &data);
+
+    bool decodePgwsOverloadControlInformationInCreateBearerRequest (MsgBuffer &buffer,
+                             PgwsOverloadControlInformationInCreateBearerRequestData 
+                             & data, Uint16 length);
+
+    void displayPgwsOverloadControlInformationInCreateBearerRequestData_v
+    (PgwsOverloadControlInformationInCreateBearerRequestData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/pgwsOverloadControlInformationInCreateSessionResponse.cpp b/src/gtpV2Codec/ieClasses/pgwsOverloadControlInformationInCreateSessionResponse.cpp
new file mode 100644
index 0000000..8eb36a1
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/pgwsOverloadControlInformationInCreateSessionResponse.cpp
@@ -0,0 +1,377 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "pgwsOverloadControlInformationInCreateSessionResponse.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+#include "epcTimerIe.h"
+#include "apnIe.h"
+
+PgwsOverloadControlInformationInCreateSessionResponse::
+PgwsOverloadControlInformationInCreateSessionResponse()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // overloadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // overloadReductionMetric
+    mandatoryIeSet.insert(mandIe);
+    mandIe = EpcTimerIeType;
+    mandIe = (mandIe << 8) | 0; // periodOfValidity
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+PgwsOverloadControlInformationInCreateSessionResponse::
+~PgwsOverloadControlInformationInCreateSessionResponse()
+{
+
+}
+bool PgwsOverloadControlInformationInCreateSessionResponse::
+encodePgwsOverloadControlInformationInCreateSessionResponse(MsgBuffer &buffer,
+                         PgwsOverloadControlInformationInCreateSessionResponseData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.overloadReductionMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadReductionMetric\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = EpcTimerIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    EpcTimerIe epcTimer=
+    dynamic_cast<
+    EpcTimerIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcTimerIeType));
+    rc = epcTimer.encodeEpcTimerIe(buffer, data.periodOfValidity);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: periodOfValidity\n");
+        return false;
+    }
+
+    if (data.listOfAccessPointNameIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = ApnIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        ApnIe apn=
+        dynamic_cast<
+        ApnIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnIeType));
+        rc = apn.encodeApnIe(buffer, data.listOfAccessPointName);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: listOfAccessPointName\n");
+          return false;
+        }
+    }
+    return rc;
+}
+
+bool PgwsOverloadControlInformationInCreateSessionResponse::
+decodePgwsOverloadControlInformationInCreateSessionResponse(MsgBuffer &buffer,
+                         PgwsOverloadControlInformationInCreateSessionResponseData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.overloadReductionMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadReductionMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case EpcTimerIeType:
+            {
+                EpcTimerIe ieObject =
+                dynamic_cast<
+                EpcTimerIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(EpcTimerIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeEpcTimerIe(buffer, data.periodOfValidity, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: periodOfValidity\n");
+                        return false;
+                    }
+                    Uint16 mandIe = EpcTimerIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case ApnIeType:
+            {
+                ApnIe ieObject =
+                dynamic_cast<
+                ApnIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(ApnIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeApnIe(buffer, data.listOfAccessPointName, ieHeader.length);
+
+                    data.listOfAccessPointNameIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: listOfAccessPointName\n");
+                        return false;
+                    }
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void PgwsOverloadControlInformationInCreateSessionResponse::
+displayPgwsOverloadControlInformationInCreateSessionResponseData_v
+(PgwsOverloadControlInformationInCreateSessionResponseData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"PgwsOverloadControlInformationInCreateSessionResponse:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+
+    if (data.listOfAccessPointNameIePresent)
+    {
+
+        stream.add((char *)"listOfAccessPointName:");
+        stream.endOfLine();
+        ApnIe apn=
+        dynamic_cast<
+        ApnIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnIeType));
+        apn.displayApnIe_v(data.listOfAccessPointName, stream);
+
+    }
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/pgwsOverloadControlInformationInCreateSessionResponse.h b/src/gtpV2Codec/ieClasses/pgwsOverloadControlInformationInCreateSessionResponse.h
new file mode 100644
index 0000000..f7a2d05
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/pgwsOverloadControlInformationInCreateSessionResponse.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef PGWSOVERLOADCONTROLINFORMATIONINCREATESESSIONRESPONSE_H_
+#define PGWSOVERLOADCONTROLINFORMATIONINCREATESESSIONRESPONSE_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class PgwsOverloadControlInformationInCreateSessionResponse:public GtpV2GroupedIe
+{
+public:
+    PgwsOverloadControlInformationInCreateSessionResponse();
+    virtual ~PgwsOverloadControlInformationInCreateSessionResponse();
+    bool encodePgwsOverloadControlInformationInCreateSessionResponse(MsgBuffer &buffer,
+                             PgwsOverloadControlInformationInCreateSessionResponseData
+                              const &data);
+
+    bool decodePgwsOverloadControlInformationInCreateSessionResponse (MsgBuffer &buffer,
+                             PgwsOverloadControlInformationInCreateSessionResponseData 
+                             & data, Uint16 length);
+
+    void displayPgwsOverloadControlInformationInCreateSessionResponseData_v
+    (PgwsOverloadControlInformationInCreateSessionResponseData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/pgwsOverloadControlInformationInDeleteBearerRequest.cpp b/src/gtpV2Codec/ieClasses/pgwsOverloadControlInformationInDeleteBearerRequest.cpp
new file mode 100644
index 0000000..1b90143
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/pgwsOverloadControlInformationInDeleteBearerRequest.cpp
@@ -0,0 +1,377 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "pgwsOverloadControlInformationInDeleteBearerRequest.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+#include "epcTimerIe.h"
+#include "apnIe.h"
+
+PgwsOverloadControlInformationInDeleteBearerRequest::
+PgwsOverloadControlInformationInDeleteBearerRequest()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // overloadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // overloadReductionMetric
+    mandatoryIeSet.insert(mandIe);
+    mandIe = EpcTimerIeType;
+    mandIe = (mandIe << 8) | 0; // periodOfValidity
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+PgwsOverloadControlInformationInDeleteBearerRequest::
+~PgwsOverloadControlInformationInDeleteBearerRequest()
+{
+
+}
+bool PgwsOverloadControlInformationInDeleteBearerRequest::
+encodePgwsOverloadControlInformationInDeleteBearerRequest(MsgBuffer &buffer,
+                         PgwsOverloadControlInformationInDeleteBearerRequestData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.overloadReductionMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadReductionMetric\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = EpcTimerIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    EpcTimerIe epcTimer=
+    dynamic_cast<
+    EpcTimerIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcTimerIeType));
+    rc = epcTimer.encodeEpcTimerIe(buffer, data.periodOfValidity);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: periodOfValidity\n");
+        return false;
+    }
+
+    if (data.listOfAccessPointNameIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = ApnIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        ApnIe apn=
+        dynamic_cast<
+        ApnIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnIeType));
+        rc = apn.encodeApnIe(buffer, data.listOfAccessPointName);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: listOfAccessPointName\n");
+          return false;
+        }
+    }
+    return rc;
+}
+
+bool PgwsOverloadControlInformationInDeleteBearerRequest::
+decodePgwsOverloadControlInformationInDeleteBearerRequest(MsgBuffer &buffer,
+                         PgwsOverloadControlInformationInDeleteBearerRequestData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.overloadReductionMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadReductionMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case EpcTimerIeType:
+            {
+                EpcTimerIe ieObject =
+                dynamic_cast<
+                EpcTimerIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(EpcTimerIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeEpcTimerIe(buffer, data.periodOfValidity, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: periodOfValidity\n");
+                        return false;
+                    }
+                    Uint16 mandIe = EpcTimerIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case ApnIeType:
+            {
+                ApnIe ieObject =
+                dynamic_cast<
+                ApnIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(ApnIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeApnIe(buffer, data.listOfAccessPointName, ieHeader.length);
+
+                    data.listOfAccessPointNameIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: listOfAccessPointName\n");
+                        return false;
+                    }
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void PgwsOverloadControlInformationInDeleteBearerRequest::
+displayPgwsOverloadControlInformationInDeleteBearerRequestData_v
+(PgwsOverloadControlInformationInDeleteBearerRequestData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"PgwsOverloadControlInformationInDeleteBearerRequest:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+
+    if (data.listOfAccessPointNameIePresent)
+    {
+
+        stream.add((char *)"listOfAccessPointName:");
+        stream.endOfLine();
+        ApnIe apn=
+        dynamic_cast<
+        ApnIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnIeType));
+        apn.displayApnIe_v(data.listOfAccessPointName, stream);
+
+    }
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/pgwsOverloadControlInformationInDeleteBearerRequest.h b/src/gtpV2Codec/ieClasses/pgwsOverloadControlInformationInDeleteBearerRequest.h
new file mode 100644
index 0000000..0974f70
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/pgwsOverloadControlInformationInDeleteBearerRequest.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef PGWSOVERLOADCONTROLINFORMATIONINDELETEBEARERREQUEST_H_
+#define PGWSOVERLOADCONTROLINFORMATIONINDELETEBEARERREQUEST_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class PgwsOverloadControlInformationInDeleteBearerRequest:public GtpV2GroupedIe
+{
+public:
+    PgwsOverloadControlInformationInDeleteBearerRequest();
+    virtual ~PgwsOverloadControlInformationInDeleteBearerRequest();
+    bool encodePgwsOverloadControlInformationInDeleteBearerRequest(MsgBuffer &buffer,
+                             PgwsOverloadControlInformationInDeleteBearerRequestData
+                              const &data);
+
+    bool decodePgwsOverloadControlInformationInDeleteBearerRequest (MsgBuffer &buffer,
+                             PgwsOverloadControlInformationInDeleteBearerRequestData 
+                             & data, Uint16 length);
+
+    void displayPgwsOverloadControlInformationInDeleteBearerRequestData_v
+    (PgwsOverloadControlInformationInDeleteBearerRequestData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/pgwsOverloadControlInformationInDeleteSessionResponse.cpp b/src/gtpV2Codec/ieClasses/pgwsOverloadControlInformationInDeleteSessionResponse.cpp
new file mode 100644
index 0000000..4b0a25f
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/pgwsOverloadControlInformationInDeleteSessionResponse.cpp
@@ -0,0 +1,377 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "pgwsOverloadControlInformationInDeleteSessionResponse.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+#include "epcTimerIe.h"
+#include "apnIe.h"
+
+PgwsOverloadControlInformationInDeleteSessionResponse::
+PgwsOverloadControlInformationInDeleteSessionResponse()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // overloadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // overloadReductionMetric
+    mandatoryIeSet.insert(mandIe);
+    mandIe = EpcTimerIeType;
+    mandIe = (mandIe << 8) | 0; // periodOfValidity
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+PgwsOverloadControlInformationInDeleteSessionResponse::
+~PgwsOverloadControlInformationInDeleteSessionResponse()
+{
+
+}
+bool PgwsOverloadControlInformationInDeleteSessionResponse::
+encodePgwsOverloadControlInformationInDeleteSessionResponse(MsgBuffer &buffer,
+                         PgwsOverloadControlInformationInDeleteSessionResponseData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.overloadReductionMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadReductionMetric\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = EpcTimerIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    EpcTimerIe epcTimer=
+    dynamic_cast<
+    EpcTimerIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcTimerIeType));
+    rc = epcTimer.encodeEpcTimerIe(buffer, data.periodOfValidity);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: periodOfValidity\n");
+        return false;
+    }
+
+    if (data.listOfAccessPointNameIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = ApnIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        ApnIe apn=
+        dynamic_cast<
+        ApnIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnIeType));
+        rc = apn.encodeApnIe(buffer, data.listOfAccessPointName);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: listOfAccessPointName\n");
+          return false;
+        }
+    }
+    return rc;
+}
+
+bool PgwsOverloadControlInformationInDeleteSessionResponse::
+decodePgwsOverloadControlInformationInDeleteSessionResponse(MsgBuffer &buffer,
+                         PgwsOverloadControlInformationInDeleteSessionResponseData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.overloadReductionMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadReductionMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case EpcTimerIeType:
+            {
+                EpcTimerIe ieObject =
+                dynamic_cast<
+                EpcTimerIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(EpcTimerIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeEpcTimerIe(buffer, data.periodOfValidity, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: periodOfValidity\n");
+                        return false;
+                    }
+                    Uint16 mandIe = EpcTimerIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case ApnIeType:
+            {
+                ApnIe ieObject =
+                dynamic_cast<
+                ApnIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(ApnIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeApnIe(buffer, data.listOfAccessPointName, ieHeader.length);
+
+                    data.listOfAccessPointNameIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: listOfAccessPointName\n");
+                        return false;
+                    }
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void PgwsOverloadControlInformationInDeleteSessionResponse::
+displayPgwsOverloadControlInformationInDeleteSessionResponseData_v
+(PgwsOverloadControlInformationInDeleteSessionResponseData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"PgwsOverloadControlInformationInDeleteSessionResponse:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+
+    if (data.listOfAccessPointNameIePresent)
+    {
+
+        stream.add((char *)"listOfAccessPointName:");
+        stream.endOfLine();
+        ApnIe apn=
+        dynamic_cast<
+        ApnIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnIeType));
+        apn.displayApnIe_v(data.listOfAccessPointName, stream);
+
+    }
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/pgwsOverloadControlInformationInDeleteSessionResponse.h b/src/gtpV2Codec/ieClasses/pgwsOverloadControlInformationInDeleteSessionResponse.h
new file mode 100644
index 0000000..8a8df0a
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/pgwsOverloadControlInformationInDeleteSessionResponse.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef PGWSOVERLOADCONTROLINFORMATIONINDELETESESSIONRESPONSE_H_
+#define PGWSOVERLOADCONTROLINFORMATIONINDELETESESSIONRESPONSE_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class PgwsOverloadControlInformationInDeleteSessionResponse:public GtpV2GroupedIe
+{
+public:
+    PgwsOverloadControlInformationInDeleteSessionResponse();
+    virtual ~PgwsOverloadControlInformationInDeleteSessionResponse();
+    bool encodePgwsOverloadControlInformationInDeleteSessionResponse(MsgBuffer &buffer,
+                             PgwsOverloadControlInformationInDeleteSessionResponseData
+                              const &data);
+
+    bool decodePgwsOverloadControlInformationInDeleteSessionResponse (MsgBuffer &buffer,
+                             PgwsOverloadControlInformationInDeleteSessionResponseData 
+                             & data, Uint16 length);
+
+    void displayPgwsOverloadControlInformationInDeleteSessionResponseData_v
+    (PgwsOverloadControlInformationInDeleteSessionResponseData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/pgwsOverloadControlInformationInModifyBearerResponse.cpp b/src/gtpV2Codec/ieClasses/pgwsOverloadControlInformationInModifyBearerResponse.cpp
new file mode 100644
index 0000000..0bf3674
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/pgwsOverloadControlInformationInModifyBearerResponse.cpp
@@ -0,0 +1,377 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "pgwsOverloadControlInformationInModifyBearerResponse.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+#include "epcTimerIe.h"
+#include "apnIe.h"
+
+PgwsOverloadControlInformationInModifyBearerResponse::
+PgwsOverloadControlInformationInModifyBearerResponse()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // overloadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // overloadReductionMetric
+    mandatoryIeSet.insert(mandIe);
+    mandIe = EpcTimerIeType;
+    mandIe = (mandIe << 8) | 0; // periodOfValidity
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+PgwsOverloadControlInformationInModifyBearerResponse::
+~PgwsOverloadControlInformationInModifyBearerResponse()
+{
+
+}
+bool PgwsOverloadControlInformationInModifyBearerResponse::
+encodePgwsOverloadControlInformationInModifyBearerResponse(MsgBuffer &buffer,
+                         PgwsOverloadControlInformationInModifyBearerResponseData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.overloadReductionMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadReductionMetric\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = EpcTimerIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    EpcTimerIe epcTimer=
+    dynamic_cast<
+    EpcTimerIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcTimerIeType));
+    rc = epcTimer.encodeEpcTimerIe(buffer, data.periodOfValidity);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: periodOfValidity\n");
+        return false;
+    }
+
+    if (data.listOfAccessPointNameIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = ApnIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        ApnIe apn=
+        dynamic_cast<
+        ApnIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnIeType));
+        rc = apn.encodeApnIe(buffer, data.listOfAccessPointName);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: listOfAccessPointName\n");
+          return false;
+        }
+    }
+    return rc;
+}
+
+bool PgwsOverloadControlInformationInModifyBearerResponse::
+decodePgwsOverloadControlInformationInModifyBearerResponse(MsgBuffer &buffer,
+                         PgwsOverloadControlInformationInModifyBearerResponseData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.overloadReductionMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadReductionMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case EpcTimerIeType:
+            {
+                EpcTimerIe ieObject =
+                dynamic_cast<
+                EpcTimerIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(EpcTimerIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeEpcTimerIe(buffer, data.periodOfValidity, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: periodOfValidity\n");
+                        return false;
+                    }
+                    Uint16 mandIe = EpcTimerIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case ApnIeType:
+            {
+                ApnIe ieObject =
+                dynamic_cast<
+                ApnIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(ApnIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeApnIe(buffer, data.listOfAccessPointName, ieHeader.length);
+
+                    data.listOfAccessPointNameIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: listOfAccessPointName\n");
+                        return false;
+                    }
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void PgwsOverloadControlInformationInModifyBearerResponse::
+displayPgwsOverloadControlInformationInModifyBearerResponseData_v
+(PgwsOverloadControlInformationInModifyBearerResponseData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"PgwsOverloadControlInformationInModifyBearerResponse:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+
+    if (data.listOfAccessPointNameIePresent)
+    {
+
+        stream.add((char *)"listOfAccessPointName:");
+        stream.endOfLine();
+        ApnIe apn=
+        dynamic_cast<
+        ApnIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnIeType));
+        apn.displayApnIe_v(data.listOfAccessPointName, stream);
+
+    }
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/pgwsOverloadControlInformationInModifyBearerResponse.h b/src/gtpV2Codec/ieClasses/pgwsOverloadControlInformationInModifyBearerResponse.h
new file mode 100644
index 0000000..ed0d31a
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/pgwsOverloadControlInformationInModifyBearerResponse.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef PGWSOVERLOADCONTROLINFORMATIONINMODIFYBEARERRESPONSE_H_
+#define PGWSOVERLOADCONTROLINFORMATIONINMODIFYBEARERRESPONSE_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class PgwsOverloadControlInformationInModifyBearerResponse:public GtpV2GroupedIe
+{
+public:
+    PgwsOverloadControlInformationInModifyBearerResponse();
+    virtual ~PgwsOverloadControlInformationInModifyBearerResponse();
+    bool encodePgwsOverloadControlInformationInModifyBearerResponse(MsgBuffer &buffer,
+                             PgwsOverloadControlInformationInModifyBearerResponseData
+                              const &data);
+
+    bool decodePgwsOverloadControlInformationInModifyBearerResponse (MsgBuffer &buffer,
+                             PgwsOverloadControlInformationInModifyBearerResponseData 
+                             & data, Uint16 length);
+
+    void displayPgwsOverloadControlInformationInModifyBearerResponseData_v
+    (PgwsOverloadControlInformationInModifyBearerResponseData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/portNumberIe.cpp b/src/gtpV2Codec/ieClasses/portNumberIe.cpp
new file mode 100644
index 0000000..bacc726
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/portNumberIe.cpp
@@ -0,0 +1,77 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "portNumberIe.h"
+#include "dataTypeCodecUtils.h"
+
+PortNumberIe::PortNumberIe() 
+{
+    ieType = 126;
+    // TODO
+
+}
+
+PortNumberIe::~PortNumberIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool PortNumberIe::encodePortNumberIe(MsgBuffer &buffer, PortNumberIeData const &data)
+{
+    if (!(buffer.writeUint16(data.portNumber)))
+    {
+        errorStream.add((char *)"Encoding of portNumber failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool PortNumberIe::decodePortNumberIe(MsgBuffer &buffer, PortNumberIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+
+    buffer.readUint16(data.portNumber);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: portNumber\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE PortNumberIe\n");
+        return false;
+    }
+}
+void PortNumberIe::displayPortNumberIe_v(PortNumberIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"PortNumberIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add((char *)"portNumber: ");
+    stream.add(data.portNumber);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/portNumberIe.h b/src/gtpV2Codec/ieClasses/portNumberIe.h
new file mode 100644
index 0000000..4016e48
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/portNumberIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef PORTNUMBERIE_H_
+#define PORTNUMBERIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class PortNumberIe: public GtpV2Ie {
+public:
+    PortNumberIe();
+    virtual ~PortNumberIe();
+
+    bool encodePortNumberIe(MsgBuffer &buffer,
+                 PortNumberIeData const &data);
+    bool decodePortNumberIe(MsgBuffer &buffer,
+                 PortNumberIeData &data, Uint16 length);
+    void displayPortNumberIe_v(PortNumberIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* PORTNUMBERIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/presenceReportingAreaActionIe.cpp b/src/gtpV2Codec/ieClasses/presenceReportingAreaActionIe.cpp
new file mode 100644
index 0000000..000b92a
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/presenceReportingAreaActionIe.cpp
@@ -0,0 +1,515 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "presenceReportingAreaActionIe.h"
+#include "dataTypeCodecUtils.h"
+
+PresenceReportingAreaActionIe::PresenceReportingAreaActionIe() 
+{
+    ieType = 177;
+    // TODO
+
+}
+
+PresenceReportingAreaActionIe::~PresenceReportingAreaActionIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool PresenceReportingAreaActionIe::encodePresenceReportingAreaActionIe(MsgBuffer &buffer, PresenceReportingAreaActionIeData const &data)
+{
+    buffer.skipBits(4);
+
+    if(!(buffer.writeBits(data.inapra, 1)))
+    {
+        errorStream.add((char *)"Encoding of inapra failed\n");
+        return false;
+    }
+    if (!(data.action<=3))
+    {
+        errorStream.add((char *)"Data validation failure: action\n");
+        return false; 
+    }
+    if(!(buffer.writeBits(data.action, 3)))
+    {
+        errorStream.add((char *)"Encoding of action failed\n");
+        return false;
+    }
+    if (!(buffer.writeUint32(data.presenceReportingAreaIdentifier)))
+    {
+        errorStream.add((char *)"Encoding of presenceReportingAreaIdentifier failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.numberOfTAI, 4)))
+    {
+        errorStream.add((char *)"Encoding of numberOfTAI failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.numberOfRAI, 4)))
+    {
+        errorStream.add((char *)"Encoding of numberOfRAI failed\n");
+        return false;
+    }
+    buffer.skipBits(2);
+
+    if(!(buffer.writeBits(data.numberOfMacroeNodeB, 6)))
+    {
+        errorStream.add((char *)"Encoding of numberOfMacroeNodeB failed\n");
+        return false;
+    }
+    buffer.skipBits(2);
+
+    if(!(buffer.writeBits(data.numberOfHomeeNodeB, 6)))
+    {
+        errorStream.add((char *)"Encoding of numberOfHomeeNodeB failed\n");
+        return false;
+    }
+    buffer.skipBits(2);
+
+    if(!(buffer.writeBits(data.numberOfECGI, 6)))
+    {
+        errorStream.add((char *)"Encoding of numberOfECGI failed\n");
+        return false;
+    }
+    buffer.skipBits(2);
+
+    if(!(buffer.writeBits(data.numberOfSAI, 6)))
+    {
+        errorStream.add((char *)"Encoding of numberOfSAI failed\n");
+        return false;
+    }
+    buffer.skipBits(2);
+
+    if(!(buffer.writeBits(data.numberOfCGI, 6)))
+    {
+        errorStream.add((char *)"Encoding of numberOfCGI failed\n");
+        return false;
+    }
+    if (data.numberOfTAI !=0)
+    {
+        if (!(DataTypeCodecUtils::encodeTaiFieldArray15(buffer, data.tais)))
+        {
+            errorStream.add((char *)"Encoding of tais failed\n");
+            return false;
+        }
+    }
+    if (data.numberOfMacroeNodeB !=0)
+    {
+        if (!(buffer.writeUint8(data.macroeNBIds)))
+        {
+    errorStream.add((char *)"Encoding of macroeNBIds failed\n");
+    return false;
+        }
+    }
+    if (data.numberOfHomeeNodeB !=0)
+    {
+        if (!(buffer.writeUint8(data.homeeNBIds)))
+        {
+    errorStream.add((char *)"Encoding of homeeNBIds failed\n");
+    return false;
+        }
+    }
+    if (data.numberOfECGI !=0)
+    {
+        if (!(DataTypeCodecUtils::encodeEcgiFieldArray64(buffer, data.ecgis)))
+        {
+            errorStream.add((char *)"Encoding of ecgis failed\n");
+            return false;
+        }
+    }
+    if (data.numberOfRAI !=0)
+    {
+        if (!(DataTypeCodecUtils::encodeRaiFieldArray15(buffer, data.raiss)))
+        {
+            errorStream.add((char *)"Encoding of raiss failed\n");
+            return false;
+        }
+    }
+    if (data.numberOfSAI !=0)
+    {
+        if (!(DataTypeCodecUtils::encodeSaiFieldArray64(buffer, data.saiss)))
+        {
+            errorStream.add((char *)"Encoding of saiss failed\n");
+            return false;
+        }
+    }
+    if (data.numberOfCGI !=0)
+    {
+        if (!(DataTypeCodecUtils::encodeCgiFieldArray64(buffer, data.cgiss)))
+        {
+            errorStream.add((char *)"Encoding of cgiss failed\n");
+            return false;
+        }
+    }
+    buffer.skipBits(2);
+
+    if(!(buffer.writeBits(data.numberOfExtendedMacroeNodeB, 6)))
+    {
+        errorStream.add((char *)"Encoding of numberOfExtendedMacroeNodeB failed\n");
+        return false;
+    }
+    if (data.numberOfExtendedMacroeNodeB !=0)
+    {
+        if (!(buffer.writeUint8(data.extendedMacroeNBIds)))
+        {
+    errorStream.add((char *)"Encoding of extendedMacroeNBIds failed\n");
+    return false;
+        }
+    }
+
+    return true;
+}
+
+bool PresenceReportingAreaActionIe::decodePresenceReportingAreaActionIe(MsgBuffer &buffer, PresenceReportingAreaActionIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+    buffer.skipBits(4);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: \n");
+        return false;
+    }
+
+    data.inapra = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: inapra\n");
+        return false;
+    }
+    data.action = buffer.readBits(3);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: action\n");
+        return false;
+    }
+    if (!(data.action<=3))
+    {
+        errorStream.add((char *)"Data validation failure : action\n");
+        return false; //TODO need to add validations
+    }
+
+    buffer.readUint32(data.presenceReportingAreaIdentifier);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: presenceReportingAreaIdentifier\n");
+        return false;
+    }
+    data.numberOfTAI = buffer.readBits(4);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: numberOfTAI\n");
+        return false;
+    }
+    data.numberOfRAI = buffer.readBits(4);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: numberOfRAI\n");
+        return false;
+    }
+    buffer.skipBits(2);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: \n");
+        return false;
+    }
+
+    data.numberOfMacroeNodeB = buffer.readBits(6);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: numberOfMacroeNodeB\n");
+        return false;
+    }
+    buffer.skipBits(2);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: \n");
+        return false;
+    }
+
+    data.numberOfHomeeNodeB = buffer.readBits(6);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: numberOfHomeeNodeB\n");
+        return false;
+    }
+    buffer.skipBits(2);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: \n");
+        return false;
+    }
+
+    data.numberOfECGI = buffer.readBits(6);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: numberOfECGI\n");
+        return false;
+    }
+    buffer.skipBits(2);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: \n");
+        return false;
+    }
+
+    data.numberOfSAI = buffer.readBits(6);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: numberOfSAI\n");
+        return false;
+    }
+    buffer.skipBits(2);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: \n");
+        return false;
+    }
+
+    data.numberOfCGI = buffer.readBits(6);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: numberOfCGI\n");
+        return false;
+    }
+
+    Uint16 lengthLeft = length;
+
+    if (data.numberOfTAI !=0)
+    {
+        lengthLeft = ieBoundary - buffer.getCurrentIndex();
+        if (!(DataTypeCodecUtils::decodeTaiFieldArray15(buffer, data.tais, lengthLeft, 0)))
+        {
+            errorStream.add((char *)"Failed to decode: tais\n");
+            return false;
+        }
+    }
+
+    if (data.numberOfMacroeNodeB !=0)
+    {
+
+        buffer.readUint8(data.macroeNBIds);
+        if (buffer.getCurrentIndex() > ieBoundary)
+        {
+            errorStream.add((char *)"Attempt to read beyond IE boundary: macroeNBIds\n");
+            return false;
+        }
+    }
+
+    if (data.numberOfHomeeNodeB !=0)
+    {
+
+        buffer.readUint8(data.homeeNBIds);
+        if (buffer.getCurrentIndex() > ieBoundary)
+        {
+            errorStream.add((char *)"Attempt to read beyond IE boundary: homeeNBIds\n");
+            return false;
+        }
+    }
+
+    if (data.numberOfECGI !=0)
+    {
+        lengthLeft = ieBoundary - buffer.getCurrentIndex();
+        if (!(DataTypeCodecUtils::decodeEcgiFieldArray64(buffer, data.ecgis, lengthLeft, 0)))
+        {
+            errorStream.add((char *)"Failed to decode: ecgis\n");
+            return false;
+        }
+    }
+
+    if (data.numberOfRAI !=0)
+    {
+        lengthLeft = ieBoundary - buffer.getCurrentIndex();
+        if (!(DataTypeCodecUtils::decodeRaiFieldArray15(buffer, data.raiss, lengthLeft, 0)))
+        {
+            errorStream.add((char *)"Failed to decode: raiss\n");
+            return false;
+        }
+    }
+
+    if (data.numberOfSAI !=0)
+    {
+        lengthLeft = ieBoundary - buffer.getCurrentIndex();
+        if (!(DataTypeCodecUtils::decodeSaiFieldArray64(buffer, data.saiss, lengthLeft, 0)))
+        {
+            errorStream.add((char *)"Failed to decode: saiss\n");
+            return false;
+        }
+    }
+
+    if (data.numberOfCGI !=0)
+    {
+        lengthLeft = ieBoundary - buffer.getCurrentIndex();
+        if (!(DataTypeCodecUtils::decodeCgiFieldArray64(buffer, data.cgiss, lengthLeft, 0)))
+        {
+            errorStream.add((char *)"Failed to decode: cgiss\n");
+            return false;
+        }
+    }
+    buffer.skipBits(2);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: \n");
+        return false;
+    }
+
+    data.numberOfExtendedMacroeNodeB = buffer.readBits(6);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: numberOfExtendedMacroeNodeB\n");
+        return false;
+    }
+
+    if (data.numberOfExtendedMacroeNodeB !=0)
+    {
+
+        buffer.readUint8(data.extendedMacroeNBIds);
+        if (buffer.getCurrentIndex() > ieBoundary)
+        {
+            errorStream.add((char *)"Attempt to read beyond IE boundary: extendedMacroeNBIds\n");
+            return false;
+        }
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE PresenceReportingAreaActionIe\n");
+        return false;
+    }
+}
+void PresenceReportingAreaActionIe::displayPresenceReportingAreaActionIe_v(PresenceReportingAreaActionIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"PresenceReportingAreaActionIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add( (char *)"inapra: "); 
+    stream.add((Uint8)data.inapra);
+    stream.endOfLine();
+  
+    stream.add( (char *)"action: "); 
+    stream.add((Uint8)data.action);
+    stream.endOfLine();
+  
+    stream.add((char *)"presenceReportingAreaIdentifier: ");
+    stream.add(data.presenceReportingAreaIdentifier);
+    stream.endOfLine();
+  
+    stream.add( (char *)"numberOfTAI: "); 
+    stream.add((Uint8)data.numberOfTAI);
+    stream.endOfLine();
+  
+    stream.add( (char *)"numberOfRAI: "); 
+    stream.add((Uint8)data.numberOfRAI);
+    stream.endOfLine();
+  
+    stream.add( (char *)"numberOfMacroeNodeB: "); 
+    stream.add((Uint8)data.numberOfMacroeNodeB);
+    stream.endOfLine();
+  
+    stream.add( (char *)"numberOfHomeeNodeB: "); 
+    stream.add((Uint8)data.numberOfHomeeNodeB);
+    stream.endOfLine();
+  
+    stream.add( (char *)"numberOfECGI: "); 
+    stream.add((Uint8)data.numberOfECGI);
+    stream.endOfLine();
+  
+    stream.add( (char *)"numberOfSAI: "); 
+    stream.add((Uint8)data.numberOfSAI);
+    stream.endOfLine();
+  
+    stream.add( (char *)"numberOfCGI: "); 
+    stream.add((Uint8)data.numberOfCGI);
+    stream.endOfLine();
+  
+    if (data.numberOfTAI !=0)
+    {
+        stream.add((char *)"tais:");
+        stream.endOfLine();
+        DataTypeCodecUtils::displayTaiFieldArray15_v(data.tais, stream);
+    }
+  
+    if (data.numberOfMacroeNodeB !=0)
+    {
+        stream.add((char *)"macroeNBIds: ");
+        stream.add(data.macroeNBIds);
+        stream.endOfLine();
+    }
+  
+    if (data.numberOfHomeeNodeB !=0)
+    {
+        stream.add((char *)"homeeNBIds: ");
+        stream.add(data.homeeNBIds);
+        stream.endOfLine();
+    }
+  
+    if (data.numberOfECGI !=0)
+    {
+        stream.add((char *)"ecgis:");
+        stream.endOfLine();
+        DataTypeCodecUtils::displayEcgiFieldArray64_v(data.ecgis, stream);
+    }
+  
+    if (data.numberOfRAI !=0)
+    {
+        stream.add((char *)"raiss:");
+        stream.endOfLine();
+        DataTypeCodecUtils::displayRaiFieldArray15_v(data.raiss, stream);
+    }
+  
+    if (data.numberOfSAI !=0)
+    {
+        stream.add((char *)"saiss:");
+        stream.endOfLine();
+        DataTypeCodecUtils::displaySaiFieldArray64_v(data.saiss, stream);
+    }
+  
+    if (data.numberOfCGI !=0)
+    {
+        stream.add((char *)"cgiss:");
+        stream.endOfLine();
+        DataTypeCodecUtils::displayCgiFieldArray64_v(data.cgiss, stream);
+    }
+  
+    stream.add( (char *)"numberOfExtendedMacroeNodeB: "); 
+    stream.add((Uint8)data.numberOfExtendedMacroeNodeB);
+    stream.endOfLine();
+  
+    if (data.numberOfExtendedMacroeNodeB !=0)
+    {
+        stream.add((char *)"extendedMacroeNBIds: ");
+        stream.add(data.extendedMacroeNBIds);
+        stream.endOfLine();
+    }
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/presenceReportingAreaActionIe.h b/src/gtpV2Codec/ieClasses/presenceReportingAreaActionIe.h
new file mode 100644
index 0000000..5bdaed0
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/presenceReportingAreaActionIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef PRESENCEREPORTINGAREAACTIONIE_H_
+#define PRESENCEREPORTINGAREAACTIONIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class PresenceReportingAreaActionIe: public GtpV2Ie {
+public:
+    PresenceReportingAreaActionIe();
+    virtual ~PresenceReportingAreaActionIe();
+
+    bool encodePresenceReportingAreaActionIe(MsgBuffer &buffer,
+                 PresenceReportingAreaActionIeData const &data);
+    bool decodePresenceReportingAreaActionIe(MsgBuffer &buffer,
+                 PresenceReportingAreaActionIeData &data, Uint16 length);
+    void displayPresenceReportingAreaActionIe_v(PresenceReportingAreaActionIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* PRESENCEREPORTINGAREAACTIONIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/ptiIe.cpp b/src/gtpV2Codec/ieClasses/ptiIe.cpp
new file mode 100644
index 0000000..f5848b7
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/ptiIe.cpp
@@ -0,0 +1,77 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "ptiIe.h"
+#include "dataTypeCodecUtils.h"
+
+PtiIe::PtiIe() 
+{
+    ieType = 100;
+    // TODO
+
+}
+
+PtiIe::~PtiIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool PtiIe::encodePtiIe(MsgBuffer &buffer, PtiIeData const &data)
+{
+    if (!(buffer.writeUint8(data.procedureTransactionId)))
+    {
+        errorStream.add((char *)"Encoding of procedureTransactionId failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool PtiIe::decodePtiIe(MsgBuffer &buffer, PtiIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+
+    buffer.readUint8(data.procedureTransactionId);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: procedureTransactionId\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE PtiIe\n");
+        return false;
+    }
+}
+void PtiIe::displayPtiIe_v(PtiIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"PtiIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add((char *)"procedureTransactionId: ");
+    stream.add(data.procedureTransactionId);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/ptiIe.h b/src/gtpV2Codec/ieClasses/ptiIe.h
new file mode 100644
index 0000000..b34a14a
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/ptiIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef PTIIE_H_
+#define PTIIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class PtiIe: public GtpV2Ie {
+public:
+    PtiIe();
+    virtual ~PtiIe();
+
+    bool encodePtiIe(MsgBuffer &buffer,
+                 PtiIeData const &data);
+    bool decodePtiIe(MsgBuffer &buffer,
+                 PtiIeData &data, Uint16 length);
+    void displayPtiIe_v(PtiIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* PTIIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/ranNasCauseIe.cpp b/src/gtpV2Codec/ieClasses/ranNasCauseIe.cpp
new file mode 100644
index 0000000..fb5441a
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/ranNasCauseIe.cpp
@@ -0,0 +1,119 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "ranNasCauseIe.h"
+#include "dataTypeCodecUtils.h"
+
+RanNasCauseIe::RanNasCauseIe() 
+{
+    ieType = 172;
+    // TODO
+
+}
+
+RanNasCauseIe::~RanNasCauseIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool RanNasCauseIe::encodeRanNasCauseIe(MsgBuffer &buffer, RanNasCauseIeData const &data)
+{
+    if (!(data.protocolType>= 1 && data.protocolType<=5))
+    {
+        errorStream.add((char *)"Data validation failure: protocolType\n");
+        return false; 
+    }
+    if(!(buffer.writeBits(data.protocolType, 4)))
+    {
+        errorStream.add((char *)"Encoding of protocolType failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.causeType, 4)))
+    {
+        errorStream.add((char *)"Encoding of causeType failed\n");
+        return false;
+    }
+    if (!(buffer.writeUint8(data.causeValue)))
+    {
+        errorStream.add((char *)"Encoding of causeValue failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool RanNasCauseIe::decodeRanNasCauseIe(MsgBuffer &buffer, RanNasCauseIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+    data.protocolType = buffer.readBits(4);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: protocolType\n");
+        return false;
+    }
+    if (!(data.protocolType>= 1 && data.protocolType<=5))
+    {
+        errorStream.add((char *)"Data validation failure : protocolType\n");
+        return false; //TODO need to add validations
+    }
+    data.causeType = buffer.readBits(4);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: causeType\n");
+        return false;
+    }
+
+    buffer.readUint8(data.causeValue);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: causeValue\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE RanNasCauseIe\n");
+        return false;
+    }
+}
+void RanNasCauseIe::displayRanNasCauseIe_v(RanNasCauseIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"RanNasCauseIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add( (char *)"protocolType: "); 
+    stream.add((Uint8)data.protocolType);
+    stream.endOfLine();
+  
+    stream.add( (char *)"causeType: "); 
+    stream.add((Uint8)data.causeType);
+    stream.endOfLine();
+  
+    stream.add((char *)"causeValue: ");
+    stream.add(data.causeValue);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/ranNasCauseIe.h b/src/gtpV2Codec/ieClasses/ranNasCauseIe.h
new file mode 100644
index 0000000..5a37fe9
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/ranNasCauseIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef RANNASCAUSEIE_H_
+#define RANNASCAUSEIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class RanNasCauseIe: public GtpV2Ie {
+public:
+    RanNasCauseIe();
+    virtual ~RanNasCauseIe();
+
+    bool encodeRanNasCauseIe(MsgBuffer &buffer,
+                 RanNasCauseIeData const &data);
+    bool decodeRanNasCauseIe(MsgBuffer &buffer,
+                 RanNasCauseIeData &data, Uint16 length);
+    void displayRanNasCauseIe_v(RanNasCauseIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* RANNASCAUSEIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/ratTypeIe.cpp b/src/gtpV2Codec/ieClasses/ratTypeIe.cpp
new file mode 100644
index 0000000..dfcbbaf
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/ratTypeIe.cpp
@@ -0,0 +1,77 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "ratTypeIe.h"
+#include "dataTypeCodecUtils.h"
+
+RatTypeIe::RatTypeIe() 
+{
+    ieType = 82;
+    // TODO
+
+}
+
+RatTypeIe::~RatTypeIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool RatTypeIe::encodeRatTypeIe(MsgBuffer &buffer, RatTypeIeData const &data)
+{
+    if (!(buffer.writeUint8(data.ratType)))
+    {
+        errorStream.add((char *)"Encoding of ratType failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool RatTypeIe::decodeRatTypeIe(MsgBuffer &buffer, RatTypeIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+
+    buffer.readUint8(data.ratType);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: ratType\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE RatTypeIe\n");
+        return false;
+    }
+}
+void RatTypeIe::displayRatTypeIe_v(RatTypeIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"RatTypeIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add((char *)"ratType: ");
+    stream.add(data.ratType);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/ratTypeIe.h b/src/gtpV2Codec/ieClasses/ratTypeIe.h
new file mode 100644
index 0000000..8c3b0bd
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/ratTypeIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef RATTYPEIE_H_
+#define RATTYPEIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class RatTypeIe: public GtpV2Ie {
+public:
+    RatTypeIe();
+    virtual ~RatTypeIe();
+
+    bool encodeRatTypeIe(MsgBuffer &buffer,
+                 RatTypeIeData const &data);
+    bool decodeRatTypeIe(MsgBuffer &buffer,
+                 RatTypeIeData &data, Uint16 length);
+    void displayRatTypeIe_v(RatTypeIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* RATTYPEIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/recoveryIe.cpp b/src/gtpV2Codec/ieClasses/recoveryIe.cpp
new file mode 100644
index 0000000..709b429
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/recoveryIe.cpp
@@ -0,0 +1,77 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "recoveryIe.h"
+#include "dataTypeCodecUtils.h"
+
+RecoveryIe::RecoveryIe() 
+{
+    ieType = 3;
+    // TODO
+
+}
+
+RecoveryIe::~RecoveryIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool RecoveryIe::encodeRecoveryIe(MsgBuffer &buffer, RecoveryIeData const &data)
+{
+    if (!(buffer.writeUint8(data.restartCounter)))
+    {
+        errorStream.add((char *)"Encoding of restartCounter failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool RecoveryIe::decodeRecoveryIe(MsgBuffer &buffer, RecoveryIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+
+    buffer.readUint8(data.restartCounter);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: restartCounter\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE RecoveryIe\n");
+        return false;
+    }
+}
+void RecoveryIe::displayRecoveryIe_v(RecoveryIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"RecoveryIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add((char *)"restartCounter: ");
+    stream.add(data.restartCounter);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/recoveryIe.h b/src/gtpV2Codec/ieClasses/recoveryIe.h
new file mode 100644
index 0000000..56f4f4a
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/recoveryIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef RECOVERYIE_H_
+#define RECOVERYIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class RecoveryIe: public GtpV2Ie {
+public:
+    RecoveryIe();
+    virtual ~RecoveryIe();
+
+    bool encodeRecoveryIe(MsgBuffer &buffer,
+                 RecoveryIeData const &data);
+    bool decodeRecoveryIe(MsgBuffer &buffer,
+                 RecoveryIeData &data, Uint16 length);
+    void displayRecoveryIe_v(RecoveryIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* RECOVERYIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/remoteUeContextConnectedInCreateSessionRequest.cpp b/src/gtpV2Codec/ieClasses/remoteUeContextConnectedInCreateSessionRequest.cpp
new file mode 100644
index 0000000..601fe40
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/remoteUeContextConnectedInCreateSessionRequest.cpp
@@ -0,0 +1,244 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "remoteUeContextConnectedInCreateSessionRequest.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "remoteUserIdIe.h"
+#include "remoteUeIpInformationIe.h"
+
+RemoteUeContextConnectedInCreateSessionRequest::
+RemoteUeContextConnectedInCreateSessionRequest()
+{
+    Uint16 mandIe;
+    mandIe = RemoteUserIdIeType;
+    mandIe = (mandIe << 8) | 0; // remoteUserId
+    mandatoryIeSet.insert(mandIe);
+    mandIe = RemoteUeIpInformationIeType;
+    mandIe = (mandIe << 8) | 0; // remoteUeIpInformation
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+RemoteUeContextConnectedInCreateSessionRequest::
+~RemoteUeContextConnectedInCreateSessionRequest()
+{
+
+}
+bool RemoteUeContextConnectedInCreateSessionRequest::
+encodeRemoteUeContextConnectedInCreateSessionRequest(MsgBuffer &buffer,
+                         RemoteUeContextConnectedInCreateSessionRequestData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = RemoteUserIdIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    RemoteUserIdIe remoteUserId=
+    dynamic_cast<
+    RemoteUserIdIe&>(GtpV2IeFactory::getInstance().getIeObject(RemoteUserIdIeType));
+    rc = remoteUserId.encodeRemoteUserIdIe(buffer, data.remoteUserId);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: remoteUserId\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = RemoteUeIpInformationIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    RemoteUeIpInformationIe remoteUeIpInformation=
+    dynamic_cast<
+    RemoteUeIpInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(RemoteUeIpInformationIeType));
+    rc = remoteUeIpInformation.encodeRemoteUeIpInformationIe(buffer, data.remoteUeIpInformation);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: remoteUeIpInformation\n");
+        return false;
+    }
+    return rc;
+}
+
+bool RemoteUeContextConnectedInCreateSessionRequest::
+decodeRemoteUeContextConnectedInCreateSessionRequest(MsgBuffer &buffer,
+                         RemoteUeContextConnectedInCreateSessionRequestData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case RemoteUserIdIeType:
+            {
+                RemoteUserIdIe ieObject =
+                dynamic_cast<
+                RemoteUserIdIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(RemoteUserIdIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeRemoteUserIdIe(buffer, data.remoteUserId, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: remoteUserId\n");
+                        return false;
+                    }
+                    Uint16 mandIe = RemoteUserIdIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case RemoteUeIpInformationIeType:
+            {
+                RemoteUeIpInformationIe ieObject =
+                dynamic_cast<
+                RemoteUeIpInformationIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(RemoteUeIpInformationIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeRemoteUeIpInformationIe(buffer, data.remoteUeIpInformation, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: remoteUeIpInformation\n");
+                        return false;
+                    }
+                    Uint16 mandIe = RemoteUeIpInformationIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void RemoteUeContextConnectedInCreateSessionRequest::
+displayRemoteUeContextConnectedInCreateSessionRequestData_v
+(RemoteUeContextConnectedInCreateSessionRequestData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"RemoteUeContextConnectedInCreateSessionRequest:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/remoteUeContextConnectedInCreateSessionRequest.h b/src/gtpV2Codec/ieClasses/remoteUeContextConnectedInCreateSessionRequest.h
new file mode 100644
index 0000000..ee34c6e
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/remoteUeContextConnectedInCreateSessionRequest.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef REMOTEUECONTEXTCONNECTEDINCREATESESSIONREQUEST_H_
+#define REMOTEUECONTEXTCONNECTEDINCREATESESSIONREQUEST_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class RemoteUeContextConnectedInCreateSessionRequest:public GtpV2GroupedIe
+{
+public:
+    RemoteUeContextConnectedInCreateSessionRequest();
+    virtual ~RemoteUeContextConnectedInCreateSessionRequest();
+    bool encodeRemoteUeContextConnectedInCreateSessionRequest(MsgBuffer &buffer,
+                             RemoteUeContextConnectedInCreateSessionRequestData
+                              const &data);
+
+    bool decodeRemoteUeContextConnectedInCreateSessionRequest (MsgBuffer &buffer,
+                             RemoteUeContextConnectedInCreateSessionRequestData 
+                             & data, Uint16 length);
+
+    void displayRemoteUeContextConnectedInCreateSessionRequestData_v
+    (RemoteUeContextConnectedInCreateSessionRequestData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/remoteUeContextIe.cpp b/src/gtpV2Codec/ieClasses/remoteUeContextIe.cpp
new file mode 100644
index 0000000..c21d8c9
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/remoteUeContextIe.cpp
@@ -0,0 +1,49 @@
+/*
+ * 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/grpietemplate.cpp.tt>
+ ******************************************************************************/
+#include "remoteUeContextIe.h"
+#include "gtpV2GrpIeDataTypes.h"
+#include "manual/gtpV2GroupedIe.h"
+
+#include "remoteUeContextConnectedInCreateSessionRequest.h"
+
+RemoteUeContextIe::RemoteUeContextIe()
+{
+    ieType = RemoteUeContextIeType;
+   
+    RemoteUeContextConnectedInCreateSessionRequest* remoteUeContextConnectedInCreateSessionRequest_p = new (RemoteUeContextConnectedInCreateSessionRequest);
+    insertGroupedIeObject(CreateSessionRequestMsgType, 0, remoteUeContextConnectedInCreateSessionRequest_p);
+}
+
+RemoteUeContextIe::~RemoteUeContextIe() {
+// TODO Auto-generated destructor stub
+}
+
+GtpV2GroupedIe& RemoteUeContextIe::getGroupedIe(Uint8 msgType, Uint8 instance)
+{
+    std::map<Uint16, GtpV2GroupedIe*>::iterator it;
+    Uint16 key = msgType;
+    key = (key << 8) + instance;
+    it = groupedIeObjectContainer.find(key);
+    return *(it->second);
+}
+
+void RemoteUeContextIe::insertGroupedIeObject(Uint8 msgType, Uint8 instance, GtpV2GroupedIe* grpIe_p)
+{
+
+    Uint16 key = msgType;
+    key = (key << 8) + instance;
+
+    groupedIeObjectContainer.insert(std::pair<Uint16, GtpV2GroupedIe*>(key, grpIe_p));
+
+}  
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/remoteUeContextIe.h b/src/gtpV2Codec/ieClasses/remoteUeContextIe.h
new file mode 100644
index 0000000..54c3455
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/remoteUeContextIe.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/grpietemplate.h.tt>
+ ******************************************************************************/
+#ifndef REMOTEUECONTEXTIE_H_
+#define REMOTEUECONTEXTIE_H_
+
+#include <map>
+#include "manual/gtpV2Ie.h"
+#include "manual/gtpV2GroupedIe.h"
+#include "gtpV2DataTypes.h"
+
+class RemoteUeContextIe:public GtpV2Ie
+{
+public:
+    RemoteUeContextIe ();
+    virtual ~ RemoteUeContextIe ();
+
+    GtpV2GroupedIe & getGroupedIe (Uint8 msgType, Uint8 instance);
+    void insertGroupedIeObject (Uint8 msgType, Uint8 instance,
+                GtpV2GroupedIe * grpIe_p);
+
+private:
+    map < Uint16, GtpV2GroupedIe * >groupedIeObjectContainer;   // map[msgType || instance]
+};
+
+#endif
diff --git a/src/gtpV2Codec/ieClasses/remoteUeIpInformationIe.cpp b/src/gtpV2Codec/ieClasses/remoteUeIpInformationIe.cpp
new file mode 100644
index 0000000..e097d1b
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/remoteUeIpInformationIe.cpp
@@ -0,0 +1,77 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "remoteUeIpInformationIe.h"
+#include "dataTypeCodecUtils.h"
+
+RemoteUeIpInformationIe::RemoteUeIpInformationIe() 
+{
+    ieType = 193;
+    // TODO
+
+}
+
+RemoteUeIpInformationIe::~RemoteUeIpInformationIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool RemoteUeIpInformationIe::encodeRemoteUeIpInformationIe(MsgBuffer &buffer, RemoteUeIpInformationIeData const &data)
+{
+    if (!(buffer.writeUint64(data.remoteUeIpInformation)))
+    {
+        errorStream.add((char *)"Encoding of remoteUeIpInformation failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool RemoteUeIpInformationIe::decodeRemoteUeIpInformationIe(MsgBuffer &buffer, RemoteUeIpInformationIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+
+    buffer.readUint64(data.remoteUeIpInformation);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: remoteUeIpInformation\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE RemoteUeIpInformationIe\n");
+        return false;
+    }
+}
+void RemoteUeIpInformationIe::displayRemoteUeIpInformationIe_v(RemoteUeIpInformationIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"RemoteUeIpInformationIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add((char *)"remoteUeIpInformation: ");
+    stream.add(data.remoteUeIpInformation);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/remoteUeIpInformationIe.h b/src/gtpV2Codec/ieClasses/remoteUeIpInformationIe.h
new file mode 100644
index 0000000..87dd1fc
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/remoteUeIpInformationIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef REMOTEUEIPINFORMATIONIE_H_
+#define REMOTEUEIPINFORMATIONIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class RemoteUeIpInformationIe: public GtpV2Ie {
+public:
+    RemoteUeIpInformationIe();
+    virtual ~RemoteUeIpInformationIe();
+
+    bool encodeRemoteUeIpInformationIe(MsgBuffer &buffer,
+                 RemoteUeIpInformationIeData const &data);
+    bool decodeRemoteUeIpInformationIe(MsgBuffer &buffer,
+                 RemoteUeIpInformationIeData &data, Uint16 length);
+    void displayRemoteUeIpInformationIe_v(RemoteUeIpInformationIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* REMOTEUEIPINFORMATIONIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/remoteUserIdIe.cpp b/src/gtpV2Codec/ieClasses/remoteUserIdIe.cpp
new file mode 100644
index 0000000..c325e0e
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/remoteUserIdIe.cpp
@@ -0,0 +1,197 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "remoteUserIdIe.h"
+#include "dataTypeCodecUtils.h"
+
+RemoteUserIdIe::RemoteUserIdIe() 
+{
+    ieType = 192;
+    // TODO
+
+}
+
+RemoteUserIdIe::~RemoteUserIdIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool RemoteUserIdIe::encodeRemoteUserIdIe(MsgBuffer &buffer, RemoteUserIdIeData const &data)
+{
+    buffer.skipBits(6);
+
+    if(!(buffer.writeBits(data.imeifpresent, 1)))
+    {
+        errorStream.add((char *)"Encoding of imeifpresent failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.msisdnfpresent, 1)))
+    {
+        errorStream.add((char *)"Encoding of msisdnfpresent failed\n");
+        return false;
+    }
+    if (!(buffer.writeUint8(data.lengthofIMSI)))
+    {
+        errorStream.add((char *)"Encoding of lengthofIMSI failed\n");
+        return false;
+    }
+    if (!(DataTypeCodecUtils::encodeDigitRegister(buffer, data.imsi)))
+    {
+    errorStream.add((char *)"Encoding of imsi failed\n");
+    return false;
+    }
+    if (!(buffer.writeUint8(data.lengthOfMSISDN)))
+    {
+        errorStream.add((char *)"Encoding of lengthOfMSISDN failed\n");
+        return false;
+    }
+    if (!(DataTypeCodecUtils::encodeDigitRegister(buffer, data.msisdn)))
+    {
+    errorStream.add((char *)"Encoding of msisdn failed\n");
+    return false;
+    }
+    if (!(buffer.writeUint8(data.lengthOfIMEI)))
+    {
+        errorStream.add((char *)"Encoding of lengthOfIMEI failed\n");
+        return false;
+    }
+    if (!(DataTypeCodecUtils::encodeDigitRegister(buffer, data.imei)))
+    {
+    errorStream.add((char *)"Encoding of imei failed\n");
+    return false;
+    }
+
+    return true;
+}
+
+bool RemoteUserIdIe::decodeRemoteUserIdIe(MsgBuffer &buffer, RemoteUserIdIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+    buffer.skipBits(6);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: \n");
+        return false;
+    }
+
+    data.imeifpresent = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: imeifpresent\n");
+        return false;
+    }
+    data.msisdnfpresent = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: msisdnfpresent\n");
+        return false;
+    }
+
+    buffer.readUint8(data.lengthofIMSI);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: lengthofIMSI\n");
+        return false;
+    }
+
+    Uint16 lengthLeft = length;
+    lengthLeft = ieBoundary - buffer.getCurrentIndex();
+    if (!(DataTypeCodecUtils::decodeDigitRegister(buffer, data.imsi, lengthLeft)))
+    {
+        errorStream.add((char *)"Failed to decode: imsi\n");
+        return false;
+    }
+
+    buffer.readUint8(data.lengthOfMSISDN);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: lengthOfMSISDN\n");
+        return false;
+    }
+    lengthLeft = ieBoundary - buffer.getCurrentIndex();
+    if (!(DataTypeCodecUtils::decodeDigitRegister(buffer, data.msisdn, lengthLeft)))
+    {
+        errorStream.add((char *)"Failed to decode: msisdn\n");
+        return false;
+    }
+
+    buffer.readUint8(data.lengthOfIMEI);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: lengthOfIMEI\n");
+        return false;
+    }
+    lengthLeft = ieBoundary - buffer.getCurrentIndex();
+    if (!(DataTypeCodecUtils::decodeDigitRegister(buffer, data.imei, lengthLeft)))
+    {
+        errorStream.add((char *)"Failed to decode: imei\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE RemoteUserIdIe\n");
+        return false;
+    }
+}
+void RemoteUserIdIe::displayRemoteUserIdIe_v(RemoteUserIdIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"RemoteUserIdIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add( (char *)"imeifpresent: "); 
+    stream.add((Uint8)data.imeifpresent);
+    stream.endOfLine();
+  
+    stream.add( (char *)"msisdnfpresent: "); 
+    stream.add((Uint8)data.msisdnfpresent);
+    stream.endOfLine();
+  
+    stream.add((char *)"lengthofIMSI: ");
+    stream.add(data.lengthofIMSI);
+    stream.endOfLine();
+  
+    stream.add((char *)"imsi:");
+    stream.endOfLine();
+    DataTypeCodecUtils::displayDigitRegister_v(data.imsi, stream);
+  
+    stream.add((char *)"lengthOfMSISDN: ");
+    stream.add(data.lengthOfMSISDN);
+    stream.endOfLine();
+  
+    stream.add((char *)"msisdn:");
+    stream.endOfLine();
+    DataTypeCodecUtils::displayDigitRegister_v(data.msisdn, stream);
+  
+    stream.add((char *)"lengthOfIMEI: ");
+    stream.add(data.lengthOfIMEI);
+    stream.endOfLine();
+  
+    stream.add((char *)"imei:");
+    stream.endOfLine();
+    DataTypeCodecUtils::displayDigitRegister_v(data.imei, stream);
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/remoteUserIdIe.h b/src/gtpV2Codec/ieClasses/remoteUserIdIe.h
new file mode 100644
index 0000000..02da321
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/remoteUserIdIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef REMOTEUSERIDIE_H_
+#define REMOTEUSERIDIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class RemoteUserIdIe: public GtpV2Ie {
+public:
+    RemoteUserIdIe();
+    virtual ~RemoteUserIdIe();
+
+    bool encodeRemoteUserIdIe(MsgBuffer &buffer,
+                 RemoteUserIdIeData const &data);
+    bool decodeRemoteUserIdIe(MsgBuffer &buffer,
+                 RemoteUserIdIeData &data, Uint16 length);
+    void displayRemoteUserIdIe_v(RemoteUserIdIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* REMOTEUSERIDIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/secondaryRatUsageDataReportIe.cpp b/src/gtpV2Codec/ieClasses/secondaryRatUsageDataReportIe.cpp
new file mode 100644
index 0000000..d99bada
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/secondaryRatUsageDataReportIe.cpp
@@ -0,0 +1,217 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "secondaryRatUsageDataReportIe.h"
+#include "dataTypeCodecUtils.h"
+
+SecondaryRatUsageDataReportIe::SecondaryRatUsageDataReportIe() 
+{
+    ieType = 201;
+    // TODO
+
+}
+
+SecondaryRatUsageDataReportIe::~SecondaryRatUsageDataReportIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool SecondaryRatUsageDataReportIe::encodeSecondaryRatUsageDataReportIe(MsgBuffer &buffer, SecondaryRatUsageDataReportIeData const &data)
+{
+    buffer.skipBits(4);
+
+    if(!(buffer.writeBits(data.irsgw, 2)))
+    {
+        errorStream.add((char *)"Encoding of irsgw failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.irpgw, 2)))
+    {
+        errorStream.add((char *)"Encoding of irpgw failed\n");
+        return false;
+    }
+    if (!(data.secondaryRatType== 0 || data.secondaryRatType== 1))
+    {
+        errorStream.add((char *)"Data validation failure: secondaryRatType\n");
+        return false; 
+    }
+    if (!(buffer.writeUint8(data.secondaryRatType)))
+    {
+        errorStream.add((char *)"Encoding of secondaryRatType failed\n");
+        return false;
+    }
+    buffer.skipBits(4);
+
+    if(!(buffer.writeBits(data.epsBearerId, 4)))
+    {
+        errorStream.add((char *)"Encoding of epsBearerId failed\n");
+        return false;
+    }
+    if (!(buffer.writeUint32(data.starttimestamp)))
+    {
+        errorStream.add((char *)"Encoding of starttimestamp failed\n");
+        return false;
+    }
+    if (!(buffer.writeUint32(data.endtimestamp)))
+    {
+        errorStream.add((char *)"Encoding of endtimestamp failed\n");
+        return false;
+    }
+    if (!(buffer.writeUint64(data.usageDataDL)))
+    {
+        errorStream.add((char *)"Encoding of usageDataDL failed\n");
+        return false;
+    }
+    if (!(buffer.writeUint64(data.usageDataUL)))
+    {
+        errorStream.add((char *)"Encoding of usageDataUL failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool SecondaryRatUsageDataReportIe::decodeSecondaryRatUsageDataReportIe(MsgBuffer &buffer, SecondaryRatUsageDataReportIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+    buffer.skipBits(4);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: \n");
+        return false;
+    }
+
+    data.irsgw = buffer.readBits(2);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: irsgw\n");
+        return false;
+    }
+    data.irpgw = buffer.readBits(2);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: irpgw\n");
+        return false;
+    }
+
+    buffer.readUint8(data.secondaryRatType);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: secondaryRatType\n");
+        return false;
+    }
+    if (!(data.secondaryRatType== 0 || data.secondaryRatType== 1))
+    {
+        errorStream.add((char *)"Data validation failure : secondaryRatType\n");
+        return false; //TODO need to add validations
+    }
+    buffer.skipBits(4);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: \n");
+        return false;
+    }
+
+    data.epsBearerId = buffer.readBits(4);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: epsBearerId\n");
+        return false;
+    }
+
+    buffer.readUint32(data.starttimestamp);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: starttimestamp\n");
+        return false;
+    }
+
+    buffer.readUint32(data.endtimestamp);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: endtimestamp\n");
+        return false;
+    }
+
+    buffer.readUint64(data.usageDataDL);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: usageDataDL\n");
+        return false;
+    }
+
+    buffer.readUint64(data.usageDataUL);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: usageDataUL\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE SecondaryRatUsageDataReportIe\n");
+        return false;
+    }
+}
+void SecondaryRatUsageDataReportIe::displaySecondaryRatUsageDataReportIe_v(SecondaryRatUsageDataReportIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"SecondaryRatUsageDataReportIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add( (char *)"irsgw: "); 
+    stream.add((Uint8)data.irsgw);
+    stream.endOfLine();
+  
+    stream.add( (char *)"irpgw: "); 
+    stream.add((Uint8)data.irpgw);
+    stream.endOfLine();
+  
+    stream.add((char *)"secondaryRatType: ");
+    stream.add(data.secondaryRatType);
+    stream.endOfLine();
+  
+    stream.add( (char *)"epsBearerId: "); 
+    stream.add((Uint8)data.epsBearerId);
+    stream.endOfLine();
+  
+    stream.add((char *)"starttimestamp: ");
+    stream.add(data.starttimestamp);
+    stream.endOfLine();
+  
+    stream.add((char *)"endtimestamp: ");
+    stream.add(data.endtimestamp);
+    stream.endOfLine();
+  
+    stream.add((char *)"usageDataDL: ");
+    stream.add(data.usageDataDL);
+    stream.endOfLine();
+  
+    stream.add((char *)"usageDataUL: ");
+    stream.add(data.usageDataUL);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/secondaryRatUsageDataReportIe.h b/src/gtpV2Codec/ieClasses/secondaryRatUsageDataReportIe.h
new file mode 100644
index 0000000..e259431
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/secondaryRatUsageDataReportIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef SECONDARYRATUSAGEDATAREPORTIE_H_
+#define SECONDARYRATUSAGEDATAREPORTIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class SecondaryRatUsageDataReportIe: public GtpV2Ie {
+public:
+    SecondaryRatUsageDataReportIe();
+    virtual ~SecondaryRatUsageDataReportIe();
+
+    bool encodeSecondaryRatUsageDataReportIe(MsgBuffer &buffer,
+                 SecondaryRatUsageDataReportIeData const &data);
+    bool decodeSecondaryRatUsageDataReportIe(MsgBuffer &buffer,
+                 SecondaryRatUsageDataReportIeData &data, Uint16 length);
+    void displaySecondaryRatUsageDataReportIe_v(SecondaryRatUsageDataReportIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* SECONDARYRATUSAGEDATAREPORTIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/selectionModeIe.cpp b/src/gtpV2Codec/ieClasses/selectionModeIe.cpp
new file mode 100644
index 0000000..747730c
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/selectionModeIe.cpp
@@ -0,0 +1,86 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "selectionModeIe.h"
+#include "dataTypeCodecUtils.h"
+
+SelectionModeIe::SelectionModeIe() 
+{
+    ieType = 128;
+    // TODO
+
+}
+
+SelectionModeIe::~SelectionModeIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool SelectionModeIe::encodeSelectionModeIe(MsgBuffer &buffer, SelectionModeIeData const &data)
+{
+    buffer.skipBits(6);
+
+    if(!(buffer.writeBits(data.selectionMode, 2)))
+    {
+        errorStream.add((char *)"Encoding of selectionMode failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool SelectionModeIe::decodeSelectionModeIe(MsgBuffer &buffer, SelectionModeIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+    buffer.skipBits(6);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: \n");
+        return false;
+    }
+
+    data.selectionMode = buffer.readBits(2);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: selectionMode\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE SelectionModeIe\n");
+        return false;
+    }
+}
+void SelectionModeIe::displaySelectionModeIe_v(SelectionModeIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"SelectionModeIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add( (char *)"selectionMode: "); 
+    stream.add((Uint8)data.selectionMode);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/selectionModeIe.h b/src/gtpV2Codec/ieClasses/selectionModeIe.h
new file mode 100644
index 0000000..1b74ad6
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/selectionModeIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef SELECTIONMODEIE_H_
+#define SELECTIONMODEIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class SelectionModeIe: public GtpV2Ie {
+public:
+    SelectionModeIe();
+    virtual ~SelectionModeIe();
+
+    bool encodeSelectionModeIe(MsgBuffer &buffer,
+                 SelectionModeIeData const &data);
+    bool decodeSelectionModeIe(MsgBuffer &buffer,
+                 SelectionModeIeData &data, Uint16 length);
+    void displaySelectionModeIe_v(SelectionModeIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* SELECTIONMODEIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/sequenceNumberIe.cpp b/src/gtpV2Codec/ieClasses/sequenceNumberIe.cpp
new file mode 100644
index 0000000..2126dad
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/sequenceNumberIe.cpp
@@ -0,0 +1,77 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "sequenceNumberIe.h"
+#include "dataTypeCodecUtils.h"
+
+SequenceNumberIe::SequenceNumberIe() 
+{
+    ieType = 183;
+    // TODO
+
+}
+
+SequenceNumberIe::~SequenceNumberIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool SequenceNumberIe::encodeSequenceNumberIe(MsgBuffer &buffer, SequenceNumberIeData const &data)
+{
+    if (!(buffer.writeUint32(data.sequenceNumber)))
+    {
+        errorStream.add((char *)"Encoding of sequenceNumber failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool SequenceNumberIe::decodeSequenceNumberIe(MsgBuffer &buffer, SequenceNumberIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+
+    buffer.readUint32(data.sequenceNumber);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: sequenceNumber\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE SequenceNumberIe\n");
+        return false;
+    }
+}
+void SequenceNumberIe::displaySequenceNumberIe_v(SequenceNumberIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"SequenceNumberIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add((char *)"sequenceNumber: ");
+    stream.add(data.sequenceNumber);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/sequenceNumberIe.h b/src/gtpV2Codec/ieClasses/sequenceNumberIe.h
new file mode 100644
index 0000000..07066ca
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/sequenceNumberIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef SEQUENCENUMBERIE_H_
+#define SEQUENCENUMBERIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class SequenceNumberIe: public GtpV2Ie {
+public:
+    SequenceNumberIe();
+    virtual ~SequenceNumberIe();
+
+    bool encodeSequenceNumberIe(MsgBuffer &buffer,
+                 SequenceNumberIeData const &data);
+    bool decodeSequenceNumberIe(MsgBuffer &buffer,
+                 SequenceNumberIeData &data, Uint16 length);
+    void displaySequenceNumberIe_v(SequenceNumberIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* SEQUENCENUMBERIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/servingNetworkIe.cpp b/src/gtpV2Codec/ieClasses/servingNetworkIe.cpp
new file mode 100644
index 0000000..fbbb73b
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/servingNetworkIe.cpp
@@ -0,0 +1,157 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "servingNetworkIe.h"
+#include "dataTypeCodecUtils.h"
+
+ServingNetworkIe::ServingNetworkIe() 
+{
+    ieType = 83;
+    // TODO
+
+}
+
+ServingNetworkIe::~ServingNetworkIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool ServingNetworkIe::encodeServingNetworkIe(MsgBuffer &buffer, ServingNetworkIeData const &data)
+{
+    if(!(buffer.writeBits(data.mccDigit2, 4)))
+    {
+        errorStream.add((char *)"Encoding of mccDigit2 failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.mccDigit1, 4)))
+    {
+        errorStream.add((char *)"Encoding of mccDigit1 failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.mncDigit3, 4)))
+    {
+        errorStream.add((char *)"Encoding of mncDigit3 failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.mccDigit3, 4)))
+    {
+        errorStream.add((char *)"Encoding of mccDigit3 failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.mncDigit2, 4)))
+    {
+        errorStream.add((char *)"Encoding of mncDigit2 failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.mncDigit1, 4)))
+    {
+        errorStream.add((char *)"Encoding of mncDigit1 failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool ServingNetworkIe::decodeServingNetworkIe(MsgBuffer &buffer, ServingNetworkIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+    data.mccDigit2 = buffer.readBits(4);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: mccDigit2\n");
+        return false;
+    }
+    data.mccDigit1 = buffer.readBits(4);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: mccDigit1\n");
+        return false;
+    }
+    data.mncDigit3 = buffer.readBits(4);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: mncDigit3\n");
+        return false;
+    }
+    data.mccDigit3 = buffer.readBits(4);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: mccDigit3\n");
+        return false;
+    }
+    data.mncDigit2 = buffer.readBits(4);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: mncDigit2\n");
+        return false;
+    }
+    data.mncDigit1 = buffer.readBits(4);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: mncDigit1\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE ServingNetworkIe\n");
+        return false;
+    }
+}
+void ServingNetworkIe::displayServingNetworkIe_v(ServingNetworkIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"ServingNetworkIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add( (char *)"mccDigit2: "); 
+    stream.add((Uint8)data.mccDigit2);
+    stream.endOfLine();
+  
+    stream.add( (char *)"mccDigit1: "); 
+    stream.add((Uint8)data.mccDigit1);
+    stream.endOfLine();
+  
+    stream.add( (char *)"mncDigit3: "); 
+    stream.add((Uint8)data.mncDigit3);
+    stream.endOfLine();
+  
+    stream.add( (char *)"mccDigit3: "); 
+    stream.add((Uint8)data.mccDigit3);
+    stream.endOfLine();
+  
+    stream.add( (char *)"mncDigit2: "); 
+    stream.add((Uint8)data.mncDigit2);
+    stream.endOfLine();
+  
+    stream.add( (char *)"mncDigit1: "); 
+    stream.add((Uint8)data.mncDigit1);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/servingNetworkIe.h b/src/gtpV2Codec/ieClasses/servingNetworkIe.h
new file mode 100644
index 0000000..5aebc89
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/servingNetworkIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef SERVINGNETWORKIE_H_
+#define SERVINGNETWORKIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class ServingNetworkIe: public GtpV2Ie {
+public:
+    ServingNetworkIe();
+    virtual ~ServingNetworkIe();
+
+    bool encodeServingNetworkIe(MsgBuffer &buffer,
+                 ServingNetworkIeData const &data);
+    bool decodeServingNetworkIe(MsgBuffer &buffer,
+                 ServingNetworkIeData &data, Uint16 length);
+    void displayServingNetworkIe_v(ServingNetworkIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* SERVINGNETWORKIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/servingPlmnRateControlIe.cpp b/src/gtpV2Codec/ieClasses/servingPlmnRateControlIe.cpp
new file mode 100644
index 0000000..c4ff183
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/servingPlmnRateControlIe.cpp
@@ -0,0 +1,93 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "servingPlmnRateControlIe.h"
+#include "dataTypeCodecUtils.h"
+
+ServingPlmnRateControlIe::ServingPlmnRateControlIe() 
+{
+    ieType = 198;
+    // TODO
+
+}
+
+ServingPlmnRateControlIe::~ServingPlmnRateControlIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool ServingPlmnRateControlIe::encodeServingPlmnRateControlIe(MsgBuffer &buffer, ServingPlmnRateControlIeData const &data)
+{
+    if (!(buffer.writeUint16(data.uplinkRateLimit)))
+    {
+        errorStream.add((char *)"Encoding of uplinkRateLimit failed\n");
+        return false;
+    }
+    if (!(buffer.writeUint16(data.downlinkRateLimit)))
+    {
+        errorStream.add((char *)"Encoding of downlinkRateLimit failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool ServingPlmnRateControlIe::decodeServingPlmnRateControlIe(MsgBuffer &buffer, ServingPlmnRateControlIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+
+    buffer.readUint16(data.uplinkRateLimit);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: uplinkRateLimit\n");
+        return false;
+    }
+
+    buffer.readUint16(data.downlinkRateLimit);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: downlinkRateLimit\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE ServingPlmnRateControlIe\n");
+        return false;
+    }
+}
+void ServingPlmnRateControlIe::displayServingPlmnRateControlIe_v(ServingPlmnRateControlIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"ServingPlmnRateControlIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add((char *)"uplinkRateLimit: ");
+    stream.add(data.uplinkRateLimit);
+    stream.endOfLine();
+  
+    stream.add((char *)"downlinkRateLimit: ");
+    stream.add(data.downlinkRateLimit);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/servingPlmnRateControlIe.h b/src/gtpV2Codec/ieClasses/servingPlmnRateControlIe.h
new file mode 100644
index 0000000..fb3cec2
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/servingPlmnRateControlIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef SERVINGPLMNRATECONTROLIE_H_
+#define SERVINGPLMNRATECONTROLIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class ServingPlmnRateControlIe: public GtpV2Ie {
+public:
+    ServingPlmnRateControlIe();
+    virtual ~ServingPlmnRateControlIe();
+
+    bool encodeServingPlmnRateControlIe(MsgBuffer &buffer,
+                 ServingPlmnRateControlIeData const &data);
+    bool decodeServingPlmnRateControlIe(MsgBuffer &buffer,
+                 ServingPlmnRateControlIeData &data, Uint16 length);
+    void displayServingPlmnRateControlIe_v(ServingPlmnRateControlIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* SERVINGPLMNRATECONTROLIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/sgwsNodeLevelLoadControlInformationInCreateBearerRequest.cpp b/src/gtpV2Codec/ieClasses/sgwsNodeLevelLoadControlInformationInCreateBearerRequest.cpp
new file mode 100644
index 0000000..aef23b3
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/sgwsNodeLevelLoadControlInformationInCreateBearerRequest.cpp
@@ -0,0 +1,306 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "sgwsNodeLevelLoadControlInformationInCreateBearerRequest.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+#include "apnAndRelativeCapacityIe.h"
+
+SgwsNodeLevelLoadControlInformationInCreateBearerRequest::
+SgwsNodeLevelLoadControlInformationInCreateBearerRequest()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // loadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // loadMetric
+    mandatoryIeSet.insert(mandIe);
+    mandIe = ApnAndRelativeCapacityIeType;
+    mandIe = (mandIe << 8) | 0; // listOfApnAndRelativeCapacity
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+SgwsNodeLevelLoadControlInformationInCreateBearerRequest::
+~SgwsNodeLevelLoadControlInformationInCreateBearerRequest()
+{
+
+}
+bool SgwsNodeLevelLoadControlInformationInCreateBearerRequest::
+encodeSgwsNodeLevelLoadControlInformationInCreateBearerRequest(MsgBuffer &buffer,
+                         SgwsNodeLevelLoadControlInformationInCreateBearerRequestData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.loadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: loadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.loadMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: loadMetric\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = ApnAndRelativeCapacityIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    ApnAndRelativeCapacityIe apnAndRelativeCapacity=
+    dynamic_cast<
+    ApnAndRelativeCapacityIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnAndRelativeCapacityIeType));
+    rc = apnAndRelativeCapacity.encodeApnAndRelativeCapacityIe(buffer, data.listOfApnAndRelativeCapacity);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: listOfApnAndRelativeCapacity\n");
+        return false;
+    }
+    return rc;
+}
+
+bool SgwsNodeLevelLoadControlInformationInCreateBearerRequest::
+decodeSgwsNodeLevelLoadControlInformationInCreateBearerRequest(MsgBuffer &buffer,
+                         SgwsNodeLevelLoadControlInformationInCreateBearerRequestData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.loadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: loadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.loadMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: loadMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case ApnAndRelativeCapacityIeType:
+            {
+                ApnAndRelativeCapacityIe ieObject =
+                dynamic_cast<
+                ApnAndRelativeCapacityIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(ApnAndRelativeCapacityIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeApnAndRelativeCapacityIe(buffer, data.listOfApnAndRelativeCapacity, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: listOfApnAndRelativeCapacity\n");
+                        return false;
+                    }
+                    Uint16 mandIe = ApnAndRelativeCapacityIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void SgwsNodeLevelLoadControlInformationInCreateBearerRequest::
+displaySgwsNodeLevelLoadControlInformationInCreateBearerRequestData_v
+(SgwsNodeLevelLoadControlInformationInCreateBearerRequestData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"SgwsNodeLevelLoadControlInformationInCreateBearerRequest:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/sgwsNodeLevelLoadControlInformationInCreateBearerRequest.h b/src/gtpV2Codec/ieClasses/sgwsNodeLevelLoadControlInformationInCreateBearerRequest.h
new file mode 100644
index 0000000..a656266
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/sgwsNodeLevelLoadControlInformationInCreateBearerRequest.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef SGWSNODELEVELLOADCONTROLINFORMATIONINCREATEBEARERREQUEST_H_
+#define SGWSNODELEVELLOADCONTROLINFORMATIONINCREATEBEARERREQUEST_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class SgwsNodeLevelLoadControlInformationInCreateBearerRequest:public GtpV2GroupedIe
+{
+public:
+    SgwsNodeLevelLoadControlInformationInCreateBearerRequest();
+    virtual ~SgwsNodeLevelLoadControlInformationInCreateBearerRequest();
+    bool encodeSgwsNodeLevelLoadControlInformationInCreateBearerRequest(MsgBuffer &buffer,
+                             SgwsNodeLevelLoadControlInformationInCreateBearerRequestData
+                              const &data);
+
+    bool decodeSgwsNodeLevelLoadControlInformationInCreateBearerRequest (MsgBuffer &buffer,
+                             SgwsNodeLevelLoadControlInformationInCreateBearerRequestData 
+                             & data, Uint16 length);
+
+    void displaySgwsNodeLevelLoadControlInformationInCreateBearerRequestData_v
+    (SgwsNodeLevelLoadControlInformationInCreateBearerRequestData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/sgwsNodeLevelLoadControlInformationInCreateSessionResponse.cpp b/src/gtpV2Codec/ieClasses/sgwsNodeLevelLoadControlInformationInCreateSessionResponse.cpp
new file mode 100644
index 0000000..8a866e8
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/sgwsNodeLevelLoadControlInformationInCreateSessionResponse.cpp
@@ -0,0 +1,306 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "sgwsNodeLevelLoadControlInformationInCreateSessionResponse.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+#include "apnAndRelativeCapacityIe.h"
+
+SgwsNodeLevelLoadControlInformationInCreateSessionResponse::
+SgwsNodeLevelLoadControlInformationInCreateSessionResponse()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // loadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // loadMetric
+    mandatoryIeSet.insert(mandIe);
+    mandIe = ApnAndRelativeCapacityIeType;
+    mandIe = (mandIe << 8) | 0; // listOfApnAndRelativeCapacity
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+SgwsNodeLevelLoadControlInformationInCreateSessionResponse::
+~SgwsNodeLevelLoadControlInformationInCreateSessionResponse()
+{
+
+}
+bool SgwsNodeLevelLoadControlInformationInCreateSessionResponse::
+encodeSgwsNodeLevelLoadControlInformationInCreateSessionResponse(MsgBuffer &buffer,
+                         SgwsNodeLevelLoadControlInformationInCreateSessionResponseData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.loadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: loadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.loadMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: loadMetric\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = ApnAndRelativeCapacityIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    ApnAndRelativeCapacityIe apnAndRelativeCapacity=
+    dynamic_cast<
+    ApnAndRelativeCapacityIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnAndRelativeCapacityIeType));
+    rc = apnAndRelativeCapacity.encodeApnAndRelativeCapacityIe(buffer, data.listOfApnAndRelativeCapacity);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: listOfApnAndRelativeCapacity\n");
+        return false;
+    }
+    return rc;
+}
+
+bool SgwsNodeLevelLoadControlInformationInCreateSessionResponse::
+decodeSgwsNodeLevelLoadControlInformationInCreateSessionResponse(MsgBuffer &buffer,
+                         SgwsNodeLevelLoadControlInformationInCreateSessionResponseData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.loadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: loadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.loadMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: loadMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case ApnAndRelativeCapacityIeType:
+            {
+                ApnAndRelativeCapacityIe ieObject =
+                dynamic_cast<
+                ApnAndRelativeCapacityIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(ApnAndRelativeCapacityIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeApnAndRelativeCapacityIe(buffer, data.listOfApnAndRelativeCapacity, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: listOfApnAndRelativeCapacity\n");
+                        return false;
+                    }
+                    Uint16 mandIe = ApnAndRelativeCapacityIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void SgwsNodeLevelLoadControlInformationInCreateSessionResponse::
+displaySgwsNodeLevelLoadControlInformationInCreateSessionResponseData_v
+(SgwsNodeLevelLoadControlInformationInCreateSessionResponseData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"SgwsNodeLevelLoadControlInformationInCreateSessionResponse:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/sgwsNodeLevelLoadControlInformationInCreateSessionResponse.h b/src/gtpV2Codec/ieClasses/sgwsNodeLevelLoadControlInformationInCreateSessionResponse.h
new file mode 100644
index 0000000..da2db48
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/sgwsNodeLevelLoadControlInformationInCreateSessionResponse.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef SGWSNODELEVELLOADCONTROLINFORMATIONINCREATESESSIONRESPONSE_H_
+#define SGWSNODELEVELLOADCONTROLINFORMATIONINCREATESESSIONRESPONSE_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class SgwsNodeLevelLoadControlInformationInCreateSessionResponse:public GtpV2GroupedIe
+{
+public:
+    SgwsNodeLevelLoadControlInformationInCreateSessionResponse();
+    virtual ~SgwsNodeLevelLoadControlInformationInCreateSessionResponse();
+    bool encodeSgwsNodeLevelLoadControlInformationInCreateSessionResponse(MsgBuffer &buffer,
+                             SgwsNodeLevelLoadControlInformationInCreateSessionResponseData
+                              const &data);
+
+    bool decodeSgwsNodeLevelLoadControlInformationInCreateSessionResponse (MsgBuffer &buffer,
+                             SgwsNodeLevelLoadControlInformationInCreateSessionResponseData 
+                             & data, Uint16 length);
+
+    void displaySgwsNodeLevelLoadControlInformationInCreateSessionResponseData_v
+    (SgwsNodeLevelLoadControlInformationInCreateSessionResponseData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/sgwsNodeLevelLoadControlInformationInDeleteBearerRequest.cpp b/src/gtpV2Codec/ieClasses/sgwsNodeLevelLoadControlInformationInDeleteBearerRequest.cpp
new file mode 100644
index 0000000..810d6fa
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/sgwsNodeLevelLoadControlInformationInDeleteBearerRequest.cpp
@@ -0,0 +1,315 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "sgwsNodeLevelLoadControlInformationInDeleteBearerRequest.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+#include "apnAndRelativeCapacityIe.h"
+
+SgwsNodeLevelLoadControlInformationInDeleteBearerRequest::
+SgwsNodeLevelLoadControlInformationInDeleteBearerRequest()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // loadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // loadMetric
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+SgwsNodeLevelLoadControlInformationInDeleteBearerRequest::
+~SgwsNodeLevelLoadControlInformationInDeleteBearerRequest()
+{
+
+}
+bool SgwsNodeLevelLoadControlInformationInDeleteBearerRequest::
+encodeSgwsNodeLevelLoadControlInformationInDeleteBearerRequest(MsgBuffer &buffer,
+                         SgwsNodeLevelLoadControlInformationInDeleteBearerRequestData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.loadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: loadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.loadMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: loadMetric\n");
+        return false;
+    }
+
+    if (data.listOfApnAndRelativeCapacityIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = ApnAndRelativeCapacityIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        ApnAndRelativeCapacityIe apnAndRelativeCapacity=
+        dynamic_cast<
+        ApnAndRelativeCapacityIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnAndRelativeCapacityIeType));
+        rc = apnAndRelativeCapacity.encodeApnAndRelativeCapacityIe(buffer, data.listOfApnAndRelativeCapacity);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: listOfApnAndRelativeCapacity\n");
+          return false;
+        }
+    }
+    return rc;
+}
+
+bool SgwsNodeLevelLoadControlInformationInDeleteBearerRequest::
+decodeSgwsNodeLevelLoadControlInformationInDeleteBearerRequest(MsgBuffer &buffer,
+                         SgwsNodeLevelLoadControlInformationInDeleteBearerRequestData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.loadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: loadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.loadMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: loadMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case ApnAndRelativeCapacityIeType:
+            {
+                ApnAndRelativeCapacityIe ieObject =
+                dynamic_cast<
+                ApnAndRelativeCapacityIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(ApnAndRelativeCapacityIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeApnAndRelativeCapacityIe(buffer, data.listOfApnAndRelativeCapacity, ieHeader.length);
+
+                    data.listOfApnAndRelativeCapacityIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: listOfApnAndRelativeCapacity\n");
+                        return false;
+                    }
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void SgwsNodeLevelLoadControlInformationInDeleteBearerRequest::
+displaySgwsNodeLevelLoadControlInformationInDeleteBearerRequestData_v
+(SgwsNodeLevelLoadControlInformationInDeleteBearerRequestData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"SgwsNodeLevelLoadControlInformationInDeleteBearerRequest:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+    if (data.listOfApnAndRelativeCapacityIePresent)
+    {
+
+        stream.add((char *)"listOfApnAndRelativeCapacity:");
+        stream.endOfLine();
+        ApnAndRelativeCapacityIe apnAndRelativeCapacity=
+        dynamic_cast<
+        ApnAndRelativeCapacityIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnAndRelativeCapacityIeType));
+        apnAndRelativeCapacity.displayApnAndRelativeCapacityIe_v(data.listOfApnAndRelativeCapacity, stream);
+
+    }
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/sgwsNodeLevelLoadControlInformationInDeleteBearerRequest.h b/src/gtpV2Codec/ieClasses/sgwsNodeLevelLoadControlInformationInDeleteBearerRequest.h
new file mode 100644
index 0000000..66062e4
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/sgwsNodeLevelLoadControlInformationInDeleteBearerRequest.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef SGWSNODELEVELLOADCONTROLINFORMATIONINDELETEBEARERREQUEST_H_
+#define SGWSNODELEVELLOADCONTROLINFORMATIONINDELETEBEARERREQUEST_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class SgwsNodeLevelLoadControlInformationInDeleteBearerRequest:public GtpV2GroupedIe
+{
+public:
+    SgwsNodeLevelLoadControlInformationInDeleteBearerRequest();
+    virtual ~SgwsNodeLevelLoadControlInformationInDeleteBearerRequest();
+    bool encodeSgwsNodeLevelLoadControlInformationInDeleteBearerRequest(MsgBuffer &buffer,
+                             SgwsNodeLevelLoadControlInformationInDeleteBearerRequestData
+                              const &data);
+
+    bool decodeSgwsNodeLevelLoadControlInformationInDeleteBearerRequest (MsgBuffer &buffer,
+                             SgwsNodeLevelLoadControlInformationInDeleteBearerRequestData 
+                             & data, Uint16 length);
+
+    void displaySgwsNodeLevelLoadControlInformationInDeleteBearerRequestData_v
+    (SgwsNodeLevelLoadControlInformationInDeleteBearerRequestData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/sgwsNodeLevelLoadControlInformationInDeleteSessionResponse.cpp b/src/gtpV2Codec/ieClasses/sgwsNodeLevelLoadControlInformationInDeleteSessionResponse.cpp
new file mode 100644
index 0000000..78509a1
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/sgwsNodeLevelLoadControlInformationInDeleteSessionResponse.cpp
@@ -0,0 +1,306 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "sgwsNodeLevelLoadControlInformationInDeleteSessionResponse.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+#include "apnAndRelativeCapacityIe.h"
+
+SgwsNodeLevelLoadControlInformationInDeleteSessionResponse::
+SgwsNodeLevelLoadControlInformationInDeleteSessionResponse()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // loadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // loadMetric
+    mandatoryIeSet.insert(mandIe);
+    mandIe = ApnAndRelativeCapacityIeType;
+    mandIe = (mandIe << 8) | 0; // listOfApnAndRelativeCapacity
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+SgwsNodeLevelLoadControlInformationInDeleteSessionResponse::
+~SgwsNodeLevelLoadControlInformationInDeleteSessionResponse()
+{
+
+}
+bool SgwsNodeLevelLoadControlInformationInDeleteSessionResponse::
+encodeSgwsNodeLevelLoadControlInformationInDeleteSessionResponse(MsgBuffer &buffer,
+                         SgwsNodeLevelLoadControlInformationInDeleteSessionResponseData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.loadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: loadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.loadMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: loadMetric\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = ApnAndRelativeCapacityIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    ApnAndRelativeCapacityIe apnAndRelativeCapacity=
+    dynamic_cast<
+    ApnAndRelativeCapacityIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnAndRelativeCapacityIeType));
+    rc = apnAndRelativeCapacity.encodeApnAndRelativeCapacityIe(buffer, data.listOfApnAndRelativeCapacity);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: listOfApnAndRelativeCapacity\n");
+        return false;
+    }
+    return rc;
+}
+
+bool SgwsNodeLevelLoadControlInformationInDeleteSessionResponse::
+decodeSgwsNodeLevelLoadControlInformationInDeleteSessionResponse(MsgBuffer &buffer,
+                         SgwsNodeLevelLoadControlInformationInDeleteSessionResponseData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.loadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: loadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.loadMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: loadMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case ApnAndRelativeCapacityIeType:
+            {
+                ApnAndRelativeCapacityIe ieObject =
+                dynamic_cast<
+                ApnAndRelativeCapacityIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(ApnAndRelativeCapacityIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeApnAndRelativeCapacityIe(buffer, data.listOfApnAndRelativeCapacity, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: listOfApnAndRelativeCapacity\n");
+                        return false;
+                    }
+                    Uint16 mandIe = ApnAndRelativeCapacityIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void SgwsNodeLevelLoadControlInformationInDeleteSessionResponse::
+displaySgwsNodeLevelLoadControlInformationInDeleteSessionResponseData_v
+(SgwsNodeLevelLoadControlInformationInDeleteSessionResponseData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"SgwsNodeLevelLoadControlInformationInDeleteSessionResponse:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/sgwsNodeLevelLoadControlInformationInDeleteSessionResponse.h b/src/gtpV2Codec/ieClasses/sgwsNodeLevelLoadControlInformationInDeleteSessionResponse.h
new file mode 100644
index 0000000..3ffd626
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/sgwsNodeLevelLoadControlInformationInDeleteSessionResponse.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef SGWSNODELEVELLOADCONTROLINFORMATIONINDELETESESSIONRESPONSE_H_
+#define SGWSNODELEVELLOADCONTROLINFORMATIONINDELETESESSIONRESPONSE_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class SgwsNodeLevelLoadControlInformationInDeleteSessionResponse:public GtpV2GroupedIe
+{
+public:
+    SgwsNodeLevelLoadControlInformationInDeleteSessionResponse();
+    virtual ~SgwsNodeLevelLoadControlInformationInDeleteSessionResponse();
+    bool encodeSgwsNodeLevelLoadControlInformationInDeleteSessionResponse(MsgBuffer &buffer,
+                             SgwsNodeLevelLoadControlInformationInDeleteSessionResponseData
+                              const &data);
+
+    bool decodeSgwsNodeLevelLoadControlInformationInDeleteSessionResponse (MsgBuffer &buffer,
+                             SgwsNodeLevelLoadControlInformationInDeleteSessionResponseData 
+                             & data, Uint16 length);
+
+    void displaySgwsNodeLevelLoadControlInformationInDeleteSessionResponseData_v
+    (SgwsNodeLevelLoadControlInformationInDeleteSessionResponseData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/sgwsNodeLevelLoadControlInformationInDownlinkDataNotification.cpp b/src/gtpV2Codec/ieClasses/sgwsNodeLevelLoadControlInformationInDownlinkDataNotification.cpp
new file mode 100644
index 0000000..f44a6d6
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/sgwsNodeLevelLoadControlInformationInDownlinkDataNotification.cpp
@@ -0,0 +1,244 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "sgwsNodeLevelLoadControlInformationInDownlinkDataNotification.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+
+SgwsNodeLevelLoadControlInformationInDownlinkDataNotification::
+SgwsNodeLevelLoadControlInformationInDownlinkDataNotification()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // loadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // loadMetric
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+SgwsNodeLevelLoadControlInformationInDownlinkDataNotification::
+~SgwsNodeLevelLoadControlInformationInDownlinkDataNotification()
+{
+
+}
+bool SgwsNodeLevelLoadControlInformationInDownlinkDataNotification::
+encodeSgwsNodeLevelLoadControlInformationInDownlinkDataNotification(MsgBuffer &buffer,
+                         SgwsNodeLevelLoadControlInformationInDownlinkDataNotificationData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.loadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: loadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.loadMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: loadMetric\n");
+        return false;
+    }
+    return rc;
+}
+
+bool SgwsNodeLevelLoadControlInformationInDownlinkDataNotification::
+decodeSgwsNodeLevelLoadControlInformationInDownlinkDataNotification(MsgBuffer &buffer,
+                         SgwsNodeLevelLoadControlInformationInDownlinkDataNotificationData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.loadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: loadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.loadMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: loadMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void SgwsNodeLevelLoadControlInformationInDownlinkDataNotification::
+displaySgwsNodeLevelLoadControlInformationInDownlinkDataNotificationData_v
+(SgwsNodeLevelLoadControlInformationInDownlinkDataNotificationData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"SgwsNodeLevelLoadControlInformationInDownlinkDataNotification:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/sgwsNodeLevelLoadControlInformationInDownlinkDataNotification.h b/src/gtpV2Codec/ieClasses/sgwsNodeLevelLoadControlInformationInDownlinkDataNotification.h
new file mode 100644
index 0000000..b799de8
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/sgwsNodeLevelLoadControlInformationInDownlinkDataNotification.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef SGWSNODELEVELLOADCONTROLINFORMATIONINDOWNLINKDATANOTIFICATION_H_
+#define SGWSNODELEVELLOADCONTROLINFORMATIONINDOWNLINKDATANOTIFICATION_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class SgwsNodeLevelLoadControlInformationInDownlinkDataNotification:public GtpV2GroupedIe
+{
+public:
+    SgwsNodeLevelLoadControlInformationInDownlinkDataNotification();
+    virtual ~SgwsNodeLevelLoadControlInformationInDownlinkDataNotification();
+    bool encodeSgwsNodeLevelLoadControlInformationInDownlinkDataNotification(MsgBuffer &buffer,
+                             SgwsNodeLevelLoadControlInformationInDownlinkDataNotificationData
+                              const &data);
+
+    bool decodeSgwsNodeLevelLoadControlInformationInDownlinkDataNotification (MsgBuffer &buffer,
+                             SgwsNodeLevelLoadControlInformationInDownlinkDataNotificationData 
+                             & data, Uint16 length);
+
+    void displaySgwsNodeLevelLoadControlInformationInDownlinkDataNotificationData_v
+    (SgwsNodeLevelLoadControlInformationInDownlinkDataNotificationData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/sgwsNodeLevelLoadControlInformationInModifyBearerResponse.cpp b/src/gtpV2Codec/ieClasses/sgwsNodeLevelLoadControlInformationInModifyBearerResponse.cpp
new file mode 100644
index 0000000..b6f7b64
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/sgwsNodeLevelLoadControlInformationInModifyBearerResponse.cpp
@@ -0,0 +1,306 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "sgwsNodeLevelLoadControlInformationInModifyBearerResponse.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+#include "apnAndRelativeCapacityIe.h"
+
+SgwsNodeLevelLoadControlInformationInModifyBearerResponse::
+SgwsNodeLevelLoadControlInformationInModifyBearerResponse()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // loadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // loadMetric
+    mandatoryIeSet.insert(mandIe);
+    mandIe = ApnAndRelativeCapacityIeType;
+    mandIe = (mandIe << 8) | 0; // listOfApnAndRelativeCapacity
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+SgwsNodeLevelLoadControlInformationInModifyBearerResponse::
+~SgwsNodeLevelLoadControlInformationInModifyBearerResponse()
+{
+
+}
+bool SgwsNodeLevelLoadControlInformationInModifyBearerResponse::
+encodeSgwsNodeLevelLoadControlInformationInModifyBearerResponse(MsgBuffer &buffer,
+                         SgwsNodeLevelLoadControlInformationInModifyBearerResponseData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.loadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: loadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.loadMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: loadMetric\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = ApnAndRelativeCapacityIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    ApnAndRelativeCapacityIe apnAndRelativeCapacity=
+    dynamic_cast<
+    ApnAndRelativeCapacityIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnAndRelativeCapacityIeType));
+    rc = apnAndRelativeCapacity.encodeApnAndRelativeCapacityIe(buffer, data.listOfApnAndRelativeCapacity);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: listOfApnAndRelativeCapacity\n");
+        return false;
+    }
+    return rc;
+}
+
+bool SgwsNodeLevelLoadControlInformationInModifyBearerResponse::
+decodeSgwsNodeLevelLoadControlInformationInModifyBearerResponse(MsgBuffer &buffer,
+                         SgwsNodeLevelLoadControlInformationInModifyBearerResponseData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.loadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: loadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.loadMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: loadMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case ApnAndRelativeCapacityIeType:
+            {
+                ApnAndRelativeCapacityIe ieObject =
+                dynamic_cast<
+                ApnAndRelativeCapacityIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(ApnAndRelativeCapacityIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeApnAndRelativeCapacityIe(buffer, data.listOfApnAndRelativeCapacity, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: listOfApnAndRelativeCapacity\n");
+                        return false;
+                    }
+                    Uint16 mandIe = ApnAndRelativeCapacityIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void SgwsNodeLevelLoadControlInformationInModifyBearerResponse::
+displaySgwsNodeLevelLoadControlInformationInModifyBearerResponseData_v
+(SgwsNodeLevelLoadControlInformationInModifyBearerResponseData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"SgwsNodeLevelLoadControlInformationInModifyBearerResponse:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/sgwsNodeLevelLoadControlInformationInModifyBearerResponse.h b/src/gtpV2Codec/ieClasses/sgwsNodeLevelLoadControlInformationInModifyBearerResponse.h
new file mode 100644
index 0000000..46722a6
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/sgwsNodeLevelLoadControlInformationInModifyBearerResponse.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef SGWSNODELEVELLOADCONTROLINFORMATIONINMODIFYBEARERRESPONSE_H_
+#define SGWSNODELEVELLOADCONTROLINFORMATIONINMODIFYBEARERRESPONSE_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class SgwsNodeLevelLoadControlInformationInModifyBearerResponse:public GtpV2GroupedIe
+{
+public:
+    SgwsNodeLevelLoadControlInformationInModifyBearerResponse();
+    virtual ~SgwsNodeLevelLoadControlInformationInModifyBearerResponse();
+    bool encodeSgwsNodeLevelLoadControlInformationInModifyBearerResponse(MsgBuffer &buffer,
+                             SgwsNodeLevelLoadControlInformationInModifyBearerResponseData
+                              const &data);
+
+    bool decodeSgwsNodeLevelLoadControlInformationInModifyBearerResponse (MsgBuffer &buffer,
+                             SgwsNodeLevelLoadControlInformationInModifyBearerResponseData 
+                             & data, Uint16 length);
+
+    void displaySgwsNodeLevelLoadControlInformationInModifyBearerResponseData_v
+    (SgwsNodeLevelLoadControlInformationInModifyBearerResponseData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/sgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponse.cpp b/src/gtpV2Codec/ieClasses/sgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponse.cpp
new file mode 100644
index 0000000..6d9c55f
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/sgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponse.cpp
@@ -0,0 +1,306 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "sgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponse.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+#include "apnAndRelativeCapacityIe.h"
+
+SgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponse::
+SgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponse()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // loadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // loadMetric
+    mandatoryIeSet.insert(mandIe);
+    mandIe = ApnAndRelativeCapacityIeType;
+    mandIe = (mandIe << 8) | 0; // listOfApnAndRelativeCapacity
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+SgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponse::
+~SgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponse()
+{
+
+}
+bool SgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponse::
+encodeSgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponse(MsgBuffer &buffer,
+                         SgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponseData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.loadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: loadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.loadMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: loadMetric\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = ApnAndRelativeCapacityIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    ApnAndRelativeCapacityIe apnAndRelativeCapacity=
+    dynamic_cast<
+    ApnAndRelativeCapacityIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnAndRelativeCapacityIeType));
+    rc = apnAndRelativeCapacity.encodeApnAndRelativeCapacityIe(buffer, data.listOfApnAndRelativeCapacity);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: listOfApnAndRelativeCapacity\n");
+        return false;
+    }
+    return rc;
+}
+
+bool SgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponse::
+decodeSgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponse(MsgBuffer &buffer,
+                         SgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponseData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.loadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: loadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.loadMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: loadMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case ApnAndRelativeCapacityIeType:
+            {
+                ApnAndRelativeCapacityIe ieObject =
+                dynamic_cast<
+                ApnAndRelativeCapacityIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(ApnAndRelativeCapacityIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeApnAndRelativeCapacityIe(buffer, data.listOfApnAndRelativeCapacity, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: listOfApnAndRelativeCapacity\n");
+                        return false;
+                    }
+                    Uint16 mandIe = ApnAndRelativeCapacityIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void SgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponse::
+displaySgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponseData_v
+(SgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponseData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"SgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponse:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/sgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponse.h b/src/gtpV2Codec/ieClasses/sgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponse.h
new file mode 100644
index 0000000..6e4c39b
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/sgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponse.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef SGWSNODELEVELLOADCONTROLINFORMATIONINRELEASEACCESSBEARERSRESPONSE_H_
+#define SGWSNODELEVELLOADCONTROLINFORMATIONINRELEASEACCESSBEARERSRESPONSE_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class SgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponse:public GtpV2GroupedIe
+{
+public:
+    SgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponse();
+    virtual ~SgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponse();
+    bool encodeSgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponse(MsgBuffer &buffer,
+                             SgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponseData
+                              const &data);
+
+    bool decodeSgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponse (MsgBuffer &buffer,
+                             SgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponseData 
+                             & data, Uint16 length);
+
+    void displaySgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponseData_v
+    (SgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponseData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInCreateBearerRequest.cpp b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInCreateBearerRequest.cpp
new file mode 100644
index 0000000..41992b9
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInCreateBearerRequest.cpp
@@ -0,0 +1,377 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "sgwsOverloadControlInformationInCreateBearerRequest.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+#include "epcTimerIe.h"
+#include "apnIe.h"
+
+SgwsOverloadControlInformationInCreateBearerRequest::
+SgwsOverloadControlInformationInCreateBearerRequest()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // overloadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // overloadReductionMetric
+    mandatoryIeSet.insert(mandIe);
+    mandIe = EpcTimerIeType;
+    mandIe = (mandIe << 8) | 0; // periodOfValidity
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+SgwsOverloadControlInformationInCreateBearerRequest::
+~SgwsOverloadControlInformationInCreateBearerRequest()
+{
+
+}
+bool SgwsOverloadControlInformationInCreateBearerRequest::
+encodeSgwsOverloadControlInformationInCreateBearerRequest(MsgBuffer &buffer,
+                         SgwsOverloadControlInformationInCreateBearerRequestData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.overloadReductionMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadReductionMetric\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = EpcTimerIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    EpcTimerIe epcTimer=
+    dynamic_cast<
+    EpcTimerIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcTimerIeType));
+    rc = epcTimer.encodeEpcTimerIe(buffer, data.periodOfValidity);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: periodOfValidity\n");
+        return false;
+    }
+
+    if (data.listOfAccessPointNameIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = ApnIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        ApnIe apn=
+        dynamic_cast<
+        ApnIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnIeType));
+        rc = apn.encodeApnIe(buffer, data.listOfAccessPointName);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: listOfAccessPointName\n");
+          return false;
+        }
+    }
+    return rc;
+}
+
+bool SgwsOverloadControlInformationInCreateBearerRequest::
+decodeSgwsOverloadControlInformationInCreateBearerRequest(MsgBuffer &buffer,
+                         SgwsOverloadControlInformationInCreateBearerRequestData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.overloadReductionMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadReductionMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case EpcTimerIeType:
+            {
+                EpcTimerIe ieObject =
+                dynamic_cast<
+                EpcTimerIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(EpcTimerIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeEpcTimerIe(buffer, data.periodOfValidity, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: periodOfValidity\n");
+                        return false;
+                    }
+                    Uint16 mandIe = EpcTimerIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case ApnIeType:
+            {
+                ApnIe ieObject =
+                dynamic_cast<
+                ApnIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(ApnIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeApnIe(buffer, data.listOfAccessPointName, ieHeader.length);
+
+                    data.listOfAccessPointNameIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: listOfAccessPointName\n");
+                        return false;
+                    }
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void SgwsOverloadControlInformationInCreateBearerRequest::
+displaySgwsOverloadControlInformationInCreateBearerRequestData_v
+(SgwsOverloadControlInformationInCreateBearerRequestData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"SgwsOverloadControlInformationInCreateBearerRequest:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+
+    if (data.listOfAccessPointNameIePresent)
+    {
+
+        stream.add((char *)"listOfAccessPointName:");
+        stream.endOfLine();
+        ApnIe apn=
+        dynamic_cast<
+        ApnIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnIeType));
+        apn.displayApnIe_v(data.listOfAccessPointName, stream);
+
+    }
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInCreateBearerRequest.h b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInCreateBearerRequest.h
new file mode 100644
index 0000000..d0d8e23
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInCreateBearerRequest.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef SGWSOVERLOADCONTROLINFORMATIONINCREATEBEARERREQUEST_H_
+#define SGWSOVERLOADCONTROLINFORMATIONINCREATEBEARERREQUEST_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class SgwsOverloadControlInformationInCreateBearerRequest:public GtpV2GroupedIe
+{
+public:
+    SgwsOverloadControlInformationInCreateBearerRequest();
+    virtual ~SgwsOverloadControlInformationInCreateBearerRequest();
+    bool encodeSgwsOverloadControlInformationInCreateBearerRequest(MsgBuffer &buffer,
+                             SgwsOverloadControlInformationInCreateBearerRequestData
+                              const &data);
+
+    bool decodeSgwsOverloadControlInformationInCreateBearerRequest (MsgBuffer &buffer,
+                             SgwsOverloadControlInformationInCreateBearerRequestData 
+                             & data, Uint16 length);
+
+    void displaySgwsOverloadControlInformationInCreateBearerRequestData_v
+    (SgwsOverloadControlInformationInCreateBearerRequestData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInCreateBearerResponse.cpp b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInCreateBearerResponse.cpp
new file mode 100644
index 0000000..96769da
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInCreateBearerResponse.cpp
@@ -0,0 +1,306 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "sgwsOverloadControlInformationInCreateBearerResponse.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+#include "epcTimerIe.h"
+
+SgwsOverloadControlInformationInCreateBearerResponse::
+SgwsOverloadControlInformationInCreateBearerResponse()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // overloadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // overloadReductionMetric
+    mandatoryIeSet.insert(mandIe);
+    mandIe = EpcTimerIeType;
+    mandIe = (mandIe << 8) | 0; // periodOfValidity
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+SgwsOverloadControlInformationInCreateBearerResponse::
+~SgwsOverloadControlInformationInCreateBearerResponse()
+{
+
+}
+bool SgwsOverloadControlInformationInCreateBearerResponse::
+encodeSgwsOverloadControlInformationInCreateBearerResponse(MsgBuffer &buffer,
+                         SgwsOverloadControlInformationInCreateBearerResponseData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.overloadReductionMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadReductionMetric\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = EpcTimerIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    EpcTimerIe epcTimer=
+    dynamic_cast<
+    EpcTimerIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcTimerIeType));
+    rc = epcTimer.encodeEpcTimerIe(buffer, data.periodOfValidity);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: periodOfValidity\n");
+        return false;
+    }
+    return rc;
+}
+
+bool SgwsOverloadControlInformationInCreateBearerResponse::
+decodeSgwsOverloadControlInformationInCreateBearerResponse(MsgBuffer &buffer,
+                         SgwsOverloadControlInformationInCreateBearerResponseData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.overloadReductionMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadReductionMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case EpcTimerIeType:
+            {
+                EpcTimerIe ieObject =
+                dynamic_cast<
+                EpcTimerIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(EpcTimerIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeEpcTimerIe(buffer, data.periodOfValidity, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: periodOfValidity\n");
+                        return false;
+                    }
+                    Uint16 mandIe = EpcTimerIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void SgwsOverloadControlInformationInCreateBearerResponse::
+displaySgwsOverloadControlInformationInCreateBearerResponseData_v
+(SgwsOverloadControlInformationInCreateBearerResponseData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"SgwsOverloadControlInformationInCreateBearerResponse:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInCreateBearerResponse.h b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInCreateBearerResponse.h
new file mode 100644
index 0000000..ddb0776
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInCreateBearerResponse.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef SGWSOVERLOADCONTROLINFORMATIONINCREATEBEARERRESPONSE_H_
+#define SGWSOVERLOADCONTROLINFORMATIONINCREATEBEARERRESPONSE_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class SgwsOverloadControlInformationInCreateBearerResponse:public GtpV2GroupedIe
+{
+public:
+    SgwsOverloadControlInformationInCreateBearerResponse();
+    virtual ~SgwsOverloadControlInformationInCreateBearerResponse();
+    bool encodeSgwsOverloadControlInformationInCreateBearerResponse(MsgBuffer &buffer,
+                             SgwsOverloadControlInformationInCreateBearerResponseData
+                              const &data);
+
+    bool decodeSgwsOverloadControlInformationInCreateBearerResponse (MsgBuffer &buffer,
+                             SgwsOverloadControlInformationInCreateBearerResponseData 
+                             & data, Uint16 length);
+
+    void displaySgwsOverloadControlInformationInCreateBearerResponseData_v
+    (SgwsOverloadControlInformationInCreateBearerResponseData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInCreateSessionRequest.cpp b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInCreateSessionRequest.cpp
new file mode 100644
index 0000000..2cb52ab
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInCreateSessionRequest.cpp
@@ -0,0 +1,306 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "sgwsOverloadControlInformationInCreateSessionRequest.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+#include "epcTimerIe.h"
+
+SgwsOverloadControlInformationInCreateSessionRequest::
+SgwsOverloadControlInformationInCreateSessionRequest()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // overloadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // overloadReductionMetric
+    mandatoryIeSet.insert(mandIe);
+    mandIe = EpcTimerIeType;
+    mandIe = (mandIe << 8) | 0; // periodOfValidity
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+SgwsOverloadControlInformationInCreateSessionRequest::
+~SgwsOverloadControlInformationInCreateSessionRequest()
+{
+
+}
+bool SgwsOverloadControlInformationInCreateSessionRequest::
+encodeSgwsOverloadControlInformationInCreateSessionRequest(MsgBuffer &buffer,
+                         SgwsOverloadControlInformationInCreateSessionRequestData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.overloadReductionMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadReductionMetric\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = EpcTimerIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    EpcTimerIe epcTimer=
+    dynamic_cast<
+    EpcTimerIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcTimerIeType));
+    rc = epcTimer.encodeEpcTimerIe(buffer, data.periodOfValidity);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: periodOfValidity\n");
+        return false;
+    }
+    return rc;
+}
+
+bool SgwsOverloadControlInformationInCreateSessionRequest::
+decodeSgwsOverloadControlInformationInCreateSessionRequest(MsgBuffer &buffer,
+                         SgwsOverloadControlInformationInCreateSessionRequestData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.overloadReductionMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadReductionMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case EpcTimerIeType:
+            {
+                EpcTimerIe ieObject =
+                dynamic_cast<
+                EpcTimerIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(EpcTimerIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeEpcTimerIe(buffer, data.periodOfValidity, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: periodOfValidity\n");
+                        return false;
+                    }
+                    Uint16 mandIe = EpcTimerIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void SgwsOverloadControlInformationInCreateSessionRequest::
+displaySgwsOverloadControlInformationInCreateSessionRequestData_v
+(SgwsOverloadControlInformationInCreateSessionRequestData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"SgwsOverloadControlInformationInCreateSessionRequest:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInCreateSessionRequest.h b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInCreateSessionRequest.h
new file mode 100644
index 0000000..761fcb9
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInCreateSessionRequest.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef SGWSOVERLOADCONTROLINFORMATIONINCREATESESSIONREQUEST_H_
+#define SGWSOVERLOADCONTROLINFORMATIONINCREATESESSIONREQUEST_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class SgwsOverloadControlInformationInCreateSessionRequest:public GtpV2GroupedIe
+{
+public:
+    SgwsOverloadControlInformationInCreateSessionRequest();
+    virtual ~SgwsOverloadControlInformationInCreateSessionRequest();
+    bool encodeSgwsOverloadControlInformationInCreateSessionRequest(MsgBuffer &buffer,
+                             SgwsOverloadControlInformationInCreateSessionRequestData
+                              const &data);
+
+    bool decodeSgwsOverloadControlInformationInCreateSessionRequest (MsgBuffer &buffer,
+                             SgwsOverloadControlInformationInCreateSessionRequestData 
+                             & data, Uint16 length);
+
+    void displaySgwsOverloadControlInformationInCreateSessionRequestData_v
+    (SgwsOverloadControlInformationInCreateSessionRequestData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInCreateSessionResponse.cpp b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInCreateSessionResponse.cpp
new file mode 100644
index 0000000..83eddb8
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInCreateSessionResponse.cpp
@@ -0,0 +1,377 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "sgwsOverloadControlInformationInCreateSessionResponse.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+#include "epcTimerIe.h"
+#include "apnIe.h"
+
+SgwsOverloadControlInformationInCreateSessionResponse::
+SgwsOverloadControlInformationInCreateSessionResponse()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // overloadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // overloadReductionMetric
+    mandatoryIeSet.insert(mandIe);
+    mandIe = EpcTimerIeType;
+    mandIe = (mandIe << 8) | 0; // periodOfValidity
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+SgwsOverloadControlInformationInCreateSessionResponse::
+~SgwsOverloadControlInformationInCreateSessionResponse()
+{
+
+}
+bool SgwsOverloadControlInformationInCreateSessionResponse::
+encodeSgwsOverloadControlInformationInCreateSessionResponse(MsgBuffer &buffer,
+                         SgwsOverloadControlInformationInCreateSessionResponseData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.overloadReductionMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadReductionMetric\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = EpcTimerIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    EpcTimerIe epcTimer=
+    dynamic_cast<
+    EpcTimerIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcTimerIeType));
+    rc = epcTimer.encodeEpcTimerIe(buffer, data.periodOfValidity);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: periodOfValidity\n");
+        return false;
+    }
+
+    if (data.listOfAccessPointNameIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = ApnIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        ApnIe apn=
+        dynamic_cast<
+        ApnIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnIeType));
+        rc = apn.encodeApnIe(buffer, data.listOfAccessPointName);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: listOfAccessPointName\n");
+          return false;
+        }
+    }
+    return rc;
+}
+
+bool SgwsOverloadControlInformationInCreateSessionResponse::
+decodeSgwsOverloadControlInformationInCreateSessionResponse(MsgBuffer &buffer,
+                         SgwsOverloadControlInformationInCreateSessionResponseData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.overloadReductionMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadReductionMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case EpcTimerIeType:
+            {
+                EpcTimerIe ieObject =
+                dynamic_cast<
+                EpcTimerIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(EpcTimerIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeEpcTimerIe(buffer, data.periodOfValidity, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: periodOfValidity\n");
+                        return false;
+                    }
+                    Uint16 mandIe = EpcTimerIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case ApnIeType:
+            {
+                ApnIe ieObject =
+                dynamic_cast<
+                ApnIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(ApnIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeApnIe(buffer, data.listOfAccessPointName, ieHeader.length);
+
+                    data.listOfAccessPointNameIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: listOfAccessPointName\n");
+                        return false;
+                    }
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void SgwsOverloadControlInformationInCreateSessionResponse::
+displaySgwsOverloadControlInformationInCreateSessionResponseData_v
+(SgwsOverloadControlInformationInCreateSessionResponseData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"SgwsOverloadControlInformationInCreateSessionResponse:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+
+    if (data.listOfAccessPointNameIePresent)
+    {
+
+        stream.add((char *)"listOfAccessPointName:");
+        stream.endOfLine();
+        ApnIe apn=
+        dynamic_cast<
+        ApnIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnIeType));
+        apn.displayApnIe_v(data.listOfAccessPointName, stream);
+
+    }
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInCreateSessionResponse.h b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInCreateSessionResponse.h
new file mode 100644
index 0000000..b07b1e8
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInCreateSessionResponse.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef SGWSOVERLOADCONTROLINFORMATIONINCREATESESSIONRESPONSE_H_
+#define SGWSOVERLOADCONTROLINFORMATIONINCREATESESSIONRESPONSE_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class SgwsOverloadControlInformationInCreateSessionResponse:public GtpV2GroupedIe
+{
+public:
+    SgwsOverloadControlInformationInCreateSessionResponse();
+    virtual ~SgwsOverloadControlInformationInCreateSessionResponse();
+    bool encodeSgwsOverloadControlInformationInCreateSessionResponse(MsgBuffer &buffer,
+                             SgwsOverloadControlInformationInCreateSessionResponseData
+                              const &data);
+
+    bool decodeSgwsOverloadControlInformationInCreateSessionResponse (MsgBuffer &buffer,
+                             SgwsOverloadControlInformationInCreateSessionResponseData 
+                             & data, Uint16 length);
+
+    void displaySgwsOverloadControlInformationInCreateSessionResponseData_v
+    (SgwsOverloadControlInformationInCreateSessionResponseData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInDeleteBearerRequest.cpp b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInDeleteBearerRequest.cpp
new file mode 100644
index 0000000..841836c
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInDeleteBearerRequest.cpp
@@ -0,0 +1,377 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "sgwsOverloadControlInformationInDeleteBearerRequest.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+#include "epcTimerIe.h"
+#include "apnIe.h"
+
+SgwsOverloadControlInformationInDeleteBearerRequest::
+SgwsOverloadControlInformationInDeleteBearerRequest()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // overloadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // overloadReductionMetric
+    mandatoryIeSet.insert(mandIe);
+    mandIe = EpcTimerIeType;
+    mandIe = (mandIe << 8) | 0; // periodOfValidity
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+SgwsOverloadControlInformationInDeleteBearerRequest::
+~SgwsOverloadControlInformationInDeleteBearerRequest()
+{
+
+}
+bool SgwsOverloadControlInformationInDeleteBearerRequest::
+encodeSgwsOverloadControlInformationInDeleteBearerRequest(MsgBuffer &buffer,
+                         SgwsOverloadControlInformationInDeleteBearerRequestData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.overloadReductionMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadReductionMetric\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = EpcTimerIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    EpcTimerIe epcTimer=
+    dynamic_cast<
+    EpcTimerIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcTimerIeType));
+    rc = epcTimer.encodeEpcTimerIe(buffer, data.periodOfValidity);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: periodOfValidity\n");
+        return false;
+    }
+
+    if (data.listOfAccessPointNameIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = ApnIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        ApnIe apn=
+        dynamic_cast<
+        ApnIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnIeType));
+        rc = apn.encodeApnIe(buffer, data.listOfAccessPointName);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: listOfAccessPointName\n");
+          return false;
+        }
+    }
+    return rc;
+}
+
+bool SgwsOverloadControlInformationInDeleteBearerRequest::
+decodeSgwsOverloadControlInformationInDeleteBearerRequest(MsgBuffer &buffer,
+                         SgwsOverloadControlInformationInDeleteBearerRequestData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.overloadReductionMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadReductionMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case EpcTimerIeType:
+            {
+                EpcTimerIe ieObject =
+                dynamic_cast<
+                EpcTimerIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(EpcTimerIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeEpcTimerIe(buffer, data.periodOfValidity, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: periodOfValidity\n");
+                        return false;
+                    }
+                    Uint16 mandIe = EpcTimerIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case ApnIeType:
+            {
+                ApnIe ieObject =
+                dynamic_cast<
+                ApnIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(ApnIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeApnIe(buffer, data.listOfAccessPointName, ieHeader.length);
+
+                    data.listOfAccessPointNameIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: listOfAccessPointName\n");
+                        return false;
+                    }
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void SgwsOverloadControlInformationInDeleteBearerRequest::
+displaySgwsOverloadControlInformationInDeleteBearerRequestData_v
+(SgwsOverloadControlInformationInDeleteBearerRequestData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"SgwsOverloadControlInformationInDeleteBearerRequest:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+
+    if (data.listOfAccessPointNameIePresent)
+    {
+
+        stream.add((char *)"listOfAccessPointName:");
+        stream.endOfLine();
+        ApnIe apn=
+        dynamic_cast<
+        ApnIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnIeType));
+        apn.displayApnIe_v(data.listOfAccessPointName, stream);
+
+    }
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInDeleteBearerRequest.h b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInDeleteBearerRequest.h
new file mode 100644
index 0000000..6406829
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInDeleteBearerRequest.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef SGWSOVERLOADCONTROLINFORMATIONINDELETEBEARERREQUEST_H_
+#define SGWSOVERLOADCONTROLINFORMATIONINDELETEBEARERREQUEST_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class SgwsOverloadControlInformationInDeleteBearerRequest:public GtpV2GroupedIe
+{
+public:
+    SgwsOverloadControlInformationInDeleteBearerRequest();
+    virtual ~SgwsOverloadControlInformationInDeleteBearerRequest();
+    bool encodeSgwsOverloadControlInformationInDeleteBearerRequest(MsgBuffer &buffer,
+                             SgwsOverloadControlInformationInDeleteBearerRequestData
+                              const &data);
+
+    bool decodeSgwsOverloadControlInformationInDeleteBearerRequest (MsgBuffer &buffer,
+                             SgwsOverloadControlInformationInDeleteBearerRequestData 
+                             & data, Uint16 length);
+
+    void displaySgwsOverloadControlInformationInDeleteBearerRequestData_v
+    (SgwsOverloadControlInformationInDeleteBearerRequestData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInDeleteBearerResponse.cpp b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInDeleteBearerResponse.cpp
new file mode 100644
index 0000000..71b14d7
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInDeleteBearerResponse.cpp
@@ -0,0 +1,306 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "sgwsOverloadControlInformationInDeleteBearerResponse.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+#include "epcTimerIe.h"
+
+SgwsOverloadControlInformationInDeleteBearerResponse::
+SgwsOverloadControlInformationInDeleteBearerResponse()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // overloadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // overloadReductionMetric
+    mandatoryIeSet.insert(mandIe);
+    mandIe = EpcTimerIeType;
+    mandIe = (mandIe << 8) | 0; // periodOfValidity
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+SgwsOverloadControlInformationInDeleteBearerResponse::
+~SgwsOverloadControlInformationInDeleteBearerResponse()
+{
+
+}
+bool SgwsOverloadControlInformationInDeleteBearerResponse::
+encodeSgwsOverloadControlInformationInDeleteBearerResponse(MsgBuffer &buffer,
+                         SgwsOverloadControlInformationInDeleteBearerResponseData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.overloadReductionMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadReductionMetric\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = EpcTimerIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    EpcTimerIe epcTimer=
+    dynamic_cast<
+    EpcTimerIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcTimerIeType));
+    rc = epcTimer.encodeEpcTimerIe(buffer, data.periodOfValidity);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: periodOfValidity\n");
+        return false;
+    }
+    return rc;
+}
+
+bool SgwsOverloadControlInformationInDeleteBearerResponse::
+decodeSgwsOverloadControlInformationInDeleteBearerResponse(MsgBuffer &buffer,
+                         SgwsOverloadControlInformationInDeleteBearerResponseData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.overloadReductionMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadReductionMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case EpcTimerIeType:
+            {
+                EpcTimerIe ieObject =
+                dynamic_cast<
+                EpcTimerIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(EpcTimerIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeEpcTimerIe(buffer, data.periodOfValidity, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: periodOfValidity\n");
+                        return false;
+                    }
+                    Uint16 mandIe = EpcTimerIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void SgwsOverloadControlInformationInDeleteBearerResponse::
+displaySgwsOverloadControlInformationInDeleteBearerResponseData_v
+(SgwsOverloadControlInformationInDeleteBearerResponseData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"SgwsOverloadControlInformationInDeleteBearerResponse:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInDeleteBearerResponse.h b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInDeleteBearerResponse.h
new file mode 100644
index 0000000..7757c99
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInDeleteBearerResponse.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef SGWSOVERLOADCONTROLINFORMATIONINDELETEBEARERRESPONSE_H_
+#define SGWSOVERLOADCONTROLINFORMATIONINDELETEBEARERRESPONSE_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class SgwsOverloadControlInformationInDeleteBearerResponse:public GtpV2GroupedIe
+{
+public:
+    SgwsOverloadControlInformationInDeleteBearerResponse();
+    virtual ~SgwsOverloadControlInformationInDeleteBearerResponse();
+    bool encodeSgwsOverloadControlInformationInDeleteBearerResponse(MsgBuffer &buffer,
+                             SgwsOverloadControlInformationInDeleteBearerResponseData
+                              const &data);
+
+    bool decodeSgwsOverloadControlInformationInDeleteBearerResponse (MsgBuffer &buffer,
+                             SgwsOverloadControlInformationInDeleteBearerResponseData 
+                             & data, Uint16 length);
+
+    void displaySgwsOverloadControlInformationInDeleteBearerResponseData_v
+    (SgwsOverloadControlInformationInDeleteBearerResponseData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInDeleteSessionRequest.cpp b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInDeleteSessionRequest.cpp
new file mode 100644
index 0000000..ed95246
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInDeleteSessionRequest.cpp
@@ -0,0 +1,306 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "sgwsOverloadControlInformationInDeleteSessionRequest.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+#include "epcTimerIe.h"
+
+SgwsOverloadControlInformationInDeleteSessionRequest::
+SgwsOverloadControlInformationInDeleteSessionRequest()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // overloadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // overloadReductionMetric
+    mandatoryIeSet.insert(mandIe);
+    mandIe = EpcTimerIeType;
+    mandIe = (mandIe << 8) | 0; // periodOfValidity
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+SgwsOverloadControlInformationInDeleteSessionRequest::
+~SgwsOverloadControlInformationInDeleteSessionRequest()
+{
+
+}
+bool SgwsOverloadControlInformationInDeleteSessionRequest::
+encodeSgwsOverloadControlInformationInDeleteSessionRequest(MsgBuffer &buffer,
+                         SgwsOverloadControlInformationInDeleteSessionRequestData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.overloadReductionMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadReductionMetric\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = EpcTimerIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    EpcTimerIe epcTimer=
+    dynamic_cast<
+    EpcTimerIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcTimerIeType));
+    rc = epcTimer.encodeEpcTimerIe(buffer, data.periodOfValidity);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: periodOfValidity\n");
+        return false;
+    }
+    return rc;
+}
+
+bool SgwsOverloadControlInformationInDeleteSessionRequest::
+decodeSgwsOverloadControlInformationInDeleteSessionRequest(MsgBuffer &buffer,
+                         SgwsOverloadControlInformationInDeleteSessionRequestData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.overloadReductionMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadReductionMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case EpcTimerIeType:
+            {
+                EpcTimerIe ieObject =
+                dynamic_cast<
+                EpcTimerIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(EpcTimerIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeEpcTimerIe(buffer, data.periodOfValidity, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: periodOfValidity\n");
+                        return false;
+                    }
+                    Uint16 mandIe = EpcTimerIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void SgwsOverloadControlInformationInDeleteSessionRequest::
+displaySgwsOverloadControlInformationInDeleteSessionRequestData_v
+(SgwsOverloadControlInformationInDeleteSessionRequestData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"SgwsOverloadControlInformationInDeleteSessionRequest:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInDeleteSessionRequest.h b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInDeleteSessionRequest.h
new file mode 100644
index 0000000..584e2b7
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInDeleteSessionRequest.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef SGWSOVERLOADCONTROLINFORMATIONINDELETESESSIONREQUEST_H_
+#define SGWSOVERLOADCONTROLINFORMATIONINDELETESESSIONREQUEST_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class SgwsOverloadControlInformationInDeleteSessionRequest:public GtpV2GroupedIe
+{
+public:
+    SgwsOverloadControlInformationInDeleteSessionRequest();
+    virtual ~SgwsOverloadControlInformationInDeleteSessionRequest();
+    bool encodeSgwsOverloadControlInformationInDeleteSessionRequest(MsgBuffer &buffer,
+                             SgwsOverloadControlInformationInDeleteSessionRequestData
+                              const &data);
+
+    bool decodeSgwsOverloadControlInformationInDeleteSessionRequest (MsgBuffer &buffer,
+                             SgwsOverloadControlInformationInDeleteSessionRequestData 
+                             & data, Uint16 length);
+
+    void displaySgwsOverloadControlInformationInDeleteSessionRequestData_v
+    (SgwsOverloadControlInformationInDeleteSessionRequestData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInDeleteSessionResponse.cpp b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInDeleteSessionResponse.cpp
new file mode 100644
index 0000000..45b2a1d
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInDeleteSessionResponse.cpp
@@ -0,0 +1,377 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "sgwsOverloadControlInformationInDeleteSessionResponse.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+#include "epcTimerIe.h"
+#include "apnIe.h"
+
+SgwsOverloadControlInformationInDeleteSessionResponse::
+SgwsOverloadControlInformationInDeleteSessionResponse()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // overloadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // overloadReductionMetric
+    mandatoryIeSet.insert(mandIe);
+    mandIe = EpcTimerIeType;
+    mandIe = (mandIe << 8) | 0; // periodOfValidity
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+SgwsOverloadControlInformationInDeleteSessionResponse::
+~SgwsOverloadControlInformationInDeleteSessionResponse()
+{
+
+}
+bool SgwsOverloadControlInformationInDeleteSessionResponse::
+encodeSgwsOverloadControlInformationInDeleteSessionResponse(MsgBuffer &buffer,
+                         SgwsOverloadControlInformationInDeleteSessionResponseData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.overloadReductionMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadReductionMetric\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = EpcTimerIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    EpcTimerIe epcTimer=
+    dynamic_cast<
+    EpcTimerIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcTimerIeType));
+    rc = epcTimer.encodeEpcTimerIe(buffer, data.periodOfValidity);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: periodOfValidity\n");
+        return false;
+    }
+
+    if (data.listOfAccessPointNameIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = ApnIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        ApnIe apn=
+        dynamic_cast<
+        ApnIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnIeType));
+        rc = apn.encodeApnIe(buffer, data.listOfAccessPointName);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: listOfAccessPointName\n");
+          return false;
+        }
+    }
+    return rc;
+}
+
+bool SgwsOverloadControlInformationInDeleteSessionResponse::
+decodeSgwsOverloadControlInformationInDeleteSessionResponse(MsgBuffer &buffer,
+                         SgwsOverloadControlInformationInDeleteSessionResponseData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.overloadReductionMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadReductionMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case EpcTimerIeType:
+            {
+                EpcTimerIe ieObject =
+                dynamic_cast<
+                EpcTimerIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(EpcTimerIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeEpcTimerIe(buffer, data.periodOfValidity, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: periodOfValidity\n");
+                        return false;
+                    }
+                    Uint16 mandIe = EpcTimerIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case ApnIeType:
+            {
+                ApnIe ieObject =
+                dynamic_cast<
+                ApnIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(ApnIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeApnIe(buffer, data.listOfAccessPointName, ieHeader.length);
+
+                    data.listOfAccessPointNameIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: listOfAccessPointName\n");
+                        return false;
+                    }
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void SgwsOverloadControlInformationInDeleteSessionResponse::
+displaySgwsOverloadControlInformationInDeleteSessionResponseData_v
+(SgwsOverloadControlInformationInDeleteSessionResponseData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"SgwsOverloadControlInformationInDeleteSessionResponse:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+
+    if (data.listOfAccessPointNameIePresent)
+    {
+
+        stream.add((char *)"listOfAccessPointName:");
+        stream.endOfLine();
+        ApnIe apn=
+        dynamic_cast<
+        ApnIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnIeType));
+        apn.displayApnIe_v(data.listOfAccessPointName, stream);
+
+    }
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInDeleteSessionResponse.h b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInDeleteSessionResponse.h
new file mode 100644
index 0000000..6bf31ff
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInDeleteSessionResponse.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef SGWSOVERLOADCONTROLINFORMATIONINDELETESESSIONRESPONSE_H_
+#define SGWSOVERLOADCONTROLINFORMATIONINDELETESESSIONRESPONSE_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class SgwsOverloadControlInformationInDeleteSessionResponse:public GtpV2GroupedIe
+{
+public:
+    SgwsOverloadControlInformationInDeleteSessionResponse();
+    virtual ~SgwsOverloadControlInformationInDeleteSessionResponse();
+    bool encodeSgwsOverloadControlInformationInDeleteSessionResponse(MsgBuffer &buffer,
+                             SgwsOverloadControlInformationInDeleteSessionResponseData
+                              const &data);
+
+    bool decodeSgwsOverloadControlInformationInDeleteSessionResponse (MsgBuffer &buffer,
+                             SgwsOverloadControlInformationInDeleteSessionResponseData 
+                             & data, Uint16 length);
+
+    void displaySgwsOverloadControlInformationInDeleteSessionResponseData_v
+    (SgwsOverloadControlInformationInDeleteSessionResponseData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInDownlinkDataNotification.cpp b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInDownlinkDataNotification.cpp
new file mode 100644
index 0000000..60ecb81
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInDownlinkDataNotification.cpp
@@ -0,0 +1,306 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "sgwsOverloadControlInformationInDownlinkDataNotification.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+#include "epcTimerIe.h"
+
+SgwsOverloadControlInformationInDownlinkDataNotification::
+SgwsOverloadControlInformationInDownlinkDataNotification()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // overloadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // overloadReductionMetric
+    mandatoryIeSet.insert(mandIe);
+    mandIe = EpcTimerIeType;
+    mandIe = (mandIe << 8) | 0; // periodOfValidity
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+SgwsOverloadControlInformationInDownlinkDataNotification::
+~SgwsOverloadControlInformationInDownlinkDataNotification()
+{
+
+}
+bool SgwsOverloadControlInformationInDownlinkDataNotification::
+encodeSgwsOverloadControlInformationInDownlinkDataNotification(MsgBuffer &buffer,
+                         SgwsOverloadControlInformationInDownlinkDataNotificationData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.overloadReductionMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadReductionMetric\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = EpcTimerIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    EpcTimerIe epcTimer=
+    dynamic_cast<
+    EpcTimerIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcTimerIeType));
+    rc = epcTimer.encodeEpcTimerIe(buffer, data.periodOfValidity);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: periodOfValidity\n");
+        return false;
+    }
+    return rc;
+}
+
+bool SgwsOverloadControlInformationInDownlinkDataNotification::
+decodeSgwsOverloadControlInformationInDownlinkDataNotification(MsgBuffer &buffer,
+                         SgwsOverloadControlInformationInDownlinkDataNotificationData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.overloadReductionMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadReductionMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case EpcTimerIeType:
+            {
+                EpcTimerIe ieObject =
+                dynamic_cast<
+                EpcTimerIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(EpcTimerIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeEpcTimerIe(buffer, data.periodOfValidity, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: periodOfValidity\n");
+                        return false;
+                    }
+                    Uint16 mandIe = EpcTimerIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void SgwsOverloadControlInformationInDownlinkDataNotification::
+displaySgwsOverloadControlInformationInDownlinkDataNotificationData_v
+(SgwsOverloadControlInformationInDownlinkDataNotificationData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"SgwsOverloadControlInformationInDownlinkDataNotification:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInDownlinkDataNotification.h b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInDownlinkDataNotification.h
new file mode 100644
index 0000000..75f1733
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInDownlinkDataNotification.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef SGWSOVERLOADCONTROLINFORMATIONINDOWNLINKDATANOTIFICATION_H_
+#define SGWSOVERLOADCONTROLINFORMATIONINDOWNLINKDATANOTIFICATION_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class SgwsOverloadControlInformationInDownlinkDataNotification:public GtpV2GroupedIe
+{
+public:
+    SgwsOverloadControlInformationInDownlinkDataNotification();
+    virtual ~SgwsOverloadControlInformationInDownlinkDataNotification();
+    bool encodeSgwsOverloadControlInformationInDownlinkDataNotification(MsgBuffer &buffer,
+                             SgwsOverloadControlInformationInDownlinkDataNotificationData
+                              const &data);
+
+    bool decodeSgwsOverloadControlInformationInDownlinkDataNotification (MsgBuffer &buffer,
+                             SgwsOverloadControlInformationInDownlinkDataNotificationData 
+                             & data, Uint16 length);
+
+    void displaySgwsOverloadControlInformationInDownlinkDataNotificationData_v
+    (SgwsOverloadControlInformationInDownlinkDataNotificationData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInModifyBearerRequest.cpp b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInModifyBearerRequest.cpp
new file mode 100644
index 0000000..69e84fd
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInModifyBearerRequest.cpp
@@ -0,0 +1,306 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "sgwsOverloadControlInformationInModifyBearerRequest.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+#include "epcTimerIe.h"
+
+SgwsOverloadControlInformationInModifyBearerRequest::
+SgwsOverloadControlInformationInModifyBearerRequest()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // overloadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // overloadReductionMetric
+    mandatoryIeSet.insert(mandIe);
+    mandIe = EpcTimerIeType;
+    mandIe = (mandIe << 8) | 0; // periodOfValidity
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+SgwsOverloadControlInformationInModifyBearerRequest::
+~SgwsOverloadControlInformationInModifyBearerRequest()
+{
+
+}
+bool SgwsOverloadControlInformationInModifyBearerRequest::
+encodeSgwsOverloadControlInformationInModifyBearerRequest(MsgBuffer &buffer,
+                         SgwsOverloadControlInformationInModifyBearerRequestData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.overloadReductionMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadReductionMetric\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = EpcTimerIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    EpcTimerIe epcTimer=
+    dynamic_cast<
+    EpcTimerIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcTimerIeType));
+    rc = epcTimer.encodeEpcTimerIe(buffer, data.periodOfValidity);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: periodOfValidity\n");
+        return false;
+    }
+    return rc;
+}
+
+bool SgwsOverloadControlInformationInModifyBearerRequest::
+decodeSgwsOverloadControlInformationInModifyBearerRequest(MsgBuffer &buffer,
+                         SgwsOverloadControlInformationInModifyBearerRequestData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.overloadReductionMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadReductionMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case EpcTimerIeType:
+            {
+                EpcTimerIe ieObject =
+                dynamic_cast<
+                EpcTimerIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(EpcTimerIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeEpcTimerIe(buffer, data.periodOfValidity, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: periodOfValidity\n");
+                        return false;
+                    }
+                    Uint16 mandIe = EpcTimerIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void SgwsOverloadControlInformationInModifyBearerRequest::
+displaySgwsOverloadControlInformationInModifyBearerRequestData_v
+(SgwsOverloadControlInformationInModifyBearerRequestData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"SgwsOverloadControlInformationInModifyBearerRequest:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInModifyBearerRequest.h b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInModifyBearerRequest.h
new file mode 100644
index 0000000..442e2ec
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInModifyBearerRequest.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef SGWSOVERLOADCONTROLINFORMATIONINMODIFYBEARERREQUEST_H_
+#define SGWSOVERLOADCONTROLINFORMATIONINMODIFYBEARERREQUEST_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class SgwsOverloadControlInformationInModifyBearerRequest:public GtpV2GroupedIe
+{
+public:
+    SgwsOverloadControlInformationInModifyBearerRequest();
+    virtual ~SgwsOverloadControlInformationInModifyBearerRequest();
+    bool encodeSgwsOverloadControlInformationInModifyBearerRequest(MsgBuffer &buffer,
+                             SgwsOverloadControlInformationInModifyBearerRequestData
+                              const &data);
+
+    bool decodeSgwsOverloadControlInformationInModifyBearerRequest (MsgBuffer &buffer,
+                             SgwsOverloadControlInformationInModifyBearerRequestData 
+                             & data, Uint16 length);
+
+    void displaySgwsOverloadControlInformationInModifyBearerRequestData_v
+    (SgwsOverloadControlInformationInModifyBearerRequestData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInModifyBearerResponse.cpp b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInModifyBearerResponse.cpp
new file mode 100644
index 0000000..8ce199c
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInModifyBearerResponse.cpp
@@ -0,0 +1,377 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "sgwsOverloadControlInformationInModifyBearerResponse.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+#include "epcTimerIe.h"
+#include "apnIe.h"
+
+SgwsOverloadControlInformationInModifyBearerResponse::
+SgwsOverloadControlInformationInModifyBearerResponse()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // overloadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // overloadReductionMetric
+    mandatoryIeSet.insert(mandIe);
+    mandIe = EpcTimerIeType;
+    mandIe = (mandIe << 8) | 0; // periodOfValidity
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+SgwsOverloadControlInformationInModifyBearerResponse::
+~SgwsOverloadControlInformationInModifyBearerResponse()
+{
+
+}
+bool SgwsOverloadControlInformationInModifyBearerResponse::
+encodeSgwsOverloadControlInformationInModifyBearerResponse(MsgBuffer &buffer,
+                         SgwsOverloadControlInformationInModifyBearerResponseData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.overloadReductionMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadReductionMetric\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = EpcTimerIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    EpcTimerIe epcTimer=
+    dynamic_cast<
+    EpcTimerIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcTimerIeType));
+    rc = epcTimer.encodeEpcTimerIe(buffer, data.periodOfValidity);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: periodOfValidity\n");
+        return false;
+    }
+
+    if (data.listOfAccessPointNameIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = ApnIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        ApnIe apn=
+        dynamic_cast<
+        ApnIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnIeType));
+        rc = apn.encodeApnIe(buffer, data.listOfAccessPointName);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: listOfAccessPointName\n");
+          return false;
+        }
+    }
+    return rc;
+}
+
+bool SgwsOverloadControlInformationInModifyBearerResponse::
+decodeSgwsOverloadControlInformationInModifyBearerResponse(MsgBuffer &buffer,
+                         SgwsOverloadControlInformationInModifyBearerResponseData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.overloadReductionMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadReductionMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case EpcTimerIeType:
+            {
+                EpcTimerIe ieObject =
+                dynamic_cast<
+                EpcTimerIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(EpcTimerIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeEpcTimerIe(buffer, data.periodOfValidity, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: periodOfValidity\n");
+                        return false;
+                    }
+                    Uint16 mandIe = EpcTimerIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case ApnIeType:
+            {
+                ApnIe ieObject =
+                dynamic_cast<
+                ApnIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(ApnIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeApnIe(buffer, data.listOfAccessPointName, ieHeader.length);
+
+                    data.listOfAccessPointNameIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: listOfAccessPointName\n");
+                        return false;
+                    }
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void SgwsOverloadControlInformationInModifyBearerResponse::
+displaySgwsOverloadControlInformationInModifyBearerResponseData_v
+(SgwsOverloadControlInformationInModifyBearerResponseData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"SgwsOverloadControlInformationInModifyBearerResponse:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+
+    if (data.listOfAccessPointNameIePresent)
+    {
+
+        stream.add((char *)"listOfAccessPointName:");
+        stream.endOfLine();
+        ApnIe apn=
+        dynamic_cast<
+        ApnIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnIeType));
+        apn.displayApnIe_v(data.listOfAccessPointName, stream);
+
+    }
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInModifyBearerResponse.h b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInModifyBearerResponse.h
new file mode 100644
index 0000000..00ea5e5
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInModifyBearerResponse.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef SGWSOVERLOADCONTROLINFORMATIONINMODIFYBEARERRESPONSE_H_
+#define SGWSOVERLOADCONTROLINFORMATIONINMODIFYBEARERRESPONSE_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class SgwsOverloadControlInformationInModifyBearerResponse:public GtpV2GroupedIe
+{
+public:
+    SgwsOverloadControlInformationInModifyBearerResponse();
+    virtual ~SgwsOverloadControlInformationInModifyBearerResponse();
+    bool encodeSgwsOverloadControlInformationInModifyBearerResponse(MsgBuffer &buffer,
+                             SgwsOverloadControlInformationInModifyBearerResponseData
+                              const &data);
+
+    bool decodeSgwsOverloadControlInformationInModifyBearerResponse (MsgBuffer &buffer,
+                             SgwsOverloadControlInformationInModifyBearerResponseData 
+                             & data, Uint16 length);
+
+    void displaySgwsOverloadControlInformationInModifyBearerResponseData_v
+    (SgwsOverloadControlInformationInModifyBearerResponseData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInReleaseAccessBearersResponse.cpp b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInReleaseAccessBearersResponse.cpp
new file mode 100644
index 0000000..cd3e456
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInReleaseAccessBearersResponse.cpp
@@ -0,0 +1,377 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "sgwsOverloadControlInformationInReleaseAccessBearersResponse.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+#include "epcTimerIe.h"
+#include "apnIe.h"
+
+SgwsOverloadControlInformationInReleaseAccessBearersResponse::
+SgwsOverloadControlInformationInReleaseAccessBearersResponse()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // overloadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // overloadReductionMetric
+    mandatoryIeSet.insert(mandIe);
+    mandIe = EpcTimerIeType;
+    mandIe = (mandIe << 8) | 0; // periodOfValidity
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+SgwsOverloadControlInformationInReleaseAccessBearersResponse::
+~SgwsOverloadControlInformationInReleaseAccessBearersResponse()
+{
+
+}
+bool SgwsOverloadControlInformationInReleaseAccessBearersResponse::
+encodeSgwsOverloadControlInformationInReleaseAccessBearersResponse(MsgBuffer &buffer,
+                         SgwsOverloadControlInformationInReleaseAccessBearersResponseData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.overloadReductionMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadReductionMetric\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = EpcTimerIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    EpcTimerIe epcTimer=
+    dynamic_cast<
+    EpcTimerIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcTimerIeType));
+    rc = epcTimer.encodeEpcTimerIe(buffer, data.periodOfValidity);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: periodOfValidity\n");
+        return false;
+    }
+
+    if (data.listOfAccessPointNameIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = ApnIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        ApnIe apn=
+        dynamic_cast<
+        ApnIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnIeType));
+        rc = apn.encodeApnIe(buffer, data.listOfAccessPointName);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: listOfAccessPointName\n");
+          return false;
+        }
+    }
+    return rc;
+}
+
+bool SgwsOverloadControlInformationInReleaseAccessBearersResponse::
+decodeSgwsOverloadControlInformationInReleaseAccessBearersResponse(MsgBuffer &buffer,
+                         SgwsOverloadControlInformationInReleaseAccessBearersResponseData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.overloadReductionMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadReductionMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case EpcTimerIeType:
+            {
+                EpcTimerIe ieObject =
+                dynamic_cast<
+                EpcTimerIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(EpcTimerIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeEpcTimerIe(buffer, data.periodOfValidity, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: periodOfValidity\n");
+                        return false;
+                    }
+                    Uint16 mandIe = EpcTimerIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case ApnIeType:
+            {
+                ApnIe ieObject =
+                dynamic_cast<
+                ApnIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(ApnIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeApnIe(buffer, data.listOfAccessPointName, ieHeader.length);
+
+                    data.listOfAccessPointNameIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: listOfAccessPointName\n");
+                        return false;
+                    }
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void SgwsOverloadControlInformationInReleaseAccessBearersResponse::
+displaySgwsOverloadControlInformationInReleaseAccessBearersResponseData_v
+(SgwsOverloadControlInformationInReleaseAccessBearersResponseData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"SgwsOverloadControlInformationInReleaseAccessBearersResponse:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+
+    if (data.listOfAccessPointNameIePresent)
+    {
+
+        stream.add((char *)"listOfAccessPointName:");
+        stream.endOfLine();
+        ApnIe apn=
+        dynamic_cast<
+        ApnIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnIeType));
+        apn.displayApnIe_v(data.listOfAccessPointName, stream);
+
+    }
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInReleaseAccessBearersResponse.h b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInReleaseAccessBearersResponse.h
new file mode 100644
index 0000000..0ed562e
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/sgwsOverloadControlInformationInReleaseAccessBearersResponse.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef SGWSOVERLOADCONTROLINFORMATIONINRELEASEACCESSBEARERSRESPONSE_H_
+#define SGWSOVERLOADCONTROLINFORMATIONINRELEASEACCESSBEARERSRESPONSE_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class SgwsOverloadControlInformationInReleaseAccessBearersResponse:public GtpV2GroupedIe
+{
+public:
+    SgwsOverloadControlInformationInReleaseAccessBearersResponse();
+    virtual ~SgwsOverloadControlInformationInReleaseAccessBearersResponse();
+    bool encodeSgwsOverloadControlInformationInReleaseAccessBearersResponse(MsgBuffer &buffer,
+                             SgwsOverloadControlInformationInReleaseAccessBearersResponseData
+                              const &data);
+
+    bool decodeSgwsOverloadControlInformationInReleaseAccessBearersResponse (MsgBuffer &buffer,
+                             SgwsOverloadControlInformationInReleaseAccessBearersResponseData 
+                             & data, Uint16 length);
+
+    void displaySgwsOverloadControlInformationInReleaseAccessBearersResponseData_v
+    (SgwsOverloadControlInformationInReleaseAccessBearersResponseData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/signallingPriorityIndicationIe.cpp b/src/gtpV2Codec/ieClasses/signallingPriorityIndicationIe.cpp
new file mode 100644
index 0000000..a6a1ef7
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/signallingPriorityIndicationIe.cpp
@@ -0,0 +1,70 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "signallingPriorityIndicationIe.h"
+#include "dataTypeCodecUtils.h"
+
+SignallingPriorityIndicationIe::SignallingPriorityIndicationIe() 
+{
+    ieType = 157;
+    // TODO
+
+}
+
+SignallingPriorityIndicationIe::~SignallingPriorityIndicationIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool SignallingPriorityIndicationIe::encodeSignallingPriorityIndicationIe(MsgBuffer &buffer, SignallingPriorityIndicationIeData const &data)
+{
+    buffer.skipBytes(2);
+
+
+    return true;
+}
+
+bool SignallingPriorityIndicationIe::decodeSignallingPriorityIndicationIe(MsgBuffer &buffer, SignallingPriorityIndicationIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+    buffer.skipBytes(2);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: \n");
+        return false;
+    }
+
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE SignallingPriorityIndicationIe\n");
+        return false;
+    }
+}
+void SignallingPriorityIndicationIe::displaySignallingPriorityIndicationIe_v(SignallingPriorityIndicationIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"SignallingPriorityIndicationIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/signallingPriorityIndicationIe.h b/src/gtpV2Codec/ieClasses/signallingPriorityIndicationIe.h
new file mode 100644
index 0000000..510424d
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/signallingPriorityIndicationIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef SIGNALLINGPRIORITYINDICATIONIE_H_
+#define SIGNALLINGPRIORITYINDICATIONIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class SignallingPriorityIndicationIe: public GtpV2Ie {
+public:
+    SignallingPriorityIndicationIe();
+    virtual ~SignallingPriorityIndicationIe();
+
+    bool encodeSignallingPriorityIndicationIe(MsgBuffer &buffer,
+                 SignallingPriorityIndicationIeData const &data);
+    bool decodeSignallingPriorityIndicationIe(MsgBuffer &buffer,
+                 SignallingPriorityIndicationIeData &data, Uint16 length);
+    void displaySignallingPriorityIndicationIe_v(SignallingPriorityIndicationIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* SIGNALLINGPRIORITYINDICATIONIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/throttlingIe.cpp b/src/gtpV2Codec/ieClasses/throttlingIe.cpp
new file mode 100644
index 0000000..b8d93de
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/throttlingIe.cpp
@@ -0,0 +1,119 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "throttlingIe.h"
+#include "dataTypeCodecUtils.h"
+
+ThrottlingIe::ThrottlingIe() 
+{
+    ieType = 154;
+    // TODO
+
+}
+
+ThrottlingIe::~ThrottlingIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool ThrottlingIe::encodeThrottlingIe(MsgBuffer &buffer, ThrottlingIeData const &data)
+{
+    if(!(buffer.writeBits(data.throttlingDelayUnit, 3)))
+    {
+        errorStream.add((char *)"Encoding of throttlingDelayUnit failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.throttlingDelayValue, 5)))
+    {
+        errorStream.add((char *)"Encoding of throttlingDelayValue failed\n");
+        return false;
+    }
+    if (!(data.throttlingFactor>= 0 && data.throttlingFactor<= 100))
+    {
+        errorStream.add((char *)"Data validation failure: throttlingFactor\n");
+        return false; 
+    }
+    if (!(buffer.writeUint8(data.throttlingFactor)))
+    {
+        errorStream.add((char *)"Encoding of throttlingFactor failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool ThrottlingIe::decodeThrottlingIe(MsgBuffer &buffer, ThrottlingIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+    data.throttlingDelayUnit = buffer.readBits(3);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: throttlingDelayUnit\n");
+        return false;
+    }
+    data.throttlingDelayValue = buffer.readBits(5);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: throttlingDelayValue\n");
+        return false;
+    }
+
+    buffer.readUint8(data.throttlingFactor);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: throttlingFactor\n");
+        return false;
+    }
+    if (!(data.throttlingFactor>= 0 && data.throttlingFactor<= 100))
+    {
+        errorStream.add((char *)"Data validation failure : throttlingFactor\n");
+        return false; //TODO need to add validations
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE ThrottlingIe\n");
+        return false;
+    }
+}
+void ThrottlingIe::displayThrottlingIe_v(ThrottlingIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"ThrottlingIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add( (char *)"throttlingDelayUnit: "); 
+    stream.add((Uint8)data.throttlingDelayUnit);
+    stream.endOfLine();
+  
+    stream.add( (char *)"throttlingDelayValue: "); 
+    stream.add((Uint8)data.throttlingDelayValue);
+    stream.endOfLine();
+  
+    stream.add((char *)"throttlingFactor: ");
+    stream.add(data.throttlingFactor);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/throttlingIe.h b/src/gtpV2Codec/ieClasses/throttlingIe.h
new file mode 100644
index 0000000..927c314
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/throttlingIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef THROTTLINGIE_H_
+#define THROTTLINGIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class ThrottlingIe: public GtpV2Ie {
+public:
+    ThrottlingIe();
+    virtual ~ThrottlingIe();
+
+    bool encodeThrottlingIe(MsgBuffer &buffer,
+                 ThrottlingIeData const &data);
+    bool decodeThrottlingIe(MsgBuffer &buffer,
+                 ThrottlingIeData &data, Uint16 length);
+    void displayThrottlingIe_v(ThrottlingIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* THROTTLINGIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/traceInformationIe.cpp b/src/gtpV2Codec/ieClasses/traceInformationIe.cpp
new file mode 100644
index 0000000..274ca6d
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/traceInformationIe.cpp
@@ -0,0 +1,251 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "traceInformationIe.h"
+#include "dataTypeCodecUtils.h"
+
+TraceInformationIe::TraceInformationIe() 
+{
+    ieType = 96;
+    // TODO
+
+}
+
+TraceInformationIe::~TraceInformationIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool TraceInformationIe::encodeTraceInformationIe(MsgBuffer &buffer, TraceInformationIeData const &data)
+{
+    if(!(buffer.writeBits(data.mccDigit2, 4)))
+    {
+        errorStream.add((char *)"Encoding of mccDigit2 failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.mccDigit1, 4)))
+    {
+        errorStream.add((char *)"Encoding of mccDigit1 failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.mncDigit3, 4)))
+    {
+        errorStream.add((char *)"Encoding of mncDigit3 failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.mccDigit3, 4)))
+    {
+        errorStream.add((char *)"Encoding of mccDigit3 failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.mncDigit2, 4)))
+    {
+        errorStream.add((char *)"Encoding of mncDigit2 failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.mncDigit1, 4)))
+    {
+        errorStream.add((char *)"Encoding of mncDigit1 failed\n");
+        return false;
+    }
+    if (!(DataTypeCodecUtils::encodeUint8Array4(buffer, data.traceId)))
+    {
+    errorStream.add((char *)"Encoding of traceId failed\n");
+    return false;
+    }
+    if (!(DataTypeCodecUtils::encodeUint8Array16(buffer, data.triggeringEvents)))
+    {
+    errorStream.add((char *)"Encoding of triggeringEvents failed\n");
+    return false;
+    }
+    if (!(buffer.writeUint16(data.listOfNeTypes)))
+    {
+        errorStream.add((char *)"Encoding of listOfNeTypes failed\n");
+        return false;
+    }
+    if (!(buffer.writeUint8(data.sessionTraceDepth)))
+    {
+        errorStream.add((char *)"Encoding of sessionTraceDepth failed\n");
+        return false;
+    }
+    if (!(DataTypeCodecUtils::encodeUint8Array16(buffer, data.listOfInterfaces)))
+    {
+    errorStream.add((char *)"Encoding of listOfInterfaces failed\n");
+    return false;
+    }
+    if (!(DataTypeCodecUtils::encodeIpAddressV4(buffer, data.ipAddressOfTce)))
+    {
+    errorStream.add((char *)"Encoding of ipAddressOfTce failed\n");
+    return false;
+    }
+
+    return true;
+}
+
+bool TraceInformationIe::decodeTraceInformationIe(MsgBuffer &buffer, TraceInformationIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+    data.mccDigit2 = buffer.readBits(4);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: mccDigit2\n");
+        return false;
+    }
+    data.mccDigit1 = buffer.readBits(4);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: mccDigit1\n");
+        return false;
+    }
+    data.mncDigit3 = buffer.readBits(4);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: mncDigit3\n");
+        return false;
+    }
+    data.mccDigit3 = buffer.readBits(4);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: mccDigit3\n");
+        return false;
+    }
+    data.mncDigit2 = buffer.readBits(4);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: mncDigit2\n");
+        return false;
+    }
+    data.mncDigit1 = buffer.readBits(4);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: mncDigit1\n");
+        return false;
+    }
+
+    Uint16 lengthLeft = length;
+    lengthLeft = ieBoundary - buffer.getCurrentIndex();
+    if (!(DataTypeCodecUtils::decodeUint8Array4(buffer, data.traceId, lengthLeft, 3)))
+    {
+        errorStream.add((char *)"Failed to decode: traceId\n");
+        return false;
+    }
+    lengthLeft = ieBoundary - buffer.getCurrentIndex();
+    if (!(DataTypeCodecUtils::decodeUint8Array16(buffer, data.triggeringEvents, lengthLeft, 0)))
+    {
+        errorStream.add((char *)"Failed to decode: triggeringEvents\n");
+        return false;
+    }
+
+    buffer.readUint16(data.listOfNeTypes);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: listOfNeTypes\n");
+        return false;
+    }
+
+    buffer.readUint8(data.sessionTraceDepth);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: sessionTraceDepth\n");
+        return false;
+    }
+    lengthLeft = ieBoundary - buffer.getCurrentIndex();
+    if (!(DataTypeCodecUtils::decodeUint8Array16(buffer, data.listOfInterfaces, lengthLeft, 0)))
+    {
+        errorStream.add((char *)"Failed to decode: listOfInterfaces\n");
+        return false;
+    }
+    lengthLeft = ieBoundary - buffer.getCurrentIndex();
+    if (!(DataTypeCodecUtils::decodeIpAddressV4(buffer, data.ipAddressOfTce, lengthLeft)))
+    {
+        errorStream.add((char *)"Failed to decode: ipAddressOfTce\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE TraceInformationIe\n");
+        return false;
+    }
+}
+void TraceInformationIe::displayTraceInformationIe_v(TraceInformationIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"TraceInformationIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add( (char *)"mccDigit2: "); 
+    stream.add((Uint8)data.mccDigit2);
+    stream.endOfLine();
+  
+    stream.add( (char *)"mccDigit1: "); 
+    stream.add((Uint8)data.mccDigit1);
+    stream.endOfLine();
+  
+    stream.add( (char *)"mncDigit3: "); 
+    stream.add((Uint8)data.mncDigit3);
+    stream.endOfLine();
+  
+    stream.add( (char *)"mccDigit3: "); 
+    stream.add((Uint8)data.mccDigit3);
+    stream.endOfLine();
+  
+    stream.add( (char *)"mncDigit2: "); 
+    stream.add((Uint8)data.mncDigit2);
+    stream.endOfLine();
+  
+    stream.add( (char *)"mncDigit1: "); 
+    stream.add((Uint8)data.mncDigit1);
+    stream.endOfLine();
+  
+    stream.add((char *)"traceId:");
+    stream.endOfLine();
+    DataTypeCodecUtils::displayUint8Array4_v(data.traceId, stream);
+  
+    stream.add((char *)"triggeringEvents:");
+    stream.endOfLine();
+    DataTypeCodecUtils::displayUint8Array16_v(data.triggeringEvents, stream);
+  
+    stream.add((char *)"listOfNeTypes: ");
+    stream.add(data.listOfNeTypes);
+    stream.endOfLine();
+  
+    stream.add((char *)"sessionTraceDepth: ");
+    stream.add(data.sessionTraceDepth);
+    stream.endOfLine();
+  
+    stream.add((char *)"listOfInterfaces:");
+    stream.endOfLine();
+    DataTypeCodecUtils::displayUint8Array16_v(data.listOfInterfaces, stream);
+  
+    stream.add((char *)"ipAddressOfTce:");
+    stream.endOfLine();
+    DataTypeCodecUtils::displayIpAddressV4_v(data.ipAddressOfTce, stream);
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/traceInformationIe.h b/src/gtpV2Codec/ieClasses/traceInformationIe.h
new file mode 100644
index 0000000..d72345a
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/traceInformationIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef TRACEINFORMATIONIE_H_
+#define TRACEINFORMATIONIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class TraceInformationIe: public GtpV2Ie {
+public:
+    TraceInformationIe();
+    virtual ~TraceInformationIe();
+
+    bool encodeTraceInformationIe(MsgBuffer &buffer,
+                 TraceInformationIeData const &data);
+    bool decodeTraceInformationIe(MsgBuffer &buffer,
+                 TraceInformationIeData &data, Uint16 length);
+    void displayTraceInformationIe_v(TraceInformationIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* TRACEINFORMATIONIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/twanEpdgsOverloadControlInformationInCreateBearerResponse.cpp b/src/gtpV2Codec/ieClasses/twanEpdgsOverloadControlInformationInCreateBearerResponse.cpp
new file mode 100644
index 0000000..7053c56
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/twanEpdgsOverloadControlInformationInCreateBearerResponse.cpp
@@ -0,0 +1,306 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "twanEpdgsOverloadControlInformationInCreateBearerResponse.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+#include "epcTimerIe.h"
+
+TwanEpdgsOverloadControlInformationInCreateBearerResponse::
+TwanEpdgsOverloadControlInformationInCreateBearerResponse()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // overloadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // overloadReductionMetric
+    mandatoryIeSet.insert(mandIe);
+    mandIe = EpcTimerIeType;
+    mandIe = (mandIe << 8) | 0; // periodOfValidity
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+TwanEpdgsOverloadControlInformationInCreateBearerResponse::
+~TwanEpdgsOverloadControlInformationInCreateBearerResponse()
+{
+
+}
+bool TwanEpdgsOverloadControlInformationInCreateBearerResponse::
+encodeTwanEpdgsOverloadControlInformationInCreateBearerResponse(MsgBuffer &buffer,
+                         TwanEpdgsOverloadControlInformationInCreateBearerResponseData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.overloadReductionMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadReductionMetric\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = EpcTimerIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    EpcTimerIe epcTimer=
+    dynamic_cast<
+    EpcTimerIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcTimerIeType));
+    rc = epcTimer.encodeEpcTimerIe(buffer, data.periodOfValidity);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: periodOfValidity\n");
+        return false;
+    }
+    return rc;
+}
+
+bool TwanEpdgsOverloadControlInformationInCreateBearerResponse::
+decodeTwanEpdgsOverloadControlInformationInCreateBearerResponse(MsgBuffer &buffer,
+                         TwanEpdgsOverloadControlInformationInCreateBearerResponseData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.overloadReductionMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadReductionMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case EpcTimerIeType:
+            {
+                EpcTimerIe ieObject =
+                dynamic_cast<
+                EpcTimerIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(EpcTimerIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeEpcTimerIe(buffer, data.periodOfValidity, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: periodOfValidity\n");
+                        return false;
+                    }
+                    Uint16 mandIe = EpcTimerIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void TwanEpdgsOverloadControlInformationInCreateBearerResponse::
+displayTwanEpdgsOverloadControlInformationInCreateBearerResponseData_v
+(TwanEpdgsOverloadControlInformationInCreateBearerResponseData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"TwanEpdgsOverloadControlInformationInCreateBearerResponse:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/twanEpdgsOverloadControlInformationInCreateBearerResponse.h b/src/gtpV2Codec/ieClasses/twanEpdgsOverloadControlInformationInCreateBearerResponse.h
new file mode 100644
index 0000000..b3a69a1
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/twanEpdgsOverloadControlInformationInCreateBearerResponse.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef TWANEPDGSOVERLOADCONTROLINFORMATIONINCREATEBEARERRESPONSE_H_
+#define TWANEPDGSOVERLOADCONTROLINFORMATIONINCREATEBEARERRESPONSE_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class TwanEpdgsOverloadControlInformationInCreateBearerResponse:public GtpV2GroupedIe
+{
+public:
+    TwanEpdgsOverloadControlInformationInCreateBearerResponse();
+    virtual ~TwanEpdgsOverloadControlInformationInCreateBearerResponse();
+    bool encodeTwanEpdgsOverloadControlInformationInCreateBearerResponse(MsgBuffer &buffer,
+                             TwanEpdgsOverloadControlInformationInCreateBearerResponseData
+                              const &data);
+
+    bool decodeTwanEpdgsOverloadControlInformationInCreateBearerResponse (MsgBuffer &buffer,
+                             TwanEpdgsOverloadControlInformationInCreateBearerResponseData 
+                             & data, Uint16 length);
+
+    void displayTwanEpdgsOverloadControlInformationInCreateBearerResponseData_v
+    (TwanEpdgsOverloadControlInformationInCreateBearerResponseData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/twanEpdgsOverloadControlInformationInCreateSessionRequest.cpp b/src/gtpV2Codec/ieClasses/twanEpdgsOverloadControlInformationInCreateSessionRequest.cpp
new file mode 100644
index 0000000..25dfb72
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/twanEpdgsOverloadControlInformationInCreateSessionRequest.cpp
@@ -0,0 +1,306 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "twanEpdgsOverloadControlInformationInCreateSessionRequest.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+#include "epcTimerIe.h"
+
+TwanEpdgsOverloadControlInformationInCreateSessionRequest::
+TwanEpdgsOverloadControlInformationInCreateSessionRequest()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // overloadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // overloadReductionMetric
+    mandatoryIeSet.insert(mandIe);
+    mandIe = EpcTimerIeType;
+    mandIe = (mandIe << 8) | 0; // periodOfValidity
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+TwanEpdgsOverloadControlInformationInCreateSessionRequest::
+~TwanEpdgsOverloadControlInformationInCreateSessionRequest()
+{
+
+}
+bool TwanEpdgsOverloadControlInformationInCreateSessionRequest::
+encodeTwanEpdgsOverloadControlInformationInCreateSessionRequest(MsgBuffer &buffer,
+                         TwanEpdgsOverloadControlInformationInCreateSessionRequestData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.overloadReductionMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadReductionMetric\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = EpcTimerIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    EpcTimerIe epcTimer=
+    dynamic_cast<
+    EpcTimerIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcTimerIeType));
+    rc = epcTimer.encodeEpcTimerIe(buffer, data.periodOfValidity);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: periodOfValidity\n");
+        return false;
+    }
+    return rc;
+}
+
+bool TwanEpdgsOverloadControlInformationInCreateSessionRequest::
+decodeTwanEpdgsOverloadControlInformationInCreateSessionRequest(MsgBuffer &buffer,
+                         TwanEpdgsOverloadControlInformationInCreateSessionRequestData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.overloadReductionMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadReductionMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case EpcTimerIeType:
+            {
+                EpcTimerIe ieObject =
+                dynamic_cast<
+                EpcTimerIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(EpcTimerIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeEpcTimerIe(buffer, data.periodOfValidity, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: periodOfValidity\n");
+                        return false;
+                    }
+                    Uint16 mandIe = EpcTimerIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void TwanEpdgsOverloadControlInformationInCreateSessionRequest::
+displayTwanEpdgsOverloadControlInformationInCreateSessionRequestData_v
+(TwanEpdgsOverloadControlInformationInCreateSessionRequestData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"TwanEpdgsOverloadControlInformationInCreateSessionRequest:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/twanEpdgsOverloadControlInformationInCreateSessionRequest.h b/src/gtpV2Codec/ieClasses/twanEpdgsOverloadControlInformationInCreateSessionRequest.h
new file mode 100644
index 0000000..bb28bdf
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/twanEpdgsOverloadControlInformationInCreateSessionRequest.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef TWANEPDGSOVERLOADCONTROLINFORMATIONINCREATESESSIONREQUEST_H_
+#define TWANEPDGSOVERLOADCONTROLINFORMATIONINCREATESESSIONREQUEST_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class TwanEpdgsOverloadControlInformationInCreateSessionRequest:public GtpV2GroupedIe
+{
+public:
+    TwanEpdgsOverloadControlInformationInCreateSessionRequest();
+    virtual ~TwanEpdgsOverloadControlInformationInCreateSessionRequest();
+    bool encodeTwanEpdgsOverloadControlInformationInCreateSessionRequest(MsgBuffer &buffer,
+                             TwanEpdgsOverloadControlInformationInCreateSessionRequestData
+                              const &data);
+
+    bool decodeTwanEpdgsOverloadControlInformationInCreateSessionRequest (MsgBuffer &buffer,
+                             TwanEpdgsOverloadControlInformationInCreateSessionRequestData 
+                             & data, Uint16 length);
+
+    void displayTwanEpdgsOverloadControlInformationInCreateSessionRequestData_v
+    (TwanEpdgsOverloadControlInformationInCreateSessionRequestData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/twanEpdgsOverloadControlInformationInDeleteBearerResponse.cpp b/src/gtpV2Codec/ieClasses/twanEpdgsOverloadControlInformationInDeleteBearerResponse.cpp
new file mode 100644
index 0000000..ef26588
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/twanEpdgsOverloadControlInformationInDeleteBearerResponse.cpp
@@ -0,0 +1,306 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "twanEpdgsOverloadControlInformationInDeleteBearerResponse.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+#include "epcTimerIe.h"
+
+TwanEpdgsOverloadControlInformationInDeleteBearerResponse::
+TwanEpdgsOverloadControlInformationInDeleteBearerResponse()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // overloadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // overloadReductionMetric
+    mandatoryIeSet.insert(mandIe);
+    mandIe = EpcTimerIeType;
+    mandIe = (mandIe << 8) | 0; // periodOfValidity
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+TwanEpdgsOverloadControlInformationInDeleteBearerResponse::
+~TwanEpdgsOverloadControlInformationInDeleteBearerResponse()
+{
+
+}
+bool TwanEpdgsOverloadControlInformationInDeleteBearerResponse::
+encodeTwanEpdgsOverloadControlInformationInDeleteBearerResponse(MsgBuffer &buffer,
+                         TwanEpdgsOverloadControlInformationInDeleteBearerResponseData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.overloadReductionMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadReductionMetric\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = EpcTimerIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    EpcTimerIe epcTimer=
+    dynamic_cast<
+    EpcTimerIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcTimerIeType));
+    rc = epcTimer.encodeEpcTimerIe(buffer, data.periodOfValidity);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: periodOfValidity\n");
+        return false;
+    }
+    return rc;
+}
+
+bool TwanEpdgsOverloadControlInformationInDeleteBearerResponse::
+decodeTwanEpdgsOverloadControlInformationInDeleteBearerResponse(MsgBuffer &buffer,
+                         TwanEpdgsOverloadControlInformationInDeleteBearerResponseData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.overloadReductionMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadReductionMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case EpcTimerIeType:
+            {
+                EpcTimerIe ieObject =
+                dynamic_cast<
+                EpcTimerIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(EpcTimerIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeEpcTimerIe(buffer, data.periodOfValidity, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: periodOfValidity\n");
+                        return false;
+                    }
+                    Uint16 mandIe = EpcTimerIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void TwanEpdgsOverloadControlInformationInDeleteBearerResponse::
+displayTwanEpdgsOverloadControlInformationInDeleteBearerResponseData_v
+(TwanEpdgsOverloadControlInformationInDeleteBearerResponseData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"TwanEpdgsOverloadControlInformationInDeleteBearerResponse:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/twanEpdgsOverloadControlInformationInDeleteBearerResponse.h b/src/gtpV2Codec/ieClasses/twanEpdgsOverloadControlInformationInDeleteBearerResponse.h
new file mode 100644
index 0000000..dd98e81
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/twanEpdgsOverloadControlInformationInDeleteBearerResponse.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef TWANEPDGSOVERLOADCONTROLINFORMATIONINDELETEBEARERRESPONSE_H_
+#define TWANEPDGSOVERLOADCONTROLINFORMATIONINDELETEBEARERRESPONSE_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class TwanEpdgsOverloadControlInformationInDeleteBearerResponse:public GtpV2GroupedIe
+{
+public:
+    TwanEpdgsOverloadControlInformationInDeleteBearerResponse();
+    virtual ~TwanEpdgsOverloadControlInformationInDeleteBearerResponse();
+    bool encodeTwanEpdgsOverloadControlInformationInDeleteBearerResponse(MsgBuffer &buffer,
+                             TwanEpdgsOverloadControlInformationInDeleteBearerResponseData
+                              const &data);
+
+    bool decodeTwanEpdgsOverloadControlInformationInDeleteBearerResponse (MsgBuffer &buffer,
+                             TwanEpdgsOverloadControlInformationInDeleteBearerResponseData 
+                             & data, Uint16 length);
+
+    void displayTwanEpdgsOverloadControlInformationInDeleteBearerResponseData_v
+    (TwanEpdgsOverloadControlInformationInDeleteBearerResponseData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/twanEpdgsOverloadControlInformationInDeleteSessionRequest.cpp b/src/gtpV2Codec/ieClasses/twanEpdgsOverloadControlInformationInDeleteSessionRequest.cpp
new file mode 100644
index 0000000..3aca592
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/twanEpdgsOverloadControlInformationInDeleteSessionRequest.cpp
@@ -0,0 +1,306 @@
+/*
+ * 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/grpieinsttemplate.cpp.tt>
+ ******************************************************************************/
+ 
+#include "twanEpdgsOverloadControlInformationInDeleteSessionRequest.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+#include "sequenceNumberIe.h"
+#include "metricIe.h"
+#include "epcTimerIe.h"
+
+TwanEpdgsOverloadControlInformationInDeleteSessionRequest::
+TwanEpdgsOverloadControlInformationInDeleteSessionRequest()
+{
+    Uint16 mandIe;
+    mandIe = SequenceNumberIeType;
+    mandIe = (mandIe << 8) | 0; // overloadControlSequenceNumber
+    mandatoryIeSet.insert(mandIe);
+    mandIe = MetricIeType;
+    mandIe = (mandIe << 8) | 0; // overloadReductionMetric
+    mandatoryIeSet.insert(mandIe);
+    mandIe = EpcTimerIeType;
+    mandIe = (mandIe << 8) | 0; // periodOfValidity
+    mandatoryIeSet.insert(mandIe);
+
+}
+
+TwanEpdgsOverloadControlInformationInDeleteSessionRequest::
+~TwanEpdgsOverloadControlInformationInDeleteSessionRequest()
+{
+
+}
+bool TwanEpdgsOverloadControlInformationInDeleteSessionRequest::
+encodeTwanEpdgsOverloadControlInformationInDeleteSessionRequest(MsgBuffer &buffer,
+                         TwanEpdgsOverloadControlInformationInDeleteSessionRequestData
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+
+    
+    // Encode the Ie Header
+    header.ieType = SequenceNumberIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    SequenceNumberIe sequenceNumber=
+    dynamic_cast<
+    SequenceNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(SequenceNumberIeType));
+    rc = sequenceNumber.encodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadControlSequenceNumber\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = MetricIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    MetricIe metric=
+    dynamic_cast<
+    MetricIe&>(GtpV2IeFactory::getInstance().getIeObject(MetricIeType));
+    rc = metric.encodeMetricIe(buffer, data.overloadReductionMetric);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: overloadReductionMetric\n");
+        return false;
+    }
+
+
+    
+    // Encode the Ie Header
+    header.ieType = EpcTimerIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    EpcTimerIe epcTimer=
+    dynamic_cast<
+    EpcTimerIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcTimerIeType));
+    rc = epcTimer.encodeEpcTimerIe(buffer, data.periodOfValidity);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: periodOfValidity\n");
+        return false;
+    }
+    return rc;
+}
+
+bool TwanEpdgsOverloadControlInformationInDeleteSessionRequest::
+decodeTwanEpdgsOverloadControlInformationInDeleteSessionRequest(MsgBuffer &buffer,
+                         TwanEpdgsOverloadControlInformationInDeleteSessionRequestData 
+                         &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+    
+        switch (ieHeader.ieType){
+            case SequenceNumberIeType:
+            {
+                SequenceNumberIe ieObject =
+                dynamic_cast<
+                SequenceNumberIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(SequenceNumberIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeSequenceNumberIe(buffer, data.overloadControlSequenceNumber, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadControlSequenceNumber\n");
+                        return false;
+                    }
+                    Uint16 mandIe = SequenceNumberIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case MetricIeType:
+            {
+                MetricIe ieObject =
+                dynamic_cast<
+                MetricIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(MetricIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeMetricIe(buffer, data.overloadReductionMetric, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: overloadReductionMetric\n");
+                        return false;
+                    }
+                    Uint16 mandIe = MetricIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            case EpcTimerIeType:
+            {
+                EpcTimerIe ieObject =
+                dynamic_cast<
+                EpcTimerIe&>(GtpV2IeFactory::getInstance().
+                         getIeObject(EpcTimerIeType));
+
+
+                if(ieHeader.instance == 0)
+                {
+
+                					rc = ieObject.decodeEpcTimerIe(buffer, data.periodOfValidity, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: periodOfValidity\n");
+                        return false;
+                    }
+                    Uint16 mandIe = EpcTimerIeType;
+                    mandIe = (mandIe << 8) | 0;
+                    mandatoryIeLocalList.erase(mandIe);
+                }
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+            default:
+            {
+            // Unknown IE print error
+            errorStream.add((char *)"Unknown IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.endOfLine();
+            buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    if (!mandatoryIeLocalList.empty())
+    {
+        // some mandatory IEs are missing
+        errorStream.add((char *)"Missing Mandatory IEs:");
+        errorStream.endOfLine();
+        while (!mandatoryIeLocalList.empty())
+        {
+            Uint16 missingMandIe = *mandatoryIeLocalList.begin ();
+            mandatoryIeLocalList.erase (mandatoryIeLocalList.begin ());
+            Uint16 missingInstance = missingMandIe & 0x00FF;
+            Uint16 missingIeType = (missingMandIe >> 8);
+            errorStream.add ((char *)"Missing Ie type: ");
+            errorStream.add (missingIeType);
+            errorStream.add ((char *)"  Instance: ");
+            errorStream.add (missingInstance);
+            errorStream.endOfLine();
+        }
+        rc = false;
+    
+    }
+    return rc; 
+}
+
+void TwanEpdgsOverloadControlInformationInDeleteSessionRequest::
+displayTwanEpdgsOverloadControlInformationInDeleteSessionRequestData_v
+(TwanEpdgsOverloadControlInformationInDeleteSessionRequestData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"TwanEpdgsOverloadControlInformationInDeleteSessionRequest:");
+    stream.endOfLine();
+    stream.incrIndent();
+
+
+
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+
+
+
diff --git a/src/gtpV2Codec/ieClasses/twanEpdgsOverloadControlInformationInDeleteSessionRequest.h b/src/gtpV2Codec/ieClasses/twanEpdgsOverloadControlInformationInDeleteSessionRequest.h
new file mode 100644
index 0000000..2591550
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/twanEpdgsOverloadControlInformationInDeleteSessionRequest.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/grpieinsttemplate.h.tt>
+ ******************************************************************************/
+#ifndef TWANEPDGSOVERLOADCONTROLINFORMATIONINDELETESESSIONREQUEST_H_
+#define TWANEPDGSOVERLOADCONTROLINFORMATIONINDELETESESSIONREQUEST_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class TwanEpdgsOverloadControlInformationInDeleteSessionRequest:public GtpV2GroupedIe
+{
+public:
+    TwanEpdgsOverloadControlInformationInDeleteSessionRequest();
+    virtual ~TwanEpdgsOverloadControlInformationInDeleteSessionRequest();
+    bool encodeTwanEpdgsOverloadControlInformationInDeleteSessionRequest(MsgBuffer &buffer,
+                             TwanEpdgsOverloadControlInformationInDeleteSessionRequestData
+                              const &data);
+
+    bool decodeTwanEpdgsOverloadControlInformationInDeleteSessionRequest (MsgBuffer &buffer,
+                             TwanEpdgsOverloadControlInformationInDeleteSessionRequestData 
+                             & data, Uint16 length);
+
+    void displayTwanEpdgsOverloadControlInformationInDeleteSessionRequestData_v
+    (TwanEpdgsOverloadControlInformationInDeleteSessionRequestData const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/twanIdentifierIe.cpp b/src/gtpV2Codec/ieClasses/twanIdentifierIe.cpp
new file mode 100644
index 0000000..8e48ac1
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/twanIdentifierIe.cpp
@@ -0,0 +1,478 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "twanIdentifierIe.h"
+#include "dataTypeCodecUtils.h"
+
+TwanIdentifierIe::TwanIdentifierIe() 
+{
+    ieType = 169;
+    // TODO
+
+}
+
+TwanIdentifierIe::~TwanIdentifierIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool TwanIdentifierIe::encodeTwanIdentifierIe(MsgBuffer &buffer, TwanIdentifierIeData const &data)
+{
+    buffer.skipBits(2);
+
+    if(!(buffer.writeBits(data.laiipresent, 1)))
+    {
+        errorStream.add((char *)"Encoding of laiipresent failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.opnaipresent, 1)))
+    {
+        errorStream.add((char *)"Encoding of opnaipresent failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.plmnipresent, 1)))
+    {
+        errorStream.add((char *)"Encoding of plmnipresent failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.civaipresent, 1)))
+    {
+        errorStream.add((char *)"Encoding of civaipresent failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.bssidipresent, 2)))
+    {
+        errorStream.add((char *)"Encoding of bssidipresent failed\n");
+        return false;
+    }
+    if (!(buffer.writeUint64(data.ssidLength)))
+    {
+        errorStream.add((char *)"Encoding of ssidLength failed\n");
+        return false;
+    }
+    if ( data.ssidLength <=32)
+    {
+        if (!(buffer.writeUint8(data.ssid)))
+        {
+    errorStream.add((char *)"Encoding of ssid failed\n");
+    return false;
+        }
+    }
+    if (data.bssidipresent)
+    {
+        if (!(buffer.writeUint8(data.bssid)))
+        {
+    errorStream.add((char *)"Encoding of bssid failed\n");
+    return false;
+        }
+    }
+    if (data.civaipresent)
+    {
+        if (!(buffer.writeUint8(data.civicAddressLength)))
+        {
+    errorStream.add((char *)"Encoding of civicAddressLength failed\n");
+    return false;
+        }
+    }
+    if (data.civaipresent)
+    {
+        if (!(buffer.writeUint8(data.civicAddressInformation)))
+        {
+    errorStream.add((char *)"Encoding of civicAddressInformation failed\n");
+    return false;
+        }
+    }
+    if (data.plmnipresent)
+    {
+        if (!(buffer.writeUint8(data.twanplmnid)))
+        {
+    errorStream.add((char *)"Encoding of twanplmnid failed\n");
+    return false;
+        }
+    }
+    if (data.opnaipresent)
+    {
+        if (!(buffer.writeUint8(data.twanOperatorNameLength)))
+        {
+    errorStream.add((char *)"Encoding of twanOperatorNameLength failed\n");
+    return false;
+        }
+    }
+    if (data.opnaipresent)
+    {
+        if (!(buffer.writeUint8(data.twanOperatorName)))
+        {
+    errorStream.add((char *)"Encoding of twanOperatorName failed\n");
+    return false;
+        }
+    }
+    if (data.laiipresent)
+    {
+        if (!(buffer.writeUint8(data.relayIdentityType)))
+        {
+    errorStream.add((char *)"Encoding of relayIdentityType failed\n");
+    return false;
+        }
+    }
+    if (data.laiipresent)
+    {
+        if (!(buffer.writeUint8(data.relayIdentityLength)))
+        {
+    errorStream.add((char *)"Encoding of relayIdentityLength failed\n");
+    return false;
+        }
+    }
+    if (data.laiipresent)
+    {
+        if (!(buffer.writeUint8(data.relayIdentity)))
+        {
+    errorStream.add((char *)"Encoding of relayIdentity failed\n");
+    return false;
+        }
+    }
+    if (data.laiipresent)
+    {
+        if (!(buffer.writeUint8(data.circuitIDLength)))
+        {
+    errorStream.add((char *)"Encoding of circuitIDLength failed\n");
+    return false;
+        }
+    }
+    if (data.laiipresent)
+    {
+        if (!(buffer.writeUint8(data.circuitID)))
+        {
+    errorStream.add((char *)"Encoding of circuitID failed\n");
+    return false;
+        }
+    }
+
+    return true;
+}
+
+bool TwanIdentifierIe::decodeTwanIdentifierIe(MsgBuffer &buffer, TwanIdentifierIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+    buffer.skipBits(2);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: \n");
+        return false;
+    }
+
+    data.laiipresent = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: laiipresent\n");
+        return false;
+    }
+    data.opnaipresent = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: opnaipresent\n");
+        return false;
+    }
+    data.plmnipresent = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: plmnipresent\n");
+        return false;
+    }
+    data.civaipresent = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: civaipresent\n");
+        return false;
+    }
+    data.bssidipresent = buffer.readBits(2);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: bssidipresent\n");
+        return false;
+    }
+
+    buffer.readUint64(data.ssidLength);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: ssidLength\n");
+        return false;
+    }
+
+    if ( data.ssidLength <=32)
+    {
+
+        buffer.readUint8(data.ssid);
+        if (buffer.getCurrentIndex() > ieBoundary)
+        {
+            errorStream.add((char *)"Attempt to read beyond IE boundary: ssid\n");
+            return false;
+        }
+    }
+
+    if (data.bssidipresent)
+    {
+
+        buffer.readUint8(data.bssid);
+        if (buffer.getCurrentIndex() > ieBoundary)
+        {
+            errorStream.add((char *)"Attempt to read beyond IE boundary: bssid\n");
+            return false;
+        }
+    }
+
+    if (data.civaipresent)
+    {
+
+        buffer.readUint8(data.civicAddressLength);
+        if (buffer.getCurrentIndex() > ieBoundary)
+        {
+            errorStream.add((char *)"Attempt to read beyond IE boundary: civicAddressLength\n");
+            return false;
+        }
+    }
+
+    if (data.civaipresent)
+    {
+
+        buffer.readUint8(data.civicAddressInformation);
+        if (buffer.getCurrentIndex() > ieBoundary)
+        {
+            errorStream.add((char *)"Attempt to read beyond IE boundary: civicAddressInformation\n");
+            return false;
+        }
+    }
+
+    if (data.plmnipresent)
+    {
+
+        buffer.readUint8(data.twanplmnid);
+        if (buffer.getCurrentIndex() > ieBoundary)
+        {
+            errorStream.add((char *)"Attempt to read beyond IE boundary: twanplmnid\n");
+            return false;
+        }
+    }
+
+    if (data.opnaipresent)
+    {
+
+        buffer.readUint8(data.twanOperatorNameLength);
+        if (buffer.getCurrentIndex() > ieBoundary)
+        {
+            errorStream.add((char *)"Attempt to read beyond IE boundary: twanOperatorNameLength\n");
+            return false;
+        }
+    }
+
+    if (data.opnaipresent)
+    {
+
+        buffer.readUint8(data.twanOperatorName);
+        if (buffer.getCurrentIndex() > ieBoundary)
+        {
+            errorStream.add((char *)"Attempt to read beyond IE boundary: twanOperatorName\n");
+            return false;
+        }
+    }
+
+    if (data.laiipresent)
+    {
+
+        buffer.readUint8(data.relayIdentityType);
+        if (buffer.getCurrentIndex() > ieBoundary)
+        {
+            errorStream.add((char *)"Attempt to read beyond IE boundary: relayIdentityType\n");
+            return false;
+        }
+    }
+
+    if (data.laiipresent)
+    {
+
+        buffer.readUint8(data.relayIdentityLength);
+        if (buffer.getCurrentIndex() > ieBoundary)
+        {
+            errorStream.add((char *)"Attempt to read beyond IE boundary: relayIdentityLength\n");
+            return false;
+        }
+    }
+
+    if (data.laiipresent)
+    {
+
+        buffer.readUint8(data.relayIdentity);
+        if (buffer.getCurrentIndex() > ieBoundary)
+        {
+            errorStream.add((char *)"Attempt to read beyond IE boundary: relayIdentity\n");
+            return false;
+        }
+    }
+
+    if (data.laiipresent)
+    {
+
+        buffer.readUint8(data.circuitIDLength);
+        if (buffer.getCurrentIndex() > ieBoundary)
+        {
+            errorStream.add((char *)"Attempt to read beyond IE boundary: circuitIDLength\n");
+            return false;
+        }
+    }
+
+    if (data.laiipresent)
+    {
+
+        buffer.readUint8(data.circuitID);
+        if (buffer.getCurrentIndex() > ieBoundary)
+        {
+            errorStream.add((char *)"Attempt to read beyond IE boundary: circuitID\n");
+            return false;
+        }
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE TwanIdentifierIe\n");
+        return false;
+    }
+}
+void TwanIdentifierIe::displayTwanIdentifierIe_v(TwanIdentifierIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"TwanIdentifierIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add( (char *)"laiipresent: "); 
+    stream.add((Uint8)data.laiipresent);
+    stream.endOfLine();
+  
+    stream.add( (char *)"opnaipresent: "); 
+    stream.add((Uint8)data.opnaipresent);
+    stream.endOfLine();
+  
+    stream.add( (char *)"plmnipresent: "); 
+    stream.add((Uint8)data.plmnipresent);
+    stream.endOfLine();
+  
+    stream.add( (char *)"civaipresent: "); 
+    stream.add((Uint8)data.civaipresent);
+    stream.endOfLine();
+  
+    stream.add( (char *)"bssidipresent: "); 
+    stream.add((Uint8)data.bssidipresent);
+    stream.endOfLine();
+  
+    stream.add((char *)"ssidLength: ");
+    stream.add(data.ssidLength);
+    stream.endOfLine();
+  
+    if ( data.ssidLength <=32)
+    {
+        stream.add((char *)"ssid: ");
+        stream.add(data.ssid);
+        stream.endOfLine();
+    }
+  
+    if (data.bssidipresent)
+    {
+        stream.add((char *)"bssid: ");
+        stream.add(data.bssid);
+        stream.endOfLine();
+    }
+  
+    if (data.civaipresent)
+    {
+        stream.add((char *)"civicAddressLength: ");
+        stream.add(data.civicAddressLength);
+        stream.endOfLine();
+    }
+  
+    if (data.civaipresent)
+    {
+        stream.add((char *)"civicAddressInformation: ");
+        stream.add(data.civicAddressInformation);
+        stream.endOfLine();
+    }
+  
+    if (data.plmnipresent)
+    {
+        stream.add((char *)"twanplmnid: ");
+        stream.add(data.twanplmnid);
+        stream.endOfLine();
+    }
+  
+    if (data.opnaipresent)
+    {
+        stream.add((char *)"twanOperatorNameLength: ");
+        stream.add(data.twanOperatorNameLength);
+        stream.endOfLine();
+    }
+  
+    if (data.opnaipresent)
+    {
+        stream.add((char *)"twanOperatorName: ");
+        stream.add(data.twanOperatorName);
+        stream.endOfLine();
+    }
+  
+    if (data.laiipresent)
+    {
+        stream.add((char *)"relayIdentityType: ");
+        stream.add(data.relayIdentityType);
+        stream.endOfLine();
+    }
+  
+    if (data.laiipresent)
+    {
+        stream.add((char *)"relayIdentityLength: ");
+        stream.add(data.relayIdentityLength);
+        stream.endOfLine();
+    }
+  
+    if (data.laiipresent)
+    {
+        stream.add((char *)"relayIdentity: ");
+        stream.add(data.relayIdentity);
+        stream.endOfLine();
+    }
+  
+    if (data.laiipresent)
+    {
+        stream.add((char *)"circuitIDLength: ");
+        stream.add(data.circuitIDLength);
+        stream.endOfLine();
+    }
+  
+    if (data.laiipresent)
+    {
+        stream.add((char *)"circuitID: ");
+        stream.add(data.circuitID);
+        stream.endOfLine();
+    }
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/twanIdentifierIe.h b/src/gtpV2Codec/ieClasses/twanIdentifierIe.h
new file mode 100644
index 0000000..e98ddd7
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/twanIdentifierIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef TWANIDENTIFIERIE_H_
+#define TWANIDENTIFIERIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class TwanIdentifierIe: public GtpV2Ie {
+public:
+    TwanIdentifierIe();
+    virtual ~TwanIdentifierIe();
+
+    bool encodeTwanIdentifierIe(MsgBuffer &buffer,
+                 TwanIdentifierIeData const &data);
+    bool decodeTwanIdentifierIe(MsgBuffer &buffer,
+                 TwanIdentifierIeData &data, Uint16 length);
+    void displayTwanIdentifierIe_v(TwanIdentifierIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* TWANIDENTIFIERIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/twanIdentifierTimestampIe.cpp b/src/gtpV2Codec/ieClasses/twanIdentifierTimestampIe.cpp
new file mode 100644
index 0000000..7d0a2e7
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/twanIdentifierTimestampIe.cpp
@@ -0,0 +1,77 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "twanIdentifierTimestampIe.h"
+#include "dataTypeCodecUtils.h"
+
+TwanIdentifierTimestampIe::TwanIdentifierTimestampIe() 
+{
+    ieType = 179;
+    // TODO
+
+}
+
+TwanIdentifierTimestampIe::~TwanIdentifierTimestampIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool TwanIdentifierTimestampIe::encodeTwanIdentifierTimestampIe(MsgBuffer &buffer, TwanIdentifierTimestampIeData const &data)
+{
+    if (!(buffer.writeUint32(data.twanIdentifierTimestampvalue)))
+    {
+        errorStream.add((char *)"Encoding of twanIdentifierTimestampvalue failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool TwanIdentifierTimestampIe::decodeTwanIdentifierTimestampIe(MsgBuffer &buffer, TwanIdentifierTimestampIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+
+    buffer.readUint32(data.twanIdentifierTimestampvalue);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: twanIdentifierTimestampvalue\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE TwanIdentifierTimestampIe\n");
+        return false;
+    }
+}
+void TwanIdentifierTimestampIe::displayTwanIdentifierTimestampIe_v(TwanIdentifierTimestampIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"TwanIdentifierTimestampIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add((char *)"twanIdentifierTimestampvalue: ");
+    stream.add(data.twanIdentifierTimestampvalue);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/twanIdentifierTimestampIe.h b/src/gtpV2Codec/ieClasses/twanIdentifierTimestampIe.h
new file mode 100644
index 0000000..f00e580
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/twanIdentifierTimestampIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef TWANIDENTIFIERTIMESTAMPIE_H_
+#define TWANIDENTIFIERTIMESTAMPIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class TwanIdentifierTimestampIe: public GtpV2Ie {
+public:
+    TwanIdentifierTimestampIe();
+    virtual ~TwanIdentifierTimestampIe();
+
+    bool encodeTwanIdentifierTimestampIe(MsgBuffer &buffer,
+                 TwanIdentifierTimestampIeData const &data);
+    bool decodeTwanIdentifierTimestampIe(MsgBuffer &buffer,
+                 TwanIdentifierTimestampIeData &data, Uint16 length);
+    void displayTwanIdentifierTimestampIe_v(TwanIdentifierTimestampIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* TWANIDENTIFIERTIMESTAMPIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/twmiIe.cpp b/src/gtpV2Codec/ieClasses/twmiIe.cpp
new file mode 100644
index 0000000..bb538db
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/twmiIe.cpp
@@ -0,0 +1,102 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "twmiIe.h"
+#include "dataTypeCodecUtils.h"
+
+TwmiIe::TwmiIe() 
+{
+    ieType = 174;
+    // TODO
+
+}
+
+TwmiIe::~TwmiIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool TwmiIe::encodeTwmiIe(MsgBuffer &buffer, TwmiIeData const &data)
+{
+    buffer.skipBits(4);
+
+    if(!(buffer.writeBits(data.mcm, 2)))
+    {
+        errorStream.add((char *)"Encoding of mcm failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.scm, 2)))
+    {
+        errorStream.add((char *)"Encoding of scm failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool TwmiIe::decodeTwmiIe(MsgBuffer &buffer, TwmiIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+    buffer.skipBits(4);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: \n");
+        return false;
+    }
+
+    data.mcm = buffer.readBits(2);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: mcm\n");
+        return false;
+    }
+    data.scm = buffer.readBits(2);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: scm\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE TwmiIe\n");
+        return false;
+    }
+}
+void TwmiIe::displayTwmiIe_v(TwmiIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"TwmiIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add( (char *)"mcm: "); 
+    stream.add((Uint8)data.mcm);
+    stream.endOfLine();
+  
+    stream.add( (char *)"scm: "); 
+    stream.add((Uint8)data.scm);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/twmiIe.h b/src/gtpV2Codec/ieClasses/twmiIe.h
new file mode 100644
index 0000000..60a2bf4
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/twmiIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef TWMIIE_H_
+#define TWMIIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class TwmiIe: public GtpV2Ie {
+public:
+    TwmiIe();
+    virtual ~TwmiIe();
+
+    bool encodeTwmiIe(MsgBuffer &buffer,
+                 TwmiIeData const &data);
+    bool decodeTwmiIe(MsgBuffer &buffer,
+                 TwmiIeData &data, Uint16 length);
+    void displayTwmiIe_v(TwmiIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* TWMIIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/uciIe.cpp b/src/gtpV2Codec/ieClasses/uciIe.cpp
new file mode 100644
index 0000000..6d4eef6
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/uciIe.cpp
@@ -0,0 +1,250 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "uciIe.h"
+#include "dataTypeCodecUtils.h"
+
+UciIe::UciIe() 
+{
+    ieType = 145;
+    // TODO
+
+}
+
+UciIe::~UciIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool UciIe::encodeUciIe(MsgBuffer &buffer, UciIeData const &data)
+{
+    if(!(buffer.writeBits(data.mccDigit2, 4)))
+    {
+        errorStream.add((char *)"Encoding of mccDigit2 failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.mccDigit1, 4)))
+    {
+        errorStream.add((char *)"Encoding of mccDigit1 failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.mncDigit3, 4)))
+    {
+        errorStream.add((char *)"Encoding of mncDigit3 failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.mccDigit3, 4)))
+    {
+        errorStream.add((char *)"Encoding of mccDigit3 failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.mncDigit2, 4)))
+    {
+        errorStream.add((char *)"Encoding of mncDigit2 failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.mncDigit1, 4)))
+    {
+        errorStream.add((char *)"Encoding of mncDigit1 failed\n");
+        return false;
+    }
+    if (!(data.csgId<= 0x07FFFFFF))
+    {
+        errorStream.add((char *)"Data validation failure: csgId\n");
+        return false; 
+    }
+    if (!(buffer.writeUint32(data.csgId)))
+    {
+        errorStream.add((char *)"Encoding of csgId failed\n");
+        return false;
+    }
+    if (!(data.accessMode<= 1))
+    {
+        errorStream.add((char *)"Data validation failure: accessMode\n");
+        return false; 
+    }
+    if(!(buffer.writeBits(data.accessMode, 2)))
+    {
+        errorStream.add((char *)"Encoding of accessMode failed\n");
+        return false;
+    }
+    buffer.skipBits(4);
+
+    if(!(buffer.writeBits(data.lcsg, 1)))
+    {
+        errorStream.add((char *)"Encoding of lcsg failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.cmi, 1)))
+    {
+        errorStream.add((char *)"Encoding of cmi failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool UciIe::decodeUciIe(MsgBuffer &buffer, UciIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+    data.mccDigit2 = buffer.readBits(4);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: mccDigit2\n");
+        return false;
+    }
+    data.mccDigit1 = buffer.readBits(4);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: mccDigit1\n");
+        return false;
+    }
+    data.mncDigit3 = buffer.readBits(4);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: mncDigit3\n");
+        return false;
+    }
+    data.mccDigit3 = buffer.readBits(4);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: mccDigit3\n");
+        return false;
+    }
+    data.mncDigit2 = buffer.readBits(4);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: mncDigit2\n");
+        return false;
+    }
+    data.mncDigit1 = buffer.readBits(4);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: mncDigit1\n");
+        return false;
+    }
+
+    buffer.readUint32(data.csgId);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: csgId\n");
+        return false;
+    }
+    if (!(data.csgId<= 0x07FFFFFF))
+    {
+        errorStream.add((char *)"Data validation failure : csgId\n");
+        return false; //TODO need to add validations
+    }
+    data.accessMode = buffer.readBits(2);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: accessMode\n");
+        return false;
+    }
+    if (!(data.accessMode<= 1))
+    {
+        errorStream.add((char *)"Data validation failure : accessMode\n");
+        return false; //TODO need to add validations
+    }
+    buffer.skipBits(4);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: \n");
+        return false;
+    }
+
+    data.lcsg = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: lcsg\n");
+        return false;
+    }
+    data.cmi = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: cmi\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE UciIe\n");
+        return false;
+    }
+}
+void UciIe::displayUciIe_v(UciIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"UciIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add( (char *)"mccDigit2: "); 
+    stream.add((Uint8)data.mccDigit2);
+    stream.endOfLine();
+  
+    stream.add( (char *)"mccDigit1: "); 
+    stream.add((Uint8)data.mccDigit1);
+    stream.endOfLine();
+  
+    stream.add( (char *)"mncDigit3: "); 
+    stream.add((Uint8)data.mncDigit3);
+    stream.endOfLine();
+  
+    stream.add( (char *)"mccDigit3: "); 
+    stream.add((Uint8)data.mccDigit3);
+    stream.endOfLine();
+  
+    stream.add( (char *)"mncDigit2: "); 
+    stream.add((Uint8)data.mncDigit2);
+    stream.endOfLine();
+  
+    stream.add( (char *)"mncDigit1: "); 
+    stream.add((Uint8)data.mncDigit1);
+    stream.endOfLine();
+  
+    stream.add((char *)"csgId: ");
+    stream.add(data.csgId);
+    stream.endOfLine();
+  
+    stream.add( (char *)"accessMode: "); 
+    stream.add((Uint8)data.accessMode);
+    stream.endOfLine();
+  
+    stream.add( (char *)"lcsg: "); 
+    stream.add((Uint8)data.lcsg);
+    stream.endOfLine();
+  
+    stream.add( (char *)"cmi: "); 
+    stream.add((Uint8)data.cmi);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/uciIe.h b/src/gtpV2Codec/ieClasses/uciIe.h
new file mode 100644
index 0000000..ab5e653
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/uciIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef UCIIE_H_
+#define UCIIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class UciIe: public GtpV2Ie {
+public:
+    UciIe();
+    virtual ~UciIe();
+
+    bool encodeUciIe(MsgBuffer &buffer,
+                 UciIeData const &data);
+    bool decodeUciIe(MsgBuffer &buffer,
+                 UciIeData &data, Uint16 length);
+    void displayUciIe_v(UciIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* UCIIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/ueTimeZoneIe.cpp b/src/gtpV2Codec/ieClasses/ueTimeZoneIe.cpp
new file mode 100644
index 0000000..86b55a4
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/ueTimeZoneIe.cpp
@@ -0,0 +1,96 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "ueTimeZoneIe.h"
+#include "dataTypeCodecUtils.h"
+
+UeTimeZoneIe::UeTimeZoneIe() 
+{
+    ieType = 114;
+    // TODO
+
+}
+
+UeTimeZoneIe::~UeTimeZoneIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool UeTimeZoneIe::encodeUeTimeZoneIe(MsgBuffer &buffer, UeTimeZoneIeData const &data)
+{
+    buffer.skipBits(6);
+
+    if (!(data.daylightSavingTime!= 3))
+    {
+        errorStream.add((char *)"Data validation failure: daylightSavingTime\n");
+        return false; 
+    }
+    if(!(buffer.writeBits(data.daylightSavingTime, 2)))
+    {
+        errorStream.add((char *)"Encoding of daylightSavingTime failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool UeTimeZoneIe::decodeUeTimeZoneIe(MsgBuffer &buffer, UeTimeZoneIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+    buffer.skipBits(6);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: \n");
+        return false;
+    }
+
+    data.daylightSavingTime = buffer.readBits(2);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: daylightSavingTime\n");
+        return false;
+    }
+    if (!(data.daylightSavingTime!= 3))
+    {
+        errorStream.add((char *)"Data validation failure : daylightSavingTime\n");
+        return false; //TODO need to add validations
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE UeTimeZoneIe\n");
+        return false;
+    }
+}
+void UeTimeZoneIe::displayUeTimeZoneIe_v(UeTimeZoneIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"UeTimeZoneIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add( (char *)"daylightSavingTime: "); 
+    stream.add((Uint8)data.daylightSavingTime);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/ueTimeZoneIe.h b/src/gtpV2Codec/ieClasses/ueTimeZoneIe.h
new file mode 100644
index 0000000..4be6664
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/ueTimeZoneIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef UETIMEZONEIE_H_
+#define UETIMEZONEIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class UeTimeZoneIe: public GtpV2Ie {
+public:
+    UeTimeZoneIe();
+    virtual ~UeTimeZoneIe();
+
+    bool encodeUeTimeZoneIe(MsgBuffer &buffer,
+                 UeTimeZoneIeData const &data);
+    bool decodeUeTimeZoneIe(MsgBuffer &buffer,
+                 UeTimeZoneIeData &data, Uint16 length);
+    void displayUeTimeZoneIe_v(UeTimeZoneIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* UETIMEZONEIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/uliIe.cpp b/src/gtpV2Codec/ieClasses/uliIe.cpp
new file mode 100644
index 0000000..b55a2a0
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/uliIe.cpp
@@ -0,0 +1,318 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "uliIe.h"
+#include "dataTypeCodecUtils.h"
+
+UliIe::UliIe() 
+{
+    ieType = 86;
+    // TODO
+
+}
+
+UliIe::~UliIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool UliIe::encodeUliIe(MsgBuffer &buffer, UliIeData const &data)
+{
+    buffer.skipBits(2);
+
+    if(!(buffer.writeBits(data.laipresent, 1)))
+    {
+        errorStream.add((char *)"Encoding of laipresent failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.ecgipresent, 1)))
+    {
+        errorStream.add((char *)"Encoding of ecgipresent failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.taipresent, 1)))
+    {
+        errorStream.add((char *)"Encoding of taipresent failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.raipresent, 1)))
+    {
+        errorStream.add((char *)"Encoding of raipresent failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.saipresent, 1)))
+    {
+        errorStream.add((char *)"Encoding of saipresent failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.cgipresent, 1)))
+    {
+        errorStream.add((char *)"Encoding of cgipresent failed\n");
+        return false;
+    }
+    if (data.cgipresent)
+    {
+        if (!(DataTypeCodecUtils::encodeCgiField(buffer, data.cgi)))
+        {
+            errorStream.add((char *)"Encoding of cgi failed\n");
+            return false;
+        }
+    }
+    if (data.saipresent)
+    {
+        if (!(DataTypeCodecUtils::encodeSaiField(buffer, data.sai)))
+        {
+            errorStream.add((char *)"Encoding of sai failed\n");
+            return false;
+        }
+    }
+    if (data.raipresent)
+    {
+        if (!(DataTypeCodecUtils::encodeRaiField(buffer, data.rai)))
+        {
+            errorStream.add((char *)"Encoding of rai failed\n");
+            return false;
+        }
+    }
+    if (data.taipresent)
+    {
+        if (!(DataTypeCodecUtils::encodeTaiField(buffer, data.tai)))
+        {
+            errorStream.add((char *)"Encoding of tai failed\n");
+            return false;
+        }
+    }
+    if (data.ecgipresent)
+    {
+        if (!(DataTypeCodecUtils::encodeEcgiField(buffer, data.ecgi)))
+        {
+            errorStream.add((char *)"Encoding of ecgi failed\n");
+            return false;
+        }
+    }
+    if (data.laipresent)
+    {
+        if (!(DataTypeCodecUtils::encodeLaiField(buffer, data.lai)))
+        {
+            errorStream.add((char *)"Encoding of lai failed\n");
+            return false;
+        }
+    }
+
+    return true;
+}
+
+bool UliIe::decodeUliIe(MsgBuffer &buffer, UliIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+    buffer.skipBits(2);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: \n");
+        return false;
+    }
+
+    data.laipresent = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: laipresent\n");
+        return false;
+    }
+    data.ecgipresent = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: ecgipresent\n");
+        return false;
+    }
+    data.taipresent = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: taipresent\n");
+        return false;
+    }
+    data.raipresent = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: raipresent\n");
+        return false;
+    }
+    data.saipresent = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: saipresent\n");
+        return false;
+    }
+    data.cgipresent = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: cgipresent\n");
+        return false;
+    }
+
+    Uint16 lengthLeft = length;
+
+    if (data.cgipresent)
+    {
+        lengthLeft = ieBoundary - buffer.getCurrentIndex();
+        if (!(DataTypeCodecUtils::decodeCgiField(buffer, data.cgi, lengthLeft)))
+        {
+            errorStream.add((char *)"Failed to decode: cgi\n");
+            return false;
+        }
+    }
+
+    if (data.saipresent)
+    {
+        lengthLeft = ieBoundary - buffer.getCurrentIndex();
+        if (!(DataTypeCodecUtils::decodeSaiField(buffer, data.sai, lengthLeft)))
+        {
+            errorStream.add((char *)"Failed to decode: sai\n");
+            return false;
+        }
+    }
+
+    if (data.raipresent)
+    {
+        lengthLeft = ieBoundary - buffer.getCurrentIndex();
+        if (!(DataTypeCodecUtils::decodeRaiField(buffer, data.rai, lengthLeft)))
+        {
+            errorStream.add((char *)"Failed to decode: rai\n");
+            return false;
+        }
+    }
+
+    if (data.taipresent)
+    {
+        lengthLeft = ieBoundary - buffer.getCurrentIndex();
+        if (!(DataTypeCodecUtils::decodeTaiField(buffer, data.tai, lengthLeft)))
+        {
+            errorStream.add((char *)"Failed to decode: tai\n");
+            return false;
+        }
+    }
+
+    if (data.ecgipresent)
+    {
+        lengthLeft = ieBoundary - buffer.getCurrentIndex();
+        if (!(DataTypeCodecUtils::decodeEcgiField(buffer, data.ecgi, lengthLeft)))
+        {
+            errorStream.add((char *)"Failed to decode: ecgi\n");
+            return false;
+        }
+    }
+
+    if (data.laipresent)
+    {
+        lengthLeft = ieBoundary - buffer.getCurrentIndex();
+        if (!(DataTypeCodecUtils::decodeLaiField(buffer, data.lai, lengthLeft)))
+        {
+            errorStream.add((char *)"Failed to decode: lai\n");
+            return false;
+        }
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE UliIe\n");
+        return false;
+    }
+}
+void UliIe::displayUliIe_v(UliIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"UliIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add( (char *)"laipresent: "); 
+    stream.add((Uint8)data.laipresent);
+    stream.endOfLine();
+  
+    stream.add( (char *)"ecgipresent: "); 
+    stream.add((Uint8)data.ecgipresent);
+    stream.endOfLine();
+  
+    stream.add( (char *)"taipresent: "); 
+    stream.add((Uint8)data.taipresent);
+    stream.endOfLine();
+  
+    stream.add( (char *)"raipresent: "); 
+    stream.add((Uint8)data.raipresent);
+    stream.endOfLine();
+  
+    stream.add( (char *)"saipresent: "); 
+    stream.add((Uint8)data.saipresent);
+    stream.endOfLine();
+  
+    stream.add( (char *)"cgipresent: "); 
+    stream.add((Uint8)data.cgipresent);
+    stream.endOfLine();
+  
+    if (data.cgipresent)
+    {
+        stream.add((char *)"cgi:");
+        stream.endOfLine();
+        DataTypeCodecUtils::displayCgiField_v(data.cgi, stream);
+    }
+  
+    if (data.saipresent)
+    {
+        stream.add((char *)"sai:");
+        stream.endOfLine();
+        DataTypeCodecUtils::displaySaiField_v(data.sai, stream);
+    }
+  
+    if (data.raipresent)
+    {
+        stream.add((char *)"rai:");
+        stream.endOfLine();
+        DataTypeCodecUtils::displayRaiField_v(data.rai, stream);
+    }
+  
+    if (data.taipresent)
+    {
+        stream.add((char *)"tai:");
+        stream.endOfLine();
+        DataTypeCodecUtils::displayTaiField_v(data.tai, stream);
+    }
+  
+    if (data.ecgipresent)
+    {
+        stream.add((char *)"ecgi:");
+        stream.endOfLine();
+        DataTypeCodecUtils::displayEcgiField_v(data.ecgi, stream);
+    }
+  
+    if (data.laipresent)
+    {
+        stream.add((char *)"lai:");
+        stream.endOfLine();
+        DataTypeCodecUtils::displayLaiField_v(data.lai, stream);
+    }
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/uliIe.h b/src/gtpV2Codec/ieClasses/uliIe.h
new file mode 100644
index 0000000..b145bc5
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/uliIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef ULIIE_H_
+#define ULIIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class UliIe: public GtpV2Ie {
+public:
+    UliIe();
+    virtual ~UliIe();
+
+    bool encodeUliIe(MsgBuffer &buffer,
+                 UliIeData const &data);
+    bool decodeUliIe(MsgBuffer &buffer,
+                 UliIeData &data, Uint16 length);
+    void displayUliIe_v(UliIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* ULIIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/uliTimestampIe.cpp b/src/gtpV2Codec/ieClasses/uliTimestampIe.cpp
new file mode 100644
index 0000000..a5f9adc
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/uliTimestampIe.cpp
@@ -0,0 +1,77 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "uliTimestampIe.h"
+#include "dataTypeCodecUtils.h"
+
+UliTimestampIe::UliTimestampIe() 
+{
+    ieType = 170;
+    // TODO
+
+}
+
+UliTimestampIe::~UliTimestampIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool UliTimestampIe::encodeUliTimestampIe(MsgBuffer &buffer, UliTimestampIeData const &data)
+{
+    if (!(buffer.writeUint32(data.uliTimestampvalue)))
+    {
+        errorStream.add((char *)"Encoding of uliTimestampvalue failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool UliTimestampIe::decodeUliTimestampIe(MsgBuffer &buffer, UliTimestampIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+
+    buffer.readUint32(data.uliTimestampvalue);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: uliTimestampvalue\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE UliTimestampIe\n");
+        return false;
+    }
+}
+void UliTimestampIe::displayUliTimestampIe_v(UliTimestampIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"UliTimestampIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add((char *)"uliTimestampvalue: ");
+    stream.add(data.uliTimestampvalue);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/uliTimestampIe.h b/src/gtpV2Codec/ieClasses/uliTimestampIe.h
new file mode 100644
index 0000000..4ac24b4
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/uliTimestampIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef ULITIMESTAMPIE_H_
+#define ULITIMESTAMPIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class UliTimestampIe: public GtpV2Ie {
+public:
+    UliTimestampIe();
+    virtual ~UliTimestampIe();
+
+    bool encodeUliTimestampIe(MsgBuffer &buffer,
+                 UliTimestampIeData const &data);
+    bool decodeUliTimestampIe(MsgBuffer &buffer,
+                 UliTimestampIeData &data, Uint16 length);
+    void displayUliTimestampIe_v(UliTimestampIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* ULITIMESTAMPIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/ieClasses/upFunctionSelectionIndicationFlagsIe.cpp b/src/gtpV2Codec/ieClasses/upFunctionSelectionIndicationFlagsIe.cpp
new file mode 100644
index 0000000..7246448
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/upFunctionSelectionIndicationFlagsIe.cpp
@@ -0,0 +1,86 @@
+/*
+ * 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/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "upFunctionSelectionIndicationFlagsIe.h"
+#include "dataTypeCodecUtils.h"
+
+UpFunctionSelectionIndicationFlagsIe::UpFunctionSelectionIndicationFlagsIe() 
+{
+    ieType = 202;
+    // TODO
+
+}
+
+UpFunctionSelectionIndicationFlagsIe::~UpFunctionSelectionIndicationFlagsIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool UpFunctionSelectionIndicationFlagsIe::encodeUpFunctionSelectionIndicationFlagsIe(MsgBuffer &buffer, UpFunctionSelectionIndicationFlagsIeData const &data)
+{
+    buffer.skipBits(4);
+
+    if(!(buffer.writeBits(data.dcnr, 4)))
+    {
+        errorStream.add((char *)"Encoding of dcnr failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool UpFunctionSelectionIndicationFlagsIe::decodeUpFunctionSelectionIndicationFlagsIe(MsgBuffer &buffer, UpFunctionSelectionIndicationFlagsIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+    buffer.skipBits(4);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: \n");
+        return false;
+    }
+
+    data.dcnr = buffer.readBits(4);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: dcnr\n");
+        return false;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE UpFunctionSelectionIndicationFlagsIe\n");
+        return false;
+    }
+}
+void UpFunctionSelectionIndicationFlagsIe::displayUpFunctionSelectionIndicationFlagsIe_v(UpFunctionSelectionIndicationFlagsIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"UpFunctionSelectionIndicationFlagsIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add( (char *)"dcnr: "); 
+    stream.add((Uint8)data.dcnr);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/src/gtpV2Codec/ieClasses/upFunctionSelectionIndicationFlagsIe.h b/src/gtpV2Codec/ieClasses/upFunctionSelectionIndicationFlagsIe.h
new file mode 100644
index 0000000..4d492c9
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/upFunctionSelectionIndicationFlagsIe.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/ietemplate.h.tt>
+ ******************************************************************************/
+#ifndef UPFUNCTIONSELECTIONINDICATIONFLAGSIE_H_
+#define UPFUNCTIONSELECTIONINDICATIONFLAGSIE_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class UpFunctionSelectionIndicationFlagsIe: public GtpV2Ie {
+public:
+    UpFunctionSelectionIndicationFlagsIe();
+    virtual ~UpFunctionSelectionIndicationFlagsIe();
+
+    bool encodeUpFunctionSelectionIndicationFlagsIe(MsgBuffer &buffer,
+                 UpFunctionSelectionIndicationFlagsIeData const &data);
+    bool decodeUpFunctionSelectionIndicationFlagsIe(MsgBuffer &buffer,
+                 UpFunctionSelectionIndicationFlagsIeData &data, Uint16 length);
+    void displayUpFunctionSelectionIndicationFlagsIe_v(UpFunctionSelectionIndicationFlagsIeData const &data,
+                 Debug &stream);
+};
+
+#endif /* UPFUNCTIONSELECTIONINDICATIONFLAGSIE_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/msgClasses/createBearerRequestMsg.cpp b/src/gtpV2Codec/msgClasses/createBearerRequestMsg.cpp
new file mode 100644
index 0000000..3a849db
--- /dev/null
+++ b/src/gtpV2Codec/msgClasses/createBearerRequestMsg.cpp
@@ -0,0 +1,1296 @@
+/*
+ * 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/msgtemplate.cpp.tt>
+ ******************************************************************************/ 
+
+#include "createBearerRequestMsg.h"
+#include "../ieClasses/manual/gtpV2Ie.h"
+#include "../ieClasses/gtpV2IeFactory.h"
+#include "../ieClasses/ptiIe.h"
+#include "../ieClasses/ebiIe.h"
+#include "../ieClasses/pcoIe.h"
+#include "../ieClasses/bearerContextIe.h"
+#include "../ieClasses/bearerContextsInCreateBearerRequest.h"
+#include "../ieClasses/fqCsidIe.h"
+#include "../ieClasses/fqCsidIe.h"
+#include "../ieClasses/changeReportingActionIe.h"
+#include "../ieClasses/csgInformationReportingActionIe.h"
+#include "../ieClasses/henbInformationReportingIe.h"
+#include "../ieClasses/presenceReportingAreaActionIe.h"
+#include "../ieClasses/indicationIe.h"
+#include "../ieClasses/loadControlInformationIe.h"
+#include "../ieClasses/pgwsNodeLevelLoadControlInformationInCreateBearerRequest.h"
+#include "../ieClasses/loadControlInformationIe.h"
+#include "../ieClasses/pgwsApnLevelLoadControlInformationInCreateBearerRequest.h"
+#include "../ieClasses/loadControlInformationIe.h"
+#include "../ieClasses/sgwsNodeLevelLoadControlInformationInCreateBearerRequest.h"
+#include "../ieClasses/overloadControlInformationIe.h"
+#include "../ieClasses/pgwsOverloadControlInformationInCreateBearerRequest.h"
+#include "../ieClasses/overloadControlInformationIe.h"
+#include "../ieClasses/sgwsOverloadControlInformationInCreateBearerRequest.h"
+#include "../ieClasses/fContainerIe.h"
+
+CreateBearerRequestMsg::CreateBearerRequestMsg()
+{
+    msgType = CreateBearerRequestMsgType;
+    Uint16 mandIe;
+    mandIe = EbiIeType;
+    mandIe = (mandIe << 8) | 0; // linkedEpsBearerId
+    mandatoryIeSet.insert(mandIe);    mandIe = BearerContextIeType;
+    mandIe = (mandIe << 8) | 0; // bearerContexts
+    mandatoryIeSet.insert(mandIe);
+}
+
+CreateBearerRequestMsg::~CreateBearerRequestMsg()
+{
+
+}
+
+bool CreateBearerRequestMsg::encodeCreateBearerRequestMsg(MsgBuffer &buffer,
+                        CreateBearerRequestMsgData
+							const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+    if (data.procedureTransactionIdIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = PtiIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        PtiIe pti=
+        dynamic_cast<
+        PtiIe&>(GtpV2IeFactory::getInstance().getIeObject(PtiIeType));
+        rc = pti.encodePtiIe(buffer, data.procedureTransactionId);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: procedureTransactionId\n");
+            return false;
+        }
+    }
+
+    
+    // Encode the Ie Header
+    header.ieType = EbiIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    EbiIe ebi=
+    dynamic_cast<
+    EbiIe&>(GtpV2IeFactory::getInstance().getIeObject(EbiIeType));
+    rc = ebi.encodeEbiIe(buffer, data.linkedEpsBearerId);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+
+    if (!(rc))
+    { 
+        errorStream.add((char *)"Failed to encode IE: linkedEpsBearerId\n");
+        return false;
+    }
+
+    if (data.protocolConfigurationOptionsIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = PcoIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        PcoIe pco=
+        dynamic_cast<
+        PcoIe&>(GtpV2IeFactory::getInstance().getIeObject(PcoIeType));
+        rc = pco.encodePcoIe(buffer, data.protocolConfigurationOptions);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: protocolConfigurationOptions\n");
+            return false;
+        }
+    }
+
+        // First validate if the applicatoin provided more than the expected cardinality
+    if (data.bearerContextsCount > 11)
+    {
+        errorStream.add((char *)"Number of entries of bearerContexts exceeded\n");
+        errorStream.add((char *)"Expected count: 11 Received count: ");
+        errorStream.add((char *)"data.bearerContextsCount");
+        errorStream.endOfLine();
+        return false;
+    }
+    for (Uint8 i = 0; i < data.bearerContextsCount; i++)
+    {
+        // Encode the Ie Header
+        header.ieType = BearerContextIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        BearerContextIe bearerContext=
+        dynamic_cast<
+        BearerContextIe&>(GtpV2IeFactory::getInstance().
+        getIeObject(BearerContextIeType));
+        BearerContextsInCreateBearerRequest groupedIeInstance = dynamic_cast<BearerContextsInCreateBearerRequest&>(bearerContext.getGroupedIe(msgType, 0));
+        rc = groupedIeInstance.encodeBearerContextsInCreateBearerRequest(buffer, data.bearerContexts[i]);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+    }
+
+    if (!(rc))
+    { 
+        errorStream.add((char *)"Failed to encode IE: bearerContexts\n");
+        return false;
+    }
+
+    if (data.pgwFqCsidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FqCsidIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        rc = fqCsid.encodeFqCsidIe(buffer, data.pgwFqCsid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: pgwFqCsid\n");
+            return false;
+        }
+    }
+
+    if (data.sgwFqCsidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FqCsidIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        rc = fqCsid.encodeFqCsidIe(buffer, data.sgwFqCsid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: sgwFqCsid\n");
+            return false;
+        }
+    }
+
+    if (data.changeReportingActionIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = ChangeReportingActionIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        ChangeReportingActionIe changeReportingAction=
+        dynamic_cast<
+        ChangeReportingActionIe&>(GtpV2IeFactory::getInstance().getIeObject(ChangeReportingActionIeType));
+        rc = changeReportingAction.encodeChangeReportingActionIe(buffer, data.changeReportingAction);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: changeReportingAction\n");
+            return false;
+        }
+    }
+
+    if (data.csgInformationReportingActionIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = CsgInformationReportingActionIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        CsgInformationReportingActionIe csgInformationReportingAction=
+        dynamic_cast<
+        CsgInformationReportingActionIe&>(GtpV2IeFactory::getInstance().getIeObject(CsgInformationReportingActionIeType));
+        rc = csgInformationReportingAction.encodeCsgInformationReportingActionIe(buffer, data.csgInformationReportingAction);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: csgInformationReportingAction\n");
+            return false;
+        }
+    }
+
+    if (data.hNbInformationReportingIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = HenbInformationReportingIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        HenbInformationReportingIe henbInformationReporting=
+        dynamic_cast<
+        HenbInformationReportingIe&>(GtpV2IeFactory::getInstance().getIeObject(HenbInformationReportingIeType));
+        rc = henbInformationReporting.encodeHenbInformationReportingIe(buffer, data.hNbInformationReporting);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: hNbInformationReporting\n");
+            return false;
+        }
+    }
+
+    if (data.presenceReportingAreaActionIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = PresenceReportingAreaActionIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        PresenceReportingAreaActionIe presenceReportingAreaAction=
+        dynamic_cast<
+        PresenceReportingAreaActionIe&>(GtpV2IeFactory::getInstance().getIeObject(PresenceReportingAreaActionIeType));
+        rc = presenceReportingAreaAction.encodePresenceReportingAreaActionIe(buffer, data.presenceReportingAreaAction);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: presenceReportingAreaAction\n");
+            return false;
+        }
+    }
+
+    if (data.indicationFlagsIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = IndicationIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        IndicationIe indication=
+        dynamic_cast<
+        IndicationIe&>(GtpV2IeFactory::getInstance().getIeObject(IndicationIeType));
+        rc = indication.encodeIndicationIe(buffer, data.indicationFlags);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: indicationFlags\n");
+            return false;
+        }
+    }
+
+    if (data.pgwsNodeLevelLoadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = LoadControlInformationIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        LoadControlInformationIe loadControlInformation=
+        dynamic_cast<
+        LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+        PgwsNodeLevelLoadControlInformationInCreateBearerRequest groupedIeInstance =
+        dynamic_cast<
+         PgwsNodeLevelLoadControlInformationInCreateBearerRequest&>(loadControlInformation.getGroupedIe(msgType, 0));
+        rc = groupedIeInstance.encodePgwsNodeLevelLoadControlInformationInCreateBearerRequest(buffer, data.pgwsNodeLevelLoadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: pgwsNodeLevelLoadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.pgwsApnLevelLoadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = LoadControlInformationIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        LoadControlInformationIe loadControlInformation=
+        dynamic_cast<
+        LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+        PgwsApnLevelLoadControlInformationInCreateBearerRequest groupedIeInstance =
+        dynamic_cast<
+         PgwsApnLevelLoadControlInformationInCreateBearerRequest&>(loadControlInformation.getGroupedIe(msgType, 1));
+        rc = groupedIeInstance.encodePgwsApnLevelLoadControlInformationInCreateBearerRequest(buffer, data.pgwsApnLevelLoadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: pgwsApnLevelLoadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.sgwsNodeLevelLoadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = LoadControlInformationIeType;
+        header.instance = 2;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        LoadControlInformationIe loadControlInformation=
+        dynamic_cast<
+        LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+        SgwsNodeLevelLoadControlInformationInCreateBearerRequest groupedIeInstance =
+        dynamic_cast<
+         SgwsNodeLevelLoadControlInformationInCreateBearerRequest&>(loadControlInformation.getGroupedIe(msgType, 2));
+        rc = groupedIeInstance.encodeSgwsNodeLevelLoadControlInformationInCreateBearerRequest(buffer, data.sgwsNodeLevelLoadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: sgwsNodeLevelLoadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.pgwsOverloadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = OverloadControlInformationIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+        PgwsOverloadControlInformationInCreateBearerRequest groupedIeInstance =
+        dynamic_cast<
+         PgwsOverloadControlInformationInCreateBearerRequest&>(overloadControlInformation.getGroupedIe(msgType, 0));
+        rc = groupedIeInstance.encodePgwsOverloadControlInformationInCreateBearerRequest(buffer, data.pgwsOverloadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: pgwsOverloadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.sgwsOverloadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = OverloadControlInformationIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+        SgwsOverloadControlInformationInCreateBearerRequest groupedIeInstance =
+        dynamic_cast<
+         SgwsOverloadControlInformationInCreateBearerRequest&>(overloadControlInformation.getGroupedIe(msgType, 1));
+        rc = groupedIeInstance.encodeSgwsOverloadControlInformationInCreateBearerRequest(buffer, data.sgwsOverloadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: sgwsOverloadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.nbifomContainerIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FContainerIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FContainerIe fContainer=
+        dynamic_cast<
+        FContainerIe&>(GtpV2IeFactory::getInstance().getIeObject(FContainerIeType));
+        rc = fContainer.encodeFContainerIe(buffer, data.nbifomContainer);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: nbifomContainer\n");
+            return false;
+        }
+    }
+    return rc;
+
+}
+
+bool CreateBearerRequestMsg::decodeCreateBearerRequestMsg(MsgBuffer &buffer,
+ CreateBearerRequestMsgData 
+ &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+  
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+
+        switch (ieHeader.ieType){
+     
+            case PtiIeType:
+            {
+                PtiIe ieObject =
+                dynamic_cast<
+                PtiIe&>(GtpV2IeFactory::getInstance().getIeObject(PtiIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodePtiIe(buffer, data.procedureTransactionId, ieHeader.length);
+
+                    data.procedureTransactionIdIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: procedureTransactionId\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case EbiIeType:
+            {
+                EbiIe ieObject =
+                dynamic_cast<
+                EbiIe&>(GtpV2IeFactory::getInstance().getIeObject(EbiIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeEbiIe(buffer, data.linkedEpsBearerId, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: linkedEpsBearerId\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case PcoIeType:
+            {
+                PcoIe ieObject =
+                dynamic_cast<
+                PcoIe&>(GtpV2IeFactory::getInstance().getIeObject(PcoIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodePcoIe(buffer, data.protocolConfigurationOptions, ieHeader.length);
+
+                    data.protocolConfigurationOptionsIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: protocolConfigurationOptions\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case BearerContextIeType:
+            {
+                BearerContextIe ieObject =
+                dynamic_cast<
+                BearerContextIe&>(GtpV2IeFactory::getInstance().getIeObject(BearerContextIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					// First check if we have enough space left to decode and store this instance
+                    if (data.bearerContextsCount == 11)
+                    {
+                        errorStream.add((char *)"More than 11 instances of bearerContexts received\n");
+                        return false;
+                    }
+                    BearerContextsInCreateBearerRequest groupedIeInstance =
+                    dynamic_cast<
+                    BearerContextsInCreateBearerRequest&>(ieObject.getGroupedIe(msgType, 0));
+                    rc = groupedIeInstance.decodeBearerContextsInCreateBearerRequest(buffer,
+                    data.bearerContexts[data.bearerContextsCount], ieHeader.length);
+                    data.bearerContextsCount++; // TODO Count validation
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: bearerContexts\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case FqCsidIeType:
+            {
+                FqCsidIe ieObject =
+                dynamic_cast<
+                FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeFqCsidIe(buffer, data.pgwFqCsid, ieHeader.length);
+
+                    data.pgwFqCsidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: pgwFqCsid\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					rc = ieObject.decodeFqCsidIe(buffer, data.sgwFqCsid, ieHeader.length);
+
+                    data.sgwFqCsidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: sgwFqCsid\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case ChangeReportingActionIeType:
+            {
+                ChangeReportingActionIe ieObject =
+                dynamic_cast<
+                ChangeReportingActionIe&>(GtpV2IeFactory::getInstance().getIeObject(ChangeReportingActionIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeChangeReportingActionIe(buffer, data.changeReportingAction, ieHeader.length);
+
+                    data.changeReportingActionIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: changeReportingAction\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case CsgInformationReportingActionIeType:
+            {
+                CsgInformationReportingActionIe ieObject =
+                dynamic_cast<
+                CsgInformationReportingActionIe&>(GtpV2IeFactory::getInstance().getIeObject(CsgInformationReportingActionIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeCsgInformationReportingActionIe(buffer, data.csgInformationReportingAction, ieHeader.length);
+
+                    data.csgInformationReportingActionIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: csgInformationReportingAction\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case HenbInformationReportingIeType:
+            {
+                HenbInformationReportingIe ieObject =
+                dynamic_cast<
+                HenbInformationReportingIe&>(GtpV2IeFactory::getInstance().getIeObject(HenbInformationReportingIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeHenbInformationReportingIe(buffer, data.hNbInformationReporting, ieHeader.length);
+
+                    data.hNbInformationReportingIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: hNbInformationReporting\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case PresenceReportingAreaActionIeType:
+            {
+                PresenceReportingAreaActionIe ieObject =
+                dynamic_cast<
+                PresenceReportingAreaActionIe&>(GtpV2IeFactory::getInstance().getIeObject(PresenceReportingAreaActionIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodePresenceReportingAreaActionIe(buffer, data.presenceReportingAreaAction, ieHeader.length);
+
+                    data.presenceReportingAreaActionIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: presenceReportingAreaAction\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case IndicationIeType:
+            {
+                IndicationIe ieObject =
+                dynamic_cast<
+                IndicationIe&>(GtpV2IeFactory::getInstance().getIeObject(IndicationIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeIndicationIe(buffer, data.indicationFlags, ieHeader.length);
+
+                    data.indicationFlagsIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: indicationFlags\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case LoadControlInformationIeType:
+            {
+                LoadControlInformationIe ieObject =
+                dynamic_cast<
+                LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					PgwsNodeLevelLoadControlInformationInCreateBearerRequest groupedIeInstance =
+					dynamic_cast<
+					PgwsNodeLevelLoadControlInformationInCreateBearerRequest&>(ieObject.getGroupedIe(msgType, 0));
+					rc = groupedIeInstance.decodePgwsNodeLevelLoadControlInformationInCreateBearerRequest(buffer, data.pgwsNodeLevelLoadControlInformation, ieHeader.length);
+
+                    data.pgwsNodeLevelLoadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: pgwsNodeLevelLoadControlInformation\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					PgwsApnLevelLoadControlInformationInCreateBearerRequest groupedIeInstance =
+					dynamic_cast<
+					PgwsApnLevelLoadControlInformationInCreateBearerRequest&>(ieObject.getGroupedIe(msgType, 1));
+					rc = groupedIeInstance.decodePgwsApnLevelLoadControlInformationInCreateBearerRequest(buffer, data.pgwsApnLevelLoadControlInformation, ieHeader.length);
+
+                    data.pgwsApnLevelLoadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: pgwsApnLevelLoadControlInformation\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 2)
+                {
+					SgwsNodeLevelLoadControlInformationInCreateBearerRequest groupedIeInstance =
+					dynamic_cast<
+					SgwsNodeLevelLoadControlInformationInCreateBearerRequest&>(ieObject.getGroupedIe(msgType, 2));
+					rc = groupedIeInstance.decodeSgwsNodeLevelLoadControlInformationInCreateBearerRequest(buffer, data.sgwsNodeLevelLoadControlInformation, ieHeader.length);
+
+                    data.sgwsNodeLevelLoadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: sgwsNodeLevelLoadControlInformation\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case OverloadControlInformationIeType:
+            {
+                OverloadControlInformationIe ieObject =
+                dynamic_cast<
+                OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					PgwsOverloadControlInformationInCreateBearerRequest groupedIeInstance =
+					dynamic_cast<
+					PgwsOverloadControlInformationInCreateBearerRequest&>(ieObject.getGroupedIe(msgType, 0));
+					rc = groupedIeInstance.decodePgwsOverloadControlInformationInCreateBearerRequest(buffer, data.pgwsOverloadControlInformation, ieHeader.length);
+
+                    data.pgwsOverloadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: pgwsOverloadControlInformation\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					SgwsOverloadControlInformationInCreateBearerRequest groupedIeInstance =
+					dynamic_cast<
+					SgwsOverloadControlInformationInCreateBearerRequest&>(ieObject.getGroupedIe(msgType, 1));
+					rc = groupedIeInstance.decodeSgwsOverloadControlInformationInCreateBearerRequest(buffer, data.sgwsOverloadControlInformation, ieHeader.length);
+
+                    data.sgwsOverloadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: sgwsOverloadControlInformation\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case FContainerIeType:
+            {
+                FContainerIe ieObject =
+                dynamic_cast<
+                FContainerIe&>(GtpV2IeFactory::getInstance().getIeObject(FContainerIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeFContainerIe(buffer, data.nbifomContainer, ieHeader.length);
+
+                    data.nbifomContainerIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: nbifomContainer\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+
+            default:
+            {
+                // Unknown IE print error
+                errorStream.add((char *)"Unknown IE Type: ");
+                errorStream.add(ieHeader.ieType);
+                errorStream.endOfLine();
+                buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    return rc; // TODO validations
+}
+
+void CreateBearerRequestMsg::
+displayCreateBearerRequestMsgData_v(CreateBearerRequestMsgData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"CreateBearerRequestMsg:");
+    stream.endOfLine();
+    stream.incrIndent();
+        
+    
+    if (data.procedureTransactionIdIePresent)
+    {
+
+
+        stream.add((char *)"IE - procedureTransactionId:");
+        stream.endOfLine();
+        PtiIe pti=
+        dynamic_cast<
+        PtiIe&>(GtpV2IeFactory::getInstance().getIeObject(PtiIeType));
+        pti.displayPtiIe_v(data.procedureTransactionId, stream);
+
+    }
+        stream.add((char *)"IE - linkedEpsBearerId:");
+        stream.endOfLine();
+        EbiIe ebi=
+        dynamic_cast<
+        EbiIe&>(GtpV2IeFactory::getInstance().getIeObject(EbiIeType));
+        ebi.displayEbiIe_v(data.linkedEpsBearerId, stream);
+
+    if (data.protocolConfigurationOptionsIePresent)
+    {
+
+
+        stream.add((char *)"IE - protocolConfigurationOptions:");
+        stream.endOfLine();
+        PcoIe pco=
+        dynamic_cast<
+        PcoIe&>(GtpV2IeFactory::getInstance().getIeObject(PcoIeType));
+        pco.displayPcoIe_v(data.protocolConfigurationOptions, stream);
+
+    }
+
+    Uint8 displayCount;
+    
+    displayCount = data.bearerContextsCount;
+    if (displayCount > 11)
+    {
+        stream.add((char *)"Invalid data more than 11 instances");
+        stream.endOfLine();
+        stream.add((char *)"Displaying only 11");
+        stream.endOfLine();
+        displayCount = 11;
+    }
+    for (Uint8 i = 0; i < displayCount; i++)
+    {
+        stream.add((char *)"IE -  bearerContexts:");
+        stream.endOfLine();
+        BearerContextIe bearerContext=
+        dynamic_cast<
+        BearerContextIe&>(GtpV2IeFactory::getInstance().getIeObject(BearerContextIeType));
+        BearerContextsInCreateBearerRequest groupedIeInstance =
+        dynamic_cast<
+        BearerContextsInCreateBearerRequest&>(bearerContext.getGroupedIe(msgType, 0));
+        groupedIeInstance.displayBearerContextsInCreateBearerRequestData_v(data.bearerContexts[i], stream);
+
+    }
+    if (data.pgwFqCsidIePresent)
+    {
+
+
+        stream.add((char *)"IE - pgwFqCsid:");
+        stream.endOfLine();
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        fqCsid.displayFqCsidIe_v(data.pgwFqCsid, stream);
+
+    }
+    if (data.sgwFqCsidIePresent)
+    {
+
+
+        stream.add((char *)"IE - sgwFqCsid:");
+        stream.endOfLine();
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        fqCsid.displayFqCsidIe_v(data.sgwFqCsid, stream);
+
+    }
+    if (data.changeReportingActionIePresent)
+    {
+
+
+        stream.add((char *)"IE - changeReportingAction:");
+        stream.endOfLine();
+        ChangeReportingActionIe changeReportingAction=
+        dynamic_cast<
+        ChangeReportingActionIe&>(GtpV2IeFactory::getInstance().getIeObject(ChangeReportingActionIeType));
+        changeReportingAction.displayChangeReportingActionIe_v(data.changeReportingAction, stream);
+
+    }
+    if (data.csgInformationReportingActionIePresent)
+    {
+
+
+        stream.add((char *)"IE - csgInformationReportingAction:");
+        stream.endOfLine();
+        CsgInformationReportingActionIe csgInformationReportingAction=
+        dynamic_cast<
+        CsgInformationReportingActionIe&>(GtpV2IeFactory::getInstance().getIeObject(CsgInformationReportingActionIeType));
+        csgInformationReportingAction.displayCsgInformationReportingActionIe_v(data.csgInformationReportingAction, stream);
+
+    }
+    if (data.hNbInformationReportingIePresent)
+    {
+
+
+        stream.add((char *)"IE - hNbInformationReporting:");
+        stream.endOfLine();
+        HenbInformationReportingIe henbInformationReporting=
+        dynamic_cast<
+        HenbInformationReportingIe&>(GtpV2IeFactory::getInstance().getIeObject(HenbInformationReportingIeType));
+        henbInformationReporting.displayHenbInformationReportingIe_v(data.hNbInformationReporting, stream);
+
+    }
+    if (data.presenceReportingAreaActionIePresent)
+    {
+
+
+        stream.add((char *)"IE - presenceReportingAreaAction:");
+        stream.endOfLine();
+        PresenceReportingAreaActionIe presenceReportingAreaAction=
+        dynamic_cast<
+        PresenceReportingAreaActionIe&>(GtpV2IeFactory::getInstance().getIeObject(PresenceReportingAreaActionIeType));
+        presenceReportingAreaAction.displayPresenceReportingAreaActionIe_v(data.presenceReportingAreaAction, stream);
+
+    }
+    if (data.indicationFlagsIePresent)
+    {
+
+
+        stream.add((char *)"IE - indicationFlags:");
+        stream.endOfLine();
+        IndicationIe indication=
+        dynamic_cast<
+        IndicationIe&>(GtpV2IeFactory::getInstance().getIeObject(IndicationIeType));
+        indication.displayIndicationIe_v(data.indicationFlags, stream);
+
+    }
+    if (data.pgwsNodeLevelLoadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - pgwsNodeLevelLoadControlInformation:");
+        stream.endOfLine();
+        LoadControlInformationIe loadControlInformation=
+        dynamic_cast<
+        LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+            PgwsNodeLevelLoadControlInformationInCreateBearerRequest groupedIeInstance =
+        dynamic_cast<
+        PgwsNodeLevelLoadControlInformationInCreateBearerRequest&>(loadControlInformation.getGroupedIe(msgType, 0));
+        groupedIeInstance.displayPgwsNodeLevelLoadControlInformationInCreateBearerRequestData_v(data.pgwsNodeLevelLoadControlInformation, stream);
+
+    }
+    if (data.pgwsApnLevelLoadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - pgwsApnLevelLoadControlInformation:");
+        stream.endOfLine();
+        LoadControlInformationIe loadControlInformation=
+        dynamic_cast<
+        LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+            PgwsApnLevelLoadControlInformationInCreateBearerRequest groupedIeInstance =
+        dynamic_cast<
+        PgwsApnLevelLoadControlInformationInCreateBearerRequest&>(loadControlInformation.getGroupedIe(msgType, 1));
+        groupedIeInstance.displayPgwsApnLevelLoadControlInformationInCreateBearerRequestData_v(data.pgwsApnLevelLoadControlInformation, stream);
+
+    }
+    if (data.sgwsNodeLevelLoadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - sgwsNodeLevelLoadControlInformation:");
+        stream.endOfLine();
+        LoadControlInformationIe loadControlInformation=
+        dynamic_cast<
+        LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+            SgwsNodeLevelLoadControlInformationInCreateBearerRequest groupedIeInstance =
+        dynamic_cast<
+        SgwsNodeLevelLoadControlInformationInCreateBearerRequest&>(loadControlInformation.getGroupedIe(msgType, 2));
+        groupedIeInstance.displaySgwsNodeLevelLoadControlInformationInCreateBearerRequestData_v(data.sgwsNodeLevelLoadControlInformation, stream);
+
+    }
+    if (data.pgwsOverloadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - pgwsOverloadControlInformation:");
+        stream.endOfLine();
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+            PgwsOverloadControlInformationInCreateBearerRequest groupedIeInstance =
+        dynamic_cast<
+        PgwsOverloadControlInformationInCreateBearerRequest&>(overloadControlInformation.getGroupedIe(msgType, 0));
+        groupedIeInstance.displayPgwsOverloadControlInformationInCreateBearerRequestData_v(data.pgwsOverloadControlInformation, stream);
+
+    }
+    if (data.sgwsOverloadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - sgwsOverloadControlInformation:");
+        stream.endOfLine();
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+            SgwsOverloadControlInformationInCreateBearerRequest groupedIeInstance =
+        dynamic_cast<
+        SgwsOverloadControlInformationInCreateBearerRequest&>(overloadControlInformation.getGroupedIe(msgType, 1));
+        groupedIeInstance.displaySgwsOverloadControlInformationInCreateBearerRequestData_v(data.sgwsOverloadControlInformation, stream);
+
+    }
+    if (data.nbifomContainerIePresent)
+    {
+
+
+        stream.add((char *)"IE - nbifomContainer:");
+        stream.endOfLine();
+        FContainerIe fContainer=
+        dynamic_cast<
+        FContainerIe&>(GtpV2IeFactory::getInstance().getIeObject(FContainerIeType));
+        fContainer.displayFContainerIe_v(data.nbifomContainer, stream);
+
+    }
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
diff --git a/src/gtpV2Codec/msgClasses/createBearerRequestMsg.h b/src/gtpV2Codec/msgClasses/createBearerRequestMsg.h
new file mode 100644
index 0000000..96e6ede
--- /dev/null
+++ b/src/gtpV2Codec/msgClasses/createBearerRequestMsg.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/msgtemplate.h.tt>
+ ******************************************************************************/
+#ifndef CREATEBEARERREQUESTMSG_H_
+#define CREATEBEARERREQUESTMSG_H_
+
+#include <set>
+#include "manual/gtpV2Message.h"
+#include <msgBuffer.h>
+#include <debug.h>
+#include "gtpV2MsgDataTypes.h"
+
+
+class CreateBearerRequestMsg:public GtpV2Message
+{
+public:
+    CreateBearerRequestMsg();
+    virtual ~CreateBearerRequestMsg();
+    bool encodeCreateBearerRequestMsg(MsgBuffer &buffer, CreateBearerRequestMsgData const &data);
+
+    bool decodeCreateBearerRequestMsg (MsgBuffer &buffer, CreateBearerRequestMsgData& data, Uint16 length);
+
+    void displayCreateBearerRequestMsgData_v(CreateBearerRequestMsgData const &data, Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/msgClasses/createBearerResponseMsg.cpp b/src/gtpV2Codec/msgClasses/createBearerResponseMsg.cpp
new file mode 100644
index 0000000..1d7dc6f
--- /dev/null
+++ b/src/gtpV2Codec/msgClasses/createBearerResponseMsg.cpp
@@ -0,0 +1,1484 @@
+/*
+ * 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/msgtemplate.cpp.tt>
+ ******************************************************************************/ 
+
+#include "createBearerResponseMsg.h"
+#include "../ieClasses/manual/gtpV2Ie.h"
+#include "../ieClasses/gtpV2IeFactory.h"
+#include "../ieClasses/causeIe.h"
+#include "../ieClasses/bearerContextIe.h"
+#include "../ieClasses/bearerContextsInCreateBearerResponse.h"
+#include "../ieClasses/recoveryIe.h"
+#include "../ieClasses/fqCsidIe.h"
+#include "../ieClasses/fqCsidIe.h"
+#include "../ieClasses/fqCsidIe.h"
+#include "../ieClasses/fqCsidIe.h"
+#include "../ieClasses/pcoIe.h"
+#include "../ieClasses/ueTimeZoneIe.h"
+#include "../ieClasses/uliIe.h"
+#include "../ieClasses/twanIdentifierIe.h"
+#include "../ieClasses/overloadControlInformationIe.h"
+#include "../ieClasses/mmeS4SgsnsOverloadControlInformationInCreateBearerResponse.h"
+#include "../ieClasses/overloadControlInformationIe.h"
+#include "../ieClasses/sgwsOverloadControlInformationInCreateBearerResponse.h"
+#include "../ieClasses/ipAddressIe.h"
+#include "../ieClasses/overloadControlInformationIe.h"
+#include "../ieClasses/twanEpdgsOverloadControlInformationInCreateBearerResponse.h"
+#include "../ieClasses/twanIdentifierIe.h"
+#include "../ieClasses/twanIdentifierTimestampIe.h"
+#include "../ieClasses/ipAddressIe.h"
+#include "../ieClasses/portNumberIe.h"
+#include "../ieClasses/fContainerIe.h"
+#include "../ieClasses/portNumberIe.h"
+
+CreateBearerResponseMsg::CreateBearerResponseMsg()
+{
+    msgType = CreateBearerResponseMsgType;
+    Uint16 mandIe;
+    mandIe = CauseIeType;
+    mandIe = (mandIe << 8) | 0; // cause
+    mandatoryIeSet.insert(mandIe);    mandIe = BearerContextIeType;
+    mandIe = (mandIe << 8) | 0; // bearerContexts
+    mandatoryIeSet.insert(mandIe);
+}
+
+CreateBearerResponseMsg::~CreateBearerResponseMsg()
+{
+
+}
+
+bool CreateBearerResponseMsg::encodeCreateBearerResponseMsg(MsgBuffer &buffer,
+                        CreateBearerResponseMsgData
+							const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+    
+    // Encode the Ie Header
+    header.ieType = CauseIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    CauseIe cause=
+    dynamic_cast<
+    CauseIe&>(GtpV2IeFactory::getInstance().getIeObject(CauseIeType));
+    rc = cause.encodeCauseIe(buffer, data.cause);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+
+    if (!(rc))
+    { 
+        errorStream.add((char *)"Failed to encode IE: cause\n");
+        return false;
+    }
+
+        // First validate if the applicatoin provided more than the expected cardinality
+    if (data.bearerContextsCount > 11)
+    {
+        errorStream.add((char *)"Number of entries of bearerContexts exceeded\n");
+        errorStream.add((char *)"Expected count: 11 Received count: ");
+        errorStream.add((char *)"data.bearerContextsCount");
+        errorStream.endOfLine();
+        return false;
+    }
+    for (Uint8 i = 0; i < data.bearerContextsCount; i++)
+    {
+        // Encode the Ie Header
+        header.ieType = BearerContextIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        BearerContextIe bearerContext=
+        dynamic_cast<
+        BearerContextIe&>(GtpV2IeFactory::getInstance().
+        getIeObject(BearerContextIeType));
+        BearerContextsInCreateBearerResponse groupedIeInstance = dynamic_cast<BearerContextsInCreateBearerResponse&>(bearerContext.getGroupedIe(msgType, 0));
+        rc = groupedIeInstance.encodeBearerContextsInCreateBearerResponse(buffer, data.bearerContexts[i]);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+    }
+
+    if (!(rc))
+    { 
+        errorStream.add((char *)"Failed to encode IE: bearerContexts\n");
+        return false;
+    }
+
+    if (data.recoveryIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = RecoveryIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        RecoveryIe recovery=
+        dynamic_cast<
+        RecoveryIe&>(GtpV2IeFactory::getInstance().getIeObject(RecoveryIeType));
+        rc = recovery.encodeRecoveryIe(buffer, data.recovery);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: recovery\n");
+            return false;
+        }
+    }
+
+    if (data.mmeFqCsidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FqCsidIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        rc = fqCsid.encodeFqCsidIe(buffer, data.mmeFqCsid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: mmeFqCsid\n");
+            return false;
+        }
+    }
+
+    if (data.sgwFqCsidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FqCsidIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        rc = fqCsid.encodeFqCsidIe(buffer, data.sgwFqCsid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: sgwFqCsid\n");
+            return false;
+        }
+    }
+
+    if (data.epdgFqCsidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FqCsidIeType;
+        header.instance = 2;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        rc = fqCsid.encodeFqCsidIe(buffer, data.epdgFqCsid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: epdgFqCsid\n");
+            return false;
+        }
+    }
+
+    if (data.twanFqCsidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FqCsidIeType;
+        header.instance = 3;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        rc = fqCsid.encodeFqCsidIe(buffer, data.twanFqCsid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: twanFqCsid\n");
+            return false;
+        }
+    }
+
+    if (data.protocolConfigurationOptionsIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = PcoIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        PcoIe pco=
+        dynamic_cast<
+        PcoIe&>(GtpV2IeFactory::getInstance().getIeObject(PcoIeType));
+        rc = pco.encodePcoIe(buffer, data.protocolConfigurationOptions);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: protocolConfigurationOptions\n");
+            return false;
+        }
+    }
+
+    if (data.ueTimeZoneIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = UeTimeZoneIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        UeTimeZoneIe ueTimeZone=
+        dynamic_cast<
+        UeTimeZoneIe&>(GtpV2IeFactory::getInstance().getIeObject(UeTimeZoneIeType));
+        rc = ueTimeZone.encodeUeTimeZoneIe(buffer, data.ueTimeZone);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: ueTimeZone\n");
+            return false;
+        }
+    }
+
+    if (data.userLocationInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = UliIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        UliIe uli=
+        dynamic_cast<
+        UliIe&>(GtpV2IeFactory::getInstance().getIeObject(UliIeType));
+        rc = uli.encodeUliIe(buffer, data.userLocationInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: userLocationInformation\n");
+            return false;
+        }
+    }
+
+    if (data.twanIdentifierIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = TwanIdentifierIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        TwanIdentifierIe twanIdentifier=
+        dynamic_cast<
+        TwanIdentifierIe&>(GtpV2IeFactory::getInstance().getIeObject(TwanIdentifierIeType));
+        rc = twanIdentifier.encodeTwanIdentifierIe(buffer, data.twanIdentifier);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: twanIdentifier\n");
+            return false;
+        }
+    }
+
+    if (data.mmeS4SgsnsOverloadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = OverloadControlInformationIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+        MmeS4SgsnsOverloadControlInformationInCreateBearerResponse groupedIeInstance =
+        dynamic_cast<
+         MmeS4SgsnsOverloadControlInformationInCreateBearerResponse&>(overloadControlInformation.getGroupedIe(msgType, 0));
+        rc = groupedIeInstance.encodeMmeS4SgsnsOverloadControlInformationInCreateBearerResponse(buffer, data.mmeS4SgsnsOverloadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: mmeS4SgsnsOverloadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.sgwsOverloadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = OverloadControlInformationIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+        SgwsOverloadControlInformationInCreateBearerResponse groupedIeInstance =
+        dynamic_cast<
+         SgwsOverloadControlInformationInCreateBearerResponse&>(overloadControlInformation.getGroupedIe(msgType, 1));
+        rc = groupedIeInstance.encodeSgwsOverloadControlInformationInCreateBearerResponse(buffer, data.sgwsOverloadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: sgwsOverloadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.mmeS4SgsnIdentifierIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = IpAddressIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        IpAddressIe ipAddress=
+        dynamic_cast<
+        IpAddressIe&>(GtpV2IeFactory::getInstance().getIeObject(IpAddressIeType));
+        rc = ipAddress.encodeIpAddressIe(buffer, data.mmeS4SgsnIdentifier);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: mmeS4SgsnIdentifier\n");
+            return false;
+        }
+    }
+
+    if (data.twanEpdgsOverloadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = OverloadControlInformationIeType;
+        header.instance = 2;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+        TwanEpdgsOverloadControlInformationInCreateBearerResponse groupedIeInstance =
+        dynamic_cast<
+         TwanEpdgsOverloadControlInformationInCreateBearerResponse&>(overloadControlInformation.getGroupedIe(msgType, 2));
+        rc = groupedIeInstance.encodeTwanEpdgsOverloadControlInformationInCreateBearerResponse(buffer, data.twanEpdgsOverloadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: twanEpdgsOverloadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.wlanLocationInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = TwanIdentifierIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        TwanIdentifierIe twanIdentifier=
+        dynamic_cast<
+        TwanIdentifierIe&>(GtpV2IeFactory::getInstance().getIeObject(TwanIdentifierIeType));
+        rc = twanIdentifier.encodeTwanIdentifierIe(buffer, data.wlanLocationInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: wlanLocationInformation\n");
+            return false;
+        }
+    }
+
+    if (data.wlanLocationTimestampIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = TwanIdentifierTimestampIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        TwanIdentifierTimestampIe twanIdentifierTimestamp=
+        dynamic_cast<
+        TwanIdentifierTimestampIe&>(GtpV2IeFactory::getInstance().getIeObject(TwanIdentifierTimestampIeType));
+        rc = twanIdentifierTimestamp.encodeTwanIdentifierTimestampIe(buffer, data.wlanLocationTimestamp);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: wlanLocationTimestamp\n");
+            return false;
+        }
+    }
+
+    if (data.ueLocalIpAddressIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = IpAddressIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        IpAddressIe ipAddress=
+        dynamic_cast<
+        IpAddressIe&>(GtpV2IeFactory::getInstance().getIeObject(IpAddressIeType));
+        rc = ipAddress.encodeIpAddressIe(buffer, data.ueLocalIpAddress);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: ueLocalIpAddress\n");
+            return false;
+        }
+    }
+
+    if (data.ueUdpPortIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = PortNumberIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        PortNumberIe portNumber=
+        dynamic_cast<
+        PortNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(PortNumberIeType));
+        rc = portNumber.encodePortNumberIe(buffer, data.ueUdpPort);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: ueUdpPort\n");
+            return false;
+        }
+    }
+
+    if (data.nbifomContainerIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FContainerIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FContainerIe fContainer=
+        dynamic_cast<
+        FContainerIe&>(GtpV2IeFactory::getInstance().getIeObject(FContainerIeType));
+        rc = fContainer.encodeFContainerIe(buffer, data.nbifomContainer);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: nbifomContainer\n");
+            return false;
+        }
+    }
+
+    if (data.ueTcpPortIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = PortNumberIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        PortNumberIe portNumber=
+        dynamic_cast<
+        PortNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(PortNumberIeType));
+        rc = portNumber.encodePortNumberIe(buffer, data.ueTcpPort);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: ueTcpPort\n");
+            return false;
+        }
+    }
+    return rc;
+
+}
+
+bool CreateBearerResponseMsg::decodeCreateBearerResponseMsg(MsgBuffer &buffer,
+ CreateBearerResponseMsgData 
+ &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+  
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+
+        switch (ieHeader.ieType){
+     
+            case CauseIeType:
+            {
+                CauseIe ieObject =
+                dynamic_cast<
+                CauseIe&>(GtpV2IeFactory::getInstance().getIeObject(CauseIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeCauseIe(buffer, data.cause, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: cause\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case BearerContextIeType:
+            {
+                BearerContextIe ieObject =
+                dynamic_cast<
+                BearerContextIe&>(GtpV2IeFactory::getInstance().getIeObject(BearerContextIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					// First check if we have enough space left to decode and store this instance
+                    if (data.bearerContextsCount == 11)
+                    {
+                        errorStream.add((char *)"More than 11 instances of bearerContexts received\n");
+                        return false;
+                    }
+                    BearerContextsInCreateBearerResponse groupedIeInstance =
+                    dynamic_cast<
+                    BearerContextsInCreateBearerResponse&>(ieObject.getGroupedIe(msgType, 0));
+                    rc = groupedIeInstance.decodeBearerContextsInCreateBearerResponse(buffer,
+                    data.bearerContexts[data.bearerContextsCount], ieHeader.length);
+                    data.bearerContextsCount++; // TODO Count validation
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: bearerContexts\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case RecoveryIeType:
+            {
+                RecoveryIe ieObject =
+                dynamic_cast<
+                RecoveryIe&>(GtpV2IeFactory::getInstance().getIeObject(RecoveryIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeRecoveryIe(buffer, data.recovery, ieHeader.length);
+
+                    data.recoveryIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: recovery\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case FqCsidIeType:
+            {
+                FqCsidIe ieObject =
+                dynamic_cast<
+                FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeFqCsidIe(buffer, data.mmeFqCsid, ieHeader.length);
+
+                    data.mmeFqCsidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: mmeFqCsid\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					rc = ieObject.decodeFqCsidIe(buffer, data.sgwFqCsid, ieHeader.length);
+
+                    data.sgwFqCsidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: sgwFqCsid\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 2)
+                {
+					rc = ieObject.decodeFqCsidIe(buffer, data.epdgFqCsid, ieHeader.length);
+
+                    data.epdgFqCsidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: epdgFqCsid\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 3)
+                {
+					rc = ieObject.decodeFqCsidIe(buffer, data.twanFqCsid, ieHeader.length);
+
+                    data.twanFqCsidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: twanFqCsid\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case PcoIeType:
+            {
+                PcoIe ieObject =
+                dynamic_cast<
+                PcoIe&>(GtpV2IeFactory::getInstance().getIeObject(PcoIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodePcoIe(buffer, data.protocolConfigurationOptions, ieHeader.length);
+
+                    data.protocolConfigurationOptionsIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: protocolConfigurationOptions\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case UeTimeZoneIeType:
+            {
+                UeTimeZoneIe ieObject =
+                dynamic_cast<
+                UeTimeZoneIe&>(GtpV2IeFactory::getInstance().getIeObject(UeTimeZoneIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeUeTimeZoneIe(buffer, data.ueTimeZone, ieHeader.length);
+
+                    data.ueTimeZoneIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: ueTimeZone\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case UliIeType:
+            {
+                UliIe ieObject =
+                dynamic_cast<
+                UliIe&>(GtpV2IeFactory::getInstance().getIeObject(UliIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeUliIe(buffer, data.userLocationInformation, ieHeader.length);
+
+                    data.userLocationInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: userLocationInformation\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case TwanIdentifierIeType:
+            {
+                TwanIdentifierIe ieObject =
+                dynamic_cast<
+                TwanIdentifierIe&>(GtpV2IeFactory::getInstance().getIeObject(TwanIdentifierIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeTwanIdentifierIe(buffer, data.twanIdentifier, ieHeader.length);
+
+                    data.twanIdentifierIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: twanIdentifier\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					rc = ieObject.decodeTwanIdentifierIe(buffer, data.wlanLocationInformation, ieHeader.length);
+
+                    data.wlanLocationInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: wlanLocationInformation\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case OverloadControlInformationIeType:
+            {
+                OverloadControlInformationIe ieObject =
+                dynamic_cast<
+                OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					MmeS4SgsnsOverloadControlInformationInCreateBearerResponse groupedIeInstance =
+					dynamic_cast<
+					MmeS4SgsnsOverloadControlInformationInCreateBearerResponse&>(ieObject.getGroupedIe(msgType, 0));
+					rc = groupedIeInstance.decodeMmeS4SgsnsOverloadControlInformationInCreateBearerResponse(buffer, data.mmeS4SgsnsOverloadControlInformation, ieHeader.length);
+
+                    data.mmeS4SgsnsOverloadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: mmeS4SgsnsOverloadControlInformation\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					SgwsOverloadControlInformationInCreateBearerResponse groupedIeInstance =
+					dynamic_cast<
+					SgwsOverloadControlInformationInCreateBearerResponse&>(ieObject.getGroupedIe(msgType, 1));
+					rc = groupedIeInstance.decodeSgwsOverloadControlInformationInCreateBearerResponse(buffer, data.sgwsOverloadControlInformation, ieHeader.length);
+
+                    data.sgwsOverloadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: sgwsOverloadControlInformation\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 2)
+                {
+					TwanEpdgsOverloadControlInformationInCreateBearerResponse groupedIeInstance =
+					dynamic_cast<
+					TwanEpdgsOverloadControlInformationInCreateBearerResponse&>(ieObject.getGroupedIe(msgType, 2));
+					rc = groupedIeInstance.decodeTwanEpdgsOverloadControlInformationInCreateBearerResponse(buffer, data.twanEpdgsOverloadControlInformation, ieHeader.length);
+
+                    data.twanEpdgsOverloadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: twanEpdgsOverloadControlInformation\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case IpAddressIeType:
+            {
+                IpAddressIe ieObject =
+                dynamic_cast<
+                IpAddressIe&>(GtpV2IeFactory::getInstance().getIeObject(IpAddressIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeIpAddressIe(buffer, data.mmeS4SgsnIdentifier, ieHeader.length);
+
+                    data.mmeS4SgsnIdentifierIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: mmeS4SgsnIdentifier\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeIpAddressIe(buffer, data.ueLocalIpAddress, ieHeader.length);
+
+                    data.ueLocalIpAddressIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: ueLocalIpAddress\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case TwanIdentifierTimestampIeType:
+            {
+                TwanIdentifierTimestampIe ieObject =
+                dynamic_cast<
+                TwanIdentifierTimestampIe&>(GtpV2IeFactory::getInstance().getIeObject(TwanIdentifierTimestampIeType));
+
+                if(ieHeader.instance == 1)
+                {
+					rc = ieObject.decodeTwanIdentifierTimestampIe(buffer, data.wlanLocationTimestamp, ieHeader.length);
+
+                    data.wlanLocationTimestampIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: wlanLocationTimestamp\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case PortNumberIeType:
+            {
+                PortNumberIe ieObject =
+                dynamic_cast<
+                PortNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(PortNumberIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodePortNumberIe(buffer, data.ueUdpPort, ieHeader.length);
+
+                    data.ueUdpPortIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: ueUdpPort\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					rc = ieObject.decodePortNumberIe(buffer, data.ueTcpPort, ieHeader.length);
+
+                    data.ueTcpPortIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: ueTcpPort\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case FContainerIeType:
+            {
+                FContainerIe ieObject =
+                dynamic_cast<
+                FContainerIe&>(GtpV2IeFactory::getInstance().getIeObject(FContainerIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeFContainerIe(buffer, data.nbifomContainer, ieHeader.length);
+
+                    data.nbifomContainerIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: nbifomContainer\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+
+            default:
+            {
+                // Unknown IE print error
+                errorStream.add((char *)"Unknown IE Type: ");
+                errorStream.add(ieHeader.ieType);
+                errorStream.endOfLine();
+                buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    return rc; // TODO validations
+}
+
+void CreateBearerResponseMsg::
+displayCreateBearerResponseMsgData_v(CreateBearerResponseMsgData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"CreateBearerResponseMsg:");
+    stream.endOfLine();
+    stream.incrIndent();
+        
+    
+        stream.add((char *)"IE - cause:");
+        stream.endOfLine();
+        CauseIe cause=
+        dynamic_cast<
+        CauseIe&>(GtpV2IeFactory::getInstance().getIeObject(CauseIeType));
+        cause.displayCauseIe_v(data.cause, stream);
+
+
+    Uint8 displayCount;
+    
+    displayCount = data.bearerContextsCount;
+    if (displayCount > 11)
+    {
+        stream.add((char *)"Invalid data more than 11 instances");
+        stream.endOfLine();
+        stream.add((char *)"Displaying only 11");
+        stream.endOfLine();
+        displayCount = 11;
+    }
+    for (Uint8 i = 0; i < displayCount; i++)
+    {
+        stream.add((char *)"IE -  bearerContexts:");
+        stream.endOfLine();
+        BearerContextIe bearerContext=
+        dynamic_cast<
+        BearerContextIe&>(GtpV2IeFactory::getInstance().getIeObject(BearerContextIeType));
+        BearerContextsInCreateBearerResponse groupedIeInstance =
+        dynamic_cast<
+        BearerContextsInCreateBearerResponse&>(bearerContext.getGroupedIe(msgType, 0));
+        groupedIeInstance.displayBearerContextsInCreateBearerResponseData_v(data.bearerContexts[i], stream);
+
+    }
+    if (data.recoveryIePresent)
+    {
+
+
+        stream.add((char *)"IE - recovery:");
+        stream.endOfLine();
+        RecoveryIe recovery=
+        dynamic_cast<
+        RecoveryIe&>(GtpV2IeFactory::getInstance().getIeObject(RecoveryIeType));
+        recovery.displayRecoveryIe_v(data.recovery, stream);
+
+    }
+    if (data.mmeFqCsidIePresent)
+    {
+
+
+        stream.add((char *)"IE - mmeFqCsid:");
+        stream.endOfLine();
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        fqCsid.displayFqCsidIe_v(data.mmeFqCsid, stream);
+
+    }
+    if (data.sgwFqCsidIePresent)
+    {
+
+
+        stream.add((char *)"IE - sgwFqCsid:");
+        stream.endOfLine();
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        fqCsid.displayFqCsidIe_v(data.sgwFqCsid, stream);
+
+    }
+    if (data.epdgFqCsidIePresent)
+    {
+
+
+        stream.add((char *)"IE - epdgFqCsid:");
+        stream.endOfLine();
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        fqCsid.displayFqCsidIe_v(data.epdgFqCsid, stream);
+
+    }
+    if (data.twanFqCsidIePresent)
+    {
+
+
+        stream.add((char *)"IE - twanFqCsid:");
+        stream.endOfLine();
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        fqCsid.displayFqCsidIe_v(data.twanFqCsid, stream);
+
+    }
+    if (data.protocolConfigurationOptionsIePresent)
+    {
+
+
+        stream.add((char *)"IE - protocolConfigurationOptions:");
+        stream.endOfLine();
+        PcoIe pco=
+        dynamic_cast<
+        PcoIe&>(GtpV2IeFactory::getInstance().getIeObject(PcoIeType));
+        pco.displayPcoIe_v(data.protocolConfigurationOptions, stream);
+
+    }
+    if (data.ueTimeZoneIePresent)
+    {
+
+
+        stream.add((char *)"IE - ueTimeZone:");
+        stream.endOfLine();
+        UeTimeZoneIe ueTimeZone=
+        dynamic_cast<
+        UeTimeZoneIe&>(GtpV2IeFactory::getInstance().getIeObject(UeTimeZoneIeType));
+        ueTimeZone.displayUeTimeZoneIe_v(data.ueTimeZone, stream);
+
+    }
+    if (data.userLocationInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - userLocationInformation:");
+        stream.endOfLine();
+        UliIe uli=
+        dynamic_cast<
+        UliIe&>(GtpV2IeFactory::getInstance().getIeObject(UliIeType));
+        uli.displayUliIe_v(data.userLocationInformation, stream);
+
+    }
+    if (data.twanIdentifierIePresent)
+    {
+
+
+        stream.add((char *)"IE - twanIdentifier:");
+        stream.endOfLine();
+        TwanIdentifierIe twanIdentifier=
+        dynamic_cast<
+        TwanIdentifierIe&>(GtpV2IeFactory::getInstance().getIeObject(TwanIdentifierIeType));
+        twanIdentifier.displayTwanIdentifierIe_v(data.twanIdentifier, stream);
+
+    }
+    if (data.mmeS4SgsnsOverloadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - mmeS4SgsnsOverloadControlInformation:");
+        stream.endOfLine();
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+            MmeS4SgsnsOverloadControlInformationInCreateBearerResponse groupedIeInstance =
+        dynamic_cast<
+        MmeS4SgsnsOverloadControlInformationInCreateBearerResponse&>(overloadControlInformation.getGroupedIe(msgType, 0));
+        groupedIeInstance.displayMmeS4SgsnsOverloadControlInformationInCreateBearerResponseData_v(data.mmeS4SgsnsOverloadControlInformation, stream);
+
+    }
+    if (data.sgwsOverloadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - sgwsOverloadControlInformation:");
+        stream.endOfLine();
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+            SgwsOverloadControlInformationInCreateBearerResponse groupedIeInstance =
+        dynamic_cast<
+        SgwsOverloadControlInformationInCreateBearerResponse&>(overloadControlInformation.getGroupedIe(msgType, 1));
+        groupedIeInstance.displaySgwsOverloadControlInformationInCreateBearerResponseData_v(data.sgwsOverloadControlInformation, stream);
+
+    }
+    if (data.mmeS4SgsnIdentifierIePresent)
+    {
+
+
+        stream.add((char *)"IE - mmeS4SgsnIdentifier:");
+        stream.endOfLine();
+        IpAddressIe ipAddress=
+        dynamic_cast<
+        IpAddressIe&>(GtpV2IeFactory::getInstance().getIeObject(IpAddressIeType));
+        ipAddress.displayIpAddressIe_v(data.mmeS4SgsnIdentifier, stream);
+
+    }
+    if (data.twanEpdgsOverloadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - twanEpdgsOverloadControlInformation:");
+        stream.endOfLine();
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+            TwanEpdgsOverloadControlInformationInCreateBearerResponse groupedIeInstance =
+        dynamic_cast<
+        TwanEpdgsOverloadControlInformationInCreateBearerResponse&>(overloadControlInformation.getGroupedIe(msgType, 2));
+        groupedIeInstance.displayTwanEpdgsOverloadControlInformationInCreateBearerResponseData_v(data.twanEpdgsOverloadControlInformation, stream);
+
+    }
+    if (data.wlanLocationInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - wlanLocationInformation:");
+        stream.endOfLine();
+        TwanIdentifierIe twanIdentifier=
+        dynamic_cast<
+        TwanIdentifierIe&>(GtpV2IeFactory::getInstance().getIeObject(TwanIdentifierIeType));
+        twanIdentifier.displayTwanIdentifierIe_v(data.wlanLocationInformation, stream);
+
+    }
+    if (data.wlanLocationTimestampIePresent)
+    {
+
+
+        stream.add((char *)"IE - wlanLocationTimestamp:");
+        stream.endOfLine();
+        TwanIdentifierTimestampIe twanIdentifierTimestamp=
+        dynamic_cast<
+        TwanIdentifierTimestampIe&>(GtpV2IeFactory::getInstance().getIeObject(TwanIdentifierTimestampIeType));
+        twanIdentifierTimestamp.displayTwanIdentifierTimestampIe_v(data.wlanLocationTimestamp, stream);
+
+    }
+    if (data.ueLocalIpAddressIePresent)
+    {
+
+
+        stream.add((char *)"IE - ueLocalIpAddress:");
+        stream.endOfLine();
+        IpAddressIe ipAddress=
+        dynamic_cast<
+        IpAddressIe&>(GtpV2IeFactory::getInstance().getIeObject(IpAddressIeType));
+        ipAddress.displayIpAddressIe_v(data.ueLocalIpAddress, stream);
+
+    }
+    if (data.ueUdpPortIePresent)
+    {
+
+
+        stream.add((char *)"IE - ueUdpPort:");
+        stream.endOfLine();
+        PortNumberIe portNumber=
+        dynamic_cast<
+        PortNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(PortNumberIeType));
+        portNumber.displayPortNumberIe_v(data.ueUdpPort, stream);
+
+    }
+    if (data.nbifomContainerIePresent)
+    {
+
+
+        stream.add((char *)"IE - nbifomContainer:");
+        stream.endOfLine();
+        FContainerIe fContainer=
+        dynamic_cast<
+        FContainerIe&>(GtpV2IeFactory::getInstance().getIeObject(FContainerIeType));
+        fContainer.displayFContainerIe_v(data.nbifomContainer, stream);
+
+    }
+    if (data.ueTcpPortIePresent)
+    {
+
+
+        stream.add((char *)"IE - ueTcpPort:");
+        stream.endOfLine();
+        PortNumberIe portNumber=
+        dynamic_cast<
+        PortNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(PortNumberIeType));
+        portNumber.displayPortNumberIe_v(data.ueTcpPort, stream);
+
+    }
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
diff --git a/src/gtpV2Codec/msgClasses/createBearerResponseMsg.h b/src/gtpV2Codec/msgClasses/createBearerResponseMsg.h
new file mode 100644
index 0000000..8e25965
--- /dev/null
+++ b/src/gtpV2Codec/msgClasses/createBearerResponseMsg.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/msgtemplate.h.tt>
+ ******************************************************************************/
+#ifndef CREATEBEARERRESPONSEMSG_H_
+#define CREATEBEARERRESPONSEMSG_H_
+
+#include <set>
+#include "manual/gtpV2Message.h"
+#include <msgBuffer.h>
+#include <debug.h>
+#include "gtpV2MsgDataTypes.h"
+
+
+class CreateBearerResponseMsg:public GtpV2Message
+{
+public:
+    CreateBearerResponseMsg();
+    virtual ~CreateBearerResponseMsg();
+    bool encodeCreateBearerResponseMsg(MsgBuffer &buffer, CreateBearerResponseMsgData const &data);
+
+    bool decodeCreateBearerResponseMsg (MsgBuffer &buffer, CreateBearerResponseMsgData& data, Uint16 length);
+
+    void displayCreateBearerResponseMsgData_v(CreateBearerResponseMsgData const &data, Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/msgClasses/createSessionRequestMsg.cpp b/src/gtpV2Codec/msgClasses/createSessionRequestMsg.cpp
new file mode 100644
index 0000000..943558a
--- /dev/null
+++ b/src/gtpV2Codec/msgClasses/createSessionRequestMsg.cpp
@@ -0,0 +1,4222 @@
+/*
+ * 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/msgtemplate.cpp.tt>
+ ******************************************************************************/ 
+
+#include "createSessionRequestMsg.h"
+#include "../ieClasses/manual/gtpV2Ie.h"
+#include "../ieClasses/gtpV2IeFactory.h"
+#include "../ieClasses/imsiIe.h"
+#include "../ieClasses/msisdnIe.h"
+#include "../ieClasses/meiIe.h"
+#include "../ieClasses/uliIe.h"
+#include "../ieClasses/servingNetworkIe.h"
+#include "../ieClasses/ratTypeIe.h"
+#include "../ieClasses/indicationIe.h"
+#include "../ieClasses/fTeidIe.h"
+#include "../ieClasses/fTeidIe.h"
+#include "../ieClasses/apnIe.h"
+#include "../ieClasses/selectionModeIe.h"
+#include "../ieClasses/pdnTypeIe.h"
+#include "../ieClasses/paaIe.h"
+#include "../ieClasses/apnRestrictionIe.h"
+#include "../ieClasses/ambrIe.h"
+#include "../ieClasses/ebiIe.h"
+#include "../ieClasses/twmiIe.h"
+#include "../ieClasses/pcoIe.h"
+#include "../ieClasses/bearerContextIe.h"
+#include "../ieClasses/bearerContextsToBeCreatedInCreateSessionRequest.h"
+#include "../ieClasses/bearerContextIe.h"
+#include "../ieClasses/bearerContextsToBeRemovedInCreateSessionRequest.h"
+#include "../ieClasses/traceInformationIe.h"
+#include "../ieClasses/recoveryIe.h"
+#include "../ieClasses/fqCsidIe.h"
+#include "../ieClasses/fqCsidIe.h"
+#include "../ieClasses/fqCsidIe.h"
+#include "../ieClasses/fqCsidIe.h"
+#include "../ieClasses/ueTimeZoneIe.h"
+#include "../ieClasses/uciIe.h"
+#include "../ieClasses/chargingCharacteristicsIe.h"
+#include "../ieClasses/localDistinguishedNameIe.h"
+#include "../ieClasses/localDistinguishedNameIe.h"
+#include "../ieClasses/localDistinguishedNameIe.h"
+#include "../ieClasses/localDistinguishedNameIe.h"
+#include "../ieClasses/signallingPriorityIndicationIe.h"
+#include "../ieClasses/ipAddressIe.h"
+#include "../ieClasses/portNumberIe.h"
+#include "../ieClasses/additionalProtocolConfigurationOptionsIe.h"
+#include "../ieClasses/ipAddressIe.h"
+#include "../ieClasses/portNumberIe.h"
+#include "../ieClasses/ipAddressIe.h"
+#include "../ieClasses/twanIdentifierIe.h"
+#include "../ieClasses/ipAddressIe.h"
+#include "../ieClasses/cnOperatorSelectionEntityIe.h"
+#include "../ieClasses/overloadControlInformationIe.h"
+#include "../ieClasses/mmeS4SgsnsOverloadControlInformationInCreateSessionRequest.h"
+#include "../ieClasses/overloadControlInformationIe.h"
+#include "../ieClasses/sgwsOverloadControlInformationInCreateSessionRequest.h"
+#include "../ieClasses/overloadControlInformationIe.h"
+#include "../ieClasses/twanEpdgsOverloadControlInformationInCreateSessionRequest.h"
+#include "../ieClasses/millisecondTimeStampIe.h"
+#include "../ieClasses/integerNumberIe.h"
+#include "../ieClasses/twanIdentifierIe.h"
+#include "../ieClasses/twanIdentifierTimestampIe.h"
+#include "../ieClasses/fContainerIe.h"
+#include "../ieClasses/remoteUeContextIe.h"
+#include "../ieClasses/remoteUeContextConnectedInCreateSessionRequest.h"
+#include "../ieClasses/nodeIdentifierIe.h"
+#include "../ieClasses/epcoIe.h"
+#include "../ieClasses/servingPlmnRateControlIe.h"
+#include "../ieClasses/counterIe.h"
+#include "../ieClasses/portNumberIe.h"
+#include "../ieClasses/mappedUeUsageTypeIe.h"
+#include "../ieClasses/uliIe.h"
+#include "../ieClasses/fqdnIe.h"
+#include "../ieClasses/secondaryRatUsageDataReportIe.h"
+#include "../ieClasses/upFunctionSelectionIndicationFlagsIe.h"
+
+CreateSessionRequestMsg::CreateSessionRequestMsg()
+{
+    msgType = CreateSessionRequestMsgType;
+    Uint16 mandIe;
+    mandIe = RatTypeIeType;
+    mandIe = (mandIe << 8) | 0; // ratType
+    mandatoryIeSet.insert(mandIe);    mandIe = FTeidIeType;
+    mandIe = (mandIe << 8) | 0; // senderFTeidForControlPlane
+    mandatoryIeSet.insert(mandIe);    mandIe = ApnIeType;
+    mandIe = (mandIe << 8) | 0; // accessPointName
+    mandatoryIeSet.insert(mandIe);    mandIe = BearerContextIeType;
+    mandIe = (mandIe << 8) | 0; // bearerContextsToBeCreated
+    mandatoryIeSet.insert(mandIe);
+}
+
+CreateSessionRequestMsg::~CreateSessionRequestMsg()
+{
+
+}
+
+bool CreateSessionRequestMsg::encodeCreateSessionRequestMsg(MsgBuffer &buffer,
+                        CreateSessionRequestMsgData
+							const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+    if (data.imsiIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = ImsiIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        ImsiIe imsi=
+        dynamic_cast<
+        ImsiIe&>(GtpV2IeFactory::getInstance().getIeObject(ImsiIeType));
+        rc = imsi.encodeImsiIe(buffer, data.imsi);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: imsi\n");
+            return false;
+        }
+    }
+
+    if (data.msisdnIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = MsisdnIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        MsisdnIe msisdn=
+        dynamic_cast<
+        MsisdnIe&>(GtpV2IeFactory::getInstance().getIeObject(MsisdnIeType));
+        rc = msisdn.encodeMsisdnIe(buffer, data.msisdn);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: msisdn\n");
+            return false;
+        }
+    }
+
+    if (data.meIdentityIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = MeiIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        MeiIe mei=
+        dynamic_cast<
+        MeiIe&>(GtpV2IeFactory::getInstance().getIeObject(MeiIeType));
+        rc = mei.encodeMeiIe(buffer, data.meIdentity);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: meIdentity\n");
+            return false;
+        }
+    }
+
+    if (data.userLocationInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = UliIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        UliIe uli=
+        dynamic_cast<
+        UliIe&>(GtpV2IeFactory::getInstance().getIeObject(UliIeType));
+        rc = uli.encodeUliIe(buffer, data.userLocationInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: userLocationInformation\n");
+            return false;
+        }
+    }
+
+    if (data.servingNetworkIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = ServingNetworkIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        ServingNetworkIe servingNetwork=
+        dynamic_cast<
+        ServingNetworkIe&>(GtpV2IeFactory::getInstance().getIeObject(ServingNetworkIeType));
+        rc = servingNetwork.encodeServingNetworkIe(buffer, data.servingNetwork);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: servingNetwork\n");
+            return false;
+        }
+    }
+
+    
+    // Encode the Ie Header
+    header.ieType = RatTypeIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    RatTypeIe ratType=
+    dynamic_cast<
+    RatTypeIe&>(GtpV2IeFactory::getInstance().getIeObject(RatTypeIeType));
+    rc = ratType.encodeRatTypeIe(buffer, data.ratType);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+
+    if (!(rc))
+    { 
+        errorStream.add((char *)"Failed to encode IE: ratType\n");
+        return false;
+    }
+
+    if (data.indicationFlagsIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = IndicationIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        IndicationIe indication=
+        dynamic_cast<
+        IndicationIe&>(GtpV2IeFactory::getInstance().getIeObject(IndicationIeType));
+        rc = indication.encodeIndicationIe(buffer, data.indicationFlags);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: indicationFlags\n");
+            return false;
+        }
+    }
+
+    
+    // Encode the Ie Header
+    header.ieType = FTeidIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    FTeidIe fTeid=
+    dynamic_cast<
+    FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+    rc = fTeid.encodeFTeidIe(buffer, data.senderFTeidForControlPlane);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+
+    if (!(rc))
+    { 
+        errorStream.add((char *)"Failed to encode IE: senderFTeidForControlPlane\n");
+        return false;
+    }
+
+    if (data.pgwS5S8AddressForControlPlaneOrPmipIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.pgwS5S8AddressForControlPlaneOrPmip);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: pgwS5S8AddressForControlPlaneOrPmip\n");
+            return false;
+        }
+    }
+
+    
+    // Encode the Ie Header
+    header.ieType = ApnIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    ApnIe apn=
+    dynamic_cast<
+    ApnIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnIeType));
+    rc = apn.encodeApnIe(buffer, data.accessPointName);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+
+    if (!(rc))
+    { 
+        errorStream.add((char *)"Failed to encode IE: accessPointName\n");
+        return false;
+    }
+
+    if (data.selectionModeIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = SelectionModeIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        SelectionModeIe selectionMode=
+        dynamic_cast<
+        SelectionModeIe&>(GtpV2IeFactory::getInstance().getIeObject(SelectionModeIeType));
+        rc = selectionMode.encodeSelectionModeIe(buffer, data.selectionMode);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: selectionMode\n");
+            return false;
+        }
+    }
+
+    if (data.pdnTypeIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = PdnTypeIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        PdnTypeIe pdnType=
+        dynamic_cast<
+        PdnTypeIe&>(GtpV2IeFactory::getInstance().getIeObject(PdnTypeIeType));
+        rc = pdnType.encodePdnTypeIe(buffer, data.pdnType);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: pdnType\n");
+            return false;
+        }
+    }
+
+    if (data.pdnAddressAllocationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = PaaIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        PaaIe paa=
+        dynamic_cast<
+        PaaIe&>(GtpV2IeFactory::getInstance().getIeObject(PaaIeType));
+        rc = paa.encodePaaIe(buffer, data.pdnAddressAllocation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: pdnAddressAllocation\n");
+            return false;
+        }
+    }
+
+    if (data.maximumApnRestrictionIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = ApnRestrictionIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        ApnRestrictionIe apnRestriction=
+        dynamic_cast<
+        ApnRestrictionIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnRestrictionIeType));
+        rc = apnRestriction.encodeApnRestrictionIe(buffer, data.maximumApnRestriction);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: maximumApnRestriction\n");
+            return false;
+        }
+    }
+
+    if (data.aggregateMaximumBitRateIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = AmbrIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        AmbrIe ambr=
+        dynamic_cast<
+        AmbrIe&>(GtpV2IeFactory::getInstance().getIeObject(AmbrIeType));
+        rc = ambr.encodeAmbrIe(buffer, data.aggregateMaximumBitRate);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: aggregateMaximumBitRate\n");
+            return false;
+        }
+    }
+
+    if (data.linkedEpsBearerIdIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = EbiIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        EbiIe ebi=
+        dynamic_cast<
+        EbiIe&>(GtpV2IeFactory::getInstance().getIeObject(EbiIeType));
+        rc = ebi.encodeEbiIe(buffer, data.linkedEpsBearerId);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: linkedEpsBearerId\n");
+            return false;
+        }
+    }
+
+    if (data.trustedWlanModeIndicationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = TwmiIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        TwmiIe twmi=
+        dynamic_cast<
+        TwmiIe&>(GtpV2IeFactory::getInstance().getIeObject(TwmiIeType));
+        rc = twmi.encodeTwmiIe(buffer, data.trustedWlanModeIndication);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: trustedWlanModeIndication\n");
+            return false;
+        }
+    }
+
+    if (data.protocolConfigurationOptionsIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = PcoIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        PcoIe pco=
+        dynamic_cast<
+        PcoIe&>(GtpV2IeFactory::getInstance().getIeObject(PcoIeType));
+        rc = pco.encodePcoIe(buffer, data.protocolConfigurationOptions);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: protocolConfigurationOptions\n");
+            return false;
+        }
+    }
+
+        // First validate if the applicatoin provided more than the expected cardinality
+    if (data.bearerContextsToBeCreatedCount > 11)
+    {
+        errorStream.add((char *)"Number of entries of bearerContextsToBeCreated exceeded\n");
+        errorStream.add((char *)"Expected count: 11 Received count: ");
+        errorStream.add((char *)"data.bearerContextsToBeCreatedCount");
+        errorStream.endOfLine();
+        return false;
+    }
+    for (Uint8 i = 0; i < data.bearerContextsToBeCreatedCount; i++)
+    {
+        // Encode the Ie Header
+        header.ieType = BearerContextIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        BearerContextIe bearerContext=
+        dynamic_cast<
+        BearerContextIe&>(GtpV2IeFactory::getInstance().
+        getIeObject(BearerContextIeType));
+        BearerContextsToBeCreatedInCreateSessionRequest groupedIeInstance = dynamic_cast<BearerContextsToBeCreatedInCreateSessionRequest&>(bearerContext.getGroupedIe(msgType, 0));
+        rc = groupedIeInstance.encodeBearerContextsToBeCreatedInCreateSessionRequest(buffer, data.bearerContextsToBeCreated[i]);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+    }
+
+    if (!(rc))
+    { 
+        errorStream.add((char *)"Failed to encode IE: bearerContextsToBeCreated\n");
+        return false;
+    }
+
+        // First validate if the applicatoin provided more than the expected cardinality
+    if (data.bearerContextsToBeRemovedCount > 11)
+    {
+        errorStream.add((char *)"Number of entries of bearerContextsToBeRemoved exceeded\n");
+        errorStream.add((char *)"Expected count: 11 Received count: ");
+        errorStream.add((char *)"data.bearerContextsToBeRemovedCount");
+        errorStream.endOfLine();
+        return false;
+    }
+    for (Uint8 i = 0; i < data.bearerContextsToBeRemovedCount; i++)
+    {
+        // Encode the Ie Header
+        header.ieType = BearerContextIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        BearerContextIe bearerContext=
+        dynamic_cast<
+        BearerContextIe&>(GtpV2IeFactory::getInstance().
+        getIeObject(BearerContextIeType));
+        BearerContextsToBeRemovedInCreateSessionRequest groupedIeInstance = dynamic_cast<BearerContextsToBeRemovedInCreateSessionRequest&>(bearerContext.getGroupedIe(msgType, 1));
+        rc = groupedIeInstance.encodeBearerContextsToBeRemovedInCreateSessionRequest(buffer, data.bearerContextsToBeRemoved[i]);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+    }
+
+    if (!(rc))
+    { 
+        errorStream.add((char *)"Failed to encode IE: bearerContextsToBeRemoved\n");
+        return false;
+    }
+
+    if (data.traceInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = TraceInformationIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        TraceInformationIe traceInformation=
+        dynamic_cast<
+        TraceInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(TraceInformationIeType));
+        rc = traceInformation.encodeTraceInformationIe(buffer, data.traceInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: traceInformation\n");
+            return false;
+        }
+    }
+
+    if (data.recoveryIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = RecoveryIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        RecoveryIe recovery=
+        dynamic_cast<
+        RecoveryIe&>(GtpV2IeFactory::getInstance().getIeObject(RecoveryIeType));
+        rc = recovery.encodeRecoveryIe(buffer, data.recovery);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: recovery\n");
+            return false;
+        }
+    }
+
+    if (data.mmeFqCsidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FqCsidIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        rc = fqCsid.encodeFqCsidIe(buffer, data.mmeFqCsid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: mmeFqCsid\n");
+            return false;
+        }
+    }
+
+    if (data.sgwFqCsidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FqCsidIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        rc = fqCsid.encodeFqCsidIe(buffer, data.sgwFqCsid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: sgwFqCsid\n");
+            return false;
+        }
+    }
+
+    if (data.epdgFqCsidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FqCsidIeType;
+        header.instance = 2;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        rc = fqCsid.encodeFqCsidIe(buffer, data.epdgFqCsid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: epdgFqCsid\n");
+            return false;
+        }
+    }
+
+    if (data.twanFqCsidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FqCsidIeType;
+        header.instance = 3;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        rc = fqCsid.encodeFqCsidIe(buffer, data.twanFqCsid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: twanFqCsid\n");
+            return false;
+        }
+    }
+
+    if (data.ueTimeZoneIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = UeTimeZoneIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        UeTimeZoneIe ueTimeZone=
+        dynamic_cast<
+        UeTimeZoneIe&>(GtpV2IeFactory::getInstance().getIeObject(UeTimeZoneIeType));
+        rc = ueTimeZone.encodeUeTimeZoneIe(buffer, data.ueTimeZone);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: ueTimeZone\n");
+            return false;
+        }
+    }
+
+    if (data.userCsgInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = UciIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        UciIe uci=
+        dynamic_cast<
+        UciIe&>(GtpV2IeFactory::getInstance().getIeObject(UciIeType));
+        rc = uci.encodeUciIe(buffer, data.userCsgInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: userCsgInformation\n");
+            return false;
+        }
+    }
+
+    if (data.chargingCharacteristicsIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = ChargingCharacteristicsIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        ChargingCharacteristicsIe chargingCharacteristics=
+        dynamic_cast<
+        ChargingCharacteristicsIe&>(GtpV2IeFactory::getInstance().getIeObject(ChargingCharacteristicsIeType));
+        rc = chargingCharacteristics.encodeChargingCharacteristicsIe(buffer, data.chargingCharacteristics);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: chargingCharacteristics\n");
+            return false;
+        }
+    }
+
+    if (data.mmeS4SgsnLdnIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = LocalDistinguishedNameIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        LocalDistinguishedNameIe localDistinguishedName=
+        dynamic_cast<
+        LocalDistinguishedNameIe&>(GtpV2IeFactory::getInstance().getIeObject(LocalDistinguishedNameIeType));
+        rc = localDistinguishedName.encodeLocalDistinguishedNameIe(buffer, data.mmeS4SgsnLdn);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: mmeS4SgsnLdn\n");
+            return false;
+        }
+    }
+
+    if (data.sgwLdnIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = LocalDistinguishedNameIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        LocalDistinguishedNameIe localDistinguishedName=
+        dynamic_cast<
+        LocalDistinguishedNameIe&>(GtpV2IeFactory::getInstance().getIeObject(LocalDistinguishedNameIeType));
+        rc = localDistinguishedName.encodeLocalDistinguishedNameIe(buffer, data.sgwLdn);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: sgwLdn\n");
+            return false;
+        }
+    }
+
+    if (data.epdgLdnIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = LocalDistinguishedNameIeType;
+        header.instance = 2;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        LocalDistinguishedNameIe localDistinguishedName=
+        dynamic_cast<
+        LocalDistinguishedNameIe&>(GtpV2IeFactory::getInstance().getIeObject(LocalDistinguishedNameIeType));
+        rc = localDistinguishedName.encodeLocalDistinguishedNameIe(buffer, data.epdgLdn);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: epdgLdn\n");
+            return false;
+        }
+    }
+
+    if (data.twanLdnIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = LocalDistinguishedNameIeType;
+        header.instance = 3;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        LocalDistinguishedNameIe localDistinguishedName=
+        dynamic_cast<
+        LocalDistinguishedNameIe&>(GtpV2IeFactory::getInstance().getIeObject(LocalDistinguishedNameIeType));
+        rc = localDistinguishedName.encodeLocalDistinguishedNameIe(buffer, data.twanLdn);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: twanLdn\n");
+            return false;
+        }
+    }
+
+    if (data.signallingPriorityIndicationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = SignallingPriorityIndicationIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        SignallingPriorityIndicationIe signallingPriorityIndication=
+        dynamic_cast<
+        SignallingPriorityIndicationIe&>(GtpV2IeFactory::getInstance().getIeObject(SignallingPriorityIndicationIeType));
+        rc = signallingPriorityIndication.encodeSignallingPriorityIndicationIe(buffer, data.signallingPriorityIndication);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: signallingPriorityIndication\n");
+            return false;
+        }
+    }
+
+    if (data.ueLocalIpAddressIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = IpAddressIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        IpAddressIe ipAddress=
+        dynamic_cast<
+        IpAddressIe&>(GtpV2IeFactory::getInstance().getIeObject(IpAddressIeType));
+        rc = ipAddress.encodeIpAddressIe(buffer, data.ueLocalIpAddress);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: ueLocalIpAddress\n");
+            return false;
+        }
+    }
+
+    if (data.ueUdpPortIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = PortNumberIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        PortNumberIe portNumber=
+        dynamic_cast<
+        PortNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(PortNumberIeType));
+        rc = portNumber.encodePortNumberIe(buffer, data.ueUdpPort);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: ueUdpPort\n");
+            return false;
+        }
+    }
+
+    if (data.additionalProtocolConfigurationOptionsIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = AdditionalProtocolConfigurationOptionsIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        AdditionalProtocolConfigurationOptionsIe additionalProtocolConfigurationOptions=
+        dynamic_cast<
+        AdditionalProtocolConfigurationOptionsIe&>(GtpV2IeFactory::getInstance().getIeObject(AdditionalProtocolConfigurationOptionsIeType));
+        rc = additionalProtocolConfigurationOptions.encodeAdditionalProtocolConfigurationOptionsIe(buffer, data.additionalProtocolConfigurationOptions);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: additionalProtocolConfigurationOptions\n");
+            return false;
+        }
+    }
+
+    if (data.hNbLocalIpAddressIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = IpAddressIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        IpAddressIe ipAddress=
+        dynamic_cast<
+        IpAddressIe&>(GtpV2IeFactory::getInstance().getIeObject(IpAddressIeType));
+        rc = ipAddress.encodeIpAddressIe(buffer, data.hNbLocalIpAddress);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: hNbLocalIpAddress\n");
+            return false;
+        }
+    }
+
+    if (data.hNbUdpPortIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = PortNumberIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        PortNumberIe portNumber=
+        dynamic_cast<
+        PortNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(PortNumberIeType));
+        rc = portNumber.encodePortNumberIe(buffer, data.hNbUdpPort);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: hNbUdpPort\n");
+            return false;
+        }
+    }
+
+    if (data.mmeS4SgsnIdentifierIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = IpAddressIeType;
+        header.instance = 2;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        IpAddressIe ipAddress=
+        dynamic_cast<
+        IpAddressIe&>(GtpV2IeFactory::getInstance().getIeObject(IpAddressIeType));
+        rc = ipAddress.encodeIpAddressIe(buffer, data.mmeS4SgsnIdentifier);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: mmeS4SgsnIdentifier\n");
+            return false;
+        }
+    }
+
+    if (data.twanIdentifierIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = TwanIdentifierIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        TwanIdentifierIe twanIdentifier=
+        dynamic_cast<
+        TwanIdentifierIe&>(GtpV2IeFactory::getInstance().getIeObject(TwanIdentifierIeType));
+        rc = twanIdentifier.encodeTwanIdentifierIe(buffer, data.twanIdentifier);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: twanIdentifier\n");
+            return false;
+        }
+    }
+
+    if (data.epdgIpAddressIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = IpAddressIeType;
+        header.instance = 3;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        IpAddressIe ipAddress=
+        dynamic_cast<
+        IpAddressIe&>(GtpV2IeFactory::getInstance().getIeObject(IpAddressIeType));
+        rc = ipAddress.encodeIpAddressIe(buffer, data.epdgIpAddress);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: epdgIpAddress\n");
+            return false;
+        }
+    }
+
+    if (data.cnOperatorSelectionEntityIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = CnOperatorSelectionEntityIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        CnOperatorSelectionEntityIe cnOperatorSelectionEntity=
+        dynamic_cast<
+        CnOperatorSelectionEntityIe&>(GtpV2IeFactory::getInstance().getIeObject(CnOperatorSelectionEntityIeType));
+        rc = cnOperatorSelectionEntity.encodeCnOperatorSelectionEntityIe(buffer, data.cnOperatorSelectionEntity);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: cnOperatorSelectionEntity\n");
+            return false;
+        }
+    }
+
+    if (data.mmeS4SgsnsOverloadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = OverloadControlInformationIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+        MmeS4SgsnsOverloadControlInformationInCreateSessionRequest groupedIeInstance =
+        dynamic_cast<
+         MmeS4SgsnsOverloadControlInformationInCreateSessionRequest&>(overloadControlInformation.getGroupedIe(msgType, 0));
+        rc = groupedIeInstance.encodeMmeS4SgsnsOverloadControlInformationInCreateSessionRequest(buffer, data.mmeS4SgsnsOverloadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: mmeS4SgsnsOverloadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.sgwsOverloadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = OverloadControlInformationIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+        SgwsOverloadControlInformationInCreateSessionRequest groupedIeInstance =
+        dynamic_cast<
+         SgwsOverloadControlInformationInCreateSessionRequest&>(overloadControlInformation.getGroupedIe(msgType, 1));
+        rc = groupedIeInstance.encodeSgwsOverloadControlInformationInCreateSessionRequest(buffer, data.sgwsOverloadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: sgwsOverloadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.twanEpdgsOverloadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = OverloadControlInformationIeType;
+        header.instance = 2;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+        TwanEpdgsOverloadControlInformationInCreateSessionRequest groupedIeInstance =
+        dynamic_cast<
+         TwanEpdgsOverloadControlInformationInCreateSessionRequest&>(overloadControlInformation.getGroupedIe(msgType, 2));
+        rc = groupedIeInstance.encodeTwanEpdgsOverloadControlInformationInCreateSessionRequest(buffer, data.twanEpdgsOverloadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: twanEpdgsOverloadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.originationTimeStampIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = MillisecondTimeStampIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        MillisecondTimeStampIe millisecondTimeStamp=
+        dynamic_cast<
+        MillisecondTimeStampIe&>(GtpV2IeFactory::getInstance().getIeObject(MillisecondTimeStampIeType));
+        rc = millisecondTimeStamp.encodeMillisecondTimeStampIe(buffer, data.originationTimeStamp);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: originationTimeStamp\n");
+            return false;
+        }
+    }
+
+    if (data.maximumWaitTimeIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = IntegerNumberIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        IntegerNumberIe integerNumber=
+        dynamic_cast<
+        IntegerNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(IntegerNumberIeType));
+        rc = integerNumber.encodeIntegerNumberIe(buffer, data.maximumWaitTime);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: maximumWaitTime\n");
+            return false;
+        }
+    }
+
+    if (data.wlanLocationInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = TwanIdentifierIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        TwanIdentifierIe twanIdentifier=
+        dynamic_cast<
+        TwanIdentifierIe&>(GtpV2IeFactory::getInstance().getIeObject(TwanIdentifierIeType));
+        rc = twanIdentifier.encodeTwanIdentifierIe(buffer, data.wlanLocationInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: wlanLocationInformation\n");
+            return false;
+        }
+    }
+
+    if (data.wlanLocationTimestampIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = TwanIdentifierTimestampIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        TwanIdentifierTimestampIe twanIdentifierTimestamp=
+        dynamic_cast<
+        TwanIdentifierTimestampIe&>(GtpV2IeFactory::getInstance().getIeObject(TwanIdentifierTimestampIeType));
+        rc = twanIdentifierTimestamp.encodeTwanIdentifierTimestampIe(buffer, data.wlanLocationTimestamp);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: wlanLocationTimestamp\n");
+            return false;
+        }
+    }
+
+    if (data.nbifomContainerIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FContainerIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FContainerIe fContainer=
+        dynamic_cast<
+        FContainerIe&>(GtpV2IeFactory::getInstance().getIeObject(FContainerIeType));
+        rc = fContainer.encodeFContainerIe(buffer, data.nbifomContainer);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: nbifomContainer\n");
+            return false;
+        }
+    }
+
+    if (data.remoteUeContextConnectedIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = RemoteUeContextIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        RemoteUeContextIe remoteUeContext=
+        dynamic_cast<
+        RemoteUeContextIe&>(GtpV2IeFactory::getInstance().getIeObject(RemoteUeContextIeType));
+        RemoteUeContextConnectedInCreateSessionRequest groupedIeInstance =
+        dynamic_cast<
+         RemoteUeContextConnectedInCreateSessionRequest&>(remoteUeContext.getGroupedIe(msgType, 0));
+        rc = groupedIeInstance.encodeRemoteUeContextConnectedInCreateSessionRequest(buffer, data.remoteUeContextConnected);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: remoteUeContextConnected\n");
+            return false;
+        }
+    }
+
+    if (data.a3gppAaaServerIdentifierIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = NodeIdentifierIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        NodeIdentifierIe nodeIdentifier=
+        dynamic_cast<
+        NodeIdentifierIe&>(GtpV2IeFactory::getInstance().getIeObject(NodeIdentifierIeType));
+        rc = nodeIdentifier.encodeNodeIdentifierIe(buffer, data.a3gppAaaServerIdentifier);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: a3gppAaaServerIdentifier\n");
+            return false;
+        }
+    }
+
+    if (data.extendedProtocolConfigurationOptionsIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = EpcoIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        EpcoIe epco=
+        dynamic_cast<
+        EpcoIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcoIeType));
+        rc = epco.encodeEpcoIe(buffer, data.extendedProtocolConfigurationOptions);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: extendedProtocolConfigurationOptions\n");
+            return false;
+        }
+    }
+
+    if (data.servingPlmnRateControlIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = ServingPlmnRateControlIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        ServingPlmnRateControlIe servingPlmnRateControl=
+        dynamic_cast<
+        ServingPlmnRateControlIe&>(GtpV2IeFactory::getInstance().getIeObject(ServingPlmnRateControlIeType));
+        rc = servingPlmnRateControl.encodeServingPlmnRateControlIe(buffer, data.servingPlmnRateControl);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: servingPlmnRateControl\n");
+            return false;
+        }
+    }
+
+    if (data.moExceptionDataCounterIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = CounterIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        CounterIe counter=
+        dynamic_cast<
+        CounterIe&>(GtpV2IeFactory::getInstance().getIeObject(CounterIeType));
+        rc = counter.encodeCounterIe(buffer, data.moExceptionDataCounter);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: moExceptionDataCounter\n");
+            return false;
+        }
+    }
+
+    if (data.ueTcpPortIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = PortNumberIeType;
+        header.instance = 2;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        PortNumberIe portNumber=
+        dynamic_cast<
+        PortNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(PortNumberIeType));
+        rc = portNumber.encodePortNumberIe(buffer, data.ueTcpPort);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: ueTcpPort\n");
+            return false;
+        }
+    }
+
+    if (data.mappedUeUsageTypeIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = MappedUeUsageTypeIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        MappedUeUsageTypeIe mappedUeUsageType=
+        dynamic_cast<
+        MappedUeUsageTypeIe&>(GtpV2IeFactory::getInstance().getIeObject(MappedUeUsageTypeIeType));
+        rc = mappedUeUsageType.encodeMappedUeUsageTypeIe(buffer, data.mappedUeUsageType);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: mappedUeUsageType\n");
+            return false;
+        }
+    }
+
+    if (data.userLocationInformationForSgwIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = UliIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        UliIe uli=
+        dynamic_cast<
+        UliIe&>(GtpV2IeFactory::getInstance().getIeObject(UliIeType));
+        rc = uli.encodeUliIe(buffer, data.userLocationInformationForSgw);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: userLocationInformationForSgw\n");
+            return false;
+        }
+    }
+
+    if (data.sgwUNodeNameIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FqdnIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FqdnIe fqdn=
+        dynamic_cast<
+        FqdnIe&>(GtpV2IeFactory::getInstance().getIeObject(FqdnIeType));
+        rc = fqdn.encodeFqdnIe(buffer, data.sgwUNodeName);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: sgwUNodeName\n");
+            return false;
+        }
+    }
+
+    if (data.secondaryRatUsageDataReportIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = SecondaryRatUsageDataReportIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        SecondaryRatUsageDataReportIe secondaryRatUsageDataReport=
+        dynamic_cast<
+        SecondaryRatUsageDataReportIe&>(GtpV2IeFactory::getInstance().getIeObject(SecondaryRatUsageDataReportIeType));
+        rc = secondaryRatUsageDataReport.encodeSecondaryRatUsageDataReportIe(buffer, data.secondaryRatUsageDataReport);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: secondaryRatUsageDataReport\n");
+            return false;
+        }
+    }
+
+    if (data.upFunctionSelectionIndicationFlagsIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = UpFunctionSelectionIndicationFlagsIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        UpFunctionSelectionIndicationFlagsIe upFunctionSelectionIndicationFlags=
+        dynamic_cast<
+        UpFunctionSelectionIndicationFlagsIe&>(GtpV2IeFactory::getInstance().getIeObject(UpFunctionSelectionIndicationFlagsIeType));
+        rc = upFunctionSelectionIndicationFlags.encodeUpFunctionSelectionIndicationFlagsIe(buffer, data.upFunctionSelectionIndicationFlags);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: upFunctionSelectionIndicationFlags\n");
+            return false;
+        }
+    }
+    return rc;
+
+}
+
+bool CreateSessionRequestMsg::decodeCreateSessionRequestMsg(MsgBuffer &buffer,
+ CreateSessionRequestMsgData 
+ &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+  
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+
+        switch (ieHeader.ieType){
+     
+            case ImsiIeType:
+            {
+                ImsiIe ieObject =
+                dynamic_cast<
+                ImsiIe&>(GtpV2IeFactory::getInstance().getIeObject(ImsiIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeImsiIe(buffer, data.imsi, ieHeader.length);
+
+                    data.imsiIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: imsi\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case MsisdnIeType:
+            {
+                MsisdnIe ieObject =
+                dynamic_cast<
+                MsisdnIe&>(GtpV2IeFactory::getInstance().getIeObject(MsisdnIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeMsisdnIe(buffer, data.msisdn, ieHeader.length);
+
+                    data.msisdnIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: msisdn\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case MeiIeType:
+            {
+                MeiIe ieObject =
+                dynamic_cast<
+                MeiIe&>(GtpV2IeFactory::getInstance().getIeObject(MeiIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeMeiIe(buffer, data.meIdentity, ieHeader.length);
+
+                    data.meIdentityIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: meIdentity\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case UliIeType:
+            {
+                UliIe ieObject =
+                dynamic_cast<
+                UliIe&>(GtpV2IeFactory::getInstance().getIeObject(UliIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeUliIe(buffer, data.userLocationInformation, ieHeader.length);
+
+                    data.userLocationInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: userLocationInformation\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					rc = ieObject.decodeUliIe(buffer, data.userLocationInformationForSgw, ieHeader.length);
+
+                    data.userLocationInformationForSgwIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: userLocationInformationForSgw\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case ServingNetworkIeType:
+            {
+                ServingNetworkIe ieObject =
+                dynamic_cast<
+                ServingNetworkIe&>(GtpV2IeFactory::getInstance().getIeObject(ServingNetworkIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeServingNetworkIe(buffer, data.servingNetwork, ieHeader.length);
+
+                    data.servingNetworkIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: servingNetwork\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case RatTypeIeType:
+            {
+                RatTypeIe ieObject =
+                dynamic_cast<
+                RatTypeIe&>(GtpV2IeFactory::getInstance().getIeObject(RatTypeIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeRatTypeIe(buffer, data.ratType, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: ratType\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case IndicationIeType:
+            {
+                IndicationIe ieObject =
+                dynamic_cast<
+                IndicationIe&>(GtpV2IeFactory::getInstance().getIeObject(IndicationIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeIndicationIe(buffer, data.indicationFlags, ieHeader.length);
+
+                    data.indicationFlagsIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: indicationFlags\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case FTeidIeType:
+            {
+                FTeidIe ieObject =
+                dynamic_cast<
+                FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeFTeidIe(buffer, data.senderFTeidForControlPlane, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: senderFTeidForControlPlane\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					rc = ieObject.decodeFTeidIe(buffer, data.pgwS5S8AddressForControlPlaneOrPmip, ieHeader.length);
+
+                    data.pgwS5S8AddressForControlPlaneOrPmipIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: pgwS5S8AddressForControlPlaneOrPmip\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case ApnIeType:
+            {
+                ApnIe ieObject =
+                dynamic_cast<
+                ApnIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeApnIe(buffer, data.accessPointName, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: accessPointName\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case SelectionModeIeType:
+            {
+                SelectionModeIe ieObject =
+                dynamic_cast<
+                SelectionModeIe&>(GtpV2IeFactory::getInstance().getIeObject(SelectionModeIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeSelectionModeIe(buffer, data.selectionMode, ieHeader.length);
+
+                    data.selectionModeIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: selectionMode\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case PdnTypeIeType:
+            {
+                PdnTypeIe ieObject =
+                dynamic_cast<
+                PdnTypeIe&>(GtpV2IeFactory::getInstance().getIeObject(PdnTypeIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodePdnTypeIe(buffer, data.pdnType, ieHeader.length);
+
+                    data.pdnTypeIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: pdnType\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case PaaIeType:
+            {
+                PaaIe ieObject =
+                dynamic_cast<
+                PaaIe&>(GtpV2IeFactory::getInstance().getIeObject(PaaIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodePaaIe(buffer, data.pdnAddressAllocation, ieHeader.length);
+
+                    data.pdnAddressAllocationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: pdnAddressAllocation\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case ApnRestrictionIeType:
+            {
+                ApnRestrictionIe ieObject =
+                dynamic_cast<
+                ApnRestrictionIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnRestrictionIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeApnRestrictionIe(buffer, data.maximumApnRestriction, ieHeader.length);
+
+                    data.maximumApnRestrictionIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: maximumApnRestriction\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case AmbrIeType:
+            {
+                AmbrIe ieObject =
+                dynamic_cast<
+                AmbrIe&>(GtpV2IeFactory::getInstance().getIeObject(AmbrIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeAmbrIe(buffer, data.aggregateMaximumBitRate, ieHeader.length);
+
+                    data.aggregateMaximumBitRateIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: aggregateMaximumBitRate\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case EbiIeType:
+            {
+                EbiIe ieObject =
+                dynamic_cast<
+                EbiIe&>(GtpV2IeFactory::getInstance().getIeObject(EbiIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeEbiIe(buffer, data.linkedEpsBearerId, ieHeader.length);
+
+                    data.linkedEpsBearerIdIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: linkedEpsBearerId\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case TwmiIeType:
+            {
+                TwmiIe ieObject =
+                dynamic_cast<
+                TwmiIe&>(GtpV2IeFactory::getInstance().getIeObject(TwmiIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeTwmiIe(buffer, data.trustedWlanModeIndication, ieHeader.length);
+
+                    data.trustedWlanModeIndicationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: trustedWlanModeIndication\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case PcoIeType:
+            {
+                PcoIe ieObject =
+                dynamic_cast<
+                PcoIe&>(GtpV2IeFactory::getInstance().getIeObject(PcoIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodePcoIe(buffer, data.protocolConfigurationOptions, ieHeader.length);
+
+                    data.protocolConfigurationOptionsIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: protocolConfigurationOptions\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case BearerContextIeType:
+            {
+                BearerContextIe ieObject =
+                dynamic_cast<
+                BearerContextIe&>(GtpV2IeFactory::getInstance().getIeObject(BearerContextIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					// First check if we have enough space left to decode and store this instance
+                    if (data.bearerContextsToBeCreatedCount == 11)
+                    {
+                        errorStream.add((char *)"More than 11 instances of bearerContextsToBeCreated received\n");
+                        return false;
+                    }
+                    BearerContextsToBeCreatedInCreateSessionRequest groupedIeInstance =
+                    dynamic_cast<
+                    BearerContextsToBeCreatedInCreateSessionRequest&>(ieObject.getGroupedIe(msgType, 0));
+                    rc = groupedIeInstance.decodeBearerContextsToBeCreatedInCreateSessionRequest(buffer,
+                    data.bearerContextsToBeCreated[data.bearerContextsToBeCreatedCount], ieHeader.length);
+                    data.bearerContextsToBeCreatedCount++; // TODO Count validation
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: bearerContextsToBeCreated\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					// First check if we have enough space left to decode and store this instance
+                    if (data.bearerContextsToBeRemovedCount == 11)
+                    {
+                        errorStream.add((char *)"More than 11 instances of bearerContextsToBeRemoved received\n");
+                        return false;
+                    }
+                    BearerContextsToBeRemovedInCreateSessionRequest groupedIeInstance =
+                    dynamic_cast<
+                    BearerContextsToBeRemovedInCreateSessionRequest&>(ieObject.getGroupedIe(msgType, 1));
+                    rc = groupedIeInstance.decodeBearerContextsToBeRemovedInCreateSessionRequest(buffer,
+                    data.bearerContextsToBeRemoved[data.bearerContextsToBeRemovedCount], ieHeader.length);
+                    data.bearerContextsToBeRemovedCount++; // TODO Count validation
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: bearerContextsToBeRemoved\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case TraceInformationIeType:
+            {
+                TraceInformationIe ieObject =
+                dynamic_cast<
+                TraceInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(TraceInformationIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeTraceInformationIe(buffer, data.traceInformation, ieHeader.length);
+
+                    data.traceInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: traceInformation\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case RecoveryIeType:
+            {
+                RecoveryIe ieObject =
+                dynamic_cast<
+                RecoveryIe&>(GtpV2IeFactory::getInstance().getIeObject(RecoveryIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeRecoveryIe(buffer, data.recovery, ieHeader.length);
+
+                    data.recoveryIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: recovery\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case FqCsidIeType:
+            {
+                FqCsidIe ieObject =
+                dynamic_cast<
+                FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeFqCsidIe(buffer, data.mmeFqCsid, ieHeader.length);
+
+                    data.mmeFqCsidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: mmeFqCsid\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					rc = ieObject.decodeFqCsidIe(buffer, data.sgwFqCsid, ieHeader.length);
+
+                    data.sgwFqCsidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: sgwFqCsid\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 2)
+                {
+					rc = ieObject.decodeFqCsidIe(buffer, data.epdgFqCsid, ieHeader.length);
+
+                    data.epdgFqCsidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: epdgFqCsid\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 3)
+                {
+					rc = ieObject.decodeFqCsidIe(buffer, data.twanFqCsid, ieHeader.length);
+
+                    data.twanFqCsidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: twanFqCsid\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case UeTimeZoneIeType:
+            {
+                UeTimeZoneIe ieObject =
+                dynamic_cast<
+                UeTimeZoneIe&>(GtpV2IeFactory::getInstance().getIeObject(UeTimeZoneIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeUeTimeZoneIe(buffer, data.ueTimeZone, ieHeader.length);
+
+                    data.ueTimeZoneIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: ueTimeZone\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case UciIeType:
+            {
+                UciIe ieObject =
+                dynamic_cast<
+                UciIe&>(GtpV2IeFactory::getInstance().getIeObject(UciIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeUciIe(buffer, data.userCsgInformation, ieHeader.length);
+
+                    data.userCsgInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: userCsgInformation\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case ChargingCharacteristicsIeType:
+            {
+                ChargingCharacteristicsIe ieObject =
+                dynamic_cast<
+                ChargingCharacteristicsIe&>(GtpV2IeFactory::getInstance().getIeObject(ChargingCharacteristicsIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeChargingCharacteristicsIe(buffer, data.chargingCharacteristics, ieHeader.length);
+
+                    data.chargingCharacteristicsIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: chargingCharacteristics\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case LocalDistinguishedNameIeType:
+            {
+                LocalDistinguishedNameIe ieObject =
+                dynamic_cast<
+                LocalDistinguishedNameIe&>(GtpV2IeFactory::getInstance().getIeObject(LocalDistinguishedNameIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeLocalDistinguishedNameIe(buffer, data.mmeS4SgsnLdn, ieHeader.length);
+
+                    data.mmeS4SgsnLdnIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: mmeS4SgsnLdn\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					rc = ieObject.decodeLocalDistinguishedNameIe(buffer, data.sgwLdn, ieHeader.length);
+
+                    data.sgwLdnIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: sgwLdn\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 2)
+                {
+					rc = ieObject.decodeLocalDistinguishedNameIe(buffer, data.epdgLdn, ieHeader.length);
+
+                    data.epdgLdnIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: epdgLdn\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 3)
+                {
+					rc = ieObject.decodeLocalDistinguishedNameIe(buffer, data.twanLdn, ieHeader.length);
+
+                    data.twanLdnIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: twanLdn\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case SignallingPriorityIndicationIeType:
+            {
+                SignallingPriorityIndicationIe ieObject =
+                dynamic_cast<
+                SignallingPriorityIndicationIe&>(GtpV2IeFactory::getInstance().getIeObject(SignallingPriorityIndicationIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeSignallingPriorityIndicationIe(buffer, data.signallingPriorityIndication, ieHeader.length);
+
+                    data.signallingPriorityIndicationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: signallingPriorityIndication\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case IpAddressIeType:
+            {
+                IpAddressIe ieObject =
+                dynamic_cast<
+                IpAddressIe&>(GtpV2IeFactory::getInstance().getIeObject(IpAddressIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeIpAddressIe(buffer, data.ueLocalIpAddress, ieHeader.length);
+
+                    data.ueLocalIpAddressIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: ueLocalIpAddress\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					rc = ieObject.decodeIpAddressIe(buffer, data.hNbLocalIpAddress, ieHeader.length);
+
+                    data.hNbLocalIpAddressIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: hNbLocalIpAddress\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 2)
+                {
+					rc = ieObject.decodeIpAddressIe(buffer, data.mmeS4SgsnIdentifier, ieHeader.length);
+
+                    data.mmeS4SgsnIdentifierIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: mmeS4SgsnIdentifier\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 3)
+                {
+					rc = ieObject.decodeIpAddressIe(buffer, data.epdgIpAddress, ieHeader.length);
+
+                    data.epdgIpAddressIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: epdgIpAddress\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case PortNumberIeType:
+            {
+                PortNumberIe ieObject =
+                dynamic_cast<
+                PortNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(PortNumberIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodePortNumberIe(buffer, data.ueUdpPort, ieHeader.length);
+
+                    data.ueUdpPortIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: ueUdpPort\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					rc = ieObject.decodePortNumberIe(buffer, data.hNbUdpPort, ieHeader.length);
+
+                    data.hNbUdpPortIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: hNbUdpPort\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 2)
+                {
+					rc = ieObject.decodePortNumberIe(buffer, data.ueTcpPort, ieHeader.length);
+
+                    data.ueTcpPortIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: ueTcpPort\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case AdditionalProtocolConfigurationOptionsIeType:
+            {
+                AdditionalProtocolConfigurationOptionsIe ieObject =
+                dynamic_cast<
+                AdditionalProtocolConfigurationOptionsIe&>(GtpV2IeFactory::getInstance().getIeObject(AdditionalProtocolConfigurationOptionsIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeAdditionalProtocolConfigurationOptionsIe(buffer, data.additionalProtocolConfigurationOptions, ieHeader.length);
+
+                    data.additionalProtocolConfigurationOptionsIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: additionalProtocolConfigurationOptions\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case TwanIdentifierIeType:
+            {
+                TwanIdentifierIe ieObject =
+                dynamic_cast<
+                TwanIdentifierIe&>(GtpV2IeFactory::getInstance().getIeObject(TwanIdentifierIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeTwanIdentifierIe(buffer, data.twanIdentifier, ieHeader.length);
+
+                    data.twanIdentifierIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: twanIdentifier\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					rc = ieObject.decodeTwanIdentifierIe(buffer, data.wlanLocationInformation, ieHeader.length);
+
+                    data.wlanLocationInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: wlanLocationInformation\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case CnOperatorSelectionEntityIeType:
+            {
+                CnOperatorSelectionEntityIe ieObject =
+                dynamic_cast<
+                CnOperatorSelectionEntityIe&>(GtpV2IeFactory::getInstance().getIeObject(CnOperatorSelectionEntityIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeCnOperatorSelectionEntityIe(buffer, data.cnOperatorSelectionEntity, ieHeader.length);
+
+                    data.cnOperatorSelectionEntityIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: cnOperatorSelectionEntity\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case OverloadControlInformationIeType:
+            {
+                OverloadControlInformationIe ieObject =
+                dynamic_cast<
+                OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					MmeS4SgsnsOverloadControlInformationInCreateSessionRequest groupedIeInstance =
+					dynamic_cast<
+					MmeS4SgsnsOverloadControlInformationInCreateSessionRequest&>(ieObject.getGroupedIe(msgType, 0));
+					rc = groupedIeInstance.decodeMmeS4SgsnsOverloadControlInformationInCreateSessionRequest(buffer, data.mmeS4SgsnsOverloadControlInformation, ieHeader.length);
+
+                    data.mmeS4SgsnsOverloadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: mmeS4SgsnsOverloadControlInformation\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					SgwsOverloadControlInformationInCreateSessionRequest groupedIeInstance =
+					dynamic_cast<
+					SgwsOverloadControlInformationInCreateSessionRequest&>(ieObject.getGroupedIe(msgType, 1));
+					rc = groupedIeInstance.decodeSgwsOverloadControlInformationInCreateSessionRequest(buffer, data.sgwsOverloadControlInformation, ieHeader.length);
+
+                    data.sgwsOverloadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: sgwsOverloadControlInformation\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 2)
+                {
+					TwanEpdgsOverloadControlInformationInCreateSessionRequest groupedIeInstance =
+					dynamic_cast<
+					TwanEpdgsOverloadControlInformationInCreateSessionRequest&>(ieObject.getGroupedIe(msgType, 2));
+					rc = groupedIeInstance.decodeTwanEpdgsOverloadControlInformationInCreateSessionRequest(buffer, data.twanEpdgsOverloadControlInformation, ieHeader.length);
+
+                    data.twanEpdgsOverloadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: twanEpdgsOverloadControlInformation\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case MillisecondTimeStampIeType:
+            {
+                MillisecondTimeStampIe ieObject =
+                dynamic_cast<
+                MillisecondTimeStampIe&>(GtpV2IeFactory::getInstance().getIeObject(MillisecondTimeStampIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeMillisecondTimeStampIe(buffer, data.originationTimeStamp, ieHeader.length);
+
+                    data.originationTimeStampIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: originationTimeStamp\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case IntegerNumberIeType:
+            {
+                IntegerNumberIe ieObject =
+                dynamic_cast<
+                IntegerNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(IntegerNumberIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeIntegerNumberIe(buffer, data.maximumWaitTime, ieHeader.length);
+
+                    data.maximumWaitTimeIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: maximumWaitTime\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case TwanIdentifierTimestampIeType:
+            {
+                TwanIdentifierTimestampIe ieObject =
+                dynamic_cast<
+                TwanIdentifierTimestampIe&>(GtpV2IeFactory::getInstance().getIeObject(TwanIdentifierTimestampIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeTwanIdentifierTimestampIe(buffer, data.wlanLocationTimestamp, ieHeader.length);
+
+                    data.wlanLocationTimestampIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: wlanLocationTimestamp\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case FContainerIeType:
+            {
+                FContainerIe ieObject =
+                dynamic_cast<
+                FContainerIe&>(GtpV2IeFactory::getInstance().getIeObject(FContainerIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeFContainerIe(buffer, data.nbifomContainer, ieHeader.length);
+
+                    data.nbifomContainerIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: nbifomContainer\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case RemoteUeContextIeType:
+            {
+                RemoteUeContextIe ieObject =
+                dynamic_cast<
+                RemoteUeContextIe&>(GtpV2IeFactory::getInstance().getIeObject(RemoteUeContextIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					RemoteUeContextConnectedInCreateSessionRequest groupedIeInstance =
+					dynamic_cast<
+					RemoteUeContextConnectedInCreateSessionRequest&>(ieObject.getGroupedIe(msgType, 0));
+					rc = groupedIeInstance.decodeRemoteUeContextConnectedInCreateSessionRequest(buffer, data.remoteUeContextConnected, ieHeader.length);
+
+                    data.remoteUeContextConnectedIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: remoteUeContextConnected\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case NodeIdentifierIeType:
+            {
+                NodeIdentifierIe ieObject =
+                dynamic_cast<
+                NodeIdentifierIe&>(GtpV2IeFactory::getInstance().getIeObject(NodeIdentifierIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeNodeIdentifierIe(buffer, data.a3gppAaaServerIdentifier, ieHeader.length);
+
+                    data.a3gppAaaServerIdentifierIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: a3gppAaaServerIdentifier\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case EpcoIeType:
+            {
+                EpcoIe ieObject =
+                dynamic_cast<
+                EpcoIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcoIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeEpcoIe(buffer, data.extendedProtocolConfigurationOptions, ieHeader.length);
+
+                    data.extendedProtocolConfigurationOptionsIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: extendedProtocolConfigurationOptions\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case ServingPlmnRateControlIeType:
+            {
+                ServingPlmnRateControlIe ieObject =
+                dynamic_cast<
+                ServingPlmnRateControlIe&>(GtpV2IeFactory::getInstance().getIeObject(ServingPlmnRateControlIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeServingPlmnRateControlIe(buffer, data.servingPlmnRateControl, ieHeader.length);
+
+                    data.servingPlmnRateControlIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: servingPlmnRateControl\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case CounterIeType:
+            {
+                CounterIe ieObject =
+                dynamic_cast<
+                CounterIe&>(GtpV2IeFactory::getInstance().getIeObject(CounterIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeCounterIe(buffer, data.moExceptionDataCounter, ieHeader.length);
+
+                    data.moExceptionDataCounterIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: moExceptionDataCounter\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case MappedUeUsageTypeIeType:
+            {
+                MappedUeUsageTypeIe ieObject =
+                dynamic_cast<
+                MappedUeUsageTypeIe&>(GtpV2IeFactory::getInstance().getIeObject(MappedUeUsageTypeIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeMappedUeUsageTypeIe(buffer, data.mappedUeUsageType, ieHeader.length);
+
+                    data.mappedUeUsageTypeIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: mappedUeUsageType\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case FqdnIeType:
+            {
+                FqdnIe ieObject =
+                dynamic_cast<
+                FqdnIe&>(GtpV2IeFactory::getInstance().getIeObject(FqdnIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeFqdnIe(buffer, data.sgwUNodeName, ieHeader.length);
+
+                    data.sgwUNodeNameIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: sgwUNodeName\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case SecondaryRatUsageDataReportIeType:
+            {
+                SecondaryRatUsageDataReportIe ieObject =
+                dynamic_cast<
+                SecondaryRatUsageDataReportIe&>(GtpV2IeFactory::getInstance().getIeObject(SecondaryRatUsageDataReportIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeSecondaryRatUsageDataReportIe(buffer, data.secondaryRatUsageDataReport, ieHeader.length);
+
+                    data.secondaryRatUsageDataReportIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: secondaryRatUsageDataReport\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case UpFunctionSelectionIndicationFlagsIeType:
+            {
+                UpFunctionSelectionIndicationFlagsIe ieObject =
+                dynamic_cast<
+                UpFunctionSelectionIndicationFlagsIe&>(GtpV2IeFactory::getInstance().getIeObject(UpFunctionSelectionIndicationFlagsIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeUpFunctionSelectionIndicationFlagsIe(buffer, data.upFunctionSelectionIndicationFlags, ieHeader.length);
+
+                    data.upFunctionSelectionIndicationFlagsIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: upFunctionSelectionIndicationFlags\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+
+            default:
+            {
+                // Unknown IE print error
+                errorStream.add((char *)"Unknown IE Type: ");
+                errorStream.add(ieHeader.ieType);
+                errorStream.endOfLine();
+                buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    return rc; // TODO validations
+}
+
+void CreateSessionRequestMsg::
+displayCreateSessionRequestMsgData_v(CreateSessionRequestMsgData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"CreateSessionRequestMsg:");
+    stream.endOfLine();
+    stream.incrIndent();
+        
+    
+    if (data.imsiIePresent)
+    {
+
+
+        stream.add((char *)"IE - imsi:");
+        stream.endOfLine();
+        ImsiIe imsi=
+        dynamic_cast<
+        ImsiIe&>(GtpV2IeFactory::getInstance().getIeObject(ImsiIeType));
+        imsi.displayImsiIe_v(data.imsi, stream);
+
+    }
+    if (data.msisdnIePresent)
+    {
+
+
+        stream.add((char *)"IE - msisdn:");
+        stream.endOfLine();
+        MsisdnIe msisdn=
+        dynamic_cast<
+        MsisdnIe&>(GtpV2IeFactory::getInstance().getIeObject(MsisdnIeType));
+        msisdn.displayMsisdnIe_v(data.msisdn, stream);
+
+    }
+    if (data.meIdentityIePresent)
+    {
+
+
+        stream.add((char *)"IE - meIdentity:");
+        stream.endOfLine();
+        MeiIe mei=
+        dynamic_cast<
+        MeiIe&>(GtpV2IeFactory::getInstance().getIeObject(MeiIeType));
+        mei.displayMeiIe_v(data.meIdentity, stream);
+
+    }
+    if (data.userLocationInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - userLocationInformation:");
+        stream.endOfLine();
+        UliIe uli=
+        dynamic_cast<
+        UliIe&>(GtpV2IeFactory::getInstance().getIeObject(UliIeType));
+        uli.displayUliIe_v(data.userLocationInformation, stream);
+
+    }
+    if (data.servingNetworkIePresent)
+    {
+
+
+        stream.add((char *)"IE - servingNetwork:");
+        stream.endOfLine();
+        ServingNetworkIe servingNetwork=
+        dynamic_cast<
+        ServingNetworkIe&>(GtpV2IeFactory::getInstance().getIeObject(ServingNetworkIeType));
+        servingNetwork.displayServingNetworkIe_v(data.servingNetwork, stream);
+
+    }
+        stream.add((char *)"IE - ratType:");
+        stream.endOfLine();
+        RatTypeIe ratType=
+        dynamic_cast<
+        RatTypeIe&>(GtpV2IeFactory::getInstance().getIeObject(RatTypeIeType));
+        ratType.displayRatTypeIe_v(data.ratType, stream);
+
+    if (data.indicationFlagsIePresent)
+    {
+
+
+        stream.add((char *)"IE - indicationFlags:");
+        stream.endOfLine();
+        IndicationIe indication=
+        dynamic_cast<
+        IndicationIe&>(GtpV2IeFactory::getInstance().getIeObject(IndicationIeType));
+        indication.displayIndicationIe_v(data.indicationFlags, stream);
+
+    }
+        stream.add((char *)"IE - senderFTeidForControlPlane:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.senderFTeidForControlPlane, stream);
+
+    if (data.pgwS5S8AddressForControlPlaneOrPmipIePresent)
+    {
+
+
+        stream.add((char *)"IE - pgwS5S8AddressForControlPlaneOrPmip:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.pgwS5S8AddressForControlPlaneOrPmip, stream);
+
+    }
+        stream.add((char *)"IE - accessPointName:");
+        stream.endOfLine();
+        ApnIe apn=
+        dynamic_cast<
+        ApnIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnIeType));
+        apn.displayApnIe_v(data.accessPointName, stream);
+
+    if (data.selectionModeIePresent)
+    {
+
+
+        stream.add((char *)"IE - selectionMode:");
+        stream.endOfLine();
+        SelectionModeIe selectionMode=
+        dynamic_cast<
+        SelectionModeIe&>(GtpV2IeFactory::getInstance().getIeObject(SelectionModeIeType));
+        selectionMode.displaySelectionModeIe_v(data.selectionMode, stream);
+
+    }
+    if (data.pdnTypeIePresent)
+    {
+
+
+        stream.add((char *)"IE - pdnType:");
+        stream.endOfLine();
+        PdnTypeIe pdnType=
+        dynamic_cast<
+        PdnTypeIe&>(GtpV2IeFactory::getInstance().getIeObject(PdnTypeIeType));
+        pdnType.displayPdnTypeIe_v(data.pdnType, stream);
+
+    }
+    if (data.pdnAddressAllocationIePresent)
+    {
+
+
+        stream.add((char *)"IE - pdnAddressAllocation:");
+        stream.endOfLine();
+        PaaIe paa=
+        dynamic_cast<
+        PaaIe&>(GtpV2IeFactory::getInstance().getIeObject(PaaIeType));
+        paa.displayPaaIe_v(data.pdnAddressAllocation, stream);
+
+    }
+    if (data.maximumApnRestrictionIePresent)
+    {
+
+
+        stream.add((char *)"IE - maximumApnRestriction:");
+        stream.endOfLine();
+        ApnRestrictionIe apnRestriction=
+        dynamic_cast<
+        ApnRestrictionIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnRestrictionIeType));
+        apnRestriction.displayApnRestrictionIe_v(data.maximumApnRestriction, stream);
+
+    }
+    if (data.aggregateMaximumBitRateIePresent)
+    {
+
+
+        stream.add((char *)"IE - aggregateMaximumBitRate:");
+        stream.endOfLine();
+        AmbrIe ambr=
+        dynamic_cast<
+        AmbrIe&>(GtpV2IeFactory::getInstance().getIeObject(AmbrIeType));
+        ambr.displayAmbrIe_v(data.aggregateMaximumBitRate, stream);
+
+    }
+    if (data.linkedEpsBearerIdIePresent)
+    {
+
+
+        stream.add((char *)"IE - linkedEpsBearerId:");
+        stream.endOfLine();
+        EbiIe ebi=
+        dynamic_cast<
+        EbiIe&>(GtpV2IeFactory::getInstance().getIeObject(EbiIeType));
+        ebi.displayEbiIe_v(data.linkedEpsBearerId, stream);
+
+    }
+    if (data.trustedWlanModeIndicationIePresent)
+    {
+
+
+        stream.add((char *)"IE - trustedWlanModeIndication:");
+        stream.endOfLine();
+        TwmiIe twmi=
+        dynamic_cast<
+        TwmiIe&>(GtpV2IeFactory::getInstance().getIeObject(TwmiIeType));
+        twmi.displayTwmiIe_v(data.trustedWlanModeIndication, stream);
+
+    }
+    if (data.protocolConfigurationOptionsIePresent)
+    {
+
+
+        stream.add((char *)"IE - protocolConfigurationOptions:");
+        stream.endOfLine();
+        PcoIe pco=
+        dynamic_cast<
+        PcoIe&>(GtpV2IeFactory::getInstance().getIeObject(PcoIeType));
+        pco.displayPcoIe_v(data.protocolConfigurationOptions, stream);
+
+    }
+
+    Uint8 displayCount;
+    
+    displayCount = data.bearerContextsToBeCreatedCount;
+    if (displayCount > 11)
+    {
+        stream.add((char *)"Invalid data more than 11 instances");
+        stream.endOfLine();
+        stream.add((char *)"Displaying only 11");
+        stream.endOfLine();
+        displayCount = 11;
+    }
+    for (Uint8 i = 0; i < displayCount; i++)
+    {
+        stream.add((char *)"IE -  bearerContextsToBeCreated:");
+        stream.endOfLine();
+        BearerContextIe bearerContext=
+        dynamic_cast<
+        BearerContextIe&>(GtpV2IeFactory::getInstance().getIeObject(BearerContextIeType));
+        BearerContextsToBeCreatedInCreateSessionRequest groupedIeInstance =
+        dynamic_cast<
+        BearerContextsToBeCreatedInCreateSessionRequest&>(bearerContext.getGroupedIe(msgType, 0));
+        groupedIeInstance.displayBearerContextsToBeCreatedInCreateSessionRequestData_v(data.bearerContextsToBeCreated[i], stream);
+
+    }
+    displayCount = data.bearerContextsToBeRemovedCount;
+    if (displayCount > 11)
+    {
+        stream.add((char *)"Invalid data more than 11 instances");
+        stream.endOfLine();
+        stream.add((char *)"Displaying only 11");
+        stream.endOfLine();
+        displayCount = 11;
+    }
+    for (Uint8 i = 0; i < displayCount; i++)
+    {
+        stream.add((char *)"IE -  bearerContextsToBeRemoved:");
+        stream.endOfLine();
+        BearerContextIe bearerContext=
+        dynamic_cast<
+        BearerContextIe&>(GtpV2IeFactory::getInstance().getIeObject(BearerContextIeType));
+                BearerContextsToBeRemovedInCreateSessionRequest groupedIeInstance =
+        dynamic_cast<
+        BearerContextsToBeRemovedInCreateSessionRequest&>(bearerContext.getGroupedIe(msgType, 1));
+        groupedIeInstance.displayBearerContextsToBeRemovedInCreateSessionRequestData_v(data.bearerContextsToBeRemoved[i], stream);
+    }
+
+    
+
+    
+    if (data.traceInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - traceInformation:");
+        stream.endOfLine();
+        TraceInformationIe traceInformation=
+        dynamic_cast<
+        TraceInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(TraceInformationIeType));
+        traceInformation.displayTraceInformationIe_v(data.traceInformation, stream);
+
+    }
+    if (data.recoveryIePresent)
+    {
+
+
+        stream.add((char *)"IE - recovery:");
+        stream.endOfLine();
+        RecoveryIe recovery=
+        dynamic_cast<
+        RecoveryIe&>(GtpV2IeFactory::getInstance().getIeObject(RecoveryIeType));
+        recovery.displayRecoveryIe_v(data.recovery, stream);
+
+    }
+    if (data.mmeFqCsidIePresent)
+    {
+
+
+        stream.add((char *)"IE - mmeFqCsid:");
+        stream.endOfLine();
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        fqCsid.displayFqCsidIe_v(data.mmeFqCsid, stream);
+
+    }
+    if (data.sgwFqCsidIePresent)
+    {
+
+
+        stream.add((char *)"IE - sgwFqCsid:");
+        stream.endOfLine();
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        fqCsid.displayFqCsidIe_v(data.sgwFqCsid, stream);
+
+    }
+    if (data.epdgFqCsidIePresent)
+    {
+
+
+        stream.add((char *)"IE - epdgFqCsid:");
+        stream.endOfLine();
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        fqCsid.displayFqCsidIe_v(data.epdgFqCsid, stream);
+
+    }
+    if (data.twanFqCsidIePresent)
+    {
+
+
+        stream.add((char *)"IE - twanFqCsid:");
+        stream.endOfLine();
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        fqCsid.displayFqCsidIe_v(data.twanFqCsid, stream);
+
+    }
+    if (data.ueTimeZoneIePresent)
+    {
+
+
+        stream.add((char *)"IE - ueTimeZone:");
+        stream.endOfLine();
+        UeTimeZoneIe ueTimeZone=
+        dynamic_cast<
+        UeTimeZoneIe&>(GtpV2IeFactory::getInstance().getIeObject(UeTimeZoneIeType));
+        ueTimeZone.displayUeTimeZoneIe_v(data.ueTimeZone, stream);
+
+    }
+    if (data.userCsgInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - userCsgInformation:");
+        stream.endOfLine();
+        UciIe uci=
+        dynamic_cast<
+        UciIe&>(GtpV2IeFactory::getInstance().getIeObject(UciIeType));
+        uci.displayUciIe_v(data.userCsgInformation, stream);
+
+    }
+    if (data.chargingCharacteristicsIePresent)
+    {
+
+
+        stream.add((char *)"IE - chargingCharacteristics:");
+        stream.endOfLine();
+        ChargingCharacteristicsIe chargingCharacteristics=
+        dynamic_cast<
+        ChargingCharacteristicsIe&>(GtpV2IeFactory::getInstance().getIeObject(ChargingCharacteristicsIeType));
+        chargingCharacteristics.displayChargingCharacteristicsIe_v(data.chargingCharacteristics, stream);
+
+    }
+    if (data.mmeS4SgsnLdnIePresent)
+    {
+
+
+        stream.add((char *)"IE - mmeS4SgsnLdn:");
+        stream.endOfLine();
+        LocalDistinguishedNameIe localDistinguishedName=
+        dynamic_cast<
+        LocalDistinguishedNameIe&>(GtpV2IeFactory::getInstance().getIeObject(LocalDistinguishedNameIeType));
+        localDistinguishedName.displayLocalDistinguishedNameIe_v(data.mmeS4SgsnLdn, stream);
+
+    }
+    if (data.sgwLdnIePresent)
+    {
+
+
+        stream.add((char *)"IE - sgwLdn:");
+        stream.endOfLine();
+        LocalDistinguishedNameIe localDistinguishedName=
+        dynamic_cast<
+        LocalDistinguishedNameIe&>(GtpV2IeFactory::getInstance().getIeObject(LocalDistinguishedNameIeType));
+        localDistinguishedName.displayLocalDistinguishedNameIe_v(data.sgwLdn, stream);
+
+    }
+    if (data.epdgLdnIePresent)
+    {
+
+
+        stream.add((char *)"IE - epdgLdn:");
+        stream.endOfLine();
+        LocalDistinguishedNameIe localDistinguishedName=
+        dynamic_cast<
+        LocalDistinguishedNameIe&>(GtpV2IeFactory::getInstance().getIeObject(LocalDistinguishedNameIeType));
+        localDistinguishedName.displayLocalDistinguishedNameIe_v(data.epdgLdn, stream);
+
+    }
+    if (data.twanLdnIePresent)
+    {
+
+
+        stream.add((char *)"IE - twanLdn:");
+        stream.endOfLine();
+        LocalDistinguishedNameIe localDistinguishedName=
+        dynamic_cast<
+        LocalDistinguishedNameIe&>(GtpV2IeFactory::getInstance().getIeObject(LocalDistinguishedNameIeType));
+        localDistinguishedName.displayLocalDistinguishedNameIe_v(data.twanLdn, stream);
+
+    }
+    if (data.signallingPriorityIndicationIePresent)
+    {
+
+
+        stream.add((char *)"IE - signallingPriorityIndication:");
+        stream.endOfLine();
+        SignallingPriorityIndicationIe signallingPriorityIndication=
+        dynamic_cast<
+        SignallingPriorityIndicationIe&>(GtpV2IeFactory::getInstance().getIeObject(SignallingPriorityIndicationIeType));
+        signallingPriorityIndication.displaySignallingPriorityIndicationIe_v(data.signallingPriorityIndication, stream);
+
+    }
+    if (data.ueLocalIpAddressIePresent)
+    {
+
+
+        stream.add((char *)"IE - ueLocalIpAddress:");
+        stream.endOfLine();
+        IpAddressIe ipAddress=
+        dynamic_cast<
+        IpAddressIe&>(GtpV2IeFactory::getInstance().getIeObject(IpAddressIeType));
+        ipAddress.displayIpAddressIe_v(data.ueLocalIpAddress, stream);
+
+    }
+    if (data.ueUdpPortIePresent)
+    {
+
+
+        stream.add((char *)"IE - ueUdpPort:");
+        stream.endOfLine();
+        PortNumberIe portNumber=
+        dynamic_cast<
+        PortNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(PortNumberIeType));
+        portNumber.displayPortNumberIe_v(data.ueUdpPort, stream);
+
+    }
+    if (data.additionalProtocolConfigurationOptionsIePresent)
+    {
+
+
+        stream.add((char *)"IE - additionalProtocolConfigurationOptions:");
+        stream.endOfLine();
+        AdditionalProtocolConfigurationOptionsIe additionalProtocolConfigurationOptions=
+        dynamic_cast<
+        AdditionalProtocolConfigurationOptionsIe&>(GtpV2IeFactory::getInstance().getIeObject(AdditionalProtocolConfigurationOptionsIeType));
+        additionalProtocolConfigurationOptions.displayAdditionalProtocolConfigurationOptionsIe_v(data.additionalProtocolConfigurationOptions, stream);
+
+    }
+    if (data.hNbLocalIpAddressIePresent)
+    {
+
+
+        stream.add((char *)"IE - hNbLocalIpAddress:");
+        stream.endOfLine();
+        IpAddressIe ipAddress=
+        dynamic_cast<
+        IpAddressIe&>(GtpV2IeFactory::getInstance().getIeObject(IpAddressIeType));
+        ipAddress.displayIpAddressIe_v(data.hNbLocalIpAddress, stream);
+
+    }
+    if (data.hNbUdpPortIePresent)
+    {
+
+
+        stream.add((char *)"IE - hNbUdpPort:");
+        stream.endOfLine();
+        PortNumberIe portNumber=
+        dynamic_cast<
+        PortNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(PortNumberIeType));
+        portNumber.displayPortNumberIe_v(data.hNbUdpPort, stream);
+
+    }
+    if (data.mmeS4SgsnIdentifierIePresent)
+    {
+
+
+        stream.add((char *)"IE - mmeS4SgsnIdentifier:");
+        stream.endOfLine();
+        IpAddressIe ipAddress=
+        dynamic_cast<
+        IpAddressIe&>(GtpV2IeFactory::getInstance().getIeObject(IpAddressIeType));
+        ipAddress.displayIpAddressIe_v(data.mmeS4SgsnIdentifier, stream);
+
+    }
+    if (data.twanIdentifierIePresent)
+    {
+
+
+        stream.add((char *)"IE - twanIdentifier:");
+        stream.endOfLine();
+        TwanIdentifierIe twanIdentifier=
+        dynamic_cast<
+        TwanIdentifierIe&>(GtpV2IeFactory::getInstance().getIeObject(TwanIdentifierIeType));
+        twanIdentifier.displayTwanIdentifierIe_v(data.twanIdentifier, stream);
+
+    }
+    if (data.epdgIpAddressIePresent)
+    {
+
+
+        stream.add((char *)"IE - epdgIpAddress:");
+        stream.endOfLine();
+        IpAddressIe ipAddress=
+        dynamic_cast<
+        IpAddressIe&>(GtpV2IeFactory::getInstance().getIeObject(IpAddressIeType));
+        ipAddress.displayIpAddressIe_v(data.epdgIpAddress, stream);
+
+    }
+    if (data.cnOperatorSelectionEntityIePresent)
+    {
+
+
+        stream.add((char *)"IE - cnOperatorSelectionEntity:");
+        stream.endOfLine();
+        CnOperatorSelectionEntityIe cnOperatorSelectionEntity=
+        dynamic_cast<
+        CnOperatorSelectionEntityIe&>(GtpV2IeFactory::getInstance().getIeObject(CnOperatorSelectionEntityIeType));
+        cnOperatorSelectionEntity.displayCnOperatorSelectionEntityIe_v(data.cnOperatorSelectionEntity, stream);
+
+    }
+    if (data.mmeS4SgsnsOverloadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - mmeS4SgsnsOverloadControlInformation:");
+        stream.endOfLine();
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+            MmeS4SgsnsOverloadControlInformationInCreateSessionRequest groupedIeInstance =
+        dynamic_cast<
+        MmeS4SgsnsOverloadControlInformationInCreateSessionRequest&>(overloadControlInformation.getGroupedIe(msgType, 0));
+        groupedIeInstance.displayMmeS4SgsnsOverloadControlInformationInCreateSessionRequestData_v(data.mmeS4SgsnsOverloadControlInformation, stream);
+
+    }
+    if (data.sgwsOverloadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - sgwsOverloadControlInformation:");
+        stream.endOfLine();
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+            SgwsOverloadControlInformationInCreateSessionRequest groupedIeInstance =
+        dynamic_cast<
+        SgwsOverloadControlInformationInCreateSessionRequest&>(overloadControlInformation.getGroupedIe(msgType, 1));
+        groupedIeInstance.displaySgwsOverloadControlInformationInCreateSessionRequestData_v(data.sgwsOverloadControlInformation, stream);
+
+    }
+    if (data.twanEpdgsOverloadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - twanEpdgsOverloadControlInformation:");
+        stream.endOfLine();
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+            TwanEpdgsOverloadControlInformationInCreateSessionRequest groupedIeInstance =
+        dynamic_cast<
+        TwanEpdgsOverloadControlInformationInCreateSessionRequest&>(overloadControlInformation.getGroupedIe(msgType, 2));
+        groupedIeInstance.displayTwanEpdgsOverloadControlInformationInCreateSessionRequestData_v(data.twanEpdgsOverloadControlInformation, stream);
+
+    }
+    if (data.originationTimeStampIePresent)
+    {
+
+
+        stream.add((char *)"IE - originationTimeStamp:");
+        stream.endOfLine();
+        MillisecondTimeStampIe millisecondTimeStamp=
+        dynamic_cast<
+        MillisecondTimeStampIe&>(GtpV2IeFactory::getInstance().getIeObject(MillisecondTimeStampIeType));
+        millisecondTimeStamp.displayMillisecondTimeStampIe_v(data.originationTimeStamp, stream);
+
+    }
+    if (data.maximumWaitTimeIePresent)
+    {
+
+
+        stream.add((char *)"IE - maximumWaitTime:");
+        stream.endOfLine();
+        IntegerNumberIe integerNumber=
+        dynamic_cast<
+        IntegerNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(IntegerNumberIeType));
+        integerNumber.displayIntegerNumberIe_v(data.maximumWaitTime, stream);
+
+    }
+    if (data.wlanLocationInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - wlanLocationInformation:");
+        stream.endOfLine();
+        TwanIdentifierIe twanIdentifier=
+        dynamic_cast<
+        TwanIdentifierIe&>(GtpV2IeFactory::getInstance().getIeObject(TwanIdentifierIeType));
+        twanIdentifier.displayTwanIdentifierIe_v(data.wlanLocationInformation, stream);
+
+    }
+    if (data.wlanLocationTimestampIePresent)
+    {
+
+
+        stream.add((char *)"IE - wlanLocationTimestamp:");
+        stream.endOfLine();
+        TwanIdentifierTimestampIe twanIdentifierTimestamp=
+        dynamic_cast<
+        TwanIdentifierTimestampIe&>(GtpV2IeFactory::getInstance().getIeObject(TwanIdentifierTimestampIeType));
+        twanIdentifierTimestamp.displayTwanIdentifierTimestampIe_v(data.wlanLocationTimestamp, stream);
+
+    }
+    if (data.nbifomContainerIePresent)
+    {
+
+
+        stream.add((char *)"IE - nbifomContainer:");
+        stream.endOfLine();
+        FContainerIe fContainer=
+        dynamic_cast<
+        FContainerIe&>(GtpV2IeFactory::getInstance().getIeObject(FContainerIeType));
+        fContainer.displayFContainerIe_v(data.nbifomContainer, stream);
+
+    }
+    if (data.remoteUeContextConnectedIePresent)
+    {
+
+
+        stream.add((char *)"IE - remoteUeContextConnected:");
+        stream.endOfLine();
+        RemoteUeContextIe remoteUeContext=
+        dynamic_cast<
+        RemoteUeContextIe&>(GtpV2IeFactory::getInstance().getIeObject(RemoteUeContextIeType));
+            RemoteUeContextConnectedInCreateSessionRequest groupedIeInstance =
+        dynamic_cast<
+        RemoteUeContextConnectedInCreateSessionRequest&>(remoteUeContext.getGroupedIe(msgType, 0));
+        groupedIeInstance.displayRemoteUeContextConnectedInCreateSessionRequestData_v(data.remoteUeContextConnected, stream);
+
+    }
+    if (data.a3gppAaaServerIdentifierIePresent)
+    {
+
+
+        stream.add((char *)"IE - a3gppAaaServerIdentifier:");
+        stream.endOfLine();
+        NodeIdentifierIe nodeIdentifier=
+        dynamic_cast<
+        NodeIdentifierIe&>(GtpV2IeFactory::getInstance().getIeObject(NodeIdentifierIeType));
+        nodeIdentifier.displayNodeIdentifierIe_v(data.a3gppAaaServerIdentifier, stream);
+
+    }
+    if (data.extendedProtocolConfigurationOptionsIePresent)
+    {
+
+
+        stream.add((char *)"IE - extendedProtocolConfigurationOptions:");
+        stream.endOfLine();
+        EpcoIe epco=
+        dynamic_cast<
+        EpcoIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcoIeType));
+        epco.displayEpcoIe_v(data.extendedProtocolConfigurationOptions, stream);
+
+    }
+    if (data.servingPlmnRateControlIePresent)
+    {
+
+
+        stream.add((char *)"IE - servingPlmnRateControl:");
+        stream.endOfLine();
+        ServingPlmnRateControlIe servingPlmnRateControl=
+        dynamic_cast<
+        ServingPlmnRateControlIe&>(GtpV2IeFactory::getInstance().getIeObject(ServingPlmnRateControlIeType));
+        servingPlmnRateControl.displayServingPlmnRateControlIe_v(data.servingPlmnRateControl, stream);
+
+    }
+    if (data.moExceptionDataCounterIePresent)
+    {
+
+
+        stream.add((char *)"IE - moExceptionDataCounter:");
+        stream.endOfLine();
+        CounterIe counter=
+        dynamic_cast<
+        CounterIe&>(GtpV2IeFactory::getInstance().getIeObject(CounterIeType));
+        counter.displayCounterIe_v(data.moExceptionDataCounter, stream);
+
+    }
+    if (data.ueTcpPortIePresent)
+    {
+
+
+        stream.add((char *)"IE - ueTcpPort:");
+        stream.endOfLine();
+        PortNumberIe portNumber=
+        dynamic_cast<
+        PortNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(PortNumberIeType));
+        portNumber.displayPortNumberIe_v(data.ueTcpPort, stream);
+
+    }
+    if (data.mappedUeUsageTypeIePresent)
+    {
+
+
+        stream.add((char *)"IE - mappedUeUsageType:");
+        stream.endOfLine();
+        MappedUeUsageTypeIe mappedUeUsageType=
+        dynamic_cast<
+        MappedUeUsageTypeIe&>(GtpV2IeFactory::getInstance().getIeObject(MappedUeUsageTypeIeType));
+        mappedUeUsageType.displayMappedUeUsageTypeIe_v(data.mappedUeUsageType, stream);
+
+    }
+    if (data.userLocationInformationForSgwIePresent)
+    {
+
+
+        stream.add((char *)"IE - userLocationInformationForSgw:");
+        stream.endOfLine();
+        UliIe uli=
+        dynamic_cast<
+        UliIe&>(GtpV2IeFactory::getInstance().getIeObject(UliIeType));
+        uli.displayUliIe_v(data.userLocationInformationForSgw, stream);
+
+    }
+    if (data.sgwUNodeNameIePresent)
+    {
+
+
+        stream.add((char *)"IE - sgwUNodeName:");
+        stream.endOfLine();
+        FqdnIe fqdn=
+        dynamic_cast<
+        FqdnIe&>(GtpV2IeFactory::getInstance().getIeObject(FqdnIeType));
+        fqdn.displayFqdnIe_v(data.sgwUNodeName, stream);
+
+    }
+    if (data.secondaryRatUsageDataReportIePresent)
+    {
+
+
+        stream.add((char *)"IE - secondaryRatUsageDataReport:");
+        stream.endOfLine();
+        SecondaryRatUsageDataReportIe secondaryRatUsageDataReport=
+        dynamic_cast<
+        SecondaryRatUsageDataReportIe&>(GtpV2IeFactory::getInstance().getIeObject(SecondaryRatUsageDataReportIeType));
+        secondaryRatUsageDataReport.displaySecondaryRatUsageDataReportIe_v(data.secondaryRatUsageDataReport, stream);
+
+    }
+    if (data.upFunctionSelectionIndicationFlagsIePresent)
+    {
+
+
+        stream.add((char *)"IE - upFunctionSelectionIndicationFlags:");
+        stream.endOfLine();
+        UpFunctionSelectionIndicationFlagsIe upFunctionSelectionIndicationFlags=
+        dynamic_cast<
+        UpFunctionSelectionIndicationFlagsIe&>(GtpV2IeFactory::getInstance().getIeObject(UpFunctionSelectionIndicationFlagsIeType));
+        upFunctionSelectionIndicationFlags.displayUpFunctionSelectionIndicationFlagsIe_v(data.upFunctionSelectionIndicationFlags, stream);
+
+    }
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
diff --git a/src/gtpV2Codec/msgClasses/createSessionRequestMsg.h b/src/gtpV2Codec/msgClasses/createSessionRequestMsg.h
new file mode 100644
index 0000000..fb10a66
--- /dev/null
+++ b/src/gtpV2Codec/msgClasses/createSessionRequestMsg.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/msgtemplate.h.tt>
+ ******************************************************************************/
+#ifndef CREATESESSIONREQUESTMSG_H_
+#define CREATESESSIONREQUESTMSG_H_
+
+#include <set>
+#include "manual/gtpV2Message.h"
+#include <msgBuffer.h>
+#include <debug.h>
+#include "gtpV2MsgDataTypes.h"
+
+
+class CreateSessionRequestMsg:public GtpV2Message
+{
+public:
+    CreateSessionRequestMsg();
+    virtual ~CreateSessionRequestMsg();
+    bool encodeCreateSessionRequestMsg(MsgBuffer &buffer, CreateSessionRequestMsgData const &data);
+
+    bool decodeCreateSessionRequestMsg (MsgBuffer &buffer, CreateSessionRequestMsgData& data, Uint16 length);
+
+    void displayCreateSessionRequestMsgData_v(CreateSessionRequestMsgData const &data, Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/msgClasses/createSessionResponseMsg.cpp b/src/gtpV2Codec/msgClasses/createSessionResponseMsg.cpp
new file mode 100644
index 0000000..4823825
--- /dev/null
+++ b/src/gtpV2Codec/msgClasses/createSessionResponseMsg.cpp
@@ -0,0 +1,2396 @@
+/*
+ * 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/msgtemplate.cpp.tt>
+ ******************************************************************************/ 
+
+#include "createSessionResponseMsg.h"
+#include "../ieClasses/manual/gtpV2Ie.h"
+#include "../ieClasses/gtpV2IeFactory.h"
+#include "../ieClasses/causeIe.h"
+#include "../ieClasses/changeReportingActionIe.h"
+#include "../ieClasses/csgInformationReportingActionIe.h"
+#include "../ieClasses/fTeidIe.h"
+#include "../ieClasses/apnRestrictionIe.h"
+#include "../ieClasses/ambrIe.h"
+#include "../ieClasses/ebiIe.h"
+#include "../ieClasses/bearerContextIe.h"
+#include "../ieClasses/bearerContextsCreatedInCreateSessionResponse.h"
+#include "../ieClasses/bearerContextIe.h"
+#include "../ieClasses/bearerContextsMarkedForRemovalInCreateSessionResponse.h"
+#include "../ieClasses/recoveryIe.h"
+#include "../ieClasses/fqdnIe.h"
+#include "../ieClasses/ipAddressIe.h"
+#include "../ieClasses/fqCsidIe.h"
+#include "../ieClasses/fqCsidIe.h"
+#include "../ieClasses/localDistinguishedNameIe.h"
+#include "../ieClasses/localDistinguishedNameIe.h"
+#include "../ieClasses/epcTimerIe.h"
+#include "../ieClasses/henbInformationReportingIe.h"
+#include "../ieClasses/fTeidIe.h"
+#include "../ieClasses/paaIe.h"
+#include "../ieClasses/pcoIe.h"
+#include "../ieClasses/additionalProtocolConfigurationOptionsIe.h"
+#include "../ieClasses/ip4cpIe.h"
+#include "../ieClasses/indicationIe.h"
+#include "../ieClasses/presenceReportingAreaActionIe.h"
+#include "../ieClasses/loadControlInformationIe.h"
+#include "../ieClasses/pgwsNodeLevelLoadControlInformationInCreateSessionResponse.h"
+#include "../ieClasses/loadControlInformationIe.h"
+#include "../ieClasses/pgwsApnLevelLoadControlInformationInCreateSessionResponse.h"
+#include "../ieClasses/loadControlInformationIe.h"
+#include "../ieClasses/sgwsNodeLevelLoadControlInformationInCreateSessionResponse.h"
+#include "../ieClasses/overloadControlInformationIe.h"
+#include "../ieClasses/pgwsOverloadControlInformationInCreateSessionResponse.h"
+#include "../ieClasses/overloadControlInformationIe.h"
+#include "../ieClasses/sgwsOverloadControlInformationInCreateSessionResponse.h"
+#include "../ieClasses/fContainerIe.h"
+#include "../ieClasses/chargingIdIe.h"
+#include "../ieClasses/epcoIe.h"
+
+CreateSessionResponseMsg::CreateSessionResponseMsg()
+{
+    msgType = CreateSessionResponseMsgType;
+    Uint16 mandIe;
+    mandIe = CauseIeType;
+    mandIe = (mandIe << 8) | 0; // cause
+    mandatoryIeSet.insert(mandIe);    mandIe = BearerContextIeType;
+    mandIe = (mandIe << 8) | 0; // bearerContextsCreated
+    mandatoryIeSet.insert(mandIe);
+}
+
+CreateSessionResponseMsg::~CreateSessionResponseMsg()
+{
+
+}
+
+bool CreateSessionResponseMsg::encodeCreateSessionResponseMsg(MsgBuffer &buffer,
+                        CreateSessionResponseMsgData
+							const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+    
+    // Encode the Ie Header
+    header.ieType = CauseIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    CauseIe cause=
+    dynamic_cast<
+    CauseIe&>(GtpV2IeFactory::getInstance().getIeObject(CauseIeType));
+    rc = cause.encodeCauseIe(buffer, data.cause);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+
+    if (!(rc))
+    { 
+        errorStream.add((char *)"Failed to encode IE: cause\n");
+        return false;
+    }
+
+    if (data.changeReportingActionIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = ChangeReportingActionIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        ChangeReportingActionIe changeReportingAction=
+        dynamic_cast<
+        ChangeReportingActionIe&>(GtpV2IeFactory::getInstance().getIeObject(ChangeReportingActionIeType));
+        rc = changeReportingAction.encodeChangeReportingActionIe(buffer, data.changeReportingAction);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: changeReportingAction\n");
+            return false;
+        }
+    }
+
+    if (data.csgInformationReportingActionIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = CsgInformationReportingActionIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        CsgInformationReportingActionIe csgInformationReportingAction=
+        dynamic_cast<
+        CsgInformationReportingActionIe&>(GtpV2IeFactory::getInstance().getIeObject(CsgInformationReportingActionIeType));
+        rc = csgInformationReportingAction.encodeCsgInformationReportingActionIe(buffer, data.csgInformationReportingAction);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: csgInformationReportingAction\n");
+            return false;
+        }
+    }
+
+    if (data.senderFTeidForControlPlaneIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.senderFTeidForControlPlane);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: senderFTeidForControlPlane\n");
+            return false;
+        }
+    }
+
+    if (data.apnRestrictionIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = ApnRestrictionIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        ApnRestrictionIe apnRestriction=
+        dynamic_cast<
+        ApnRestrictionIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnRestrictionIeType));
+        rc = apnRestriction.encodeApnRestrictionIe(buffer, data.apnRestriction);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: apnRestriction\n");
+            return false;
+        }
+    }
+
+    if (data.aggregateMaximumBitRateIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = AmbrIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        AmbrIe ambr=
+        dynamic_cast<
+        AmbrIe&>(GtpV2IeFactory::getInstance().getIeObject(AmbrIeType));
+        rc = ambr.encodeAmbrIe(buffer, data.aggregateMaximumBitRate);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: aggregateMaximumBitRate\n");
+            return false;
+        }
+    }
+
+    if (data.linkedEpsBearerIdIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = EbiIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        EbiIe ebi=
+        dynamic_cast<
+        EbiIe&>(GtpV2IeFactory::getInstance().getIeObject(EbiIeType));
+        rc = ebi.encodeEbiIe(buffer, data.linkedEpsBearerId);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: linkedEpsBearerId\n");
+            return false;
+        }
+    }
+
+        // First validate if the applicatoin provided more than the expected cardinality
+    if (data.bearerContextsCreatedCount > 11)
+    {
+        errorStream.add((char *)"Number of entries of bearerContextsCreated exceeded\n");
+        errorStream.add((char *)"Expected count: 11 Received count: ");
+        errorStream.add((char *)"data.bearerContextsCreatedCount");
+        errorStream.endOfLine();
+        return false;
+    }
+    for (Uint8 i = 0; i < data.bearerContextsCreatedCount; i++)
+    {
+        // Encode the Ie Header
+        header.ieType = BearerContextIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        BearerContextIe bearerContext=
+        dynamic_cast<
+        BearerContextIe&>(GtpV2IeFactory::getInstance().
+        getIeObject(BearerContextIeType));
+        BearerContextsCreatedInCreateSessionResponse groupedIeInstance = dynamic_cast<BearerContextsCreatedInCreateSessionResponse&>(bearerContext.getGroupedIe(msgType, 0));
+        rc = groupedIeInstance.encodeBearerContextsCreatedInCreateSessionResponse(buffer, data.bearerContextsCreated[i]);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+    }
+
+    if (!(rc))
+    { 
+        errorStream.add((char *)"Failed to encode IE: bearerContextsCreated\n");
+        return false;
+    }
+
+        // First validate if the applicatoin provided more than the expected cardinality
+    if (data.bearerContextsMarkedForRemovalCount > 11)
+    {
+        errorStream.add((char *)"Number of entries of bearerContextsMarkedForRemoval exceeded\n");
+        errorStream.add((char *)"Expected count: 11 Received count: ");
+        errorStream.add((char *)"data.bearerContextsMarkedForRemovalCount");
+        errorStream.endOfLine();
+        return false;
+    }
+    for (Uint8 i = 0; i < data.bearerContextsMarkedForRemovalCount; i++)
+    {
+        // Encode the Ie Header
+        header.ieType = BearerContextIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        BearerContextIe bearerContext=
+        dynamic_cast<
+        BearerContextIe&>(GtpV2IeFactory::getInstance().
+        getIeObject(BearerContextIeType));
+        BearerContextsMarkedForRemovalInCreateSessionResponse groupedIeInstance = dynamic_cast<BearerContextsMarkedForRemovalInCreateSessionResponse&>(bearerContext.getGroupedIe(msgType, 1));
+        rc = groupedIeInstance.encodeBearerContextsMarkedForRemovalInCreateSessionResponse(buffer, data.bearerContextsMarkedForRemoval[i]);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+    }
+
+    if (!(rc))
+    { 
+        errorStream.add((char *)"Failed to encode IE: bearerContextsMarkedForRemoval\n");
+        return false;
+    }
+
+    if (data.recoveryIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = RecoveryIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        RecoveryIe recovery=
+        dynamic_cast<
+        RecoveryIe&>(GtpV2IeFactory::getInstance().getIeObject(RecoveryIeType));
+        rc = recovery.encodeRecoveryIe(buffer, data.recovery);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: recovery\n");
+            return false;
+        }
+    }
+
+    if (data.chargingGatewayNameIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FqdnIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FqdnIe fqdn=
+        dynamic_cast<
+        FqdnIe&>(GtpV2IeFactory::getInstance().getIeObject(FqdnIeType));
+        rc = fqdn.encodeFqdnIe(buffer, data.chargingGatewayName);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: chargingGatewayName\n");
+            return false;
+        }
+    }
+
+    if (data.chargingGatewayAddressIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = IpAddressIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        IpAddressIe ipAddress=
+        dynamic_cast<
+        IpAddressIe&>(GtpV2IeFactory::getInstance().getIeObject(IpAddressIeType));
+        rc = ipAddress.encodeIpAddressIe(buffer, data.chargingGatewayAddress);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: chargingGatewayAddress\n");
+            return false;
+        }
+    }
+
+    if (data.pgwFqCsidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FqCsidIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        rc = fqCsid.encodeFqCsidIe(buffer, data.pgwFqCsid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: pgwFqCsid\n");
+            return false;
+        }
+    }
+
+    if (data.sgwFqCsidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FqCsidIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        rc = fqCsid.encodeFqCsidIe(buffer, data.sgwFqCsid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: sgwFqCsid\n");
+            return false;
+        }
+    }
+
+    if (data.sgwLdnIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = LocalDistinguishedNameIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        LocalDistinguishedNameIe localDistinguishedName=
+        dynamic_cast<
+        LocalDistinguishedNameIe&>(GtpV2IeFactory::getInstance().getIeObject(LocalDistinguishedNameIeType));
+        rc = localDistinguishedName.encodeLocalDistinguishedNameIe(buffer, data.sgwLdn);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: sgwLdn\n");
+            return false;
+        }
+    }
+
+    if (data.pgwLdnIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = LocalDistinguishedNameIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        LocalDistinguishedNameIe localDistinguishedName=
+        dynamic_cast<
+        LocalDistinguishedNameIe&>(GtpV2IeFactory::getInstance().getIeObject(LocalDistinguishedNameIeType));
+        rc = localDistinguishedName.encodeLocalDistinguishedNameIe(buffer, data.pgwLdn);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: pgwLdn\n");
+            return false;
+        }
+    }
+
+    if (data.pgwBackOffTimeIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = EpcTimerIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        EpcTimerIe epcTimer=
+        dynamic_cast<
+        EpcTimerIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcTimerIeType));
+        rc = epcTimer.encodeEpcTimerIe(buffer, data.pgwBackOffTime);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: pgwBackOffTime\n");
+            return false;
+        }
+    }
+
+    if (data.hNbInformationReportingIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = HenbInformationReportingIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        HenbInformationReportingIe henbInformationReporting=
+        dynamic_cast<
+        HenbInformationReportingIe&>(GtpV2IeFactory::getInstance().getIeObject(HenbInformationReportingIeType));
+        rc = henbInformationReporting.encodeHenbInformationReportingIe(buffer, data.hNbInformationReporting);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: hNbInformationReporting\n");
+            return false;
+        }
+    }
+
+    if (data.pgwS5S8S2bFTeidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.pgwS5S8S2bFTeid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: pgwS5S8S2bFTeid\n");
+            return false;
+        }
+    }
+
+    if (data.pdnAddressAllocationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = PaaIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        PaaIe paa=
+        dynamic_cast<
+        PaaIe&>(GtpV2IeFactory::getInstance().getIeObject(PaaIeType));
+        rc = paa.encodePaaIe(buffer, data.pdnAddressAllocation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: pdnAddressAllocation\n");
+            return false;
+        }
+    }
+
+    if (data.protocolConfigurationOptionsIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = PcoIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        PcoIe pco=
+        dynamic_cast<
+        PcoIe&>(GtpV2IeFactory::getInstance().getIeObject(PcoIeType));
+        rc = pco.encodePcoIe(buffer, data.protocolConfigurationOptions);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: protocolConfigurationOptions\n");
+            return false;
+        }
+    }
+
+    if (data.additionalProtocolConfigurationOptionsIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = AdditionalProtocolConfigurationOptionsIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        AdditionalProtocolConfigurationOptionsIe additionalProtocolConfigurationOptions=
+        dynamic_cast<
+        AdditionalProtocolConfigurationOptionsIe&>(GtpV2IeFactory::getInstance().getIeObject(AdditionalProtocolConfigurationOptionsIeType));
+        rc = additionalProtocolConfigurationOptions.encodeAdditionalProtocolConfigurationOptionsIe(buffer, data.additionalProtocolConfigurationOptions);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: additionalProtocolConfigurationOptions\n");
+            return false;
+        }
+    }
+
+    if (data.trustedWlanIpv4ParametersIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = Ip4cpIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        Ip4cpIe ip4cp=
+        dynamic_cast<
+        Ip4cpIe&>(GtpV2IeFactory::getInstance().getIeObject(Ip4cpIeType));
+        rc = ip4cp.encodeIp4cpIe(buffer, data.trustedWlanIpv4Parameters);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: trustedWlanIpv4Parameters\n");
+            return false;
+        }
+    }
+
+    if (data.indicationFlagsIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = IndicationIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        IndicationIe indication=
+        dynamic_cast<
+        IndicationIe&>(GtpV2IeFactory::getInstance().getIeObject(IndicationIeType));
+        rc = indication.encodeIndicationIe(buffer, data.indicationFlags);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: indicationFlags\n");
+            return false;
+        }
+    }
+
+    if (data.presenceReportingAreaActionIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = PresenceReportingAreaActionIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        PresenceReportingAreaActionIe presenceReportingAreaAction=
+        dynamic_cast<
+        PresenceReportingAreaActionIe&>(GtpV2IeFactory::getInstance().getIeObject(PresenceReportingAreaActionIeType));
+        rc = presenceReportingAreaAction.encodePresenceReportingAreaActionIe(buffer, data.presenceReportingAreaAction);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: presenceReportingAreaAction\n");
+            return false;
+        }
+    }
+
+    if (data.pgwsNodeLevelLoadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = LoadControlInformationIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        LoadControlInformationIe loadControlInformation=
+        dynamic_cast<
+        LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+        PgwsNodeLevelLoadControlInformationInCreateSessionResponse groupedIeInstance =
+        dynamic_cast<
+         PgwsNodeLevelLoadControlInformationInCreateSessionResponse&>(loadControlInformation.getGroupedIe(msgType, 0));
+        rc = groupedIeInstance.encodePgwsNodeLevelLoadControlInformationInCreateSessionResponse(buffer, data.pgwsNodeLevelLoadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: pgwsNodeLevelLoadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.pgwsApnLevelLoadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = LoadControlInformationIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        LoadControlInformationIe loadControlInformation=
+        dynamic_cast<
+        LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+        PgwsApnLevelLoadControlInformationInCreateSessionResponse groupedIeInstance =
+        dynamic_cast<
+         PgwsApnLevelLoadControlInformationInCreateSessionResponse&>(loadControlInformation.getGroupedIe(msgType, 1));
+        rc = groupedIeInstance.encodePgwsApnLevelLoadControlInformationInCreateSessionResponse(buffer, data.pgwsApnLevelLoadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: pgwsApnLevelLoadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.sgwsNodeLevelLoadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = LoadControlInformationIeType;
+        header.instance = 2;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        LoadControlInformationIe loadControlInformation=
+        dynamic_cast<
+        LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+        SgwsNodeLevelLoadControlInformationInCreateSessionResponse groupedIeInstance =
+        dynamic_cast<
+         SgwsNodeLevelLoadControlInformationInCreateSessionResponse&>(loadControlInformation.getGroupedIe(msgType, 2));
+        rc = groupedIeInstance.encodeSgwsNodeLevelLoadControlInformationInCreateSessionResponse(buffer, data.sgwsNodeLevelLoadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: sgwsNodeLevelLoadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.pgwsOverloadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = OverloadControlInformationIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+        PgwsOverloadControlInformationInCreateSessionResponse groupedIeInstance =
+        dynamic_cast<
+         PgwsOverloadControlInformationInCreateSessionResponse&>(overloadControlInformation.getGroupedIe(msgType, 0));
+        rc = groupedIeInstance.encodePgwsOverloadControlInformationInCreateSessionResponse(buffer, data.pgwsOverloadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: pgwsOverloadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.sgwsOverloadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = OverloadControlInformationIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+        SgwsOverloadControlInformationInCreateSessionResponse groupedIeInstance =
+        dynamic_cast<
+         SgwsOverloadControlInformationInCreateSessionResponse&>(overloadControlInformation.getGroupedIe(msgType, 1));
+        rc = groupedIeInstance.encodeSgwsOverloadControlInformationInCreateSessionResponse(buffer, data.sgwsOverloadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: sgwsOverloadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.nbifomContainerIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FContainerIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FContainerIe fContainer=
+        dynamic_cast<
+        FContainerIe&>(GtpV2IeFactory::getInstance().getIeObject(FContainerIeType));
+        rc = fContainer.encodeFContainerIe(buffer, data.nbifomContainer);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: nbifomContainer\n");
+            return false;
+        }
+    }
+
+    if (data.pdnConnectionChargingIdIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = ChargingIdIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        ChargingIdIe chargingId=
+        dynamic_cast<
+        ChargingIdIe&>(GtpV2IeFactory::getInstance().getIeObject(ChargingIdIeType));
+        rc = chargingId.encodeChargingIdIe(buffer, data.pdnConnectionChargingId);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: pdnConnectionChargingId\n");
+            return false;
+        }
+    }
+
+    if (data.extendedProtocolConfigurationOptionsIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = EpcoIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        EpcoIe epco=
+        dynamic_cast<
+        EpcoIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcoIeType));
+        rc = epco.encodeEpcoIe(buffer, data.extendedProtocolConfigurationOptions);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: extendedProtocolConfigurationOptions\n");
+            return false;
+        }
+    }
+    return rc;
+
+}
+
+bool CreateSessionResponseMsg::decodeCreateSessionResponseMsg(MsgBuffer &buffer,
+ CreateSessionResponseMsgData 
+ &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+  
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+
+        switch (ieHeader.ieType){
+     
+            case CauseIeType:
+            {
+                CauseIe ieObject =
+                dynamic_cast<
+                CauseIe&>(GtpV2IeFactory::getInstance().getIeObject(CauseIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeCauseIe(buffer, data.cause, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: cause\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case ChangeReportingActionIeType:
+            {
+                ChangeReportingActionIe ieObject =
+                dynamic_cast<
+                ChangeReportingActionIe&>(GtpV2IeFactory::getInstance().getIeObject(ChangeReportingActionIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeChangeReportingActionIe(buffer, data.changeReportingAction, ieHeader.length);
+
+                    data.changeReportingActionIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: changeReportingAction\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case CsgInformationReportingActionIeType:
+            {
+                CsgInformationReportingActionIe ieObject =
+                dynamic_cast<
+                CsgInformationReportingActionIe&>(GtpV2IeFactory::getInstance().getIeObject(CsgInformationReportingActionIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeCsgInformationReportingActionIe(buffer, data.csgInformationReportingAction, ieHeader.length);
+
+                    data.csgInformationReportingActionIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: csgInformationReportingAction\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case FTeidIeType:
+            {
+                FTeidIe ieObject =
+                dynamic_cast<
+                FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeFTeidIe(buffer, data.senderFTeidForControlPlane, ieHeader.length);
+
+                    data.senderFTeidForControlPlaneIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: senderFTeidForControlPlane\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					rc = ieObject.decodeFTeidIe(buffer, data.pgwS5S8S2bFTeid, ieHeader.length);
+
+                    data.pgwS5S8S2bFTeidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: pgwS5S8S2bFTeid\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case ApnRestrictionIeType:
+            {
+                ApnRestrictionIe ieObject =
+                dynamic_cast<
+                ApnRestrictionIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnRestrictionIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeApnRestrictionIe(buffer, data.apnRestriction, ieHeader.length);
+
+                    data.apnRestrictionIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: apnRestriction\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case AmbrIeType:
+            {
+                AmbrIe ieObject =
+                dynamic_cast<
+                AmbrIe&>(GtpV2IeFactory::getInstance().getIeObject(AmbrIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeAmbrIe(buffer, data.aggregateMaximumBitRate, ieHeader.length);
+
+                    data.aggregateMaximumBitRateIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: aggregateMaximumBitRate\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case EbiIeType:
+            {
+                EbiIe ieObject =
+                dynamic_cast<
+                EbiIe&>(GtpV2IeFactory::getInstance().getIeObject(EbiIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeEbiIe(buffer, data.linkedEpsBearerId, ieHeader.length);
+
+                    data.linkedEpsBearerIdIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: linkedEpsBearerId\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case BearerContextIeType:
+            {
+                BearerContextIe ieObject =
+                dynamic_cast<
+                BearerContextIe&>(GtpV2IeFactory::getInstance().getIeObject(BearerContextIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					// First check if we have enough space left to decode and store this instance
+                    if (data.bearerContextsCreatedCount == 11)
+                    {
+                        errorStream.add((char *)"More than 11 instances of bearerContextsCreated received\n");
+                        return false;
+                    }
+                    BearerContextsCreatedInCreateSessionResponse groupedIeInstance =
+                    dynamic_cast<
+                    BearerContextsCreatedInCreateSessionResponse&>(ieObject.getGroupedIe(msgType, 0));
+                    rc = groupedIeInstance.decodeBearerContextsCreatedInCreateSessionResponse(buffer,
+                    data.bearerContextsCreated[data.bearerContextsCreatedCount], ieHeader.length);
+                    data.bearerContextsCreatedCount++; // TODO Count validation
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: bearerContextsCreated\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					// First check if we have enough space left to decode and store this instance
+                    if (data.bearerContextsMarkedForRemovalCount == 11)
+                    {
+                        errorStream.add((char *)"More than 11 instances of bearerContextsMarkedForRemoval received\n");
+                        return false;
+                    }
+                    BearerContextsMarkedForRemovalInCreateSessionResponse groupedIeInstance =
+                    dynamic_cast<
+                    BearerContextsMarkedForRemovalInCreateSessionResponse&>(ieObject.getGroupedIe(msgType, 1));
+                    rc = groupedIeInstance.decodeBearerContextsMarkedForRemovalInCreateSessionResponse(buffer,
+                    data.bearerContextsMarkedForRemoval[data.bearerContextsMarkedForRemovalCount], ieHeader.length);
+                    data.bearerContextsMarkedForRemovalCount++; // TODO Count validation
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: bearerContextsMarkedForRemoval\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case RecoveryIeType:
+            {
+                RecoveryIe ieObject =
+                dynamic_cast<
+                RecoveryIe&>(GtpV2IeFactory::getInstance().getIeObject(RecoveryIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeRecoveryIe(buffer, data.recovery, ieHeader.length);
+
+                    data.recoveryIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: recovery\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case FqdnIeType:
+            {
+                FqdnIe ieObject =
+                dynamic_cast<
+                FqdnIe&>(GtpV2IeFactory::getInstance().getIeObject(FqdnIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeFqdnIe(buffer, data.chargingGatewayName, ieHeader.length);
+
+                    data.chargingGatewayNameIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: chargingGatewayName\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case IpAddressIeType:
+            {
+                IpAddressIe ieObject =
+                dynamic_cast<
+                IpAddressIe&>(GtpV2IeFactory::getInstance().getIeObject(IpAddressIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeIpAddressIe(buffer, data.chargingGatewayAddress, ieHeader.length);
+
+                    data.chargingGatewayAddressIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: chargingGatewayAddress\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case FqCsidIeType:
+            {
+                FqCsidIe ieObject =
+                dynamic_cast<
+                FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeFqCsidIe(buffer, data.pgwFqCsid, ieHeader.length);
+
+                    data.pgwFqCsidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: pgwFqCsid\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					rc = ieObject.decodeFqCsidIe(buffer, data.sgwFqCsid, ieHeader.length);
+
+                    data.sgwFqCsidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: sgwFqCsid\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case LocalDistinguishedNameIeType:
+            {
+                LocalDistinguishedNameIe ieObject =
+                dynamic_cast<
+                LocalDistinguishedNameIe&>(GtpV2IeFactory::getInstance().getIeObject(LocalDistinguishedNameIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeLocalDistinguishedNameIe(buffer, data.sgwLdn, ieHeader.length);
+
+                    data.sgwLdnIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: sgwLdn\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					rc = ieObject.decodeLocalDistinguishedNameIe(buffer, data.pgwLdn, ieHeader.length);
+
+                    data.pgwLdnIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: pgwLdn\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case EpcTimerIeType:
+            {
+                EpcTimerIe ieObject =
+                dynamic_cast<
+                EpcTimerIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcTimerIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeEpcTimerIe(buffer, data.pgwBackOffTime, ieHeader.length);
+
+                    data.pgwBackOffTimeIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: pgwBackOffTime\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case HenbInformationReportingIeType:
+            {
+                HenbInformationReportingIe ieObject =
+                dynamic_cast<
+                HenbInformationReportingIe&>(GtpV2IeFactory::getInstance().getIeObject(HenbInformationReportingIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeHenbInformationReportingIe(buffer, data.hNbInformationReporting, ieHeader.length);
+
+                    data.hNbInformationReportingIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: hNbInformationReporting\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case PaaIeType:
+            {
+                PaaIe ieObject =
+                dynamic_cast<
+                PaaIe&>(GtpV2IeFactory::getInstance().getIeObject(PaaIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodePaaIe(buffer, data.pdnAddressAllocation, ieHeader.length);
+
+                    data.pdnAddressAllocationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: pdnAddressAllocation\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case PcoIeType:
+            {
+                PcoIe ieObject =
+                dynamic_cast<
+                PcoIe&>(GtpV2IeFactory::getInstance().getIeObject(PcoIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodePcoIe(buffer, data.protocolConfigurationOptions, ieHeader.length);
+
+                    data.protocolConfigurationOptionsIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: protocolConfigurationOptions\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case AdditionalProtocolConfigurationOptionsIeType:
+            {
+                AdditionalProtocolConfigurationOptionsIe ieObject =
+                dynamic_cast<
+                AdditionalProtocolConfigurationOptionsIe&>(GtpV2IeFactory::getInstance().getIeObject(AdditionalProtocolConfigurationOptionsIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeAdditionalProtocolConfigurationOptionsIe(buffer, data.additionalProtocolConfigurationOptions, ieHeader.length);
+
+                    data.additionalProtocolConfigurationOptionsIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: additionalProtocolConfigurationOptions\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case Ip4cpIeType:
+            {
+                Ip4cpIe ieObject =
+                dynamic_cast<
+                Ip4cpIe&>(GtpV2IeFactory::getInstance().getIeObject(Ip4cpIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeIp4cpIe(buffer, data.trustedWlanIpv4Parameters, ieHeader.length);
+
+                    data.trustedWlanIpv4ParametersIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: trustedWlanIpv4Parameters\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case IndicationIeType:
+            {
+                IndicationIe ieObject =
+                dynamic_cast<
+                IndicationIe&>(GtpV2IeFactory::getInstance().getIeObject(IndicationIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeIndicationIe(buffer, data.indicationFlags, ieHeader.length);
+
+                    data.indicationFlagsIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: indicationFlags\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case PresenceReportingAreaActionIeType:
+            {
+                PresenceReportingAreaActionIe ieObject =
+                dynamic_cast<
+                PresenceReportingAreaActionIe&>(GtpV2IeFactory::getInstance().getIeObject(PresenceReportingAreaActionIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodePresenceReportingAreaActionIe(buffer, data.presenceReportingAreaAction, ieHeader.length);
+
+                    data.presenceReportingAreaActionIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: presenceReportingAreaAction\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case LoadControlInformationIeType:
+            {
+                LoadControlInformationIe ieObject =
+                dynamic_cast<
+                LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					PgwsNodeLevelLoadControlInformationInCreateSessionResponse groupedIeInstance =
+					dynamic_cast<
+					PgwsNodeLevelLoadControlInformationInCreateSessionResponse&>(ieObject.getGroupedIe(msgType, 0));
+					rc = groupedIeInstance.decodePgwsNodeLevelLoadControlInformationInCreateSessionResponse(buffer, data.pgwsNodeLevelLoadControlInformation, ieHeader.length);
+
+                    data.pgwsNodeLevelLoadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: pgwsNodeLevelLoadControlInformation\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					PgwsApnLevelLoadControlInformationInCreateSessionResponse groupedIeInstance =
+					dynamic_cast<
+					PgwsApnLevelLoadControlInformationInCreateSessionResponse&>(ieObject.getGroupedIe(msgType, 1));
+					rc = groupedIeInstance.decodePgwsApnLevelLoadControlInformationInCreateSessionResponse(buffer, data.pgwsApnLevelLoadControlInformation, ieHeader.length);
+
+                    data.pgwsApnLevelLoadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: pgwsApnLevelLoadControlInformation\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 2)
+                {
+					SgwsNodeLevelLoadControlInformationInCreateSessionResponse groupedIeInstance =
+					dynamic_cast<
+					SgwsNodeLevelLoadControlInformationInCreateSessionResponse&>(ieObject.getGroupedIe(msgType, 2));
+					rc = groupedIeInstance.decodeSgwsNodeLevelLoadControlInformationInCreateSessionResponse(buffer, data.sgwsNodeLevelLoadControlInformation, ieHeader.length);
+
+                    data.sgwsNodeLevelLoadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: sgwsNodeLevelLoadControlInformation\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case OverloadControlInformationIeType:
+            {
+                OverloadControlInformationIe ieObject =
+                dynamic_cast<
+                OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					PgwsOverloadControlInformationInCreateSessionResponse groupedIeInstance =
+					dynamic_cast<
+					PgwsOverloadControlInformationInCreateSessionResponse&>(ieObject.getGroupedIe(msgType, 0));
+					rc = groupedIeInstance.decodePgwsOverloadControlInformationInCreateSessionResponse(buffer, data.pgwsOverloadControlInformation, ieHeader.length);
+
+                    data.pgwsOverloadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: pgwsOverloadControlInformation\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					SgwsOverloadControlInformationInCreateSessionResponse groupedIeInstance =
+					dynamic_cast<
+					SgwsOverloadControlInformationInCreateSessionResponse&>(ieObject.getGroupedIe(msgType, 1));
+					rc = groupedIeInstance.decodeSgwsOverloadControlInformationInCreateSessionResponse(buffer, data.sgwsOverloadControlInformation, ieHeader.length);
+
+                    data.sgwsOverloadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: sgwsOverloadControlInformation\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case FContainerIeType:
+            {
+                FContainerIe ieObject =
+                dynamic_cast<
+                FContainerIe&>(GtpV2IeFactory::getInstance().getIeObject(FContainerIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeFContainerIe(buffer, data.nbifomContainer, ieHeader.length);
+
+                    data.nbifomContainerIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: nbifomContainer\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case ChargingIdIeType:
+            {
+                ChargingIdIe ieObject =
+                dynamic_cast<
+                ChargingIdIe&>(GtpV2IeFactory::getInstance().getIeObject(ChargingIdIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeChargingIdIe(buffer, data.pdnConnectionChargingId, ieHeader.length);
+
+                    data.pdnConnectionChargingIdIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: pdnConnectionChargingId\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case EpcoIeType:
+            {
+                EpcoIe ieObject =
+                dynamic_cast<
+                EpcoIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcoIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeEpcoIe(buffer, data.extendedProtocolConfigurationOptions, ieHeader.length);
+
+                    data.extendedProtocolConfigurationOptionsIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: extendedProtocolConfigurationOptions\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+
+            default:
+            {
+                // Unknown IE print error
+                errorStream.add((char *)"Unknown IE Type: ");
+                errorStream.add(ieHeader.ieType);
+                errorStream.endOfLine();
+                buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    return rc; // TODO validations
+}
+
+void CreateSessionResponseMsg::
+displayCreateSessionResponseMsgData_v(CreateSessionResponseMsgData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"CreateSessionResponseMsg:");
+    stream.endOfLine();
+    stream.incrIndent();
+        
+    
+        stream.add((char *)"IE - cause:");
+        stream.endOfLine();
+        CauseIe cause=
+        dynamic_cast<
+        CauseIe&>(GtpV2IeFactory::getInstance().getIeObject(CauseIeType));
+        cause.displayCauseIe_v(data.cause, stream);
+
+    if (data.changeReportingActionIePresent)
+    {
+
+
+        stream.add((char *)"IE - changeReportingAction:");
+        stream.endOfLine();
+        ChangeReportingActionIe changeReportingAction=
+        dynamic_cast<
+        ChangeReportingActionIe&>(GtpV2IeFactory::getInstance().getIeObject(ChangeReportingActionIeType));
+        changeReportingAction.displayChangeReportingActionIe_v(data.changeReportingAction, stream);
+
+    }
+    if (data.csgInformationReportingActionIePresent)
+    {
+
+
+        stream.add((char *)"IE - csgInformationReportingAction:");
+        stream.endOfLine();
+        CsgInformationReportingActionIe csgInformationReportingAction=
+        dynamic_cast<
+        CsgInformationReportingActionIe&>(GtpV2IeFactory::getInstance().getIeObject(CsgInformationReportingActionIeType));
+        csgInformationReportingAction.displayCsgInformationReportingActionIe_v(data.csgInformationReportingAction, stream);
+
+    }
+    if (data.senderFTeidForControlPlaneIePresent)
+    {
+
+
+        stream.add((char *)"IE - senderFTeidForControlPlane:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.senderFTeidForControlPlane, stream);
+
+    }
+    if (data.apnRestrictionIePresent)
+    {
+
+
+        stream.add((char *)"IE - apnRestriction:");
+        stream.endOfLine();
+        ApnRestrictionIe apnRestriction=
+        dynamic_cast<
+        ApnRestrictionIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnRestrictionIeType));
+        apnRestriction.displayApnRestrictionIe_v(data.apnRestriction, stream);
+
+    }
+    if (data.aggregateMaximumBitRateIePresent)
+    {
+
+
+        stream.add((char *)"IE - aggregateMaximumBitRate:");
+        stream.endOfLine();
+        AmbrIe ambr=
+        dynamic_cast<
+        AmbrIe&>(GtpV2IeFactory::getInstance().getIeObject(AmbrIeType));
+        ambr.displayAmbrIe_v(data.aggregateMaximumBitRate, stream);
+
+    }
+    if (data.linkedEpsBearerIdIePresent)
+    {
+
+
+        stream.add((char *)"IE - linkedEpsBearerId:");
+        stream.endOfLine();
+        EbiIe ebi=
+        dynamic_cast<
+        EbiIe&>(GtpV2IeFactory::getInstance().getIeObject(EbiIeType));
+        ebi.displayEbiIe_v(data.linkedEpsBearerId, stream);
+
+    }
+
+    Uint8 displayCount;
+    
+    displayCount = data.bearerContextsCreatedCount;
+    if (displayCount > 11)
+    {
+        stream.add((char *)"Invalid data more than 11 instances");
+        stream.endOfLine();
+        stream.add((char *)"Displaying only 11");
+        stream.endOfLine();
+        displayCount = 11;
+    }
+    for (Uint8 i = 0; i < displayCount; i++)
+    {
+        stream.add((char *)"IE -  bearerContextsCreated:");
+        stream.endOfLine();
+        BearerContextIe bearerContext=
+        dynamic_cast<
+        BearerContextIe&>(GtpV2IeFactory::getInstance().getIeObject(BearerContextIeType));
+        BearerContextsCreatedInCreateSessionResponse groupedIeInstance =
+        dynamic_cast<
+        BearerContextsCreatedInCreateSessionResponse&>(bearerContext.getGroupedIe(msgType, 0));
+        groupedIeInstance.displayBearerContextsCreatedInCreateSessionResponseData_v(data.bearerContextsCreated[i], stream);
+
+    }
+    displayCount = data.bearerContextsMarkedForRemovalCount;
+    if (displayCount > 11)
+    {
+        stream.add((char *)"Invalid data more than 11 instances");
+        stream.endOfLine();
+        stream.add((char *)"Displaying only 11");
+        stream.endOfLine();
+        displayCount = 11;
+    }
+    for (Uint8 i = 0; i < displayCount; i++)
+    {
+        stream.add((char *)"IE -  bearerContextsMarkedForRemoval:");
+        stream.endOfLine();
+        BearerContextIe bearerContext=
+        dynamic_cast<
+        BearerContextIe&>(GtpV2IeFactory::getInstance().getIeObject(BearerContextIeType));
+                BearerContextsMarkedForRemovalInCreateSessionResponse groupedIeInstance =
+        dynamic_cast<
+        BearerContextsMarkedForRemovalInCreateSessionResponse&>(bearerContext.getGroupedIe(msgType, 1));
+        groupedIeInstance.displayBearerContextsMarkedForRemovalInCreateSessionResponseData_v(data.bearerContextsMarkedForRemoval[i], stream);
+    }
+
+    
+
+    
+    if (data.recoveryIePresent)
+    {
+
+
+        stream.add((char *)"IE - recovery:");
+        stream.endOfLine();
+        RecoveryIe recovery=
+        dynamic_cast<
+        RecoveryIe&>(GtpV2IeFactory::getInstance().getIeObject(RecoveryIeType));
+        recovery.displayRecoveryIe_v(data.recovery, stream);
+
+    }
+    if (data.chargingGatewayNameIePresent)
+    {
+
+
+        stream.add((char *)"IE - chargingGatewayName:");
+        stream.endOfLine();
+        FqdnIe fqdn=
+        dynamic_cast<
+        FqdnIe&>(GtpV2IeFactory::getInstance().getIeObject(FqdnIeType));
+        fqdn.displayFqdnIe_v(data.chargingGatewayName, stream);
+
+    }
+    if (data.chargingGatewayAddressIePresent)
+    {
+
+
+        stream.add((char *)"IE - chargingGatewayAddress:");
+        stream.endOfLine();
+        IpAddressIe ipAddress=
+        dynamic_cast<
+        IpAddressIe&>(GtpV2IeFactory::getInstance().getIeObject(IpAddressIeType));
+        ipAddress.displayIpAddressIe_v(data.chargingGatewayAddress, stream);
+
+    }
+    if (data.pgwFqCsidIePresent)
+    {
+
+
+        stream.add((char *)"IE - pgwFqCsid:");
+        stream.endOfLine();
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        fqCsid.displayFqCsidIe_v(data.pgwFqCsid, stream);
+
+    }
+    if (data.sgwFqCsidIePresent)
+    {
+
+
+        stream.add((char *)"IE - sgwFqCsid:");
+        stream.endOfLine();
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        fqCsid.displayFqCsidIe_v(data.sgwFqCsid, stream);
+
+    }
+    if (data.sgwLdnIePresent)
+    {
+
+
+        stream.add((char *)"IE - sgwLdn:");
+        stream.endOfLine();
+        LocalDistinguishedNameIe localDistinguishedName=
+        dynamic_cast<
+        LocalDistinguishedNameIe&>(GtpV2IeFactory::getInstance().getIeObject(LocalDistinguishedNameIeType));
+        localDistinguishedName.displayLocalDistinguishedNameIe_v(data.sgwLdn, stream);
+
+    }
+    if (data.pgwLdnIePresent)
+    {
+
+
+        stream.add((char *)"IE - pgwLdn:");
+        stream.endOfLine();
+        LocalDistinguishedNameIe localDistinguishedName=
+        dynamic_cast<
+        LocalDistinguishedNameIe&>(GtpV2IeFactory::getInstance().getIeObject(LocalDistinguishedNameIeType));
+        localDistinguishedName.displayLocalDistinguishedNameIe_v(data.pgwLdn, stream);
+
+    }
+    if (data.pgwBackOffTimeIePresent)
+    {
+
+
+        stream.add((char *)"IE - pgwBackOffTime:");
+        stream.endOfLine();
+        EpcTimerIe epcTimer=
+        dynamic_cast<
+        EpcTimerIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcTimerIeType));
+        epcTimer.displayEpcTimerIe_v(data.pgwBackOffTime, stream);
+
+    }
+    if (data.hNbInformationReportingIePresent)
+    {
+
+
+        stream.add((char *)"IE - hNbInformationReporting:");
+        stream.endOfLine();
+        HenbInformationReportingIe henbInformationReporting=
+        dynamic_cast<
+        HenbInformationReportingIe&>(GtpV2IeFactory::getInstance().getIeObject(HenbInformationReportingIeType));
+        henbInformationReporting.displayHenbInformationReportingIe_v(data.hNbInformationReporting, stream);
+
+    }
+    if (data.pgwS5S8S2bFTeidIePresent)
+    {
+
+
+        stream.add((char *)"IE - pgwS5S8S2bFTeid:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.pgwS5S8S2bFTeid, stream);
+
+    }
+    if (data.pdnAddressAllocationIePresent)
+    {
+
+
+        stream.add((char *)"IE - pdnAddressAllocation:");
+        stream.endOfLine();
+        PaaIe paa=
+        dynamic_cast<
+        PaaIe&>(GtpV2IeFactory::getInstance().getIeObject(PaaIeType));
+        paa.displayPaaIe_v(data.pdnAddressAllocation, stream);
+
+    }
+    if (data.protocolConfigurationOptionsIePresent)
+    {
+
+
+        stream.add((char *)"IE - protocolConfigurationOptions:");
+        stream.endOfLine();
+        PcoIe pco=
+        dynamic_cast<
+        PcoIe&>(GtpV2IeFactory::getInstance().getIeObject(PcoIeType));
+        pco.displayPcoIe_v(data.protocolConfigurationOptions, stream);
+
+    }
+    if (data.additionalProtocolConfigurationOptionsIePresent)
+    {
+
+
+        stream.add((char *)"IE - additionalProtocolConfigurationOptions:");
+        stream.endOfLine();
+        AdditionalProtocolConfigurationOptionsIe additionalProtocolConfigurationOptions=
+        dynamic_cast<
+        AdditionalProtocolConfigurationOptionsIe&>(GtpV2IeFactory::getInstance().getIeObject(AdditionalProtocolConfigurationOptionsIeType));
+        additionalProtocolConfigurationOptions.displayAdditionalProtocolConfigurationOptionsIe_v(data.additionalProtocolConfigurationOptions, stream);
+
+    }
+    if (data.trustedWlanIpv4ParametersIePresent)
+    {
+
+
+        stream.add((char *)"IE - trustedWlanIpv4Parameters:");
+        stream.endOfLine();
+        Ip4cpIe ip4cp=
+        dynamic_cast<
+        Ip4cpIe&>(GtpV2IeFactory::getInstance().getIeObject(Ip4cpIeType));
+        ip4cp.displayIp4cpIe_v(data.trustedWlanIpv4Parameters, stream);
+
+    }
+    if (data.indicationFlagsIePresent)
+    {
+
+
+        stream.add((char *)"IE - indicationFlags:");
+        stream.endOfLine();
+        IndicationIe indication=
+        dynamic_cast<
+        IndicationIe&>(GtpV2IeFactory::getInstance().getIeObject(IndicationIeType));
+        indication.displayIndicationIe_v(data.indicationFlags, stream);
+
+    }
+    if (data.presenceReportingAreaActionIePresent)
+    {
+
+
+        stream.add((char *)"IE - presenceReportingAreaAction:");
+        stream.endOfLine();
+        PresenceReportingAreaActionIe presenceReportingAreaAction=
+        dynamic_cast<
+        PresenceReportingAreaActionIe&>(GtpV2IeFactory::getInstance().getIeObject(PresenceReportingAreaActionIeType));
+        presenceReportingAreaAction.displayPresenceReportingAreaActionIe_v(data.presenceReportingAreaAction, stream);
+
+    }
+    if (data.pgwsNodeLevelLoadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - pgwsNodeLevelLoadControlInformation:");
+        stream.endOfLine();
+        LoadControlInformationIe loadControlInformation=
+        dynamic_cast<
+        LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+            PgwsNodeLevelLoadControlInformationInCreateSessionResponse groupedIeInstance =
+        dynamic_cast<
+        PgwsNodeLevelLoadControlInformationInCreateSessionResponse&>(loadControlInformation.getGroupedIe(msgType, 0));
+        groupedIeInstance.displayPgwsNodeLevelLoadControlInformationInCreateSessionResponseData_v(data.pgwsNodeLevelLoadControlInformation, stream);
+
+    }
+    if (data.pgwsApnLevelLoadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - pgwsApnLevelLoadControlInformation:");
+        stream.endOfLine();
+        LoadControlInformationIe loadControlInformation=
+        dynamic_cast<
+        LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+            PgwsApnLevelLoadControlInformationInCreateSessionResponse groupedIeInstance =
+        dynamic_cast<
+        PgwsApnLevelLoadControlInformationInCreateSessionResponse&>(loadControlInformation.getGroupedIe(msgType, 1));
+        groupedIeInstance.displayPgwsApnLevelLoadControlInformationInCreateSessionResponseData_v(data.pgwsApnLevelLoadControlInformation, stream);
+
+    }
+    if (data.sgwsNodeLevelLoadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - sgwsNodeLevelLoadControlInformation:");
+        stream.endOfLine();
+        LoadControlInformationIe loadControlInformation=
+        dynamic_cast<
+        LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+            SgwsNodeLevelLoadControlInformationInCreateSessionResponse groupedIeInstance =
+        dynamic_cast<
+        SgwsNodeLevelLoadControlInformationInCreateSessionResponse&>(loadControlInformation.getGroupedIe(msgType, 2));
+        groupedIeInstance.displaySgwsNodeLevelLoadControlInformationInCreateSessionResponseData_v(data.sgwsNodeLevelLoadControlInformation, stream);
+
+    }
+    if (data.pgwsOverloadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - pgwsOverloadControlInformation:");
+        stream.endOfLine();
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+            PgwsOverloadControlInformationInCreateSessionResponse groupedIeInstance =
+        dynamic_cast<
+        PgwsOverloadControlInformationInCreateSessionResponse&>(overloadControlInformation.getGroupedIe(msgType, 0));
+        groupedIeInstance.displayPgwsOverloadControlInformationInCreateSessionResponseData_v(data.pgwsOverloadControlInformation, stream);
+
+    }
+    if (data.sgwsOverloadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - sgwsOverloadControlInformation:");
+        stream.endOfLine();
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+            SgwsOverloadControlInformationInCreateSessionResponse groupedIeInstance =
+        dynamic_cast<
+        SgwsOverloadControlInformationInCreateSessionResponse&>(overloadControlInformation.getGroupedIe(msgType, 1));
+        groupedIeInstance.displaySgwsOverloadControlInformationInCreateSessionResponseData_v(data.sgwsOverloadControlInformation, stream);
+
+    }
+    if (data.nbifomContainerIePresent)
+    {
+
+
+        stream.add((char *)"IE - nbifomContainer:");
+        stream.endOfLine();
+        FContainerIe fContainer=
+        dynamic_cast<
+        FContainerIe&>(GtpV2IeFactory::getInstance().getIeObject(FContainerIeType));
+        fContainer.displayFContainerIe_v(data.nbifomContainer, stream);
+
+    }
+    if (data.pdnConnectionChargingIdIePresent)
+    {
+
+
+        stream.add((char *)"IE - pdnConnectionChargingId:");
+        stream.endOfLine();
+        ChargingIdIe chargingId=
+        dynamic_cast<
+        ChargingIdIe&>(GtpV2IeFactory::getInstance().getIeObject(ChargingIdIeType));
+        chargingId.displayChargingIdIe_v(data.pdnConnectionChargingId, stream);
+
+    }
+    if (data.extendedProtocolConfigurationOptionsIePresent)
+    {
+
+
+        stream.add((char *)"IE - extendedProtocolConfigurationOptions:");
+        stream.endOfLine();
+        EpcoIe epco=
+        dynamic_cast<
+        EpcoIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcoIeType));
+        epco.displayEpcoIe_v(data.extendedProtocolConfigurationOptions, stream);
+
+    }
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
diff --git a/src/gtpV2Codec/msgClasses/createSessionResponseMsg.h b/src/gtpV2Codec/msgClasses/createSessionResponseMsg.h
new file mode 100644
index 0000000..e394232
--- /dev/null
+++ b/src/gtpV2Codec/msgClasses/createSessionResponseMsg.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/msgtemplate.h.tt>
+ ******************************************************************************/
+#ifndef CREATESESSIONRESPONSEMSG_H_
+#define CREATESESSIONRESPONSEMSG_H_
+
+#include <set>
+#include "manual/gtpV2Message.h"
+#include <msgBuffer.h>
+#include <debug.h>
+#include "gtpV2MsgDataTypes.h"
+
+
+class CreateSessionResponseMsg:public GtpV2Message
+{
+public:
+    CreateSessionResponseMsg();
+    virtual ~CreateSessionResponseMsg();
+    bool encodeCreateSessionResponseMsg(MsgBuffer &buffer, CreateSessionResponseMsgData const &data);
+
+    bool decodeCreateSessionResponseMsg (MsgBuffer &buffer, CreateSessionResponseMsgData& data, Uint16 length);
+
+    void displayCreateSessionResponseMsgData_v(CreateSessionResponseMsgData const &data, Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/msgClasses/deleteBearerRequestMsg.cpp b/src/gtpV2Codec/msgClasses/deleteBearerRequestMsg.cpp
new file mode 100644
index 0000000..3c8f0be
--- /dev/null
+++ b/src/gtpV2Codec/msgClasses/deleteBearerRequestMsg.cpp
@@ -0,0 +1,1215 @@
+/*
+ * 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/msgtemplate.cpp.tt>
+ ******************************************************************************/ 
+
+#include "deleteBearerRequestMsg.h"
+#include "../ieClasses/manual/gtpV2Ie.h"
+#include "../ieClasses/gtpV2IeFactory.h"
+#include "../ieClasses/ebiIe.h"
+#include "../ieClasses/ebiIe.h"
+#include "../ieClasses/bearerContextIe.h"
+#include "../ieClasses/failedBearerContextsInDeleteBearerRequest.h"
+#include "../ieClasses/ptiIe.h"
+#include "../ieClasses/pcoIe.h"
+#include "../ieClasses/fqCsidIe.h"
+#include "../ieClasses/fqCsidIe.h"
+#include "../ieClasses/causeIe.h"
+#include "../ieClasses/indicationIe.h"
+#include "../ieClasses/loadControlInformationIe.h"
+#include "../ieClasses/pgwsNodeLevelLoadControlInformationInDeleteBearerRequest.h"
+#include "../ieClasses/loadControlInformationIe.h"
+#include "../ieClasses/pgwsApnLevelLoadControlInformationInDeleteBearerRequest.h"
+#include "../ieClasses/loadControlInformationIe.h"
+#include "../ieClasses/sgwsNodeLevelLoadControlInformationInDeleteBearerRequest.h"
+#include "../ieClasses/overloadControlInformationIe.h"
+#include "../ieClasses/pgwsOverloadControlInformationInDeleteBearerRequest.h"
+#include "../ieClasses/overloadControlInformationIe.h"
+#include "../ieClasses/sgwsOverloadControlInformationInDeleteBearerRequest.h"
+#include "../ieClasses/fContainerIe.h"
+#include "../ieClasses/epcoIe.h"
+
+DeleteBearerRequestMsg::DeleteBearerRequestMsg()
+{
+    msgType = DeleteBearerRequestMsgType;
+
+}
+
+DeleteBearerRequestMsg::~DeleteBearerRequestMsg()
+{
+
+}
+
+bool DeleteBearerRequestMsg::encodeDeleteBearerRequestMsg(MsgBuffer &buffer,
+                        DeleteBearerRequestMsgData
+							const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+    if (data.linkedEpsBearerIdIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = EbiIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        EbiIe ebi=
+        dynamic_cast<
+        EbiIe&>(GtpV2IeFactory::getInstance().getIeObject(EbiIeType));
+        rc = ebi.encodeEbiIe(buffer, data.linkedEpsBearerId);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: linkedEpsBearerId\n");
+            return false;
+        }
+    }
+
+    if (data.epsBearerIdsIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = EbiIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        EbiIe ebi=
+        dynamic_cast<
+        EbiIe&>(GtpV2IeFactory::getInstance().getIeObject(EbiIeType));
+        rc = ebi.encodeEbiIe(buffer, data.epsBearerIds);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: epsBearerIds\n");
+            return false;
+        }
+    }
+
+        // First validate if the applicatoin provided more than the expected cardinality
+    if (data.failedBearerContextsCount > 11)
+    {
+        errorStream.add((char *)"Number of entries of failedBearerContexts exceeded\n");
+        errorStream.add((char *)"Expected count: 11 Received count: ");
+        errorStream.add((char *)"data.failedBearerContextsCount");
+        errorStream.endOfLine();
+        return false;
+    }
+    for (Uint8 i = 0; i < data.failedBearerContextsCount; i++)
+    {
+        // Encode the Ie Header
+        header.ieType = BearerContextIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        BearerContextIe bearerContext=
+        dynamic_cast<
+        BearerContextIe&>(GtpV2IeFactory::getInstance().
+        getIeObject(BearerContextIeType));
+        FailedBearerContextsInDeleteBearerRequest groupedIeInstance = dynamic_cast<FailedBearerContextsInDeleteBearerRequest&>(bearerContext.getGroupedIe(msgType, 0));
+        rc = groupedIeInstance.encodeFailedBearerContextsInDeleteBearerRequest(buffer, data.failedBearerContexts[i]);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+    }
+
+    if (!(rc))
+    { 
+        errorStream.add((char *)"Failed to encode IE: failedBearerContexts\n");
+        return false;
+    }
+
+    if (data.procedureTransactionIdIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = PtiIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        PtiIe pti=
+        dynamic_cast<
+        PtiIe&>(GtpV2IeFactory::getInstance().getIeObject(PtiIeType));
+        rc = pti.encodePtiIe(buffer, data.procedureTransactionId);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: procedureTransactionId\n");
+            return false;
+        }
+    }
+
+    if (data.protocolConfigurationOptionsIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = PcoIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        PcoIe pco=
+        dynamic_cast<
+        PcoIe&>(GtpV2IeFactory::getInstance().getIeObject(PcoIeType));
+        rc = pco.encodePcoIe(buffer, data.protocolConfigurationOptions);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: protocolConfigurationOptions\n");
+            return false;
+        }
+    }
+
+    if (data.pgwFqCsidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FqCsidIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        rc = fqCsid.encodeFqCsidIe(buffer, data.pgwFqCsid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: pgwFqCsid\n");
+            return false;
+        }
+    }
+
+    if (data.sgwFqCsidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FqCsidIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        rc = fqCsid.encodeFqCsidIe(buffer, data.sgwFqCsid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: sgwFqCsid\n");
+            return false;
+        }
+    }
+
+    if (data.causeIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = CauseIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        CauseIe cause=
+        dynamic_cast<
+        CauseIe&>(GtpV2IeFactory::getInstance().getIeObject(CauseIeType));
+        rc = cause.encodeCauseIe(buffer, data.cause);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: cause\n");
+            return false;
+        }
+    }
+
+    if (data.indicationFlagsIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = IndicationIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        IndicationIe indication=
+        dynamic_cast<
+        IndicationIe&>(GtpV2IeFactory::getInstance().getIeObject(IndicationIeType));
+        rc = indication.encodeIndicationIe(buffer, data.indicationFlags);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: indicationFlags\n");
+            return false;
+        }
+    }
+
+    if (data.pgwsNodeLevelLoadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = LoadControlInformationIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        LoadControlInformationIe loadControlInformation=
+        dynamic_cast<
+        LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+        PgwsNodeLevelLoadControlInformationInDeleteBearerRequest groupedIeInstance =
+        dynamic_cast<
+         PgwsNodeLevelLoadControlInformationInDeleteBearerRequest&>(loadControlInformation.getGroupedIe(msgType, 0));
+        rc = groupedIeInstance.encodePgwsNodeLevelLoadControlInformationInDeleteBearerRequest(buffer, data.pgwsNodeLevelLoadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: pgwsNodeLevelLoadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.pgwsApnLevelLoadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = LoadControlInformationIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        LoadControlInformationIe loadControlInformation=
+        dynamic_cast<
+        LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+        PgwsApnLevelLoadControlInformationInDeleteBearerRequest groupedIeInstance =
+        dynamic_cast<
+         PgwsApnLevelLoadControlInformationInDeleteBearerRequest&>(loadControlInformation.getGroupedIe(msgType, 1));
+        rc = groupedIeInstance.encodePgwsApnLevelLoadControlInformationInDeleteBearerRequest(buffer, data.pgwsApnLevelLoadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: pgwsApnLevelLoadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.sgwsNodeLevelLoadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = LoadControlInformationIeType;
+        header.instance = 2;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        LoadControlInformationIe loadControlInformation=
+        dynamic_cast<
+        LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+        SgwsNodeLevelLoadControlInformationInDeleteBearerRequest groupedIeInstance =
+        dynamic_cast<
+         SgwsNodeLevelLoadControlInformationInDeleteBearerRequest&>(loadControlInformation.getGroupedIe(msgType, 2));
+        rc = groupedIeInstance.encodeSgwsNodeLevelLoadControlInformationInDeleteBearerRequest(buffer, data.sgwsNodeLevelLoadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: sgwsNodeLevelLoadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.pgwsOverloadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = OverloadControlInformationIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+        PgwsOverloadControlInformationInDeleteBearerRequest groupedIeInstance =
+        dynamic_cast<
+         PgwsOverloadControlInformationInDeleteBearerRequest&>(overloadControlInformation.getGroupedIe(msgType, 0));
+        rc = groupedIeInstance.encodePgwsOverloadControlInformationInDeleteBearerRequest(buffer, data.pgwsOverloadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: pgwsOverloadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.sgwsOverloadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = OverloadControlInformationIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+        SgwsOverloadControlInformationInDeleteBearerRequest groupedIeInstance =
+        dynamic_cast<
+         SgwsOverloadControlInformationInDeleteBearerRequest&>(overloadControlInformation.getGroupedIe(msgType, 1));
+        rc = groupedIeInstance.encodeSgwsOverloadControlInformationInDeleteBearerRequest(buffer, data.sgwsOverloadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: sgwsOverloadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.nbifomContainerIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FContainerIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FContainerIe fContainer=
+        dynamic_cast<
+        FContainerIe&>(GtpV2IeFactory::getInstance().getIeObject(FContainerIeType));
+        rc = fContainer.encodeFContainerIe(buffer, data.nbifomContainer);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: nbifomContainer\n");
+            return false;
+        }
+    }
+
+    if (data.extendedProtocolConfigurationOptionsIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = EpcoIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        EpcoIe epco=
+        dynamic_cast<
+        EpcoIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcoIeType));
+        rc = epco.encodeEpcoIe(buffer, data.extendedProtocolConfigurationOptions);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: extendedProtocolConfigurationOptions\n");
+            return false;
+        }
+    }
+    return rc;
+
+}
+
+bool DeleteBearerRequestMsg::decodeDeleteBearerRequestMsg(MsgBuffer &buffer,
+ DeleteBearerRequestMsgData 
+ &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+  
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+
+        switch (ieHeader.ieType){
+     
+            case EbiIeType:
+            {
+                EbiIe ieObject =
+                dynamic_cast<
+                EbiIe&>(GtpV2IeFactory::getInstance().getIeObject(EbiIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeEbiIe(buffer, data.linkedEpsBearerId, ieHeader.length);
+
+                    data.linkedEpsBearerIdIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: linkedEpsBearerId\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					rc = ieObject.decodeEbiIe(buffer, data.epsBearerIds, ieHeader.length);
+
+                    data.epsBearerIdsIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: epsBearerIds\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case BearerContextIeType:
+            {
+                BearerContextIe ieObject =
+                dynamic_cast<
+                BearerContextIe&>(GtpV2IeFactory::getInstance().getIeObject(BearerContextIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					// First check if we have enough space left to decode and store this instance
+                    if (data.failedBearerContextsCount == 11)
+                    {
+                        errorStream.add((char *)"More than 11 instances of failedBearerContexts received\n");
+                        return false;
+                    }
+                    FailedBearerContextsInDeleteBearerRequest groupedIeInstance =
+                    dynamic_cast<
+                    FailedBearerContextsInDeleteBearerRequest&>(ieObject.getGroupedIe(msgType, 0));
+                    rc = groupedIeInstance.decodeFailedBearerContextsInDeleteBearerRequest(buffer,
+                    data.failedBearerContexts[data.failedBearerContextsCount], ieHeader.length);
+                    data.failedBearerContextsCount++; // TODO Count validation
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: failedBearerContexts\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case PtiIeType:
+            {
+                PtiIe ieObject =
+                dynamic_cast<
+                PtiIe&>(GtpV2IeFactory::getInstance().getIeObject(PtiIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodePtiIe(buffer, data.procedureTransactionId, ieHeader.length);
+
+                    data.procedureTransactionIdIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: procedureTransactionId\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case PcoIeType:
+            {
+                PcoIe ieObject =
+                dynamic_cast<
+                PcoIe&>(GtpV2IeFactory::getInstance().getIeObject(PcoIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodePcoIe(buffer, data.protocolConfigurationOptions, ieHeader.length);
+
+                    data.protocolConfigurationOptionsIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: protocolConfigurationOptions\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case FqCsidIeType:
+            {
+                FqCsidIe ieObject =
+                dynamic_cast<
+                FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeFqCsidIe(buffer, data.pgwFqCsid, ieHeader.length);
+
+                    data.pgwFqCsidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: pgwFqCsid\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					rc = ieObject.decodeFqCsidIe(buffer, data.sgwFqCsid, ieHeader.length);
+
+                    data.sgwFqCsidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: sgwFqCsid\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case CauseIeType:
+            {
+                CauseIe ieObject =
+                dynamic_cast<
+                CauseIe&>(GtpV2IeFactory::getInstance().getIeObject(CauseIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeCauseIe(buffer, data.cause, ieHeader.length);
+
+                    data.causeIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: cause\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case IndicationIeType:
+            {
+                IndicationIe ieObject =
+                dynamic_cast<
+                IndicationIe&>(GtpV2IeFactory::getInstance().getIeObject(IndicationIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeIndicationIe(buffer, data.indicationFlags, ieHeader.length);
+
+                    data.indicationFlagsIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: indicationFlags\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case LoadControlInformationIeType:
+            {
+                LoadControlInformationIe ieObject =
+                dynamic_cast<
+                LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					PgwsNodeLevelLoadControlInformationInDeleteBearerRequest groupedIeInstance =
+					dynamic_cast<
+					PgwsNodeLevelLoadControlInformationInDeleteBearerRequest&>(ieObject.getGroupedIe(msgType, 0));
+					rc = groupedIeInstance.decodePgwsNodeLevelLoadControlInformationInDeleteBearerRequest(buffer, data.pgwsNodeLevelLoadControlInformation, ieHeader.length);
+
+                    data.pgwsNodeLevelLoadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: pgwsNodeLevelLoadControlInformation\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					PgwsApnLevelLoadControlInformationInDeleteBearerRequest groupedIeInstance =
+					dynamic_cast<
+					PgwsApnLevelLoadControlInformationInDeleteBearerRequest&>(ieObject.getGroupedIe(msgType, 1));
+					rc = groupedIeInstance.decodePgwsApnLevelLoadControlInformationInDeleteBearerRequest(buffer, data.pgwsApnLevelLoadControlInformation, ieHeader.length);
+
+                    data.pgwsApnLevelLoadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: pgwsApnLevelLoadControlInformation\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 2)
+                {
+					SgwsNodeLevelLoadControlInformationInDeleteBearerRequest groupedIeInstance =
+					dynamic_cast<
+					SgwsNodeLevelLoadControlInformationInDeleteBearerRequest&>(ieObject.getGroupedIe(msgType, 2));
+					rc = groupedIeInstance.decodeSgwsNodeLevelLoadControlInformationInDeleteBearerRequest(buffer, data.sgwsNodeLevelLoadControlInformation, ieHeader.length);
+
+                    data.sgwsNodeLevelLoadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: sgwsNodeLevelLoadControlInformation\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case OverloadControlInformationIeType:
+            {
+                OverloadControlInformationIe ieObject =
+                dynamic_cast<
+                OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					PgwsOverloadControlInformationInDeleteBearerRequest groupedIeInstance =
+					dynamic_cast<
+					PgwsOverloadControlInformationInDeleteBearerRequest&>(ieObject.getGroupedIe(msgType, 0));
+					rc = groupedIeInstance.decodePgwsOverloadControlInformationInDeleteBearerRequest(buffer, data.pgwsOverloadControlInformation, ieHeader.length);
+
+                    data.pgwsOverloadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: pgwsOverloadControlInformation\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					SgwsOverloadControlInformationInDeleteBearerRequest groupedIeInstance =
+					dynamic_cast<
+					SgwsOverloadControlInformationInDeleteBearerRequest&>(ieObject.getGroupedIe(msgType, 1));
+					rc = groupedIeInstance.decodeSgwsOverloadControlInformationInDeleteBearerRequest(buffer, data.sgwsOverloadControlInformation, ieHeader.length);
+
+                    data.sgwsOverloadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: sgwsOverloadControlInformation\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case FContainerIeType:
+            {
+                FContainerIe ieObject =
+                dynamic_cast<
+                FContainerIe&>(GtpV2IeFactory::getInstance().getIeObject(FContainerIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeFContainerIe(buffer, data.nbifomContainer, ieHeader.length);
+
+                    data.nbifomContainerIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: nbifomContainer\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case EpcoIeType:
+            {
+                EpcoIe ieObject =
+                dynamic_cast<
+                EpcoIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcoIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeEpcoIe(buffer, data.extendedProtocolConfigurationOptions, ieHeader.length);
+
+                    data.extendedProtocolConfigurationOptionsIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: extendedProtocolConfigurationOptions\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+
+            default:
+            {
+                // Unknown IE print error
+                errorStream.add((char *)"Unknown IE Type: ");
+                errorStream.add(ieHeader.ieType);
+                errorStream.endOfLine();
+                buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    return rc; // TODO validations
+}
+
+void DeleteBearerRequestMsg::
+displayDeleteBearerRequestMsgData_v(DeleteBearerRequestMsgData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"DeleteBearerRequestMsg:");
+    stream.endOfLine();
+    stream.incrIndent();
+        
+    
+    if (data.linkedEpsBearerIdIePresent)
+    {
+
+
+        stream.add((char *)"IE - linkedEpsBearerId:");
+        stream.endOfLine();
+        EbiIe ebi=
+        dynamic_cast<
+        EbiIe&>(GtpV2IeFactory::getInstance().getIeObject(EbiIeType));
+        ebi.displayEbiIe_v(data.linkedEpsBearerId, stream);
+
+    }
+    if (data.epsBearerIdsIePresent)
+    {
+
+
+        stream.add((char *)"IE - epsBearerIds:");
+        stream.endOfLine();
+        EbiIe ebi=
+        dynamic_cast<
+        EbiIe&>(GtpV2IeFactory::getInstance().getIeObject(EbiIeType));
+        ebi.displayEbiIe_v(data.epsBearerIds, stream);
+
+    }
+
+    Uint8 displayCount;
+    
+    displayCount = data.failedBearerContextsCount;
+    if (displayCount > 11)
+    {
+        stream.add((char *)"Invalid data more than 11 instances");
+        stream.endOfLine();
+        stream.add((char *)"Displaying only 11");
+        stream.endOfLine();
+        displayCount = 11;
+    }
+    for (Uint8 i = 0; i < displayCount; i++)
+    {
+        stream.add((char *)"IE -  failedBearerContexts:");
+        stream.endOfLine();
+        BearerContextIe bearerContext=
+        dynamic_cast<
+        BearerContextIe&>(GtpV2IeFactory::getInstance().getIeObject(BearerContextIeType));
+                FailedBearerContextsInDeleteBearerRequest groupedIeInstance =
+        dynamic_cast<
+        FailedBearerContextsInDeleteBearerRequest&>(bearerContext.getGroupedIe(msgType, 0));
+        groupedIeInstance.displayFailedBearerContextsInDeleteBearerRequestData_v(data.failedBearerContexts[i], stream);
+    }
+
+    
+
+    
+    if (data.procedureTransactionIdIePresent)
+    {
+
+
+        stream.add((char *)"IE - procedureTransactionId:");
+        stream.endOfLine();
+        PtiIe pti=
+        dynamic_cast<
+        PtiIe&>(GtpV2IeFactory::getInstance().getIeObject(PtiIeType));
+        pti.displayPtiIe_v(data.procedureTransactionId, stream);
+
+    }
+    if (data.protocolConfigurationOptionsIePresent)
+    {
+
+
+        stream.add((char *)"IE - protocolConfigurationOptions:");
+        stream.endOfLine();
+        PcoIe pco=
+        dynamic_cast<
+        PcoIe&>(GtpV2IeFactory::getInstance().getIeObject(PcoIeType));
+        pco.displayPcoIe_v(data.protocolConfigurationOptions, stream);
+
+    }
+    if (data.pgwFqCsidIePresent)
+    {
+
+
+        stream.add((char *)"IE - pgwFqCsid:");
+        stream.endOfLine();
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        fqCsid.displayFqCsidIe_v(data.pgwFqCsid, stream);
+
+    }
+    if (data.sgwFqCsidIePresent)
+    {
+
+
+        stream.add((char *)"IE - sgwFqCsid:");
+        stream.endOfLine();
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        fqCsid.displayFqCsidIe_v(data.sgwFqCsid, stream);
+
+    }
+    if (data.causeIePresent)
+    {
+
+
+        stream.add((char *)"IE - cause:");
+        stream.endOfLine();
+        CauseIe cause=
+        dynamic_cast<
+        CauseIe&>(GtpV2IeFactory::getInstance().getIeObject(CauseIeType));
+        cause.displayCauseIe_v(data.cause, stream);
+
+    }
+    if (data.indicationFlagsIePresent)
+    {
+
+
+        stream.add((char *)"IE - indicationFlags:");
+        stream.endOfLine();
+        IndicationIe indication=
+        dynamic_cast<
+        IndicationIe&>(GtpV2IeFactory::getInstance().getIeObject(IndicationIeType));
+        indication.displayIndicationIe_v(data.indicationFlags, stream);
+
+    }
+    if (data.pgwsNodeLevelLoadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - pgwsNodeLevelLoadControlInformation:");
+        stream.endOfLine();
+        LoadControlInformationIe loadControlInformation=
+        dynamic_cast<
+        LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+            PgwsNodeLevelLoadControlInformationInDeleteBearerRequest groupedIeInstance =
+        dynamic_cast<
+        PgwsNodeLevelLoadControlInformationInDeleteBearerRequest&>(loadControlInformation.getGroupedIe(msgType, 0));
+        groupedIeInstance.displayPgwsNodeLevelLoadControlInformationInDeleteBearerRequestData_v(data.pgwsNodeLevelLoadControlInformation, stream);
+
+    }
+    if (data.pgwsApnLevelLoadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - pgwsApnLevelLoadControlInformation:");
+        stream.endOfLine();
+        LoadControlInformationIe loadControlInformation=
+        dynamic_cast<
+        LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+            PgwsApnLevelLoadControlInformationInDeleteBearerRequest groupedIeInstance =
+        dynamic_cast<
+        PgwsApnLevelLoadControlInformationInDeleteBearerRequest&>(loadControlInformation.getGroupedIe(msgType, 1));
+        groupedIeInstance.displayPgwsApnLevelLoadControlInformationInDeleteBearerRequestData_v(data.pgwsApnLevelLoadControlInformation, stream);
+
+    }
+    if (data.sgwsNodeLevelLoadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - sgwsNodeLevelLoadControlInformation:");
+        stream.endOfLine();
+        LoadControlInformationIe loadControlInformation=
+        dynamic_cast<
+        LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+            SgwsNodeLevelLoadControlInformationInDeleteBearerRequest groupedIeInstance =
+        dynamic_cast<
+        SgwsNodeLevelLoadControlInformationInDeleteBearerRequest&>(loadControlInformation.getGroupedIe(msgType, 2));
+        groupedIeInstance.displaySgwsNodeLevelLoadControlInformationInDeleteBearerRequestData_v(data.sgwsNodeLevelLoadControlInformation, stream);
+
+    }
+    if (data.pgwsOverloadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - pgwsOverloadControlInformation:");
+        stream.endOfLine();
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+            PgwsOverloadControlInformationInDeleteBearerRequest groupedIeInstance =
+        dynamic_cast<
+        PgwsOverloadControlInformationInDeleteBearerRequest&>(overloadControlInformation.getGroupedIe(msgType, 0));
+        groupedIeInstance.displayPgwsOverloadControlInformationInDeleteBearerRequestData_v(data.pgwsOverloadControlInformation, stream);
+
+    }
+    if (data.sgwsOverloadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - sgwsOverloadControlInformation:");
+        stream.endOfLine();
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+            SgwsOverloadControlInformationInDeleteBearerRequest groupedIeInstance =
+        dynamic_cast<
+        SgwsOverloadControlInformationInDeleteBearerRequest&>(overloadControlInformation.getGroupedIe(msgType, 1));
+        groupedIeInstance.displaySgwsOverloadControlInformationInDeleteBearerRequestData_v(data.sgwsOverloadControlInformation, stream);
+
+    }
+    if (data.nbifomContainerIePresent)
+    {
+
+
+        stream.add((char *)"IE - nbifomContainer:");
+        stream.endOfLine();
+        FContainerIe fContainer=
+        dynamic_cast<
+        FContainerIe&>(GtpV2IeFactory::getInstance().getIeObject(FContainerIeType));
+        fContainer.displayFContainerIe_v(data.nbifomContainer, stream);
+
+    }
+    if (data.extendedProtocolConfigurationOptionsIePresent)
+    {
+
+
+        stream.add((char *)"IE - extendedProtocolConfigurationOptions:");
+        stream.endOfLine();
+        EpcoIe epco=
+        dynamic_cast<
+        EpcoIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcoIeType));
+        epco.displayEpcoIe_v(data.extendedProtocolConfigurationOptions, stream);
+
+    }
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
diff --git a/src/gtpV2Codec/msgClasses/deleteBearerRequestMsg.h b/src/gtpV2Codec/msgClasses/deleteBearerRequestMsg.h
new file mode 100644
index 0000000..799255d
--- /dev/null
+++ b/src/gtpV2Codec/msgClasses/deleteBearerRequestMsg.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/msgtemplate.h.tt>
+ ******************************************************************************/
+#ifndef DELETEBEARERREQUESTMSG_H_
+#define DELETEBEARERREQUESTMSG_H_
+
+#include <set>
+#include "manual/gtpV2Message.h"
+#include <msgBuffer.h>
+#include <debug.h>
+#include "gtpV2MsgDataTypes.h"
+
+
+class DeleteBearerRequestMsg:public GtpV2Message
+{
+public:
+    DeleteBearerRequestMsg();
+    virtual ~DeleteBearerRequestMsg();
+    bool encodeDeleteBearerRequestMsg(MsgBuffer &buffer, DeleteBearerRequestMsgData const &data);
+
+    bool decodeDeleteBearerRequestMsg (MsgBuffer &buffer, DeleteBearerRequestMsgData& data, Uint16 length);
+
+    void displayDeleteBearerRequestMsgData_v(DeleteBearerRequestMsgData const &data, Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/msgClasses/deleteBearerResponseMsg.cpp b/src/gtpV2Codec/msgClasses/deleteBearerResponseMsg.cpp
new file mode 100644
index 0000000..873b4a2
--- /dev/null
+++ b/src/gtpV2Codec/msgClasses/deleteBearerResponseMsg.cpp
@@ -0,0 +1,1747 @@
+/*
+ * 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/msgtemplate.cpp.tt>
+ ******************************************************************************/ 
+
+#include "deleteBearerResponseMsg.h"
+#include "../ieClasses/manual/gtpV2Ie.h"
+#include "../ieClasses/gtpV2IeFactory.h"
+#include "../ieClasses/causeIe.h"
+#include "../ieClasses/ebiIe.h"
+#include "../ieClasses/bearerContextIe.h"
+#include "../ieClasses/bearerContextsInDeleteBearerResponse.h"
+#include "../ieClasses/recoveryIe.h"
+#include "../ieClasses/fqCsidIe.h"
+#include "../ieClasses/fqCsidIe.h"
+#include "../ieClasses/fqCsidIe.h"
+#include "../ieClasses/fqCsidIe.h"
+#include "../ieClasses/pcoIe.h"
+#include "../ieClasses/ueTimeZoneIe.h"
+#include "../ieClasses/uliIe.h"
+#include "../ieClasses/uliTimestampIe.h"
+#include "../ieClasses/twanIdentifierIe.h"
+#include "../ieClasses/twanIdentifierTimestampIe.h"
+#include "../ieClasses/overloadControlInformationIe.h"
+#include "../ieClasses/mmeS4SgsnsOverloadControlInformationInDeleteBearerResponse.h"
+#include "../ieClasses/overloadControlInformationIe.h"
+#include "../ieClasses/sgwsOverloadControlInformationInDeleteBearerResponse.h"
+#include "../ieClasses/ipAddressIe.h"
+#include "../ieClasses/overloadControlInformationIe.h"
+#include "../ieClasses/twanEpdgsOverloadControlInformationInDeleteBearerResponse.h"
+#include "../ieClasses/twanIdentifierIe.h"
+#include "../ieClasses/twanIdentifierTimestampIe.h"
+#include "../ieClasses/ipAddressIe.h"
+#include "../ieClasses/portNumberIe.h"
+#include "../ieClasses/fContainerIe.h"
+#include "../ieClasses/portNumberIe.h"
+#include "../ieClasses/secondaryRatUsageDataReportIe.h"
+
+DeleteBearerResponseMsg::DeleteBearerResponseMsg()
+{
+    msgType = DeleteBearerResponseMsgType;
+    Uint16 mandIe;
+    mandIe = CauseIeType;
+    mandIe = (mandIe << 8) | 0; // cause
+    mandatoryIeSet.insert(mandIe);
+}
+
+DeleteBearerResponseMsg::~DeleteBearerResponseMsg()
+{
+
+}
+
+bool DeleteBearerResponseMsg::encodeDeleteBearerResponseMsg(MsgBuffer &buffer,
+                        DeleteBearerResponseMsgData
+							const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+    
+    // Encode the Ie Header
+    header.ieType = CauseIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    CauseIe cause=
+    dynamic_cast<
+    CauseIe&>(GtpV2IeFactory::getInstance().getIeObject(CauseIeType));
+    rc = cause.encodeCauseIe(buffer, data.cause);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+
+    if (!(rc))
+    { 
+        errorStream.add((char *)"Failed to encode IE: cause\n");
+        return false;
+    }
+
+    if (data.linkedEpsBearerIdIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = EbiIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        EbiIe ebi=
+        dynamic_cast<
+        EbiIe&>(GtpV2IeFactory::getInstance().getIeObject(EbiIeType));
+        rc = ebi.encodeEbiIe(buffer, data.linkedEpsBearerId);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: linkedEpsBearerId\n");
+            return false;
+        }
+    }
+
+        // First validate if the applicatoin provided more than the expected cardinality
+    if (data.bearerContextsCount > 11)
+    {
+        errorStream.add((char *)"Number of entries of bearerContexts exceeded\n");
+        errorStream.add((char *)"Expected count: 11 Received count: ");
+        errorStream.add((char *)"data.bearerContextsCount");
+        errorStream.endOfLine();
+        return false;
+    }
+    for (Uint8 i = 0; i < data.bearerContextsCount; i++)
+    {
+        // Encode the Ie Header
+        header.ieType = BearerContextIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        BearerContextIe bearerContext=
+        dynamic_cast<
+        BearerContextIe&>(GtpV2IeFactory::getInstance().
+        getIeObject(BearerContextIeType));
+        BearerContextsInDeleteBearerResponse groupedIeInstance = dynamic_cast<BearerContextsInDeleteBearerResponse&>(bearerContext.getGroupedIe(msgType, 0));
+        rc = groupedIeInstance.encodeBearerContextsInDeleteBearerResponse(buffer, data.bearerContexts[i]);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+    }
+
+    if (!(rc))
+    { 
+        errorStream.add((char *)"Failed to encode IE: bearerContexts\n");
+        return false;
+    }
+
+    if (data.recoveryIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = RecoveryIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        RecoveryIe recovery=
+        dynamic_cast<
+        RecoveryIe&>(GtpV2IeFactory::getInstance().getIeObject(RecoveryIeType));
+        rc = recovery.encodeRecoveryIe(buffer, data.recovery);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: recovery\n");
+            return false;
+        }
+    }
+
+    if (data.mmeFqCsidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FqCsidIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        rc = fqCsid.encodeFqCsidIe(buffer, data.mmeFqCsid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: mmeFqCsid\n");
+            return false;
+        }
+    }
+
+    if (data.sgwFqCsidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FqCsidIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        rc = fqCsid.encodeFqCsidIe(buffer, data.sgwFqCsid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: sgwFqCsid\n");
+            return false;
+        }
+    }
+
+    if (data.epdgFqCsidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FqCsidIeType;
+        header.instance = 2;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        rc = fqCsid.encodeFqCsidIe(buffer, data.epdgFqCsid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: epdgFqCsid\n");
+            return false;
+        }
+    }
+
+    if (data.twanFqCsidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FqCsidIeType;
+        header.instance = 3;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        rc = fqCsid.encodeFqCsidIe(buffer, data.twanFqCsid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: twanFqCsid\n");
+            return false;
+        }
+    }
+
+    if (data.protocolConfigurationOptionsIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = PcoIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        PcoIe pco=
+        dynamic_cast<
+        PcoIe&>(GtpV2IeFactory::getInstance().getIeObject(PcoIeType));
+        rc = pco.encodePcoIe(buffer, data.protocolConfigurationOptions);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: protocolConfigurationOptions\n");
+            return false;
+        }
+    }
+
+    if (data.ueTimeZoneIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = UeTimeZoneIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        UeTimeZoneIe ueTimeZone=
+        dynamic_cast<
+        UeTimeZoneIe&>(GtpV2IeFactory::getInstance().getIeObject(UeTimeZoneIeType));
+        rc = ueTimeZone.encodeUeTimeZoneIe(buffer, data.ueTimeZone);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: ueTimeZone\n");
+            return false;
+        }
+    }
+
+    if (data.userLocationInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = UliIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        UliIe uli=
+        dynamic_cast<
+        UliIe&>(GtpV2IeFactory::getInstance().getIeObject(UliIeType));
+        rc = uli.encodeUliIe(buffer, data.userLocationInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: userLocationInformation\n");
+            return false;
+        }
+    }
+
+    if (data.uliTimestampIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = UliTimestampIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        UliTimestampIe uliTimestamp=
+        dynamic_cast<
+        UliTimestampIe&>(GtpV2IeFactory::getInstance().getIeObject(UliTimestampIeType));
+        rc = uliTimestamp.encodeUliTimestampIe(buffer, data.uliTimestamp);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: uliTimestamp\n");
+            return false;
+        }
+    }
+
+    if (data.twanIdentifierIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = TwanIdentifierIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        TwanIdentifierIe twanIdentifier=
+        dynamic_cast<
+        TwanIdentifierIe&>(GtpV2IeFactory::getInstance().getIeObject(TwanIdentifierIeType));
+        rc = twanIdentifier.encodeTwanIdentifierIe(buffer, data.twanIdentifier);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: twanIdentifier\n");
+            return false;
+        }
+    }
+
+    if (data.twanIdentifierTimestampIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = TwanIdentifierTimestampIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        TwanIdentifierTimestampIe twanIdentifierTimestamp=
+        dynamic_cast<
+        TwanIdentifierTimestampIe&>(GtpV2IeFactory::getInstance().getIeObject(TwanIdentifierTimestampIeType));
+        rc = twanIdentifierTimestamp.encodeTwanIdentifierTimestampIe(buffer, data.twanIdentifierTimestamp);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: twanIdentifierTimestamp\n");
+            return false;
+        }
+    }
+
+    if (data.mmeS4SgsnsOverloadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = OverloadControlInformationIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+        MmeS4SgsnsOverloadControlInformationInDeleteBearerResponse groupedIeInstance =
+        dynamic_cast<
+         MmeS4SgsnsOverloadControlInformationInDeleteBearerResponse&>(overloadControlInformation.getGroupedIe(msgType, 0));
+        rc = groupedIeInstance.encodeMmeS4SgsnsOverloadControlInformationInDeleteBearerResponse(buffer, data.mmeS4SgsnsOverloadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: mmeS4SgsnsOverloadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.sgwsOverloadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = OverloadControlInformationIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+        SgwsOverloadControlInformationInDeleteBearerResponse groupedIeInstance =
+        dynamic_cast<
+         SgwsOverloadControlInformationInDeleteBearerResponse&>(overloadControlInformation.getGroupedIe(msgType, 1));
+        rc = groupedIeInstance.encodeSgwsOverloadControlInformationInDeleteBearerResponse(buffer, data.sgwsOverloadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: sgwsOverloadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.mmeS4SgsnIdentifierIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = IpAddressIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        IpAddressIe ipAddress=
+        dynamic_cast<
+        IpAddressIe&>(GtpV2IeFactory::getInstance().getIeObject(IpAddressIeType));
+        rc = ipAddress.encodeIpAddressIe(buffer, data.mmeS4SgsnIdentifier);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: mmeS4SgsnIdentifier\n");
+            return false;
+        }
+    }
+
+    if (data.twanEpdgsOverloadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = OverloadControlInformationIeType;
+        header.instance = 2;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+        TwanEpdgsOverloadControlInformationInDeleteBearerResponse groupedIeInstance =
+        dynamic_cast<
+         TwanEpdgsOverloadControlInformationInDeleteBearerResponse&>(overloadControlInformation.getGroupedIe(msgType, 2));
+        rc = groupedIeInstance.encodeTwanEpdgsOverloadControlInformationInDeleteBearerResponse(buffer, data.twanEpdgsOverloadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: twanEpdgsOverloadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.wlanLocationInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = TwanIdentifierIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        TwanIdentifierIe twanIdentifier=
+        dynamic_cast<
+        TwanIdentifierIe&>(GtpV2IeFactory::getInstance().getIeObject(TwanIdentifierIeType));
+        rc = twanIdentifier.encodeTwanIdentifierIe(buffer, data.wlanLocationInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: wlanLocationInformation\n");
+            return false;
+        }
+    }
+
+    if (data.wlanLocationTimestampIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = TwanIdentifierTimestampIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        TwanIdentifierTimestampIe twanIdentifierTimestamp=
+        dynamic_cast<
+        TwanIdentifierTimestampIe&>(GtpV2IeFactory::getInstance().getIeObject(TwanIdentifierTimestampIeType));
+        rc = twanIdentifierTimestamp.encodeTwanIdentifierTimestampIe(buffer, data.wlanLocationTimestamp);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: wlanLocationTimestamp\n");
+            return false;
+        }
+    }
+
+    if (data.ueLocalIpAddressIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = IpAddressIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        IpAddressIe ipAddress=
+        dynamic_cast<
+        IpAddressIe&>(GtpV2IeFactory::getInstance().getIeObject(IpAddressIeType));
+        rc = ipAddress.encodeIpAddressIe(buffer, data.ueLocalIpAddress);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: ueLocalIpAddress\n");
+            return false;
+        }
+    }
+
+    if (data.ueUdpPortIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = PortNumberIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        PortNumberIe portNumber=
+        dynamic_cast<
+        PortNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(PortNumberIeType));
+        rc = portNumber.encodePortNumberIe(buffer, data.ueUdpPort);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: ueUdpPort\n");
+            return false;
+        }
+    }
+
+    if (data.nbifomContainerIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FContainerIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FContainerIe fContainer=
+        dynamic_cast<
+        FContainerIe&>(GtpV2IeFactory::getInstance().getIeObject(FContainerIeType));
+        rc = fContainer.encodeFContainerIe(buffer, data.nbifomContainer);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: nbifomContainer\n");
+            return false;
+        }
+    }
+
+    if (data.ueTcpPortIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = PortNumberIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        PortNumberIe portNumber=
+        dynamic_cast<
+        PortNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(PortNumberIeType));
+        rc = portNumber.encodePortNumberIe(buffer, data.ueTcpPort);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: ueTcpPort\n");
+            return false;
+        }
+    }
+
+    if (data.secondaryRatUsageDataReportIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = SecondaryRatUsageDataReportIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        SecondaryRatUsageDataReportIe secondaryRatUsageDataReport=
+        dynamic_cast<
+        SecondaryRatUsageDataReportIe&>(GtpV2IeFactory::getInstance().getIeObject(SecondaryRatUsageDataReportIeType));
+        rc = secondaryRatUsageDataReport.encodeSecondaryRatUsageDataReportIe(buffer, data.secondaryRatUsageDataReport);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: secondaryRatUsageDataReport\n");
+            return false;
+        }
+    }
+    return rc;
+
+}
+
+bool DeleteBearerResponseMsg::decodeDeleteBearerResponseMsg(MsgBuffer &buffer,
+ DeleteBearerResponseMsgData 
+ &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+  
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+
+        switch (ieHeader.ieType){
+     
+            case CauseIeType:
+            {
+                CauseIe ieObject =
+                dynamic_cast<
+                CauseIe&>(GtpV2IeFactory::getInstance().getIeObject(CauseIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeCauseIe(buffer, data.cause, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: cause\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case EbiIeType:
+            {
+                EbiIe ieObject =
+                dynamic_cast<
+                EbiIe&>(GtpV2IeFactory::getInstance().getIeObject(EbiIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeEbiIe(buffer, data.linkedEpsBearerId, ieHeader.length);
+
+                    data.linkedEpsBearerIdIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: linkedEpsBearerId\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case BearerContextIeType:
+            {
+                BearerContextIe ieObject =
+                dynamic_cast<
+                BearerContextIe&>(GtpV2IeFactory::getInstance().getIeObject(BearerContextIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					// First check if we have enough space left to decode and store this instance
+                    if (data.bearerContextsCount == 11)
+                    {
+                        errorStream.add((char *)"More than 11 instances of bearerContexts received\n");
+                        return false;
+                    }
+                    BearerContextsInDeleteBearerResponse groupedIeInstance =
+                    dynamic_cast<
+                    BearerContextsInDeleteBearerResponse&>(ieObject.getGroupedIe(msgType, 0));
+                    rc = groupedIeInstance.decodeBearerContextsInDeleteBearerResponse(buffer,
+                    data.bearerContexts[data.bearerContextsCount], ieHeader.length);
+                    data.bearerContextsCount++; // TODO Count validation
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: bearerContexts\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case RecoveryIeType:
+            {
+                RecoveryIe ieObject =
+                dynamic_cast<
+                RecoveryIe&>(GtpV2IeFactory::getInstance().getIeObject(RecoveryIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeRecoveryIe(buffer, data.recovery, ieHeader.length);
+
+                    data.recoveryIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: recovery\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case FqCsidIeType:
+            {
+                FqCsidIe ieObject =
+                dynamic_cast<
+                FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeFqCsidIe(buffer, data.mmeFqCsid, ieHeader.length);
+
+                    data.mmeFqCsidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: mmeFqCsid\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					rc = ieObject.decodeFqCsidIe(buffer, data.sgwFqCsid, ieHeader.length);
+
+                    data.sgwFqCsidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: sgwFqCsid\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 2)
+                {
+					rc = ieObject.decodeFqCsidIe(buffer, data.epdgFqCsid, ieHeader.length);
+
+                    data.epdgFqCsidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: epdgFqCsid\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 3)
+                {
+					rc = ieObject.decodeFqCsidIe(buffer, data.twanFqCsid, ieHeader.length);
+
+                    data.twanFqCsidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: twanFqCsid\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case PcoIeType:
+            {
+                PcoIe ieObject =
+                dynamic_cast<
+                PcoIe&>(GtpV2IeFactory::getInstance().getIeObject(PcoIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodePcoIe(buffer, data.protocolConfigurationOptions, ieHeader.length);
+
+                    data.protocolConfigurationOptionsIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: protocolConfigurationOptions\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case UeTimeZoneIeType:
+            {
+                UeTimeZoneIe ieObject =
+                dynamic_cast<
+                UeTimeZoneIe&>(GtpV2IeFactory::getInstance().getIeObject(UeTimeZoneIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeUeTimeZoneIe(buffer, data.ueTimeZone, ieHeader.length);
+
+                    data.ueTimeZoneIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: ueTimeZone\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case UliIeType:
+            {
+                UliIe ieObject =
+                dynamic_cast<
+                UliIe&>(GtpV2IeFactory::getInstance().getIeObject(UliIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeUliIe(buffer, data.userLocationInformation, ieHeader.length);
+
+                    data.userLocationInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: userLocationInformation\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case UliTimestampIeType:
+            {
+                UliTimestampIe ieObject =
+                dynamic_cast<
+                UliTimestampIe&>(GtpV2IeFactory::getInstance().getIeObject(UliTimestampIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeUliTimestampIe(buffer, data.uliTimestamp, ieHeader.length);
+
+                    data.uliTimestampIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: uliTimestamp\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case TwanIdentifierIeType:
+            {
+                TwanIdentifierIe ieObject =
+                dynamic_cast<
+                TwanIdentifierIe&>(GtpV2IeFactory::getInstance().getIeObject(TwanIdentifierIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeTwanIdentifierIe(buffer, data.twanIdentifier, ieHeader.length);
+
+                    data.twanIdentifierIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: twanIdentifier\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					rc = ieObject.decodeTwanIdentifierIe(buffer, data.wlanLocationInformation, ieHeader.length);
+
+                    data.wlanLocationInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: wlanLocationInformation\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case TwanIdentifierTimestampIeType:
+            {
+                TwanIdentifierTimestampIe ieObject =
+                dynamic_cast<
+                TwanIdentifierTimestampIe&>(GtpV2IeFactory::getInstance().getIeObject(TwanIdentifierTimestampIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeTwanIdentifierTimestampIe(buffer, data.twanIdentifierTimestamp, ieHeader.length);
+
+                    data.twanIdentifierTimestampIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: twanIdentifierTimestamp\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					rc = ieObject.decodeTwanIdentifierTimestampIe(buffer, data.wlanLocationTimestamp, ieHeader.length);
+
+                    data.wlanLocationTimestampIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: wlanLocationTimestamp\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case OverloadControlInformationIeType:
+            {
+                OverloadControlInformationIe ieObject =
+                dynamic_cast<
+                OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					MmeS4SgsnsOverloadControlInformationInDeleteBearerResponse groupedIeInstance =
+					dynamic_cast<
+					MmeS4SgsnsOverloadControlInformationInDeleteBearerResponse&>(ieObject.getGroupedIe(msgType, 0));
+					rc = groupedIeInstance.decodeMmeS4SgsnsOverloadControlInformationInDeleteBearerResponse(buffer, data.mmeS4SgsnsOverloadControlInformation, ieHeader.length);
+
+                    data.mmeS4SgsnsOverloadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: mmeS4SgsnsOverloadControlInformation\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					SgwsOverloadControlInformationInDeleteBearerResponse groupedIeInstance =
+					dynamic_cast<
+					SgwsOverloadControlInformationInDeleteBearerResponse&>(ieObject.getGroupedIe(msgType, 1));
+					rc = groupedIeInstance.decodeSgwsOverloadControlInformationInDeleteBearerResponse(buffer, data.sgwsOverloadControlInformation, ieHeader.length);
+
+                    data.sgwsOverloadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: sgwsOverloadControlInformation\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 2)
+                {
+					TwanEpdgsOverloadControlInformationInDeleteBearerResponse groupedIeInstance =
+					dynamic_cast<
+					TwanEpdgsOverloadControlInformationInDeleteBearerResponse&>(ieObject.getGroupedIe(msgType, 2));
+					rc = groupedIeInstance.decodeTwanEpdgsOverloadControlInformationInDeleteBearerResponse(buffer, data.twanEpdgsOverloadControlInformation, ieHeader.length);
+
+                    data.twanEpdgsOverloadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: twanEpdgsOverloadControlInformation\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case IpAddressIeType:
+            {
+                IpAddressIe ieObject =
+                dynamic_cast<
+                IpAddressIe&>(GtpV2IeFactory::getInstance().getIeObject(IpAddressIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeIpAddressIe(buffer, data.mmeS4SgsnIdentifier, ieHeader.length);
+
+                    data.mmeS4SgsnIdentifierIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: mmeS4SgsnIdentifier\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeIpAddressIe(buffer, data.ueLocalIpAddress, ieHeader.length);
+
+                    data.ueLocalIpAddressIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: ueLocalIpAddress\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case PortNumberIeType:
+            {
+                PortNumberIe ieObject =
+                dynamic_cast<
+                PortNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(PortNumberIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodePortNumberIe(buffer, data.ueUdpPort, ieHeader.length);
+
+                    data.ueUdpPortIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: ueUdpPort\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					rc = ieObject.decodePortNumberIe(buffer, data.ueTcpPort, ieHeader.length);
+
+                    data.ueTcpPortIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: ueTcpPort\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case FContainerIeType:
+            {
+                FContainerIe ieObject =
+                dynamic_cast<
+                FContainerIe&>(GtpV2IeFactory::getInstance().getIeObject(FContainerIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeFContainerIe(buffer, data.nbifomContainer, ieHeader.length);
+
+                    data.nbifomContainerIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: nbifomContainer\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case SecondaryRatUsageDataReportIeType:
+            {
+                SecondaryRatUsageDataReportIe ieObject =
+                dynamic_cast<
+                SecondaryRatUsageDataReportIe&>(GtpV2IeFactory::getInstance().getIeObject(SecondaryRatUsageDataReportIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeSecondaryRatUsageDataReportIe(buffer, data.secondaryRatUsageDataReport, ieHeader.length);
+
+                    data.secondaryRatUsageDataReportIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: secondaryRatUsageDataReport\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+
+            default:
+            {
+                // Unknown IE print error
+                errorStream.add((char *)"Unknown IE Type: ");
+                errorStream.add(ieHeader.ieType);
+                errorStream.endOfLine();
+                buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    return rc; // TODO validations
+}
+
+void DeleteBearerResponseMsg::
+displayDeleteBearerResponseMsgData_v(DeleteBearerResponseMsgData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"DeleteBearerResponseMsg:");
+    stream.endOfLine();
+    stream.incrIndent();
+        
+    
+        stream.add((char *)"IE - cause:");
+        stream.endOfLine();
+        CauseIe cause=
+        dynamic_cast<
+        CauseIe&>(GtpV2IeFactory::getInstance().getIeObject(CauseIeType));
+        cause.displayCauseIe_v(data.cause, stream);
+
+    if (data.linkedEpsBearerIdIePresent)
+    {
+
+
+        stream.add((char *)"IE - linkedEpsBearerId:");
+        stream.endOfLine();
+        EbiIe ebi=
+        dynamic_cast<
+        EbiIe&>(GtpV2IeFactory::getInstance().getIeObject(EbiIeType));
+        ebi.displayEbiIe_v(data.linkedEpsBearerId, stream);
+
+    }
+
+    Uint8 displayCount;
+    
+    displayCount = data.bearerContextsCount;
+    if (displayCount > 11)
+    {
+        stream.add((char *)"Invalid data more than 11 instances");
+        stream.endOfLine();
+        stream.add((char *)"Displaying only 11");
+        stream.endOfLine();
+        displayCount = 11;
+    }
+    for (Uint8 i = 0; i < displayCount; i++)
+    {
+        stream.add((char *)"IE -  bearerContexts:");
+        stream.endOfLine();
+        BearerContextIe bearerContext=
+        dynamic_cast<
+        BearerContextIe&>(GtpV2IeFactory::getInstance().getIeObject(BearerContextIeType));
+                BearerContextsInDeleteBearerResponse groupedIeInstance =
+        dynamic_cast<
+        BearerContextsInDeleteBearerResponse&>(bearerContext.getGroupedIe(msgType, 0));
+        groupedIeInstance.displayBearerContextsInDeleteBearerResponseData_v(data.bearerContexts[i], stream);
+    }
+
+    
+
+    
+    if (data.recoveryIePresent)
+    {
+
+
+        stream.add((char *)"IE - recovery:");
+        stream.endOfLine();
+        RecoveryIe recovery=
+        dynamic_cast<
+        RecoveryIe&>(GtpV2IeFactory::getInstance().getIeObject(RecoveryIeType));
+        recovery.displayRecoveryIe_v(data.recovery, stream);
+
+    }
+    if (data.mmeFqCsidIePresent)
+    {
+
+
+        stream.add((char *)"IE - mmeFqCsid:");
+        stream.endOfLine();
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        fqCsid.displayFqCsidIe_v(data.mmeFqCsid, stream);
+
+    }
+    if (data.sgwFqCsidIePresent)
+    {
+
+
+        stream.add((char *)"IE - sgwFqCsid:");
+        stream.endOfLine();
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        fqCsid.displayFqCsidIe_v(data.sgwFqCsid, stream);
+
+    }
+    if (data.epdgFqCsidIePresent)
+    {
+
+
+        stream.add((char *)"IE - epdgFqCsid:");
+        stream.endOfLine();
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        fqCsid.displayFqCsidIe_v(data.epdgFqCsid, stream);
+
+    }
+    if (data.twanFqCsidIePresent)
+    {
+
+
+        stream.add((char *)"IE - twanFqCsid:");
+        stream.endOfLine();
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        fqCsid.displayFqCsidIe_v(data.twanFqCsid, stream);
+
+    }
+    if (data.protocolConfigurationOptionsIePresent)
+    {
+
+
+        stream.add((char *)"IE - protocolConfigurationOptions:");
+        stream.endOfLine();
+        PcoIe pco=
+        dynamic_cast<
+        PcoIe&>(GtpV2IeFactory::getInstance().getIeObject(PcoIeType));
+        pco.displayPcoIe_v(data.protocolConfigurationOptions, stream);
+
+    }
+    if (data.ueTimeZoneIePresent)
+    {
+
+
+        stream.add((char *)"IE - ueTimeZone:");
+        stream.endOfLine();
+        UeTimeZoneIe ueTimeZone=
+        dynamic_cast<
+        UeTimeZoneIe&>(GtpV2IeFactory::getInstance().getIeObject(UeTimeZoneIeType));
+        ueTimeZone.displayUeTimeZoneIe_v(data.ueTimeZone, stream);
+
+    }
+    if (data.userLocationInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - userLocationInformation:");
+        stream.endOfLine();
+        UliIe uli=
+        dynamic_cast<
+        UliIe&>(GtpV2IeFactory::getInstance().getIeObject(UliIeType));
+        uli.displayUliIe_v(data.userLocationInformation, stream);
+
+    }
+    if (data.uliTimestampIePresent)
+    {
+
+
+        stream.add((char *)"IE - uliTimestamp:");
+        stream.endOfLine();
+        UliTimestampIe uliTimestamp=
+        dynamic_cast<
+        UliTimestampIe&>(GtpV2IeFactory::getInstance().getIeObject(UliTimestampIeType));
+        uliTimestamp.displayUliTimestampIe_v(data.uliTimestamp, stream);
+
+    }
+    if (data.twanIdentifierIePresent)
+    {
+
+
+        stream.add((char *)"IE - twanIdentifier:");
+        stream.endOfLine();
+        TwanIdentifierIe twanIdentifier=
+        dynamic_cast<
+        TwanIdentifierIe&>(GtpV2IeFactory::getInstance().getIeObject(TwanIdentifierIeType));
+        twanIdentifier.displayTwanIdentifierIe_v(data.twanIdentifier, stream);
+
+    }
+    if (data.twanIdentifierTimestampIePresent)
+    {
+
+
+        stream.add((char *)"IE - twanIdentifierTimestamp:");
+        stream.endOfLine();
+        TwanIdentifierTimestampIe twanIdentifierTimestamp=
+        dynamic_cast<
+        TwanIdentifierTimestampIe&>(GtpV2IeFactory::getInstance().getIeObject(TwanIdentifierTimestampIeType));
+        twanIdentifierTimestamp.displayTwanIdentifierTimestampIe_v(data.twanIdentifierTimestamp, stream);
+
+    }
+    if (data.mmeS4SgsnsOverloadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - mmeS4SgsnsOverloadControlInformation:");
+        stream.endOfLine();
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+            MmeS4SgsnsOverloadControlInformationInDeleteBearerResponse groupedIeInstance =
+        dynamic_cast<
+        MmeS4SgsnsOverloadControlInformationInDeleteBearerResponse&>(overloadControlInformation.getGroupedIe(msgType, 0));
+        groupedIeInstance.displayMmeS4SgsnsOverloadControlInformationInDeleteBearerResponseData_v(data.mmeS4SgsnsOverloadControlInformation, stream);
+
+    }
+    if (data.sgwsOverloadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - sgwsOverloadControlInformation:");
+        stream.endOfLine();
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+            SgwsOverloadControlInformationInDeleteBearerResponse groupedIeInstance =
+        dynamic_cast<
+        SgwsOverloadControlInformationInDeleteBearerResponse&>(overloadControlInformation.getGroupedIe(msgType, 1));
+        groupedIeInstance.displaySgwsOverloadControlInformationInDeleteBearerResponseData_v(data.sgwsOverloadControlInformation, stream);
+
+    }
+    if (data.mmeS4SgsnIdentifierIePresent)
+    {
+
+
+        stream.add((char *)"IE - mmeS4SgsnIdentifier:");
+        stream.endOfLine();
+        IpAddressIe ipAddress=
+        dynamic_cast<
+        IpAddressIe&>(GtpV2IeFactory::getInstance().getIeObject(IpAddressIeType));
+        ipAddress.displayIpAddressIe_v(data.mmeS4SgsnIdentifier, stream);
+
+    }
+    if (data.twanEpdgsOverloadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - twanEpdgsOverloadControlInformation:");
+        stream.endOfLine();
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+            TwanEpdgsOverloadControlInformationInDeleteBearerResponse groupedIeInstance =
+        dynamic_cast<
+        TwanEpdgsOverloadControlInformationInDeleteBearerResponse&>(overloadControlInformation.getGroupedIe(msgType, 2));
+        groupedIeInstance.displayTwanEpdgsOverloadControlInformationInDeleteBearerResponseData_v(data.twanEpdgsOverloadControlInformation, stream);
+
+    }
+    if (data.wlanLocationInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - wlanLocationInformation:");
+        stream.endOfLine();
+        TwanIdentifierIe twanIdentifier=
+        dynamic_cast<
+        TwanIdentifierIe&>(GtpV2IeFactory::getInstance().getIeObject(TwanIdentifierIeType));
+        twanIdentifier.displayTwanIdentifierIe_v(data.wlanLocationInformation, stream);
+
+    }
+    if (data.wlanLocationTimestampIePresent)
+    {
+
+
+        stream.add((char *)"IE - wlanLocationTimestamp:");
+        stream.endOfLine();
+        TwanIdentifierTimestampIe twanIdentifierTimestamp=
+        dynamic_cast<
+        TwanIdentifierTimestampIe&>(GtpV2IeFactory::getInstance().getIeObject(TwanIdentifierTimestampIeType));
+        twanIdentifierTimestamp.displayTwanIdentifierTimestampIe_v(data.wlanLocationTimestamp, stream);
+
+    }
+    if (data.ueLocalIpAddressIePresent)
+    {
+
+
+        stream.add((char *)"IE - ueLocalIpAddress:");
+        stream.endOfLine();
+        IpAddressIe ipAddress=
+        dynamic_cast<
+        IpAddressIe&>(GtpV2IeFactory::getInstance().getIeObject(IpAddressIeType));
+        ipAddress.displayIpAddressIe_v(data.ueLocalIpAddress, stream);
+
+    }
+    if (data.ueUdpPortIePresent)
+    {
+
+
+        stream.add((char *)"IE - ueUdpPort:");
+        stream.endOfLine();
+        PortNumberIe portNumber=
+        dynamic_cast<
+        PortNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(PortNumberIeType));
+        portNumber.displayPortNumberIe_v(data.ueUdpPort, stream);
+
+    }
+    if (data.nbifomContainerIePresent)
+    {
+
+
+        stream.add((char *)"IE - nbifomContainer:");
+        stream.endOfLine();
+        FContainerIe fContainer=
+        dynamic_cast<
+        FContainerIe&>(GtpV2IeFactory::getInstance().getIeObject(FContainerIeType));
+        fContainer.displayFContainerIe_v(data.nbifomContainer, stream);
+
+    }
+    if (data.ueTcpPortIePresent)
+    {
+
+
+        stream.add((char *)"IE - ueTcpPort:");
+        stream.endOfLine();
+        PortNumberIe portNumber=
+        dynamic_cast<
+        PortNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(PortNumberIeType));
+        portNumber.displayPortNumberIe_v(data.ueTcpPort, stream);
+
+    }
+    if (data.secondaryRatUsageDataReportIePresent)
+    {
+
+
+        stream.add((char *)"IE - secondaryRatUsageDataReport:");
+        stream.endOfLine();
+        SecondaryRatUsageDataReportIe secondaryRatUsageDataReport=
+        dynamic_cast<
+        SecondaryRatUsageDataReportIe&>(GtpV2IeFactory::getInstance().getIeObject(SecondaryRatUsageDataReportIeType));
+        secondaryRatUsageDataReport.displaySecondaryRatUsageDataReportIe_v(data.secondaryRatUsageDataReport, stream);
+
+    }
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
diff --git a/src/gtpV2Codec/msgClasses/deleteBearerResponseMsg.h b/src/gtpV2Codec/msgClasses/deleteBearerResponseMsg.h
new file mode 100644
index 0000000..cc932d1
--- /dev/null
+++ b/src/gtpV2Codec/msgClasses/deleteBearerResponseMsg.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/msgtemplate.h.tt>
+ ******************************************************************************/
+#ifndef DELETEBEARERRESPONSEMSG_H_
+#define DELETEBEARERRESPONSEMSG_H_
+
+#include <set>
+#include "manual/gtpV2Message.h"
+#include <msgBuffer.h>
+#include <debug.h>
+#include "gtpV2MsgDataTypes.h"
+
+
+class DeleteBearerResponseMsg:public GtpV2Message
+{
+public:
+    DeleteBearerResponseMsg();
+    virtual ~DeleteBearerResponseMsg();
+    bool encodeDeleteBearerResponseMsg(MsgBuffer &buffer, DeleteBearerResponseMsgData const &data);
+
+    bool decodeDeleteBearerResponseMsg (MsgBuffer &buffer, DeleteBearerResponseMsgData& data, Uint16 length);
+
+    void displayDeleteBearerResponseMsgData_v(DeleteBearerResponseMsgData const &data, Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/msgClasses/deleteSessionRequestMsg.cpp b/src/gtpV2Codec/msgClasses/deleteSessionRequestMsg.cpp
new file mode 100644
index 0000000..d8482f2
--- /dev/null
+++ b/src/gtpV2Codec/msgClasses/deleteSessionRequestMsg.cpp
@@ -0,0 +1,1578 @@
+/*
+ * 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/msgtemplate.cpp.tt>
+ ******************************************************************************/ 
+
+#include "deleteSessionRequestMsg.h"
+#include "../ieClasses/manual/gtpV2Ie.h"
+#include "../ieClasses/gtpV2IeFactory.h"
+#include "../ieClasses/ebiIe.h"
+#include "../ieClasses/indicationIe.h"
+#include "../ieClasses/causeIe.h"
+#include "../ieClasses/fTeidIe.h"
+#include "../ieClasses/uliIe.h"
+#include "../ieClasses/pcoIe.h"
+#include "../ieClasses/nodeTypeIe.h"
+#include "../ieClasses/ueTimeZoneIe.h"
+#include "../ieClasses/uliTimestampIe.h"
+#include "../ieClasses/ranNasCauseIe.h"
+#include "../ieClasses/twanIdentifierIe.h"
+#include "../ieClasses/twanIdentifierTimestampIe.h"
+#include "../ieClasses/overloadControlInformationIe.h"
+#include "../ieClasses/mmeS4SgsnsOverloadControlInformationInDeleteSessionRequest.h"
+#include "../ieClasses/overloadControlInformationIe.h"
+#include "../ieClasses/sgwsOverloadControlInformationInDeleteSessionRequest.h"
+#include "../ieClasses/overloadControlInformationIe.h"
+#include "../ieClasses/twanEpdgsOverloadControlInformationInDeleteSessionRequest.h"
+#include "../ieClasses/twanIdentifierIe.h"
+#include "../ieClasses/twanIdentifierTimestampIe.h"
+#include "../ieClasses/ipAddressIe.h"
+#include "../ieClasses/portNumberIe.h"
+#include "../ieClasses/epcoIe.h"
+#include "../ieClasses/portNumberIe.h"
+#include "../ieClasses/secondaryRatUsageDataReportIe.h"
+
+DeleteSessionRequestMsg::DeleteSessionRequestMsg()
+{
+    msgType = DeleteSessionRequestMsgType;
+
+}
+
+DeleteSessionRequestMsg::~DeleteSessionRequestMsg()
+{
+
+}
+
+bool DeleteSessionRequestMsg::encodeDeleteSessionRequestMsg(MsgBuffer &buffer,
+                        DeleteSessionRequestMsgData
+							const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+    if (data.linkedEpsBearerIdIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = EbiIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        EbiIe ebi=
+        dynamic_cast<
+        EbiIe&>(GtpV2IeFactory::getInstance().getIeObject(EbiIeType));
+        rc = ebi.encodeEbiIe(buffer, data.linkedEpsBearerId);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: linkedEpsBearerId\n");
+            return false;
+        }
+    }
+
+    if (data.indicationFlagsIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = IndicationIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        IndicationIe indication=
+        dynamic_cast<
+        IndicationIe&>(GtpV2IeFactory::getInstance().getIeObject(IndicationIeType));
+        rc = indication.encodeIndicationIe(buffer, data.indicationFlags);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: indicationFlags\n");
+            return false;
+        }
+    }
+
+    if (data.causeIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = CauseIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        CauseIe cause=
+        dynamic_cast<
+        CauseIe&>(GtpV2IeFactory::getInstance().getIeObject(CauseIeType));
+        rc = cause.encodeCauseIe(buffer, data.cause);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: cause\n");
+            return false;
+        }
+    }
+
+    if (data.senderFTeidForControlPlaneIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.senderFTeidForControlPlane);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: senderFTeidForControlPlane\n");
+            return false;
+        }
+    }
+
+    if (data.userLocationInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = UliIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        UliIe uli=
+        dynamic_cast<
+        UliIe&>(GtpV2IeFactory::getInstance().getIeObject(UliIeType));
+        rc = uli.encodeUliIe(buffer, data.userLocationInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: userLocationInformation\n");
+            return false;
+        }
+    }
+
+    if (data.protocolConfigurationOptionsIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = PcoIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        PcoIe pco=
+        dynamic_cast<
+        PcoIe&>(GtpV2IeFactory::getInstance().getIeObject(PcoIeType));
+        rc = pco.encodePcoIe(buffer, data.protocolConfigurationOptions);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: protocolConfigurationOptions\n");
+            return false;
+        }
+    }
+
+    if (data.originatingNodeIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = NodeTypeIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        NodeTypeIe nodeType=
+        dynamic_cast<
+        NodeTypeIe&>(GtpV2IeFactory::getInstance().getIeObject(NodeTypeIeType));
+        rc = nodeType.encodeNodeTypeIe(buffer, data.originatingNode);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: originatingNode\n");
+            return false;
+        }
+    }
+
+    if (data.ueTimeZoneIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = UeTimeZoneIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        UeTimeZoneIe ueTimeZone=
+        dynamic_cast<
+        UeTimeZoneIe&>(GtpV2IeFactory::getInstance().getIeObject(UeTimeZoneIeType));
+        rc = ueTimeZone.encodeUeTimeZoneIe(buffer, data.ueTimeZone);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: ueTimeZone\n");
+            return false;
+        }
+    }
+
+    if (data.uliTimestampIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = UliTimestampIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        UliTimestampIe uliTimestamp=
+        dynamic_cast<
+        UliTimestampIe&>(GtpV2IeFactory::getInstance().getIeObject(UliTimestampIeType));
+        rc = uliTimestamp.encodeUliTimestampIe(buffer, data.uliTimestamp);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: uliTimestamp\n");
+            return false;
+        }
+    }
+
+    if (data.ranNasReleaseCauseIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = RanNasCauseIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        RanNasCauseIe ranNasCause=
+        dynamic_cast<
+        RanNasCauseIe&>(GtpV2IeFactory::getInstance().getIeObject(RanNasCauseIeType));
+        rc = ranNasCause.encodeRanNasCauseIe(buffer, data.ranNasReleaseCause);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: ranNasReleaseCause\n");
+            return false;
+        }
+    }
+
+    if (data.twanIdentifierIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = TwanIdentifierIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        TwanIdentifierIe twanIdentifier=
+        dynamic_cast<
+        TwanIdentifierIe&>(GtpV2IeFactory::getInstance().getIeObject(TwanIdentifierIeType));
+        rc = twanIdentifier.encodeTwanIdentifierIe(buffer, data.twanIdentifier);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: twanIdentifier\n");
+            return false;
+        }
+    }
+
+    if (data.twanIdentifierTimestampIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = TwanIdentifierTimestampIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        TwanIdentifierTimestampIe twanIdentifierTimestamp=
+        dynamic_cast<
+        TwanIdentifierTimestampIe&>(GtpV2IeFactory::getInstance().getIeObject(TwanIdentifierTimestampIeType));
+        rc = twanIdentifierTimestamp.encodeTwanIdentifierTimestampIe(buffer, data.twanIdentifierTimestamp);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: twanIdentifierTimestamp\n");
+            return false;
+        }
+    }
+
+    if (data.mmeS4SgsnsOverloadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = OverloadControlInformationIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+        MmeS4SgsnsOverloadControlInformationInDeleteSessionRequest groupedIeInstance =
+        dynamic_cast<
+         MmeS4SgsnsOverloadControlInformationInDeleteSessionRequest&>(overloadControlInformation.getGroupedIe(msgType, 0));
+        rc = groupedIeInstance.encodeMmeS4SgsnsOverloadControlInformationInDeleteSessionRequest(buffer, data.mmeS4SgsnsOverloadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: mmeS4SgsnsOverloadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.sgwsOverloadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = OverloadControlInformationIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+        SgwsOverloadControlInformationInDeleteSessionRequest groupedIeInstance =
+        dynamic_cast<
+         SgwsOverloadControlInformationInDeleteSessionRequest&>(overloadControlInformation.getGroupedIe(msgType, 1));
+        rc = groupedIeInstance.encodeSgwsOverloadControlInformationInDeleteSessionRequest(buffer, data.sgwsOverloadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: sgwsOverloadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.twanEpdgsOverloadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = OverloadControlInformationIeType;
+        header.instance = 2;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+        TwanEpdgsOverloadControlInformationInDeleteSessionRequest groupedIeInstance =
+        dynamic_cast<
+         TwanEpdgsOverloadControlInformationInDeleteSessionRequest&>(overloadControlInformation.getGroupedIe(msgType, 2));
+        rc = groupedIeInstance.encodeTwanEpdgsOverloadControlInformationInDeleteSessionRequest(buffer, data.twanEpdgsOverloadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: twanEpdgsOverloadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.wlanLocationInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = TwanIdentifierIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        TwanIdentifierIe twanIdentifier=
+        dynamic_cast<
+        TwanIdentifierIe&>(GtpV2IeFactory::getInstance().getIeObject(TwanIdentifierIeType));
+        rc = twanIdentifier.encodeTwanIdentifierIe(buffer, data.wlanLocationInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: wlanLocationInformation\n");
+            return false;
+        }
+    }
+
+    if (data.wlanLocationTimestampIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = TwanIdentifierTimestampIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        TwanIdentifierTimestampIe twanIdentifierTimestamp=
+        dynamic_cast<
+        TwanIdentifierTimestampIe&>(GtpV2IeFactory::getInstance().getIeObject(TwanIdentifierTimestampIeType));
+        rc = twanIdentifierTimestamp.encodeTwanIdentifierTimestampIe(buffer, data.wlanLocationTimestamp);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: wlanLocationTimestamp\n");
+            return false;
+        }
+    }
+
+    if (data.ueLocalIpAddressIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = IpAddressIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        IpAddressIe ipAddress=
+        dynamic_cast<
+        IpAddressIe&>(GtpV2IeFactory::getInstance().getIeObject(IpAddressIeType));
+        rc = ipAddress.encodeIpAddressIe(buffer, data.ueLocalIpAddress);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: ueLocalIpAddress\n");
+            return false;
+        }
+    }
+
+    if (data.ueUdpPortIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = PortNumberIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        PortNumberIe portNumber=
+        dynamic_cast<
+        PortNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(PortNumberIeType));
+        rc = portNumber.encodePortNumberIe(buffer, data.ueUdpPort);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: ueUdpPort\n");
+            return false;
+        }
+    }
+
+    if (data.extendedProtocolConfigurationOptionsIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = EpcoIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        EpcoIe epco=
+        dynamic_cast<
+        EpcoIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcoIeType));
+        rc = epco.encodeEpcoIe(buffer, data.extendedProtocolConfigurationOptions);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: extendedProtocolConfigurationOptions\n");
+            return false;
+        }
+    }
+
+    if (data.ueTcpPortIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = PortNumberIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        PortNumberIe portNumber=
+        dynamic_cast<
+        PortNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(PortNumberIeType));
+        rc = portNumber.encodePortNumberIe(buffer, data.ueTcpPort);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: ueTcpPort\n");
+            return false;
+        }
+    }
+
+    if (data.secondaryRatUsageDataReportIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = SecondaryRatUsageDataReportIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        SecondaryRatUsageDataReportIe secondaryRatUsageDataReport=
+        dynamic_cast<
+        SecondaryRatUsageDataReportIe&>(GtpV2IeFactory::getInstance().getIeObject(SecondaryRatUsageDataReportIeType));
+        rc = secondaryRatUsageDataReport.encodeSecondaryRatUsageDataReportIe(buffer, data.secondaryRatUsageDataReport);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: secondaryRatUsageDataReport\n");
+            return false;
+        }
+    }
+    return rc;
+
+}
+
+bool DeleteSessionRequestMsg::decodeDeleteSessionRequestMsg(MsgBuffer &buffer,
+ DeleteSessionRequestMsgData 
+ &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+  
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+
+        switch (ieHeader.ieType){
+     
+            case EbiIeType:
+            {
+                EbiIe ieObject =
+                dynamic_cast<
+                EbiIe&>(GtpV2IeFactory::getInstance().getIeObject(EbiIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeEbiIe(buffer, data.linkedEpsBearerId, ieHeader.length);
+
+                    data.linkedEpsBearerIdIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: linkedEpsBearerId\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case IndicationIeType:
+            {
+                IndicationIe ieObject =
+                dynamic_cast<
+                IndicationIe&>(GtpV2IeFactory::getInstance().getIeObject(IndicationIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeIndicationIe(buffer, data.indicationFlags, ieHeader.length);
+
+                    data.indicationFlagsIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: indicationFlags\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case CauseIeType:
+            {
+                CauseIe ieObject =
+                dynamic_cast<
+                CauseIe&>(GtpV2IeFactory::getInstance().getIeObject(CauseIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeCauseIe(buffer, data.cause, ieHeader.length);
+
+                    data.causeIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: cause\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case FTeidIeType:
+            {
+                FTeidIe ieObject =
+                dynamic_cast<
+                FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeFTeidIe(buffer, data.senderFTeidForControlPlane, ieHeader.length);
+
+                    data.senderFTeidForControlPlaneIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: senderFTeidForControlPlane\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case UliIeType:
+            {
+                UliIe ieObject =
+                dynamic_cast<
+                UliIe&>(GtpV2IeFactory::getInstance().getIeObject(UliIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeUliIe(buffer, data.userLocationInformation, ieHeader.length);
+
+                    data.userLocationInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: userLocationInformation\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case PcoIeType:
+            {
+                PcoIe ieObject =
+                dynamic_cast<
+                PcoIe&>(GtpV2IeFactory::getInstance().getIeObject(PcoIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodePcoIe(buffer, data.protocolConfigurationOptions, ieHeader.length);
+
+                    data.protocolConfigurationOptionsIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: protocolConfigurationOptions\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case NodeTypeIeType:
+            {
+                NodeTypeIe ieObject =
+                dynamic_cast<
+                NodeTypeIe&>(GtpV2IeFactory::getInstance().getIeObject(NodeTypeIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeNodeTypeIe(buffer, data.originatingNode, ieHeader.length);
+
+                    data.originatingNodeIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: originatingNode\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case UeTimeZoneIeType:
+            {
+                UeTimeZoneIe ieObject =
+                dynamic_cast<
+                UeTimeZoneIe&>(GtpV2IeFactory::getInstance().getIeObject(UeTimeZoneIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeUeTimeZoneIe(buffer, data.ueTimeZone, ieHeader.length);
+
+                    data.ueTimeZoneIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: ueTimeZone\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case UliTimestampIeType:
+            {
+                UliTimestampIe ieObject =
+                dynamic_cast<
+                UliTimestampIe&>(GtpV2IeFactory::getInstance().getIeObject(UliTimestampIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeUliTimestampIe(buffer, data.uliTimestamp, ieHeader.length);
+
+                    data.uliTimestampIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: uliTimestamp\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case RanNasCauseIeType:
+            {
+                RanNasCauseIe ieObject =
+                dynamic_cast<
+                RanNasCauseIe&>(GtpV2IeFactory::getInstance().getIeObject(RanNasCauseIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeRanNasCauseIe(buffer, data.ranNasReleaseCause, ieHeader.length);
+
+                    data.ranNasReleaseCauseIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: ranNasReleaseCause\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case TwanIdentifierIeType:
+            {
+                TwanIdentifierIe ieObject =
+                dynamic_cast<
+                TwanIdentifierIe&>(GtpV2IeFactory::getInstance().getIeObject(TwanIdentifierIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeTwanIdentifierIe(buffer, data.twanIdentifier, ieHeader.length);
+
+                    data.twanIdentifierIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: twanIdentifier\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					rc = ieObject.decodeTwanIdentifierIe(buffer, data.wlanLocationInformation, ieHeader.length);
+
+                    data.wlanLocationInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: wlanLocationInformation\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case TwanIdentifierTimestampIeType:
+            {
+                TwanIdentifierTimestampIe ieObject =
+                dynamic_cast<
+                TwanIdentifierTimestampIe&>(GtpV2IeFactory::getInstance().getIeObject(TwanIdentifierTimestampIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeTwanIdentifierTimestampIe(buffer, data.twanIdentifierTimestamp, ieHeader.length);
+
+                    data.twanIdentifierTimestampIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: twanIdentifierTimestamp\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					rc = ieObject.decodeTwanIdentifierTimestampIe(buffer, data.wlanLocationTimestamp, ieHeader.length);
+
+                    data.wlanLocationTimestampIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: wlanLocationTimestamp\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case OverloadControlInformationIeType:
+            {
+                OverloadControlInformationIe ieObject =
+                dynamic_cast<
+                OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					MmeS4SgsnsOverloadControlInformationInDeleteSessionRequest groupedIeInstance =
+					dynamic_cast<
+					MmeS4SgsnsOverloadControlInformationInDeleteSessionRequest&>(ieObject.getGroupedIe(msgType, 0));
+					rc = groupedIeInstance.decodeMmeS4SgsnsOverloadControlInformationInDeleteSessionRequest(buffer, data.mmeS4SgsnsOverloadControlInformation, ieHeader.length);
+
+                    data.mmeS4SgsnsOverloadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: mmeS4SgsnsOverloadControlInformation\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					SgwsOverloadControlInformationInDeleteSessionRequest groupedIeInstance =
+					dynamic_cast<
+					SgwsOverloadControlInformationInDeleteSessionRequest&>(ieObject.getGroupedIe(msgType, 1));
+					rc = groupedIeInstance.decodeSgwsOverloadControlInformationInDeleteSessionRequest(buffer, data.sgwsOverloadControlInformation, ieHeader.length);
+
+                    data.sgwsOverloadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: sgwsOverloadControlInformation\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 2)
+                {
+					TwanEpdgsOverloadControlInformationInDeleteSessionRequest groupedIeInstance =
+					dynamic_cast<
+					TwanEpdgsOverloadControlInformationInDeleteSessionRequest&>(ieObject.getGroupedIe(msgType, 2));
+					rc = groupedIeInstance.decodeTwanEpdgsOverloadControlInformationInDeleteSessionRequest(buffer, data.twanEpdgsOverloadControlInformation, ieHeader.length);
+
+                    data.twanEpdgsOverloadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: twanEpdgsOverloadControlInformation\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case IpAddressIeType:
+            {
+                IpAddressIe ieObject =
+                dynamic_cast<
+                IpAddressIe&>(GtpV2IeFactory::getInstance().getIeObject(IpAddressIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeIpAddressIe(buffer, data.ueLocalIpAddress, ieHeader.length);
+
+                    data.ueLocalIpAddressIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: ueLocalIpAddress\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case PortNumberIeType:
+            {
+                PortNumberIe ieObject =
+                dynamic_cast<
+                PortNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(PortNumberIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodePortNumberIe(buffer, data.ueUdpPort, ieHeader.length);
+
+                    data.ueUdpPortIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: ueUdpPort\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					rc = ieObject.decodePortNumberIe(buffer, data.ueTcpPort, ieHeader.length);
+
+                    data.ueTcpPortIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: ueTcpPort\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case EpcoIeType:
+            {
+                EpcoIe ieObject =
+                dynamic_cast<
+                EpcoIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcoIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeEpcoIe(buffer, data.extendedProtocolConfigurationOptions, ieHeader.length);
+
+                    data.extendedProtocolConfigurationOptionsIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: extendedProtocolConfigurationOptions\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case SecondaryRatUsageDataReportIeType:
+            {
+                SecondaryRatUsageDataReportIe ieObject =
+                dynamic_cast<
+                SecondaryRatUsageDataReportIe&>(GtpV2IeFactory::getInstance().getIeObject(SecondaryRatUsageDataReportIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeSecondaryRatUsageDataReportIe(buffer, data.secondaryRatUsageDataReport, ieHeader.length);
+
+                    data.secondaryRatUsageDataReportIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: secondaryRatUsageDataReport\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+
+            default:
+            {
+                // Unknown IE print error
+                errorStream.add((char *)"Unknown IE Type: ");
+                errorStream.add(ieHeader.ieType);
+                errorStream.endOfLine();
+                buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    return rc; // TODO validations
+}
+
+void DeleteSessionRequestMsg::
+displayDeleteSessionRequestMsgData_v(DeleteSessionRequestMsgData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"DeleteSessionRequestMsg:");
+    stream.endOfLine();
+    stream.incrIndent();
+        
+    
+    if (data.linkedEpsBearerIdIePresent)
+    {
+
+
+        stream.add((char *)"IE - linkedEpsBearerId:");
+        stream.endOfLine();
+        EbiIe ebi=
+        dynamic_cast<
+        EbiIe&>(GtpV2IeFactory::getInstance().getIeObject(EbiIeType));
+        ebi.displayEbiIe_v(data.linkedEpsBearerId, stream);
+
+    }
+    if (data.indicationFlagsIePresent)
+    {
+
+
+        stream.add((char *)"IE - indicationFlags:");
+        stream.endOfLine();
+        IndicationIe indication=
+        dynamic_cast<
+        IndicationIe&>(GtpV2IeFactory::getInstance().getIeObject(IndicationIeType));
+        indication.displayIndicationIe_v(data.indicationFlags, stream);
+
+    }
+    if (data.causeIePresent)
+    {
+
+
+        stream.add((char *)"IE - cause:");
+        stream.endOfLine();
+        CauseIe cause=
+        dynamic_cast<
+        CauseIe&>(GtpV2IeFactory::getInstance().getIeObject(CauseIeType));
+        cause.displayCauseIe_v(data.cause, stream);
+
+    }
+    if (data.senderFTeidForControlPlaneIePresent)
+    {
+
+
+        stream.add((char *)"IE - senderFTeidForControlPlane:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.senderFTeidForControlPlane, stream);
+
+    }
+    if (data.userLocationInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - userLocationInformation:");
+        stream.endOfLine();
+        UliIe uli=
+        dynamic_cast<
+        UliIe&>(GtpV2IeFactory::getInstance().getIeObject(UliIeType));
+        uli.displayUliIe_v(data.userLocationInformation, stream);
+
+    }
+    if (data.protocolConfigurationOptionsIePresent)
+    {
+
+
+        stream.add((char *)"IE - protocolConfigurationOptions:");
+        stream.endOfLine();
+        PcoIe pco=
+        dynamic_cast<
+        PcoIe&>(GtpV2IeFactory::getInstance().getIeObject(PcoIeType));
+        pco.displayPcoIe_v(data.protocolConfigurationOptions, stream);
+
+    }
+    if (data.originatingNodeIePresent)
+    {
+
+
+        stream.add((char *)"IE - originatingNode:");
+        stream.endOfLine();
+        NodeTypeIe nodeType=
+        dynamic_cast<
+        NodeTypeIe&>(GtpV2IeFactory::getInstance().getIeObject(NodeTypeIeType));
+        nodeType.displayNodeTypeIe_v(data.originatingNode, stream);
+
+    }
+    if (data.ueTimeZoneIePresent)
+    {
+
+
+        stream.add((char *)"IE - ueTimeZone:");
+        stream.endOfLine();
+        UeTimeZoneIe ueTimeZone=
+        dynamic_cast<
+        UeTimeZoneIe&>(GtpV2IeFactory::getInstance().getIeObject(UeTimeZoneIeType));
+        ueTimeZone.displayUeTimeZoneIe_v(data.ueTimeZone, stream);
+
+    }
+    if (data.uliTimestampIePresent)
+    {
+
+
+        stream.add((char *)"IE - uliTimestamp:");
+        stream.endOfLine();
+        UliTimestampIe uliTimestamp=
+        dynamic_cast<
+        UliTimestampIe&>(GtpV2IeFactory::getInstance().getIeObject(UliTimestampIeType));
+        uliTimestamp.displayUliTimestampIe_v(data.uliTimestamp, stream);
+
+    }
+    if (data.ranNasReleaseCauseIePresent)
+    {
+
+
+        stream.add((char *)"IE - ranNasReleaseCause:");
+        stream.endOfLine();
+        RanNasCauseIe ranNasCause=
+        dynamic_cast<
+        RanNasCauseIe&>(GtpV2IeFactory::getInstance().getIeObject(RanNasCauseIeType));
+        ranNasCause.displayRanNasCauseIe_v(data.ranNasReleaseCause, stream);
+
+    }
+    if (data.twanIdentifierIePresent)
+    {
+
+
+        stream.add((char *)"IE - twanIdentifier:");
+        stream.endOfLine();
+        TwanIdentifierIe twanIdentifier=
+        dynamic_cast<
+        TwanIdentifierIe&>(GtpV2IeFactory::getInstance().getIeObject(TwanIdentifierIeType));
+        twanIdentifier.displayTwanIdentifierIe_v(data.twanIdentifier, stream);
+
+    }
+    if (data.twanIdentifierTimestampIePresent)
+    {
+
+
+        stream.add((char *)"IE - twanIdentifierTimestamp:");
+        stream.endOfLine();
+        TwanIdentifierTimestampIe twanIdentifierTimestamp=
+        dynamic_cast<
+        TwanIdentifierTimestampIe&>(GtpV2IeFactory::getInstance().getIeObject(TwanIdentifierTimestampIeType));
+        twanIdentifierTimestamp.displayTwanIdentifierTimestampIe_v(data.twanIdentifierTimestamp, stream);
+
+    }
+    if (data.mmeS4SgsnsOverloadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - mmeS4SgsnsOverloadControlInformation:");
+        stream.endOfLine();
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+            MmeS4SgsnsOverloadControlInformationInDeleteSessionRequest groupedIeInstance =
+        dynamic_cast<
+        MmeS4SgsnsOverloadControlInformationInDeleteSessionRequest&>(overloadControlInformation.getGroupedIe(msgType, 0));
+        groupedIeInstance.displayMmeS4SgsnsOverloadControlInformationInDeleteSessionRequestData_v(data.mmeS4SgsnsOverloadControlInformation, stream);
+
+    }
+    if (data.sgwsOverloadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - sgwsOverloadControlInformation:");
+        stream.endOfLine();
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+            SgwsOverloadControlInformationInDeleteSessionRequest groupedIeInstance =
+        dynamic_cast<
+        SgwsOverloadControlInformationInDeleteSessionRequest&>(overloadControlInformation.getGroupedIe(msgType, 1));
+        groupedIeInstance.displaySgwsOverloadControlInformationInDeleteSessionRequestData_v(data.sgwsOverloadControlInformation, stream);
+
+    }
+    if (data.twanEpdgsOverloadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - twanEpdgsOverloadControlInformation:");
+        stream.endOfLine();
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+            TwanEpdgsOverloadControlInformationInDeleteSessionRequest groupedIeInstance =
+        dynamic_cast<
+        TwanEpdgsOverloadControlInformationInDeleteSessionRequest&>(overloadControlInformation.getGroupedIe(msgType, 2));
+        groupedIeInstance.displayTwanEpdgsOverloadControlInformationInDeleteSessionRequestData_v(data.twanEpdgsOverloadControlInformation, stream);
+
+    }
+    if (data.wlanLocationInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - wlanLocationInformation:");
+        stream.endOfLine();
+        TwanIdentifierIe twanIdentifier=
+        dynamic_cast<
+        TwanIdentifierIe&>(GtpV2IeFactory::getInstance().getIeObject(TwanIdentifierIeType));
+        twanIdentifier.displayTwanIdentifierIe_v(data.wlanLocationInformation, stream);
+
+    }
+    if (data.wlanLocationTimestampIePresent)
+    {
+
+
+        stream.add((char *)"IE - wlanLocationTimestamp:");
+        stream.endOfLine();
+        TwanIdentifierTimestampIe twanIdentifierTimestamp=
+        dynamic_cast<
+        TwanIdentifierTimestampIe&>(GtpV2IeFactory::getInstance().getIeObject(TwanIdentifierTimestampIeType));
+        twanIdentifierTimestamp.displayTwanIdentifierTimestampIe_v(data.wlanLocationTimestamp, stream);
+
+    }
+    if (data.ueLocalIpAddressIePresent)
+    {
+
+
+        stream.add((char *)"IE - ueLocalIpAddress:");
+        stream.endOfLine();
+        IpAddressIe ipAddress=
+        dynamic_cast<
+        IpAddressIe&>(GtpV2IeFactory::getInstance().getIeObject(IpAddressIeType));
+        ipAddress.displayIpAddressIe_v(data.ueLocalIpAddress, stream);
+
+    }
+    if (data.ueUdpPortIePresent)
+    {
+
+
+        stream.add((char *)"IE - ueUdpPort:");
+        stream.endOfLine();
+        PortNumberIe portNumber=
+        dynamic_cast<
+        PortNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(PortNumberIeType));
+        portNumber.displayPortNumberIe_v(data.ueUdpPort, stream);
+
+    }
+    if (data.extendedProtocolConfigurationOptionsIePresent)
+    {
+
+
+        stream.add((char *)"IE - extendedProtocolConfigurationOptions:");
+        stream.endOfLine();
+        EpcoIe epco=
+        dynamic_cast<
+        EpcoIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcoIeType));
+        epco.displayEpcoIe_v(data.extendedProtocolConfigurationOptions, stream);
+
+    }
+    if (data.ueTcpPortIePresent)
+    {
+
+
+        stream.add((char *)"IE - ueTcpPort:");
+        stream.endOfLine();
+        PortNumberIe portNumber=
+        dynamic_cast<
+        PortNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(PortNumberIeType));
+        portNumber.displayPortNumberIe_v(data.ueTcpPort, stream);
+
+    }
+    if (data.secondaryRatUsageDataReportIePresent)
+    {
+
+
+        stream.add((char *)"IE - secondaryRatUsageDataReport:");
+        stream.endOfLine();
+        SecondaryRatUsageDataReportIe secondaryRatUsageDataReport=
+        dynamic_cast<
+        SecondaryRatUsageDataReportIe&>(GtpV2IeFactory::getInstance().getIeObject(SecondaryRatUsageDataReportIeType));
+        secondaryRatUsageDataReport.displaySecondaryRatUsageDataReportIe_v(data.secondaryRatUsageDataReport, stream);
+
+    }
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
diff --git a/src/gtpV2Codec/msgClasses/deleteSessionRequestMsg.h b/src/gtpV2Codec/msgClasses/deleteSessionRequestMsg.h
new file mode 100644
index 0000000..c453015
--- /dev/null
+++ b/src/gtpV2Codec/msgClasses/deleteSessionRequestMsg.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/msgtemplate.h.tt>
+ ******************************************************************************/
+#ifndef DELETESESSIONREQUESTMSG_H_
+#define DELETESESSIONREQUESTMSG_H_
+
+#include <set>
+#include "manual/gtpV2Message.h"
+#include <msgBuffer.h>
+#include <debug.h>
+#include "gtpV2MsgDataTypes.h"
+
+
+class DeleteSessionRequestMsg:public GtpV2Message
+{
+public:
+    DeleteSessionRequestMsg();
+    virtual ~DeleteSessionRequestMsg();
+    bool encodeDeleteSessionRequestMsg(MsgBuffer &buffer, DeleteSessionRequestMsgData const &data);
+
+    bool decodeDeleteSessionRequestMsg (MsgBuffer &buffer, DeleteSessionRequestMsgData& data, Uint16 length);
+
+    void displayDeleteSessionRequestMsgData_v(DeleteSessionRequestMsgData const &data, Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/msgClasses/deleteSessionResponseMsg.cpp b/src/gtpV2Codec/msgClasses/deleteSessionResponseMsg.cpp
new file mode 100644
index 0000000..292fe40
--- /dev/null
+++ b/src/gtpV2Codec/msgClasses/deleteSessionResponseMsg.cpp
@@ -0,0 +1,788 @@
+/*
+ * 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/msgtemplate.cpp.tt>
+ ******************************************************************************/ 
+
+#include "deleteSessionResponseMsg.h"
+#include "../ieClasses/manual/gtpV2Ie.h"
+#include "../ieClasses/gtpV2IeFactory.h"
+#include "../ieClasses/causeIe.h"
+#include "../ieClasses/recoveryIe.h"
+#include "../ieClasses/pcoIe.h"
+#include "../ieClasses/indicationIe.h"
+#include "../ieClasses/loadControlInformationIe.h"
+#include "../ieClasses/pgwsNodeLevelLoadControlInformationInDeleteSessionResponse.h"
+#include "../ieClasses/loadControlInformationIe.h"
+#include "../ieClasses/pgwsApnLevelLoadControlInformationInDeleteSessionResponse.h"
+#include "../ieClasses/loadControlInformationIe.h"
+#include "../ieClasses/sgwsNodeLevelLoadControlInformationInDeleteSessionResponse.h"
+#include "../ieClasses/overloadControlInformationIe.h"
+#include "../ieClasses/pgwsOverloadControlInformationInDeleteSessionResponse.h"
+#include "../ieClasses/overloadControlInformationIe.h"
+#include "../ieClasses/sgwsOverloadControlInformationInDeleteSessionResponse.h"
+#include "../ieClasses/epcoIe.h"
+
+DeleteSessionResponseMsg::DeleteSessionResponseMsg()
+{
+    msgType = DeleteSessionResponseMsgType;
+    Uint16 mandIe;
+    mandIe = CauseIeType;
+    mandIe = (mandIe << 8) | 0; // cause
+    mandatoryIeSet.insert(mandIe);
+}
+
+DeleteSessionResponseMsg::~DeleteSessionResponseMsg()
+{
+
+}
+
+bool DeleteSessionResponseMsg::encodeDeleteSessionResponseMsg(MsgBuffer &buffer,
+                        DeleteSessionResponseMsgData
+							const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+    
+    // Encode the Ie Header
+    header.ieType = CauseIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    CauseIe cause=
+    dynamic_cast<
+    CauseIe&>(GtpV2IeFactory::getInstance().getIeObject(CauseIeType));
+    rc = cause.encodeCauseIe(buffer, data.cause);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+
+    if (!(rc))
+    { 
+        errorStream.add((char *)"Failed to encode IE: cause\n");
+        return false;
+    }
+
+    if (data.recoveryIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = RecoveryIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        RecoveryIe recovery=
+        dynamic_cast<
+        RecoveryIe&>(GtpV2IeFactory::getInstance().getIeObject(RecoveryIeType));
+        rc = recovery.encodeRecoveryIe(buffer, data.recovery);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: recovery\n");
+            return false;
+        }
+    }
+
+    if (data.protocolConfigurationOptionsIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = PcoIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        PcoIe pco=
+        dynamic_cast<
+        PcoIe&>(GtpV2IeFactory::getInstance().getIeObject(PcoIeType));
+        rc = pco.encodePcoIe(buffer, data.protocolConfigurationOptions);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: protocolConfigurationOptions\n");
+            return false;
+        }
+    }
+
+    if (data.indicationFlagsIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = IndicationIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        IndicationIe indication=
+        dynamic_cast<
+        IndicationIe&>(GtpV2IeFactory::getInstance().getIeObject(IndicationIeType));
+        rc = indication.encodeIndicationIe(buffer, data.indicationFlags);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: indicationFlags\n");
+            return false;
+        }
+    }
+
+    if (data.pgwsNodeLevelLoadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = LoadControlInformationIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        LoadControlInformationIe loadControlInformation=
+        dynamic_cast<
+        LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+        PgwsNodeLevelLoadControlInformationInDeleteSessionResponse groupedIeInstance =
+        dynamic_cast<
+         PgwsNodeLevelLoadControlInformationInDeleteSessionResponse&>(loadControlInformation.getGroupedIe(msgType, 0));
+        rc = groupedIeInstance.encodePgwsNodeLevelLoadControlInformationInDeleteSessionResponse(buffer, data.pgwsNodeLevelLoadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: pgwsNodeLevelLoadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.pgwsApnLevelLoadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = LoadControlInformationIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        LoadControlInformationIe loadControlInformation=
+        dynamic_cast<
+        LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+        PgwsApnLevelLoadControlInformationInDeleteSessionResponse groupedIeInstance =
+        dynamic_cast<
+         PgwsApnLevelLoadControlInformationInDeleteSessionResponse&>(loadControlInformation.getGroupedIe(msgType, 1));
+        rc = groupedIeInstance.encodePgwsApnLevelLoadControlInformationInDeleteSessionResponse(buffer, data.pgwsApnLevelLoadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: pgwsApnLevelLoadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.sgwsNodeLevelLoadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = LoadControlInformationIeType;
+        header.instance = 2;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        LoadControlInformationIe loadControlInformation=
+        dynamic_cast<
+        LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+        SgwsNodeLevelLoadControlInformationInDeleteSessionResponse groupedIeInstance =
+        dynamic_cast<
+         SgwsNodeLevelLoadControlInformationInDeleteSessionResponse&>(loadControlInformation.getGroupedIe(msgType, 2));
+        rc = groupedIeInstance.encodeSgwsNodeLevelLoadControlInformationInDeleteSessionResponse(buffer, data.sgwsNodeLevelLoadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: sgwsNodeLevelLoadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.pgwsOverloadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = OverloadControlInformationIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+        PgwsOverloadControlInformationInDeleteSessionResponse groupedIeInstance =
+        dynamic_cast<
+         PgwsOverloadControlInformationInDeleteSessionResponse&>(overloadControlInformation.getGroupedIe(msgType, 0));
+        rc = groupedIeInstance.encodePgwsOverloadControlInformationInDeleteSessionResponse(buffer, data.pgwsOverloadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: pgwsOverloadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.sgwsOverloadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = OverloadControlInformationIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+        SgwsOverloadControlInformationInDeleteSessionResponse groupedIeInstance =
+        dynamic_cast<
+         SgwsOverloadControlInformationInDeleteSessionResponse&>(overloadControlInformation.getGroupedIe(msgType, 1));
+        rc = groupedIeInstance.encodeSgwsOverloadControlInformationInDeleteSessionResponse(buffer, data.sgwsOverloadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: sgwsOverloadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.extendedProtocolConfigurationOptionsIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = EpcoIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        EpcoIe epco=
+        dynamic_cast<
+        EpcoIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcoIeType));
+        rc = epco.encodeEpcoIe(buffer, data.extendedProtocolConfigurationOptions);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: extendedProtocolConfigurationOptions\n");
+            return false;
+        }
+    }
+    return rc;
+
+}
+
+bool DeleteSessionResponseMsg::decodeDeleteSessionResponseMsg(MsgBuffer &buffer,
+ DeleteSessionResponseMsgData 
+ &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+  
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+
+        switch (ieHeader.ieType){
+     
+            case CauseIeType:
+            {
+                CauseIe ieObject =
+                dynamic_cast<
+                CauseIe&>(GtpV2IeFactory::getInstance().getIeObject(CauseIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeCauseIe(buffer, data.cause, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: cause\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case RecoveryIeType:
+            {
+                RecoveryIe ieObject =
+                dynamic_cast<
+                RecoveryIe&>(GtpV2IeFactory::getInstance().getIeObject(RecoveryIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeRecoveryIe(buffer, data.recovery, ieHeader.length);
+
+                    data.recoveryIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: recovery\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case PcoIeType:
+            {
+                PcoIe ieObject =
+                dynamic_cast<
+                PcoIe&>(GtpV2IeFactory::getInstance().getIeObject(PcoIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodePcoIe(buffer, data.protocolConfigurationOptions, ieHeader.length);
+
+                    data.protocolConfigurationOptionsIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: protocolConfigurationOptions\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case IndicationIeType:
+            {
+                IndicationIe ieObject =
+                dynamic_cast<
+                IndicationIe&>(GtpV2IeFactory::getInstance().getIeObject(IndicationIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeIndicationIe(buffer, data.indicationFlags, ieHeader.length);
+
+                    data.indicationFlagsIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: indicationFlags\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case LoadControlInformationIeType:
+            {
+                LoadControlInformationIe ieObject =
+                dynamic_cast<
+                LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					PgwsNodeLevelLoadControlInformationInDeleteSessionResponse groupedIeInstance =
+					dynamic_cast<
+					PgwsNodeLevelLoadControlInformationInDeleteSessionResponse&>(ieObject.getGroupedIe(msgType, 0));
+					rc = groupedIeInstance.decodePgwsNodeLevelLoadControlInformationInDeleteSessionResponse(buffer, data.pgwsNodeLevelLoadControlInformation, ieHeader.length);
+
+                    data.pgwsNodeLevelLoadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: pgwsNodeLevelLoadControlInformation\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					PgwsApnLevelLoadControlInformationInDeleteSessionResponse groupedIeInstance =
+					dynamic_cast<
+					PgwsApnLevelLoadControlInformationInDeleteSessionResponse&>(ieObject.getGroupedIe(msgType, 1));
+					rc = groupedIeInstance.decodePgwsApnLevelLoadControlInformationInDeleteSessionResponse(buffer, data.pgwsApnLevelLoadControlInformation, ieHeader.length);
+
+                    data.pgwsApnLevelLoadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: pgwsApnLevelLoadControlInformation\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 2)
+                {
+					SgwsNodeLevelLoadControlInformationInDeleteSessionResponse groupedIeInstance =
+					dynamic_cast<
+					SgwsNodeLevelLoadControlInformationInDeleteSessionResponse&>(ieObject.getGroupedIe(msgType, 2));
+					rc = groupedIeInstance.decodeSgwsNodeLevelLoadControlInformationInDeleteSessionResponse(buffer, data.sgwsNodeLevelLoadControlInformation, ieHeader.length);
+
+                    data.sgwsNodeLevelLoadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: sgwsNodeLevelLoadControlInformation\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case OverloadControlInformationIeType:
+            {
+                OverloadControlInformationIe ieObject =
+                dynamic_cast<
+                OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					PgwsOverloadControlInformationInDeleteSessionResponse groupedIeInstance =
+					dynamic_cast<
+					PgwsOverloadControlInformationInDeleteSessionResponse&>(ieObject.getGroupedIe(msgType, 0));
+					rc = groupedIeInstance.decodePgwsOverloadControlInformationInDeleteSessionResponse(buffer, data.pgwsOverloadControlInformation, ieHeader.length);
+
+                    data.pgwsOverloadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: pgwsOverloadControlInformation\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					SgwsOverloadControlInformationInDeleteSessionResponse groupedIeInstance =
+					dynamic_cast<
+					SgwsOverloadControlInformationInDeleteSessionResponse&>(ieObject.getGroupedIe(msgType, 1));
+					rc = groupedIeInstance.decodeSgwsOverloadControlInformationInDeleteSessionResponse(buffer, data.sgwsOverloadControlInformation, ieHeader.length);
+
+                    data.sgwsOverloadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: sgwsOverloadControlInformation\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case EpcoIeType:
+            {
+                EpcoIe ieObject =
+                dynamic_cast<
+                EpcoIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcoIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeEpcoIe(buffer, data.extendedProtocolConfigurationOptions, ieHeader.length);
+
+                    data.extendedProtocolConfigurationOptionsIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: extendedProtocolConfigurationOptions\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+
+            default:
+            {
+                // Unknown IE print error
+                errorStream.add((char *)"Unknown IE Type: ");
+                errorStream.add(ieHeader.ieType);
+                errorStream.endOfLine();
+                buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    return rc; // TODO validations
+}
+
+void DeleteSessionResponseMsg::
+displayDeleteSessionResponseMsgData_v(DeleteSessionResponseMsgData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"DeleteSessionResponseMsg:");
+    stream.endOfLine();
+    stream.incrIndent();
+        
+    
+        stream.add((char *)"IE - cause:");
+        stream.endOfLine();
+        CauseIe cause=
+        dynamic_cast<
+        CauseIe&>(GtpV2IeFactory::getInstance().getIeObject(CauseIeType));
+        cause.displayCauseIe_v(data.cause, stream);
+
+    if (data.recoveryIePresent)
+    {
+
+
+        stream.add((char *)"IE - recovery:");
+        stream.endOfLine();
+        RecoveryIe recovery=
+        dynamic_cast<
+        RecoveryIe&>(GtpV2IeFactory::getInstance().getIeObject(RecoveryIeType));
+        recovery.displayRecoveryIe_v(data.recovery, stream);
+
+    }
+    if (data.protocolConfigurationOptionsIePresent)
+    {
+
+
+        stream.add((char *)"IE - protocolConfigurationOptions:");
+        stream.endOfLine();
+        PcoIe pco=
+        dynamic_cast<
+        PcoIe&>(GtpV2IeFactory::getInstance().getIeObject(PcoIeType));
+        pco.displayPcoIe_v(data.protocolConfigurationOptions, stream);
+
+    }
+    if (data.indicationFlagsIePresent)
+    {
+
+
+        stream.add((char *)"IE - indicationFlags:");
+        stream.endOfLine();
+        IndicationIe indication=
+        dynamic_cast<
+        IndicationIe&>(GtpV2IeFactory::getInstance().getIeObject(IndicationIeType));
+        indication.displayIndicationIe_v(data.indicationFlags, stream);
+
+    }
+    if (data.pgwsNodeLevelLoadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - pgwsNodeLevelLoadControlInformation:");
+        stream.endOfLine();
+        LoadControlInformationIe loadControlInformation=
+        dynamic_cast<
+        LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+            PgwsNodeLevelLoadControlInformationInDeleteSessionResponse groupedIeInstance =
+        dynamic_cast<
+        PgwsNodeLevelLoadControlInformationInDeleteSessionResponse&>(loadControlInformation.getGroupedIe(msgType, 0));
+        groupedIeInstance.displayPgwsNodeLevelLoadControlInformationInDeleteSessionResponseData_v(data.pgwsNodeLevelLoadControlInformation, stream);
+
+    }
+    if (data.pgwsApnLevelLoadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - pgwsApnLevelLoadControlInformation:");
+        stream.endOfLine();
+        LoadControlInformationIe loadControlInformation=
+        dynamic_cast<
+        LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+            PgwsApnLevelLoadControlInformationInDeleteSessionResponse groupedIeInstance =
+        dynamic_cast<
+        PgwsApnLevelLoadControlInformationInDeleteSessionResponse&>(loadControlInformation.getGroupedIe(msgType, 1));
+        groupedIeInstance.displayPgwsApnLevelLoadControlInformationInDeleteSessionResponseData_v(data.pgwsApnLevelLoadControlInformation, stream);
+
+    }
+    if (data.sgwsNodeLevelLoadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - sgwsNodeLevelLoadControlInformation:");
+        stream.endOfLine();
+        LoadControlInformationIe loadControlInformation=
+        dynamic_cast<
+        LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+            SgwsNodeLevelLoadControlInformationInDeleteSessionResponse groupedIeInstance =
+        dynamic_cast<
+        SgwsNodeLevelLoadControlInformationInDeleteSessionResponse&>(loadControlInformation.getGroupedIe(msgType, 2));
+        groupedIeInstance.displaySgwsNodeLevelLoadControlInformationInDeleteSessionResponseData_v(data.sgwsNodeLevelLoadControlInformation, stream);
+
+    }
+    if (data.pgwsOverloadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - pgwsOverloadControlInformation:");
+        stream.endOfLine();
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+            PgwsOverloadControlInformationInDeleteSessionResponse groupedIeInstance =
+        dynamic_cast<
+        PgwsOverloadControlInformationInDeleteSessionResponse&>(overloadControlInformation.getGroupedIe(msgType, 0));
+        groupedIeInstance.displayPgwsOverloadControlInformationInDeleteSessionResponseData_v(data.pgwsOverloadControlInformation, stream);
+
+    }
+    if (data.sgwsOverloadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - sgwsOverloadControlInformation:");
+        stream.endOfLine();
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+            SgwsOverloadControlInformationInDeleteSessionResponse groupedIeInstance =
+        dynamic_cast<
+        SgwsOverloadControlInformationInDeleteSessionResponse&>(overloadControlInformation.getGroupedIe(msgType, 1));
+        groupedIeInstance.displaySgwsOverloadControlInformationInDeleteSessionResponseData_v(data.sgwsOverloadControlInformation, stream);
+
+    }
+    if (data.extendedProtocolConfigurationOptionsIePresent)
+    {
+
+
+        stream.add((char *)"IE - extendedProtocolConfigurationOptions:");
+        stream.endOfLine();
+        EpcoIe epco=
+        dynamic_cast<
+        EpcoIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcoIeType));
+        epco.displayEpcoIe_v(data.extendedProtocolConfigurationOptions, stream);
+
+    }
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
diff --git a/src/gtpV2Codec/msgClasses/deleteSessionResponseMsg.h b/src/gtpV2Codec/msgClasses/deleteSessionResponseMsg.h
new file mode 100644
index 0000000..294a670
--- /dev/null
+++ b/src/gtpV2Codec/msgClasses/deleteSessionResponseMsg.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/msgtemplate.h.tt>
+ ******************************************************************************/
+#ifndef DELETESESSIONRESPONSEMSG_H_
+#define DELETESESSIONRESPONSEMSG_H_
+
+#include <set>
+#include "manual/gtpV2Message.h"
+#include <msgBuffer.h>
+#include <debug.h>
+#include "gtpV2MsgDataTypes.h"
+
+
+class DeleteSessionResponseMsg:public GtpV2Message
+{
+public:
+    DeleteSessionResponseMsg();
+    virtual ~DeleteSessionResponseMsg();
+    bool encodeDeleteSessionResponseMsg(MsgBuffer &buffer, DeleteSessionResponseMsgData const &data);
+
+    bool decodeDeleteSessionResponseMsg (MsgBuffer &buffer, DeleteSessionResponseMsgData& data, Uint16 length);
+
+    void displayDeleteSessionResponseMsgData_v(DeleteSessionResponseMsgData const &data, Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/msgClasses/downlinkDataNotificationAcknowledgeMsg.cpp b/src/gtpV2Codec/msgClasses/downlinkDataNotificationAcknowledgeMsg.cpp
new file mode 100644
index 0000000..1500662
--- /dev/null
+++ b/src/gtpV2Codec/msgClasses/downlinkDataNotificationAcknowledgeMsg.cpp
@@ -0,0 +1,582 @@
+/*
+ * 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/msgtemplate.cpp.tt>
+ ******************************************************************************/ 
+
+#include "downlinkDataNotificationAcknowledgeMsg.h"
+#include "../ieClasses/manual/gtpV2Ie.h"
+#include "../ieClasses/gtpV2IeFactory.h"
+#include "../ieClasses/causeIe.h"
+#include "../ieClasses/delayValueIe.h"
+#include "../ieClasses/recoveryIe.h"
+#include "../ieClasses/throttlingIe.h"
+#include "../ieClasses/imsiIe.h"
+#include "../ieClasses/epcTimerIe.h"
+#include "../ieClasses/integerNumberIe.h"
+
+DownlinkDataNotificationAcknowledgeMsg::DownlinkDataNotificationAcknowledgeMsg()
+{
+    msgType = DownlinkDataNotificationAcknowledgeMsgType;
+    Uint16 mandIe;
+    mandIe = CauseIeType;
+    mandIe = (mandIe << 8) | 0; // cause
+    mandatoryIeSet.insert(mandIe);
+}
+
+DownlinkDataNotificationAcknowledgeMsg::~DownlinkDataNotificationAcknowledgeMsg()
+{
+
+}
+
+bool DownlinkDataNotificationAcknowledgeMsg::encodeDownlinkDataNotificationAcknowledgeMsg(MsgBuffer &buffer,
+                        DownlinkDataNotificationAcknowledgeMsgData
+							const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+    
+    // Encode the Ie Header
+    header.ieType = CauseIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    CauseIe cause=
+    dynamic_cast<
+    CauseIe&>(GtpV2IeFactory::getInstance().getIeObject(CauseIeType));
+    rc = cause.encodeCauseIe(buffer, data.cause);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+
+    if (!(rc))
+    { 
+        errorStream.add((char *)"Failed to encode IE: cause\n");
+        return false;
+    }
+
+    if (data.dataNotificationDelayIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = DelayValueIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        DelayValueIe delayValue=
+        dynamic_cast<
+        DelayValueIe&>(GtpV2IeFactory::getInstance().getIeObject(DelayValueIeType));
+        rc = delayValue.encodeDelayValueIe(buffer, data.dataNotificationDelay);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: dataNotificationDelay\n");
+            return false;
+        }
+    }
+
+    if (data.recoveryIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = RecoveryIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        RecoveryIe recovery=
+        dynamic_cast<
+        RecoveryIe&>(GtpV2IeFactory::getInstance().getIeObject(RecoveryIeType));
+        rc = recovery.encodeRecoveryIe(buffer, data.recovery);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: recovery\n");
+            return false;
+        }
+    }
+
+    if (data.dlLowPriorityTrafficThrottlingIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = ThrottlingIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        ThrottlingIe throttling=
+        dynamic_cast<
+        ThrottlingIe&>(GtpV2IeFactory::getInstance().getIeObject(ThrottlingIeType));
+        rc = throttling.encodeThrottlingIe(buffer, data.dlLowPriorityTrafficThrottling);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: dlLowPriorityTrafficThrottling\n");
+            return false;
+        }
+    }
+
+    if (data.imsiIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = ImsiIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        ImsiIe imsi=
+        dynamic_cast<
+        ImsiIe&>(GtpV2IeFactory::getInstance().getIeObject(ImsiIeType));
+        rc = imsi.encodeImsiIe(buffer, data.imsi);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: imsi\n");
+            return false;
+        }
+    }
+
+    if (data.dlBufferingDurationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = EpcTimerIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        EpcTimerIe epcTimer=
+        dynamic_cast<
+        EpcTimerIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcTimerIeType));
+        rc = epcTimer.encodeEpcTimerIe(buffer, data.dlBufferingDuration);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: dlBufferingDuration\n");
+            return false;
+        }
+    }
+
+    if (data.dlBufferingSuggestedPacketCountIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = IntegerNumberIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        IntegerNumberIe integerNumber=
+        dynamic_cast<
+        IntegerNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(IntegerNumberIeType));
+        rc = integerNumber.encodeIntegerNumberIe(buffer, data.dlBufferingSuggestedPacketCount);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: dlBufferingSuggestedPacketCount\n");
+            return false;
+        }
+    }
+    return rc;
+
+}
+
+bool DownlinkDataNotificationAcknowledgeMsg::decodeDownlinkDataNotificationAcknowledgeMsg(MsgBuffer &buffer,
+ DownlinkDataNotificationAcknowledgeMsgData 
+ &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+  
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+
+        switch (ieHeader.ieType){
+     
+            case CauseIeType:
+            {
+                CauseIe ieObject =
+                dynamic_cast<
+                CauseIe&>(GtpV2IeFactory::getInstance().getIeObject(CauseIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeCauseIe(buffer, data.cause, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: cause\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case DelayValueIeType:
+            {
+                DelayValueIe ieObject =
+                dynamic_cast<
+                DelayValueIe&>(GtpV2IeFactory::getInstance().getIeObject(DelayValueIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeDelayValueIe(buffer, data.dataNotificationDelay, ieHeader.length);
+
+                    data.dataNotificationDelayIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: dataNotificationDelay\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case RecoveryIeType:
+            {
+                RecoveryIe ieObject =
+                dynamic_cast<
+                RecoveryIe&>(GtpV2IeFactory::getInstance().getIeObject(RecoveryIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeRecoveryIe(buffer, data.recovery, ieHeader.length);
+
+                    data.recoveryIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: recovery\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case ThrottlingIeType:
+            {
+                ThrottlingIe ieObject =
+                dynamic_cast<
+                ThrottlingIe&>(GtpV2IeFactory::getInstance().getIeObject(ThrottlingIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeThrottlingIe(buffer, data.dlLowPriorityTrafficThrottling, ieHeader.length);
+
+                    data.dlLowPriorityTrafficThrottlingIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: dlLowPriorityTrafficThrottling\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case ImsiIeType:
+            {
+                ImsiIe ieObject =
+                dynamic_cast<
+                ImsiIe&>(GtpV2IeFactory::getInstance().getIeObject(ImsiIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeImsiIe(buffer, data.imsi, ieHeader.length);
+
+                    data.imsiIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: imsi\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case EpcTimerIeType:
+            {
+                EpcTimerIe ieObject =
+                dynamic_cast<
+                EpcTimerIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcTimerIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeEpcTimerIe(buffer, data.dlBufferingDuration, ieHeader.length);
+
+                    data.dlBufferingDurationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: dlBufferingDuration\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case IntegerNumberIeType:
+            {
+                IntegerNumberIe ieObject =
+                dynamic_cast<
+                IntegerNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(IntegerNumberIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeIntegerNumberIe(buffer, data.dlBufferingSuggestedPacketCount, ieHeader.length);
+
+                    data.dlBufferingSuggestedPacketCountIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: dlBufferingSuggestedPacketCount\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+
+            default:
+            {
+                // Unknown IE print error
+                errorStream.add((char *)"Unknown IE Type: ");
+                errorStream.add(ieHeader.ieType);
+                errorStream.endOfLine();
+                buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    return rc; // TODO validations
+}
+
+void DownlinkDataNotificationAcknowledgeMsg::
+displayDownlinkDataNotificationAcknowledgeMsgData_v(DownlinkDataNotificationAcknowledgeMsgData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"DownlinkDataNotificationAcknowledgeMsg:");
+    stream.endOfLine();
+    stream.incrIndent();
+        
+    
+        stream.add((char *)"IE - cause:");
+        stream.endOfLine();
+        CauseIe cause=
+        dynamic_cast<
+        CauseIe&>(GtpV2IeFactory::getInstance().getIeObject(CauseIeType));
+        cause.displayCauseIe_v(data.cause, stream);
+
+    if (data.dataNotificationDelayIePresent)
+    {
+
+
+        stream.add((char *)"IE - dataNotificationDelay:");
+        stream.endOfLine();
+        DelayValueIe delayValue=
+        dynamic_cast<
+        DelayValueIe&>(GtpV2IeFactory::getInstance().getIeObject(DelayValueIeType));
+        delayValue.displayDelayValueIe_v(data.dataNotificationDelay, stream);
+
+    }
+    if (data.recoveryIePresent)
+    {
+
+
+        stream.add((char *)"IE - recovery:");
+        stream.endOfLine();
+        RecoveryIe recovery=
+        dynamic_cast<
+        RecoveryIe&>(GtpV2IeFactory::getInstance().getIeObject(RecoveryIeType));
+        recovery.displayRecoveryIe_v(data.recovery, stream);
+
+    }
+    if (data.dlLowPriorityTrafficThrottlingIePresent)
+    {
+
+
+        stream.add((char *)"IE - dlLowPriorityTrafficThrottling:");
+        stream.endOfLine();
+        ThrottlingIe throttling=
+        dynamic_cast<
+        ThrottlingIe&>(GtpV2IeFactory::getInstance().getIeObject(ThrottlingIeType));
+        throttling.displayThrottlingIe_v(data.dlLowPriorityTrafficThrottling, stream);
+
+    }
+    if (data.imsiIePresent)
+    {
+
+
+        stream.add((char *)"IE - imsi:");
+        stream.endOfLine();
+        ImsiIe imsi=
+        dynamic_cast<
+        ImsiIe&>(GtpV2IeFactory::getInstance().getIeObject(ImsiIeType));
+        imsi.displayImsiIe_v(data.imsi, stream);
+
+    }
+    if (data.dlBufferingDurationIePresent)
+    {
+
+
+        stream.add((char *)"IE - dlBufferingDuration:");
+        stream.endOfLine();
+        EpcTimerIe epcTimer=
+        dynamic_cast<
+        EpcTimerIe&>(GtpV2IeFactory::getInstance().getIeObject(EpcTimerIeType));
+        epcTimer.displayEpcTimerIe_v(data.dlBufferingDuration, stream);
+
+    }
+    if (data.dlBufferingSuggestedPacketCountIePresent)
+    {
+
+
+        stream.add((char *)"IE - dlBufferingSuggestedPacketCount:");
+        stream.endOfLine();
+        IntegerNumberIe integerNumber=
+        dynamic_cast<
+        IntegerNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(IntegerNumberIeType));
+        integerNumber.displayIntegerNumberIe_v(data.dlBufferingSuggestedPacketCount, stream);
+
+    }
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
diff --git a/src/gtpV2Codec/msgClasses/downlinkDataNotificationAcknowledgeMsg.h b/src/gtpV2Codec/msgClasses/downlinkDataNotificationAcknowledgeMsg.h
new file mode 100644
index 0000000..7557d27
--- /dev/null
+++ b/src/gtpV2Codec/msgClasses/downlinkDataNotificationAcknowledgeMsg.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/msgtemplate.h.tt>
+ ******************************************************************************/
+#ifndef DOWNLINKDATANOTIFICATIONACKNOWLEDGEMSG_H_
+#define DOWNLINKDATANOTIFICATIONACKNOWLEDGEMSG_H_
+
+#include <set>
+#include "manual/gtpV2Message.h"
+#include <msgBuffer.h>
+#include <debug.h>
+#include "gtpV2MsgDataTypes.h"
+
+
+class DownlinkDataNotificationAcknowledgeMsg:public GtpV2Message
+{
+public:
+    DownlinkDataNotificationAcknowledgeMsg();
+    virtual ~DownlinkDataNotificationAcknowledgeMsg();
+    bool encodeDownlinkDataNotificationAcknowledgeMsg(MsgBuffer &buffer, DownlinkDataNotificationAcknowledgeMsgData const &data);
+
+    bool decodeDownlinkDataNotificationAcknowledgeMsg (MsgBuffer &buffer, DownlinkDataNotificationAcknowledgeMsgData& data, Uint16 length);
+
+    void displayDownlinkDataNotificationAcknowledgeMsgData_v(DownlinkDataNotificationAcknowledgeMsgData const &data, Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/msgClasses/downlinkDataNotificationFailureIndicationMsg.cpp b/src/gtpV2Codec/msgClasses/downlinkDataNotificationFailureIndicationMsg.cpp
new file mode 100644
index 0000000..538220d
--- /dev/null
+++ b/src/gtpV2Codec/msgClasses/downlinkDataNotificationFailureIndicationMsg.cpp
@@ -0,0 +1,302 @@
+/*
+ * 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/msgtemplate.cpp.tt>
+ ******************************************************************************/ 
+
+#include "downlinkDataNotificationFailureIndicationMsg.h"
+#include "../ieClasses/manual/gtpV2Ie.h"
+#include "../ieClasses/gtpV2IeFactory.h"
+#include "../ieClasses/causeIe.h"
+#include "../ieClasses/nodeTypeIe.h"
+#include "../ieClasses/imsiIe.h"
+
+DownlinkDataNotificationFailureIndicationMsg::DownlinkDataNotificationFailureIndicationMsg()
+{
+    msgType = DownlinkDataNotificationFailureIndicationMsgType;
+    Uint16 mandIe;
+    mandIe = CauseIeType;
+    mandIe = (mandIe << 8) | 0; // cause
+    mandatoryIeSet.insert(mandIe);
+}
+
+DownlinkDataNotificationFailureIndicationMsg::~DownlinkDataNotificationFailureIndicationMsg()
+{
+
+}
+
+bool DownlinkDataNotificationFailureIndicationMsg::encodeDownlinkDataNotificationFailureIndicationMsg(MsgBuffer &buffer,
+                        DownlinkDataNotificationFailureIndicationMsgData
+							const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+    
+    // Encode the Ie Header
+    header.ieType = CauseIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    CauseIe cause=
+    dynamic_cast<
+    CauseIe&>(GtpV2IeFactory::getInstance().getIeObject(CauseIeType));
+    rc = cause.encodeCauseIe(buffer, data.cause);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+
+    if (!(rc))
+    { 
+        errorStream.add((char *)"Failed to encode IE: cause\n");
+        return false;
+    }
+
+    if (data.originatingNodeIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = NodeTypeIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        NodeTypeIe nodeType=
+        dynamic_cast<
+        NodeTypeIe&>(GtpV2IeFactory::getInstance().getIeObject(NodeTypeIeType));
+        rc = nodeType.encodeNodeTypeIe(buffer, data.originatingNode);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: originatingNode\n");
+            return false;
+        }
+    }
+
+    if (data.imsiIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = ImsiIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        ImsiIe imsi=
+        dynamic_cast<
+        ImsiIe&>(GtpV2IeFactory::getInstance().getIeObject(ImsiIeType));
+        rc = imsi.encodeImsiIe(buffer, data.imsi);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: imsi\n");
+            return false;
+        }
+    }
+    return rc;
+
+}
+
+bool DownlinkDataNotificationFailureIndicationMsg::decodeDownlinkDataNotificationFailureIndicationMsg(MsgBuffer &buffer,
+ DownlinkDataNotificationFailureIndicationMsgData 
+ &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+  
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+
+        switch (ieHeader.ieType){
+     
+            case CauseIeType:
+            {
+                CauseIe ieObject =
+                dynamic_cast<
+                CauseIe&>(GtpV2IeFactory::getInstance().getIeObject(CauseIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeCauseIe(buffer, data.cause, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: cause\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case NodeTypeIeType:
+            {
+                NodeTypeIe ieObject =
+                dynamic_cast<
+                NodeTypeIe&>(GtpV2IeFactory::getInstance().getIeObject(NodeTypeIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeNodeTypeIe(buffer, data.originatingNode, ieHeader.length);
+
+                    data.originatingNodeIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: originatingNode\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case ImsiIeType:
+            {
+                ImsiIe ieObject =
+                dynamic_cast<
+                ImsiIe&>(GtpV2IeFactory::getInstance().getIeObject(ImsiIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeImsiIe(buffer, data.imsi, ieHeader.length);
+
+                    data.imsiIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: imsi\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+
+            default:
+            {
+                // Unknown IE print error
+                errorStream.add((char *)"Unknown IE Type: ");
+                errorStream.add(ieHeader.ieType);
+                errorStream.endOfLine();
+                buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    return rc; // TODO validations
+}
+
+void DownlinkDataNotificationFailureIndicationMsg::
+displayDownlinkDataNotificationFailureIndicationMsgData_v(DownlinkDataNotificationFailureIndicationMsgData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"DownlinkDataNotificationFailureIndicationMsg:");
+    stream.endOfLine();
+    stream.incrIndent();
+        
+    
+        stream.add((char *)"IE - cause:");
+        stream.endOfLine();
+        CauseIe cause=
+        dynamic_cast<
+        CauseIe&>(GtpV2IeFactory::getInstance().getIeObject(CauseIeType));
+        cause.displayCauseIe_v(data.cause, stream);
+
+    if (data.originatingNodeIePresent)
+    {
+
+
+        stream.add((char *)"IE - originatingNode:");
+        stream.endOfLine();
+        NodeTypeIe nodeType=
+        dynamic_cast<
+        NodeTypeIe&>(GtpV2IeFactory::getInstance().getIeObject(NodeTypeIeType));
+        nodeType.displayNodeTypeIe_v(data.originatingNode, stream);
+
+    }
+    if (data.imsiIePresent)
+    {
+
+
+        stream.add((char *)"IE - imsi:");
+        stream.endOfLine();
+        ImsiIe imsi=
+        dynamic_cast<
+        ImsiIe&>(GtpV2IeFactory::getInstance().getIeObject(ImsiIeType));
+        imsi.displayImsiIe_v(data.imsi, stream);
+
+    }
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
diff --git a/src/gtpV2Codec/msgClasses/downlinkDataNotificationFailureIndicationMsg.h b/src/gtpV2Codec/msgClasses/downlinkDataNotificationFailureIndicationMsg.h
new file mode 100644
index 0000000..205ce64
--- /dev/null
+++ b/src/gtpV2Codec/msgClasses/downlinkDataNotificationFailureIndicationMsg.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/msgtemplate.h.tt>
+ ******************************************************************************/
+#ifndef DOWNLINKDATANOTIFICATIONFAILUREINDICATIONMSG_H_
+#define DOWNLINKDATANOTIFICATIONFAILUREINDICATIONMSG_H_
+
+#include <set>
+#include "manual/gtpV2Message.h"
+#include <msgBuffer.h>
+#include <debug.h>
+#include "gtpV2MsgDataTypes.h"
+
+
+class DownlinkDataNotificationFailureIndicationMsg:public GtpV2Message
+{
+public:
+    DownlinkDataNotificationFailureIndicationMsg();
+    virtual ~DownlinkDataNotificationFailureIndicationMsg();
+    bool encodeDownlinkDataNotificationFailureIndicationMsg(MsgBuffer &buffer, DownlinkDataNotificationFailureIndicationMsgData const &data);
+
+    bool decodeDownlinkDataNotificationFailureIndicationMsg (MsgBuffer &buffer, DownlinkDataNotificationFailureIndicationMsgData& data, Uint16 length);
+
+    void displayDownlinkDataNotificationFailureIndicationMsgData_v(DownlinkDataNotificationFailureIndicationMsgData const &data, Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/msgClasses/downlinkDataNotificationMsg.cpp b/src/gtpV2Codec/msgClasses/downlinkDataNotificationMsg.cpp
new file mode 100644
index 0000000..3c5c0e5
--- /dev/null
+++ b/src/gtpV2Codec/msgClasses/downlinkDataNotificationMsg.cpp
@@ -0,0 +1,748 @@
+/*
+ * 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/msgtemplate.cpp.tt>
+ ******************************************************************************/ 
+
+#include "downlinkDataNotificationMsg.h"
+#include "../ieClasses/manual/gtpV2Ie.h"
+#include "../ieClasses/gtpV2IeFactory.h"
+#include "../ieClasses/causeIe.h"
+#include "../ieClasses/ebiIe.h"
+#include "../ieClasses/arpIe.h"
+#include "../ieClasses/imsiIe.h"
+#include "../ieClasses/fTeidIe.h"
+#include "../ieClasses/indicationIe.h"
+#include "../ieClasses/loadControlInformationIe.h"
+#include "../ieClasses/sgwsNodeLevelLoadControlInformationInDownlinkDataNotification.h"
+#include "../ieClasses/overloadControlInformationIe.h"
+#include "../ieClasses/sgwsOverloadControlInformationInDownlinkDataNotification.h"
+#include "../ieClasses/pagingAndServiceInformationIe.h"
+
+DownlinkDataNotificationMsg::DownlinkDataNotificationMsg()
+{
+    msgType = DownlinkDataNotificationMsgType;
+
+}
+
+DownlinkDataNotificationMsg::~DownlinkDataNotificationMsg()
+{
+
+}
+
+bool DownlinkDataNotificationMsg::encodeDownlinkDataNotificationMsg(MsgBuffer &buffer,
+                        DownlinkDataNotificationMsgData
+							const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+    if (data.causeIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = CauseIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        CauseIe cause=
+        dynamic_cast<
+        CauseIe&>(GtpV2IeFactory::getInstance().getIeObject(CauseIeType));
+        rc = cause.encodeCauseIe(buffer, data.cause);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: cause\n");
+            return false;
+        }
+    }
+
+    if (data.epsBearerIdIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = EbiIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        EbiIe ebi=
+        dynamic_cast<
+        EbiIe&>(GtpV2IeFactory::getInstance().getIeObject(EbiIeType));
+        rc = ebi.encodeEbiIe(buffer, data.epsBearerId);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: epsBearerId\n");
+            return false;
+        }
+    }
+
+    if (data.allocationRetentionPriorityIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = ArpIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        ArpIe arp=
+        dynamic_cast<
+        ArpIe&>(GtpV2IeFactory::getInstance().getIeObject(ArpIeType));
+        rc = arp.encodeArpIe(buffer, data.allocationRetentionPriority);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: allocationRetentionPriority\n");
+            return false;
+        }
+    }
+
+    if (data.imsiIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = ImsiIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        ImsiIe imsi=
+        dynamic_cast<
+        ImsiIe&>(GtpV2IeFactory::getInstance().getIeObject(ImsiIeType));
+        rc = imsi.encodeImsiIe(buffer, data.imsi);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: imsi\n");
+            return false;
+        }
+    }
+
+    if (data.senderFTeidForControlPlaneIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.senderFTeidForControlPlane);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: senderFTeidForControlPlane\n");
+            return false;
+        }
+    }
+
+    if (data.indicationFlagsIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = IndicationIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        IndicationIe indication=
+        dynamic_cast<
+        IndicationIe&>(GtpV2IeFactory::getInstance().getIeObject(IndicationIeType));
+        rc = indication.encodeIndicationIe(buffer, data.indicationFlags);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: indicationFlags\n");
+            return false;
+        }
+    }
+
+    if (data.sgwsNodeLevelLoadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = LoadControlInformationIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        LoadControlInformationIe loadControlInformation=
+        dynamic_cast<
+        LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+        SgwsNodeLevelLoadControlInformationInDownlinkDataNotification groupedIeInstance =
+        dynamic_cast<
+         SgwsNodeLevelLoadControlInformationInDownlinkDataNotification&>(loadControlInformation.getGroupedIe(msgType, 0));
+        rc = groupedIeInstance.encodeSgwsNodeLevelLoadControlInformationInDownlinkDataNotification(buffer, data.sgwsNodeLevelLoadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: sgwsNodeLevelLoadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.sgwsOverloadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = OverloadControlInformationIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+        SgwsOverloadControlInformationInDownlinkDataNotification groupedIeInstance =
+        dynamic_cast<
+         SgwsOverloadControlInformationInDownlinkDataNotification&>(overloadControlInformation.getGroupedIe(msgType, 0));
+        rc = groupedIeInstance.encodeSgwsOverloadControlInformationInDownlinkDataNotification(buffer, data.sgwsOverloadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: sgwsOverloadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.pagingAndServiceInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = PagingAndServiceInformationIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        PagingAndServiceInformationIe pagingAndServiceInformation=
+        dynamic_cast<
+        PagingAndServiceInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(PagingAndServiceInformationIeType));
+        rc = pagingAndServiceInformation.encodePagingAndServiceInformationIe(buffer, data.pagingAndServiceInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: pagingAndServiceInformation\n");
+            return false;
+        }
+    }
+    return rc;
+
+}
+
+bool DownlinkDataNotificationMsg::decodeDownlinkDataNotificationMsg(MsgBuffer &buffer,
+ DownlinkDataNotificationMsgData 
+ &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+  
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+
+        switch (ieHeader.ieType){
+     
+            case CauseIeType:
+            {
+                CauseIe ieObject =
+                dynamic_cast<
+                CauseIe&>(GtpV2IeFactory::getInstance().getIeObject(CauseIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeCauseIe(buffer, data.cause, ieHeader.length);
+
+                    data.causeIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: cause\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case EbiIeType:
+            {
+                EbiIe ieObject =
+                dynamic_cast<
+                EbiIe&>(GtpV2IeFactory::getInstance().getIeObject(EbiIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeEbiIe(buffer, data.epsBearerId, ieHeader.length);
+
+                    data.epsBearerIdIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: epsBearerId\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case ArpIeType:
+            {
+                ArpIe ieObject =
+                dynamic_cast<
+                ArpIe&>(GtpV2IeFactory::getInstance().getIeObject(ArpIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeArpIe(buffer, data.allocationRetentionPriority, ieHeader.length);
+
+                    data.allocationRetentionPriorityIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: allocationRetentionPriority\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case ImsiIeType:
+            {
+                ImsiIe ieObject =
+                dynamic_cast<
+                ImsiIe&>(GtpV2IeFactory::getInstance().getIeObject(ImsiIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeImsiIe(buffer, data.imsi, ieHeader.length);
+
+                    data.imsiIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: imsi\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case FTeidIeType:
+            {
+                FTeidIe ieObject =
+                dynamic_cast<
+                FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeFTeidIe(buffer, data.senderFTeidForControlPlane, ieHeader.length);
+
+                    data.senderFTeidForControlPlaneIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: senderFTeidForControlPlane\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case IndicationIeType:
+            {
+                IndicationIe ieObject =
+                dynamic_cast<
+                IndicationIe&>(GtpV2IeFactory::getInstance().getIeObject(IndicationIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeIndicationIe(buffer, data.indicationFlags, ieHeader.length);
+
+                    data.indicationFlagsIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: indicationFlags\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case LoadControlInformationIeType:
+            {
+                LoadControlInformationIe ieObject =
+                dynamic_cast<
+                LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					SgwsNodeLevelLoadControlInformationInDownlinkDataNotification groupedIeInstance =
+					dynamic_cast<
+					SgwsNodeLevelLoadControlInformationInDownlinkDataNotification&>(ieObject.getGroupedIe(msgType, 0));
+					rc = groupedIeInstance.decodeSgwsNodeLevelLoadControlInformationInDownlinkDataNotification(buffer, data.sgwsNodeLevelLoadControlInformation, ieHeader.length);
+
+                    data.sgwsNodeLevelLoadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: sgwsNodeLevelLoadControlInformation\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case OverloadControlInformationIeType:
+            {
+                OverloadControlInformationIe ieObject =
+                dynamic_cast<
+                OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					SgwsOverloadControlInformationInDownlinkDataNotification groupedIeInstance =
+					dynamic_cast<
+					SgwsOverloadControlInformationInDownlinkDataNotification&>(ieObject.getGroupedIe(msgType, 0));
+					rc = groupedIeInstance.decodeSgwsOverloadControlInformationInDownlinkDataNotification(buffer, data.sgwsOverloadControlInformation, ieHeader.length);
+
+                    data.sgwsOverloadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: sgwsOverloadControlInformation\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case PagingAndServiceInformationIeType:
+            {
+                PagingAndServiceInformationIe ieObject =
+                dynamic_cast<
+                PagingAndServiceInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(PagingAndServiceInformationIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodePagingAndServiceInformationIe(buffer, data.pagingAndServiceInformation, ieHeader.length);
+
+                    data.pagingAndServiceInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: pagingAndServiceInformation\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+
+            default:
+            {
+                // Unknown IE print error
+                errorStream.add((char *)"Unknown IE Type: ");
+                errorStream.add(ieHeader.ieType);
+                errorStream.endOfLine();
+                buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    return rc; // TODO validations
+}
+
+void DownlinkDataNotificationMsg::
+displayDownlinkDataNotificationMsgData_v(DownlinkDataNotificationMsgData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"DownlinkDataNotificationMsg:");
+    stream.endOfLine();
+    stream.incrIndent();
+        
+    
+    if (data.causeIePresent)
+    {
+
+
+        stream.add((char *)"IE - cause:");
+        stream.endOfLine();
+        CauseIe cause=
+        dynamic_cast<
+        CauseIe&>(GtpV2IeFactory::getInstance().getIeObject(CauseIeType));
+        cause.displayCauseIe_v(data.cause, stream);
+
+    }
+    if (data.epsBearerIdIePresent)
+    {
+
+
+        stream.add((char *)"IE - epsBearerId:");
+        stream.endOfLine();
+        EbiIe ebi=
+        dynamic_cast<
+        EbiIe&>(GtpV2IeFactory::getInstance().getIeObject(EbiIeType));
+        ebi.displayEbiIe_v(data.epsBearerId, stream);
+
+    }
+    if (data.allocationRetentionPriorityIePresent)
+    {
+
+
+        stream.add((char *)"IE - allocationRetentionPriority:");
+        stream.endOfLine();
+        ArpIe arp=
+        dynamic_cast<
+        ArpIe&>(GtpV2IeFactory::getInstance().getIeObject(ArpIeType));
+        arp.displayArpIe_v(data.allocationRetentionPriority, stream);
+
+    }
+    if (data.imsiIePresent)
+    {
+
+
+        stream.add((char *)"IE - imsi:");
+        stream.endOfLine();
+        ImsiIe imsi=
+        dynamic_cast<
+        ImsiIe&>(GtpV2IeFactory::getInstance().getIeObject(ImsiIeType));
+        imsi.displayImsiIe_v(data.imsi, stream);
+
+    }
+    if (data.senderFTeidForControlPlaneIePresent)
+    {
+
+
+        stream.add((char *)"IE - senderFTeidForControlPlane:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.senderFTeidForControlPlane, stream);
+
+    }
+    if (data.indicationFlagsIePresent)
+    {
+
+
+        stream.add((char *)"IE - indicationFlags:");
+        stream.endOfLine();
+        IndicationIe indication=
+        dynamic_cast<
+        IndicationIe&>(GtpV2IeFactory::getInstance().getIeObject(IndicationIeType));
+        indication.displayIndicationIe_v(data.indicationFlags, stream);
+
+    }
+    if (data.sgwsNodeLevelLoadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - sgwsNodeLevelLoadControlInformation:");
+        stream.endOfLine();
+        LoadControlInformationIe loadControlInformation=
+        dynamic_cast<
+        LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+            SgwsNodeLevelLoadControlInformationInDownlinkDataNotification groupedIeInstance =
+        dynamic_cast<
+        SgwsNodeLevelLoadControlInformationInDownlinkDataNotification&>(loadControlInformation.getGroupedIe(msgType, 0));
+        groupedIeInstance.displaySgwsNodeLevelLoadControlInformationInDownlinkDataNotificationData_v(data.sgwsNodeLevelLoadControlInformation, stream);
+
+    }
+    if (data.sgwsOverloadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - sgwsOverloadControlInformation:");
+        stream.endOfLine();
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+            SgwsOverloadControlInformationInDownlinkDataNotification groupedIeInstance =
+        dynamic_cast<
+        SgwsOverloadControlInformationInDownlinkDataNotification&>(overloadControlInformation.getGroupedIe(msgType, 0));
+        groupedIeInstance.displaySgwsOverloadControlInformationInDownlinkDataNotificationData_v(data.sgwsOverloadControlInformation, stream);
+
+    }
+    if (data.pagingAndServiceInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - pagingAndServiceInformation:");
+        stream.endOfLine();
+        PagingAndServiceInformationIe pagingAndServiceInformation=
+        dynamic_cast<
+        PagingAndServiceInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(PagingAndServiceInformationIeType));
+        pagingAndServiceInformation.displayPagingAndServiceInformationIe_v(data.pagingAndServiceInformation, stream);
+
+    }
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
diff --git a/src/gtpV2Codec/msgClasses/downlinkDataNotificationMsg.h b/src/gtpV2Codec/msgClasses/downlinkDataNotificationMsg.h
new file mode 100644
index 0000000..d49f58e
--- /dev/null
+++ b/src/gtpV2Codec/msgClasses/downlinkDataNotificationMsg.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/msgtemplate.h.tt>
+ ******************************************************************************/
+#ifndef DOWNLINKDATANOTIFICATIONMSG_H_
+#define DOWNLINKDATANOTIFICATIONMSG_H_
+
+#include <set>
+#include "manual/gtpV2Message.h"
+#include <msgBuffer.h>
+#include <debug.h>
+#include "gtpV2MsgDataTypes.h"
+
+
+class DownlinkDataNotificationMsg:public GtpV2Message
+{
+public:
+    DownlinkDataNotificationMsg();
+    virtual ~DownlinkDataNotificationMsg();
+    bool encodeDownlinkDataNotificationMsg(MsgBuffer &buffer, DownlinkDataNotificationMsgData const &data);
+
+    bool decodeDownlinkDataNotificationMsg (MsgBuffer &buffer, DownlinkDataNotificationMsgData& data, Uint16 length);
+
+    void displayDownlinkDataNotificationMsgData_v(DownlinkDataNotificationMsgData const &data, Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/msgClasses/gtpV2MsgDataTypes.h b/src/gtpV2Codec/msgClasses/gtpV2MsgDataTypes.h
new file mode 100644
index 0000000..b54d19a
--- /dev/null
+++ b/src/gtpV2Codec/msgClasses/gtpV2MsgDataTypes.h
@@ -0,0 +1,730 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+ /******************************************************************************
+ *
+ * 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/msgDataTypetemplate.h.tt>
+ ******************************************************************************/
+#ifndef GTPV2MSGDATATYPES_H_
+#define GTPV2MSGDATATYPES_H_
+
+#include "../../gtpV2Codec/ieClasses/gtpV2GrpIeDataTypes.h"
+#include "../../gtpV2Codec/ieClasses/gtpV2IeDataTypes.h"
+
+typedef struct
+{
+    Uint8 msgType;
+    Uint16 msgLength;
+    bool teidPresent;
+    Uint32 teid;
+    Uint32 sequenceNumber;
+}GtpV2MessageHeader;
+
+typedef struct
+{
+    bool imsiIePresent;   
+    bool msisdnIePresent;   
+    bool meIdentityIePresent;   
+    bool userLocationInformationIePresent;   
+    bool servingNetworkIePresent;   
+    bool indicationFlagsIePresent;   
+    bool pgwS5S8AddressForControlPlaneOrPmipIePresent;   
+    bool selectionModeIePresent;   
+    bool pdnTypeIePresent;   
+    bool pdnAddressAllocationIePresent;   
+    bool maximumApnRestrictionIePresent;   
+    bool aggregateMaximumBitRateIePresent;   
+    bool linkedEpsBearerIdIePresent;   
+    bool trustedWlanModeIndicationIePresent;   
+    bool protocolConfigurationOptionsIePresent;   
+    bool traceInformationIePresent;   
+    bool recoveryIePresent;   
+    bool mmeFqCsidIePresent;   
+    bool sgwFqCsidIePresent;   
+    bool epdgFqCsidIePresent;   
+    bool twanFqCsidIePresent;   
+    bool ueTimeZoneIePresent;   
+    bool userCsgInformationIePresent;   
+    bool chargingCharacteristicsIePresent;   
+    bool mmeS4SgsnLdnIePresent;   
+    bool sgwLdnIePresent;   
+    bool epdgLdnIePresent;   
+    bool twanLdnIePresent;   
+    bool signallingPriorityIndicationIePresent;   
+    bool ueLocalIpAddressIePresent;   
+    bool ueUdpPortIePresent;   
+    bool additionalProtocolConfigurationOptionsIePresent;   
+    bool hNbLocalIpAddressIePresent;   
+    bool hNbUdpPortIePresent;   
+    bool mmeS4SgsnIdentifierIePresent;   
+    bool twanIdentifierIePresent;   
+    bool epdgIpAddressIePresent;   
+    bool cnOperatorSelectionEntityIePresent;   
+    bool mmeS4SgsnsOverloadControlInformationIePresent;   
+    bool sgwsOverloadControlInformationIePresent;   
+    bool twanEpdgsOverloadControlInformationIePresent;   
+    bool originationTimeStampIePresent;   
+    bool maximumWaitTimeIePresent;   
+    bool wlanLocationInformationIePresent;   
+    bool wlanLocationTimestampIePresent;   
+    bool nbifomContainerIePresent;   
+    bool remoteUeContextConnectedIePresent;   
+    bool a3gppAaaServerIdentifierIePresent;   
+    bool extendedProtocolConfigurationOptionsIePresent;   
+    bool servingPlmnRateControlIePresent;   
+    bool moExceptionDataCounterIePresent;   
+    bool ueTcpPortIePresent;   
+    bool mappedUeUsageTypeIePresent;   
+    bool userLocationInformationForSgwIePresent;   
+    bool sgwUNodeNameIePresent;   
+    bool secondaryRatUsageDataReportIePresent;   
+    bool upFunctionSelectionIndicationFlagsIePresent;   
+
+
+    ImsiIeData imsi;
+    MsisdnIeData msisdn;
+    MeiIeData meIdentity;
+    UliIeData userLocationInformation;
+    ServingNetworkIeData servingNetwork;
+    RatTypeIeData ratType;
+    IndicationIeData indicationFlags;
+    FTeidIeData senderFTeidForControlPlane;
+    FTeidIeData pgwS5S8AddressForControlPlaneOrPmip;
+    ApnIeData accessPointName;
+    SelectionModeIeData selectionMode;
+    PdnTypeIeData pdnType;
+    PaaIeData pdnAddressAllocation;
+    ApnRestrictionIeData maximumApnRestriction;
+    AmbrIeData aggregateMaximumBitRate;
+    EbiIeData linkedEpsBearerId;
+    TwmiIeData trustedWlanModeIndication;
+    PcoIeData protocolConfigurationOptions;
+
+    Uint16 bearerContextsToBeCreatedCount;
+    BearerContextsToBeCreatedInCreateSessionRequestData bearerContextsToBeCreated[11];
+
+    Uint16 bearerContextsToBeRemovedCount;
+    BearerContextsToBeRemovedInCreateSessionRequestData bearerContextsToBeRemoved[11];
+    TraceInformationIeData traceInformation;
+    RecoveryIeData recovery;
+    FqCsidIeData mmeFqCsid;
+    FqCsidIeData sgwFqCsid;
+    FqCsidIeData epdgFqCsid;
+    FqCsidIeData twanFqCsid;
+    UeTimeZoneIeData ueTimeZone;
+    UciIeData userCsgInformation;
+    ChargingCharacteristicsIeData chargingCharacteristics;
+    LocalDistinguishedNameIeData mmeS4SgsnLdn;
+    LocalDistinguishedNameIeData sgwLdn;
+    LocalDistinguishedNameIeData epdgLdn;
+    LocalDistinguishedNameIeData twanLdn;
+    SignallingPriorityIndicationIeData signallingPriorityIndication;
+    IpAddressIeData ueLocalIpAddress;
+    PortNumberIeData ueUdpPort;
+    AdditionalProtocolConfigurationOptionsIeData additionalProtocolConfigurationOptions;
+    IpAddressIeData hNbLocalIpAddress;
+    PortNumberIeData hNbUdpPort;
+    IpAddressIeData mmeS4SgsnIdentifier;
+    TwanIdentifierIeData twanIdentifier;
+    IpAddressIeData epdgIpAddress;
+    CnOperatorSelectionEntityIeData cnOperatorSelectionEntity;
+    MmeS4SgsnsOverloadControlInformationInCreateSessionRequestData mmeS4SgsnsOverloadControlInformation;
+    SgwsOverloadControlInformationInCreateSessionRequestData sgwsOverloadControlInformation;
+    TwanEpdgsOverloadControlInformationInCreateSessionRequestData twanEpdgsOverloadControlInformation;
+    MillisecondTimeStampIeData originationTimeStamp;
+    IntegerNumberIeData maximumWaitTime;
+    TwanIdentifierIeData wlanLocationInformation;
+    TwanIdentifierTimestampIeData wlanLocationTimestamp;
+    FContainerIeData nbifomContainer;
+    RemoteUeContextConnectedInCreateSessionRequestData remoteUeContextConnected;
+    NodeIdentifierIeData a3gppAaaServerIdentifier;
+    EpcoIeData extendedProtocolConfigurationOptions;
+    ServingPlmnRateControlIeData servingPlmnRateControl;
+    CounterIeData moExceptionDataCounter;
+    PortNumberIeData ueTcpPort;
+    MappedUeUsageTypeIeData mappedUeUsageType;
+    UliIeData userLocationInformationForSgw;
+    FqdnIeData sgwUNodeName;
+    SecondaryRatUsageDataReportIeData secondaryRatUsageDataReport;
+    UpFunctionSelectionIndicationFlagsIeData upFunctionSelectionIndicationFlags;
+}CreateSessionRequestMsgData;
+
+typedef struct
+{
+    bool changeReportingActionIePresent;   
+    bool csgInformationReportingActionIePresent;   
+    bool senderFTeidForControlPlaneIePresent;   
+    bool apnRestrictionIePresent;   
+    bool aggregateMaximumBitRateIePresent;   
+    bool linkedEpsBearerIdIePresent;   
+    bool recoveryIePresent;   
+    bool chargingGatewayNameIePresent;   
+    bool chargingGatewayAddressIePresent;   
+    bool pgwFqCsidIePresent;   
+    bool sgwFqCsidIePresent;   
+    bool sgwLdnIePresent;   
+    bool pgwLdnIePresent;   
+    bool pgwBackOffTimeIePresent;   
+    bool hNbInformationReportingIePresent;   
+    bool pgwS5S8S2bFTeidIePresent;   
+    bool pdnAddressAllocationIePresent;   
+    bool protocolConfigurationOptionsIePresent;   
+    bool additionalProtocolConfigurationOptionsIePresent;   
+    bool trustedWlanIpv4ParametersIePresent;   
+    bool indicationFlagsIePresent;   
+    bool presenceReportingAreaActionIePresent;   
+    bool pgwsNodeLevelLoadControlInformationIePresent;   
+    bool pgwsApnLevelLoadControlInformationIePresent;   
+    bool sgwsNodeLevelLoadControlInformationIePresent;   
+    bool pgwsOverloadControlInformationIePresent;   
+    bool sgwsOverloadControlInformationIePresent;   
+    bool nbifomContainerIePresent;   
+    bool pdnConnectionChargingIdIePresent;   
+    bool extendedProtocolConfigurationOptionsIePresent;   
+
+
+    CauseIeData cause;
+    ChangeReportingActionIeData changeReportingAction;
+    CsgInformationReportingActionIeData csgInformationReportingAction;
+    FTeidIeData senderFTeidForControlPlane;
+    ApnRestrictionIeData apnRestriction;
+    AmbrIeData aggregateMaximumBitRate;
+    EbiIeData linkedEpsBearerId;
+
+    Uint16 bearerContextsCreatedCount;
+    BearerContextsCreatedInCreateSessionResponseData bearerContextsCreated[11];
+
+    Uint16 bearerContextsMarkedForRemovalCount;
+    BearerContextsMarkedForRemovalInCreateSessionResponseData bearerContextsMarkedForRemoval[11];
+    RecoveryIeData recovery;
+    FqdnIeData chargingGatewayName;
+    IpAddressIeData chargingGatewayAddress;
+    FqCsidIeData pgwFqCsid;
+    FqCsidIeData sgwFqCsid;
+    LocalDistinguishedNameIeData sgwLdn;
+    LocalDistinguishedNameIeData pgwLdn;
+    EpcTimerIeData pgwBackOffTime;
+    HenbInformationReportingIeData hNbInformationReporting;
+    FTeidIeData pgwS5S8S2bFTeid;
+    PaaIeData pdnAddressAllocation;
+    PcoIeData protocolConfigurationOptions;
+    AdditionalProtocolConfigurationOptionsIeData additionalProtocolConfigurationOptions;
+    Ip4cpIeData trustedWlanIpv4Parameters;
+    IndicationIeData indicationFlags;
+    PresenceReportingAreaActionIeData presenceReportingAreaAction;
+    PgwsNodeLevelLoadControlInformationInCreateSessionResponseData pgwsNodeLevelLoadControlInformation;
+    PgwsApnLevelLoadControlInformationInCreateSessionResponseData pgwsApnLevelLoadControlInformation;
+    SgwsNodeLevelLoadControlInformationInCreateSessionResponseData sgwsNodeLevelLoadControlInformation;
+    PgwsOverloadControlInformationInCreateSessionResponseData pgwsOverloadControlInformation;
+    SgwsOverloadControlInformationInCreateSessionResponseData sgwsOverloadControlInformation;
+    FContainerIeData nbifomContainer;
+    ChargingIdIeData pdnConnectionChargingId;
+    EpcoIeData extendedProtocolConfigurationOptions;
+}CreateSessionResponseMsgData;
+
+typedef struct
+{
+    bool meIdentityIePresent;   
+    bool userLocationInformationIePresent;   
+    bool servingNetworkIePresent;   
+    bool ratTypeIePresent;   
+    bool indicationFlagsIePresent;   
+    bool senderFTeidForControlPlaneIePresent;   
+    bool aggregateMaximumBitRateIePresent;   
+    bool delayDownlinkPacketNotificationRequestIePresent;   
+    bool recoveryIePresent;   
+    bool ueTimeZoneIePresent;   
+    bool mmeFqCsidIePresent;   
+    bool sgwFqCsidIePresent;   
+    bool userCsgInformationIePresent;   
+    bool ueLocalIpAddressIePresent;   
+    bool ueUdpPortIePresent;   
+    bool mmeS4SgsnLdnIePresent;   
+    bool sgwLdnIePresent;   
+    bool hNbLocalIpAddressIePresent;   
+    bool hNbUdpPortIePresent;   
+    bool mmeS4SgsnIdentifierIePresent;   
+    bool cnOperatorSelectionEntityIePresent;   
+    bool mmeS4SgsnsOverloadControlInformationIePresent;   
+    bool sgwsOverloadControlInformationIePresent;   
+    bool epdgsOverloadControlInformationIePresent;   
+    bool servingPlmnRateControlIePresent;   
+    bool moExceptionDataCounterIePresent;   
+    bool imsiIePresent;   
+    bool userLocationInformationForSgwIePresent;   
+    bool wlanLocationInformationIePresent;   
+    bool wlanLocationTimestampIePresent;   
+    bool secondaryRatUsageDataReportIePresent;   
+
+
+    MeiIeData meIdentity;
+    UliIeData userLocationInformation;
+    ServingNetworkIeData servingNetwork;
+    RatTypeIeData ratType;
+    IndicationIeData indicationFlags;
+    FTeidIeData senderFTeidForControlPlane;
+    AmbrIeData aggregateMaximumBitRate;
+    DelayValueIeData delayDownlinkPacketNotificationRequest;
+
+    Uint16 bearerContextsToBeModifiedCount;
+    BearerContextsToBeModifiedInModifyBearerRequestData bearerContextsToBeModified[11];
+
+    Uint16 bearerContextsToBeRemovedCount;
+    BearerContextsToBeRemovedInModifyBearerRequestData bearerContextsToBeRemoved[11];
+    RecoveryIeData recovery;
+    UeTimeZoneIeData ueTimeZone;
+    FqCsidIeData mmeFqCsid;
+    FqCsidIeData sgwFqCsid;
+    UciIeData userCsgInformation;
+    IpAddressIeData ueLocalIpAddress;
+    PortNumberIeData ueUdpPort;
+    LocalDistinguishedNameIeData mmeS4SgsnLdn;
+    LocalDistinguishedNameIeData sgwLdn;
+    IpAddressIeData hNbLocalIpAddress;
+    PortNumberIeData hNbUdpPort;
+    IpAddressIeData mmeS4SgsnIdentifier;
+    CnOperatorSelectionEntityIeData cnOperatorSelectionEntity;
+    MmeS4SgsnsOverloadControlInformationInModifyBearerRequestData mmeS4SgsnsOverloadControlInformation;
+    SgwsOverloadControlInformationInModifyBearerRequestData sgwsOverloadControlInformation;
+    EpdgsOverloadControlInformationInModifyBearerRequestData epdgsOverloadControlInformation;
+    ServingPlmnRateControlIeData servingPlmnRateControl;
+    CounterIeData moExceptionDataCounter;
+    ImsiIeData imsi;
+    UliIeData userLocationInformationForSgw;
+    TwanIdentifierIeData wlanLocationInformation;
+    TwanIdentifierTimestampIeData wlanLocationTimestamp;
+    SecondaryRatUsageDataReportIeData secondaryRatUsageDataReport;
+}ModifyBearerRequestMsgData;
+
+typedef struct
+{
+    bool linkedEpsBearerIdIePresent;   
+    bool indicationFlagsIePresent;   
+    bool apnRestrictionIePresent;   
+    bool protocolConfigurationOptionsIePresent;   
+    bool changeReportingActionIePresent;   
+    bool csgInformationReportingActionIePresent;   
+    bool hNbInformationReportingIePresent;   
+    bool chargingGatewayNameIePresent;   
+    bool chargingGatewayAddressIePresent;   
+    bool pgwFqCsidIePresent;   
+    bool sgwFqCsidIePresent;   
+    bool recoveryIePresent;   
+    bool sgwLdnIePresent;   
+    bool pgwLdnIePresent;   
+    bool presenceReportingAreaActionIePresent;   
+    bool pgwsNodeLevelLoadControlInformationIePresent;   
+    bool pgwsApnLevelLoadControlInformationIePresent;   
+    bool sgwsNodeLevelLoadControlInformationIePresent;   
+    bool pgwsOverloadControlInformationIePresent;   
+    bool sgwsOverloadControlInformationIePresent;   
+    bool pdnConnectionChargingIdIePresent;   
+    bool msisdnIePresent;   
+
+
+    EbiIeData linkedEpsBearerId;
+
+    Uint16 bearerContextsModifiedCount;
+    BearerContextsModifiedInModifyBearerResponseData bearerContextsModified[11];
+
+    Uint16 bearerContextsMarkedForRemovalCount;
+    BearerContextsMarkedForRemovalInModifyBearerResponseData bearerContextsMarkedForRemoval[11];
+    IndicationIeData indicationFlags;
+    CauseIeData cause;
+    ApnRestrictionIeData apnRestriction;
+    PcoIeData protocolConfigurationOptions;
+    ChangeReportingActionIeData changeReportingAction;
+    CsgInformationReportingActionIeData csgInformationReportingAction;
+    HenbInformationReportingIeData hNbInformationReporting;
+    FqdnIeData chargingGatewayName;
+    IpAddressIeData chargingGatewayAddress;
+    FqCsidIeData pgwFqCsid;
+    FqCsidIeData sgwFqCsid;
+    RecoveryIeData recovery;
+    LocalDistinguishedNameIeData sgwLdn;
+    LocalDistinguishedNameIeData pgwLdn;
+    PresenceReportingAreaActionIeData presenceReportingAreaAction;
+    PgwsNodeLevelLoadControlInformationInModifyBearerResponseData pgwsNodeLevelLoadControlInformation;
+    PgwsApnLevelLoadControlInformationInModifyBearerResponseData pgwsApnLevelLoadControlInformation;
+    SgwsNodeLevelLoadControlInformationInModifyBearerResponseData sgwsNodeLevelLoadControlInformation;
+    PgwsOverloadControlInformationInModifyBearerResponseData pgwsOverloadControlInformation;
+    SgwsOverloadControlInformationInModifyBearerResponseData sgwsOverloadControlInformation;
+    ChargingIdIeData pdnConnectionChargingId;
+    MsisdnIeData msisdn;
+}ModifyBearerResponseMsgData;
+
+typedef struct
+{
+    bool linkedEpsBearerIdIePresent;   
+    bool indicationFlagsIePresent;   
+    bool causeIePresent;   
+    bool senderFTeidForControlPlaneIePresent;   
+    bool userLocationInformationIePresent;   
+    bool protocolConfigurationOptionsIePresent;   
+    bool originatingNodeIePresent;   
+    bool ueTimeZoneIePresent;   
+    bool uliTimestampIePresent;   
+    bool ranNasReleaseCauseIePresent;   
+    bool twanIdentifierIePresent;   
+    bool twanIdentifierTimestampIePresent;   
+    bool mmeS4SgsnsOverloadControlInformationIePresent;   
+    bool sgwsOverloadControlInformationIePresent;   
+    bool twanEpdgsOverloadControlInformationIePresent;   
+    bool wlanLocationInformationIePresent;   
+    bool wlanLocationTimestampIePresent;   
+    bool ueLocalIpAddressIePresent;   
+    bool ueUdpPortIePresent;   
+    bool extendedProtocolConfigurationOptionsIePresent;   
+    bool ueTcpPortIePresent;   
+    bool secondaryRatUsageDataReportIePresent;   
+
+
+    EbiIeData linkedEpsBearerId;
+    IndicationIeData indicationFlags;
+    CauseIeData cause;
+    FTeidIeData senderFTeidForControlPlane;
+    UliIeData userLocationInformation;
+    PcoIeData protocolConfigurationOptions;
+    NodeTypeIeData originatingNode;
+    UeTimeZoneIeData ueTimeZone;
+    UliTimestampIeData uliTimestamp;
+    RanNasCauseIeData ranNasReleaseCause;
+    TwanIdentifierIeData twanIdentifier;
+    TwanIdentifierTimestampIeData twanIdentifierTimestamp;
+    MmeS4SgsnsOverloadControlInformationInDeleteSessionRequestData mmeS4SgsnsOverloadControlInformation;
+    SgwsOverloadControlInformationInDeleteSessionRequestData sgwsOverloadControlInformation;
+    TwanEpdgsOverloadControlInformationInDeleteSessionRequestData twanEpdgsOverloadControlInformation;
+    TwanIdentifierIeData wlanLocationInformation;
+    TwanIdentifierTimestampIeData wlanLocationTimestamp;
+    IpAddressIeData ueLocalIpAddress;
+    PortNumberIeData ueUdpPort;
+    EpcoIeData extendedProtocolConfigurationOptions;
+    PortNumberIeData ueTcpPort;
+    SecondaryRatUsageDataReportIeData secondaryRatUsageDataReport;
+}DeleteSessionRequestMsgData;
+
+typedef struct
+{
+    bool recoveryIePresent;   
+    bool protocolConfigurationOptionsIePresent;   
+    bool indicationFlagsIePresent;   
+    bool pgwsNodeLevelLoadControlInformationIePresent;   
+    bool pgwsApnLevelLoadControlInformationIePresent;   
+    bool sgwsNodeLevelLoadControlInformationIePresent;   
+    bool pgwsOverloadControlInformationIePresent;   
+    bool sgwsOverloadControlInformationIePresent;   
+    bool extendedProtocolConfigurationOptionsIePresent;   
+
+
+    CauseIeData cause;
+    RecoveryIeData recovery;
+    PcoIeData protocolConfigurationOptions;
+    IndicationIeData indicationFlags;
+    PgwsNodeLevelLoadControlInformationInDeleteSessionResponseData pgwsNodeLevelLoadControlInformation;
+    PgwsApnLevelLoadControlInformationInDeleteSessionResponseData pgwsApnLevelLoadControlInformation;
+    SgwsNodeLevelLoadControlInformationInDeleteSessionResponseData sgwsNodeLevelLoadControlInformation;
+    PgwsOverloadControlInformationInDeleteSessionResponseData pgwsOverloadControlInformation;
+    SgwsOverloadControlInformationInDeleteSessionResponseData sgwsOverloadControlInformation;
+    EpcoIeData extendedProtocolConfigurationOptions;
+}DeleteSessionResponseMsgData;
+
+typedef struct
+{
+    bool listOfRabsIePresent;   
+    bool originatingNodeIePresent;   
+    bool indicationFlagsIePresent;   
+    bool secondaryRatUsageDataReportIePresent;   
+
+
+    EbiIeData listOfRabs;
+    NodeTypeIeData originatingNode;
+    IndicationIeData indicationFlags;
+    SecondaryRatUsageDataReportIeData secondaryRatUsageDataReport;
+}ReleaseAccessBearersRequestMsgData;
+
+typedef struct
+{
+    bool recoveryIePresent;   
+    bool indicationFlagsIePresent;   
+    bool sgwsNodeLevelLoadControlInformationIePresent;   
+    bool sgwsOverloadControlInformationIePresent;   
+
+
+    CauseIeData cause;
+    RecoveryIeData recovery;
+    IndicationIeData indicationFlags;
+    SgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponseData sgwsNodeLevelLoadControlInformation;
+    SgwsOverloadControlInformationInReleaseAccessBearersResponseData sgwsOverloadControlInformation;
+}ReleaseAccessBearersResponseMsgData;
+
+typedef struct
+{
+    bool procedureTransactionIdIePresent;   
+    bool protocolConfigurationOptionsIePresent;   
+    bool pgwFqCsidIePresent;   
+    bool sgwFqCsidIePresent;   
+    bool changeReportingActionIePresent;   
+    bool csgInformationReportingActionIePresent;   
+    bool hNbInformationReportingIePresent;   
+    bool presenceReportingAreaActionIePresent;   
+    bool indicationFlagsIePresent;   
+    bool pgwsNodeLevelLoadControlInformationIePresent;   
+    bool pgwsApnLevelLoadControlInformationIePresent;   
+    bool sgwsNodeLevelLoadControlInformationIePresent;   
+    bool pgwsOverloadControlInformationIePresent;   
+    bool sgwsOverloadControlInformationIePresent;   
+    bool nbifomContainerIePresent;   
+
+
+    PtiIeData procedureTransactionId;
+    EbiIeData linkedEpsBearerId;
+    PcoIeData protocolConfigurationOptions;
+
+    Uint16 bearerContextsCount;
+    BearerContextsInCreateBearerRequestData bearerContexts[11];
+    FqCsidIeData pgwFqCsid;
+    FqCsidIeData sgwFqCsid;
+    ChangeReportingActionIeData changeReportingAction;
+    CsgInformationReportingActionIeData csgInformationReportingAction;
+    HenbInformationReportingIeData hNbInformationReporting;
+    PresenceReportingAreaActionIeData presenceReportingAreaAction;
+    IndicationIeData indicationFlags;
+    PgwsNodeLevelLoadControlInformationInCreateBearerRequestData pgwsNodeLevelLoadControlInformation;
+    PgwsApnLevelLoadControlInformationInCreateBearerRequestData pgwsApnLevelLoadControlInformation;
+    SgwsNodeLevelLoadControlInformationInCreateBearerRequestData sgwsNodeLevelLoadControlInformation;
+    PgwsOverloadControlInformationInCreateBearerRequestData pgwsOverloadControlInformation;
+    SgwsOverloadControlInformationInCreateBearerRequestData sgwsOverloadControlInformation;
+    FContainerIeData nbifomContainer;
+}CreateBearerRequestMsgData;
+
+typedef struct
+{
+    bool recoveryIePresent;   
+    bool mmeFqCsidIePresent;   
+    bool sgwFqCsidIePresent;   
+    bool epdgFqCsidIePresent;   
+    bool twanFqCsidIePresent;   
+    bool protocolConfigurationOptionsIePresent;   
+    bool ueTimeZoneIePresent;   
+    bool userLocationInformationIePresent;   
+    bool twanIdentifierIePresent;   
+    bool mmeS4SgsnsOverloadControlInformationIePresent;   
+    bool sgwsOverloadControlInformationIePresent;   
+    bool mmeS4SgsnIdentifierIePresent;   
+    bool twanEpdgsOverloadControlInformationIePresent;   
+    bool wlanLocationInformationIePresent;   
+    bool wlanLocationTimestampIePresent;   
+    bool ueLocalIpAddressIePresent;   
+    bool ueUdpPortIePresent;   
+    bool nbifomContainerIePresent;   
+    bool ueTcpPortIePresent;   
+
+
+    CauseIeData cause;
+
+    Uint16 bearerContextsCount;
+    BearerContextsInCreateBearerResponseData bearerContexts[11];
+    RecoveryIeData recovery;
+    FqCsidIeData mmeFqCsid;
+    FqCsidIeData sgwFqCsid;
+    FqCsidIeData epdgFqCsid;
+    FqCsidIeData twanFqCsid;
+    PcoIeData protocolConfigurationOptions;
+    UeTimeZoneIeData ueTimeZone;
+    UliIeData userLocationInformation;
+    TwanIdentifierIeData twanIdentifier;
+    MmeS4SgsnsOverloadControlInformationInCreateBearerResponseData mmeS4SgsnsOverloadControlInformation;
+    SgwsOverloadControlInformationInCreateBearerResponseData sgwsOverloadControlInformation;
+    IpAddressIeData mmeS4SgsnIdentifier;
+    TwanEpdgsOverloadControlInformationInCreateBearerResponseData twanEpdgsOverloadControlInformation;
+    TwanIdentifierIeData wlanLocationInformation;
+    TwanIdentifierTimestampIeData wlanLocationTimestamp;
+    IpAddressIeData ueLocalIpAddress;
+    PortNumberIeData ueUdpPort;
+    FContainerIeData nbifomContainer;
+    PortNumberIeData ueTcpPort;
+}CreateBearerResponseMsgData;
+
+typedef struct
+{
+    bool linkedEpsBearerIdIePresent;   
+    bool epsBearerIdsIePresent;   
+    bool procedureTransactionIdIePresent;   
+    bool protocolConfigurationOptionsIePresent;   
+    bool pgwFqCsidIePresent;   
+    bool sgwFqCsidIePresent;   
+    bool causeIePresent;   
+    bool indicationFlagsIePresent;   
+    bool pgwsNodeLevelLoadControlInformationIePresent;   
+    bool pgwsApnLevelLoadControlInformationIePresent;   
+    bool sgwsNodeLevelLoadControlInformationIePresent;   
+    bool pgwsOverloadControlInformationIePresent;   
+    bool sgwsOverloadControlInformationIePresent;   
+    bool nbifomContainerIePresent;   
+    bool extendedProtocolConfigurationOptionsIePresent;   
+
+
+    EbiIeData linkedEpsBearerId;
+    EbiIeData epsBearerIds;
+
+    Uint16 failedBearerContextsCount;
+    FailedBearerContextsInDeleteBearerRequestData failedBearerContexts[11];
+    PtiIeData procedureTransactionId;
+    PcoIeData protocolConfigurationOptions;
+    FqCsidIeData pgwFqCsid;
+    FqCsidIeData sgwFqCsid;
+    CauseIeData cause;
+    IndicationIeData indicationFlags;
+    PgwsNodeLevelLoadControlInformationInDeleteBearerRequestData pgwsNodeLevelLoadControlInformation;
+    PgwsApnLevelLoadControlInformationInDeleteBearerRequestData pgwsApnLevelLoadControlInformation;
+    SgwsNodeLevelLoadControlInformationInDeleteBearerRequestData sgwsNodeLevelLoadControlInformation;
+    PgwsOverloadControlInformationInDeleteBearerRequestData pgwsOverloadControlInformation;
+    SgwsOverloadControlInformationInDeleteBearerRequestData sgwsOverloadControlInformation;
+    FContainerIeData nbifomContainer;
+    EpcoIeData extendedProtocolConfigurationOptions;
+}DeleteBearerRequestMsgData;
+
+typedef struct
+{
+    bool linkedEpsBearerIdIePresent;   
+    bool recoveryIePresent;   
+    bool mmeFqCsidIePresent;   
+    bool sgwFqCsidIePresent;   
+    bool epdgFqCsidIePresent;   
+    bool twanFqCsidIePresent;   
+    bool protocolConfigurationOptionsIePresent;   
+    bool ueTimeZoneIePresent;   
+    bool userLocationInformationIePresent;   
+    bool uliTimestampIePresent;   
+    bool twanIdentifierIePresent;   
+    bool twanIdentifierTimestampIePresent;   
+    bool mmeS4SgsnsOverloadControlInformationIePresent;   
+    bool sgwsOverloadControlInformationIePresent;   
+    bool mmeS4SgsnIdentifierIePresent;   
+    bool twanEpdgsOverloadControlInformationIePresent;   
+    bool wlanLocationInformationIePresent;   
+    bool wlanLocationTimestampIePresent;   
+    bool ueLocalIpAddressIePresent;   
+    bool ueUdpPortIePresent;   
+    bool nbifomContainerIePresent;   
+    bool ueTcpPortIePresent;   
+    bool secondaryRatUsageDataReportIePresent;   
+
+
+    CauseIeData cause;
+    EbiIeData linkedEpsBearerId;
+
+    Uint16 bearerContextsCount;
+    BearerContextsInDeleteBearerResponseData bearerContexts[11];
+    RecoveryIeData recovery;
+    FqCsidIeData mmeFqCsid;
+    FqCsidIeData sgwFqCsid;
+    FqCsidIeData epdgFqCsid;
+    FqCsidIeData twanFqCsid;
+    PcoIeData protocolConfigurationOptions;
+    UeTimeZoneIeData ueTimeZone;
+    UliIeData userLocationInformation;
+    UliTimestampIeData uliTimestamp;
+    TwanIdentifierIeData twanIdentifier;
+    TwanIdentifierTimestampIeData twanIdentifierTimestamp;
+    MmeS4SgsnsOverloadControlInformationInDeleteBearerResponseData mmeS4SgsnsOverloadControlInformation;
+    SgwsOverloadControlInformationInDeleteBearerResponseData sgwsOverloadControlInformation;
+    IpAddressIeData mmeS4SgsnIdentifier;
+    TwanEpdgsOverloadControlInformationInDeleteBearerResponseData twanEpdgsOverloadControlInformation;
+    TwanIdentifierIeData wlanLocationInformation;
+    TwanIdentifierTimestampIeData wlanLocationTimestamp;
+    IpAddressIeData ueLocalIpAddress;
+    PortNumberIeData ueUdpPort;
+    FContainerIeData nbifomContainer;
+    PortNumberIeData ueTcpPort;
+    SecondaryRatUsageDataReportIeData secondaryRatUsageDataReport;
+}DeleteBearerResponseMsgData;
+
+typedef struct
+{
+    bool causeIePresent;   
+    bool epsBearerIdIePresent;   
+    bool allocationRetentionPriorityIePresent;   
+    bool imsiIePresent;   
+    bool senderFTeidForControlPlaneIePresent;   
+    bool indicationFlagsIePresent;   
+    bool sgwsNodeLevelLoadControlInformationIePresent;   
+    bool sgwsOverloadControlInformationIePresent;   
+    bool pagingAndServiceInformationIePresent;   
+
+
+    CauseIeData cause;
+    EbiIeData epsBearerId;
+    ArpIeData allocationRetentionPriority;
+    ImsiIeData imsi;
+    FTeidIeData senderFTeidForControlPlane;
+    IndicationIeData indicationFlags;
+    SgwsNodeLevelLoadControlInformationInDownlinkDataNotificationData sgwsNodeLevelLoadControlInformation;
+    SgwsOverloadControlInformationInDownlinkDataNotificationData sgwsOverloadControlInformation;
+    PagingAndServiceInformationIeData pagingAndServiceInformation;
+}DownlinkDataNotificationMsgData;
+
+typedef struct
+{
+    bool dataNotificationDelayIePresent;   
+    bool recoveryIePresent;   
+    bool dlLowPriorityTrafficThrottlingIePresent;   
+    bool imsiIePresent;   
+    bool dlBufferingDurationIePresent;   
+    bool dlBufferingSuggestedPacketCountIePresent;   
+
+
+    CauseIeData cause;
+    DelayValueIeData dataNotificationDelay;
+    RecoveryIeData recovery;
+    ThrottlingIeData dlLowPriorityTrafficThrottling;
+    ImsiIeData imsi;
+    EpcTimerIeData dlBufferingDuration;
+    IntegerNumberIeData dlBufferingSuggestedPacketCount;
+}DownlinkDataNotificationAcknowledgeMsgData;
+
+typedef struct
+{
+    bool originatingNodeIePresent;   
+    bool imsiIePresent;   
+
+
+    CauseIeData cause;
+    NodeTypeIeData originatingNode;
+    ImsiIeData imsi;
+}DownlinkDataNotificationFailureIndicationMsgData;
+
+
+//Ie Type Constants
+static const  Uint8  CreateSessionRequestMsgType = 32;    
+static const  Uint8  CreateSessionResponseMsgType = 33;    
+static const  Uint8  ModifyBearerRequestMsgType = 34;    
+static const  Uint8  ModifyBearerResponseMsgType = 35;    
+static const  Uint8  DeleteSessionRequestMsgType = 36;    
+static const  Uint8  DeleteSessionResponseMsgType = 37;    
+static const  Uint8  ReleaseAccessBearersRequestMsgType = 170;    
+static const  Uint8  ReleaseAccessBearersResponseMsgType = 171;    
+static const  Uint8  CreateBearerRequestMsgType = 95;    
+static const  Uint8  CreateBearerResponseMsgType = 96;    
+static const  Uint8  DeleteBearerRequestMsgType = 99;    
+static const  Uint8  DeleteBearerResponseMsgType = 100;    
+static const  Uint8  DownlinkDataNotificationMsgType = 176;    
+static const  Uint8  DownlinkDataNotificationAcknowledgeMsgType = 177;    
+static const  Uint8  DownlinkDataNotificationFailureIndicationMsgType = 70;    
+
+
+#endif 
\ No newline at end of file
diff --git a/src/gtpV2Codec/msgClasses/gtpV2MsgFactory.cpp b/src/gtpV2Codec/msgClasses/gtpV2MsgFactory.cpp
new file mode 100644
index 0000000..3751ca6
--- /dev/null
+++ b/src/gtpV2Codec/msgClasses/gtpV2MsgFactory.cpp
@@ -0,0 +1,101 @@
+/*
+ * 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/msgfactorytemplate.cpp.tt>
+ ******************************************************************************/ 
+
+#include "gtpV2MsgFactory.h"
+#include "createSessionRequestMsg.h"
+#include "createSessionResponseMsg.h"
+#include "modifyBearerRequestMsg.h"
+#include "modifyBearerResponseMsg.h"
+#include "deleteSessionRequestMsg.h"
+#include "deleteSessionResponseMsg.h"
+#include "releaseAccessBearersRequestMsg.h"
+#include "releaseAccessBearersResponseMsg.h"
+#include "createBearerRequestMsg.h"
+#include "createBearerResponseMsg.h"
+#include "deleteBearerRequestMsg.h"
+#include "deleteBearerResponseMsg.h"
+#include "downlinkDataNotificationMsg.h"
+#include "downlinkDataNotificationAcknowledgeMsg.h"
+#include "downlinkDataNotificationFailureIndicationMsg.h"
+
+static GtpV2MsgFactory gtpV2MsgFactory;
+
+GtpV2MsgFactory::GtpV2MsgFactory() 
+{
+    //Create Message Objects
+        
+    CreateSessionRequestMsg* createSessionRequestMsg_p = new (CreateSessionRequestMsg);
+    msgObjectContainer.insert(std::pair<Uint8, GtpV2Message*>(CreateSessionRequestMsgType, createSessionRequestMsg_p));
+
+    CreateSessionResponseMsg* createSessionResponseMsg_p = new (CreateSessionResponseMsg);
+    msgObjectContainer.insert(std::pair<Uint8, GtpV2Message*>(CreateSessionResponseMsgType, createSessionResponseMsg_p));
+
+    ModifyBearerRequestMsg* modifyBearerRequestMsg_p = new (ModifyBearerRequestMsg);
+    msgObjectContainer.insert(std::pair<Uint8, GtpV2Message*>(ModifyBearerRequestMsgType, modifyBearerRequestMsg_p));
+
+    ModifyBearerResponseMsg* modifyBearerResponseMsg_p = new (ModifyBearerResponseMsg);
+    msgObjectContainer.insert(std::pair<Uint8, GtpV2Message*>(ModifyBearerResponseMsgType, modifyBearerResponseMsg_p));
+
+    DeleteSessionRequestMsg* deleteSessionRequestMsg_p = new (DeleteSessionRequestMsg);
+    msgObjectContainer.insert(std::pair<Uint8, GtpV2Message*>(DeleteSessionRequestMsgType, deleteSessionRequestMsg_p));
+
+    DeleteSessionResponseMsg* deleteSessionResponseMsg_p = new (DeleteSessionResponseMsg);
+    msgObjectContainer.insert(std::pair<Uint8, GtpV2Message*>(DeleteSessionResponseMsgType, deleteSessionResponseMsg_p));
+
+    ReleaseAccessBearersRequestMsg* releaseAccessBearersRequestMsg_p = new (ReleaseAccessBearersRequestMsg);
+    msgObjectContainer.insert(std::pair<Uint8, GtpV2Message*>(ReleaseAccessBearersRequestMsgType, releaseAccessBearersRequestMsg_p));
+
+    ReleaseAccessBearersResponseMsg* releaseAccessBearersResponseMsg_p = new (ReleaseAccessBearersResponseMsg);
+    msgObjectContainer.insert(std::pair<Uint8, GtpV2Message*>(ReleaseAccessBearersResponseMsgType, releaseAccessBearersResponseMsg_p));
+
+    CreateBearerRequestMsg* createBearerRequestMsg_p = new (CreateBearerRequestMsg);
+    msgObjectContainer.insert(std::pair<Uint8, GtpV2Message*>(CreateBearerRequestMsgType, createBearerRequestMsg_p));
+
+    CreateBearerResponseMsg* createBearerResponseMsg_p = new (CreateBearerResponseMsg);
+    msgObjectContainer.insert(std::pair<Uint8, GtpV2Message*>(CreateBearerResponseMsgType, createBearerResponseMsg_p));
+
+    DeleteBearerRequestMsg* deleteBearerRequestMsg_p = new (DeleteBearerRequestMsg);
+    msgObjectContainer.insert(std::pair<Uint8, GtpV2Message*>(DeleteBearerRequestMsgType, deleteBearerRequestMsg_p));
+
+    DeleteBearerResponseMsg* deleteBearerResponseMsg_p = new (DeleteBearerResponseMsg);
+    msgObjectContainer.insert(std::pair<Uint8, GtpV2Message*>(DeleteBearerResponseMsgType, deleteBearerResponseMsg_p));
+
+    DownlinkDataNotificationMsg* downlinkDataNotificationMsg_p = new (DownlinkDataNotificationMsg);
+    msgObjectContainer.insert(std::pair<Uint8, GtpV2Message*>(DownlinkDataNotificationMsgType, downlinkDataNotificationMsg_p));
+
+    DownlinkDataNotificationAcknowledgeMsg* downlinkDataNotificationAcknowledgeMsg_p = new (DownlinkDataNotificationAcknowledgeMsg);
+    msgObjectContainer.insert(std::pair<Uint8, GtpV2Message*>(DownlinkDataNotificationAcknowledgeMsgType, downlinkDataNotificationAcknowledgeMsg_p));
+
+    DownlinkDataNotificationFailureIndicationMsg* downlinkDataNotificationFailureIndicationMsg_p = new (DownlinkDataNotificationFailureIndicationMsg);
+    msgObjectContainer.insert(std::pair<Uint8, GtpV2Message*>(DownlinkDataNotificationFailureIndicationMsgType, downlinkDataNotificationFailureIndicationMsg_p));
+
+
+}
+
+GtpV2MsgFactory::~GtpV2MsgFactory() {
+    // TODO clean up the allocated memory for message objects
+}
+
+GtpV2MsgFactory& GtpV2MsgFactory::getInstance()
+{
+    static GtpV2MsgFactory gtpV2MsgFactory;
+    return gtpV2MsgFactory;
+}
+
+GtpV2Message& GtpV2MsgFactory::getMsgObject(Uint8 msgType)
+{
+    std::map<Uint8, GtpV2Message*>::iterator it;
+    it = msgObjectContainer.find(msgType);
+    return *(it->second);
+}
diff --git a/src/gtpV2Codec/msgClasses/gtpV2MsgFactory.h b/src/gtpV2Codec/msgClasses/gtpV2MsgFactory.h
new file mode 100644
index 0000000..e2546b2
--- /dev/null
+++ b/src/gtpV2Codec/msgClasses/gtpV2MsgFactory.h
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */ 
+/******************************************************************************
+ *
+ * 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/msgfactorytemplate.h.tt>
+ ******************************************************************************/
+#ifndef GTPV2MSGFACTORY_H_
+#define GTPV2MSGFACTORY_H_
+
+#include <map>
+#include "manual/gtpV2Message.h"
+
+class GtpV2MsgFactory {
+public:
+    GtpV2MsgFactory();
+    virtual ~GtpV2MsgFactory();
+
+    static GtpV2MsgFactory& getInstance();
+    GtpV2Message& getMsgObject(Uint8 msgType);
+
+private:
+
+    map<Uint8, GtpV2Message*> msgObjectContainer;
+
+};
+
+
+#endif /* GTPV2MSGFACTORY_H_ */
\ No newline at end of file
diff --git a/src/gtpV2Codec/msgClasses/manual/gtpV2Message.cpp b/src/gtpV2Codec/msgClasses/manual/gtpV2Message.cpp
new file mode 100644
index 0000000..8fc7c73
--- /dev/null
+++ b/src/gtpV2Codec/msgClasses/manual/gtpV2Message.cpp
@@ -0,0 +1,63 @@
+ /*
+Copyright 2019-present Infosys Limited  
+   
+SPDX-License-Identifier: Apache-2.0  
+  
+*/ 
+ 
+
+
+#include "gtpV2Message.h"
+
+GtpV2Message::GtpV2Message() {
+	// TODO Auto-generated constructor stub
+
+}
+
+GtpV2Message::~GtpV2Message() {
+	// TODO Auto-generated destructor stub
+}
+
+void GtpV2Message::encodeHeader(MsgBuffer& buffer, GtpV2MessageHeader& msgHeader)
+{
+  buffer.writeBits(2, 3); // Gtpversion 2
+  buffer.writeBits(0, 1); //Pigiback - TODO later
+  buffer.writeBits(msgHeader.teidPresent, 1);
+  buffer.skipBits(3);
+
+  buffer.writeUint8(msgHeader.msgType);
+  buffer.writeUint16(msgHeader.msgLength);
+  
+  if (msgHeader.teidPresent)
+  {
+    buffer.writeUint32(msgHeader.teid);
+  }
+  
+  Uint32 seqNumber = msgHeader.sequenceNumber << 8;
+  std::cout << "current seq num indx is " << buffer.getCurrentIndex() << std::endl;
+  buffer.writeUint32(seqNumber);
+  
+}
+
+bool GtpV2Message::decodeHeader(MsgBuffer& buffer, GtpV2MessageHeader& msgHeader)
+{
+  buffer.skipBits(4);
+  msgHeader.teidPresent = buffer.readBit();
+  buffer.skipBits(3);
+
+  buffer.readUint8(msgHeader.msgType);
+  buffer.readUint16(msgHeader.msgLength);
+
+  if (msgHeader.teidPresent)
+  {
+    buffer.readUint32(msgHeader.teid);
+  }
+  Uint32 seqNumber;
+
+  buffer.readUint32(seqNumber);
+  msgHeader.sequenceNumber = (seqNumber >> 8);
+    
+  return true; //TODO
+
+}
+
diff --git a/src/gtpV2Codec/msgClasses/manual/gtpV2Message.h b/src/gtpV2Codec/msgClasses/manual/gtpV2Message.h
new file mode 100644
index 0000000..4ef856b
--- /dev/null
+++ b/src/gtpV2Codec/msgClasses/manual/gtpV2Message.h
@@ -0,0 +1,29 @@
+ /*
+Copyright 2019-present Infosys Limited  
+   
+SPDX-License-Identifier: Apache-2.0  
+  
+*/ 
+ 
+
+
+#ifndef GTPV2MESSAGE_H_
+#define GTPV2MESSAGE_H_
+
+#include "basicTypes.h"
+#include "msgBuffer.h"
+#include "../../../gtpV2Codec/msgClasses/gtpV2MsgDataTypes.h"
+
+class GtpV2Message {
+public:
+	GtpV2Message();
+	virtual ~GtpV2Message();
+        static void encodeHeader(MsgBuffer& buffer, GtpV2MessageHeader& msgHeader);
+        static bool decodeHeader(MsgBuffer& buffer, GtpV2MessageHeader& msgHeader);
+
+protected:
+        Uint8 msgType;
+};
+
+#endif /* GTPV2MESSAGE_H_ */
+
diff --git a/src/gtpV2Codec/msgClasses/modifyBearerRequestMsg.cpp b/src/gtpV2Codec/msgClasses/modifyBearerRequestMsg.cpp
new file mode 100644
index 0000000..4bbd715
--- /dev/null
+++ b/src/gtpV2Codec/msgClasses/modifyBearerRequestMsg.cpp
@@ -0,0 +1,2347 @@
+/*
+ * 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/msgtemplate.cpp.tt>
+ ******************************************************************************/ 
+
+#include "modifyBearerRequestMsg.h"
+#include "../ieClasses/manual/gtpV2Ie.h"
+#include "../ieClasses/gtpV2IeFactory.h"
+#include "../ieClasses/meiIe.h"
+#include "../ieClasses/uliIe.h"
+#include "../ieClasses/servingNetworkIe.h"
+#include "../ieClasses/ratTypeIe.h"
+#include "../ieClasses/indicationIe.h"
+#include "../ieClasses/fTeidIe.h"
+#include "../ieClasses/ambrIe.h"
+#include "../ieClasses/delayValueIe.h"
+#include "../ieClasses/bearerContextIe.h"
+#include "../ieClasses/bearerContextsToBeModifiedInModifyBearerRequest.h"
+#include "../ieClasses/bearerContextIe.h"
+#include "../ieClasses/bearerContextsToBeRemovedInModifyBearerRequest.h"
+#include "../ieClasses/recoveryIe.h"
+#include "../ieClasses/ueTimeZoneIe.h"
+#include "../ieClasses/fqCsidIe.h"
+#include "../ieClasses/fqCsidIe.h"
+#include "../ieClasses/uciIe.h"
+#include "../ieClasses/ipAddressIe.h"
+#include "../ieClasses/portNumberIe.h"
+#include "../ieClasses/localDistinguishedNameIe.h"
+#include "../ieClasses/localDistinguishedNameIe.h"
+#include "../ieClasses/ipAddressIe.h"
+#include "../ieClasses/portNumberIe.h"
+#include "../ieClasses/ipAddressIe.h"
+#include "../ieClasses/cnOperatorSelectionEntityIe.h"
+#include "../ieClasses/overloadControlInformationIe.h"
+#include "../ieClasses/mmeS4SgsnsOverloadControlInformationInModifyBearerRequest.h"
+#include "../ieClasses/overloadControlInformationIe.h"
+#include "../ieClasses/sgwsOverloadControlInformationInModifyBearerRequest.h"
+#include "../ieClasses/overloadControlInformationIe.h"
+#include "../ieClasses/epdgsOverloadControlInformationInModifyBearerRequest.h"
+#include "../ieClasses/servingPlmnRateControlIe.h"
+#include "../ieClasses/counterIe.h"
+#include "../ieClasses/imsiIe.h"
+#include "../ieClasses/uliIe.h"
+#include "../ieClasses/twanIdentifierIe.h"
+#include "../ieClasses/twanIdentifierTimestampIe.h"
+#include "../ieClasses/secondaryRatUsageDataReportIe.h"
+
+ModifyBearerRequestMsg::ModifyBearerRequestMsg()
+{
+    msgType = ModifyBearerRequestMsgType;
+
+}
+
+ModifyBearerRequestMsg::~ModifyBearerRequestMsg()
+{
+
+}
+
+bool ModifyBearerRequestMsg::encodeModifyBearerRequestMsg(MsgBuffer &buffer,
+                        ModifyBearerRequestMsgData
+							const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+    if (data.meIdentityIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = MeiIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        MeiIe mei=
+        dynamic_cast<
+        MeiIe&>(GtpV2IeFactory::getInstance().getIeObject(MeiIeType));
+        rc = mei.encodeMeiIe(buffer, data.meIdentity);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: meIdentity\n");
+            return false;
+        }
+    }
+
+    if (data.userLocationInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = UliIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        UliIe uli=
+        dynamic_cast<
+        UliIe&>(GtpV2IeFactory::getInstance().getIeObject(UliIeType));
+        rc = uli.encodeUliIe(buffer, data.userLocationInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: userLocationInformation\n");
+            return false;
+        }
+    }
+
+    if (data.servingNetworkIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = ServingNetworkIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        ServingNetworkIe servingNetwork=
+        dynamic_cast<
+        ServingNetworkIe&>(GtpV2IeFactory::getInstance().getIeObject(ServingNetworkIeType));
+        rc = servingNetwork.encodeServingNetworkIe(buffer, data.servingNetwork);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: servingNetwork\n");
+            return false;
+        }
+    }
+
+    if (data.ratTypeIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = RatTypeIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        RatTypeIe ratType=
+        dynamic_cast<
+        RatTypeIe&>(GtpV2IeFactory::getInstance().getIeObject(RatTypeIeType));
+        rc = ratType.encodeRatTypeIe(buffer, data.ratType);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: ratType\n");
+            return false;
+        }
+    }
+
+    if (data.indicationFlagsIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = IndicationIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        IndicationIe indication=
+        dynamic_cast<
+        IndicationIe&>(GtpV2IeFactory::getInstance().getIeObject(IndicationIeType));
+        rc = indication.encodeIndicationIe(buffer, data.indicationFlags);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: indicationFlags\n");
+            return false;
+        }
+    }
+
+    if (data.senderFTeidForControlPlaneIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FTeidIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        rc = fTeid.encodeFTeidIe(buffer, data.senderFTeidForControlPlane);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: senderFTeidForControlPlane\n");
+            return false;
+        }
+    }
+
+    if (data.aggregateMaximumBitRateIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = AmbrIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        AmbrIe ambr=
+        dynamic_cast<
+        AmbrIe&>(GtpV2IeFactory::getInstance().getIeObject(AmbrIeType));
+        rc = ambr.encodeAmbrIe(buffer, data.aggregateMaximumBitRate);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: aggregateMaximumBitRate\n");
+            return false;
+        }
+    }
+
+    if (data.delayDownlinkPacketNotificationRequestIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = DelayValueIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        DelayValueIe delayValue=
+        dynamic_cast<
+        DelayValueIe&>(GtpV2IeFactory::getInstance().getIeObject(DelayValueIeType));
+        rc = delayValue.encodeDelayValueIe(buffer, data.delayDownlinkPacketNotificationRequest);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: delayDownlinkPacketNotificationRequest\n");
+            return false;
+        }
+    }
+
+        // First validate if the applicatoin provided more than the expected cardinality
+    if (data.bearerContextsToBeModifiedCount > 11)
+    {
+        errorStream.add((char *)"Number of entries of bearerContextsToBeModified exceeded\n");
+        errorStream.add((char *)"Expected count: 11 Received count: ");
+        errorStream.add((char *)"data.bearerContextsToBeModifiedCount");
+        errorStream.endOfLine();
+        return false;
+    }
+    for (Uint8 i = 0; i < data.bearerContextsToBeModifiedCount; i++)
+    {
+        // Encode the Ie Header
+        header.ieType = BearerContextIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        BearerContextIe bearerContext=
+        dynamic_cast<
+        BearerContextIe&>(GtpV2IeFactory::getInstance().
+        getIeObject(BearerContextIeType));
+        BearerContextsToBeModifiedInModifyBearerRequest groupedIeInstance = dynamic_cast<BearerContextsToBeModifiedInModifyBearerRequest&>(bearerContext.getGroupedIe(msgType, 0));
+        rc = groupedIeInstance.encodeBearerContextsToBeModifiedInModifyBearerRequest(buffer, data.bearerContextsToBeModified[i]);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+    }
+
+    if (!(rc))
+    { 
+        errorStream.add((char *)"Failed to encode IE: bearerContextsToBeModified\n");
+        return false;
+    }
+
+        // First validate if the applicatoin provided more than the expected cardinality
+    if (data.bearerContextsToBeRemovedCount > 11)
+    {
+        errorStream.add((char *)"Number of entries of bearerContextsToBeRemoved exceeded\n");
+        errorStream.add((char *)"Expected count: 11 Received count: ");
+        errorStream.add((char *)"data.bearerContextsToBeRemovedCount");
+        errorStream.endOfLine();
+        return false;
+    }
+    for (Uint8 i = 0; i < data.bearerContextsToBeRemovedCount; i++)
+    {
+        // Encode the Ie Header
+        header.ieType = BearerContextIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        BearerContextIe bearerContext=
+        dynamic_cast<
+        BearerContextIe&>(GtpV2IeFactory::getInstance().
+        getIeObject(BearerContextIeType));
+        BearerContextsToBeRemovedInModifyBearerRequest groupedIeInstance = dynamic_cast<BearerContextsToBeRemovedInModifyBearerRequest&>(bearerContext.getGroupedIe(msgType, 1));
+        rc = groupedIeInstance.encodeBearerContextsToBeRemovedInModifyBearerRequest(buffer, data.bearerContextsToBeRemoved[i]);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+    }
+
+    if (!(rc))
+    { 
+        errorStream.add((char *)"Failed to encode IE: bearerContextsToBeRemoved\n");
+        return false;
+    }
+
+    if (data.recoveryIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = RecoveryIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        RecoveryIe recovery=
+        dynamic_cast<
+        RecoveryIe&>(GtpV2IeFactory::getInstance().getIeObject(RecoveryIeType));
+        rc = recovery.encodeRecoveryIe(buffer, data.recovery);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: recovery\n");
+            return false;
+        }
+    }
+
+    if (data.ueTimeZoneIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = UeTimeZoneIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        UeTimeZoneIe ueTimeZone=
+        dynamic_cast<
+        UeTimeZoneIe&>(GtpV2IeFactory::getInstance().getIeObject(UeTimeZoneIeType));
+        rc = ueTimeZone.encodeUeTimeZoneIe(buffer, data.ueTimeZone);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: ueTimeZone\n");
+            return false;
+        }
+    }
+
+    if (data.mmeFqCsidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FqCsidIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        rc = fqCsid.encodeFqCsidIe(buffer, data.mmeFqCsid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: mmeFqCsid\n");
+            return false;
+        }
+    }
+
+    if (data.sgwFqCsidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FqCsidIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        rc = fqCsid.encodeFqCsidIe(buffer, data.sgwFqCsid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: sgwFqCsid\n");
+            return false;
+        }
+    }
+
+    if (data.userCsgInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = UciIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        UciIe uci=
+        dynamic_cast<
+        UciIe&>(GtpV2IeFactory::getInstance().getIeObject(UciIeType));
+        rc = uci.encodeUciIe(buffer, data.userCsgInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: userCsgInformation\n");
+            return false;
+        }
+    }
+
+    if (data.ueLocalIpAddressIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = IpAddressIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        IpAddressIe ipAddress=
+        dynamic_cast<
+        IpAddressIe&>(GtpV2IeFactory::getInstance().getIeObject(IpAddressIeType));
+        rc = ipAddress.encodeIpAddressIe(buffer, data.ueLocalIpAddress);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: ueLocalIpAddress\n");
+            return false;
+        }
+    }
+
+    if (data.ueUdpPortIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = PortNumberIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        PortNumberIe portNumber=
+        dynamic_cast<
+        PortNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(PortNumberIeType));
+        rc = portNumber.encodePortNumberIe(buffer, data.ueUdpPort);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: ueUdpPort\n");
+            return false;
+        }
+    }
+
+    if (data.mmeS4SgsnLdnIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = LocalDistinguishedNameIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        LocalDistinguishedNameIe localDistinguishedName=
+        dynamic_cast<
+        LocalDistinguishedNameIe&>(GtpV2IeFactory::getInstance().getIeObject(LocalDistinguishedNameIeType));
+        rc = localDistinguishedName.encodeLocalDistinguishedNameIe(buffer, data.mmeS4SgsnLdn);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: mmeS4SgsnLdn\n");
+            return false;
+        }
+    }
+
+    if (data.sgwLdnIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = LocalDistinguishedNameIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        LocalDistinguishedNameIe localDistinguishedName=
+        dynamic_cast<
+        LocalDistinguishedNameIe&>(GtpV2IeFactory::getInstance().getIeObject(LocalDistinguishedNameIeType));
+        rc = localDistinguishedName.encodeLocalDistinguishedNameIe(buffer, data.sgwLdn);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: sgwLdn\n");
+            return false;
+        }
+    }
+
+    if (data.hNbLocalIpAddressIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = IpAddressIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        IpAddressIe ipAddress=
+        dynamic_cast<
+        IpAddressIe&>(GtpV2IeFactory::getInstance().getIeObject(IpAddressIeType));
+        rc = ipAddress.encodeIpAddressIe(buffer, data.hNbLocalIpAddress);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: hNbLocalIpAddress\n");
+            return false;
+        }
+    }
+
+    if (data.hNbUdpPortIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = PortNumberIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        PortNumberIe portNumber=
+        dynamic_cast<
+        PortNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(PortNumberIeType));
+        rc = portNumber.encodePortNumberIe(buffer, data.hNbUdpPort);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: hNbUdpPort\n");
+            return false;
+        }
+    }
+
+    if (data.mmeS4SgsnIdentifierIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = IpAddressIeType;
+        header.instance = 2;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        IpAddressIe ipAddress=
+        dynamic_cast<
+        IpAddressIe&>(GtpV2IeFactory::getInstance().getIeObject(IpAddressIeType));
+        rc = ipAddress.encodeIpAddressIe(buffer, data.mmeS4SgsnIdentifier);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: mmeS4SgsnIdentifier\n");
+            return false;
+        }
+    }
+
+    if (data.cnOperatorSelectionEntityIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = CnOperatorSelectionEntityIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        CnOperatorSelectionEntityIe cnOperatorSelectionEntity=
+        dynamic_cast<
+        CnOperatorSelectionEntityIe&>(GtpV2IeFactory::getInstance().getIeObject(CnOperatorSelectionEntityIeType));
+        rc = cnOperatorSelectionEntity.encodeCnOperatorSelectionEntityIe(buffer, data.cnOperatorSelectionEntity);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: cnOperatorSelectionEntity\n");
+            return false;
+        }
+    }
+
+    if (data.mmeS4SgsnsOverloadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = OverloadControlInformationIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+        MmeS4SgsnsOverloadControlInformationInModifyBearerRequest groupedIeInstance =
+        dynamic_cast<
+         MmeS4SgsnsOverloadControlInformationInModifyBearerRequest&>(overloadControlInformation.getGroupedIe(msgType, 0));
+        rc = groupedIeInstance.encodeMmeS4SgsnsOverloadControlInformationInModifyBearerRequest(buffer, data.mmeS4SgsnsOverloadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: mmeS4SgsnsOverloadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.sgwsOverloadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = OverloadControlInformationIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+        SgwsOverloadControlInformationInModifyBearerRequest groupedIeInstance =
+        dynamic_cast<
+         SgwsOverloadControlInformationInModifyBearerRequest&>(overloadControlInformation.getGroupedIe(msgType, 1));
+        rc = groupedIeInstance.encodeSgwsOverloadControlInformationInModifyBearerRequest(buffer, data.sgwsOverloadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: sgwsOverloadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.epdgsOverloadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = OverloadControlInformationIeType;
+        header.instance = 2;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+        EpdgsOverloadControlInformationInModifyBearerRequest groupedIeInstance =
+        dynamic_cast<
+         EpdgsOverloadControlInformationInModifyBearerRequest&>(overloadControlInformation.getGroupedIe(msgType, 2));
+        rc = groupedIeInstance.encodeEpdgsOverloadControlInformationInModifyBearerRequest(buffer, data.epdgsOverloadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: epdgsOverloadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.servingPlmnRateControlIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = ServingPlmnRateControlIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        ServingPlmnRateControlIe servingPlmnRateControl=
+        dynamic_cast<
+        ServingPlmnRateControlIe&>(GtpV2IeFactory::getInstance().getIeObject(ServingPlmnRateControlIeType));
+        rc = servingPlmnRateControl.encodeServingPlmnRateControlIe(buffer, data.servingPlmnRateControl);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: servingPlmnRateControl\n");
+            return false;
+        }
+    }
+
+    if (data.moExceptionDataCounterIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = CounterIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        CounterIe counter=
+        dynamic_cast<
+        CounterIe&>(GtpV2IeFactory::getInstance().getIeObject(CounterIeType));
+        rc = counter.encodeCounterIe(buffer, data.moExceptionDataCounter);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: moExceptionDataCounter\n");
+            return false;
+        }
+    }
+
+    if (data.imsiIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = ImsiIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        ImsiIe imsi=
+        dynamic_cast<
+        ImsiIe&>(GtpV2IeFactory::getInstance().getIeObject(ImsiIeType));
+        rc = imsi.encodeImsiIe(buffer, data.imsi);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: imsi\n");
+            return false;
+        }
+    }
+
+    if (data.userLocationInformationForSgwIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = UliIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        UliIe uli=
+        dynamic_cast<
+        UliIe&>(GtpV2IeFactory::getInstance().getIeObject(UliIeType));
+        rc = uli.encodeUliIe(buffer, data.userLocationInformationForSgw);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: userLocationInformationForSgw\n");
+            return false;
+        }
+    }
+
+    if (data.wlanLocationInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = TwanIdentifierIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        TwanIdentifierIe twanIdentifier=
+        dynamic_cast<
+        TwanIdentifierIe&>(GtpV2IeFactory::getInstance().getIeObject(TwanIdentifierIeType));
+        rc = twanIdentifier.encodeTwanIdentifierIe(buffer, data.wlanLocationInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: wlanLocationInformation\n");
+            return false;
+        }
+    }
+
+    if (data.wlanLocationTimestampIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = TwanIdentifierTimestampIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        TwanIdentifierTimestampIe twanIdentifierTimestamp=
+        dynamic_cast<
+        TwanIdentifierTimestampIe&>(GtpV2IeFactory::getInstance().getIeObject(TwanIdentifierTimestampIeType));
+        rc = twanIdentifierTimestamp.encodeTwanIdentifierTimestampIe(buffer, data.wlanLocationTimestamp);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: wlanLocationTimestamp\n");
+            return false;
+        }
+    }
+
+    if (data.secondaryRatUsageDataReportIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = SecondaryRatUsageDataReportIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        SecondaryRatUsageDataReportIe secondaryRatUsageDataReport=
+        dynamic_cast<
+        SecondaryRatUsageDataReportIe&>(GtpV2IeFactory::getInstance().getIeObject(SecondaryRatUsageDataReportIeType));
+        rc = secondaryRatUsageDataReport.encodeSecondaryRatUsageDataReportIe(buffer, data.secondaryRatUsageDataReport);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: secondaryRatUsageDataReport\n");
+            return false;
+        }
+    }
+    return rc;
+
+}
+
+bool ModifyBearerRequestMsg::decodeModifyBearerRequestMsg(MsgBuffer &buffer,
+ ModifyBearerRequestMsgData 
+ &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+  
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+
+        switch (ieHeader.ieType){
+     
+            case MeiIeType:
+            {
+                MeiIe ieObject =
+                dynamic_cast<
+                MeiIe&>(GtpV2IeFactory::getInstance().getIeObject(MeiIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeMeiIe(buffer, data.meIdentity, ieHeader.length);
+
+                    data.meIdentityIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: meIdentity\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case UliIeType:
+            {
+                UliIe ieObject =
+                dynamic_cast<
+                UliIe&>(GtpV2IeFactory::getInstance().getIeObject(UliIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeUliIe(buffer, data.userLocationInformation, ieHeader.length);
+
+                    data.userLocationInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: userLocationInformation\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					rc = ieObject.decodeUliIe(buffer, data.userLocationInformationForSgw, ieHeader.length);
+
+                    data.userLocationInformationForSgwIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: userLocationInformationForSgw\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case ServingNetworkIeType:
+            {
+                ServingNetworkIe ieObject =
+                dynamic_cast<
+                ServingNetworkIe&>(GtpV2IeFactory::getInstance().getIeObject(ServingNetworkIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeServingNetworkIe(buffer, data.servingNetwork, ieHeader.length);
+
+                    data.servingNetworkIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: servingNetwork\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case RatTypeIeType:
+            {
+                RatTypeIe ieObject =
+                dynamic_cast<
+                RatTypeIe&>(GtpV2IeFactory::getInstance().getIeObject(RatTypeIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeRatTypeIe(buffer, data.ratType, ieHeader.length);
+
+                    data.ratTypeIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: ratType\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case IndicationIeType:
+            {
+                IndicationIe ieObject =
+                dynamic_cast<
+                IndicationIe&>(GtpV2IeFactory::getInstance().getIeObject(IndicationIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeIndicationIe(buffer, data.indicationFlags, ieHeader.length);
+
+                    data.indicationFlagsIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: indicationFlags\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case FTeidIeType:
+            {
+                FTeidIe ieObject =
+                dynamic_cast<
+                FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeFTeidIe(buffer, data.senderFTeidForControlPlane, ieHeader.length);
+
+                    data.senderFTeidForControlPlaneIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: senderFTeidForControlPlane\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case AmbrIeType:
+            {
+                AmbrIe ieObject =
+                dynamic_cast<
+                AmbrIe&>(GtpV2IeFactory::getInstance().getIeObject(AmbrIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeAmbrIe(buffer, data.aggregateMaximumBitRate, ieHeader.length);
+
+                    data.aggregateMaximumBitRateIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: aggregateMaximumBitRate\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case DelayValueIeType:
+            {
+                DelayValueIe ieObject =
+                dynamic_cast<
+                DelayValueIe&>(GtpV2IeFactory::getInstance().getIeObject(DelayValueIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeDelayValueIe(buffer, data.delayDownlinkPacketNotificationRequest, ieHeader.length);
+
+                    data.delayDownlinkPacketNotificationRequestIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: delayDownlinkPacketNotificationRequest\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case BearerContextIeType:
+            {
+                BearerContextIe ieObject =
+                dynamic_cast<
+                BearerContextIe&>(GtpV2IeFactory::getInstance().getIeObject(BearerContextIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					// First check if we have enough space left to decode and store this instance
+                    if (data.bearerContextsToBeModifiedCount == 11)
+                    {
+                        errorStream.add((char *)"More than 11 instances of bearerContextsToBeModified received\n");
+                        return false;
+                    }
+                    BearerContextsToBeModifiedInModifyBearerRequest groupedIeInstance =
+                    dynamic_cast<
+                    BearerContextsToBeModifiedInModifyBearerRequest&>(ieObject.getGroupedIe(msgType, 0));
+                    rc = groupedIeInstance.decodeBearerContextsToBeModifiedInModifyBearerRequest(buffer,
+                    data.bearerContextsToBeModified[data.bearerContextsToBeModifiedCount], ieHeader.length);
+                    data.bearerContextsToBeModifiedCount++; // TODO Count validation
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: bearerContextsToBeModified\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					// First check if we have enough space left to decode and store this instance
+                    if (data.bearerContextsToBeRemovedCount == 11)
+                    {
+                        errorStream.add((char *)"More than 11 instances of bearerContextsToBeRemoved received\n");
+                        return false;
+                    }
+                    BearerContextsToBeRemovedInModifyBearerRequest groupedIeInstance =
+                    dynamic_cast<
+                    BearerContextsToBeRemovedInModifyBearerRequest&>(ieObject.getGroupedIe(msgType, 1));
+                    rc = groupedIeInstance.decodeBearerContextsToBeRemovedInModifyBearerRequest(buffer,
+                    data.bearerContextsToBeRemoved[data.bearerContextsToBeRemovedCount], ieHeader.length);
+                    data.bearerContextsToBeRemovedCount++; // TODO Count validation
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: bearerContextsToBeRemoved\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case RecoveryIeType:
+            {
+                RecoveryIe ieObject =
+                dynamic_cast<
+                RecoveryIe&>(GtpV2IeFactory::getInstance().getIeObject(RecoveryIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeRecoveryIe(buffer, data.recovery, ieHeader.length);
+
+                    data.recoveryIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: recovery\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case UeTimeZoneIeType:
+            {
+                UeTimeZoneIe ieObject =
+                dynamic_cast<
+                UeTimeZoneIe&>(GtpV2IeFactory::getInstance().getIeObject(UeTimeZoneIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeUeTimeZoneIe(buffer, data.ueTimeZone, ieHeader.length);
+
+                    data.ueTimeZoneIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: ueTimeZone\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case FqCsidIeType:
+            {
+                FqCsidIe ieObject =
+                dynamic_cast<
+                FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeFqCsidIe(buffer, data.mmeFqCsid, ieHeader.length);
+
+                    data.mmeFqCsidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: mmeFqCsid\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					rc = ieObject.decodeFqCsidIe(buffer, data.sgwFqCsid, ieHeader.length);
+
+                    data.sgwFqCsidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: sgwFqCsid\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case UciIeType:
+            {
+                UciIe ieObject =
+                dynamic_cast<
+                UciIe&>(GtpV2IeFactory::getInstance().getIeObject(UciIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeUciIe(buffer, data.userCsgInformation, ieHeader.length);
+
+                    data.userCsgInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: userCsgInformation\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case IpAddressIeType:
+            {
+                IpAddressIe ieObject =
+                dynamic_cast<
+                IpAddressIe&>(GtpV2IeFactory::getInstance().getIeObject(IpAddressIeType));
+
+                if(ieHeader.instance == 1)
+                {
+					rc = ieObject.decodeIpAddressIe(buffer, data.ueLocalIpAddress, ieHeader.length);
+
+                    data.ueLocalIpAddressIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: ueLocalIpAddress\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeIpAddressIe(buffer, data.hNbLocalIpAddress, ieHeader.length);
+
+                    data.hNbLocalIpAddressIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: hNbLocalIpAddress\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 2)
+                {
+					rc = ieObject.decodeIpAddressIe(buffer, data.mmeS4SgsnIdentifier, ieHeader.length);
+
+                    data.mmeS4SgsnIdentifierIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: mmeS4SgsnIdentifier\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case PortNumberIeType:
+            {
+                PortNumberIe ieObject =
+                dynamic_cast<
+                PortNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(PortNumberIeType));
+
+                if(ieHeader.instance == 1)
+                {
+					rc = ieObject.decodePortNumberIe(buffer, data.ueUdpPort, ieHeader.length);
+
+                    data.ueUdpPortIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: ueUdpPort\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodePortNumberIe(buffer, data.hNbUdpPort, ieHeader.length);
+
+                    data.hNbUdpPortIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: hNbUdpPort\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case LocalDistinguishedNameIeType:
+            {
+                LocalDistinguishedNameIe ieObject =
+                dynamic_cast<
+                LocalDistinguishedNameIe&>(GtpV2IeFactory::getInstance().getIeObject(LocalDistinguishedNameIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeLocalDistinguishedNameIe(buffer, data.mmeS4SgsnLdn, ieHeader.length);
+
+                    data.mmeS4SgsnLdnIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: mmeS4SgsnLdn\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeLocalDistinguishedNameIe(buffer, data.sgwLdn, ieHeader.length);
+
+                    data.sgwLdnIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: sgwLdn\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case CnOperatorSelectionEntityIeType:
+            {
+                CnOperatorSelectionEntityIe ieObject =
+                dynamic_cast<
+                CnOperatorSelectionEntityIe&>(GtpV2IeFactory::getInstance().getIeObject(CnOperatorSelectionEntityIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeCnOperatorSelectionEntityIe(buffer, data.cnOperatorSelectionEntity, ieHeader.length);
+
+                    data.cnOperatorSelectionEntityIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: cnOperatorSelectionEntity\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case OverloadControlInformationIeType:
+            {
+                OverloadControlInformationIe ieObject =
+                dynamic_cast<
+                OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					MmeS4SgsnsOverloadControlInformationInModifyBearerRequest groupedIeInstance =
+					dynamic_cast<
+					MmeS4SgsnsOverloadControlInformationInModifyBearerRequest&>(ieObject.getGroupedIe(msgType, 0));
+					rc = groupedIeInstance.decodeMmeS4SgsnsOverloadControlInformationInModifyBearerRequest(buffer, data.mmeS4SgsnsOverloadControlInformation, ieHeader.length);
+
+                    data.mmeS4SgsnsOverloadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: mmeS4SgsnsOverloadControlInformation\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					SgwsOverloadControlInformationInModifyBearerRequest groupedIeInstance =
+					dynamic_cast<
+					SgwsOverloadControlInformationInModifyBearerRequest&>(ieObject.getGroupedIe(msgType, 1));
+					rc = groupedIeInstance.decodeSgwsOverloadControlInformationInModifyBearerRequest(buffer, data.sgwsOverloadControlInformation, ieHeader.length);
+
+                    data.sgwsOverloadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: sgwsOverloadControlInformation\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 2)
+                {
+					EpdgsOverloadControlInformationInModifyBearerRequest groupedIeInstance =
+					dynamic_cast<
+					EpdgsOverloadControlInformationInModifyBearerRequest&>(ieObject.getGroupedIe(msgType, 2));
+					rc = groupedIeInstance.decodeEpdgsOverloadControlInformationInModifyBearerRequest(buffer, data.epdgsOverloadControlInformation, ieHeader.length);
+
+                    data.epdgsOverloadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: epdgsOverloadControlInformation\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case ServingPlmnRateControlIeType:
+            {
+                ServingPlmnRateControlIe ieObject =
+                dynamic_cast<
+                ServingPlmnRateControlIe&>(GtpV2IeFactory::getInstance().getIeObject(ServingPlmnRateControlIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeServingPlmnRateControlIe(buffer, data.servingPlmnRateControl, ieHeader.length);
+
+                    data.servingPlmnRateControlIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: servingPlmnRateControl\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case CounterIeType:
+            {
+                CounterIe ieObject =
+                dynamic_cast<
+                CounterIe&>(GtpV2IeFactory::getInstance().getIeObject(CounterIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeCounterIe(buffer, data.moExceptionDataCounter, ieHeader.length);
+
+                    data.moExceptionDataCounterIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: moExceptionDataCounter\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case ImsiIeType:
+            {
+                ImsiIe ieObject =
+                dynamic_cast<
+                ImsiIe&>(GtpV2IeFactory::getInstance().getIeObject(ImsiIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeImsiIe(buffer, data.imsi, ieHeader.length);
+
+                    data.imsiIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: imsi\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case TwanIdentifierIeType:
+            {
+                TwanIdentifierIe ieObject =
+                dynamic_cast<
+                TwanIdentifierIe&>(GtpV2IeFactory::getInstance().getIeObject(TwanIdentifierIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeTwanIdentifierIe(buffer, data.wlanLocationInformation, ieHeader.length);
+
+                    data.wlanLocationInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: wlanLocationInformation\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case TwanIdentifierTimestampIeType:
+            {
+                TwanIdentifierTimestampIe ieObject =
+                dynamic_cast<
+                TwanIdentifierTimestampIe&>(GtpV2IeFactory::getInstance().getIeObject(TwanIdentifierTimestampIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeTwanIdentifierTimestampIe(buffer, data.wlanLocationTimestamp, ieHeader.length);
+
+                    data.wlanLocationTimestampIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: wlanLocationTimestamp\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case SecondaryRatUsageDataReportIeType:
+            {
+                SecondaryRatUsageDataReportIe ieObject =
+                dynamic_cast<
+                SecondaryRatUsageDataReportIe&>(GtpV2IeFactory::getInstance().getIeObject(SecondaryRatUsageDataReportIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeSecondaryRatUsageDataReportIe(buffer, data.secondaryRatUsageDataReport, ieHeader.length);
+
+                    data.secondaryRatUsageDataReportIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: secondaryRatUsageDataReport\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+
+            default:
+            {
+                // Unknown IE print error
+                errorStream.add((char *)"Unknown IE Type: ");
+                errorStream.add(ieHeader.ieType);
+                errorStream.endOfLine();
+                buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    return rc; // TODO validations
+}
+
+void ModifyBearerRequestMsg::
+displayModifyBearerRequestMsgData_v(ModifyBearerRequestMsgData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"ModifyBearerRequestMsg:");
+    stream.endOfLine();
+    stream.incrIndent();
+        
+    
+    if (data.meIdentityIePresent)
+    {
+
+
+        stream.add((char *)"IE - meIdentity:");
+        stream.endOfLine();
+        MeiIe mei=
+        dynamic_cast<
+        MeiIe&>(GtpV2IeFactory::getInstance().getIeObject(MeiIeType));
+        mei.displayMeiIe_v(data.meIdentity, stream);
+
+    }
+    if (data.userLocationInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - userLocationInformation:");
+        stream.endOfLine();
+        UliIe uli=
+        dynamic_cast<
+        UliIe&>(GtpV2IeFactory::getInstance().getIeObject(UliIeType));
+        uli.displayUliIe_v(data.userLocationInformation, stream);
+
+    }
+    if (data.servingNetworkIePresent)
+    {
+
+
+        stream.add((char *)"IE - servingNetwork:");
+        stream.endOfLine();
+        ServingNetworkIe servingNetwork=
+        dynamic_cast<
+        ServingNetworkIe&>(GtpV2IeFactory::getInstance().getIeObject(ServingNetworkIeType));
+        servingNetwork.displayServingNetworkIe_v(data.servingNetwork, stream);
+
+    }
+    if (data.ratTypeIePresent)
+    {
+
+
+        stream.add((char *)"IE - ratType:");
+        stream.endOfLine();
+        RatTypeIe ratType=
+        dynamic_cast<
+        RatTypeIe&>(GtpV2IeFactory::getInstance().getIeObject(RatTypeIeType));
+        ratType.displayRatTypeIe_v(data.ratType, stream);
+
+    }
+    if (data.indicationFlagsIePresent)
+    {
+
+
+        stream.add((char *)"IE - indicationFlags:");
+        stream.endOfLine();
+        IndicationIe indication=
+        dynamic_cast<
+        IndicationIe&>(GtpV2IeFactory::getInstance().getIeObject(IndicationIeType));
+        indication.displayIndicationIe_v(data.indicationFlags, stream);
+
+    }
+    if (data.senderFTeidForControlPlaneIePresent)
+    {
+
+
+        stream.add((char *)"IE - senderFTeidForControlPlane:");
+        stream.endOfLine();
+        FTeidIe fTeid=
+        dynamic_cast<
+        FTeidIe&>(GtpV2IeFactory::getInstance().getIeObject(FTeidIeType));
+        fTeid.displayFTeidIe_v(data.senderFTeidForControlPlane, stream);
+
+    }
+    if (data.aggregateMaximumBitRateIePresent)
+    {
+
+
+        stream.add((char *)"IE - aggregateMaximumBitRate:");
+        stream.endOfLine();
+        AmbrIe ambr=
+        dynamic_cast<
+        AmbrIe&>(GtpV2IeFactory::getInstance().getIeObject(AmbrIeType));
+        ambr.displayAmbrIe_v(data.aggregateMaximumBitRate, stream);
+
+    }
+    if (data.delayDownlinkPacketNotificationRequestIePresent)
+    {
+
+
+        stream.add((char *)"IE - delayDownlinkPacketNotificationRequest:");
+        stream.endOfLine();
+        DelayValueIe delayValue=
+        dynamic_cast<
+        DelayValueIe&>(GtpV2IeFactory::getInstance().getIeObject(DelayValueIeType));
+        delayValue.displayDelayValueIe_v(data.delayDownlinkPacketNotificationRequest, stream);
+
+    }
+
+    Uint8 displayCount;
+    
+    displayCount = data.bearerContextsToBeModifiedCount;
+    if (displayCount > 11)
+    {
+        stream.add((char *)"Invalid data more than 11 instances");
+        stream.endOfLine();
+        stream.add((char *)"Displaying only 11");
+        stream.endOfLine();
+        displayCount = 11;
+    }
+    for (Uint8 i = 0; i < displayCount; i++)
+    {
+        stream.add((char *)"IE -  bearerContextsToBeModified:");
+        stream.endOfLine();
+        BearerContextIe bearerContext=
+        dynamic_cast<
+        BearerContextIe&>(GtpV2IeFactory::getInstance().getIeObject(BearerContextIeType));
+                BearerContextsToBeModifiedInModifyBearerRequest groupedIeInstance =
+        dynamic_cast<
+        BearerContextsToBeModifiedInModifyBearerRequest&>(bearerContext.getGroupedIe(msgType, 0));
+        groupedIeInstance.displayBearerContextsToBeModifiedInModifyBearerRequestData_v(data.bearerContextsToBeModified[i], stream);
+    }
+
+    
+
+    
+    displayCount = data.bearerContextsToBeRemovedCount;
+    if (displayCount > 11)
+    {
+        stream.add((char *)"Invalid data more than 11 instances");
+        stream.endOfLine();
+        stream.add((char *)"Displaying only 11");
+        stream.endOfLine();
+        displayCount = 11;
+    }
+    for (Uint8 i = 0; i < displayCount; i++)
+    {
+        stream.add((char *)"IE -  bearerContextsToBeRemoved:");
+        stream.endOfLine();
+        BearerContextIe bearerContext=
+        dynamic_cast<
+        BearerContextIe&>(GtpV2IeFactory::getInstance().getIeObject(BearerContextIeType));
+                BearerContextsToBeRemovedInModifyBearerRequest groupedIeInstance =
+        dynamic_cast<
+        BearerContextsToBeRemovedInModifyBearerRequest&>(bearerContext.getGroupedIe(msgType, 1));
+        groupedIeInstance.displayBearerContextsToBeRemovedInModifyBearerRequestData_v(data.bearerContextsToBeRemoved[i], stream);
+    }
+
+    
+
+    
+    if (data.recoveryIePresent)
+    {
+
+
+        stream.add((char *)"IE - recovery:");
+        stream.endOfLine();
+        RecoveryIe recovery=
+        dynamic_cast<
+        RecoveryIe&>(GtpV2IeFactory::getInstance().getIeObject(RecoveryIeType));
+        recovery.displayRecoveryIe_v(data.recovery, stream);
+
+    }
+    if (data.ueTimeZoneIePresent)
+    {
+
+
+        stream.add((char *)"IE - ueTimeZone:");
+        stream.endOfLine();
+        UeTimeZoneIe ueTimeZone=
+        dynamic_cast<
+        UeTimeZoneIe&>(GtpV2IeFactory::getInstance().getIeObject(UeTimeZoneIeType));
+        ueTimeZone.displayUeTimeZoneIe_v(data.ueTimeZone, stream);
+
+    }
+    if (data.mmeFqCsidIePresent)
+    {
+
+
+        stream.add((char *)"IE - mmeFqCsid:");
+        stream.endOfLine();
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        fqCsid.displayFqCsidIe_v(data.mmeFqCsid, stream);
+
+    }
+    if (data.sgwFqCsidIePresent)
+    {
+
+
+        stream.add((char *)"IE - sgwFqCsid:");
+        stream.endOfLine();
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        fqCsid.displayFqCsidIe_v(data.sgwFqCsid, stream);
+
+    }
+    if (data.userCsgInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - userCsgInformation:");
+        stream.endOfLine();
+        UciIe uci=
+        dynamic_cast<
+        UciIe&>(GtpV2IeFactory::getInstance().getIeObject(UciIeType));
+        uci.displayUciIe_v(data.userCsgInformation, stream);
+
+    }
+    if (data.ueLocalIpAddressIePresent)
+    {
+
+
+        stream.add((char *)"IE - ueLocalIpAddress:");
+        stream.endOfLine();
+        IpAddressIe ipAddress=
+        dynamic_cast<
+        IpAddressIe&>(GtpV2IeFactory::getInstance().getIeObject(IpAddressIeType));
+        ipAddress.displayIpAddressIe_v(data.ueLocalIpAddress, stream);
+
+    }
+    if (data.ueUdpPortIePresent)
+    {
+
+
+        stream.add((char *)"IE - ueUdpPort:");
+        stream.endOfLine();
+        PortNumberIe portNumber=
+        dynamic_cast<
+        PortNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(PortNumberIeType));
+        portNumber.displayPortNumberIe_v(data.ueUdpPort, stream);
+
+    }
+    if (data.mmeS4SgsnLdnIePresent)
+    {
+
+
+        stream.add((char *)"IE - mmeS4SgsnLdn:");
+        stream.endOfLine();
+        LocalDistinguishedNameIe localDistinguishedName=
+        dynamic_cast<
+        LocalDistinguishedNameIe&>(GtpV2IeFactory::getInstance().getIeObject(LocalDistinguishedNameIeType));
+        localDistinguishedName.displayLocalDistinguishedNameIe_v(data.mmeS4SgsnLdn, stream);
+
+    }
+    if (data.sgwLdnIePresent)
+    {
+
+
+        stream.add((char *)"IE - sgwLdn:");
+        stream.endOfLine();
+        LocalDistinguishedNameIe localDistinguishedName=
+        dynamic_cast<
+        LocalDistinguishedNameIe&>(GtpV2IeFactory::getInstance().getIeObject(LocalDistinguishedNameIeType));
+        localDistinguishedName.displayLocalDistinguishedNameIe_v(data.sgwLdn, stream);
+
+    }
+    if (data.hNbLocalIpAddressIePresent)
+    {
+
+
+        stream.add((char *)"IE - hNbLocalIpAddress:");
+        stream.endOfLine();
+        IpAddressIe ipAddress=
+        dynamic_cast<
+        IpAddressIe&>(GtpV2IeFactory::getInstance().getIeObject(IpAddressIeType));
+        ipAddress.displayIpAddressIe_v(data.hNbLocalIpAddress, stream);
+
+    }
+    if (data.hNbUdpPortIePresent)
+    {
+
+
+        stream.add((char *)"IE - hNbUdpPort:");
+        stream.endOfLine();
+        PortNumberIe portNumber=
+        dynamic_cast<
+        PortNumberIe&>(GtpV2IeFactory::getInstance().getIeObject(PortNumberIeType));
+        portNumber.displayPortNumberIe_v(data.hNbUdpPort, stream);
+
+    }
+    if (data.mmeS4SgsnIdentifierIePresent)
+    {
+
+
+        stream.add((char *)"IE - mmeS4SgsnIdentifier:");
+        stream.endOfLine();
+        IpAddressIe ipAddress=
+        dynamic_cast<
+        IpAddressIe&>(GtpV2IeFactory::getInstance().getIeObject(IpAddressIeType));
+        ipAddress.displayIpAddressIe_v(data.mmeS4SgsnIdentifier, stream);
+
+    }
+    if (data.cnOperatorSelectionEntityIePresent)
+    {
+
+
+        stream.add((char *)"IE - cnOperatorSelectionEntity:");
+        stream.endOfLine();
+        CnOperatorSelectionEntityIe cnOperatorSelectionEntity=
+        dynamic_cast<
+        CnOperatorSelectionEntityIe&>(GtpV2IeFactory::getInstance().getIeObject(CnOperatorSelectionEntityIeType));
+        cnOperatorSelectionEntity.displayCnOperatorSelectionEntityIe_v(data.cnOperatorSelectionEntity, stream);
+
+    }
+    if (data.mmeS4SgsnsOverloadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - mmeS4SgsnsOverloadControlInformation:");
+        stream.endOfLine();
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+            MmeS4SgsnsOverloadControlInformationInModifyBearerRequest groupedIeInstance =
+        dynamic_cast<
+        MmeS4SgsnsOverloadControlInformationInModifyBearerRequest&>(overloadControlInformation.getGroupedIe(msgType, 0));
+        groupedIeInstance.displayMmeS4SgsnsOverloadControlInformationInModifyBearerRequestData_v(data.mmeS4SgsnsOverloadControlInformation, stream);
+
+    }
+    if (data.sgwsOverloadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - sgwsOverloadControlInformation:");
+        stream.endOfLine();
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+            SgwsOverloadControlInformationInModifyBearerRequest groupedIeInstance =
+        dynamic_cast<
+        SgwsOverloadControlInformationInModifyBearerRequest&>(overloadControlInformation.getGroupedIe(msgType, 1));
+        groupedIeInstance.displaySgwsOverloadControlInformationInModifyBearerRequestData_v(data.sgwsOverloadControlInformation, stream);
+
+    }
+    if (data.epdgsOverloadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - epdgsOverloadControlInformation:");
+        stream.endOfLine();
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+            EpdgsOverloadControlInformationInModifyBearerRequest groupedIeInstance =
+        dynamic_cast<
+        EpdgsOverloadControlInformationInModifyBearerRequest&>(overloadControlInformation.getGroupedIe(msgType, 2));
+        groupedIeInstance.displayEpdgsOverloadControlInformationInModifyBearerRequestData_v(data.epdgsOverloadControlInformation, stream);
+
+    }
+    if (data.servingPlmnRateControlIePresent)
+    {
+
+
+        stream.add((char *)"IE - servingPlmnRateControl:");
+        stream.endOfLine();
+        ServingPlmnRateControlIe servingPlmnRateControl=
+        dynamic_cast<
+        ServingPlmnRateControlIe&>(GtpV2IeFactory::getInstance().getIeObject(ServingPlmnRateControlIeType));
+        servingPlmnRateControl.displayServingPlmnRateControlIe_v(data.servingPlmnRateControl, stream);
+
+    }
+    if (data.moExceptionDataCounterIePresent)
+    {
+
+
+        stream.add((char *)"IE - moExceptionDataCounter:");
+        stream.endOfLine();
+        CounterIe counter=
+        dynamic_cast<
+        CounterIe&>(GtpV2IeFactory::getInstance().getIeObject(CounterIeType));
+        counter.displayCounterIe_v(data.moExceptionDataCounter, stream);
+
+    }
+    if (data.imsiIePresent)
+    {
+
+
+        stream.add((char *)"IE - imsi:");
+        stream.endOfLine();
+        ImsiIe imsi=
+        dynamic_cast<
+        ImsiIe&>(GtpV2IeFactory::getInstance().getIeObject(ImsiIeType));
+        imsi.displayImsiIe_v(data.imsi, stream);
+
+    }
+    if (data.userLocationInformationForSgwIePresent)
+    {
+
+
+        stream.add((char *)"IE - userLocationInformationForSgw:");
+        stream.endOfLine();
+        UliIe uli=
+        dynamic_cast<
+        UliIe&>(GtpV2IeFactory::getInstance().getIeObject(UliIeType));
+        uli.displayUliIe_v(data.userLocationInformationForSgw, stream);
+
+    }
+    if (data.wlanLocationInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - wlanLocationInformation:");
+        stream.endOfLine();
+        TwanIdentifierIe twanIdentifier=
+        dynamic_cast<
+        TwanIdentifierIe&>(GtpV2IeFactory::getInstance().getIeObject(TwanIdentifierIeType));
+        twanIdentifier.displayTwanIdentifierIe_v(data.wlanLocationInformation, stream);
+
+    }
+    if (data.wlanLocationTimestampIePresent)
+    {
+
+
+        stream.add((char *)"IE - wlanLocationTimestamp:");
+        stream.endOfLine();
+        TwanIdentifierTimestampIe twanIdentifierTimestamp=
+        dynamic_cast<
+        TwanIdentifierTimestampIe&>(GtpV2IeFactory::getInstance().getIeObject(TwanIdentifierTimestampIeType));
+        twanIdentifierTimestamp.displayTwanIdentifierTimestampIe_v(data.wlanLocationTimestamp, stream);
+
+    }
+    if (data.secondaryRatUsageDataReportIePresent)
+    {
+
+
+        stream.add((char *)"IE - secondaryRatUsageDataReport:");
+        stream.endOfLine();
+        SecondaryRatUsageDataReportIe secondaryRatUsageDataReport=
+        dynamic_cast<
+        SecondaryRatUsageDataReportIe&>(GtpV2IeFactory::getInstance().getIeObject(SecondaryRatUsageDataReportIeType));
+        secondaryRatUsageDataReport.displaySecondaryRatUsageDataReportIe_v(data.secondaryRatUsageDataReport, stream);
+
+    }
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
diff --git a/src/gtpV2Codec/msgClasses/modifyBearerRequestMsg.h b/src/gtpV2Codec/msgClasses/modifyBearerRequestMsg.h
new file mode 100644
index 0000000..2a06175
--- /dev/null
+++ b/src/gtpV2Codec/msgClasses/modifyBearerRequestMsg.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/msgtemplate.h.tt>
+ ******************************************************************************/
+#ifndef MODIFYBEARERREQUESTMSG_H_
+#define MODIFYBEARERREQUESTMSG_H_
+
+#include <set>
+#include "manual/gtpV2Message.h"
+#include <msgBuffer.h>
+#include <debug.h>
+#include "gtpV2MsgDataTypes.h"
+
+
+class ModifyBearerRequestMsg:public GtpV2Message
+{
+public:
+    ModifyBearerRequestMsg();
+    virtual ~ModifyBearerRequestMsg();
+    bool encodeModifyBearerRequestMsg(MsgBuffer &buffer, ModifyBearerRequestMsgData const &data);
+
+    bool decodeModifyBearerRequestMsg (MsgBuffer &buffer, ModifyBearerRequestMsgData& data, Uint16 length);
+
+    void displayModifyBearerRequestMsgData_v(ModifyBearerRequestMsgData const &data, Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/msgClasses/modifyBearerResponseMsg.cpp b/src/gtpV2Codec/msgClasses/modifyBearerResponseMsg.cpp
new file mode 100644
index 0000000..e6303de
--- /dev/null
+++ b/src/gtpV2Codec/msgClasses/modifyBearerResponseMsg.cpp
@@ -0,0 +1,1855 @@
+/*
+ * 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/msgtemplate.cpp.tt>
+ ******************************************************************************/ 
+
+#include "modifyBearerResponseMsg.h"
+#include "../ieClasses/manual/gtpV2Ie.h"
+#include "../ieClasses/gtpV2IeFactory.h"
+#include "../ieClasses/ebiIe.h"
+#include "../ieClasses/bearerContextIe.h"
+#include "../ieClasses/bearerContextsModifiedInModifyBearerResponse.h"
+#include "../ieClasses/bearerContextIe.h"
+#include "../ieClasses/bearerContextsMarkedForRemovalInModifyBearerResponse.h"
+#include "../ieClasses/indicationIe.h"
+#include "../ieClasses/causeIe.h"
+#include "../ieClasses/apnRestrictionIe.h"
+#include "../ieClasses/pcoIe.h"
+#include "../ieClasses/changeReportingActionIe.h"
+#include "../ieClasses/csgInformationReportingActionIe.h"
+#include "../ieClasses/henbInformationReportingIe.h"
+#include "../ieClasses/fqdnIe.h"
+#include "../ieClasses/ipAddressIe.h"
+#include "../ieClasses/fqCsidIe.h"
+#include "../ieClasses/fqCsidIe.h"
+#include "../ieClasses/recoveryIe.h"
+#include "../ieClasses/localDistinguishedNameIe.h"
+#include "../ieClasses/localDistinguishedNameIe.h"
+#include "../ieClasses/presenceReportingAreaActionIe.h"
+#include "../ieClasses/loadControlInformationIe.h"
+#include "../ieClasses/pgwsNodeLevelLoadControlInformationInModifyBearerResponse.h"
+#include "../ieClasses/loadControlInformationIe.h"
+#include "../ieClasses/pgwsApnLevelLoadControlInformationInModifyBearerResponse.h"
+#include "../ieClasses/loadControlInformationIe.h"
+#include "../ieClasses/sgwsNodeLevelLoadControlInformationInModifyBearerResponse.h"
+#include "../ieClasses/overloadControlInformationIe.h"
+#include "../ieClasses/pgwsOverloadControlInformationInModifyBearerResponse.h"
+#include "../ieClasses/overloadControlInformationIe.h"
+#include "../ieClasses/sgwsOverloadControlInformationInModifyBearerResponse.h"
+#include "../ieClasses/chargingIdIe.h"
+#include "../ieClasses/msisdnIe.h"
+
+ModifyBearerResponseMsg::ModifyBearerResponseMsg()
+{
+    msgType = ModifyBearerResponseMsgType;
+    Uint16 mandIe;
+    mandIe = CauseIeType;
+    mandIe = (mandIe << 8) | 0; // cause
+    mandatoryIeSet.insert(mandIe);
+}
+
+ModifyBearerResponseMsg::~ModifyBearerResponseMsg()
+{
+
+}
+
+bool ModifyBearerResponseMsg::encodeModifyBearerResponseMsg(MsgBuffer &buffer,
+                        ModifyBearerResponseMsgData
+							const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+    if (data.linkedEpsBearerIdIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = EbiIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        EbiIe ebi=
+        dynamic_cast<
+        EbiIe&>(GtpV2IeFactory::getInstance().getIeObject(EbiIeType));
+        rc = ebi.encodeEbiIe(buffer, data.linkedEpsBearerId);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: linkedEpsBearerId\n");
+            return false;
+        }
+    }
+
+        // First validate if the applicatoin provided more than the expected cardinality
+    if (data.bearerContextsModifiedCount > 11)
+    {
+        errorStream.add((char *)"Number of entries of bearerContextsModified exceeded\n");
+        errorStream.add((char *)"Expected count: 11 Received count: ");
+        errorStream.add((char *)"data.bearerContextsModifiedCount");
+        errorStream.endOfLine();
+        return false;
+    }
+    for (Uint8 i = 0; i < data.bearerContextsModifiedCount; i++)
+    {
+        // Encode the Ie Header
+        header.ieType = BearerContextIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        BearerContextIe bearerContext=
+        dynamic_cast<
+        BearerContextIe&>(GtpV2IeFactory::getInstance().
+        getIeObject(BearerContextIeType));
+        BearerContextsModifiedInModifyBearerResponse groupedIeInstance = dynamic_cast<BearerContextsModifiedInModifyBearerResponse&>(bearerContext.getGroupedIe(msgType, 0));
+        rc = groupedIeInstance.encodeBearerContextsModifiedInModifyBearerResponse(buffer, data.bearerContextsModified[i]);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+    }
+
+    if (!(rc))
+    { 
+        errorStream.add((char *)"Failed to encode IE: bearerContextsModified\n");
+        return false;
+    }
+
+        // First validate if the applicatoin provided more than the expected cardinality
+    if (data.bearerContextsMarkedForRemovalCount > 11)
+    {
+        errorStream.add((char *)"Number of entries of bearerContextsMarkedForRemoval exceeded\n");
+        errorStream.add((char *)"Expected count: 11 Received count: ");
+        errorStream.add((char *)"data.bearerContextsMarkedForRemovalCount");
+        errorStream.endOfLine();
+        return false;
+    }
+    for (Uint8 i = 0; i < data.bearerContextsMarkedForRemovalCount; i++)
+    {
+        // Encode the Ie Header
+        header.ieType = BearerContextIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        BearerContextIe bearerContext=
+        dynamic_cast<
+        BearerContextIe&>(GtpV2IeFactory::getInstance().
+        getIeObject(BearerContextIeType));
+        BearerContextsMarkedForRemovalInModifyBearerResponse groupedIeInstance = dynamic_cast<BearerContextsMarkedForRemovalInModifyBearerResponse&>(bearerContext.getGroupedIe(msgType, 1));
+        rc = groupedIeInstance.encodeBearerContextsMarkedForRemovalInModifyBearerResponse(buffer, data.bearerContextsMarkedForRemoval[i]);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+    }
+
+    if (!(rc))
+    { 
+        errorStream.add((char *)"Failed to encode IE: bearerContextsMarkedForRemoval\n");
+        return false;
+    }
+
+    if (data.indicationFlagsIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = IndicationIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        IndicationIe indication=
+        dynamic_cast<
+        IndicationIe&>(GtpV2IeFactory::getInstance().getIeObject(IndicationIeType));
+        rc = indication.encodeIndicationIe(buffer, data.indicationFlags);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: indicationFlags\n");
+            return false;
+        }
+    }
+
+    
+    // Encode the Ie Header
+    header.ieType = CauseIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    CauseIe cause=
+    dynamic_cast<
+    CauseIe&>(GtpV2IeFactory::getInstance().getIeObject(CauseIeType));
+    rc = cause.encodeCauseIe(buffer, data.cause);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+
+    if (!(rc))
+    { 
+        errorStream.add((char *)"Failed to encode IE: cause\n");
+        return false;
+    }
+
+    if (data.apnRestrictionIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = ApnRestrictionIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        ApnRestrictionIe apnRestriction=
+        dynamic_cast<
+        ApnRestrictionIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnRestrictionIeType));
+        rc = apnRestriction.encodeApnRestrictionIe(buffer, data.apnRestriction);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: apnRestriction\n");
+            return false;
+        }
+    }
+
+    if (data.protocolConfigurationOptionsIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = PcoIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        PcoIe pco=
+        dynamic_cast<
+        PcoIe&>(GtpV2IeFactory::getInstance().getIeObject(PcoIeType));
+        rc = pco.encodePcoIe(buffer, data.protocolConfigurationOptions);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: protocolConfigurationOptions\n");
+            return false;
+        }
+    }
+
+    if (data.changeReportingActionIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = ChangeReportingActionIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        ChangeReportingActionIe changeReportingAction=
+        dynamic_cast<
+        ChangeReportingActionIe&>(GtpV2IeFactory::getInstance().getIeObject(ChangeReportingActionIeType));
+        rc = changeReportingAction.encodeChangeReportingActionIe(buffer, data.changeReportingAction);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: changeReportingAction\n");
+            return false;
+        }
+    }
+
+    if (data.csgInformationReportingActionIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = CsgInformationReportingActionIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        CsgInformationReportingActionIe csgInformationReportingAction=
+        dynamic_cast<
+        CsgInformationReportingActionIe&>(GtpV2IeFactory::getInstance().getIeObject(CsgInformationReportingActionIeType));
+        rc = csgInformationReportingAction.encodeCsgInformationReportingActionIe(buffer, data.csgInformationReportingAction);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: csgInformationReportingAction\n");
+            return false;
+        }
+    }
+
+    if (data.hNbInformationReportingIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = HenbInformationReportingIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        HenbInformationReportingIe henbInformationReporting=
+        dynamic_cast<
+        HenbInformationReportingIe&>(GtpV2IeFactory::getInstance().getIeObject(HenbInformationReportingIeType));
+        rc = henbInformationReporting.encodeHenbInformationReportingIe(buffer, data.hNbInformationReporting);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: hNbInformationReporting\n");
+            return false;
+        }
+    }
+
+    if (data.chargingGatewayNameIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FqdnIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FqdnIe fqdn=
+        dynamic_cast<
+        FqdnIe&>(GtpV2IeFactory::getInstance().getIeObject(FqdnIeType));
+        rc = fqdn.encodeFqdnIe(buffer, data.chargingGatewayName);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: chargingGatewayName\n");
+            return false;
+        }
+    }
+
+    if (data.chargingGatewayAddressIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = IpAddressIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        IpAddressIe ipAddress=
+        dynamic_cast<
+        IpAddressIe&>(GtpV2IeFactory::getInstance().getIeObject(IpAddressIeType));
+        rc = ipAddress.encodeIpAddressIe(buffer, data.chargingGatewayAddress);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: chargingGatewayAddress\n");
+            return false;
+        }
+    }
+
+    if (data.pgwFqCsidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FqCsidIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        rc = fqCsid.encodeFqCsidIe(buffer, data.pgwFqCsid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: pgwFqCsid\n");
+            return false;
+        }
+    }
+
+    if (data.sgwFqCsidIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = FqCsidIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        rc = fqCsid.encodeFqCsidIe(buffer, data.sgwFqCsid);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: sgwFqCsid\n");
+            return false;
+        }
+    }
+
+    if (data.recoveryIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = RecoveryIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        RecoveryIe recovery=
+        dynamic_cast<
+        RecoveryIe&>(GtpV2IeFactory::getInstance().getIeObject(RecoveryIeType));
+        rc = recovery.encodeRecoveryIe(buffer, data.recovery);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: recovery\n");
+            return false;
+        }
+    }
+
+    if (data.sgwLdnIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = LocalDistinguishedNameIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        LocalDistinguishedNameIe localDistinguishedName=
+        dynamic_cast<
+        LocalDistinguishedNameIe&>(GtpV2IeFactory::getInstance().getIeObject(LocalDistinguishedNameIeType));
+        rc = localDistinguishedName.encodeLocalDistinguishedNameIe(buffer, data.sgwLdn);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: sgwLdn\n");
+            return false;
+        }
+    }
+
+    if (data.pgwLdnIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = LocalDistinguishedNameIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        LocalDistinguishedNameIe localDistinguishedName=
+        dynamic_cast<
+        LocalDistinguishedNameIe&>(GtpV2IeFactory::getInstance().getIeObject(LocalDistinguishedNameIeType));
+        rc = localDistinguishedName.encodeLocalDistinguishedNameIe(buffer, data.pgwLdn);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: pgwLdn\n");
+            return false;
+        }
+    }
+
+    if (data.presenceReportingAreaActionIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = PresenceReportingAreaActionIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        PresenceReportingAreaActionIe presenceReportingAreaAction=
+        dynamic_cast<
+        PresenceReportingAreaActionIe&>(GtpV2IeFactory::getInstance().getIeObject(PresenceReportingAreaActionIeType));
+        rc = presenceReportingAreaAction.encodePresenceReportingAreaActionIe(buffer, data.presenceReportingAreaAction);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: presenceReportingAreaAction\n");
+            return false;
+        }
+    }
+
+    if (data.pgwsNodeLevelLoadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = LoadControlInformationIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        LoadControlInformationIe loadControlInformation=
+        dynamic_cast<
+        LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+        PgwsNodeLevelLoadControlInformationInModifyBearerResponse groupedIeInstance =
+        dynamic_cast<
+         PgwsNodeLevelLoadControlInformationInModifyBearerResponse&>(loadControlInformation.getGroupedIe(msgType, 0));
+        rc = groupedIeInstance.encodePgwsNodeLevelLoadControlInformationInModifyBearerResponse(buffer, data.pgwsNodeLevelLoadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: pgwsNodeLevelLoadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.pgwsApnLevelLoadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = LoadControlInformationIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        LoadControlInformationIe loadControlInformation=
+        dynamic_cast<
+        LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+        PgwsApnLevelLoadControlInformationInModifyBearerResponse groupedIeInstance =
+        dynamic_cast<
+         PgwsApnLevelLoadControlInformationInModifyBearerResponse&>(loadControlInformation.getGroupedIe(msgType, 1));
+        rc = groupedIeInstance.encodePgwsApnLevelLoadControlInformationInModifyBearerResponse(buffer, data.pgwsApnLevelLoadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: pgwsApnLevelLoadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.sgwsNodeLevelLoadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = LoadControlInformationIeType;
+        header.instance = 2;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        LoadControlInformationIe loadControlInformation=
+        dynamic_cast<
+        LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+        SgwsNodeLevelLoadControlInformationInModifyBearerResponse groupedIeInstance =
+        dynamic_cast<
+         SgwsNodeLevelLoadControlInformationInModifyBearerResponse&>(loadControlInformation.getGroupedIe(msgType, 2));
+        rc = groupedIeInstance.encodeSgwsNodeLevelLoadControlInformationInModifyBearerResponse(buffer, data.sgwsNodeLevelLoadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: sgwsNodeLevelLoadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.pgwsOverloadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = OverloadControlInformationIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+        PgwsOverloadControlInformationInModifyBearerResponse groupedIeInstance =
+        dynamic_cast<
+         PgwsOverloadControlInformationInModifyBearerResponse&>(overloadControlInformation.getGroupedIe(msgType, 0));
+        rc = groupedIeInstance.encodePgwsOverloadControlInformationInModifyBearerResponse(buffer, data.pgwsOverloadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: pgwsOverloadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.sgwsOverloadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = OverloadControlInformationIeType;
+        header.instance = 1;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+        SgwsOverloadControlInformationInModifyBearerResponse groupedIeInstance =
+        dynamic_cast<
+         SgwsOverloadControlInformationInModifyBearerResponse&>(overloadControlInformation.getGroupedIe(msgType, 1));
+        rc = groupedIeInstance.encodeSgwsOverloadControlInformationInModifyBearerResponse(buffer, data.sgwsOverloadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: sgwsOverloadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.pdnConnectionChargingIdIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = ChargingIdIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        ChargingIdIe chargingId=
+        dynamic_cast<
+        ChargingIdIe&>(GtpV2IeFactory::getInstance().getIeObject(ChargingIdIeType));
+        rc = chargingId.encodeChargingIdIe(buffer, data.pdnConnectionChargingId);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: pdnConnectionChargingId\n");
+            return false;
+        }
+    }
+
+    if (data.msisdnIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = MsisdnIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        MsisdnIe msisdn=
+        dynamic_cast<
+        MsisdnIe&>(GtpV2IeFactory::getInstance().getIeObject(MsisdnIeType));
+        rc = msisdn.encodeMsisdnIe(buffer, data.msisdn);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: msisdn\n");
+            return false;
+        }
+    }
+    return rc;
+
+}
+
+bool ModifyBearerResponseMsg::decodeModifyBearerResponseMsg(MsgBuffer &buffer,
+ ModifyBearerResponseMsgData 
+ &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+  
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+
+        switch (ieHeader.ieType){
+     
+            case EbiIeType:
+            {
+                EbiIe ieObject =
+                dynamic_cast<
+                EbiIe&>(GtpV2IeFactory::getInstance().getIeObject(EbiIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeEbiIe(buffer, data.linkedEpsBearerId, ieHeader.length);
+
+                    data.linkedEpsBearerIdIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: linkedEpsBearerId\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case BearerContextIeType:
+            {
+                BearerContextIe ieObject =
+                dynamic_cast<
+                BearerContextIe&>(GtpV2IeFactory::getInstance().getIeObject(BearerContextIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					// First check if we have enough space left to decode and store this instance
+                    if (data.bearerContextsModifiedCount == 11)
+                    {
+                        errorStream.add((char *)"More than 11 instances of bearerContextsModified received\n");
+                        return false;
+                    }
+                    BearerContextsModifiedInModifyBearerResponse groupedIeInstance =
+                    dynamic_cast<
+                    BearerContextsModifiedInModifyBearerResponse&>(ieObject.getGroupedIe(msgType, 0));
+                    rc = groupedIeInstance.decodeBearerContextsModifiedInModifyBearerResponse(buffer,
+                    data.bearerContextsModified[data.bearerContextsModifiedCount], ieHeader.length);
+                    data.bearerContextsModifiedCount++; // TODO Count validation
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: bearerContextsModified\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					// First check if we have enough space left to decode and store this instance
+                    if (data.bearerContextsMarkedForRemovalCount == 11)
+                    {
+                        errorStream.add((char *)"More than 11 instances of bearerContextsMarkedForRemoval received\n");
+                        return false;
+                    }
+                    BearerContextsMarkedForRemovalInModifyBearerResponse groupedIeInstance =
+                    dynamic_cast<
+                    BearerContextsMarkedForRemovalInModifyBearerResponse&>(ieObject.getGroupedIe(msgType, 1));
+                    rc = groupedIeInstance.decodeBearerContextsMarkedForRemovalInModifyBearerResponse(buffer,
+                    data.bearerContextsMarkedForRemoval[data.bearerContextsMarkedForRemovalCount], ieHeader.length);
+                    data.bearerContextsMarkedForRemovalCount++; // TODO Count validation
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: bearerContextsMarkedForRemoval\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case IndicationIeType:
+            {
+                IndicationIe ieObject =
+                dynamic_cast<
+                IndicationIe&>(GtpV2IeFactory::getInstance().getIeObject(IndicationIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeIndicationIe(buffer, data.indicationFlags, ieHeader.length);
+
+                    data.indicationFlagsIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: indicationFlags\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case CauseIeType:
+            {
+                CauseIe ieObject =
+                dynamic_cast<
+                CauseIe&>(GtpV2IeFactory::getInstance().getIeObject(CauseIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeCauseIe(buffer, data.cause, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: cause\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case ApnRestrictionIeType:
+            {
+                ApnRestrictionIe ieObject =
+                dynamic_cast<
+                ApnRestrictionIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnRestrictionIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeApnRestrictionIe(buffer, data.apnRestriction, ieHeader.length);
+
+                    data.apnRestrictionIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: apnRestriction\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case PcoIeType:
+            {
+                PcoIe ieObject =
+                dynamic_cast<
+                PcoIe&>(GtpV2IeFactory::getInstance().getIeObject(PcoIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodePcoIe(buffer, data.protocolConfigurationOptions, ieHeader.length);
+
+                    data.protocolConfigurationOptionsIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: protocolConfigurationOptions\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case ChangeReportingActionIeType:
+            {
+                ChangeReportingActionIe ieObject =
+                dynamic_cast<
+                ChangeReportingActionIe&>(GtpV2IeFactory::getInstance().getIeObject(ChangeReportingActionIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeChangeReportingActionIe(buffer, data.changeReportingAction, ieHeader.length);
+
+                    data.changeReportingActionIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: changeReportingAction\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case CsgInformationReportingActionIeType:
+            {
+                CsgInformationReportingActionIe ieObject =
+                dynamic_cast<
+                CsgInformationReportingActionIe&>(GtpV2IeFactory::getInstance().getIeObject(CsgInformationReportingActionIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeCsgInformationReportingActionIe(buffer, data.csgInformationReportingAction, ieHeader.length);
+
+                    data.csgInformationReportingActionIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: csgInformationReportingAction\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case HenbInformationReportingIeType:
+            {
+                HenbInformationReportingIe ieObject =
+                dynamic_cast<
+                HenbInformationReportingIe&>(GtpV2IeFactory::getInstance().getIeObject(HenbInformationReportingIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeHenbInformationReportingIe(buffer, data.hNbInformationReporting, ieHeader.length);
+
+                    data.hNbInformationReportingIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: hNbInformationReporting\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case FqdnIeType:
+            {
+                FqdnIe ieObject =
+                dynamic_cast<
+                FqdnIe&>(GtpV2IeFactory::getInstance().getIeObject(FqdnIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeFqdnIe(buffer, data.chargingGatewayName, ieHeader.length);
+
+                    data.chargingGatewayNameIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: chargingGatewayName\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case IpAddressIeType:
+            {
+                IpAddressIe ieObject =
+                dynamic_cast<
+                IpAddressIe&>(GtpV2IeFactory::getInstance().getIeObject(IpAddressIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeIpAddressIe(buffer, data.chargingGatewayAddress, ieHeader.length);
+
+                    data.chargingGatewayAddressIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: chargingGatewayAddress\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case FqCsidIeType:
+            {
+                FqCsidIe ieObject =
+                dynamic_cast<
+                FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeFqCsidIe(buffer, data.pgwFqCsid, ieHeader.length);
+
+                    data.pgwFqCsidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: pgwFqCsid\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					rc = ieObject.decodeFqCsidIe(buffer, data.sgwFqCsid, ieHeader.length);
+
+                    data.sgwFqCsidIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: sgwFqCsid\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case RecoveryIeType:
+            {
+                RecoveryIe ieObject =
+                dynamic_cast<
+                RecoveryIe&>(GtpV2IeFactory::getInstance().getIeObject(RecoveryIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeRecoveryIe(buffer, data.recovery, ieHeader.length);
+
+                    data.recoveryIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: recovery\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case LocalDistinguishedNameIeType:
+            {
+                LocalDistinguishedNameIe ieObject =
+                dynamic_cast<
+                LocalDistinguishedNameIe&>(GtpV2IeFactory::getInstance().getIeObject(LocalDistinguishedNameIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeLocalDistinguishedNameIe(buffer, data.sgwLdn, ieHeader.length);
+
+                    data.sgwLdnIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: sgwLdn\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					rc = ieObject.decodeLocalDistinguishedNameIe(buffer, data.pgwLdn, ieHeader.length);
+
+                    data.pgwLdnIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: pgwLdn\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case PresenceReportingAreaActionIeType:
+            {
+                PresenceReportingAreaActionIe ieObject =
+                dynamic_cast<
+                PresenceReportingAreaActionIe&>(GtpV2IeFactory::getInstance().getIeObject(PresenceReportingAreaActionIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodePresenceReportingAreaActionIe(buffer, data.presenceReportingAreaAction, ieHeader.length);
+
+                    data.presenceReportingAreaActionIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: presenceReportingAreaAction\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case LoadControlInformationIeType:
+            {
+                LoadControlInformationIe ieObject =
+                dynamic_cast<
+                LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					PgwsNodeLevelLoadControlInformationInModifyBearerResponse groupedIeInstance =
+					dynamic_cast<
+					PgwsNodeLevelLoadControlInformationInModifyBearerResponse&>(ieObject.getGroupedIe(msgType, 0));
+					rc = groupedIeInstance.decodePgwsNodeLevelLoadControlInformationInModifyBearerResponse(buffer, data.pgwsNodeLevelLoadControlInformation, ieHeader.length);
+
+                    data.pgwsNodeLevelLoadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: pgwsNodeLevelLoadControlInformation\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					PgwsApnLevelLoadControlInformationInModifyBearerResponse groupedIeInstance =
+					dynamic_cast<
+					PgwsApnLevelLoadControlInformationInModifyBearerResponse&>(ieObject.getGroupedIe(msgType, 1));
+					rc = groupedIeInstance.decodePgwsApnLevelLoadControlInformationInModifyBearerResponse(buffer, data.pgwsApnLevelLoadControlInformation, ieHeader.length);
+
+                    data.pgwsApnLevelLoadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: pgwsApnLevelLoadControlInformation\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 2)
+                {
+					SgwsNodeLevelLoadControlInformationInModifyBearerResponse groupedIeInstance =
+					dynamic_cast<
+					SgwsNodeLevelLoadControlInformationInModifyBearerResponse&>(ieObject.getGroupedIe(msgType, 2));
+					rc = groupedIeInstance.decodeSgwsNodeLevelLoadControlInformationInModifyBearerResponse(buffer, data.sgwsNodeLevelLoadControlInformation, ieHeader.length);
+
+                    data.sgwsNodeLevelLoadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: sgwsNodeLevelLoadControlInformation\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case OverloadControlInformationIeType:
+            {
+                OverloadControlInformationIe ieObject =
+                dynamic_cast<
+                OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					PgwsOverloadControlInformationInModifyBearerResponse groupedIeInstance =
+					dynamic_cast<
+					PgwsOverloadControlInformationInModifyBearerResponse&>(ieObject.getGroupedIe(msgType, 0));
+					rc = groupedIeInstance.decodePgwsOverloadControlInformationInModifyBearerResponse(buffer, data.pgwsOverloadControlInformation, ieHeader.length);
+
+                    data.pgwsOverloadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: pgwsOverloadControlInformation\n");
+                        return false;
+                    }
+                }
+                else if(ieHeader.instance == 1)
+                {
+					SgwsOverloadControlInformationInModifyBearerResponse groupedIeInstance =
+					dynamic_cast<
+					SgwsOverloadControlInformationInModifyBearerResponse&>(ieObject.getGroupedIe(msgType, 1));
+					rc = groupedIeInstance.decodeSgwsOverloadControlInformationInModifyBearerResponse(buffer, data.sgwsOverloadControlInformation, ieHeader.length);
+
+                    data.sgwsOverloadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: sgwsOverloadControlInformation\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case ChargingIdIeType:
+            {
+                ChargingIdIe ieObject =
+                dynamic_cast<
+                ChargingIdIe&>(GtpV2IeFactory::getInstance().getIeObject(ChargingIdIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeChargingIdIe(buffer, data.pdnConnectionChargingId, ieHeader.length);
+
+                    data.pdnConnectionChargingIdIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: pdnConnectionChargingId\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case MsisdnIeType:
+            {
+                MsisdnIe ieObject =
+                dynamic_cast<
+                MsisdnIe&>(GtpV2IeFactory::getInstance().getIeObject(MsisdnIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeMsisdnIe(buffer, data.msisdn, ieHeader.length);
+
+                    data.msisdnIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: msisdn\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+
+            default:
+            {
+                // Unknown IE print error
+                errorStream.add((char *)"Unknown IE Type: ");
+                errorStream.add(ieHeader.ieType);
+                errorStream.endOfLine();
+                buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    return rc; // TODO validations
+}
+
+void ModifyBearerResponseMsg::
+displayModifyBearerResponseMsgData_v(ModifyBearerResponseMsgData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"ModifyBearerResponseMsg:");
+    stream.endOfLine();
+    stream.incrIndent();
+        
+    
+    if (data.linkedEpsBearerIdIePresent)
+    {
+
+
+        stream.add((char *)"IE - linkedEpsBearerId:");
+        stream.endOfLine();
+        EbiIe ebi=
+        dynamic_cast<
+        EbiIe&>(GtpV2IeFactory::getInstance().getIeObject(EbiIeType));
+        ebi.displayEbiIe_v(data.linkedEpsBearerId, stream);
+
+    }
+
+    Uint8 displayCount;
+    
+    displayCount = data.bearerContextsModifiedCount;
+    if (displayCount > 11)
+    {
+        stream.add((char *)"Invalid data more than 11 instances");
+        stream.endOfLine();
+        stream.add((char *)"Displaying only 11");
+        stream.endOfLine();
+        displayCount = 11;
+    }
+    for (Uint8 i = 0; i < displayCount; i++)
+    {
+        stream.add((char *)"IE -  bearerContextsModified:");
+        stream.endOfLine();
+        BearerContextIe bearerContext=
+        dynamic_cast<
+        BearerContextIe&>(GtpV2IeFactory::getInstance().getIeObject(BearerContextIeType));
+                BearerContextsModifiedInModifyBearerResponse groupedIeInstance =
+        dynamic_cast<
+        BearerContextsModifiedInModifyBearerResponse&>(bearerContext.getGroupedIe(msgType, 0));
+        groupedIeInstance.displayBearerContextsModifiedInModifyBearerResponseData_v(data.bearerContextsModified[i], stream);
+    }
+
+    
+
+    
+    displayCount = data.bearerContextsMarkedForRemovalCount;
+    if (displayCount > 11)
+    {
+        stream.add((char *)"Invalid data more than 11 instances");
+        stream.endOfLine();
+        stream.add((char *)"Displaying only 11");
+        stream.endOfLine();
+        displayCount = 11;
+    }
+    for (Uint8 i = 0; i < displayCount; i++)
+    {
+        stream.add((char *)"IE -  bearerContextsMarkedForRemoval:");
+        stream.endOfLine();
+        BearerContextIe bearerContext=
+        dynamic_cast<
+        BearerContextIe&>(GtpV2IeFactory::getInstance().getIeObject(BearerContextIeType));
+                BearerContextsMarkedForRemovalInModifyBearerResponse groupedIeInstance =
+        dynamic_cast<
+        BearerContextsMarkedForRemovalInModifyBearerResponse&>(bearerContext.getGroupedIe(msgType, 1));
+        groupedIeInstance.displayBearerContextsMarkedForRemovalInModifyBearerResponseData_v(data.bearerContextsMarkedForRemoval[i], stream);
+    }
+
+    
+
+    
+    if (data.indicationFlagsIePresent)
+    {
+
+
+        stream.add((char *)"IE - indicationFlags:");
+        stream.endOfLine();
+        IndicationIe indication=
+        dynamic_cast<
+        IndicationIe&>(GtpV2IeFactory::getInstance().getIeObject(IndicationIeType));
+        indication.displayIndicationIe_v(data.indicationFlags, stream);
+
+    }
+        stream.add((char *)"IE - cause:");
+        stream.endOfLine();
+        CauseIe cause=
+        dynamic_cast<
+        CauseIe&>(GtpV2IeFactory::getInstance().getIeObject(CauseIeType));
+        cause.displayCauseIe_v(data.cause, stream);
+
+    if (data.apnRestrictionIePresent)
+    {
+
+
+        stream.add((char *)"IE - apnRestriction:");
+        stream.endOfLine();
+        ApnRestrictionIe apnRestriction=
+        dynamic_cast<
+        ApnRestrictionIe&>(GtpV2IeFactory::getInstance().getIeObject(ApnRestrictionIeType));
+        apnRestriction.displayApnRestrictionIe_v(data.apnRestriction, stream);
+
+    }
+    if (data.protocolConfigurationOptionsIePresent)
+    {
+
+
+        stream.add((char *)"IE - protocolConfigurationOptions:");
+        stream.endOfLine();
+        PcoIe pco=
+        dynamic_cast<
+        PcoIe&>(GtpV2IeFactory::getInstance().getIeObject(PcoIeType));
+        pco.displayPcoIe_v(data.protocolConfigurationOptions, stream);
+
+    }
+    if (data.changeReportingActionIePresent)
+    {
+
+
+        stream.add((char *)"IE - changeReportingAction:");
+        stream.endOfLine();
+        ChangeReportingActionIe changeReportingAction=
+        dynamic_cast<
+        ChangeReportingActionIe&>(GtpV2IeFactory::getInstance().getIeObject(ChangeReportingActionIeType));
+        changeReportingAction.displayChangeReportingActionIe_v(data.changeReportingAction, stream);
+
+    }
+    if (data.csgInformationReportingActionIePresent)
+    {
+
+
+        stream.add((char *)"IE - csgInformationReportingAction:");
+        stream.endOfLine();
+        CsgInformationReportingActionIe csgInformationReportingAction=
+        dynamic_cast<
+        CsgInformationReportingActionIe&>(GtpV2IeFactory::getInstance().getIeObject(CsgInformationReportingActionIeType));
+        csgInformationReportingAction.displayCsgInformationReportingActionIe_v(data.csgInformationReportingAction, stream);
+
+    }
+    if (data.hNbInformationReportingIePresent)
+    {
+
+
+        stream.add((char *)"IE - hNbInformationReporting:");
+        stream.endOfLine();
+        HenbInformationReportingIe henbInformationReporting=
+        dynamic_cast<
+        HenbInformationReportingIe&>(GtpV2IeFactory::getInstance().getIeObject(HenbInformationReportingIeType));
+        henbInformationReporting.displayHenbInformationReportingIe_v(data.hNbInformationReporting, stream);
+
+    }
+    if (data.chargingGatewayNameIePresent)
+    {
+
+
+        stream.add((char *)"IE - chargingGatewayName:");
+        stream.endOfLine();
+        FqdnIe fqdn=
+        dynamic_cast<
+        FqdnIe&>(GtpV2IeFactory::getInstance().getIeObject(FqdnIeType));
+        fqdn.displayFqdnIe_v(data.chargingGatewayName, stream);
+
+    }
+    if (data.chargingGatewayAddressIePresent)
+    {
+
+
+        stream.add((char *)"IE - chargingGatewayAddress:");
+        stream.endOfLine();
+        IpAddressIe ipAddress=
+        dynamic_cast<
+        IpAddressIe&>(GtpV2IeFactory::getInstance().getIeObject(IpAddressIeType));
+        ipAddress.displayIpAddressIe_v(data.chargingGatewayAddress, stream);
+
+    }
+    if (data.pgwFqCsidIePresent)
+    {
+
+
+        stream.add((char *)"IE - pgwFqCsid:");
+        stream.endOfLine();
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        fqCsid.displayFqCsidIe_v(data.pgwFqCsid, stream);
+
+    }
+    if (data.sgwFqCsidIePresent)
+    {
+
+
+        stream.add((char *)"IE - sgwFqCsid:");
+        stream.endOfLine();
+        FqCsidIe fqCsid=
+        dynamic_cast<
+        FqCsidIe&>(GtpV2IeFactory::getInstance().getIeObject(FqCsidIeType));
+        fqCsid.displayFqCsidIe_v(data.sgwFqCsid, stream);
+
+    }
+    if (data.recoveryIePresent)
+    {
+
+
+        stream.add((char *)"IE - recovery:");
+        stream.endOfLine();
+        RecoveryIe recovery=
+        dynamic_cast<
+        RecoveryIe&>(GtpV2IeFactory::getInstance().getIeObject(RecoveryIeType));
+        recovery.displayRecoveryIe_v(data.recovery, stream);
+
+    }
+    if (data.sgwLdnIePresent)
+    {
+
+
+        stream.add((char *)"IE - sgwLdn:");
+        stream.endOfLine();
+        LocalDistinguishedNameIe localDistinguishedName=
+        dynamic_cast<
+        LocalDistinguishedNameIe&>(GtpV2IeFactory::getInstance().getIeObject(LocalDistinguishedNameIeType));
+        localDistinguishedName.displayLocalDistinguishedNameIe_v(data.sgwLdn, stream);
+
+    }
+    if (data.pgwLdnIePresent)
+    {
+
+
+        stream.add((char *)"IE - pgwLdn:");
+        stream.endOfLine();
+        LocalDistinguishedNameIe localDistinguishedName=
+        dynamic_cast<
+        LocalDistinguishedNameIe&>(GtpV2IeFactory::getInstance().getIeObject(LocalDistinguishedNameIeType));
+        localDistinguishedName.displayLocalDistinguishedNameIe_v(data.pgwLdn, stream);
+
+    }
+    if (data.presenceReportingAreaActionIePresent)
+    {
+
+
+        stream.add((char *)"IE - presenceReportingAreaAction:");
+        stream.endOfLine();
+        PresenceReportingAreaActionIe presenceReportingAreaAction=
+        dynamic_cast<
+        PresenceReportingAreaActionIe&>(GtpV2IeFactory::getInstance().getIeObject(PresenceReportingAreaActionIeType));
+        presenceReportingAreaAction.displayPresenceReportingAreaActionIe_v(data.presenceReportingAreaAction, stream);
+
+    }
+    if (data.pgwsNodeLevelLoadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - pgwsNodeLevelLoadControlInformation:");
+        stream.endOfLine();
+        LoadControlInformationIe loadControlInformation=
+        dynamic_cast<
+        LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+            PgwsNodeLevelLoadControlInformationInModifyBearerResponse groupedIeInstance =
+        dynamic_cast<
+        PgwsNodeLevelLoadControlInformationInModifyBearerResponse&>(loadControlInformation.getGroupedIe(msgType, 0));
+        groupedIeInstance.displayPgwsNodeLevelLoadControlInformationInModifyBearerResponseData_v(data.pgwsNodeLevelLoadControlInformation, stream);
+
+    }
+    if (data.pgwsApnLevelLoadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - pgwsApnLevelLoadControlInformation:");
+        stream.endOfLine();
+        LoadControlInformationIe loadControlInformation=
+        dynamic_cast<
+        LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+            PgwsApnLevelLoadControlInformationInModifyBearerResponse groupedIeInstance =
+        dynamic_cast<
+        PgwsApnLevelLoadControlInformationInModifyBearerResponse&>(loadControlInformation.getGroupedIe(msgType, 1));
+        groupedIeInstance.displayPgwsApnLevelLoadControlInformationInModifyBearerResponseData_v(data.pgwsApnLevelLoadControlInformation, stream);
+
+    }
+    if (data.sgwsNodeLevelLoadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - sgwsNodeLevelLoadControlInformation:");
+        stream.endOfLine();
+        LoadControlInformationIe loadControlInformation=
+        dynamic_cast<
+        LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+            SgwsNodeLevelLoadControlInformationInModifyBearerResponse groupedIeInstance =
+        dynamic_cast<
+        SgwsNodeLevelLoadControlInformationInModifyBearerResponse&>(loadControlInformation.getGroupedIe(msgType, 2));
+        groupedIeInstance.displaySgwsNodeLevelLoadControlInformationInModifyBearerResponseData_v(data.sgwsNodeLevelLoadControlInformation, stream);
+
+    }
+    if (data.pgwsOverloadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - pgwsOverloadControlInformation:");
+        stream.endOfLine();
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+            PgwsOverloadControlInformationInModifyBearerResponse groupedIeInstance =
+        dynamic_cast<
+        PgwsOverloadControlInformationInModifyBearerResponse&>(overloadControlInformation.getGroupedIe(msgType, 0));
+        groupedIeInstance.displayPgwsOverloadControlInformationInModifyBearerResponseData_v(data.pgwsOverloadControlInformation, stream);
+
+    }
+    if (data.sgwsOverloadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - sgwsOverloadControlInformation:");
+        stream.endOfLine();
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+            SgwsOverloadControlInformationInModifyBearerResponse groupedIeInstance =
+        dynamic_cast<
+        SgwsOverloadControlInformationInModifyBearerResponse&>(overloadControlInformation.getGroupedIe(msgType, 1));
+        groupedIeInstance.displaySgwsOverloadControlInformationInModifyBearerResponseData_v(data.sgwsOverloadControlInformation, stream);
+
+    }
+    if (data.pdnConnectionChargingIdIePresent)
+    {
+
+
+        stream.add((char *)"IE - pdnConnectionChargingId:");
+        stream.endOfLine();
+        ChargingIdIe chargingId=
+        dynamic_cast<
+        ChargingIdIe&>(GtpV2IeFactory::getInstance().getIeObject(ChargingIdIeType));
+        chargingId.displayChargingIdIe_v(data.pdnConnectionChargingId, stream);
+
+    }
+    if (data.msisdnIePresent)
+    {
+
+
+        stream.add((char *)"IE - msisdn:");
+        stream.endOfLine();
+        MsisdnIe msisdn=
+        dynamic_cast<
+        MsisdnIe&>(GtpV2IeFactory::getInstance().getIeObject(MsisdnIeType));
+        msisdn.displayMsisdnIe_v(data.msisdn, stream);
+
+    }
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
diff --git a/src/gtpV2Codec/msgClasses/modifyBearerResponseMsg.h b/src/gtpV2Codec/msgClasses/modifyBearerResponseMsg.h
new file mode 100644
index 0000000..2de8376
--- /dev/null
+++ b/src/gtpV2Codec/msgClasses/modifyBearerResponseMsg.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/msgtemplate.h.tt>
+ ******************************************************************************/
+#ifndef MODIFYBEARERRESPONSEMSG_H_
+#define MODIFYBEARERRESPONSEMSG_H_
+
+#include <set>
+#include "manual/gtpV2Message.h"
+#include <msgBuffer.h>
+#include <debug.h>
+#include "gtpV2MsgDataTypes.h"
+
+
+class ModifyBearerResponseMsg:public GtpV2Message
+{
+public:
+    ModifyBearerResponseMsg();
+    virtual ~ModifyBearerResponseMsg();
+    bool encodeModifyBearerResponseMsg(MsgBuffer &buffer, ModifyBearerResponseMsgData const &data);
+
+    bool decodeModifyBearerResponseMsg (MsgBuffer &buffer, ModifyBearerResponseMsgData& data, Uint16 length);
+
+    void displayModifyBearerResponseMsgData_v(ModifyBearerResponseMsgData const &data, Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/msgClasses/releaseAccessBearersRequestMsg.cpp b/src/gtpV2Codec/msgClasses/releaseAccessBearersRequestMsg.cpp
new file mode 100644
index 0000000..9188f75
--- /dev/null
+++ b/src/gtpV2Codec/msgClasses/releaseAccessBearersRequestMsg.cpp
@@ -0,0 +1,378 @@
+/*
+ * 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/msgtemplate.cpp.tt>
+ ******************************************************************************/ 
+
+#include "releaseAccessBearersRequestMsg.h"
+#include "../ieClasses/manual/gtpV2Ie.h"
+#include "../ieClasses/gtpV2IeFactory.h"
+#include "../ieClasses/ebiIe.h"
+#include "../ieClasses/nodeTypeIe.h"
+#include "../ieClasses/indicationIe.h"
+#include "../ieClasses/secondaryRatUsageDataReportIe.h"
+
+ReleaseAccessBearersRequestMsg::ReleaseAccessBearersRequestMsg()
+{
+    msgType = ReleaseAccessBearersRequestMsgType;
+
+}
+
+ReleaseAccessBearersRequestMsg::~ReleaseAccessBearersRequestMsg()
+{
+
+}
+
+bool ReleaseAccessBearersRequestMsg::encodeReleaseAccessBearersRequestMsg(MsgBuffer &buffer,
+                        ReleaseAccessBearersRequestMsgData
+							const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+    if (data.listOfRabsIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = EbiIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        EbiIe ebi=
+        dynamic_cast<
+        EbiIe&>(GtpV2IeFactory::getInstance().getIeObject(EbiIeType));
+        rc = ebi.encodeEbiIe(buffer, data.listOfRabs);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: listOfRabs\n");
+            return false;
+        }
+    }
+
+    if (data.originatingNodeIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = NodeTypeIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        NodeTypeIe nodeType=
+        dynamic_cast<
+        NodeTypeIe&>(GtpV2IeFactory::getInstance().getIeObject(NodeTypeIeType));
+        rc = nodeType.encodeNodeTypeIe(buffer, data.originatingNode);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: originatingNode\n");
+            return false;
+        }
+    }
+
+    if (data.indicationFlagsIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = IndicationIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        IndicationIe indication=
+        dynamic_cast<
+        IndicationIe&>(GtpV2IeFactory::getInstance().getIeObject(IndicationIeType));
+        rc = indication.encodeIndicationIe(buffer, data.indicationFlags);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: indicationFlags\n");
+            return false;
+        }
+    }
+
+    if (data.secondaryRatUsageDataReportIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = SecondaryRatUsageDataReportIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        SecondaryRatUsageDataReportIe secondaryRatUsageDataReport=
+        dynamic_cast<
+        SecondaryRatUsageDataReportIe&>(GtpV2IeFactory::getInstance().getIeObject(SecondaryRatUsageDataReportIeType));
+        rc = secondaryRatUsageDataReport.encodeSecondaryRatUsageDataReportIe(buffer, data.secondaryRatUsageDataReport);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: secondaryRatUsageDataReport\n");
+            return false;
+        }
+    }
+    return rc;
+
+}
+
+bool ReleaseAccessBearersRequestMsg::decodeReleaseAccessBearersRequestMsg(MsgBuffer &buffer,
+ ReleaseAccessBearersRequestMsgData 
+ &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+  
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+
+        switch (ieHeader.ieType){
+     
+            case EbiIeType:
+            {
+                EbiIe ieObject =
+                dynamic_cast<
+                EbiIe&>(GtpV2IeFactory::getInstance().getIeObject(EbiIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeEbiIe(buffer, data.listOfRabs, ieHeader.length);
+
+                    data.listOfRabsIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: listOfRabs\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case NodeTypeIeType:
+            {
+                NodeTypeIe ieObject =
+                dynamic_cast<
+                NodeTypeIe&>(GtpV2IeFactory::getInstance().getIeObject(NodeTypeIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeNodeTypeIe(buffer, data.originatingNode, ieHeader.length);
+
+                    data.originatingNodeIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: originatingNode\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case IndicationIeType:
+            {
+                IndicationIe ieObject =
+                dynamic_cast<
+                IndicationIe&>(GtpV2IeFactory::getInstance().getIeObject(IndicationIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeIndicationIe(buffer, data.indicationFlags, ieHeader.length);
+
+                    data.indicationFlagsIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: indicationFlags\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case SecondaryRatUsageDataReportIeType:
+            {
+                SecondaryRatUsageDataReportIe ieObject =
+                dynamic_cast<
+                SecondaryRatUsageDataReportIe&>(GtpV2IeFactory::getInstance().getIeObject(SecondaryRatUsageDataReportIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeSecondaryRatUsageDataReportIe(buffer, data.secondaryRatUsageDataReport, ieHeader.length);
+
+                    data.secondaryRatUsageDataReportIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: secondaryRatUsageDataReport\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+
+            default:
+            {
+                // Unknown IE print error
+                errorStream.add((char *)"Unknown IE Type: ");
+                errorStream.add(ieHeader.ieType);
+                errorStream.endOfLine();
+                buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    return rc; // TODO validations
+}
+
+void ReleaseAccessBearersRequestMsg::
+displayReleaseAccessBearersRequestMsgData_v(ReleaseAccessBearersRequestMsgData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"ReleaseAccessBearersRequestMsg:");
+    stream.endOfLine();
+    stream.incrIndent();
+        
+    
+    if (data.listOfRabsIePresent)
+    {
+
+
+        stream.add((char *)"IE - listOfRabs:");
+        stream.endOfLine();
+        EbiIe ebi=
+        dynamic_cast<
+        EbiIe&>(GtpV2IeFactory::getInstance().getIeObject(EbiIeType));
+        ebi.displayEbiIe_v(data.listOfRabs, stream);
+
+    }
+    if (data.originatingNodeIePresent)
+    {
+
+
+        stream.add((char *)"IE - originatingNode:");
+        stream.endOfLine();
+        NodeTypeIe nodeType=
+        dynamic_cast<
+        NodeTypeIe&>(GtpV2IeFactory::getInstance().getIeObject(NodeTypeIeType));
+        nodeType.displayNodeTypeIe_v(data.originatingNode, stream);
+
+    }
+    if (data.indicationFlagsIePresent)
+    {
+
+
+        stream.add((char *)"IE - indicationFlags:");
+        stream.endOfLine();
+        IndicationIe indication=
+        dynamic_cast<
+        IndicationIe&>(GtpV2IeFactory::getInstance().getIeObject(IndicationIeType));
+        indication.displayIndicationIe_v(data.indicationFlags, stream);
+
+    }
+    if (data.secondaryRatUsageDataReportIePresent)
+    {
+
+
+        stream.add((char *)"IE - secondaryRatUsageDataReport:");
+        stream.endOfLine();
+        SecondaryRatUsageDataReportIe secondaryRatUsageDataReport=
+        dynamic_cast<
+        SecondaryRatUsageDataReportIe&>(GtpV2IeFactory::getInstance().getIeObject(SecondaryRatUsageDataReportIeType));
+        secondaryRatUsageDataReport.displaySecondaryRatUsageDataReportIe_v(data.secondaryRatUsageDataReport, stream);
+
+    }
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
diff --git a/src/gtpV2Codec/msgClasses/releaseAccessBearersRequestMsg.h b/src/gtpV2Codec/msgClasses/releaseAccessBearersRequestMsg.h
new file mode 100644
index 0000000..8c58ffa
--- /dev/null
+++ b/src/gtpV2Codec/msgClasses/releaseAccessBearersRequestMsg.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/msgtemplate.h.tt>
+ ******************************************************************************/
+#ifndef RELEASEACCESSBEARERSREQUESTMSG_H_
+#define RELEASEACCESSBEARERSREQUESTMSG_H_
+
+#include <set>
+#include "manual/gtpV2Message.h"
+#include <msgBuffer.h>
+#include <debug.h>
+#include "gtpV2MsgDataTypes.h"
+
+
+class ReleaseAccessBearersRequestMsg:public GtpV2Message
+{
+public:
+    ReleaseAccessBearersRequestMsg();
+    virtual ~ReleaseAccessBearersRequestMsg();
+    bool encodeReleaseAccessBearersRequestMsg(MsgBuffer &buffer, ReleaseAccessBearersRequestMsgData const &data);
+
+    bool decodeReleaseAccessBearersRequestMsg (MsgBuffer &buffer, ReleaseAccessBearersRequestMsgData& data, Uint16 length);
+
+    void displayReleaseAccessBearersRequestMsgData_v(ReleaseAccessBearersRequestMsgData const &data, Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gtpV2Codec/msgClasses/releaseAccessBearersResponseMsg.cpp b/src/gtpV2Codec/msgClasses/releaseAccessBearersResponseMsg.cpp
new file mode 100644
index 0000000..8b9f4a9
--- /dev/null
+++ b/src/gtpV2Codec/msgClasses/releaseAccessBearersResponseMsg.cpp
@@ -0,0 +1,462 @@
+/*
+ * 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/msgtemplate.cpp.tt>
+ ******************************************************************************/ 
+
+#include "releaseAccessBearersResponseMsg.h"
+#include "../ieClasses/manual/gtpV2Ie.h"
+#include "../ieClasses/gtpV2IeFactory.h"
+#include "../ieClasses/causeIe.h"
+#include "../ieClasses/recoveryIe.h"
+#include "../ieClasses/indicationIe.h"
+#include "../ieClasses/loadControlInformationIe.h"
+#include "../ieClasses/sgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponse.h"
+#include "../ieClasses/overloadControlInformationIe.h"
+#include "../ieClasses/sgwsOverloadControlInformationInReleaseAccessBearersResponse.h"
+
+ReleaseAccessBearersResponseMsg::ReleaseAccessBearersResponseMsg()
+{
+    msgType = ReleaseAccessBearersResponseMsgType;
+    Uint16 mandIe;
+    mandIe = CauseIeType;
+    mandIe = (mandIe << 8) | 0; // cause
+    mandatoryIeSet.insert(mandIe);
+}
+
+ReleaseAccessBearersResponseMsg::~ReleaseAccessBearersResponseMsg()
+{
+
+}
+
+bool ReleaseAccessBearersResponseMsg::encodeReleaseAccessBearersResponseMsg(MsgBuffer &buffer,
+                        ReleaseAccessBearersResponseMsgData
+							const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+
+    
+    // Encode the Ie Header
+    header.ieType = CauseIeType;
+    header.instance = 0;
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    CauseIe cause=
+    dynamic_cast<
+    CauseIe&>(GtpV2IeFactory::getInstance().getIeObject(CauseIeType));
+    rc = cause.encodeCauseIe(buffer, data.cause);
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+
+    if (!(rc))
+    { 
+        errorStream.add((char *)"Failed to encode IE: cause\n");
+        return false;
+    }
+
+    if (data.recoveryIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = RecoveryIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        RecoveryIe recovery=
+        dynamic_cast<
+        RecoveryIe&>(GtpV2IeFactory::getInstance().getIeObject(RecoveryIeType));
+        rc = recovery.encodeRecoveryIe(buffer, data.recovery);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: recovery\n");
+            return false;
+        }
+    }
+
+    if (data.indicationFlagsIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = IndicationIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        IndicationIe indication=
+        dynamic_cast<
+        IndicationIe&>(GtpV2IeFactory::getInstance().getIeObject(IndicationIeType));
+        rc = indication.encodeIndicationIe(buffer, data.indicationFlags);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: indicationFlags\n");
+            return false;
+        }
+    }
+
+    if (data.sgwsNodeLevelLoadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = LoadControlInformationIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        LoadControlInformationIe loadControlInformation=
+        dynamic_cast<
+        LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+        SgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponse groupedIeInstance =
+        dynamic_cast<
+         SgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponse&>(loadControlInformation.getGroupedIe(msgType, 0));
+        rc = groupedIeInstance.encodeSgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponse(buffer, data.sgwsNodeLevelLoadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: sgwsNodeLevelLoadControlInformation\n");
+            return false;
+        }
+    }
+
+    if (data.sgwsOverloadControlInformationIePresent)
+    {
+            
+        // Encode the Ie Header
+        header.ieType = OverloadControlInformationIeType;
+        header.instance = 0;
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+        SgwsOverloadControlInformationInReleaseAccessBearersResponse groupedIeInstance =
+        dynamic_cast<
+         SgwsOverloadControlInformationInReleaseAccessBearersResponse&>(overloadControlInformation.getGroupedIe(msgType, 0));
+        rc = groupedIeInstance.encodeSgwsOverloadControlInformationInReleaseAccessBearersResponse(buffer, data.sgwsOverloadControlInformation);
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+    
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: sgwsOverloadControlInformation\n");
+            return false;
+        }
+    }
+    return rc;
+
+}
+
+bool ReleaseAccessBearersResponseMsg::decodeReleaseAccessBearersResponseMsg(MsgBuffer &buffer,
+ ReleaseAccessBearersResponseMsgData 
+ &data, Uint16 length)
+{
+
+    bool rc = false;
+    GtpV2IeHeader ieHeader;
+  
+    set<Uint16> mandatoryIeLocalList = mandatoryIeSet;
+    while (buffer.lengthLeft() > IE_HEADER_SIZE)
+    {
+        GtpV2Ie::decodeGtpV2IeHeader(buffer, ieHeader);
+        if (ieHeader.length > buffer.lengthLeft())
+        {
+            // We do not have enough bytes left in the message for this IE
+            errorStream.add((char *)"IE Length exceeds beyond message boundary\n");
+            errorStream.add((char *)"  Offending IE Type: ");
+            errorStream.add(ieHeader.ieType);
+            errorStream.add((char *)"\n  Ie Length in Header: ");
+            errorStream.add(ieHeader.length);
+            errorStream.add((char *)"\n  Bytes left in message: ");
+            errorStream.add(buffer.lengthLeft());
+            errorStream.endOfLine();
+            return false;
+        }
+
+        switch (ieHeader.ieType){
+     
+            case CauseIeType:
+            {
+                CauseIe ieObject =
+                dynamic_cast<
+                CauseIe&>(GtpV2IeFactory::getInstance().getIeObject(CauseIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeCauseIe(buffer, data.cause, ieHeader.length);
+
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: cause\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case RecoveryIeType:
+            {
+                RecoveryIe ieObject =
+                dynamic_cast<
+                RecoveryIe&>(GtpV2IeFactory::getInstance().getIeObject(RecoveryIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeRecoveryIe(buffer, data.recovery, ieHeader.length);
+
+                    data.recoveryIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: recovery\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case IndicationIeType:
+            {
+                IndicationIe ieObject =
+                dynamic_cast<
+                IndicationIe&>(GtpV2IeFactory::getInstance().getIeObject(IndicationIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					rc = ieObject.decodeIndicationIe(buffer, data.indicationFlags, ieHeader.length);
+
+                    data.indicationFlagsIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: indicationFlags\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case LoadControlInformationIeType:
+            {
+                LoadControlInformationIe ieObject =
+                dynamic_cast<
+                LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					SgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponse groupedIeInstance =
+					dynamic_cast<
+					SgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponse&>(ieObject.getGroupedIe(msgType, 0));
+					rc = groupedIeInstance.decodeSgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponse(buffer, data.sgwsNodeLevelLoadControlInformation, ieHeader.length);
+
+                    data.sgwsNodeLevelLoadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: sgwsNodeLevelLoadControlInformation\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+     
+            case OverloadControlInformationIeType:
+            {
+                OverloadControlInformationIe ieObject =
+                dynamic_cast<
+                OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+
+                if(ieHeader.instance == 0)
+                {
+					SgwsOverloadControlInformationInReleaseAccessBearersResponse groupedIeInstance =
+					dynamic_cast<
+					SgwsOverloadControlInformationInReleaseAccessBearersResponse&>(ieObject.getGroupedIe(msgType, 0));
+					rc = groupedIeInstance.decodeSgwsOverloadControlInformationInReleaseAccessBearersResponse(buffer, data.sgwsOverloadControlInformation, ieHeader.length);
+
+                    data.sgwsOverloadControlInformationIePresent = true;
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: sgwsOverloadControlInformation\n");
+                        return false;
+                    }
+                }
+
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+
+            default:
+            {
+                // Unknown IE print error
+                errorStream.add((char *)"Unknown IE Type: ");
+                errorStream.add(ieHeader.ieType);
+                errorStream.endOfLine();
+                buffer.skipBytes(ieHeader.length);
+            }
+        }
+    }
+    return rc; // TODO validations
+}
+
+void ReleaseAccessBearersResponseMsg::
+displayReleaseAccessBearersResponseMsgData_v(ReleaseAccessBearersResponseMsgData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"ReleaseAccessBearersResponseMsg:");
+    stream.endOfLine();
+    stream.incrIndent();
+        
+    
+        stream.add((char *)"IE - cause:");
+        stream.endOfLine();
+        CauseIe cause=
+        dynamic_cast<
+        CauseIe&>(GtpV2IeFactory::getInstance().getIeObject(CauseIeType));
+        cause.displayCauseIe_v(data.cause, stream);
+
+    if (data.recoveryIePresent)
+    {
+
+
+        stream.add((char *)"IE - recovery:");
+        stream.endOfLine();
+        RecoveryIe recovery=
+        dynamic_cast<
+        RecoveryIe&>(GtpV2IeFactory::getInstance().getIeObject(RecoveryIeType));
+        recovery.displayRecoveryIe_v(data.recovery, stream);
+
+    }
+    if (data.indicationFlagsIePresent)
+    {
+
+
+        stream.add((char *)"IE - indicationFlags:");
+        stream.endOfLine();
+        IndicationIe indication=
+        dynamic_cast<
+        IndicationIe&>(GtpV2IeFactory::getInstance().getIeObject(IndicationIeType));
+        indication.displayIndicationIe_v(data.indicationFlags, stream);
+
+    }
+    if (data.sgwsNodeLevelLoadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - sgwsNodeLevelLoadControlInformation:");
+        stream.endOfLine();
+        LoadControlInformationIe loadControlInformation=
+        dynamic_cast<
+        LoadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(LoadControlInformationIeType));
+            SgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponse groupedIeInstance =
+        dynamic_cast<
+        SgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponse&>(loadControlInformation.getGroupedIe(msgType, 0));
+        groupedIeInstance.displaySgwsNodeLevelLoadControlInformationInReleaseAccessBearersResponseData_v(data.sgwsNodeLevelLoadControlInformation, stream);
+
+    }
+    if (data.sgwsOverloadControlInformationIePresent)
+    {
+
+
+        stream.add((char *)"IE - sgwsOverloadControlInformation:");
+        stream.endOfLine();
+        OverloadControlInformationIe overloadControlInformation=
+        dynamic_cast<
+        OverloadControlInformationIe&>(GtpV2IeFactory::getInstance().getIeObject(OverloadControlInformationIeType));
+            SgwsOverloadControlInformationInReleaseAccessBearersResponse groupedIeInstance =
+        dynamic_cast<
+        SgwsOverloadControlInformationInReleaseAccessBearersResponse&>(overloadControlInformation.getGroupedIe(msgType, 0));
+        groupedIeInstance.displaySgwsOverloadControlInformationInReleaseAccessBearersResponseData_v(data.sgwsOverloadControlInformation, stream);
+
+    }
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
diff --git a/src/gtpV2Codec/msgClasses/releaseAccessBearersResponseMsg.h b/src/gtpV2Codec/msgClasses/releaseAccessBearersResponseMsg.h
new file mode 100644
index 0000000..13f30b5
--- /dev/null
+++ b/src/gtpV2Codec/msgClasses/releaseAccessBearersResponseMsg.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * 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.
+ */
+ /******************************************************************************
+ *
+ * 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/msgtemplate.h.tt>
+ ******************************************************************************/
+#ifndef RELEASEACCESSBEARERSRESPONSEMSG_H_
+#define RELEASEACCESSBEARERSRESPONSEMSG_H_
+
+#include <set>
+#include "manual/gtpV2Message.h"
+#include <msgBuffer.h>
+#include <debug.h>
+#include "gtpV2MsgDataTypes.h"
+
+
+class ReleaseAccessBearersResponseMsg:public GtpV2Message
+{
+public:
+    ReleaseAccessBearersResponseMsg();
+    virtual ~ReleaseAccessBearersResponseMsg();
+    bool encodeReleaseAccessBearersResponseMsg(MsgBuffer &buffer, ReleaseAccessBearersResponseMsgData const &data);
+
+    bool decodeReleaseAccessBearersResponseMsg (MsgBuffer &buffer, ReleaseAccessBearersResponseMsgData& data, Uint16 length);
+
+    void displayReleaseAccessBearersResponseMsgData_v(ReleaseAccessBearersResponseMsgData const &data, Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/mme-app/Makefile b/src/mme-app/Makefile
new file mode 100644
index 0000000..499ef09
--- /dev/null
+++ b/src/mme-app/Makefile
@@ -0,0 +1,88 @@
+#
+# Copyright (c) 2019, Infosys Ltd.
+#
+# 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.
+#
+
+include ../../Makefile.common
+
+CC := g++
+CFLAGS += -Wall -DSTATS -I$(GRPC_ROOT)/include -I$(GRPC_ROOT)/third_party/protobuf/src -std=c++11
+LFLAGS += -L$(GRPC_ROOT)/libs/opt -L$(GRPC_ROOT)/libs/opt/protobuf
+
+ifeq ($(DEBUG),true)
+        CFLAGS += -g
+endif
+ifeq ($(DEBUG),false)
+        CFLAGS += -O3
+endif
+
+LIB_PATH +=-L../common/ 
+
+LIBS := -lpthread \
+        -lcrypto \
+	-lcmnUtils \
+        -ldatagroupmgr \
+        -ljson \
+        -llog \
+        -linterface \
+        -lipcfwk \
+        -lstatemachinefwk \
+	-lmmeGrpcProtoBuf \
+	-lgrpc++ \
+        -lgrpc \
+        -lgpr \
+        -lprotobuf
+
+SRCDIR := .
+SRCEXT := cpp
+SOURCES := $(shell find $(SRCDIR) -type f -name '*.$(SRCEXT)')
+OBJECTS := $(patsubst $(SRCDIR)/%,$(OBJDIR)/mme-app/%,$(SOURCES:.$(SRCEXT)=.o))
+
+TARGET := $(BINDIR)/mme-app
+
+$(TARGET): $(OBJECTS)
+	@echo "Linking..."
+	@mkdir -p $(BINDIR)
+	$(CC) $(LFLAGS) $^ -o $(TARGET) $(LIB_PATH) $(LIBS)
+
+$(OBJDIR)/mme-app/%.o: $(SRCDIR)/%.$(SRCEXT)
+	echo "Compiling..."
+	@mkdir -p $(OBJDIR)
+	@mkdir -p $(OBJDIR)/mme-app/contextManager
+	@mkdir -p $(OBJDIR)/mme-app/interfaces
+	@mkdir -p $(OBJDIR)/mme-app/msgHandlers
+	@mkdir -p $(OBJDIR)/mme-app/actionHandlers
+	@mkdir -p $(OBJDIR)/mme-app/sec
+	@mkdir -p $(OBJDIR)/mme-app/mmeGrpcServer
+	@mkdir -p $(OBJDIR)/mme-app/mmeStates
+	@mkdir -p $(OBJDIR)/mme-app/utils
+	$(CC) $(CFLAGS) $(INC_DIRS) -c -o $@ $<
+
+all:$(TARGET)
+
+clean:
+	@echo "Cleaning...";
+	-@rm -rf $(OBJDIR)/mme-app $(TARGET)
+
+install:
+	@echo "Installing mme-app"
+	-@mkdir -p $(TARGET_DIR)/bin
+	-@cp $(TARGET) $(TARGET_DIR)/bin
+	-@cp run.sh $(TARGET_DIR)
+	-@cp stop.sh $(TARGET_DIR)
+	-@mkdir -p $(TARGET_DIR)/conf
+	-@cp conf/*.json $(TARGET_DIR)/conf/
+
+.PHONY: clean
+
diff --git a/src/mme-app/actionHandlers/attachActionHandlers.cpp b/src/mme-app/actionHandlers/attachActionHandlers.cpp
new file mode 100644
index 0000000..78b8761
--- /dev/null
+++ b/src/mme-app/actionHandlers/attachActionHandlers.cpp
@@ -0,0 +1,980 @@
+/*
+ * Copyright 2019-present Infosys Limited
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+/******************************************************************************
+ *
+ * This file has both generated and manual code.
+ *
+ * File template used for code generation:
+ * <TOP-DIR/scripts/SMCodeGen/templates/stateMachineTmpls/actionHandlers.cpp.tt>
+ *
+ ******************************************************************************/
+
+#include <3gpp_24008.h>
+#include <typeinfo>
+#include "actionHandlers/actionHandlers.h"
+#include "controlBlock.h"
+#include "msgType.h"
+#include "contextManager/subsDataGroupManager.h"
+#include "contextManager/dataBlocks.h"
+#include "procedureStats.h"
+#include "log.h"
+#include "secUtils.h"
+#include "state.h"
+#include <string.h>
+#include <sstream>
+#include <smTypes.h>
+#include <cstring>
+#include <event.h>
+#include <ipcTypes.h>
+#include <tipcTypes.h>
+#include <msgBuffer.h>
+#include <interfaces/mmeIpcInterface.h>
+#include <utils/mmeCommonUtils.h>
+#include <utils/mmeContextManagerUtils.h>
+
+using namespace SM;
+using namespace mme;
+using namespace cmn::utils;
+
+extern MmeIpcInterface* mmeIpcIf_g;
+
+ActStatus ActionHandlers::validate_imsi_in_ue_context(ControlBlock& cb)
+{
+    UEContext* ueCtxt_p = static_cast<UEContext*>(cb.getPermDataBlock());
+    if (ueCtxt_p == NULL)
+    {
+         log_msg(LOG_DEBUG, "send_identity_request_to_ue: ue context is NULL \n");
+         return ActStatus::HALT;
+    }
+
+    if (ueCtxt_p->getImsi().isValid())
+    {
+        SM::Event evt(Event_e::IMSI_VALIDATION_SUCCESS, NULL);
+        cb.addEventToProcQ(evt);
+    }
+    else
+    {
+        // TODO: If known GUTI, IMSI_VALIDATION_FAILURE_KNOWN_GUTI to trigger id req to UE
+        // If unknown GUTI, IMSI_VALIDATION_FAILURE_UNKNOWN_GUTI to query old mme
+        // when s10 is supported in MME
+        SM::Event evt(Event_e::IMSI_VALIDATION_FAILURE, NULL);
+        cb.addEventToProcQ(evt);
+    }
+    return ActStatus::PROCEED;
+}
+
+ActStatus ActionHandlers::send_identity_request_to_ue(ControlBlock& cb)
+{
+	log_msg(LOG_DEBUG, "Inside send_identity_request_to_ue \n");
+
+	UEContext* ueCtxt_p = static_cast<UEContext*>(cb.getPermDataBlock());
+	if (ueCtxt_p == NULL)
+	{
+		log_msg(LOG_DEBUG, "send_identity_request_to_ue: ue context is NULL \n");
+		return ActStatus::HALT;
+	}
+
+	struct attachIdReq_info idReqMsg;
+	idReqMsg.msg_type = id_request;
+	idReqMsg.enb_fd = ueCtxt_p->getEnbFd();
+	idReqMsg.s1ap_enb_ue_id = ueCtxt_p->getS1apEnbUeId();
+	idReqMsg.ue_idx = ueCtxt_p->getContextID();
+	idReqMsg.ue_type = ID_IMSI;
+
+	cmn::ipc::IpcAddress destAddr;
+	destAddr.u32 = TipcServiceInstance::s1apAppInstanceNum_c;
+
+	mmeIpcIf_g->dispatchIpcMsg((char *) &idReqMsg, sizeof(idReqMsg), destAddr);
+
+    return ActStatus::PROCEED;
+}
+
+ActStatus ActionHandlers::process_identity_response(ControlBlock& cb)
+{
+	log_msg(LOG_DEBUG, "Inside process_identity_response \n");
+
+	UEContext *ueCtxt_p = static_cast<UEContext*>(cb.getPermDataBlock());
+	if (ueCtxt_p == NULL)
+	{
+		log_msg(LOG_DEBUG, "process_identity_response: ue context is NULL \n");
+		return ActStatus::HALT;
+	}
+
+	MsgBuffer* msgBuf = static_cast<MsgBuffer*>(cb.getMsgData());
+	if (msgBuf == NULL)
+	{
+		log_msg(LOG_DEBUG, "process_identity_response: msgBuf is NULL \n");
+		return ActStatus::HALT;
+	}
+
+	const s1_incoming_msg_data_t* s1_msg_data = static_cast<const s1_incoming_msg_data_t*>(msgBuf->getDataPointer());
+	if (s1_msg_data == NULL)
+	{
+		log_msg(LOG_DEBUG, "process_identity_response: s1MsgData is NULL \n");
+		return ActStatus::HALT;
+	}
+
+	const struct identityResp_Q_msg &id_resp = s1_msg_data->msg_data.identityResp_Q_msg_m;
+	if(SUCCESS != id_resp.status)
+    	{
+		log_msg(LOG_DEBUG, "process_identity_response: ID Response Failure NULL \n");
+		return ActStatus::HALT;
+	}
+
+	uint8_t imsi[BINARY_IMSI_LEN] = {0};
+    	memcpy( imsi, id_resp.IMSI, BINARY_IMSI_LEN );
+
+	// Only upper nibble of first octect in imsi need to be considered
+	// Changing the lower nibble to 0x0f for handling
+	uint8_t first = imsi[0] >> 4;
+	imsi[0] = (uint8_t)(( first << 4 ) | 0x0f );
+
+	DigitRegister15 IMSIInfo;
+	IMSIInfo.convertFromBcdArray(imsi);
+	ueCtxt_p->setImsi(IMSIInfo);
+
+	SubsDataGroupManager::Instance()->addimsikey(ueCtxt_p->getImsi(), ueCtxt_p->getContextID());
+
+    return ActStatus::PROCEED;
+}
+
+
+ActStatus ActionHandlers::send_air_to_hss(SM::ControlBlock& cb)
+{  
+	log_msg(LOG_DEBUG, "Inside send_air_to_hss \n");
+	
+	UEContext *ue_ctxt = dynamic_cast<UEContext*>(cb.getPermDataBlock());
+	if (ue_ctxt == NULL)
+	{
+		log_msg(LOG_DEBUG, "send_air_to_hss: ue context is NULL \n");
+		return ActStatus::HALT;
+	}
+
+	s6a_Q_msg s6a_req;
+	
+	memset(s6a_req.imsi, '\0', sizeof(s6a_req.imsi));
+	ue_ctxt->getImsi().getImsiDigits(s6a_req.imsi);
+
+	memcpy(&(s6a_req.tai), &(ue_ctxt->getTai().tai_m), sizeof(struct TAI));
+
+	s6a_req.ue_idx = ue_ctxt->getContextID();
+	s6a_req.msg_type = auth_info_request;
+
+	cmn::ipc::IpcAddress destAddr;
+	destAddr.u32 = TipcServiceInstance::s6AppInstanceNum_c;
+
+	mmeIpcIf_g->dispatchIpcMsg((char *) &s6a_req, sizeof(s6a_req), destAddr);
+
+	ProcedureStats::num_of_air_sent ++;
+	log_msg(LOG_DEBUG, "Leaving send_air_to_hss \n");
+	
+	return ActStatus::PROCEED;
+
+}
+
+ActStatus ActionHandlers::send_ulr_to_hss(SM::ControlBlock& cb)
+{  
+	log_msg(LOG_DEBUG, "Inside send_ulr_to_hss \n");
+	
+	UEContext *ue_ctxt = dynamic_cast<UEContext*>(cb.getPermDataBlock());
+	if (ue_ctxt == NULL)
+	{
+		log_msg(LOG_DEBUG, "send_ulr_to_hss: ue context is NULL \n");
+		return ActStatus::HALT;
+	}
+
+	s6a_Q_msg s6a_req;
+
+	memset(s6a_req.imsi, '\0', sizeof(s6a_req.imsi));
+	ue_ctxt->getImsi().getImsiDigits(s6a_req.imsi);
+
+	memcpy(&(s6a_req.tai), &(ue_ctxt->getTai().tai_m), sizeof(struct TAI));
+
+	s6a_req.ue_idx = ue_ctxt->getContextID();
+	s6a_req.msg_type = update_loc_request;
+
+	cmn::ipc::IpcAddress destAddr;
+	destAddr.u32 = TipcServiceInstance::s6AppInstanceNum_c;
+
+	mmeIpcIf_g->dispatchIpcMsg((char *) &s6a_req, sizeof(s6a_req), destAddr);
+
+	ProcedureStats::num_of_ulr_sent ++;
+	log_msg(LOG_DEBUG, "Leaving send_ulr_to_hss \n");
+	
+	return ActStatus::PROCEED;
+}
+
+
+ActStatus ActionHandlers::process_aia(SM::ControlBlock& cb)
+{
+	log_msg(LOG_DEBUG, "Inside handle_aia \n");
+
+	UEContext *ue_ctxt = dynamic_cast<UEContext*>(cb.getPermDataBlock());
+	if (ue_ctxt == NULL)
+	{
+		log_msg(LOG_DEBUG, "handle_aia: ue context is NULL \n");
+		return ActStatus::HALT;
+	}
+
+	MsgBuffer* msgBuf = static_cast<MsgBuffer*>(cb.getMsgData());
+
+	if (msgBuf == NULL)
+		return ActStatus::HALT;
+
+	const s6_incoming_msg_data_t* msgData_p = static_cast<const s6_incoming_msg_data_t*>(msgBuf->getDataPointer());
+
+	ue_ctxt->setAiaSecInfo(E_utran_sec_vector(msgData_p->msg_data.aia_Q_msg_m.sec));
+	
+	ProcedureStats::num_of_processed_aia ++;
+	log_msg(LOG_DEBUG, "Leaving handle_aia \n");
+	
+	return ActStatus::PROCEED;
+}
+
+ActStatus ActionHandlers::process_ula(SM::ControlBlock& cb)
+{
+	log_msg(LOG_DEBUG, "Inside handle_ula \n");
+
+	UEContext *ue_ctxt = dynamic_cast<UEContext*>(cb.getPermDataBlock());
+	if (ue_ctxt == NULL)
+	{
+		log_msg(LOG_DEBUG, "handle_ula: ue context is NULL \n");
+		return ActStatus::HALT;
+	}
+
+	SessionContext* sessionCtxt = ue_ctxt->getSessionContext();
+	if( sessionCtxt == NULL )
+    	{
+		log_msg(LOG_ERROR, "Failed to retrieve Session Context for UE IDX %d\n", cb.getCBIndex());
+        	return ActStatus::HALT;
+    	}
+	
+	MsgBuffer* msgBuf = static_cast<MsgBuffer*>(cb.getMsgData());
+
+	if (msgBuf == NULL)
+		return ActStatus::HALT;
+
+	const s6_incoming_msg_data_t* s6_msg_data = static_cast<const s6_incoming_msg_data_t*>(msgBuf->getDataPointer());
+	const struct ula_Q_msg &ula_msg = s6_msg_data->msg_data.ula_Q_msg_m;
+
+	sessionCtxt->setApnConfigProfileCtxId(ula_msg.apn_config_profile_ctx_id);
+	DigitRegister15 ueMSISDN;
+	ueMSISDN.convertFromBcdArray( reinterpret_cast<const uint8_t*>( ula_msg.MSISDN ));
+	ue_ctxt->setMsisdn(ueMSISDN);
+	ue_ctxt->setRauTauTimer(ula_msg.RAU_TAU_timer);
+	ue_ctxt->setSubscriptionStatus(ula_msg.subscription_status);
+	ue_ctxt->setNetAccessMode(ula_msg.net_access_mode);
+	ue_ctxt->setAccessRestrictionData(ula_msg.access_restriction_data);
+
+	struct AMBR ambr;
+	ambr.max_requested_bw_dl = ula_msg.max_requested_bw_dl;
+	ambr.max_requested_bw_ul = ula_msg.max_requested_bw_ul;
+	
+	ue_ctxt->setAmbr(Ambr(ambr));
+	
+	ProcedureStats::num_of_processed_ula ++;
+	log_msg(LOG_DEBUG, "Leaving handle_ula_v \n");
+	
+	return ActStatus::PROCEED;
+}
+
+ActStatus ActionHandlers::auth_req_to_ue(SM::ControlBlock& cb)
+{
+	UEContext *ue_ctxt = dynamic_cast<UEContext*>(cb.getPermDataBlock());
+
+	if (ue_ctxt == NULL)
+	{
+		log_msg(LOG_DEBUG, "auth_req_to_ue: ue context is NULL \n");
+		return ActStatus::HALT;
+	}
+
+	authreq_info authreq;
+	authreq.msg_type = auth_request;
+	authreq.ue_idx = ue_ctxt->getContextID();
+	authreq.enb_fd = ue_ctxt->getEnbFd();
+	authreq.enb_s1ap_ue_id = ue_ctxt->getS1apEnbUeId();
+
+	ue_ctxt->setDwnLnkSeqNo(0);
+
+	E_UTRAN_sec_vector *secVect = const_cast<E_UTRAN_sec_vector*>(ue_ctxt->getAiaSecInfo().AiaSecInfo_mp);
+
+	secinfo& secInfo = const_cast<secinfo&>(ue_ctxt->getUeSecInfo().secinfo_m);
+
+	SecUtils::create_integrity_key(secVect->kasme.val, secInfo.int_key);
+
+	memcpy(&(authreq.rand), &(secVect->rand.val), NAS_RAND_SIZE);
+	memcpy(&(authreq.autn), &(secVect->autn.val), NAS_AUTN_SIZE);
+	
+	cmn::ipc::IpcAddress destAddr;
+	destAddr.u32 = TipcServiceInstance::s1apAppInstanceNum_c;
+
+	mmeIpcIf_g->dispatchIpcMsg((char *) &authreq, sizeof(authreq), destAddr);
+
+	
+	ProcedureStats::num_of_auth_req_to_ue_sent ++;
+	log_msg(LOG_DEBUG, "Leaving auth_req_to_ue_v \n");
+		
+	return ActStatus::PROCEED;
+}
+
+ActStatus ActionHandlers::auth_response_validate(SM::ControlBlock& cb)
+{
+	log_msg(LOG_DEBUG, "Inside auth_response_validate \n");
+	SM::ControlBlock* controlBlk_p = SubsDataGroupManager::Instance()->findControlBlock(cb.getCBIndex());
+
+	UEContext *ue_ctxt = dynamic_cast<UEContext*>(cb.getPermDataBlock());
+	if (ue_ctxt == NULL)
+	{
+		log_msg(LOG_DEBUG, "auth_response_validate: ue context or procedure ctxt is NULL \n");
+		return ActStatus::HALT;
+	}
+	
+	MsgBuffer* msgBuf = static_cast<MsgBuffer*>(cb.getMsgData());
+
+	if (msgBuf == NULL)
+		return ActStatus::HALT;
+
+	const s1_incoming_msg_data_t* s1_msg_data = static_cast<const s1_incoming_msg_data_t*>(msgBuf->getDataPointer());	
+	const struct authresp_Q_msg &auth_resp = s1_msg_data->msg_data.authresp_Q_msg_m;
+	
+	/*Check the state*/
+	if(SUCCESS != auth_resp.status) {
+		log_msg(LOG_ERROR, "eNB authentication failure for UE-%d.\n", ue_ctxt->getContextID());
+		if(auth_resp.auts.len == 0)
+		{
+			log_msg(LOG_ERROR,"No AUTS.Not Synch Failure\n");
+			SM::Event evt(Event_e::AUTH_RESP_FAILURE,NULL);
+        		controlBlk_p->addEventToProcQ(evt);
+		}
+		else
+		{
+			log_msg(LOG_INFO,"AUTS recvd.  Synch failure. send AIR\n");
+			SM::Event evt(Event_e::AUTH_RESP_SYNC_FAILURE,NULL);
+            		controlBlk_p->addEventToProcQ(evt);
+		}
+	}
+	else{
+		log_msg(LOG_INFO,"Auth response validation success. Proceeding to Sec mode Command\n");
+                SM::Event evt(Event_e::AUTH_RESP_SUCCESS,NULL);
+                controlBlk_p->addEventToProcQ(evt);
+
+	}
+	//TODO: XRES comparison
+	#if 0
+	log_msg(LOG_ERROR, "stage 3 processing memcmp - %d, %d, %d", &(ue_ctxt->getaiaSecInfo().AiaSecInfo_mp->xres.val),
+                &(auth_resp->res.val),
+                auth_resp->res.len);
+	if(memcmp(&(ue_ctxt->getaiaSecInfo().AiaSecInfo_mp->xres.val),
+		&(auth_resp->res.val),
+		auth_resp->res.len) != 0) {
+		log_msg(LOG_ERROR, "Invalid auth result received for UE %d",
+			auth_resp->ue_idx);
+		return E_FAIL;//report failure
+	}
+	#endif
+	
+	ProcedureStats::num_of_processed_auth_response ++;
+	log_msg(LOG_DEBUG, "Leaving auth_response_validate \n");
+	
+	return ActStatus::PROCEED;
+}
+
+ActStatus ActionHandlers::send_auth_reject(SM::ControlBlock& cb)
+{
+	log_msg(LOG_DEBUG, "Inside send_auth_reject \n");
+
+	UEContext *ue_ctxt = dynamic_cast<UEContext*>(cb.getPermDataBlock());
+	if (ue_ctxt == NULL)
+	{
+		log_msg(LOG_DEBUG, "send_auth_reject: ue context is NULL \n");
+		return ActStatus::HALT;
+	}
+	return ActStatus::HALT;
+}
+	
+
+ActStatus ActionHandlers::sec_mode_cmd_to_ue(SM::ControlBlock& cb)
+{
+	log_msg(LOG_DEBUG, "Inside sec_mode_cmd_to_ue \n");
+
+	UEContext *ue_ctxt = dynamic_cast<UEContext*>(cb.getPermDataBlock());
+	if (ue_ctxt == NULL)
+	{
+		log_msg(LOG_DEBUG, "sec_mode_cmd_to_ue: ue context is NULL \n");
+		return ActStatus::HALT;
+	}
+	sec_mode_Q_msg sec_mode_msg;
+	sec_mode_msg.msg_type  = sec_mode_command;
+	sec_mode_msg.ue_idx = ue_ctxt->getContextID();
+	sec_mode_msg.enb_fd = ue_ctxt->getEnbFd();
+	sec_mode_msg.enb_s1ap_ue_id = ue_ctxt->getS1apEnbUeId();
+	
+	memcpy(&(sec_mode_msg.ue_network), &(ue_ctxt->getUeNetCapab().ue_net_capab_m),
+		sizeof(struct UE_net_capab));
+
+	memcpy(&(sec_mode_msg.ms_net_capab), &(ue_ctxt->getMsNetCapab().ms_net_capab_m),
+                sizeof(struct MS_net_capab));
+
+	memcpy(&(sec_mode_msg.key), &(ue_ctxt->getAiaSecInfo().AiaSecInfo_mp->kasme),
+			sizeof(struct KASME));
+
+	memcpy(&(sec_mode_msg.int_key), &(ue_ctxt->getUeSecInfo().secinfo_m.int_key),
+			NAS_INT_KEY_SIZE);
+
+	sec_mode_msg.dl_seq_no = ue_ctxt->getDwnLnkSeqNo();
+	ue_ctxt->setDwnLnkSeqNo(sec_mode_msg.dl_seq_no + 1);
+
+	cmn::ipc::IpcAddress destAddr;
+	destAddr.u32 = TipcServiceInstance::s1apAppInstanceNum_c;
+
+	mmeIpcIf_g->dispatchIpcMsg((char *) &sec_mode_msg, sizeof(sec_mode_msg), destAddr);
+	
+	ProcedureStats::num_of_sec_mode_cmd_to_ue_sent ++;
+	log_msg(LOG_DEBUG, "Leaving sec_mode_cmd_to_ue \n");
+	
+	return ActStatus::PROCEED;
+}
+
+
+ActStatus ActionHandlers::process_sec_mode_resp(SM::ControlBlock& cb)
+{
+	log_msg(LOG_DEBUG, "Inside handle_sec_mode_resp \n");
+
+	UEContext *ue_ctxt = dynamic_cast<UEContext*>(cb.getPermDataBlock());
+	if (ue_ctxt == NULL)
+	{
+		log_msg(LOG_DEBUG, "handle_sec_mode_resp: ue context is NULL \n");
+		return ActStatus::HALT;
+	}
+
+	MsgBuffer* msgBuf = static_cast<MsgBuffer*>(cb.getMsgData());
+
+	if (msgBuf == NULL)
+		return ActStatus::HALT;
+
+	const s1_incoming_msg_data_t* s1_msg_data = static_cast<const s1_incoming_msg_data_t*>(msgBuf->getDataPointer());
+	const secmode_resp_Q_msg &secmode_resp = s1_msg_data->msg_data.secmode_resp_Q_msg_m;
+	if(SUCCESS == secmode_resp.status)
+	{
+		log_msg(LOG_INFO, "Sec mode complete rcv. UE - %d.\n",
+				ue_ctxt->getContextID());
+		
+	}	
+	else
+	{
+		log_msg(LOG_INFO, "Sec mode failed. UE %d", ue_ctxt->getContextID());
+	}
+
+	ProcedureStats::num_of_processed_sec_mode_resp ++;
+	log_msg(LOG_DEBUG, "Leaving handle_sec_mode_resp \n");
+	
+	return ActStatus::PROCEED;
+}
+
+ActStatus ActionHandlers::check_esm_info_req_required(SM::ControlBlock& cb)
+{
+	log_msg(LOG_DEBUG, "Inside check_esm_info_req_required \n");
+
+	UEContext *ue_ctxt = dynamic_cast<UEContext*>(cb.getPermDataBlock());
+	if (ue_ctxt == NULL)
+	{
+		log_msg(LOG_DEBUG, "check_esm_info_req_required: ue context is NULL \n");
+		return ActStatus::HALT;
+	}
+	
+	MmeProcedureCtxt* procedure_p = dynamic_cast<MmeProcedureCtxt*>(cb.getTempDataBlock());
+	if (procedure_p == NULL)
+	{
+		log_msg(LOG_DEBUG, "check_esm_info_req_required: procedure context is NULL \n");
+		return ActStatus::HALT;		
+	}
+	SessionContext* sessionCtxt = SubsDataGroupManager::Instance()->getSessionContext();
+	if( sessionCtxt == NULL )
+	{
+	    log_msg(LOG_ERROR, "Failed to allocate Session Context for UE IDX %d\n", cb.getCBIndex());
+
+	    return ActStatus::HALT;
+	}
+	BearerContext* bearerCtxt_p = SubsDataGroupManager::Instance()->getBearerContext();
+	if( bearerCtxt_p == NULL )
+	{
+	    log_msg(LOG_ERROR, "Failed to allocate Bearer context for UE IDx %d\n", cb.getCBIndex());
+
+	    return ActStatus::HALT;
+	}
+
+	bearerCtxt_p->setBearerId(5);
+	sessionCtxt->setPti(procedure_p->getPti());
+	sessionCtxt->setBearerContext( bearerCtxt_p );
+	ue_ctxt->setSessionContext(sessionCtxt);
+	
+	if (procedure_p->getEsmInfoTxRequired() == false)
+	{
+		// hardcoding APN, if ESM info request is not to be sent
+		std::string apnName = "apn1";
+		struct apn_name apn = {0};
+		apn.len = apnName.length() + 1;
+		apn.val[0] = apnName.length();
+		memcpy(&(apn.val[1]), apnName.c_str(), apnName.length());
+
+		sessionCtxt->setAccessPtName(Apn_name(apn));
+        
+		SM::Event evt(Event_e::ESM_INFO_NOT_REQUIRED, NULL);
+		cb.addEventToProcQ(evt);
+	} 
+	else
+	{
+		SM::Event evt(Event_e::ESM_INFO_REQUIRED, NULL);
+		cb.addEventToProcQ(evt);
+	}
+	
+	return  ActStatus::PROCEED;
+}
+
+ActStatus ActionHandlers::send_esm_info_req_to_ue(SM::ControlBlock& cb)
+{
+	UEContext *ue_ctxt = dynamic_cast<UEContext*>(cb.getPermDataBlock());
+
+	if (ue_ctxt == NULL)
+	{
+		log_msg(LOG_DEBUG, "send_esm_info_req_to_ue: ue context is NULL \n");
+		return ActStatus::HALT;
+	}
+
+	SessionContext *sessionCtxt = ue_ctxt->getSessionContext();
+	esm_req_Q_msg esmreq;
+	esmreq.msg_type = esm_info_request;
+	esmreq.ue_idx = ue_ctxt->getContextID();
+	esmreq.enb_fd = ue_ctxt->getEnbFd();
+	esmreq.enb_s1ap_ue_id = ue_ctxt->getS1apEnbUeId();
+	esmreq.pti = sessionCtxt->getPti();
+	esmreq.dl_seq_no = ue_ctxt->getDwnLnkSeqNo();
+	memcpy(&(esmreq.int_key), &((ue_ctxt->getUeSecInfo().secinfo_m).int_key),
+			NAS_INT_KEY_SIZE);
+	ue_ctxt->setDwnLnkSeqNo(esmreq.dl_seq_no+1);
+
+	cmn::ipc::IpcAddress destAddr;
+	destAddr.u32 = TipcServiceInstance::s1apAppInstanceNum_c;
+
+	mmeIpcIf_g->dispatchIpcMsg((char *) &esmreq, sizeof(esmreq), destAddr);
+
+	log_msg(LOG_DEBUG, "Leaving send_esm_info_req_to_ue \n");
+
+	return ActStatus::PROCEED;
+}
+
+ActStatus ActionHandlers::process_esm_info_resp(SM::ControlBlock& cb)
+{
+	UEContext *ue_ctxt = dynamic_cast<UEContext*>(cb.getPermDataBlock());
+	if (ue_ctxt == NULL)
+	{
+		log_msg(LOG_DEBUG, "handle_ula: ue context is NULL \n");
+		return ActStatus::HALT;
+	}
+
+	SessionContext* sessionCtxt = ue_ctxt->getSessionContext();
+	if( sessionCtxt == NULL )
+	{
+	    log_msg(LOG_ERROR, "Failed to allocate Session "
+                            "Context for UE IDX %d\n", cb.getCBIndex());
+	    return ActStatus::HALT;
+	}
+
+	MsgBuffer* msgBuf = static_cast<MsgBuffer*>(cb.getMsgData());
+
+	if (msgBuf == NULL)
+		return ActStatus::HALT;
+
+	const s1_incoming_msg_data_t* s1_msg_data = static_cast<const s1_incoming_msg_data_t*>(msgBuf->getDataPointer());
+	const struct esm_resp_Q_msg &esm_res =s1_msg_data->msg_data.esm_resp_Q_msg_m;
+
+    	sessionCtxt->setAccessPtName(Apn_name(esm_res.apn));
+
+	return ActStatus::PROCEED;
+}
+
+ActStatus ActionHandlers::cs_req_to_sgw(SM::ControlBlock& cb)
+{
+	log_msg(LOG_DEBUG, "Inside cs_req_to_sgw \n");
+
+	UEContext *ue_ctxt = dynamic_cast<UEContext*>(cb.getPermDataBlock());
+	MmeProcedureCtxt *procCtxt = dynamic_cast<MmeProcedureCtxt*>(cb.getTempDataBlock());
+	if (ue_ctxt == NULL  || procCtxt == NULL)
+	{
+		log_msg(LOG_DEBUG, "handle_ula: UE context or Procedure Context is NULL \n");
+
+		return ActStatus::HALT;
+	}
+
+   	SessionContext* sessionCtxt = ue_ctxt->getSessionContext();
+	if( sessionCtxt == NULL )
+	{
+		log_msg(LOG_ERROR, "Failed to allocate Session Context for UE IDX %d\n", cb.getCBIndex());
+
+		return ActStatus::HALT;
+	}
+
+	BearerContext* bearerCtxt_p = sessionCtxt->getBearerContext();
+	if( bearerCtxt_p == NULL )
+	{
+		log_msg(LOG_ERROR, "Failed to allocate Bearer context for UE IDx %d\n", cb.getCBIndex());
+
+		return ActStatus::HALT;
+	}
+
+	struct CS_Q_msg cs_msg;
+	cs_msg.msg_type = create_session_request;
+	cs_msg.ue_idx = ue_ctxt->getContextID();
+	
+	const DigitRegister15& ueImsi = ue_ctxt->getImsi();
+	ueImsi.convertToBcdArray( cs_msg.IMSI );
+	
+	/*uint8_t  plmn_id[3] = {0};
+	memcpy(plmn_id, ue_ctxt->gettai().tai_m.plmn_id.idx, 3);
+	if ((plmn_id[1] & 0xF0) == 0xF0)
+		plmn_id[1] = plmn_id[1] & 0x0F;
+
+	const Apn_name &apnName = sessionCtxt->getaccessPtName();
+	std::string apnStr((const char *)apnName.apnname_m.val, apnName.apnname_m.len);
+
+	stringstream formattedApn;
+	formattedApn << apnStr  <<
+					 "\x6" << "mnc" <<
+					((plmn_id[1] & 0xF0) >> 4) <<
+					(plmn_id[2] & 0x0F) <<
+					((plmn_id[2] & 0xF0) >> 4) <<
+					"\x6" << "mcc" <<
+					(plmn_id[0] & 0x0F) <<
+					((plmn_id[0] & 0xF0) >> 4) <<
+					((plmn_id[1] & 0x0F)) <<
+					"\x4" << "gprs";
+
+	uint32_t formattedApnLen = formattedApn.str().length();
+	cs_msg.apn.len = formattedApnLen + 1;
+	cs_msg.apn.val[0] = apnStr.length();
+	memcpy(&cs_msg.apn.val[1], formattedApn.str().c_str(),
+	formattedApn.str().length()); */
+
+	const Apn_name &apnName = sessionCtxt->getAccessPtName();
+	memcpy(&(cs_msg.apn), &(apnName.apnname_m), sizeof(struct apn_name));
+	memcpy(&(cs_msg.tai), &(ue_ctxt->getTai().tai_m), sizeof(struct TAI));
+	memcpy(&(cs_msg.utran_cgi), &(ue_ctxt->getUtranCgi().cgi_m), sizeof(struct CGI));
+	memcpy(&(cs_msg.pco_options[0]), procCtxt->getPcoOptions(),sizeof(cs_msg.pco_options));
+
+	const AMBR& ambr = ue_ctxt->getAmbr().ambr_m;
+
+	cs_msg.max_requested_bw_dl = ambr.max_requested_bw_dl;
+	cs_msg.max_requested_bw_ul = ambr.max_requested_bw_ul;
+
+	memset(cs_msg.MSISDN, 0, BINARY_IMSI_LEN);
+	
+	const DigitRegister15& ueMSISDN = ue_ctxt->getMsisdn();
+	ueMSISDN.convertToBcdArray(cs_msg.MSISDN);
+
+	cmn::ipc::IpcAddress destAddr;
+	destAddr.u32 = TipcServiceInstance::s11AppInstanceNum_c;
+
+	mmeIpcIf_g->dispatchIpcMsg((char *) &cs_msg, sizeof(cs_msg), destAddr);
+
+	ProcedureStats::num_of_cs_req_to_sgw_sent ++;
+	log_msg(LOG_DEBUG, "Leaving cs_req_to_sgw \n");
+
+    	return ActStatus::PROCEED;
+}
+
+ActStatus ActionHandlers::process_cs_resp(SM::ControlBlock& cb)
+{
+	log_msg(LOG_DEBUG, "Entering handle_cs_resp \n");
+
+	UEContext *ue_ctxt = dynamic_cast<UEContext*>(cb.getPermDataBlock());
+	if (ue_ctxt == NULL)
+	{
+		log_msg(LOG_DEBUG, "handle_cs_resp: ue context is NULL \n");
+		return ActStatus::HALT;
+	}
+
+	SessionContext* sessionCtxt = ue_ctxt->getSessionContext();
+	if (sessionCtxt == NULL)
+	{
+		log_msg(LOG_DEBUG, "handle_cs_resp: session ctxt is NULL \n");
+		return ActStatus::HALT;
+	}
+
+	MsgBuffer* msgBuf = static_cast<MsgBuffer*>(cb.getMsgData());
+
+	if (msgBuf == NULL)
+		return ActStatus::HALT;
+
+	const gtp_incoming_msg_data_t* gtp_msg_data= static_cast<const gtp_incoming_msg_data_t*>(msgBuf->getDataPointer());
+	const struct csr_Q_msg& csr_info = gtp_msg_data->msg_data.csr_Q_msg_m;
+
+	BearerContext* bearerCtxt = sessionCtxt->getBearerContext();
+	if( bearerCtxt == NULL )
+	{
+		log_msg(LOG_ERROR, "Failed to retrive Bearer context for UE IDx %d\n", cb.getCBIndex());
+
+		return ActStatus::HALT;
+	}
+
+	sessionCtxt->setS11SgwCtrlFteid(Fteid(csr_info.s11_sgw_fteid));
+	sessionCtxt->setS5S8PgwCtrlFteid(Fteid(csr_info.s5s8_pgwc_fteid));
+
+	bearerCtxt->setS1uSgwUserFteid(Fteid(csr_info.s1u_sgw_fteid));
+	bearerCtxt->setS5S8PgwUserFteid(Fteid(csr_info.s5s8_pgwu_fteid));
+
+	sessionCtxt->setPdnAddr(Paa(csr_info.pdn_addr));
+		
+	ProcedureStats::num_of_processed_cs_resp ++;
+	log_msg(LOG_DEBUG, "Leaving handle_cs_resp \n");
+	
+	return ActStatus::PROCEED;
+}
+
+ActStatus ActionHandlers::send_init_ctxt_req_to_ue(SM::ControlBlock& cb)
+{
+	log_msg(LOG_DEBUG, "Inside send_init_ctxt_req_to_ue \n");
+
+	UEContext *ue_ctxt = dynamic_cast<UEContext*>(cb.getPermDataBlock());
+	if (ue_ctxt == NULL )
+	{
+		log_msg(LOG_DEBUG, "send_init_ctxt_req_to_ue: ue context is NULL \n");
+		return ActStatus::HALT;
+	}
+
+	MmeProcedureCtxt* procedure_p = dynamic_cast<MmeProcedureCtxt*>(cb.getTempDataBlock());
+	if (procedure_p == NULL)
+	{
+		log_msg(LOG_DEBUG, "send_init_ctxt_req_to_ue: procedure context is NULL \n");
+		return ActStatus::HALT;
+	}
+
+	if (procedure_p->getAttachType() == imsiAttach_c ||
+			procedure_p->getAttachType() == unknownGutiAttach_c)
+	{
+		uint32_t mTmsi = MmeCommonUtils::allocateMtmsi();
+		if (mTmsi == 0)
+		{
+			log_msg(LOG_DEBUG, "send_init_ctxt_req_to_ue: Failed to allocate mTmsi \n");
+			return ActStatus::HALT;
+		}
+
+		ue_ctxt->setMtmsi(mTmsi);
+
+		// TODO: Should this be done here or attach_done method
+		SubsDataGroupManager::Instance()->addmTmsikey(mTmsi, ue_ctxt->getContextID());
+	}
+
+	SessionContext* sessionCtxt = ue_ctxt->getSessionContext();
+	if (sessionCtxt == NULL)
+	{
+		log_msg(LOG_DEBUG, "send_init_ctxt_req_to_ue: session ctxt is NULL \n");
+		return ActStatus::HALT;
+	}
+
+	unsigned int nas_count = 0;
+	E_UTRAN_sec_vector* secVect = const_cast<E_UTRAN_sec_vector*>(ue_ctxt->getAiaSecInfo().AiaSecInfo_mp);
+	secinfo& secInfo = const_cast<secinfo&>(ue_ctxt->getUeSecInfo().secinfo_m);
+
+	SecUtils::create_kenb_key(secVect->kasme.val, secInfo.kenb_key, nas_count);
+	
+	init_ctx_req_Q_msg icr_msg;
+	icr_msg.msg_type = init_ctxt_request;
+	icr_msg.ue_idx = ue_ctxt->getContextID();
+	icr_msg.enb_fd = ue_ctxt->getEnbFd();
+	icr_msg.enb_s1ap_ue_id = ue_ctxt->getS1apEnbUeId();
+
+	icr_msg.exg_max_dl_bitrate = (ue_ctxt->getAmbr().ambr_m).max_requested_bw_dl;
+	icr_msg.exg_max_ul_bitrate = (ue_ctxt->getAmbr().ambr_m).max_requested_bw_ul;
+	BearerContext* bearerCtxt = sessionCtxt->getBearerContext();
+	if( bearerCtxt == NULL )
+	{
+		log_msg(LOG_ERROR, "Failed to retrive Bearer context for UE IDx %d\n", cb.getCBIndex());
+
+		return ActStatus::HALT;
+	}
+
+	icr_msg.bearer_id = bearerCtxt->getBearerId();
+
+	icr_msg.dl_seq_no = ue_ctxt->getDwnLnkSeqNo();
+	memcpy(&(icr_msg.tai), &(ue_ctxt->getTai().tai_m), sizeof(struct TAI));
+	memcpy(&(icr_msg.gtp_teid), &(bearerCtxt->getS1uSgwUserFteid().fteid_m), sizeof(struct fteid));
+	memcpy(&(icr_msg.apn), &(sessionCtxt->getAccessPtName().apnname_m), sizeof(struct apn_name));
+	memcpy(&(icr_msg.pdn_addr), &(sessionCtxt->getPdnAddr().paa_m), sizeof(struct PAA));
+	memcpy(&(icr_msg.int_key), &((ue_ctxt->getUeSecInfo().secinfo_m).int_key),
+			NAS_INT_KEY_SIZE);
+	memcpy(&(icr_msg.sec_key), &((ue_ctxt->getUeSecInfo().secinfo_m).kenb_key),
+			KENB_SIZE);	
+	icr_msg.pti = sessionCtxt->getPti();
+        icr_msg.m_tmsi = ue_ctxt->getMtmsi();
+	ue_ctxt->setDwnLnkSeqNo(icr_msg.dl_seq_no+1);
+
+	cmn::ipc::IpcAddress destAddr;
+	destAddr.u32 = TipcServiceInstance::s1apAppInstanceNum_c;
+
+	mmeIpcIf_g->dispatchIpcMsg((char *) &icr_msg, sizeof(icr_msg), destAddr);
+	
+	ProcedureStats::num_of_init_ctxt_req_to_ue_sent ++;
+	log_msg(LOG_DEBUG, "Leaving send_init_ctxt_req_to_ue_v \n");
+		
+	return ActStatus::PROCEED;
+}
+
+ActStatus ActionHandlers::process_init_ctxt_resp(SM::ControlBlock& cb)
+{
+	log_msg(LOG_DEBUG, "Inside process_init_ctxt_resp \n");
+
+	UEContext *ue_ctxt = dynamic_cast<UEContext*>(cb.getPermDataBlock());
+	MmeProcedureCtxt *procCtxt = dynamic_cast<MmeProcedureCtxt*>(cb.getTempDataBlock());
+
+	if (ue_ctxt == NULL || procCtxt == NULL)
+	{
+		log_msg(LOG_DEBUG, "process_init_ctxt_resp: ue context or procedure ctxt is NULL \n");
+		return ActStatus::HALT;
+	}
+
+	SessionContext* sessionCtxt = ue_ctxt->getSessionContext();
+	if (sessionCtxt == NULL)
+	{
+		log_msg(LOG_DEBUG, "process_init_ctxt_resp: session ctxt is NULL \n");
+		return ActStatus::HALT;
+	}
+	
+	MsgBuffer* msgBuf = static_cast<MsgBuffer*>(cb.getMsgData());
+
+	if (msgBuf == NULL)
+		return ActStatus::HALT;
+
+	const s1_incoming_msg_data_t* s1_msg_data = static_cast<const s1_incoming_msg_data_t*>(msgBuf->getDataPointer());
+	const struct initctx_resp_Q_msg &ics_res =s1_msg_data->msg_data.initctx_resp_Q_msg_m;
+	
+	fteid S1uEnbUserFteid;
+	S1uEnbUserFteid.header.iface_type = 0;
+	S1uEnbUserFteid.header.v4 = 1;
+	S1uEnbUserFteid.header.teid_gre = ics_res.gtp_teid;
+	S1uEnbUserFteid.ip.ipv4 = *(struct in_addr*)&ics_res.transp_layer_addr;
+	
+	BearerContext* bearerCtxt = sessionCtxt->getBearerContext();
+	if (bearerCtxt == NULL)
+	{
+		log_msg(LOG_DEBUG, "process_init_ctxt_resp: bearer ctxt is NULL \n");
+		return ActStatus::HALT;
+	}
+
+	bearerCtxt->setS1uEnbUserFteid(Fteid(S1uEnbUserFteid));
+
+	ProcedureStats::num_of_processed_init_ctxt_resp ++;
+	log_msg(LOG_DEBUG, "Leaving process_init_ctxt_resp \n");
+	
+	return ActStatus::PROCEED;
+}
+
+ActStatus ActionHandlers::send_mb_req_to_sgw(SM::ControlBlock& cb)
+{
+	log_msg(LOG_DEBUG, "Inside send_mb_req_to_sgw \n");
+
+	UEContext *ue_ctxt = dynamic_cast<UEContext*>(cb.getPermDataBlock());
+	if (ue_ctxt == NULL)
+	{
+		log_msg(LOG_DEBUG, "send_mb_req_to_sgw: ue context or procedure ctxt is NULL \n");
+		return ActStatus::HALT;
+	}
+
+	SessionContext* sessionCtxt = ue_ctxt->getSessionContext();
+	if (sessionCtxt == NULL)
+	{
+		log_msg(LOG_DEBUG, "send_mb_req_to_sgw: session ctxt is NULL \n");
+		return ActStatus::HALT;
+	}
+	
+	struct MB_Q_msg mb_msg;
+	mb_msg.msg_type = modify_bearer_request;
+	mb_msg.ue_idx = ue_ctxt->getContextID();
+	
+	memset(mb_msg.indication, 0, S11_MB_INDICATION_FLAG_SIZE); /*TODO : future*/
+	BearerContext* bearerCtxt = sessionCtxt->getBearerContext();
+	if (bearerCtxt == NULL)
+	{
+		log_msg(LOG_DEBUG, "send_mb_req_to_sgw: bearer ctxt is NULL \n");
+		return ActStatus::HALT;
+	}
+
+	mb_msg.bearer_id = bearerCtxt->getBearerId();
+
+	memcpy(&(mb_msg.s11_sgw_c_fteid), &(sessionCtxt->getS11SgwCtrlFteid().fteid_m),
+		sizeof(struct fteid));
+
+	memcpy(&(mb_msg.s1u_enb_fteid), &(bearerCtxt->getS1uEnbUserFteid().fteid_m),
+		sizeof(struct fteid));
+
+
+	cmn::ipc::IpcAddress destAddr;
+	destAddr.u32 = TipcServiceInstance::s11AppInstanceNum_c;
+
+	mmeIpcIf_g->dispatchIpcMsg((char *) &mb_msg, sizeof(mb_msg), destAddr);
+		
+	ProcedureStats::num_of_mb_req_to_sgw_sent ++;
+	log_msg(LOG_DEBUG, "Leaving send_mb_req_to_sgw \n");
+	
+	return ActStatus::PROCEED;
+
+}
+
+ActStatus ActionHandlers::process_attach_cmp_from_ue(SM::ControlBlock& cb)
+{	
+	log_msg(LOG_DEBUG, "Inside handle_attach_cmp_from_ue \n");
+
+	UEContext *ue_ctxt = dynamic_cast<UEContext*>(cb.getPermDataBlock());
+	if (ue_ctxt == NULL)
+	{
+		log_msg(LOG_ERROR, "attach_done: ue context is NULL \n");
+		return ActStatus::HALT;
+	}
+
+	ue_ctxt->setUpLnkSeqNo(ue_ctxt->getUpLnkSeqNo()+1);
+
+	ProcedureStats::num_of_processed_attach_cmp_from_ue ++;
+	log_msg(LOG_DEBUG, "Leaving handle_attach_cmp_from_ue \n");
+	
+	return ActStatus::PROCEED;
+}
+
+ActStatus ActionHandlers::process_mb_resp(SM::ControlBlock& cb)
+{	
+	log_msg(LOG_DEBUG, "Inside handle_mb_resp \n");
+	ProcedureStats::num_of_processed_mb_resp ++;
+	return ActStatus::PROCEED;
+}
+
+ActStatus ActionHandlers::attach_done(SM::ControlBlock& cb)
+{	
+	log_msg(LOG_DEBUG, "Inside attach_done \n");
+	
+	UEContext *ue_ctxt = dynamic_cast<UEContext*>(cb.getPermDataBlock());
+	if (ue_ctxt == NULL)
+	{
+		log_msg(LOG_ERROR, "attach_done: ue context is NULL \n");
+		return ActStatus::HALT;
+	}
+
+	MmContext* mmCtxt = ue_ctxt->getMmContext();
+	if (mmCtxt == NULL)
+	{
+		log_msg(LOG_ERROR, "attach_done: MMcontext is NULL \n");
+		return ActStatus::HALT;
+	}
+
+	mmCtxt->setMmState(EpsAttached);
+	
+	MmeContextManagerUtils::deallocateProcedureCtxt(cb, attach_c);
+
+	ProcedureStats::num_of_attach_done++;
+	ProcedureStats::num_of_subscribers_attached ++;
+
+	log_msg(LOG_DEBUG,"Leaving attach done\n");
+
+	return ActStatus::PROCEED;
+}
diff --git a/src/mme-app/actionHandlers/defaultMmeProcedureActionHandlers.cpp b/src/mme-app/actionHandlers/defaultMmeProcedureActionHandlers.cpp
new file mode 100644
index 0000000..269b7fc
--- /dev/null
+++ b/src/mme-app/actionHandlers/defaultMmeProcedureActionHandlers.cpp
@@ -0,0 +1,382 @@
+/*
+ * Copyright 2019-present Infosys Limited
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+/******************************************************************************
+ *
+ * This file has both generated and manual code.
+ *
+ * File template used for code generation:
+ * <TOP-DIR/scripts/SMCodeGen/templates/stateMachineTmpls/actionHandlers.cpp.tt>
+ *
+ ******************************************************************************/
+
+#include <actionHandlers/actionHandlers.h>
+#include <contextManager/dataBlocks.h>
+#include <contextManager/subsDataGroupManager.h>
+#include <controlBlock.h>
+#include <event.h>
+#include <mmeStates/attachStart.h>
+#include <mmeStates/detachStart.h>
+#include <mmeStates/niDetachStart.h>
+#include <mmeStates/pagingStart.h>
+#include <mmeStates/s1ReleaseStart.h>
+#include <mmeStates/serviceRequestStart.h>
+#include "mmeStates/tauStart.h"
+#include <msgBuffer.h>
+#include <msgType.h>
+#include <log.h>
+#include <procedureStats.h>
+#include <s1ap_structs.h>
+#include <state.h>
+#include <string.h>
+#include <sstream>
+#include <smTypes.h>
+#include <typeinfo>
+#include <utils/mmeProcedureTypes.h>
+#include <utils/mmeCommonUtils.h>
+#include <utils/mmeContextManagerUtils.h>
+
+using namespace mme;
+using namespace SM;
+
+/***************************************
+* Action handler : default_attach_req_handler
+***************************************/
+ActStatus ActionHandlers::default_attach_req_handler(ControlBlock& cb)
+{
+	log_msg(LOG_ERROR, "default_attach_req_handler \n");
+
+	UEContext* ueCtxt_p = NULL;
+	MmContext* mmctxt = NULL;
+
+	ueCtxt_p = static_cast <UEContext *>(cb.getPermDataBlock());
+	if (ueCtxt_p != NULL)
+		mmctxt = ueCtxt_p->getMmContext();
+
+	MsgBuffer* msgBuf = static_cast<MsgBuffer*>(cb.getMsgData());
+	if (msgBuf == NULL)
+	{
+		log_msg(LOG_ERROR, "Failed to retrieve message buffer \n");
+		return ActStatus::HALT;
+	}
+
+	const s1_incoming_msg_data_t* msgData_p =
+			static_cast<const s1_incoming_msg_data_t*>(msgBuf->getDataPointer());
+	if (msgData_p == NULL)
+	{
+		log_msg(LOG_ERROR, "Failed to retrieve data buffer \n");
+		return ActStatus::HALT;
+	}
+
+	const struct ue_attach_info &ue_info = (msgData_p->msg_data.ue_attach_info_m);
+
+	AttachType attachType = MmeCommonUtils::getAttachType(ueCtxt_p, ue_info);
+	if (attachType == maxAttachType_c)
+	{
+		log_msg(LOG_ERROR, "Failed to identify attach type \n");
+		return ActStatus::HALT;
+	}
+
+	if (ueCtxt_p == NULL)
+	{
+		ueCtxt_p = SubsDataGroupManager::Instance()->getUEContext();
+		if (ueCtxt_p == NULL)
+		{
+			log_msg(LOG_ERROR, "Failed to allocate UE context \n");
+
+			return ActStatus::HALT;
+		}
+
+		mmctxt = SubsDataGroupManager::Instance()->getMmContext();
+		if( mmctxt == NULL )
+		{
+			log_msg(LOG_ERROR, "Failed to allocate MM Context \n");
+
+			SubsDataGroupManager::Instance()->deleteUEContext( ueCtxt_p );
+			return ActStatus::HALT;
+		}
+
+		ueCtxt_p->setContextID(cb.getCBIndex());
+		ueCtxt_p->setMmContext( mmctxt );
+
+		cb.setPermDataBlock(ueCtxt_p);
+		cb.setFastAccessBlock(ueCtxt_p, 1);
+	}
+
+	MmeProcedureCtxt* prcdCtxt_p = SubsDataGroupManager::Instance()->getMmeProcedureCtxt();
+	if( prcdCtxt_p == NULL )
+	{
+		log_msg(LOG_ERROR, "Failed to allocate Procedure Context \n");
+
+		return ActStatus::HALT;
+	}
+
+	prcdCtxt_p->setCtxtType( ProcedureType::attach_c );
+	prcdCtxt_p->setNextState(AttachStart::Instance());
+
+	cb.setCurrentTempDataBlock(prcdCtxt_p);
+
+	// Copy attach request message data into UE Context
+
+	ueCtxt_p->setS1apEnbUeId(ue_info.s1ap_enb_ue_id);
+	ueCtxt_p->setEnbFd(ue_info.enb_fd);
+	ueCtxt_p->setTai(Tai(ue_info.tai));
+	ueCtxt_p->setUtranCgi(Cgi(ue_info.utran_cgi));
+	ueCtxt_p->setUeNetCapab(Ue_net_capab(ue_info.ue_net_capab));
+	ueCtxt_p->setMsNetCapab(Ms_net_capab(ue_info.ms_net_capab));
+	prcdCtxt_p->setPti(ue_info.pti);
+	prcdCtxt_p->setPcoOptions(ue_info.pco_options);
+	prcdCtxt_p->setEsmInfoTxRequired(ue_info.esm_info_tx_required);
+	prcdCtxt_p->setAttachType(attachType);
+
+	switch(attachType)
+	{
+		case imsiAttach_c:
+		{
+			uint8_t imsi[BINARY_IMSI_LEN] = {0};
+		    	memcpy( imsi, ue_info.IMSI, BINARY_IMSI_LEN );
+
+			// Only upper nibble of first octect in imsi need to be considered
+			// Changing the lower nibble to 0x0f for handling
+			uint8_t first = imsi[0] >> 4;
+			imsi[0] = (uint8_t)(( first << 4 ) | 0x0f );
+
+			DigitRegister15 IMSIInfo;
+			IMSIInfo.convertFromBcdArray(imsi);
+			ueCtxt_p->setImsi(IMSIInfo);
+
+			SubsDataGroupManager::Instance()->addimsikey(ueCtxt_p->getImsi(), ueCtxt_p->getContextID());
+
+			SM::Event evt(Event_e::VALIDATE_IMSI, NULL);
+			cb.addEventToProcQ(evt);
+
+			break;
+		}
+		case knownGutiAttach_c:
+		{
+			// copy seq num?
+
+			SM::Event evt(Event_e::VALIDATE_IMSI, NULL);
+			cb.addEventToProcQ(evt);
+
+			break;
+		}
+		case unknownGutiAttach_c:
+		{
+			SM::Event evt(Event_e::VALIDATE_IMSI, NULL);
+			cb.addEventToProcQ(evt);
+
+			break;
+		}
+		default:
+		{
+			log_msg(LOG_ERROR, "Unhandled attach type %s", attachType);
+		}
+	}
+
+	return ActStatus::PROCEED;
+}
+
+/***************************************
+* Action handler : default_detach_req_handler
+***************************************/
+ActStatus ActionHandlers::default_detach_req_handler(ControlBlock& cb)
+{
+	MmeDetachProcedureCtxt* prcdCtxt_p = SubsDataGroupManager::Instance()->getMmeDetachProcedureCtxt();
+	if( prcdCtxt_p == NULL )
+	{
+		log_msg(LOG_ERROR, "Failed to allocate procedure context for detach cbIndex %d\n", cb.getCBIndex());
+
+		return ActStatus::HALT;
+	}
+
+	prcdCtxt_p->setCtxtType( ProcedureType::detach_c );
+	prcdCtxt_p->setDetachType( DetachType::ueInitDetach_c );
+	prcdCtxt_p->setNextState(DetachStart::Instance());
+	cb.setCurrentTempDataBlock(prcdCtxt_p);
+
+	SM::Event evt(Event_e::DETACH_REQ_FROM_UE, NULL);
+	cb.addEventToProcQ(evt);
+
+	return ActStatus::PROCEED;
+}
+
+/***************************************
+* Action handler : default_ddn_handler
+***************************************/
+ActStatus ActionHandlers::default_ddn_handler(ControlBlock& cb)
+{
+	MmeSvcReqProcedureCtxt* svcReqProc_p = SubsDataGroupManager::Instance()->getMmeSvcReqProcedureCtxt();
+	if (svcReqProc_p == NULL)
+	{
+		log_msg(LOG_ERROR, "Failed to allocate procedure context"
+				" for DDN handling cbIndex %d\n", cb.getCBIndex());
+
+		return ActStatus::HALT;
+	}
+	
+	MsgBuffer* msgBuf = static_cast<MsgBuffer*>(cb.getMsgData());
+
+	if (msgBuf == NULL)
+	{
+	    log_msg(LOG_DEBUG,"process_ddn: msgBuf is NULL \n");
+	    return ActStatus::HALT;
+   	}
+
+   	const gtp_incoming_msg_data_t* gtp_msg_data= static_cast<const gtp_incoming_msg_data_t*>(msgBuf->getDataPointer());
+   	const struct ddn_Q_msg& ddn_info = gtp_msg_data->msg_data.ddn_Q_msg_m;
+
+	svcReqProc_p->setCtxtType(ProcedureType::serviceRequest_c);
+	svcReqProc_p->setNextState(PagingStart::Instance());
+	svcReqProc_p->setPagingTrigger(ddnInit_c);
+	svcReqProc_p->setDdnSeqNo(ddn_info.seq_no);
+	svcReqProc_p->setArp(Arp(ddn_info.arp));
+	svcReqProc_p->setEpsBearerId(ddn_info.eps_bearer_id);
+
+	cb.setCurrentTempDataBlock(svcReqProc_p);
+    
+	SM::Event evt(Event_e::DDN_FROM_SGW, NULL);
+	cb.addEventToProcQ(evt);
+	return ActStatus::PROCEED;
+}
+
+/***************************************
+* Action handler : default_service_req_handler
+***************************************/
+ActStatus ActionHandlers::default_service_req_handler(ControlBlock& cb)
+{
+	MmeSvcReqProcedureCtxt* svcReqProc_p = SubsDataGroupManager::Instance()->getMmeSvcReqProcedureCtxt();
+	if (svcReqProc_p == NULL)
+	{
+		log_msg(LOG_ERROR, "Failed to allocate procedure context"
+				" for service request cbIndex %d\n", cb.getCBIndex());
+
+		return ActStatus::HALT;
+	}
+
+	svcReqProc_p->setCtxtType(ProcedureType::serviceRequest_c);
+	svcReqProc_p->setNextState(ServiceRequestStart::Instance());
+	cb.setCurrentTempDataBlock(svcReqProc_p);
+
+	SM::Event evt(Event_e::SERVICE_REQUEST_FROM_UE, NULL);
+	cb.addEventToProcQ(evt);
+
+    return ActStatus::PROCEED;
+}
+
+/***************************************
+* Action handler : default_cancel_loc_req_handler
+***************************************/
+ActStatus ActionHandlers::default_cancel_loc_req_handler(ControlBlock& cb)
+{
+	UEContext *ueCtxt = dynamic_cast<UEContext*>(cb.getPermDataBlock());
+	if (ueCtxt == NULL)
+	{
+		log_msg(LOG_DEBUG, "ue context is NULL \n");
+		return ActStatus::HALT;
+	}
+
+	MmContext* mmCtxt = ueCtxt->getMmContext();
+	if (mmCtxt == NULL)
+	{
+		log_msg(LOG_DEBUG, "mm context is NULL \n");
+		return ActStatus::HALT;
+	}
+
+	if (mmCtxt->getMmState() == EpsDetached)
+	{
+		log_msg(LOG_INFO, "Subscriber is already detached. "
+				"Cleaning up the contexts. UE IDx %d\n", cb.getCBIndex());
+		
+		MmeContextManagerUtils::deleteUEContext(cb.getCBIndex());
+
+		return ActStatus::PROCEED;
+	}
+
+	MmeDetachProcedureCtxt* prcdCtxt_p = SubsDataGroupManager::Instance()->getMmeDetachProcedureCtxt();
+	if(prcdCtxt_p == NULL)
+	{
+		log_msg(LOG_ERROR, "Failed to allocate Procedure Ctxt\n");
+		return ActStatus::HALT;
+	}
+	prcdCtxt_p->setCtxtType( ProcedureType::detach_c );
+	prcdCtxt_p->setDetachType(DetachType::hssInitDetach_c);
+	prcdCtxt_p->setNextState(NiDetachStart::Instance());
+	prcdCtxt_p->setCancellationType(SUBSCRIPTION_WITHDRAWAL);
+	cb.setCurrentTempDataBlock(prcdCtxt_p);
+
+	SM::Event evt(Event_e::CLR_FROM_HSS, NULL);
+	cb.addEventToProcQ(evt);
+
+    return ActStatus::PROCEED;
+}
+
+/***************************************
+* Action handler : default_s1_release_req_handler
+***************************************/
+ActStatus ActionHandlers::default_s1_release_req_handler(ControlBlock& cb)
+{
+	MmeProcedureCtxt* prcdCtxt_p = SubsDataGroupManager::Instance()->getMmeProcedureCtxt();
+	if( prcdCtxt_p == NULL )
+	{
+		log_msg(LOG_ERROR, "Failed to allocate procedure Ctxt \n");
+		return ActStatus::HALT;
+	}
+
+	prcdCtxt_p->setCtxtType( ProcedureType::s1Release_c );
+	prcdCtxt_p->setNextState(S1ReleaseStart::Instance());
+	cb.setCurrentTempDataBlock(prcdCtxt_p);
+
+	ProcedureStats::num_of_s1_rel_req_received ++;
+
+	SM::Event evt(Event_e::S1_REL_REQ_FROM_UE, NULL);
+	cb.addEventToProcQ(evt);
+
+	return ActStatus::PROCEED;
+}
+
+/***************************************
+* Action handler : default_tau_req_handler
+***************************************/
+ActStatus ActionHandlers::default_tau_req_handler(ControlBlock& cb)
+{
+	MmeTauProcedureCtxt* tauReqProc_p = SubsDataGroupManager::Instance()->getMmeTauProcedureCtxt();
+	if (tauReqProc_p == NULL)
+	{
+		log_msg(LOG_ERROR, "Failed to allocate procedure context"
+				" for tau request cbIndex %d\n", cb.getCBIndex());
+
+		return ActStatus::HALT;
+	}
+	
+	MsgBuffer* msgBuf = static_cast<MsgBuffer*>(cb.getMsgData());
+	if (msgBuf == NULL)
+	{	
+            log_msg(LOG_DEBUG,"process_tau_req: msgBuf is NULL \n");
+            return ActStatus::HALT;
+	}
+	
+	const s1_incoming_msg_data_t* msgData_p =
+			static_cast<const s1_incoming_msg_data_t*>(msgBuf->getDataPointer());
+	if (msgData_p == NULL)
+	{
+		log_msg(LOG_ERROR, "Failed to retrieve data buffer \n");
+		return ActStatus::HALT;
+	}
+
+	const struct tauReq_Q_msg &tauReq = (msgData_p->msg_data.tauReq_Q_msg_m);	
+	
+	tauReqProc_p->setCtxtType(ProcedureType::tau_c);
+	tauReqProc_p->setNextState(TauStart::Instance());	
+	tauReqProc_p->setS1apEnbUeId(msgData_p->s1ap_enb_ue_id);
+	tauReqProc_p->setEnbFd(tauReq.enb_fd);
+	cb.setCurrentTempDataBlock(tauReqProc_p);	
+
+	SM::Event evt(Event_e::TAU_REQUEST_FROM_UE, NULL);
+	cb.addEventToProcQ(evt);
+	return ActStatus::PROCEED;
+}
+
diff --git a/src/mme-app/actionHandlers/networkInitDetachActionHandlers.cpp b/src/mme-app/actionHandlers/networkInitDetachActionHandlers.cpp
new file mode 100644
index 0000000..2b75249
--- /dev/null
+++ b/src/mme-app/actionHandlers/networkInitDetachActionHandlers.cpp
@@ -0,0 +1,168 @@
+/*
+ * Copyright 2019-present Infosys Limited
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#include <typeinfo>
+#include "actionHandlers/actionHandlers.h"
+#include "controlBlock.h"
+#include "msgType.h"
+#include "contextManager/subsDataGroupManager.h"
+#include "contextManager/dataBlocks.h"
+#include "procedureStats.h"
+#include "log.h"
+#include "secUtils.h"
+#include "state.h"
+#include <string.h>
+#include <sstream>
+#include <smTypes.h>
+
+#include <ipcTypes.h>
+#include <tipcTypes.h>
+#include <msgBuffer.h>
+#include <interfaces/mmeIpcInterface.h>
+#include <utils/mmeContextManagerUtils.h>
+
+using namespace SM;
+using namespace mme;
+using namespace cmn::utils;
+
+extern MmeIpcInterface* mmeIpcIf_g;
+
+ActStatus ActionHandlers::ni_detach_req_to_ue(SM::ControlBlock& cb)
+{
+	log_msg(LOG_DEBUG, "Inside ni_detach_req_to_ue \n");
+	
+	UEContext *ue_ctxt =  dynamic_cast<UEContext*>(cb.getPermDataBlock());
+	
+	if (ue_ctxt == NULL)
+	{
+		log_msg(LOG_DEBUG, "ni_detach_req_to_ue: ue context is NULL\n");
+		return ActStatus::HALT;
+	}
+	
+	ni_detach_request_Q_msg ni_detach_req;
+	
+	ni_detach_req.msg_type = ni_detach_request;
+	ni_detach_req.enb_fd = ue_ctxt->getEnbFd();
+	ni_detach_req.ue_idx = ue_ctxt->getContextID();
+	ni_detach_req.enb_s1ap_ue_id =  ue_ctxt->getS1apEnbUeId();
+	ni_detach_req.detach_type = 00000010;
+	
+	ue_ctxt->setDwnLnkSeqNo(ue_ctxt->getDwnLnkSeqNo()+1);
+	ni_detach_req.dl_seq_no = ue_ctxt->getDwnLnkSeqNo();
+	
+	memcpy(&(ni_detach_req.int_key), &(ue_ctxt->getUeSecInfo().secinfo_m.int_key), NAS_INT_KEY_SIZE);
+	
+	/* Send message to S1app in S1q*/
+	cmn::ipc::IpcAddress destAddr;
+	destAddr.u32 = TipcServiceInstance::s1apAppInstanceNum_c;
+
+	mmeIpcIf_g->dispatchIpcMsg((char *) &ni_detach_req, sizeof(ni_detach_req), destAddr);
+	
+	log_msg(LOG_DEBUG, "Leaving ni_detach_req_to_ue \n");
+
+	ProcedureStats::num_of_clr_received ++;
+	ProcedureStats::num_of_detach_req_to_ue_sent ++;
+
+	return ActStatus::PROCEED;
+}
+
+ActStatus ActionHandlers::process_detach_accept_from_ue(SM::ControlBlock& cb)
+{
+	log_msg(LOG_DEBUG, "Inside process_detach_accept_from_ue \n");
+		
+	UEContext *ue_ctxt = dynamic_cast<UEContext*>(cb.getPermDataBlock());
+	
+	if (ue_ctxt == NULL)
+	{
+		log_msg(LOG_DEBUG, "process_detach_accept_from_ue: ue context is NULL\n");
+		return ActStatus::HALT;
+	}
+		
+	ue_ctxt->setUpLnkSeqNo(ue_ctxt->getUpLnkSeqNo()+1);
+	
+	log_msg(LOG_DEBUG, "Leaving process_detach_accept_from_ue \n");
+
+	ProcedureStats::num_of_cla_sent ++;
+	ProcedureStats::num_of_detach_accept_from_ue ++;
+
+	return ActStatus::PROCEED;
+}
+
+/***************************************
+* Action handler : send_s1_rel_cmd_to_ue_for_detach
+***************************************/
+ActStatus ActionHandlers::send_s1_rel_cmd_to_ue_for_detach(ControlBlock& cb)
+{
+    log_msg(LOG_DEBUG, "Inside send_s1_rel_cmd_to_ue_for_detach\n");
+
+    UEContext *ue_ctxt = dynamic_cast<UEContext*>(cb.getPermDataBlock());
+    if(ue_ctxt == NULL)
+    {
+            log_msg(LOG_DEBUG, "send_s1_rel_cmd_to_ue_for_detach: ue context is NULL \n");
+            return ActStatus::HALT;
+    }
+
+    struct s1relcmd_info s1relcmd;
+
+    s1relcmd.msg_type = s1_release_command;
+    s1relcmd.ue_idx = ue_ctxt->getContextID();
+    s1relcmd.enb_fd = ue_ctxt->getEnbFd();
+    s1relcmd.enb_s1ap_ue_id = ue_ctxt->getS1apEnbUeId();
+    s1relcmd.cause.present = s1apCause_PR_radioNetwork;
+    s1relcmd.cause.choice.radioNetwork = s1apCauseRadioNetwork_user_inactivity;
+
+    /*Send message to S1AP-APP*/
+    cmn::ipc::IpcAddress destAddr;
+    destAddr.u32 = TipcServiceInstance::s1apAppInstanceNum_c;
+    mmeIpcIf_g->dispatchIpcMsg((char *) &s1relcmd, sizeof(s1relcmd), destAddr);
+
+    log_msg(LOG_DEBUG,"Leaving send_s1_rel_cmd_to_ue \n");
+
+    ProcedureStats::num_of_s1_rel_cmd_sent ++;
+    return ActStatus::PROCEED;
+}
+
+/************************************************************
+* Action handler : process_ue_ctxt_rel_comp_for_detach
+**************************************************************/
+ActStatus ActionHandlers::process_ue_ctxt_rel_comp_for_detach(ControlBlock& cb)
+{
+    log_msg(LOG_DEBUG, "Inside process_ue_ctxt_rel_comp_for_detach \n");
+
+    UEContext *ueCtxt = dynamic_cast<UEContext*>(cb.getPermDataBlock());
+    MmeDetachProcedureCtxt *procCtxt = dynamic_cast<MmeDetachProcedureCtxt*>(cb.getTempDataBlock());
+    if (ueCtxt == NULL || procCtxt == NULL)
+    {
+    	log_msg(LOG_DEBUG, "UE context or  procedure context is NULL\n");
+    	return ActStatus::HALT;
+    }
+
+    MmContext* mmCtxt = ueCtxt->getMmContext();
+    if (mmCtxt == NULL)
+    {
+    	log_msg(LOG_DEBUG, "MM context is NULL \n");
+    	return ActStatus::HALT;
+    }
+
+    if(procCtxt->getCancellationType() == SUBSCRIPTION_WITHDRAWAL)
+    {
+        MmeContextManagerUtils::deleteUEContext(cb.getCBIndex());
+    }
+    else
+    {
+    	mmCtxt->setMmState( EpsDetached );
+    	MmeContextManagerUtils::deallocateProcedureCtxt(cb, detach_c);
+    }
+
+    ProcedureStats::num_of_subscribers_detached ++;
+    ProcedureStats::num_of_subscribers_attached --;
+
+    log_msg(LOG_DEBUG, "Leaving process_ue_ctxt_rel_comp_for_detach \n");
+
+    return ActStatus::PROCEED;
+
+}
+
diff --git a/src/mme-app/actionHandlers/s1releaseActionHandlers.cpp b/src/mme-app/actionHandlers/s1releaseActionHandlers.cpp
new file mode 100644
index 0000000..de3d16f
--- /dev/null
+++ b/src/mme-app/actionHandlers/s1releaseActionHandlers.cpp
@@ -0,0 +1,151 @@
+/*
+ * Copyright 2019-present Infosys Limited
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+/******************************************************************************
+ *
+ * This file has both generated and manual code.
+ *
+ * File template used for code generation:
+ * <TOP-DIR/scripts/SMCodeGen/templates/stateMachineTmpls/actionHandlers.cpp.tt>
+ *
+ ******************************************************************************/
+
+#include <typeinfo>
+#include "actionHandlers/actionHandlers.h"
+#include "controlBlock.h"
+#include "msgType.h"
+#include "contextManager/subsDataGroupManager.h"
+#include "contextManager/dataBlocks.h"
+#include "procedureStats.h"
+#include "log.h"
+#include "secUtils.h"
+#include "state.h"
+#include <string.h>
+#include <sstream>
+#include <smTypes.h>
+
+#include <ipcTypes.h>
+#include <tipcTypes.h>
+#include <msgBuffer.h>
+#include <interfaces/mmeIpcInterface.h>
+#include <utils/mmeContextManagerUtils.h>
+
+using namespace SM;
+using namespace mme;
+using namespace cmn::utils;
+
+extern MmeIpcInterface* mmeIpcIf_g;
+
+ActStatus ActionHandlers:: send_rel_ab_req_to_sgw(SM::ControlBlock& cb)
+{
+	log_msg(LOG_DEBUG, "Inside send_rel_ab_req_to_sgw \n");
+
+	UEContext *ue_ctxt = dynamic_cast<UEContext*>(cb.getPermDataBlock());
+	if (ue_ctxt == NULL)
+	{
+		log_msg(LOG_DEBUG, "send_rel_ab_req_to_sgw: ue ctxt is NULL \n");
+		return ActStatus::HALT;
+	}
+	
+	SessionContext* sessionCtxt = ue_ctxt->getSessionContext();
+	if (sessionCtxt == NULL)
+	{
+		log_msg(LOG_DEBUG, " send_rel_ab_req_to_sgw: session ctxt is NULL \n");
+		return ActStatus::HALT;
+	}
+
+	BearerContext* bearerCtxt = sessionCtxt->getBearerContext();
+	if (bearerCtxt == NULL)
+	{
+		log_msg(LOG_DEBUG, " send_rel_ab_req_to_sgw: bearer ctxt is NULL \n");
+		return ActStatus::HALT;
+	}
+
+	struct RB_Q_msg rb_msg;
+	rb_msg.msg_type = release_bearer_request;
+	rb_msg.ue_idx = ue_ctxt->getContextID();
+	memset(rb_msg.indication, 0 , S11_RB_INDICATION_FLAG_SIZE);
+	rb_msg.bearer_id = bearerCtxt->getBearerId();
+	memcpy(&(rb_msg.s11_sgw_c_fteid), &(sessionCtxt->getS11SgwCtrlFteid()),
+			sizeof(struct fteid));
+	memcpy(&(rb_msg.s1u_enb_fteid), &(bearerCtxt->getS1uEnbUserFteid()),
+			sizeof(struct fteid));
+			
+	cmn::ipc::IpcAddress destAddr;
+	destAddr.u32 = TipcServiceInstance::s11AppInstanceNum_c;
+	mmeIpcIf_g->dispatchIpcMsg((char *) &rb_msg, sizeof(rb_msg), destAddr);
+
+	ProcedureStats::num_of_rel_access_bearer_req_sent ++;
+	
+	log_msg(LOG_DEBUG, "Inside send_rel_ab_req_to_sgw \n");
+
+	return ActStatus::PROCEED;
+}
+
+ActStatus ActionHandlers:: process_rel_ab_resp_from_sgw(SM::ControlBlock& cb)
+{
+	log_msg(LOG_DEBUG, "process_rel_ab_resp_from_sgw \n");
+
+	ProcedureStats::num_of_rel_access_bearer_resp_received ++;
+
+	return ActStatus::PROCEED;
+}
+
+ActStatus ActionHandlers:: send_s1_rel_cmd_to_ue(SM::ControlBlock& cb)
+{
+	log_msg(LOG_DEBUG, "Inside send_s1_rel_cmd_to_ue\n");
+
+	UEContext *ue_ctxt = dynamic_cast<UEContext*>(cb.getPermDataBlock());
+	if(ue_ctxt == NULL)
+	{
+		log_msg(LOG_DEBUG, "send_s1_rel_cmd_to_ue: ue context is NULL \n");
+
+		return ActStatus::HALT;
+	}
+	
+	struct s1relcmd_info s1relcmd;
+	s1relcmd.msg_type = s1_release_command;
+	s1relcmd.ue_idx = ue_ctxt->getContextID();
+	s1relcmd.enb_fd = ue_ctxt->getEnbFd();
+	s1relcmd.enb_s1ap_ue_id = ue_ctxt->getS1apEnbUeId();
+	s1relcmd.cause.present = s1apCause_PR_radioNetwork;
+    	s1relcmd.cause.choice.radioNetwork = s1apCauseRadioNetwork_user_inactivity;
+
+	/*Send message to S1AP-APP*/
+	cmn::ipc::IpcAddress destAddr;
+	destAddr.u32 = TipcServiceInstance::s1apAppInstanceNum_c;
+	mmeIpcIf_g->dispatchIpcMsg((char *) &s1relcmd, sizeof(s1relcmd), destAddr);
+	
+	ProcedureStats::num_of_s1_rel_cmd_sent ++;
+	
+	log_msg(LOG_DEBUG,"Leaving send_s1_rel_cmd_to_ue \n");
+
+	return ActStatus::PROCEED;
+}
+
+ActStatus ActionHandlers:: process_ue_ctxt_rel_comp(SM::ControlBlock& cb)
+{
+	log_msg(LOG_DEBUG, "Inside handle_ctxt_rel_comp \n");
+
+	UEContext *ue_ctxt = dynamic_cast<UEContext*>(cb.getPermDataBlock());
+	if (ue_ctxt == NULL)
+	{
+		log_msg(LOG_DEBUG, "process_ue_ctxt_rel_comp: ue context is NULL\n");
+
+		return ActStatus::HALT;
+	}
+
+	MmeContextManagerUtils::deallocateProcedureCtxt(cb, s1Release_c);
+
+	ProcedureStats::num_of_s1_rel_comp_received++;
+
+    	log_msg(LOG_DEBUG, "Leaving process_ue_ctxt_rel_comp \n");
+
+    	return ActStatus::PROCEED;
+}
+
+	
+	
diff --git a/src/mme-app/actionHandlers/serviceRequestActionHandlers.cpp b/src/mme-app/actionHandlers/serviceRequestActionHandlers.cpp
new file mode 100644
index 0000000..3cbe859
--- /dev/null
+++ b/src/mme-app/actionHandlers/serviceRequestActionHandlers.cpp
@@ -0,0 +1,328 @@
+
+/*
+ * Copyright 2019-present Infosys Limited
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+/******************************************************************************
+ *
+ * This file has both generated and manual code.
+ *
+ * File template used for code generation:
+ * <TOP-DIR/scripts/SMCodeGen/templates/stateMachineTmpls/actionHandlers.cpp.tt>
+ *
+ ******************************************************************************/
+
+#include <typeinfo>
+#include "actionHandlers/actionHandlers.h"
+#include "controlBlock.h"
+#include "msgType.h"
+#include "contextManager/subsDataGroupManager.h"
+#include "contextManager/dataBlocks.h"
+#include "procedureStats.h"
+#include "log.h"
+#include "secUtils.h"
+#include "state.h"
+#include <string.h>
+#include <sstream>
+#include <smTypes.h>
+#include "common_proc_info.h"
+#include <ipcTypes.h>
+#include <tipcTypes.h>
+#include <msgBuffer.h>
+#include <interfaces/mmeIpcInterface.h>
+#include <event.h>
+#include <stateMachineEngine.h>
+#include <utils/mmeContextManagerUtils.h>
+
+using namespace mme;
+using namespace SM;
+using namespace cmn::utils;
+
+extern MmeIpcInterface* mmeIpcIf_g;
+
+/***************************************
+* Action handler :send_paging_req_to_ue 
+***************************************/
+ActStatus ActionHandlers::send_paging_req_to_ue(ControlBlock& cb)
+{	
+	log_msg(LOG_INFO,"Inside send_paging_req\n");
+
+	UEContext *ue_ctxt = dynamic_cast<UEContext*>(cb.getPermDataBlock());
+	
+	if (ue_ctxt == NULL)
+	{
+		log_msg(LOG_DEBUG, "send_paging_req: ue context is NULL\n");
+		return ActStatus::HALT;
+	}
+	
+	struct paging_req_Q_msg pag_req;
+	pag_req.msg_type = paging_request;
+	pag_req.ue_idx = ue_ctxt->getContextID();
+	pag_req.enb_s1ap_ue_id = ue_ctxt->getS1apEnbUeId();
+	pag_req.enb_fd = ue_ctxt->getEnbFd();
+	pag_req.cn_domain = CN_DOMAIN_PS;
+
+	const DigitRegister15& ueImsi = ue_ctxt->getImsi();
+	ueImsi.convertToBcdArray( pag_req.IMSI );
+	memcpy(&pag_req.tai, &(ue_ctxt->getTai().tai_m), sizeof(struct TAI));
+
+	cmn::ipc::IpcAddress destAddr;
+	destAddr.u32 = TipcServiceInstance::s1apAppInstanceNum_c;
+	mmeIpcIf_g->dispatchIpcMsg((char *) &pag_req, sizeof(pag_req), destAddr);
+
+	ProcedureStats::num_of_ddn_received++;
+
+	log_msg(LOG_INFO,"Leaving send_paging_req\n");
+
+	return ActStatus::PROCEED;
+}
+
+/***************************************
+* Action handler : process_service_request
+***************************************/
+ActStatus ActionHandlers::process_service_request(ControlBlock& cb)
+{
+    log_msg(LOG_DEBUG, "Inside process_service_request \n");
+	
+	UEContext *ue_ctxt = dynamic_cast<UEContext*>(cb.getPermDataBlock());
+
+	if (ue_ctxt == NULL )
+	{
+		log_msg(LOG_DEBUG, "process_service_request: ue ctxt is NULL \n");
+		return ActStatus::HALT;
+	}
+	
+	log_msg(LOG_DEBUG, "Leaving process_service_request \n");
+
+	ProcedureStats::num_of_service_request_received ++;
+
+	return ActStatus::PROCEED;
+}
+
+/***************************************
+* Action handler : send_ddn_ack_to_sgw
+***************************************/
+ActStatus ActionHandlers::send_ddn_ack_to_sgw(ControlBlock& cb)
+{
+    log_msg(LOG_DEBUG, "Inside send_ddn_ack_to_sgw \n");
+		
+	UEContext *ue_ctxt = static_cast<UEContext*>(cb.getPermDataBlock());
+	MmeSvcReqProcedureCtxt* srPrcdCtxt_p = dynamic_cast<MmeSvcReqProcedureCtxt*>(cb.getTempDataBlock());
+	
+	if (ue_ctxt == NULL || srPrcdCtxt_p == NULL)
+	{
+	    log_msg(LOG_DEBUG, "send_ddn_ack_to_sgw: ue ctxt or MmeSvcReqProcedureCtxt is NULL \n");
+	    return ActStatus::HALT;
+	}
+
+	DDN_ACK_Q_msg ddn_ack;
+	ddn_ack.msg_type = ddn_acknowledgement;
+	ddn_ack.ue_idx= ue_ctxt->getContextID();
+	ddn_ack.seq_no= srPrcdCtxt_p->getDdnSeqNo();
+	ddn_ack.cause = 16;
+	
+	cmn::ipc::IpcAddress destAddr;
+	destAddr.u32 = TipcServiceInstance::s11AppInstanceNum_c;
+
+	mmeIpcIf_g->dispatchIpcMsg((char *) &ddn_ack, sizeof(ddn_ack), destAddr);
+	
+	log_msg(LOG_DEBUG, "Leaving send_ddn_ack_to_sgw \n");
+
+	ProcedureStats::num_of_ddn_ack_sent ++;
+	
+	return ActStatus::PROCEED;
+}
+
+/***************************************
+* Action handler : perform_auth_and_sec_check
+***************************************/
+ActStatus ActionHandlers::perform_auth_and_sec_check(ControlBlock& cb)
+{
+    log_msg(LOG_DEBUG, "Inside auth_and_sec_check \n");
+	SM::ControlBlock* controlBlk_p = SubsDataGroupManager::Instance()->findControlBlock(cb.getCBIndex());	
+	UEContext *ue_ctxt = dynamic_cast<UEContext*>(cb.getPermDataBlock());
+	
+	if (ue_ctxt == NULL)
+	{
+		log_msg(LOG_DEBUG, "auth_and_sec_check: ue context is NULL\n");
+		return ActStatus::HALT;
+	}
+	
+	log_msg(LOG_DEBUG, "Leaving auth_and_sec_check \n");
+	
+
+	SM::Event evt(Event_e::AUTH_AND_SEC_CHECK_COMPLETE, NULL);
+
+	controlBlk_p->addEventToProcQ(evt);
+
+	
+	return ActStatus::PROCEED;
+}
+/***************************************************
+* Action handler : send_init_ctxt_req_to_ue_svc_req
+****************************************************/
+ActStatus ActionHandlers::send_init_ctxt_req_to_ue_svc_req(ControlBlock& cb)
+{
+    log_msg(LOG_DEBUG, "Inside send_init_ctxt_req_to_ue_svc_req \n");
+
+        UEContext *ue_ctxt = dynamic_cast<UEContext*>(cb.getPermDataBlock());
+        if (ue_ctxt == NULL )
+        {
+                log_msg(LOG_DEBUG, "send_init_ctxt_req_to_ue_svc_req : ue context is NULL \n");
+                return ActStatus::HALT;
+        }
+
+        SessionContext* sessionCtxt = ue_ctxt->getSessionContext();
+        if (sessionCtxt == NULL)
+        {
+                log_msg(LOG_DEBUG, "send_init_ctxt_req_to_ue_svc_req : session ctxt is NULL \n");
+                return ActStatus::HALT;
+        }
+
+        unsigned int nas_count = 0;
+        E_UTRAN_sec_vector* secVect = const_cast<E_UTRAN_sec_vector*>(ue_ctxt->getAiaSecInfo().AiaSecInfo_mp);
+        secinfo& secInfo = const_cast<secinfo&>(ue_ctxt->getUeSecInfo().secinfo_m);
+
+        SecUtils::create_kenb_key(secVect->kasme.val, secInfo.kenb_key, nas_count);
+
+        ics_req_paging_Q_msg icr_msg;
+        icr_msg.msg_type = ics_req_paging;
+        icr_msg.ue_idx = ue_ctxt->getContextID();
+        icr_msg.enb_fd = ue_ctxt->getEnbFd();
+        icr_msg.enb_s1ap_ue_id = ue_ctxt->getS1apEnbUeId();
+
+        icr_msg.ueag_max_ul_bitrate = (ue_ctxt->getAmbr().ambr_m).max_requested_bw_dl;
+        icr_msg.ueag_max_dl_bitrate = (ue_ctxt->getAmbr().ambr_m).max_requested_bw_ul;
+        BearerContext* bearerCtxt = sessionCtxt->getBearerContext();
+        icr_msg.bearer_id = bearerCtxt->getBearerId();
+
+        
+       	memcpy(&(icr_msg.gtp_teid), &(bearerCtxt->getS1uSgwUserFteid().fteid_m), sizeof(struct fteid));
+        memcpy(&(icr_msg.sec_key), &((ue_ctxt->getUeSecInfo().secinfo_m).kenb_key),
+                        KENB_SIZE);
+
+        //ue_ctxt->setdwnLnkSeqNo(icr_msg.dl_seq_no+1);
+
+        cmn::ipc::IpcAddress destAddr;
+        destAddr.u32 = TipcServiceInstance::s1apAppInstanceNum_c;
+
+        mmeIpcIf_g->dispatchIpcMsg((char *) &icr_msg, sizeof(icr_msg), destAddr);
+
+        ProcedureStats::num_of_init_ctxt_req_to_ue_sent ++;
+        log_msg(LOG_DEBUG, "Leaving send_init_ctxt_req_to_ue_svc_req_ \n");
+
+    	return ActStatus::PROCEED;
+}
+
+/***************************************
+* Action handler : process_init_ctxt_resp_svc_req
+***************************************/
+ActStatus ActionHandlers::process_init_ctxt_resp_svc_req(ControlBlock& cb)
+{
+    	log_msg(LOG_DEBUG, "Inside process_init_ctxt_resp_svc_req \n");
+
+        UEContext *ue_ctxt = dynamic_cast<UEContext*>(cb.getPermDataBlock());
+        MmeProcedureCtxt *procCtxt = dynamic_cast<MmeProcedureCtxt*>(cb.getTempDataBlock());
+
+        if (ue_ctxt == NULL || procCtxt == NULL)
+        {
+                log_msg(LOG_DEBUG, "process_init_ctxt_resp_svc_req: ue context or procedure ctxt is NULL \n");
+                return ActStatus::HALT;
+        }
+
+        SessionContext* sessionCtxt = ue_ctxt->getSessionContext();
+        if (sessionCtxt == NULL)
+        {
+                log_msg(LOG_DEBUG, "process_init_ctxt_resp_svc_req: session ctxt is NULL \n");
+                return ActStatus::HALT;
+        }
+
+        MsgBuffer* msgBuf = static_cast<MsgBuffer*>(cb.getMsgData());
+
+        if (msgBuf == NULL)
+                return ActStatus::HALT;
+
+        const s1_incoming_msg_data_t* s1_msg_data = static_cast<const s1_incoming_msg_data_t*>(msgBuf->getDataPointer());
+        const struct initctx_resp_Q_msg &ics_res =s1_msg_data->msg_data.initctx_resp_Q_msg_m;
+
+        fteid S1uEnbUserFteid;
+        S1uEnbUserFteid.header.iface_type = 0;
+        S1uEnbUserFteid.header.v4 = 1;
+        S1uEnbUserFteid.header.teid_gre = ics_res.gtp_teid;
+        S1uEnbUserFteid.ip.ipv4 = *(struct in_addr*)&ics_res.transp_layer_addr;
+	
+	    BearerContext* bearerCtxt = sessionCtxt->getBearerContext();
+	    if (bearerCtxt)
+	        bearerCtxt->setS1uEnbUserFteid(Fteid(S1uEnbUserFteid));
+
+        ProcedureStats::num_of_processed_init_ctxt_resp ++;
+        log_msg(LOG_DEBUG, "Leaving process_init_ctxt_resp_svc_req \n");
+
+	return ActStatus::PROCEED;
+}
+
+
+/***************************************
+* Action handler : send_mb_req_to_sgw_svc_req
+***************************************/
+ActStatus ActionHandlers::send_mb_req_to_sgw_svc_req(ControlBlock& cb)
+{
+    	log_msg(LOG_DEBUG, "Inside send_mb_req_to_sgw_svc_req \n");
+
+        UEContext *ue_ctxt = dynamic_cast<UEContext*>(cb.getPermDataBlock());
+        MmeProcedureCtxt *procCtxt = dynamic_cast<MmeProcedureCtxt*>(cb.getTempDataBlock());
+
+        if (ue_ctxt == NULL || procCtxt == NULL)
+        {
+                log_msg(LOG_DEBUG, "send_mb_req_to_sgw_svc_req: ue context or procedure ctxt is NULL \n");
+                return ActStatus::HALT;
+        }
+
+        SessionContext* sessionCtxt = ue_ctxt->getSessionContext();
+        if (sessionCtxt == NULL)
+        {
+                log_msg(LOG_DEBUG, "send_mb_req_to_sgw_svc_req: session ctxt is NULL \n");
+                return ActStatus::HALT;
+        }
+
+        struct MB_Q_msg mb_msg;
+        mb_msg.msg_type = modify_bearer_request;
+        mb_msg.ue_idx = ue_ctxt->getContextID();
+
+        memset(mb_msg.indication, 0, S11_MB_INDICATION_FLAG_SIZE); /*TODO : future*/
+        BearerContext* bearerCtxt = sessionCtxt->getBearerContext();
+        mb_msg.bearer_id = bearerCtxt->getBearerId();
+
+        memcpy(&(mb_msg.s11_sgw_c_fteid), &(sessionCtxt->getS11SgwCtrlFteid().fteid_m),
+                sizeof(struct fteid));
+
+        memcpy(&(mb_msg.s1u_enb_fteid), &(bearerCtxt->getS1uEnbUserFteid().fteid_m),
+                sizeof(struct fteid));
+
+
+        cmn::ipc::IpcAddress destAddr;
+        destAddr.u32 = TipcServiceInstance::s11AppInstanceNum_c;
+
+        mmeIpcIf_g->dispatchIpcMsg((char *) &mb_msg, sizeof(mb_msg), destAddr);
+
+        ProcedureStats::num_of_mb_req_to_sgw_sent ++;
+        log_msg(LOG_DEBUG, "Leaving send_mb_req_to_sgw_svc_req \n");
+
+        return ActStatus::PROCEED;
+}
+
+/***************************************
+* Action handler : process_mb_resp_svc_req
+***************************************/
+ActStatus ActionHandlers::process_mb_resp_svc_req(ControlBlock& cb)
+{
+   	log_msg(LOG_DEBUG, "Inside process_mb_resp_svc_req \n");
+
+	ProcedureStats::num_of_processed_mb_resp ++;
+
+	MmeContextManagerUtils::deallocateProcedureCtxt(cb, serviceRequest_c);
+
+	return ActStatus::PROCEED;
+}
diff --git a/src/mme-app/actionHandlers/tauActionHandlers.cpp b/src/mme-app/actionHandlers/tauActionHandlers.cpp
new file mode 100644
index 0000000..6bf70da
--- /dev/null
+++ b/src/mme-app/actionHandlers/tauActionHandlers.cpp
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2019-present Infosys Limited
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+/******************************************************************************
+ *
+ * This file has both generated and manual code.
+ *
+ * File template used for code generation:
+ * <TOP-DIR/scripts/SMCodeGen/templates/stateMachineTmpls/actionHandlers.cpp.tt>
+ *
+ ******************************************************************************/
+
+#include <typeinfo>
+#include "actionHandlers/actionHandlers.h"
+#include "controlBlock.h" 
+#include "msgType.h"
+#include "contextManager/dataBlocks.h"
+#include "procedureStats.h"
+#include "log.h"
+#include "secUtils.h"
+#include "state.h"
+#include <string.h>
+#include <sstream>
+#include <smTypes.h>
+#include "common_proc_info.h"
+#include <ipcTypes.h>
+#include <tipcTypes.h>
+#include <msgBuffer.h>
+#include <interfaces/mmeIpcInterface.h>
+#include <event.h>
+#include <stateMachineEngine.h>
+#include <utils/mmeContextManagerUtils.h>
+
+using namespace mme;
+using namespace SM;
+using namespace cmn::utils;
+
+extern MmeIpcInterface* mmeIpcIf_g;
+
+/***************************************
+* Action handler : send_tau_response_to_ue
+***************************************/
+ActStatus ActionHandlers::send_tau_response_to_ue(ControlBlock& cb)
+{	
+	log_msg(LOG_INFO,"Inside send_tau_response_to_ue\n");
+
+	UEContext *ue_ctxt = static_cast<UEContext*>(cb.getPermDataBlock());	
+	if (ue_ctxt == NULL)
+	{
+		log_msg(LOG_ERROR, "send_tau_response_to_ue: ue context is NULL\n",cb.getCBIndex());
+		return ActStatus::HALT;
+	}
+	
+	MmeTauProcedureCtxt* tauPrcdCtxt_p = dynamic_cast<MmeTauProcedureCtxt*>(cb.getTempDataBlock());	
+	if (tauPrcdCtxt_p == NULL)
+	{
+		log_msg(LOG_DEBUG, "send_tau_response_to_ue: MmeTauProcedureCtxt is NULL\n");
+		return ActStatus::HALT;
+	}
+	
+	struct tauResp_Q_msg tau_resp;
+
+	tau_resp.msg_type = tau_response;
+	tau_resp.status = 0;
+	tau_resp.ue_idx = ue_ctxt->getContextID();
+	tau_resp.enb_fd = tauPrcdCtxt_p->getEnbFd();
+	tau_resp.s1ap_enb_ue_id = tauPrcdCtxt_p->getS1apEnbUeId();	
+	tau_resp.dl_seq_no = ue_ctxt->getDwnLnkSeqNo();
+	memcpy(&(tau_resp.int_key), &(ue_ctxt->getUeSecInfo().secinfo_m.int_key),
+			NAS_INT_KEY_SIZE);
+	memcpy(&tau_resp.tai, &(ue_ctxt->getTai().tai_m), sizeof(struct TAI));	
+	tau_resp.m_tmsi = ue_ctxt->getMtmsi();
+	
+	cmn::ipc::IpcAddress destAddr;
+        destAddr.u32 = TipcServiceInstance::s1apAppInstanceNum_c;	
+	mmeIpcIf_g->dispatchIpcMsg((char *) &tau_resp, sizeof(tau_resp), destAddr);
+	
+	MmeContextManagerUtils::deallocateProcedureCtxt(cb, tau_c );
+	ProcedureStats::num_of_tau_response_to_ue_sent++;
+
+	log_msg(LOG_INFO,"Leaving send_tau_response_to_ue\n");
+	return ActStatus::PROCEED;
+}
+
diff --git a/src/mme-app/actionHandlers/ueInitDetachActionHandlers.cpp b/src/mme-app/actionHandlers/ueInitDetachActionHandlers.cpp
new file mode 100644
index 0000000..d37c02e
--- /dev/null
+++ b/src/mme-app/actionHandlers/ueInitDetachActionHandlers.cpp
@@ -0,0 +1,198 @@
+/*
+ * Copyright 2019-present Infosys Limited
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+/******************************************************************************
+ *
+ * This file has both generated and manual code.
+ *
+ * File template used for code generation:
+ * <TOP-DIR/scripts/SMCodeGen/templates/stateMachineTmpls/actionHandlers.cpp.tt>
+ *
+ ******************************************************************************/
+
+#include "actionHandlers/actionHandlers.h"
+#include "contextManager/subsDataGroupManager.h"
+#include "contextManager/dataBlocks.h"
+#include "msgType.h"
+#include "controlBlock.h"
+#include "procedureStats.h"
+#include "log.h"
+#include <string.h>
+#include <smTypes.h>
+
+#include <ipcTypes.h>
+#include <tipcTypes.h>
+#include <msgBuffer.h>
+#include <interfaces/mmeIpcInterface.h>
+#include <utils/mmeContextManagerUtils.h>
+
+using namespace SM;
+using namespace mme;
+using namespace cmn::utils;
+
+extern MmeIpcInterface* mmeIpcIf_g;
+
+ActStatus ActionHandlers::del_session_req(SM::ControlBlock& cb)
+{
+	log_msg(LOG_DEBUG, "Inside delete_session_req \n");
+		
+	UEContext *ue_ctxt = dynamic_cast<UEContext*>(cb.getPermDataBlock());
+	
+	if (ue_ctxt == NULL)
+	{
+		log_msg(LOG_DEBUG, "delete_session_req: ue context is NULL\n");
+		return ActStatus::HALT;
+	}
+		
+	ue_ctxt->setUpLnkSeqNo(ue_ctxt->getUpLnkSeqNo()+1);
+	
+	struct DS_Q_msg g_ds_msg;
+	g_ds_msg.msg_type = delete_session_request;
+	
+	memset(g_ds_msg.indication, 0, S11_DS_INDICATION_FLAG_SIZE);
+	g_ds_msg.indication[0] = 8; /* TODO : define macro or enum */
+	
+	SessionContext* sessionCtxt = ue_ctxt->getSessionContext();
+	BearerContext* bearerCtxt = sessionCtxt->getBearerContext();
+	g_ds_msg.bearer_id = bearerCtxt->getBearerId();
+
+	memcpy(&(g_ds_msg.s11_sgw_c_fteid), &(sessionCtxt->getS11SgwCtrlFteid().fteid_m), sizeof(struct fteid));
+		
+	/* Send message to S11app in S11q*/
+	cmn::ipc::IpcAddress destAddr;
+	destAddr.u32 = TipcServiceInstance::s11AppInstanceNum_c;
+
+	mmeIpcIf_g->dispatchIpcMsg((char *) &g_ds_msg, sizeof(g_ds_msg), destAddr);
+	
+	log_msg(LOG_DEBUG, "Leaving delete_session_req \n");
+	ProcedureStats::num_of_del_session_req_sent ++;	
+	return ActStatus::PROCEED;
+
+}
+#if 0	
+ActStatus ActionHandlers::purge_req(SM::ControlBlock& cb)
+{
+	log_msg(LOG_DEBUG, "Inside purge_req \n");
+	UEContext *ue_ctxt =  dynamic_cast<UEContext*>(cb.getPermDataBlock());
+	
+	if (ue_ctxt == NULL)
+	{
+		log_msg(LOG_DEBUG, "purge_req: ue context is NULL\n");
+		return ActStatus::HALT;
+	}
+	
+	s6a_purge_Q_msg g_purge_msg;
+	
+	g_purge_msg.ue_idx = ue_ctxt->getContextId();
+	memcpy(g_purge_msg.IMSI, ue_ctxt->getIMSIInfo(), BINARY_IMSI_LEN);
+		
+	/* Send message to S6app in S6q*/
+	mmeS6If_gp->sendMessage_v((char*)(&g_purge_msg), purge_request);
+	
+	
+	log_msg(LOG_DEBUG, "Leaving purge_req \n");
+	ProcedureStats::num_of_purge_req_sent ++;
+	return ActStatus::PROCEED;
+	
+}
+#endif
+
+ActStatus ActionHandlers::process_del_session_resp(SM::ControlBlock& cb)
+{
+	log_msg(LOG_DEBUG, "Inside handle_delete_session_resp \n");
+	
+	UEContext *ue_ctxt = dynamic_cast<UEContext*>(cb.getPermDataBlock());
+	if (ue_ctxt == NULL)
+	{
+	    log_msg(LOG_DEBUG, "delete_session_req: ue context is NULL\n");
+	    return ActStatus::HALT;
+	}
+
+	SessionContext* sessionCtxt = ue_ctxt->getSessionContext();
+	if (sessionCtxt != NULL)
+	{
+	    BearerContext* bearerCtxt = sessionCtxt->getBearerContext();
+	    if (bearerCtxt)
+	    {
+	        SubsDataGroupManager::Instance()->deleteBearerContext( bearerCtxt );
+	    }
+	    SubsDataGroupManager::Instance()->deleteSessionContext( sessionCtxt );
+	}
+
+	ue_ctxt->setSessionContext(NULL);
+	
+	log_msg(LOG_DEBUG, "Leaving handle_delete_session_resp \n");
+	ProcedureStats::num_of_processed_del_session_resp ++;
+	return ActStatus::PROCEED;
+	
+}
+
+#if 0
+ActStatus ActionHandlers::process_pur_resp(SM::ControlBlock& cb)
+{
+	log_msg(LOG_DEBUG, "Inside handle_purge_resp \n");
+	
+	UEContext *ue_ctxt =  dynamic_cast<UEContext*>(cb.getPermDataBlock());
+	
+	if (ue_ctxt == NULL)
+	{
+		log_msg(LOG_DEBUG, "handle_purge_resp: ue context is NULL \n");
+		return ActStatus::HALT;
+	}
+	//struct purge_resp_Q_msg *purge_msg = nullptr;
+	
+	/*Nothing is been done. Only takes the UE Index
+	 * increment the stats counter and changes the state*/
+	
+	
+	log_msg(LOG_DEBUG, "Leaving handle_purge_resp for UE-%d.\n", ue_ctxt->getContextId());
+	ProcedureStats::num_of_processed_pur_resp ++;
+	return ActStatus::PROCEED;
+	
+}
+#endif
+ActStatus ActionHandlers::detach_accept_to_ue(SM::ControlBlock& cb)
+{
+	log_msg(LOG_DEBUG, "Inside send_detach_accept \n");
+	
+	UEContext *ue_ctxt =  dynamic_cast<UEContext*>(cb.getPermDataBlock());
+	
+	if (ue_ctxt == NULL)
+	{
+		log_msg(LOG_DEBUG, "send_detach_accept: ue context is NULL\n");
+		return ActStatus::HALT;
+	}
+	
+	detach_accept_Q_msg detach_accpt;
+	detach_accpt.msg_type = detach_accept;
+	detach_accpt.enb_fd = ue_ctxt->getEnbFd();
+	detach_accpt.ue_idx = ue_ctxt->getContextID();
+	detach_accpt.enb_s1ap_ue_id =  ue_ctxt->getS1apEnbUeId();
+	
+	ue_ctxt->setDwnLnkSeqNo(ue_ctxt->getDwnLnkSeqNo()+1);
+	detach_accpt.dl_seq_no = ue_ctxt->getDwnLnkSeqNo();
+	
+	memcpy(&(detach_accpt.int_key), &(ue_ctxt->getUeSecInfo().secinfo_m.int_key), NAS_INT_KEY_SIZE);
+	
+	/* Send message to S11app in S11q*/
+	cmn::ipc::IpcAddress destAddr;
+	destAddr.u32 = TipcServiceInstance::s1apAppInstanceNum_c;
+
+	mmeIpcIf_g->dispatchIpcMsg((char *) &detach_accpt, sizeof(detach_accpt), destAddr);
+	
+	MmeContextManagerUtils::deallocateProcedureCtxt(cb, detach_c );
+
+	MmContext* mmCtxt = ue_ctxt->getMmContext();
+	mmCtxt->setMmState( EpsDetached );
+
+	log_msg(LOG_DEBUG, "Leaving send_detach_accept for UE \n");
+
+	ProcedureStats::num_of_detach_accept_to_ue_sent ++;
+	ProcedureStats::num_of_subscribers_attached --;
+
+	return ActStatus::PROCEED;
+	
+}
diff --git a/src/mme-app/conf/mme.json b/src/mme-app/conf/mme.json
new file mode 100644
index 0000000..852b92d
--- /dev/null
+++ b/src/mme-app/conf/mme.json
@@ -0,0 +1,37 @@
+{
+	"mme": {
+		"egtp_default_port": 2123,
+		"ip_addr": "192.168.1.52",
+		"s1ap_addr": "192.168.1.52",
+		"egtp_addr": "192.168.1.52",
+		"sctp_port": 36412,
+		"name": "vmmestandalone",
+		"egtp_default_hostname": "sutlej.ccin.ccpu.com",
+		"group_id": 1,
+		"code": 1,
+		"__comment__": "Here is comment",
+		"mcc": {
+			"dig1": 2,
+			"dig2": 0,
+			"dig3": 8
+		},
+		"mnc": {
+			"dig1": 0,
+			"dig2": 1,
+			"dig3": -1
+		}
+	},
+	"enb": {
+		"enb_addr": "192.168.1.52",
+		"enb_port": "5003"
+	},
+	"s11": {
+		"sgw_addr": "127.0.0.1",
+		"pgw_addr": "192.168.1.105"
+	},
+	"s6a": {
+		"host_type": "freediameter",
+		"host": "hss.openair4G.eur",
+		"realm": "openair4G.eur"
+	}
+}
diff --git a/src/mme-app/contextManager/bearerContextManager.cpp b/src/mme-app/contextManager/bearerContextManager.cpp
new file mode 100644
index 0000000..72fd2cf
--- /dev/null
+++ b/src/mme-app/contextManager/bearerContextManager.cpp
@@ -0,0 +1,52 @@
+ /*
+ * Copyright 2019-present Infosys Limited
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */ 
+/******************************************************************************
+ * bearerContextManager.cpp
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/SMCodeGen/templates/ctxtManagerTmpls/blockPoolManager.cpp.tt>
+ ******************************************************************************/
+
+#include "memPoolManager.h"
+#include "contextManager/dataBlocks.h"
+#include "contextManager/bearerContextManager.h"
+
+using namespace cmn::memPool;
+
+namespace mme
+{
+	/******************************************************************************
+	* Constructor
+	******************************************************************************/
+	BearerContextManager::BearerContextManager(int numOfBlocks): poolManager_m(numOfBlocks)
+	{
+	}
+	
+	/******************************************************************************
+	* Destructor
+	******************************************************************************/
+	BearerContextManager::~BearerContextManager()
+	{
+	}
+	
+	/******************************************************************************
+	* allocate BearerContext data block
+	******************************************************************************/
+	BearerContext* BearerContextManager::allocateBearerContext()
+	{
+		BearerContext* BearerContext_p = poolManager_m.allocate();
+		return BearerContext_p;
+	}
+	
+	/******************************************************************************
+	* Deallocate a BearerContext data block
+	******************************************************************************/
+	void BearerContextManager::deallocateBearerContext(BearerContext* BearerContextp )
+	{
+		poolManager_m.free( BearerContextp );
+	}
+}
diff --git a/src/mme-app/contextManager/dataBlocks.cpp b/src/mme-app/contextManager/dataBlocks.cpp
new file mode 100644
index 0000000..4134d7f
--- /dev/null
+++ b/src/mme-app/contextManager/dataBlocks.cpp
@@ -0,0 +1,970 @@
+/*
+ * 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/SMCodeGen/templates/ctxtManagerTmpls/dataBlock.cpp.tt>
+***************************************/
+#include "contextManager/dataBlocks.h"
+
+namespace mme
+{
+	/******************************************************************************
+	*******************************************************************************
+	*							UEContext
+	*******************************************************************************
+	******************************************************************************/
+	
+	/******************************************************************************
+	* Constructor
+	******************************************************************************/
+	UEContext::UEContext(): enbFd_m(0), s1apEnbUeId_m(0), subscriptionStatus_m(0),
+	        netAccessMode_m(0), contextID_m(0), rauTauTimer_m(0),
+	        accessRestrictionData_m(0), imsi_m(), msisdn_m(),
+	        dwnLnkSeqNo_m(0), upLnkSeqNo_m(0), ueState_m(InvalidState),
+	        tai_m(), utranCgi_m(), msNetCapab_m(), ueNetCapab_m(),
+	        ueSecInfo_m(), ambr_m(), aiaSecInfo_m(),
+	        mTmsi_m(0), MmContext_mp(NULL), SessionContext_mp(NULL)
+	{
+	}
+	
+	/******************************************************************************
+	* Destructor
+	******************************************************************************/
+	UEContext::~UEContext()
+	{
+	}
+	
+	/******************************************************************************
+	* sets enbFd
+	******************************************************************************/
+	void UEContext::setEnbFd( int enbFd_i )
+	{
+		enbFd_m = enbFd_i;
+	}
+	
+	/******************************************************************************
+	* returns enbFd
+	******************************************************************************/	
+	int UEContext::getEnbFd()
+	{
+		return enbFd_m;
+	}
+	/******************************************************************************
+	* sets s1apEnbUeId
+	******************************************************************************/
+	void UEContext::setS1apEnbUeId( int s1apEnbUeId_i )
+	{
+		s1apEnbUeId_m = s1apEnbUeId_i;
+	}
+	
+	/******************************************************************************
+	* returns s1apEnbUeId
+	******************************************************************************/	
+	int UEContext::getS1apEnbUeId()
+	{
+		return s1apEnbUeId_m;
+	}
+	/******************************************************************************
+	* sets subscriptionStatus
+	******************************************************************************/
+	void UEContext::setSubscriptionStatus( int subscriptionStatus_i )
+	{
+		subscriptionStatus_m = subscriptionStatus_i;
+	}
+	
+	/******************************************************************************
+	* returns subscriptionStatus
+	******************************************************************************/	
+	int UEContext::getSubscriptionStatus()
+	{
+		return subscriptionStatus_m;
+	}
+	/******************************************************************************
+	* sets netAccessMode
+	******************************************************************************/
+	void UEContext::setNetAccessMode( int netAccessMode_i )
+	{
+		netAccessMode_m = netAccessMode_i;
+	}
+	
+	/******************************************************************************
+	* returns netAccessMode
+	******************************************************************************/	
+	int UEContext::getNetAccessMode()
+	{
+		return netAccessMode_m;
+	}
+	/******************************************************************************
+	* sets contextID
+	******************************************************************************/
+	void UEContext::setContextID( uint32_t contextID_i )
+	{
+		contextID_m = contextID_i;
+	}
+	
+	/******************************************************************************
+	* returns contextID
+	******************************************************************************/	
+	uint32_t UEContext::getContextID()
+	{
+		return contextID_m;
+	}
+	/******************************************************************************
+	* sets rauTauTimer
+	******************************************************************************/
+	void UEContext::setRauTauTimer( unsigned int rauTauTimer_i )
+	{
+		rauTauTimer_m = rauTauTimer_i;
+	}
+	
+	/******************************************************************************
+	* returns rauTauTimer
+	******************************************************************************/	
+	unsigned int UEContext::getRauTauTimer()
+	{
+		return rauTauTimer_m;
+	}
+	/******************************************************************************
+	* sets accessRestrictionData
+	******************************************************************************/
+	void UEContext::setAccessRestrictionData( unsigned int accessRestrictionData_i )
+	{
+		accessRestrictionData_m = accessRestrictionData_i;
+	}
+	
+	/******************************************************************************
+	* returns accessRestrictionData
+	******************************************************************************/	
+	unsigned int UEContext::getAccessRestrictionData()
+	{
+		return accessRestrictionData_m;
+	}
+	/******************************************************************************
+	* sets imsi
+	******************************************************************************/
+	void UEContext::setImsi( const DigitRegister15& imsi_i )
+	{
+		imsi_m = imsi_i;
+	}
+	
+	/******************************************************************************
+	* returns imsi
+	******************************************************************************/	
+	const DigitRegister15& UEContext::getImsi()const
+	{
+		return imsi_m;
+	}
+	/******************************************************************************
+	* sets msisdn
+	******************************************************************************/
+	void UEContext::setMsisdn( const DigitRegister15& msisdn_i )
+	{
+		msisdn_m = msisdn_i;
+	}
+	
+	/******************************************************************************
+	* returns msisdn
+	******************************************************************************/	
+	const DigitRegister15& UEContext::getMsisdn()const
+	{
+		return msisdn_m;
+	}
+	/******************************************************************************
+	* sets dwnLnkSeqNo
+	******************************************************************************/
+	void UEContext::setDwnLnkSeqNo( unsigned short dwnLnkSeqNo_i )
+	{
+		dwnLnkSeqNo_m = dwnLnkSeqNo_i;
+	}
+	
+	/******************************************************************************
+	* returns dwnLnkSeqNo
+	******************************************************************************/	
+	unsigned short UEContext::getDwnLnkSeqNo()
+	{
+		return dwnLnkSeqNo_m;
+	}
+	/******************************************************************************
+	* sets upLnkSeqNo
+	******************************************************************************/
+	void UEContext::setUpLnkSeqNo( unsigned short upLnkSeqNo_i )
+	{
+		upLnkSeqNo_m = upLnkSeqNo_i;
+	}
+	
+	/******************************************************************************
+	* returns upLnkSeqNo
+	******************************************************************************/	
+	unsigned short UEContext::getUpLnkSeqNo()
+	{
+		return upLnkSeqNo_m;
+	}
+
+	/******************************************************************************
+	* sets ueState
+	******************************************************************************/
+	void UEContext::setUeState( UE_State_e ueState_i )
+	{
+		ueState_m = ueState_i;
+	}
+	
+	/******************************************************************************
+	* returns ueState
+	******************************************************************************/	
+	UE_State_e UEContext::getUeState()
+	{
+		return ueState_m;
+	}
+	/******************************************************************************
+	* sets tai
+	******************************************************************************/
+	void UEContext::setTai( const Tai& tai_i )
+	{
+		tai_m = tai_i;
+	}
+	
+	/******************************************************************************
+	* returns tai
+	******************************************************************************/	
+	const Tai& UEContext::getTai()const
+	{
+		return tai_m;
+	}
+	/******************************************************************************
+	* sets utranCgi
+	******************************************************************************/
+	void UEContext::setUtranCgi( const Cgi& utranCgi_i )
+	{
+		utranCgi_m = utranCgi_i;
+	}
+	
+	/******************************************************************************
+	* returns utranCgi
+	******************************************************************************/	
+	const Cgi& UEContext::getUtranCgi()const
+	{
+		return utranCgi_m;
+	}
+	/******************************************************************************
+	* sets msNetCapab
+	******************************************************************************/
+	void UEContext::setMsNetCapab( const Ms_net_capab& msNetCapab_i )
+	{
+		msNetCapab_m = msNetCapab_i;
+	}
+	
+	/******************************************************************************
+	* returns msNetCapab
+	******************************************************************************/	
+	const Ms_net_capab& UEContext::getMsNetCapab()const
+	{
+		return msNetCapab_m;
+	}
+	/******************************************************************************
+	* sets ueNetCapab
+	******************************************************************************/
+	void UEContext::setUeNetCapab( const Ue_net_capab& ueNetCapab_i )
+	{
+		ueNetCapab_m = ueNetCapab_i;
+	}
+	
+	/******************************************************************************
+	* returns ueNetCapab
+	******************************************************************************/	
+	const Ue_net_capab& UEContext::getUeNetCapab()const
+	{
+		return ueNetCapab_m;
+	}
+	/******************************************************************************
+	* sets ueSecInfo
+	******************************************************************************/
+	void UEContext::setUeSecInfo( const Secinfo& ueSecInfo_i )
+	{
+		ueSecInfo_m = ueSecInfo_i;
+	}
+	
+	/******************************************************************************
+	* returns ueSecInfo
+	******************************************************************************/	
+	const Secinfo& UEContext::getUeSecInfo()const
+	{
+		return ueSecInfo_m;
+	}
+	/******************************************************************************
+	* sets ambr
+	******************************************************************************/
+	void UEContext::setAmbr( const Ambr& ambr_i )
+	{
+		ambr_m = ambr_i;
+	}
+	
+	/******************************************************************************
+	* returns ambr
+	******************************************************************************/	
+	const Ambr& UEContext::getAmbr()const
+	{
+		return ambr_m;
+	}
+	/******************************************************************************
+	* sets aiaSecInfo
+	******************************************************************************/
+	void UEContext::setAiaSecInfo( const E_utran_sec_vector& aiaSecInfo_i )
+	{
+		aiaSecInfo_m = aiaSecInfo_i;
+	}
+	
+	/******************************************************************************
+	* returns aiaSecInfo
+	******************************************************************************/	
+	const E_utran_sec_vector& UEContext::getAiaSecInfo()const
+	{
+		return aiaSecInfo_m;
+	}
+
+	/******************************************************************************
+	* sets mTmsi
+	******************************************************************************/
+	void UEContext::setMtmsi( uint32_t mTmsi_i )
+	{
+		mTmsi_m = mTmsi_i;
+	}
+
+	/******************************************************************************
+	* returns ambr
+	******************************************************************************/
+	uint32_t UEContext::getMtmsi()
+	{
+		return mTmsi_m;
+	}
+	
+	/******************************************************************************
+	* sets MmContext
+	******************************************************************************/
+	void UEContext::setMmContext( MmContext* MmContextp )
+	{
+		MmContext_mp = MmContextp;
+	}
+	
+	/******************************************************************************
+	* returns MmContext
+	******************************************************************************/
+	MmContext* UEContext::getMmContext()
+	{
+		return MmContext_mp;
+	}
+	/******************************************************************************
+	* sets SessionContext
+	******************************************************************************/
+	void UEContext::setSessionContext( SessionContext* SessionContextp )
+	{
+		SessionContext_mp = SessionContextp;
+	}
+	
+	/******************************************************************************
+	* returns SessionContext
+	******************************************************************************/
+	SessionContext* UEContext::getSessionContext()
+	{
+		return SessionContext_mp;
+	}
+	/******************************************************************************
+	*******************************************************************************
+	*							MmContext
+	*******************************************************************************
+	******************************************************************************/
+	
+	/******************************************************************************
+	* Constructor
+	******************************************************************************/
+	MmContext::MmContext(): mmState_m(InvalidState)
+	{
+	}
+	
+	/******************************************************************************
+	* Destructor
+	******************************************************************************/
+	MmContext::~MmContext()
+	{
+	}
+	
+	/******************************************************************************
+	* sets mmState
+	******************************************************************************/
+	void MmContext::setMmState( EmmState mmState_i )
+	{
+		mmState_m = mmState_i;
+	}
+	
+	/******************************************************************************
+	* returns mmState
+	******************************************************************************/	
+	EmmState MmContext::getMmState()
+	{
+		return mmState_m;
+	}
+	
+	/******************************************************************************
+	*******************************************************************************
+	*							SessionContext
+	*******************************************************************************
+	******************************************************************************/
+	
+	/******************************************************************************
+	* Constructor
+	******************************************************************************/
+	SessionContext::SessionContext(): sessionId_m(0), s11SgwCtrlFteid_m(),
+	        s5S8PgwCtrlFteid_m(), pdnAddr_m(), accessPtName_m(), apnConfigProfileCtxId_m(),
+	        pti_m(0), BearerContext_mp(NULL)
+	{
+	}
+	
+	/******************************************************************************
+	* Destructor
+	******************************************************************************/
+	SessionContext::~SessionContext()
+	{
+	}
+	
+	/******************************************************************************
+	* sets sessionId
+	******************************************************************************/
+	void SessionContext::setSessionId( uint8_t sessionId_i )
+	{
+		sessionId_m = sessionId_i;
+	}
+	
+	/******************************************************************************
+	* returns sessionId
+	******************************************************************************/	
+	uint8_t SessionContext::getSessionId()
+	{
+		return sessionId_m;
+	}
+
+	/******************************************************************************
+	* sets s11SgwCtrlFteid
+	******************************************************************************/
+	void SessionContext::setS11SgwCtrlFteid( const Fteid& s11SgwCtrlFteid_i )
+	{
+		s11SgwCtrlFteid_m = s11SgwCtrlFteid_i;
+	}
+	
+	/******************************************************************************
+	* returns s11SgwCtrlFteid
+	******************************************************************************/	
+	const Fteid& SessionContext::getS11SgwCtrlFteid()const
+	{
+		return s11SgwCtrlFteid_m;
+	}
+	/******************************************************************************
+	* sets s5S8PgwCtrlFteid
+	******************************************************************************/
+	void SessionContext::setS5S8PgwCtrlFteid( const Fteid& s5S8PgwCtrlFteid_i )
+	{
+		s5S8PgwCtrlFteid_m = s5S8PgwCtrlFteid_i;
+	}
+	
+	/******************************************************************************
+	* returns s5S8PgwCtrlFteid
+	******************************************************************************/	
+	const Fteid& SessionContext::getS5S8PgwCtrlFteid()const
+	{
+		return s5S8PgwCtrlFteid_m;
+	}
+	/******************************************************************************
+	* sets pdnAddr
+	******************************************************************************/
+	void SessionContext::setPdnAddr( const Paa& pdnAddr_i )
+	{
+		pdnAddr_m = pdnAddr_i;
+	}
+	
+	/******************************************************************************
+	* returns pdnAddr
+	******************************************************************************/	
+	const Paa& SessionContext::getPdnAddr()const
+	{
+		return pdnAddr_m;
+	}
+	/******************************************************************************
+	* sets accessPtName
+	******************************************************************************/
+	void SessionContext::setAccessPtName( const Apn_name& accessPtName_i )
+	{
+		accessPtName_m = accessPtName_i;
+	}
+	
+	/******************************************************************************
+	* returns accessPtName
+	******************************************************************************/	
+	const Apn_name& SessionContext::getAccessPtName()const
+	{
+		return accessPtName_m;
+	}
+
+	/******************************************************************************
+	* sets apnConfigProfileCtxId
+	******************************************************************************/
+	void SessionContext::setApnConfigProfileCtxId( unsigned int apnConfigProfileCtxId_i )
+	{
+		apnConfigProfileCtxId_m = apnConfigProfileCtxId_i;
+	}
+	
+	/******************************************************************************
+	* returns apnConfigProfileCtxId
+	******************************************************************************/	
+	unsigned int SessionContext::getApnConfigProfileCtxId()
+	{
+		return apnConfigProfileCtxId_m;
+	}
+
+	/******************************************************************************
+	 *  sets pti
+	 *******************************************************************************/
+	void SessionContext::setPti( uint8_t pti_i )
+	{
+		pti_m = pti_i;
+	}
+
+	/******************************************************************************
+	* returns pti
+	******************************************************************************/
+	uint8_t SessionContext::getPti()
+	{
+		return pti_m;
+	}
+
+	/******************************************************************************
+	* sets BearerContext
+	******************************************************************************/
+	void SessionContext::setBearerContext( BearerContext* BearerContextp )
+	{
+		BearerContext_mp = BearerContextp;
+	}
+	
+	/******************************************************************************
+	* returns BearerContext
+	******************************************************************************/
+	BearerContext* SessionContext::getBearerContext()
+	{
+		return BearerContext_mp;
+	}
+	/******************************************************************************
+	*******************************************************************************
+	*							BearerContext
+	*******************************************************************************
+	******************************************************************************/
+	
+	/******************************************************************************
+	* Constructor
+	******************************************************************************/
+	BearerContext::BearerContext():s1uSgwUserFteid_m(), s5S8PgwUserFteid_m(),
+	        s1uEnbUserFteid_m(), bearerId_m(0)
+	{
+	}
+	
+	/******************************************************************************
+	* Destructor
+	******************************************************************************/
+	BearerContext::~BearerContext()
+	{
+	}
+	
+	/******************************************************************************
+	* sets s1uSgwUserFteid
+	******************************************************************************/
+	void BearerContext::setS1uSgwUserFteid( const Fteid& s1uSgwUserFteid_i )
+	{
+		s1uSgwUserFteid_m = s1uSgwUserFteid_i;
+	}
+	
+	/******************************************************************************
+	* returns s1uSgwUserFteid
+	******************************************************************************/	
+	const Fteid& BearerContext::getS1uSgwUserFteid()const
+	{
+		return s1uSgwUserFteid_m;
+	}
+	/******************************************************************************
+	* sets s5S8PgwUserFteid
+	******************************************************************************/
+	void BearerContext::setS5S8PgwUserFteid( const Fteid& s5S8PgwUserFteid_i )
+	{
+		s5S8PgwUserFteid_m = s5S8PgwUserFteid_i;
+	}
+	
+	/******************************************************************************
+	* returns s5S8PgwUserFteid
+	******************************************************************************/	
+	const Fteid& BearerContext::getS5S8PgwUserFteid()const
+	{
+		return s5S8PgwUserFteid_m;
+	}
+	/******************************************************************************
+	* sets s1uEnbUserFteid
+	******************************************************************************/
+	void BearerContext::setS1uEnbUserFteid( const Fteid& s1uEnbUserFteid_i )
+	{
+		s1uEnbUserFteid_m = s1uEnbUserFteid_i;
+	}
+	
+	/******************************************************************************
+	* returns s1uEnbUserFteid
+	******************************************************************************/	
+	const Fteid& BearerContext::getS1uEnbUserFteid()const
+	{
+		return s1uEnbUserFteid_m;
+	}
+	/******************************************************************************
+	* sets bearerId
+	******************************************************************************/
+	void BearerContext::setBearerId( unsigned char bearerId_i )
+	{
+		bearerId_m = bearerId_i;
+	}
+	
+	/******************************************************************************
+	* returns bearerId
+	******************************************************************************/	
+	unsigned char BearerContext::getBearerId()
+	{
+		return bearerId_m;
+	}
+	
+	/******************************************************************************
+	*******************************************************************************
+	*							MmeProcedureCtxt
+	*******************************************************************************
+	******************************************************************************/
+	
+	/******************************************************************************
+	* Constructor
+	******************************************************************************/
+	MmeProcedureCtxt::MmeProcedureCtxt(): ctxtType_m(invalidProcedureType_c),
+	        mmeErrorCause_m(noError_c), attachType_m(invalidAttachType_c),
+	        pti_m(0), esmInfoTxRequired_m(false)
+	{
+	    memset(pcoOptions_m, 0, sizeof(pcoOptions_m));
+	}
+	
+	/******************************************************************************
+	* Destructor
+	******************************************************************************/
+	MmeProcedureCtxt::~MmeProcedureCtxt()
+	{
+	}
+	
+	/******************************************************************************
+	* sets ctxtType
+	******************************************************************************/
+	void MmeProcedureCtxt::setCtxtType( ProcedureType ctxtType_i )
+	{
+		ctxtType_m = ctxtType_i;
+	}
+	
+	/******************************************************************************
+	* returns ctxtType
+	******************************************************************************/	
+	ProcedureType MmeProcedureCtxt::getCtxtType()
+	{
+		return ctxtType_m;
+	}
+		
+	/******************************************************************************
+	* sets pcoOptions
+	******************************************************************************/
+	void MmeProcedureCtxt::setPcoOptions(const unsigned short int* pcoOptions_i )
+	{
+		memcpy(pcoOptions_m,pcoOptions_i,10);
+	}
+
+	/******************************************************************************
+	* returns pcoOptions
+   	******************************************************************************/
+	const unsigned short int* MmeProcedureCtxt::getPcoOptions()const
+	{
+		return &pcoOptions_m[0];
+   	}	
+
+	/******************************************************************************
+	* sets esmInfoTxRequired
+	******************************************************************************/
+	void MmeProcedureCtxt::setEsmInfoTxRequired ( bool esmInfoTxRequired_i )
+	{
+		esmInfoTxRequired_m = esmInfoTxRequired_i;
+	}
+	
+	/******************************************************************************
+	* returns esmInfoTxRequired
+	******************************************************************************/	
+	bool MmeProcedureCtxt::getEsmInfoTxRequired()
+	{
+		return esmInfoTxRequired_m;
+	}
+
+	/******************************************************************************
+	* sets attachType
+	******************************************************************************/
+	void MmeProcedureCtxt::setAttachType( AttachType attachType_i )
+	{
+		attachType_m = attachType_i;
+	}
+
+	/******************************************************************************
+	* returns attachType
+	******************************************************************************/
+	AttachType MmeProcedureCtxt::getAttachType()
+	{
+		return attachType_m;
+	}	
+
+	/******************************************************************************
+	* sets pti
+	* ******************************************************************************/
+	void MmeProcedureCtxt::setPti( uint8_t pti_i )
+	{
+		pti_m = pti_i;
+	}
+
+	/******************************************************************************
+	* returns pti
+	******************************************************************************/
+	uint8_t MmeProcedureCtxt::getPti()
+	{
+		return pti_m;
+	}
+
+	/******************************************************************************
+	* sets mmeErrorCause
+	* ******************************************************************************/
+	void MmeProcedureCtxt::setMmeErrorCause( MmeErrorCause mmeErrorCause_i )
+	{
+	    mmeErrorCause_m = mmeErrorCause_i;
+	}
+
+	/******************************************************************************
+	* returns mmeErrorCause
+	*******************************************************************************/
+	MmeErrorCause MmeProcedureCtxt::getMmeErrorCause()
+	{
+	    return mmeErrorCause_m;
+	}
+
+	
+	/******************************************************************************
+	*******************************************************************************
+	*                           MmeDetachProcedureCtxt
+	*******************************************************************************
+	******************************************************************************/
+
+	/******************************************************************************
+	* Constructor
+	******************************************************************************/
+	MmeDetachProcedureCtxt::MmeDetachProcedureCtxt():
+	        detachType_m(invalidDetachType_c), cancellationType_m(INVALID_TYPE)
+	{
+	}
+
+	/******************************************************************************
+	* Destructor
+	******************************************************************************/
+	MmeDetachProcedureCtxt::~MmeDetachProcedureCtxt()
+	{
+	}
+
+	/******************************************************************************
+	* sets detachType
+	******************************************************************************/
+	void MmeDetachProcedureCtxt::setDetachType( DetachType detachType_i )
+	{
+		detachType_m = detachType_i;
+	}
+	
+	/******************************************************************************
+	* returns detachType
+	*******************************************************************************/
+	DetachType MmeDetachProcedureCtxt::getDetachType()
+	{
+		return detachType_m;
+	}
+
+	/******************************************************************************
+	* sets cancellationType
+	*******************************************************************************/
+	void MmeDetachProcedureCtxt::setCancellationType( CancellationType cancellationType_i )
+	{
+	    cancellationType_m = cancellationType_i;
+	}
+
+	/******************************************************************************
+	* returns cancellationType
+	*******************************************************************************/
+	CancellationType MmeDetachProcedureCtxt::getCancellationType()
+	{
+		return cancellationType_m;
+	}
+
+
+	/******************************************************************************
+	*******************************************************************************
+				MmeSvcReqProcedureContext
+	*******************************************************************************
+	******************************************************************************/
+
+	/******************************************************************************
+	* Constructor
+	******************************************************************************/
+	MmeSvcReqProcedureCtxt::MmeSvcReqProcedureCtxt(): pagingTrigger_m(none_c),
+	        epsBearerId_m(0), arp_m(), ddnSeqNum_m()
+	{
+	}
+
+	/******************************************************************************
+	* Destructor
+	******************************************************************************/
+	MmeSvcReqProcedureCtxt::~MmeSvcReqProcedureCtxt()
+	{
+	}
+	
+	/******************************************************************************
+	* sets ddnSeqNo
+	*******************************************************************************/
+	void MmeSvcReqProcedureCtxt::setDdnSeqNo( uint32_t ddnSeqNum_i )
+	{
+	    ddnSeqNum_m = ddnSeqNum_i;
+	}
+
+	/******************************************************************************
+	* returns ddnSeqNo
+	*******************************************************************************/
+	uint32_t MmeSvcReqProcedureCtxt::getDdnSeqNo()
+	{
+	    return ddnSeqNum_m;
+	}
+
+	/******************************************************************************
+	* sets pagingTrigger
+	******************************************************************************/
+	void MmeSvcReqProcedureCtxt::setPagingTrigger( PagingTrigger pagingTrigger_i )
+	{
+		pagingTrigger_m = pagingTrigger_i;
+	}
+
+	/******************************************************************************
+	* returns pagingTrigger
+	******************************************************************************/
+	PagingTrigger MmeSvcReqProcedureCtxt::getPagingTrigger()
+	{
+		return pagingTrigger_m;
+	}
+
+	/******************************************************************************
+	* sets epsBearerId
+	******************************************************************************/
+	void MmeSvcReqProcedureCtxt::setEpsBearerId( unsigned char epsBearerId_i )
+	{
+		epsBearerId_m = epsBearerId_i;
+	}
+
+	/******************************************************************************
+	* returns epsBearerId
+	******************************************************************************/
+	unsigned char MmeSvcReqProcedureCtxt::getEpsBearerId()
+	{
+		return epsBearerId_m;
+	}
+
+
+	/******************************************************************************
+	* sets arp
+	******************************************************************************/
+	void MmeSvcReqProcedureCtxt::setArp( const Arp& arp_i )
+	{
+		arp_m = arp_i;
+	}
+
+	/******************************************************************************
+	* returns arp
+	******************************************************************************/
+	const Arp& MmeSvcReqProcedureCtxt::getArp()const
+	{
+		return arp_m;
+	}
+
+	
+	/******************************************************************************
+	*******************************************************************************
+				MmeTauProcedureCtxt
+	*******************************************************************************
+	******************************************************************************/
+
+	/******************************************************************************
+	* Constructor
+	******************************************************************************/
+	MmeTauProcedureCtxt::MmeTauProcedureCtxt():s1apEnbUeId_m(0), tai_m(), enbFd_m()
+	{
+	}
+
+	/******************************************************************************
+	* Destructor
+	******************************************************************************/
+	MmeTauProcedureCtxt::~MmeTauProcedureCtxt()
+	{
+	}
+	
+	/******************************************************************************
+	* sets s1apEnbUeId
+	******************************************************************************/
+	void MmeTauProcedureCtxt::setS1apEnbUeId( int s1apEnbUeId_i )
+	{
+		s1apEnbUeId_m = s1apEnbUeId_i;
+	}
+	
+	/******************************************************************************
+	* returns s1apEnbUeId
+	******************************************************************************/	
+	int MmeTauProcedureCtxt::getS1apEnbUeId()
+	{
+		return s1apEnbUeId_m;
+	}
+	
+	/******************************************************************************
+	* sets tai
+	******************************************************************************/
+	void MmeTauProcedureCtxt::setTai( const Tai& tai_i )
+	{
+		tai_m = tai_i;
+	}
+	
+	/******************************************************************************
+	* returns tai
+	******************************************************************************/	
+	const Tai& MmeTauProcedureCtxt::getTai()const
+	{
+		return tai_m;
+	}
+	
+	/******************************************************************************
+	* sets enbFd
+	******************************************************************************/
+	void MmeTauProcedureCtxt::setEnbFd( int enbFd_i )
+	{
+		enbFd_m = enbFd_i;
+	}
+	
+	/******************************************************************************
+	* returns enbFd
+	******************************************************************************/	
+	int MmeTauProcedureCtxt::getEnbFd()
+	{
+		return enbFd_m;
+	}
+	
+} // mme
diff --git a/src/mme-app/contextManager/mmContextManager.cpp b/src/mme-app/contextManager/mmContextManager.cpp
new file mode 100644
index 0000000..ad702f1
--- /dev/null
+++ b/src/mme-app/contextManager/mmContextManager.cpp
@@ -0,0 +1,52 @@
+ /*
+ * Copyright 2019-present Infosys Limited
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */ 
+/******************************************************************************
+ * mmContextManager.cpp
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/SMCodeGen/templates/ctxtManagerTmpls/blockPoolManager.cpp.tt>
+ ******************************************************************************/
+
+#include "memPoolManager.h"
+#include "contextManager/dataBlocks.h"
+#include "contextManager/mmContextManager.h"
+
+using namespace cmn::memPool;
+
+namespace mme
+{
+	/******************************************************************************
+	* Constructor
+	******************************************************************************/
+	MmContextManager::MmContextManager( int numOfBlocks ):poolManager_m(numOfBlocks)
+	{
+	}
+	
+	/******************************************************************************
+	* Destructor
+	******************************************************************************/
+	MmContextManager::~MmContextManager()
+	{
+	}
+	
+	/******************************************************************************
+	* Allocate MmContext data block
+	******************************************************************************/
+	MmContext* MmContextManager::allocateMmContext()
+	{
+		MmContext* MmContext_p = poolManager_m.allocate();
+		return MmContext_p;
+	}
+	
+	/******************************************************************************
+	* Deallocate a MmContext data block
+	******************************************************************************/
+	void MmContextManager::deallocateMmContext(MmContext* MmContextp )
+	{
+		poolManager_m.free( MmContextp );
+	}
+}
diff --git a/src/mme-app/contextManager/mmeDetachProcedureCtxtManager.cpp b/src/mme-app/contextManager/mmeDetachProcedureCtxtManager.cpp
new file mode 100644
index 0000000..d9f6997
--- /dev/null
+++ b/src/mme-app/contextManager/mmeDetachProcedureCtxtManager.cpp
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2019-present Infosys Limited
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */ 
+/******************************************************************************
+ * mmeDetachProcedureCtxtManager.cpp
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/SMCodeGen/templates/ctxtManagerTmpls/blockPoolManager.cpp.tt>
+ ******************************************************************************/
+
+#include "memPoolManager.h"
+#include "contextManager/dataBlocks.h"
+#include "contextManager/mmeDetachProcedureCtxtManager.h"
+
+using namespace cmn::memPool;
+
+namespace mme
+{
+	/******************************************************************************
+	* Constructor
+	******************************************************************************/
+	MmeDetachProcedureCtxtManager::MmeDetachProcedureCtxtManager(int numOfBlocks):poolManager_m(numOfBlocks)
+	{
+	}
+	
+	/******************************************************************************
+	* Destructor
+	******************************************************************************/
+	MmeDetachProcedureCtxtManager::~MmeDetachProcedureCtxtManager()
+	{
+	}
+	
+	/******************************************************************************
+	* Allocate MmeDetachProcedureCtxt data block
+	******************************************************************************/
+	MmeDetachProcedureCtxt* MmeDetachProcedureCtxtManager::allocateMmeDetachProcedureCtxt()
+	{
+		MmeDetachProcedureCtxt* MmeDetachProcedureCtxt_p = poolManager_m.allocate();
+		return MmeDetachProcedureCtxt_p;
+	}
+	
+	/******************************************************************************
+	* Deallocate a MmeDetachProcedureCtxt data block
+	******************************************************************************/
+	void MmeDetachProcedureCtxtManager::deallocateMmeDetachProcedureCtxt(MmeDetachProcedureCtxt* MmeDetachProcedureCtxtp )
+	{
+		poolManager_m.free( MmeDetachProcedureCtxtp );
+	}
+}
diff --git a/src/mme-app/contextManager/mmeProcedureCtxtManager.cpp b/src/mme-app/contextManager/mmeProcedureCtxtManager.cpp
new file mode 100644
index 0000000..84c25dc
--- /dev/null
+++ b/src/mme-app/contextManager/mmeProcedureCtxtManager.cpp
@@ -0,0 +1,52 @@
+ /*
+ * Copyright 2019-present Infosys Limited
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */ 
+/******************************************************************************
+ * mmeProcedureCtxtManager.cpp
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/SMCodeGen/templates/ctxtManagerTmpls/blockPoolManager.cpp.tt>
+ ******************************************************************************/
+
+#include "memPoolManager.h"
+#include "contextManager/dataBlocks.h"
+#include "contextManager/mmeProcedureCtxtManager.h"
+
+using namespace cmn::memPool;
+
+namespace mme
+{
+	/******************************************************************************
+	* Constructor
+	******************************************************************************/
+	MmeProcedureCtxtManager::MmeProcedureCtxtManager(int numOfBlocks):poolManager_m(numOfBlocks)
+	{
+	}
+	
+	/******************************************************************************
+	* Destructor
+	******************************************************************************/
+	MmeProcedureCtxtManager::~MmeProcedureCtxtManager()
+	{
+	}
+	
+	/******************************************************************************
+	* Allocate MmeProcedureCtxt data block
+	******************************************************************************/
+	MmeProcedureCtxt* MmeProcedureCtxtManager::allocateMmeProcedureCtxt()
+	{
+		MmeProcedureCtxt* MmeProcedureCtxt_p = poolManager_m.allocate();
+		return MmeProcedureCtxt_p;
+	}
+	
+	/******************************************************************************
+	* Deallocate a MmeProcedureCtxt data block
+	******************************************************************************/
+	void MmeProcedureCtxtManager::deallocateMmeProcedureCtxt(MmeProcedureCtxt* MmeProcedureCtxtp )
+	{
+		poolManager_m.free( MmeProcedureCtxtp );
+	}
+}
diff --git a/src/mme-app/contextManager/mmeSvcReqProcedureCtxtManager.cpp b/src/mme-app/contextManager/mmeSvcReqProcedureCtxtManager.cpp
new file mode 100644
index 0000000..fd70058
--- /dev/null
+++ b/src/mme-app/contextManager/mmeSvcReqProcedureCtxtManager.cpp
@@ -0,0 +1,52 @@
+ /*
+ * Copyright 2019-present Infosys Limited
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */ 
+/******************************************************************************
+ * mmeSvcReqProcedureCtxtManager.cpp
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/SMCodeGen/templates/ctxtManagerTmpls/blockPoolManager.cpp.tt>
+ ******************************************************************************/
+
+#include "memPoolManager.h"
+#include "contextManager/dataBlocks.h"
+#include "contextManager/mmeSvcReqProcedureCtxtManager.h"
+
+using namespace cmn::memPool;
+
+namespace mme
+{
+	/******************************************************************************
+	* Constructor
+	******************************************************************************/
+	MmeSvcReqProcedureCtxtManager::MmeSvcReqProcedureCtxtManager(int numOfBlocks):poolManager_m(numOfBlocks)
+	{
+	}
+	
+	/******************************************************************************
+	* Destructor
+	******************************************************************************/
+	MmeSvcReqProcedureCtxtManager::~MmeSvcReqProcedureCtxtManager()
+	{
+	}
+	
+	/******************************************************************************
+	* Allocate MmeSvcReqProcedureCtxt data block
+	******************************************************************************/
+	MmeSvcReqProcedureCtxt* MmeSvcReqProcedureCtxtManager::allocateMmeSvcReqProcedureCtxt()
+	{
+		MmeSvcReqProcedureCtxt* MmeSvcReqProcedureCtxt_p = poolManager_m.allocate();
+		return MmeSvcReqProcedureCtxt_p;
+	}
+	
+	/******************************************************************************
+	* Deallocate a MmeSvcReqProcedureCtxt data block
+	******************************************************************************/
+	void MmeSvcReqProcedureCtxtManager::deallocateMmeSvcReqProcedureCtxt(MmeSvcReqProcedureCtxt* MmeSvcReqProcedureCtxtp )
+	{
+		poolManager_m.free( MmeSvcReqProcedureCtxtp );
+	}
+}
diff --git a/src/mme-app/contextManager/mmeTauProcedureCtxtManager.cpp b/src/mme-app/contextManager/mmeTauProcedureCtxtManager.cpp
new file mode 100644
index 0000000..92149ac
--- /dev/null
+++ b/src/mme-app/contextManager/mmeTauProcedureCtxtManager.cpp
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2019-present Infosys Limited
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */ 
+/******************************************************************************
+ * mmeTauProcedureCtxtManager.cpp
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/SMCodeGen/templates/ctxtManagerTmpls/blockPoolManager.cpp.tt>
+ ******************************************************************************/
+
+#include "memPoolManager.h"
+#include "contextManager/dataBlocks.h"
+#include "contextManager/mmeTauProcedureCtxtManager.h"
+
+using namespace cmn::memPool;
+
+namespace mme
+{
+	/******************************************************************************
+	* Constructor
+	******************************************************************************/
+	MmeTauProcedureCtxtManager::MmeTauProcedureCtxtManager(int numOfBlocks):poolManager_m(numOfBlocks)
+	{
+	}
+	
+	/******************************************************************************
+	* Destructor
+	******************************************************************************/
+	MmeTauProcedureCtxtManager::~MmeTauProcedureCtxtManager()
+	{
+	}
+	
+	/******************************************************************************
+	* Allocate MmeTauProcedureCtxt data block
+	******************************************************************************/
+	MmeTauProcedureCtxt* MmeTauProcedureCtxtManager::allocateMmeTauProcedureCtxt()
+	{
+		MmeTauProcedureCtxt* MmeTauProcedureCtxt_p = poolManager_m.allocate();
+		return MmeTauProcedureCtxt_p;
+	}
+	
+	/******************************************************************************
+	* Deallocate a MmeTauProcedureCtxt data block
+	******************************************************************************/
+	void MmeTauProcedureCtxtManager::deallocateMmeTauProcedureCtxt(MmeTauProcedureCtxt* MmeTauProcedureCtxtp)
+	{
+		poolManager_m.free( MmeTauProcedureCtxtp );
+	}
+}
diff --git a/src/mme-app/contextManager/sessionContextManager.cpp b/src/mme-app/contextManager/sessionContextManager.cpp
new file mode 100644
index 0000000..0dad793
--- /dev/null
+++ b/src/mme-app/contextManager/sessionContextManager.cpp
@@ -0,0 +1,52 @@
+ /*
+ * Copyright 2019-present Infosys Limited
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */ 
+/******************************************************************************
+ * sessionContextManager.cpp
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/SMCodeGen/templates/ctxtManagerTmpls/blockPoolManager.cpp.tt>
+ ******************************************************************************/
+
+#include "memPoolManager.h"
+#include "contextManager/dataBlocks.h"
+#include "contextManager/sessionContextManager.h"
+
+using namespace cmn::memPool;
+
+namespace mme
+{
+	/******************************************************************************
+	* Constructor
+	******************************************************************************/
+	SessionContextManager::SessionContextManager(int numOfBlocks):poolManager_m(numOfBlocks)
+	{
+	}
+	
+	/******************************************************************************
+	* Destructor
+	******************************************************************************/
+	SessionContextManager::~SessionContextManager()
+	{
+	}
+	
+	/******************************************************************************
+	* Allocate SessionContext data block
+	******************************************************************************/
+	SessionContext* SessionContextManager::allocateSessionContext()
+	{
+		SessionContext* SessionContext_p = poolManager_m.allocate();
+		return SessionContext_p;
+	}
+	
+	/******************************************************************************
+	* Deallocate a SessionContext data block
+	******************************************************************************/
+	void SessionContextManager::deallocateSessionContext(SessionContext* SessionContextp )
+	{
+		poolManager_m.free( SessionContextp );
+	}
+}
diff --git a/src/mme-app/contextManager/subsDataGroupManager.cpp b/src/mme-app/contextManager/subsDataGroupManager.cpp
new file mode 100644
index 0000000..b3a5154
--- /dev/null
+++ b/src/mme-app/contextManager/subsDataGroupManager.cpp
@@ -0,0 +1,242 @@
+/*
+ * 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/SMCodeGen/templates/ctxtManagerTmpls/subsDataGroupManager.cpp.tt>
+ ***************************************/
+#include "contextManager/subsDataGroupManager.h"
+#include "log.h"
+#include "mmeStates/defaultMmeState.h"
+#include <sstream>
+
+namespace mme
+{
+	/******************************************************************************
+	* Constructor
+	******************************************************************************/
+	SubsDataGroupManager::SubsDataGroupManager()
+	{
+			UEContextManagerm_p = NULL;
+			MmContextManagerm_p = NULL;
+			SessionContextManagerm_p = NULL;
+			BearerContextManagerm_p = NULL;
+			MmeProcedureCtxtManagerm_p = NULL;
+			MmeDetachProcedureCtxtManagerm_p = NULL;
+			MmeSvcReqProcedureCtxtManagerm_p = NULL;
+			MmeTauProcedureCtxtManagerm_p = NULL;
+
+			initialize();
+	}
+	
+	/******************************************************************************
+	* Destructor
+	******************************************************************************/
+	SubsDataGroupManager::~SubsDataGroupManager()
+	{
+			delete UEContextManagerm_p;
+			delete MmContextManagerm_p;
+			delete SessionContextManagerm_p;
+			delete BearerContextManagerm_p;
+			delete MmeProcedureCtxtManagerm_p;
+			delete MmeDetachProcedureCtxtManagerm_p;
+			delete MmeSvcReqProcedureCtxtManagerm_p;
+			delete MmeTauProcedureCtxtManagerm_p;
+	}
+	
+	/******************************************
+	*  Initializes control block and pool managers
+	******************************************/
+	void SubsDataGroupManager::initialize()
+	{
+		initializeCBStore(8000);
+
+		UEContextManagerm_p = new UEContextManager(8000);
+		MmContextManagerm_p = new MmContextManager(8000);
+		SessionContextManagerm_p = new SessionContextManager(8000);
+		BearerContextManagerm_p = new BearerContextManager(8000);
+		MmeProcedureCtxtManagerm_p = new MmeProcedureCtxtManager(8000);
+		MmeDetachProcedureCtxtManagerm_p = new MmeDetachProcedureCtxtManager(8000);
+		MmeSvcReqProcedureCtxtManagerm_p = new MmeSvcReqProcedureCtxtManager(8000);
+		MmeTauProcedureCtxtManagerm_p = new MmeTauProcedureCtxtManager(8000);
+	}
+	
+	/******************************************************************************
+	* creates and returns static instance
+	******************************************************************************/
+	SubsDataGroupManager* SubsDataGroupManager::Instance()
+	{
+			static SubsDataGroupManager subDataGroupMgr;
+			return &subDataGroupMgr;
+	}
+
+	UEContext* SubsDataGroupManager::getUEContext()
+	{
+		return UEContextManagerm_p->allocateUEContext();
+	}
+	
+	void SubsDataGroupManager::deleteUEContext(UEContext* UEContextp )
+	{
+		UEContextManagerm_p->deallocateUEContext( UEContextp );
+	}
+	
+	MmContext* SubsDataGroupManager::getMmContext()
+	{
+		return MmContextManagerm_p->allocateMmContext();
+	}
+	
+	void SubsDataGroupManager::deleteMmContext(MmContext* MmContextp )
+	{
+		MmContextManagerm_p->deallocateMmContext( MmContextp );
+	}
+	
+	SessionContext* SubsDataGroupManager::getSessionContext()
+	{
+		return SessionContextManagerm_p->allocateSessionContext();
+	}
+	
+	void SubsDataGroupManager::deleteSessionContext(SessionContext* SessionContextp )
+	{
+		SessionContextManagerm_p->deallocateSessionContext( SessionContextp );
+	}
+	
+	BearerContext* SubsDataGroupManager::getBearerContext()
+	{
+		return BearerContextManagerm_p->allocateBearerContext();
+	}
+	
+	void SubsDataGroupManager::deleteBearerContext(BearerContext* BearerContextp )
+	{
+		BearerContextManagerm_p->deallocateBearerContext( BearerContextp );
+	}
+	
+	MmeProcedureCtxt* SubsDataGroupManager::getMmeProcedureCtxt()
+	{
+		return MmeProcedureCtxtManagerm_p->allocateMmeProcedureCtxt();
+	}
+	
+	void SubsDataGroupManager::deleteMmeProcedureCtxt(MmeProcedureCtxt* MmeProcedureCtxtp )
+	{
+		MmeProcedureCtxtManagerm_p->deallocateMmeProcedureCtxt( MmeProcedureCtxtp );
+	}
+
+	MmeDetachProcedureCtxt* SubsDataGroupManager::getMmeDetachProcedureCtxt()
+	{
+		return MmeDetachProcedureCtxtManagerm_p->allocateMmeDetachProcedureCtxt();
+	}
+
+	void SubsDataGroupManager::deleteMmeDetachProcedureCtxt(MmeDetachProcedureCtxt* MmeDetachProcedureCtxtp )
+	{
+		MmeDetachProcedureCtxtManagerm_p->deallocateMmeDetachProcedureCtxt( MmeDetachProcedureCtxtp );
+	}
+
+	MmeSvcReqProcedureCtxt* SubsDataGroupManager::getMmeSvcReqProcedureCtxt()
+	{
+		return MmeSvcReqProcedureCtxtManagerm_p->allocateMmeSvcReqProcedureCtxt();
+	}
+
+	void SubsDataGroupManager::deleteMmeSvcReqProcedureCtxt(MmeSvcReqProcedureCtxt* MmeSvcReqProcedureCtxtp )
+	{
+		MmeSvcReqProcedureCtxtManagerm_p->deallocateMmeSvcReqProcedureCtxt( MmeSvcReqProcedureCtxtp );
+	}
+
+	MmeTauProcedureCtxt* SubsDataGroupManager::getMmeTauProcedureCtxt()
+	{
+		return MmeTauProcedureCtxtManagerm_p->allocateMmeTauProcedureCtxt();
+	}
+	
+	void SubsDataGroupManager::deleteMmeTauProcedureCtxt(MmeTauProcedureCtxt* MmeTauProcedureCtxtp )
+	{
+		MmeTauProcedureCtxtManagerm_p->deallocateMmeTauProcedureCtxt( MmeTauProcedureCtxtp );
+	}
+	
+	/******************************************
+	* Add a imsi as key and cb index as value to imsi_cb_id_map
+	******************************************/
+	int SubsDataGroupManager::addimsikey( DigitRegister15 key, int cb_index )
+	{
+		std::lock_guard<std::mutex> lock(imsi_cb_id_map_mutex);
+
+		int rc = 1;
+		auto itr = imsi_cb_id_map.insert(std::pair<DigitRegister15, int>( key, cb_index ));
+		if (itr.second == false)
+		{
+			rc = -1;
+		}
+		return rc;
+	}
+	
+	/******************************************
+	* Delete a imsi key from imsi_cb_id_map
+	******************************************/		
+	int SubsDataGroupManager::deleteimsikey( DigitRegister15 key )
+	{
+		std::lock_guard<std::mutex> lock(imsi_cb_id_map_mutex);
+
+		return imsi_cb_id_map.erase( key );
+	}
+	
+	/******************************************
+	* Find cb with given imsi from imsi_cb_id_map
+	* returns -1 if not found, else cb index
+	******************************************/	
+	int SubsDataGroupManager::findCBWithimsi( DigitRegister15 key )
+	{
+		std::lock_guard<std::mutex> lock(imsi_cb_id_map_mutex);
+
+		auto itr = imsi_cb_id_map.find( key );
+		if( itr != imsi_cb_id_map.end())
+		{
+			return itr->second;
+		}
+		return -1;
+	}
+
+	/******************************************
+	* Add a mTmsi as key and cb index as value to mTmsi_cb_id_map
+	******************************************/
+	int SubsDataGroupManager::addmTmsikey( uint32_t key, int cb_index )
+	{
+		std::lock_guard<std::mutex> lock(mTmsi_cb_id_map_mutex);
+
+		int rc = 1;
+		auto itr = mTmsi_cb_id_map.insert(std::pair<uint32_t, int>( key, cb_index ));
+		if (itr.second == false)
+		{
+			rc = -1;
+		}
+		return rc;
+	}
+
+	/******************************************
+	* Delete a mTmsi key from mTmsi_cb_id_map
+	******************************************/
+	int SubsDataGroupManager::deletemTmsikey( uint32_t key )
+	{
+		std::lock_guard<std::mutex> lock(mTmsi_cb_id_map_mutex);
+
+		return mTmsi_cb_id_map.erase( key );
+	}
+
+	/******************************************
+	* Find cb with given mTmsi from mTmsi_cb_id_map
+	* returns -1 if not found, else cb index
+	******************************************/
+	int SubsDataGroupManager::findCBWithmTmsi( uint32_t key )
+	{
+		std::lock_guard<std::mutex> lock(mTmsi_cb_id_map_mutex);
+
+		auto itr = mTmsi_cb_id_map.find( key );
+		if( itr != mTmsi_cb_id_map.end())
+		{
+			return itr->second;
+		}
+		return -1;
+	}
+}
diff --git a/src/mme-app/contextManager/uEContextManager.cpp b/src/mme-app/contextManager/uEContextManager.cpp
new file mode 100644
index 0000000..62362bc
--- /dev/null
+++ b/src/mme-app/contextManager/uEContextManager.cpp
@@ -0,0 +1,52 @@
+ /*
+ * Copyright 2019-present Infosys Limited
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */ 
+/******************************************************************************
+ * uEContextManager.cpp
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/SMCodeGen/templates/ctxtManagerTmpls/blockPoolManager.cpp.tt>
+ ******************************************************************************/
+
+#include "memPoolManager.h"
+#include "contextManager/dataBlocks.h"
+#include "contextManager/uEContextManager.h"
+
+using namespace cmn::memPool;
+
+namespace mme
+{
+	/******************************************************************************
+	* Constructor
+	******************************************************************************/
+	UEContextManager::UEContextManager(int numOfBlocks):poolManager_m(numOfBlocks)
+	{
+	}
+	
+	/******************************************************************************
+	* Destructor
+	******************************************************************************/
+	UEContextManager::~UEContextManager()
+	{
+	}
+	
+	/******************************************************************************
+	* Allocate UEContext data block
+	******************************************************************************/
+	UEContext* UEContextManager::allocateUEContext()
+	{
+		UEContext* UEContext_p = poolManager_m.allocate();
+		return UEContext_p;
+	}
+	
+	/******************************************************************************
+	* Deallocate a UEContext data block
+	******************************************************************************/
+	void UEContextManager::deallocateUEContext(UEContext* UEContextp )
+	{
+		poolManager_m.free( UEContextp );
+	}
+}
diff --git a/src/mme-app/interfaces/mmeIpcInterface.cpp b/src/mme-app/interfaces/mmeIpcInterface.cpp
new file mode 100644
index 0000000..15950f7
--- /dev/null
+++ b/src/mme-app/interfaces/mmeIpcInterface.cpp
@@ -0,0 +1,153 @@
+/*
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <interfaces/mmeIpcInterface.h>
+#include <blockingCircularFifo.h>
+#include <ipcTypes.h>
+#include <tipcSocket.h>
+#include <tipcTypes.h>
+#include <msgBuffer.h>
+#include <mme_app.h>
+#include <msgHandlers/gtpMsgHandler.h>
+#include <msgHandlers/s1MsgHandler.h>
+#include <msgHandlers/s6MsgHandler.h>
+
+extern "C" {
+	#include "log.h"
+}
+
+using namespace cmn::ipc;
+using namespace cmn::utils;
+
+extern BlockingCircularFifo<MsgBuffer, fifoQSize_c> mmeIpcEgressFifo_g;
+
+MmeIpcInterface::MmeIpcInterface():sender_mp(), reader_mp()
+{
+
+}
+
+MmeIpcInterface::~MmeIpcInterface()
+{
+	teardown();
+}
+
+bool MmeIpcInterface::setup()
+{
+
+	// INIT socket for receiving ipc message
+	TipcSocket* receiver_sock = new TipcSocket();
+
+	IpcAddress myAddress;
+	myAddress.u32 = mmeAppInstanceNum_c;
+
+	if (receiver_sock->bindTipcSocket(myAddress) == false)
+	{
+		log_msg(LOG_ERROR, "MmeIpcInterface Setup Failed!!!\n");
+
+		delete receiver_sock;
+
+		return false;
+	}
+
+	// INIT socket for sending ipc message
+	TipcSocket* sender_sock = new TipcSocket();
+
+	sender_mp = sender_sock;
+	reader_mp = receiver_sock;
+
+	return true;
+}
+
+void MmeIpcInterface::teardown()
+{
+	if (sender_mp != NULL)
+		delete sender_mp;
+
+	if (reader_mp != NULL)
+		delete reader_mp;
+}
+
+cmn::ipc::IpcChannel* MmeIpcInterface::sender()
+{
+	if (sender_mp != NULL)
+		return sender_mp;
+	else
+		return NULL;
+}
+
+cmn::ipc::IpcChannel* MmeIpcInterface::reader()
+{
+	if (reader_mp != NULL)
+		return reader_mp;
+	else
+		return NULL;
+}
+
+void MmeIpcInterface::handleIpcMsg(MsgBuffer* msgBuf)
+{
+	uint32_t srcAddr, destAddr;
+
+	msgBuf->readUint32(destAddr);
+	msgBuf->readUint32(srcAddr);
+
+	log_msg(LOG_INFO, "IPC Message from src %u to dest %u\n", srcAddr, destAddr);
+
+	switch (srcAddr)
+
+	{
+	case TipcInstanceTypes::s1apAppInstanceNum_c:
+		S1MsgHandler::Instance()->handleS1Message_v(msgBuf);
+		break;
+	case TipcInstanceTypes::s11AppInstanceNum_c:
+		GtpMsgHandler::Instance()->handleGtpMessage_v(msgBuf);
+		break;
+	case TipcInstanceTypes::s6AppInstanceNum_c:
+		S6MsgHandler::Instance()->handleS6Message_v(msgBuf);
+		break;
+	default:
+		log_msg(LOG_INFO, "IPC Message from unsupported instance\n");
+	}
+}
+
+bool MmeIpcInterface::dispatchIpcMsg(char* buf, uint32_t len, cmn::ipc::IpcAddress& destAddr)
+{
+	cmn::ipc::IpcMsgHeader msgHeader;
+	msgHeader.srcAddr.u32 = TipcInstanceTypes::mmeAppInstanceNum_c;
+	msgHeader.destAddr.u32 = destAddr.u32;
+
+	MsgBuffer *msgBuf = new MsgBuffer(len + sizeof(cmn::ipc::IpcMsgHeader));
+	msgBuf->writeUint32(msgHeader.destAddr.u32);
+        msgBuf->writeUint32(msgHeader.srcAddr.u32);
+	msgBuf->writeBytes((uint8_t*)buf, len);
+
+	log_msg(LOG_INFO, "Dispatch IPC msg\n");
+
+	return mmeIpcEgressFifo_g.push(msgBuf);
+}
+
+bool MmeIpcInterface::dispatchIpcMsg(cmn::utils::MsgBuffer* msgBuf, cmn::ipc::IpcAddress& destAddr)
+{
+	cmn::ipc::IpcMsgHeader msgHeader;
+	msgHeader.srcAddr.u32 = TipcInstanceTypes::mmeAppInstanceNum_c;
+	msgHeader.destAddr.u32 = destAddr.u32;
+
+	msgBuf->rewind();
+	msgBuf->writeUint32(msgHeader.destAddr.u32, false);
+	msgBuf->writeUint32(msgHeader.srcAddr.u32, false);
+
+	return mmeIpcEgressFifo_g.push(msgBuf);
+}
+
diff --git a/src/mme-app/main.cpp b/src/mme-app/main.cpp
new file mode 100644
index 0000000..4c2bd41
--- /dev/null
+++ b/src/mme-app/main.cpp
@@ -0,0 +1,144 @@
+/*
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <iostream>
+#include <pthread.h>
+#include <thread>
+#include <string.h>
+#include <sys/stat.h>
+
+#include <blockingCircularFifo.h>
+#include <msgBuffer.h>
+#include "err_codes.h"
+#include <interfaces/mmeIpcInterface.h>
+#include <mmeStates/stateFactory.h>
+#include "message_queues.h"
+#include "mme_app.h"
+#include "msgType.h"
+#include "stateMachineEngine.h"
+#include <sys/types.h>
+#include "mmeThreads.h"
+
+extern "C"
+{
+ 	#include "log.h"
+	#include "json_data.h"
+}
+
+extern void* RunServer(void * data);
+using namespace std;
+using namespace mme;
+
+/*********************************************************
+ *
+ * Circular FIFOs for sender IPC and Reader IPC threads
+ *
+ **********************************************************/
+cmn::utils::BlockingCircularFifo<cmn::utils::MsgBuffer, fifoQSize_c> mmeIpcIngressFifo_g;
+cmn::utils::BlockingCircularFifo<cmn::utils::MsgBuffer, fifoQSize_c> mmeIpcEgressFifo_g;
+
+/*********************************************************
+ *
+ * Externs
+ *
+ **********************************************************/
+extern char processName[255];
+extern int pid;
+
+mme_config g_mme_cfg;
+pthread_t stage_tid[5];
+
+MmeIpcInterface* mmeIpcIf_g = NULL;
+void
+init_parser(char *path)
+{
+	load_json(path);
+}
+
+int
+parse_mme_conf()
+{
+	/*mme own information*/
+	g_mme_cfg.mme_name = get_string_scalar("mme.name");
+	if(NULL == g_mme_cfg.mme_name) return E_PARSING_FAILED;
+
+	g_mme_cfg.mme_ip_addr = get_ip_scalar("mme.ip_addr");
+	if(E_PARSING_FAILED == g_mme_cfg.mme_ip_addr) return E_PARSING_FAILED;
+
+	g_mme_cfg.mcc_dig1 = get_int_scalar("mme.mcc.dig1");
+	if(E_PARSING_FAILED == g_mme_cfg.mcc_dig1) return E_PARSING_FAILED;
+	g_mme_cfg.mcc_dig2 = get_int_scalar("mme.mcc.dig2");
+	if(E_PARSING_FAILED == g_mme_cfg.mcc_dig1) return E_PARSING_FAILED;
+	g_mme_cfg.mcc_dig3 = get_int_scalar("mme.mcc.dig3");
+	if(E_PARSING_FAILED == g_mme_cfg.mcc_dig1) return E_PARSING_FAILED;
+	g_mme_cfg.mcc_dig1 = get_int_scalar("mme.mnc.dig1");
+	if(E_PARSING_FAILED == g_mme_cfg.mcc_dig1) return E_PARSING_FAILED;
+	g_mme_cfg.mnc_dig2 = get_int_scalar("mme.mnc.dig2");
+	if(E_PARSING_FAILED == g_mme_cfg.mcc_dig1) return E_PARSING_FAILED;
+	g_mme_cfg.mnc_dig3 = get_int_scalar("mme.mnc.dig3");
+	if(E_PARSING_FAILED == g_mme_cfg.mcc_dig1) return E_PARSING_FAILED;
+
+	return SUCCESS;
+}
+
+void setThreadName(std::thread* thread, const char* threadName)
+{
+   	auto handle = thread->native_handle();
+	pthread_setname_np(handle,threadName);
+}
+
+int main(int argc, char *argv[])
+{
+	memcpy (processName, argv[0], strlen(argv[0]));
+	pid = getpid();
+
+	StateFactory::Instance()->initialize();
+
+	mmeIpcIf_g = new MmeIpcInterface();
+	mmeIpcIf_g->setup();
+
+	init_parser("conf/mme.json");
+	parse_mme_conf();
+
+	MmeIngressIpcProducerThread ipcReader;
+	std::thread t1(ipcReader);
+	setThreadName(&t1, "IpcReader");
+	t1.detach();
+
+	MmeIngressIpcConsumerThread msgHandlerThread;
+	std::thread t2(msgHandlerThread);
+	setThreadName(&t2, "MMEMsgHandlerThread");
+	t2.detach();
+
+	MmeEgressIpcConsumerThread ipcWriter;
+	std::thread t3(ipcWriter);
+	setThreadName(&t3, "IpcWriter");
+	t3.detach();
+
+	// start gRPC server
+	pthread_attr_t attr;
+	pthread_attr_init(&attr);
+	pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+	pthread_create(&stage_tid[0], &attr, &RunServer, NULL);
+	pthread_attr_destroy(&attr);
+
+	while(1)
+	{
+		SM::StateMachineEngine::Instance()->run();
+	}
+
+	return 0;
+}
diff --git a/src/mme-app/mmeGrpcServer/mmeGrpcServer.cpp b/src/mme-app/mmeGrpcServer/mmeGrpcServer.cpp
new file mode 100644
index 0000000..105aee5
--- /dev/null
+++ b/src/mme-app/mmeGrpcServer/mmeGrpcServer.cpp
@@ -0,0 +1,290 @@
+#include <iostream>
+#include <memory>
+#include <string>
+#include <sstream>
+#include <time.h>
+#include <grpcpp/grpcpp.h>
+
+#include "mmeGrpc.grpc.pb.h"
+
+#include <controlBlock.h>
+#include <contextManager/dataBlocks.h>
+#include <contextManager/subsDataGroupManager.h>
+#include <procedureStats.h>
+
+using grpc::Server;
+using grpc::ServerBuilder;
+using grpc::ServerContext;
+using grpc::ServerReader;                                                     
+using grpc::ServerReaderWriter;                                                
+using grpc::ServerWriter; 
+using grpc::Status;
+using mmeGrpc::UeContextReqBuf;
+using mmeGrpc::UeContextRespBuf;
+using mmeGrpc::UeContextRespBuf_SessionContextRespBuf;
+using mmeGrpc::MmeGrpcCli;
+using mmeGrpc::Empty;
+using mmeGrpc::ProcedureStatsRespBuf;
+using mmeGrpc::EventInfoRespBuf;
+using mmeGrpc::EventInfoRespBuf_EventInfoBuf;
+
+using namespace mme;
+
+const string UEStates[4]={ "NoState", "EpsAttached", "Detached", "Idle" };
+// Logic and data behind the server's behavior.
+class MmeGrpcCliServiceImpl final : public MmeGrpcCli::Service {
+  Status GetUeContextInfo(SM::ControlBlock* controlBlk_p, UeContextRespBuf* reply)   {
+	//time_t my_time = time(NULL);
+//	SM::ControlBlock* controlBlk_p = mme::SubsDataGroupManager::Instance()->findControlBlock((uint32_t)request->id());
+	if (controlBlk_p)
+	{
+		UEContext* uecontext_p=dynamic_cast<UEContext*>(controlBlk_p->getPermDataBlock());
+		if (uecontext_p != NULL)
+		{
+ 			//cout << "MY TIME " << ctime(&my_time);
+			
+			// Display IMSI
+			stringstream ss;
+			ss << uecontext_p->getImsi();
+			reply->set_imsi(ss.str());
+
+			// MSISDN
+			ss.str("");
+			ss << uecontext_p->getMsisdn();
+			string ms(ss.str());
+            ms.resize(10);
+            ms.shrink_to_fit();
+            reply->set_msisdn(ms);
+			
+			// TAI
+			ss.str("");
+			const TAI& tai = uecontext_p->getTai().tai_m;
+			ss << "MCC : ";
+			ss << (unsigned char)((tai.plmn_id.idx[0] & 0x0f) + 0x30);
+			ss << (unsigned char)((tai.plmn_id.idx[0] >> 4) + 0x30);
+			ss << (unsigned char)((tai.plmn_id.idx[1] & 0x0f) + 0x30);
+			ss << " MNC : ";
+			ss << (unsigned char)((tai.plmn_id.idx[2] & 0x0f) + 0x30);
+			ss << (unsigned char)((tai.plmn_id.idx[2] >> 4) + 0x30);
+			ss << " TAC : " << tai.tac ;
+			reply->set_tai(ss.str());
+
+			// Cell Identity
+			ss.str("");
+			const CGI& cgi = uecontext_p->getUtranCgi().cgi_m;
+			ss << "0x" << std::hex << cgi.cell_id;
+			reply->set_eutran_cgi(ss.str());
+
+			reply->set_context_id(uecontext_p->getContextID());
+
+			reply->set_enb_ue_s1ap_id(uecontext_p->getS1apEnbUeId());
+			
+			MmContext* mmCtxt = uecontext_p->getMmContext();
+			UE_State_e uestate = mmCtxt->getMmState();
+
+			reply->set_ue_state(UEStates[uestate]);
+
+			SessionContext* sessioncontext_p = uecontext_p->getSessionContext();
+			if (sessioncontext_p != NULL)
+			{
+				UeContextRespBuf_SessionContextRespBuf* session_ctxt = reply->add_sessioncontext();
+				if (session_ctxt)
+				{
+					// APN
+					const apn_name& apn = sessioncontext_p->getAccessPtName().apnname_m;
+					string apnStr((const char*)(apn.val), apn.len);
+					session_ctxt->set_apn(apnStr);
+
+					// PDN address
+					const PAA& PdnAddr = sessioncontext_p->getPdnAddr().paa_m;
+				        char ipStr[INET_ADDRSTRLEN];
+				        inet_ntop(AF_INET, &(PdnAddr.ip_type.ipv4), ipStr, INET_ADDRSTRLEN);
+					session_ctxt->set_pdn_address(ipStr);
+
+					// Bearer ID
+					session_ctxt->set_bearer_id(5);
+
+					// S11 SGW GTP-C TEID
+					const fteid& s11SgwCTeid = sessioncontext_p->getS11SgwCtrlFteid().fteid_m;
+
+					ss.str("");
+					memset(ipStr, 0, INET_ADDRSTRLEN);
+					uint32_t ip = ntohl(s11SgwCTeid.ip.ipv4.s_addr);
+
+					inet_ntop(AF_INET, &(ip), ipStr, INET_ADDRSTRLEN);
+					ss << "IP " << ipStr << " TEID " << s11SgwCTeid.header.teid_gre;
+					session_ctxt->set_s11_sgw_gtpc_teid(ss.str());
+
+					// S5S8 PGW GTP-C TEID
+					const fteid& s5s8PgwCTeid = sessioncontext_p->getS5S8PgwCtrlFteid().fteid_m;
+
+					ss.str("");
+                                        memset(ipStr, 0, INET_ADDRSTRLEN);
+					ip = ntohl(s5s8PgwCTeid.ip.ipv4.s_addr);
+
+					inet_ntop(AF_INET, &(ip), ipStr, INET_ADDRSTRLEN);
+					ss << "IP " << ipStr << " TEID " << s5s8PgwCTeid.header.teid_gre;
+					session_ctxt->set_s5_pgw_gtpc_teid(ss.str());
+					
+					BearerContext* bearerCtxt = sessioncontext_p->getBearerContext();
+					// S1U ENB TEID
+					const fteid& s1uEnbTeid = bearerCtxt->getS1uEnbUserFteid().fteid_m;
+
+					ss.str("");
+                    memset(ipStr, 0, INET_ADDRSTRLEN);
+					ip = ntohl(s1uEnbTeid.ip.ipv4.s_addr);
+
+                    inet_ntop(AF_INET, &(ip), ipStr, INET_ADDRSTRLEN);
+                    ss << "IP " << ipStr << " TEID " << s1uEnbTeid.header.teid_gre;
+					session_ctxt->set_s1u_enb_teid(ss.str());
+
+					// S1U SGW TEID
+				 	const fteid& s1uSgwTeid = bearerCtxt->getS1uSgwUserFteid().fteid_m;
+					ss.str("");
+                                        memset(ipStr, 0, INET_ADDRSTRLEN);
+					ip = ntohl(s1uSgwTeid.ip.ipv4.s_addr);
+
+                                        inet_ntop(AF_INET, &(ip), ipStr, INET_ADDRSTRLEN);
+                                        ss << "IP " << ipStr << " TEID " << s1uSgwTeid.header.teid_gre;
+                                        session_ctxt->set_s1u_sgw_teid(ss.str());
+
+                                        // S5-U PGW TEID
+                                        const fteid& s5uPgwTeid = bearerCtxt->getS5S8PgwUserFteid().fteid_m;
+                                        ss.str("");
+                                        memset(ipStr, 0, INET_ADDRSTRLEN);
+                                        ip = ntohl(s5uPgwTeid.ip.ipv4.s_addr);
+
+                                        inet_ntop(AF_INET, &(ip), ipStr, INET_ADDRSTRLEN);
+                                        ss << "IP " << ipStr << " TEID " << s5uPgwTeid.header.teid_gre;
+                                        session_ctxt->set_s5u_pgw_teid(ss.str());					
+
+				}
+			}	
+		}
+	}
+	return Status::OK;
+
+  }
+
+  Status GetUeContext(ServerContext* context, const UeContextReqBuf* request,
+                  UeContextRespBuf* reply) override 
+  {
+        SM::ControlBlock* controlBlk_p = mme::SubsDataGroupManager::Instance()->findControlBlock((uint32_t)request->id());
+        GetUeContextInfo(controlBlk_p, reply);
+
+        return Status::OK;
+  }
+
+  Status ShowAllMobileContexts(ServerContext* context, const Empty* request,
+                      ServerWriter<UeContextRespBuf>* writer) override 
+  {
+      for (uint32_t i = 1; i <= 8000; i++)
+      {
+              SM::ControlBlock* controlBlk_p = mme::SubsDataGroupManager::Instance()->findControlBlock(i);
+              if (controlBlk_p != NULL && controlBlk_p->getPermDataBlock() != NULL)
+              {
+                      UeContextRespBuf reply;
+                      GetUeContextInfo(controlBlk_p, &reply);
+                      writer->Write(reply);
+              }
+      }
+      return Status::OK;
+  }
+
+  Status GetDebugUeContext(ServerContext* context, const UeContextReqBuf* request,
+		  	EventInfoRespBuf* reply) override {
+	SM::ControlBlock* controlBlk_p = mme::SubsDataGroupManager::Instance()->findControlBlock((uint32_t)request->id());
+	if( controlBlk_p )
+	{
+		UEContext* uecontext_p=dynamic_cast<UEContext*>(controlBlk_p->getPermDataBlock());
+		if( uecontext_p )
+		{
+			MmContext* mmCtxt = uecontext_p->getMmContext();
+			UE_State_e uestate = mmCtxt->getMmState();
+        		reply->set_ue_state(UEStates[static_cast<int>(uestate)]);
+		}
+		deque<SM::debugEventInfo> evtQ = controlBlk_p->getDebugInfoQueue();
+        	for(auto it=evtQ.begin();it!=evtQ.end();it++)
+		{
+        		EventInfoRespBuf_EventInfoBuf* EvtInfo = reply->add_eventinfo();
+	                string strEvent = Events[it->event];
+        	        EvtInfo->set_event(strEvent);
+                	string strState = States[it->state];
+	                EvtInfo->set_state(strState);
+        	        EvtInfo->set_time(ctime(&(it->evt_time)));
+        	}
+	}
+	return Status::OK;
+  }
+
+  Status GetProcStats(ServerContext* context,const Empty* request,
+		  ProcedureStatsRespBuf* reply) override {
+	/*time_t my_time = time(NULL);
+	my_time = time(NULL);
+        cout << "Req recieved at server" << ctime(&my_time);*/
+        reply->set_num_of_air_sent(ProcedureStats::num_of_air_sent);
+		reply->set_num_of_ulr_sent(ProcedureStats::num_of_ulr_sent);
+        reply->set_num_of_processed_aia(ProcedureStats::num_of_processed_aia);
+        reply->set_num_of_processed_ula(ProcedureStats::num_of_processed_ula);
+        reply->set_num_of_auth_req_to_ue_sent(ProcedureStats::num_of_auth_req_to_ue_sent);
+        reply->set_num_of_processed_auth_response(ProcedureStats::num_of_processed_auth_response);
+        reply->set_num_of_sec_mode_cmd_to_ue_sent(ProcedureStats::num_of_sec_mode_cmd_to_ue_sent);
+        reply->set_num_of_processed_sec_mode_resp(ProcedureStats::num_of_processed_sec_mode_resp);
+        reply->set_num_of_esm_info_req_to_ue_sent(ProcedureStats::num_of_esm_info_req_to_ue_sent);
+        reply->set_num_of_handled_esm_info_resp(ProcedureStats::num_of_handled_esm_info_resp);
+        reply->set_num_of_cs_req_to_sgw_sent(ProcedureStats::num_of_cs_req_to_sgw_sent);
+        reply->set_num_of_processed_cs_resp(ProcedureStats::num_of_processed_cs_resp);
+        reply->set_num_of_init_ctxt_req_to_ue_sent(ProcedureStats::num_of_init_ctxt_req_to_ue_sent);
+        reply->set_num_of_processed_init_ctxt_resp(ProcedureStats::num_of_processed_init_ctxt_resp);
+        reply->set_num_of_mb_req_to_sgw_sent(ProcedureStats::num_of_mb_req_to_sgw_sent);
+        reply->set_num_of_processed_attach_cmp_from_ue(ProcedureStats::num_of_processed_attach_cmp_from_ue);
+        reply->set_num_of_processed_mb_resp(ProcedureStats::num_of_processed_mb_resp);
+        reply->set_num_of_attach_done(ProcedureStats::num_of_attach_done);
+        reply->set_num_of_del_session_req_sent(ProcedureStats::num_of_del_session_req_sent);
+        reply->set_num_of_purge_req_sent(ProcedureStats::num_of_purge_req_sent);
+        reply->set_num_of_processed_del_session_resp(ProcedureStats::num_of_processed_del_session_resp);
+        reply->set_num_of_processed_pur_resp(ProcedureStats::num_of_processed_pur_resp);
+        reply->set_num_of_detach_accept_to_ue_sent(ProcedureStats::num_of_detach_accept_to_ue_sent);
+        reply->set_num_of_processed_detach_accept(ProcedureStats::num_of_processed_detach_accept);
+        reply->set_num_of_ue_ctxt_release(ProcedureStats::num_of_ue_ctxt_release);
+        reply->set_num_of_processed_ctxt_rel_resp(ProcedureStats::num_of_processed_ctxt_rel_resp);
+        reply->set_num_of_subscribers_attached(ProcedureStats::num_of_subscribers_attached);
+        reply->set_num_of_rel_access_bearer_req_sent(ProcedureStats::num_of_rel_access_bearer_req_sent);
+        reply->set_num_of_rel_access_bearer_resp_received(ProcedureStats::num_of_rel_access_bearer_resp_received);
+        reply->set_num_of_s1_rel_req_received(ProcedureStats::num_of_s1_rel_req_received);
+        reply->set_num_of_s1_rel_cmd_sent(ProcedureStats::num_of_s1_rel_cmd_sent);
+        reply->set_num_of_s1_rel_comp_received(ProcedureStats::num_of_s1_rel_comp_received);
+        reply->set_num_of_clr_received(ProcedureStats::num_of_clr_received);
+        reply->set_num_of_cla_sent(ProcedureStats::num_of_cla_sent);
+        reply->set_num_of_detach_req_to_ue_sent(ProcedureStats::num_of_detach_req_to_ue_sent);
+        reply->set_num_of_detach_accept_from_ue(ProcedureStats::num_of_detach_accept_from_ue);		
+        reply->set_total_num_of_subscribers(ProcedureStats::total_num_of_subscribers);
+        reply->set_num_of_subscribers_detached(ProcedureStats::num_of_subscribers_detached); 	
+	reply->set_num_of_tau_response_to_ue_sent(ProcedureStats::num_of_tau_response_to_ue_sent);
+		
+	//reply->set_num_of_ddn_received(ProcedureStats::num_of_ddn_received);
+        return Status::OK;
+  }
+
+};
+
+void * RunServer(void* data) {
+  std::string server_address("0.0.0.0:50051");
+  MmeGrpcCliServiceImpl service;
+
+  ServerBuilder builder;
+  // Listen on the given address without any authentication mechanism.
+  builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());
+  // Register "service" as the instance through which we'll communicate with
+  // clients. In this case it corresponds to an *synchronous* service.
+  builder.RegisterService(&service);
+  // Finally assemble the server.
+  std::unique_ptr<Server> server(builder.BuildAndStart());
+  std::cout << "Server listening on " << server_address << std::endl;
+
+  // Wait for the server to shutdown. Note that some other thread must be
+  // responsible for shutting down the server for this call to ever return.
+  server->Wait();
+
+  return NULL;
+}
diff --git a/src/mme-app/mmeStates/attachStart.cpp b/src/mme-app/mmeStates/attachStart.cpp
new file mode 100644
index 0000000..3378e7f
--- /dev/null
+++ b/src/mme-app/mmeStates/attachStart.cpp
@@ -0,0 +1,60 @@
+  
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+ 
+/**************************************
+ * attachStart.cpp
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/SMCodeGen/templates/stateMachineTmpls/state.cpp.tt>
+ **************************************/
+
+#include "smEnumTypes.h"
+#include "actionTable.h"
+#include "actionHandlers/actionHandlers.h"
+
+#include "mmeStates/attachStart.h"	
+#include "mmeStates/attachWfImsiValidateAction.h"
+
+using namespace mme;
+using namespace SM;
+
+/******************************************************************************
+* Constructor
+******************************************************************************/
+AttachStart::AttachStart():State(State_e::attach_start)
+{
+}
+
+/******************************************************************************
+* Destructor
+******************************************************************************/
+AttachStart::~AttachStart()
+{
+}
+
+/******************************************************************************
+* creates and returns static instance
+******************************************************************************/
+AttachStart* AttachStart::Instance()
+{
+        static AttachStart state;
+        return &state;
+}
+
+/******************************************************************************
+* initializes eventToActionsMap
+******************************************************************************/
+void AttachStart::initialize()
+{
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::validate_imsi_in_ue_context);
+                actionTable.setNextState(AttachWfImsiValidateAction::Instance());
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::VALIDATE_IMSI, actionTable));
+        }
+}
diff --git a/src/mme-app/mmeStates/attachWfAia.cpp b/src/mme-app/mmeStates/attachWfAia.cpp
new file mode 100644
index 0000000..9e437b3
--- /dev/null
+++ b/src/mme-app/mmeStates/attachWfAia.cpp
@@ -0,0 +1,61 @@
+  
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+ 
+/**************************************
+ * attachWfAia.cpp
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/SMCodeGen/templates/stateMachineTmpls/state.cpp.tt>
+ **************************************/
+
+#include "smEnumTypes.h"
+#include "actionTable.h"
+#include "actionHandlers/actionHandlers.h"
+
+#include "mmeStates/attachWfAia.h"	
+#include "mmeStates/attachWfAuthResp.h"
+
+using namespace mme;
+using namespace SM;
+
+/******************************************************************************
+* Constructor
+******************************************************************************/
+AttachWfAia::AttachWfAia():State(State_e::attach_wf_aia)
+{
+}
+
+/******************************************************************************
+* Destructor
+******************************************************************************/
+AttachWfAia::~AttachWfAia()
+{
+}
+
+/******************************************************************************
+* creates and returns static instance
+******************************************************************************/
+AttachWfAia* AttachWfAia::Instance()
+{
+        static AttachWfAia state;
+        return &state;
+}
+
+/******************************************************************************
+* initializes eventToActionsMap
+******************************************************************************/
+void AttachWfAia::initialize()
+{
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::process_aia);
+                actionTable.addAction(&ActionHandlers::auth_req_to_ue);
+                actionTable.setNextState(AttachWfAuthResp::Instance());
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::AIA_FROM_HSS, actionTable));
+        }
+}
diff --git a/src/mme-app/mmeStates/attachWfAttCmp.cpp b/src/mme-app/mmeStates/attachWfAttCmp.cpp
new file mode 100644
index 0000000..4fc5e77
--- /dev/null
+++ b/src/mme-app/mmeStates/attachWfAttCmp.cpp
@@ -0,0 +1,61 @@
+  
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+ 
+/**************************************
+ * attachWfAttCmp.cpp
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/SMCodeGen/templates/stateMachineTmpls/state.cpp.tt>
+ **************************************/
+
+#include "smEnumTypes.h"
+#include "actionTable.h"
+#include "actionHandlers/actionHandlers.h"
+
+#include "mmeStates/attachWfAttCmp.h"	
+#include "mmeStates/attachWfMbResp.h"
+
+using namespace mme;
+using namespace SM;
+
+/******************************************************************************
+* Constructor
+******************************************************************************/
+AttachWfAttCmp::AttachWfAttCmp():State(State_e::attach_wf_att_cmp)
+{
+}
+
+/******************************************************************************
+* Destructor
+******************************************************************************/
+AttachWfAttCmp::~AttachWfAttCmp()
+{
+}
+
+/******************************************************************************
+* creates and returns static instance
+******************************************************************************/
+AttachWfAttCmp* AttachWfAttCmp::Instance()
+{
+        static AttachWfAttCmp state;
+        return &state;
+}
+
+/******************************************************************************
+* initializes eventToActionsMap
+******************************************************************************/
+void AttachWfAttCmp::initialize()
+{
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::process_attach_cmp_from_ue);
+                actionTable.addAction(&ActionHandlers::send_mb_req_to_sgw);
+                actionTable.setNextState(AttachWfMbResp::Instance());
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::ATT_CMP_FROM_UE, actionTable));
+        }
+}
diff --git a/src/mme-app/mmeStates/attachWfAuthResp.cpp b/src/mme-app/mmeStates/attachWfAuthResp.cpp
new file mode 100644
index 0000000..9ba6b10
--- /dev/null
+++ b/src/mme-app/mmeStates/attachWfAuthResp.cpp
@@ -0,0 +1,60 @@
+  
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+ 
+/**************************************
+ * attachWfAuthResp.cpp
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/SMCodeGen/templates/stateMachineTmpls/state.cpp.tt>
+ **************************************/
+
+#include "smEnumTypes.h"
+#include "actionTable.h"
+#include "actionHandlers/actionHandlers.h"
+
+#include "mmeStates/attachWfAuthResp.h"	
+#include "mmeStates/attachWfAuthRespValidate.h"
+
+using namespace mme;
+using namespace SM;
+
+/******************************************************************************
+* Constructor
+******************************************************************************/
+AttachWfAuthResp::AttachWfAuthResp():State(State_e::attach_wf_auth_resp)
+{
+}
+
+/******************************************************************************
+* Destructor
+******************************************************************************/
+AttachWfAuthResp::~AttachWfAuthResp()
+{
+}
+
+/******************************************************************************
+* creates and returns static instance
+******************************************************************************/
+AttachWfAuthResp* AttachWfAuthResp::Instance()
+{
+        static AttachWfAuthResp state;
+        return &state;
+}
+
+/******************************************************************************
+* initializes eventToActionsMap
+******************************************************************************/
+void AttachWfAuthResp::initialize()
+{
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::auth_response_validate);
+                actionTable.setNextState(AttachWfAuthRespValidate::Instance());
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::AUTH_RESP_FROM_UE, actionTable));
+        }
+}
diff --git a/src/mme-app/mmeStates/attachWfAuthRespValidate.cpp b/src/mme-app/mmeStates/attachWfAuthRespValidate.cpp
new file mode 100644
index 0000000..2aa31cd
--- /dev/null
+++ b/src/mme-app/mmeStates/attachWfAuthRespValidate.cpp
@@ -0,0 +1,72 @@
+  
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+ 
+/**************************************
+ * attachWfAuthRespValidate.cpp
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/SMCodeGen/templates/stateMachineTmpls/state.cpp.tt>
+ **************************************/
+
+#include "smEnumTypes.h"
+#include "actionTable.h"
+#include "actionHandlers/actionHandlers.h"
+
+#include "mmeStates/attachWfAuthRespValidate.h"	
+#include "mmeStates/attachWfSecCmp.h"	
+#include "mmeStates/attachWfAia.h"
+
+using namespace mme;
+using namespace SM;
+
+/******************************************************************************
+* Constructor
+******************************************************************************/
+AttachWfAuthRespValidate::AttachWfAuthRespValidate():State(State_e::attach_wf_auth_resp_validate)
+{
+}
+
+/******************************************************************************
+* Destructor
+******************************************************************************/
+AttachWfAuthRespValidate::~AttachWfAuthRespValidate()
+{
+}
+
+/******************************************************************************
+* creates and returns static instance
+******************************************************************************/
+AttachWfAuthRespValidate* AttachWfAuthRespValidate::Instance()
+{
+        static AttachWfAuthRespValidate state;
+        return &state;
+}
+
+/******************************************************************************
+* initializes eventToActionsMap
+******************************************************************************/
+void AttachWfAuthRespValidate::initialize()
+{
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::sec_mode_cmd_to_ue);
+                actionTable.setNextState(AttachWfSecCmp::Instance());
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::AUTH_RESP_SUCCESS, actionTable));
+        }
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::send_air_to_hss);
+                actionTable.setNextState(AttachWfAia::Instance());
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::AUTH_RESP_SYNC_FAILURE, actionTable));
+        }
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::send_auth_reject);
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::AUTH_RESP_FAILURE, actionTable));
+        }
+}
diff --git a/src/mme-app/mmeStates/attachWfCsResp.cpp b/src/mme-app/mmeStates/attachWfCsResp.cpp
new file mode 100644
index 0000000..871c9c8
--- /dev/null
+++ b/src/mme-app/mmeStates/attachWfCsResp.cpp
@@ -0,0 +1,61 @@
+  
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+ 
+/**************************************
+ * attachWfCsResp.cpp
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/SMCodeGen/templates/stateMachineTmpls/state.cpp.tt>
+ **************************************/
+
+#include "smEnumTypes.h"
+#include "actionTable.h"
+#include "actionHandlers/actionHandlers.h"
+
+#include "mmeStates/attachWfCsResp.h"	
+#include "mmeStates/attachWfInitCtxtRespAttCmp.h"
+
+using namespace mme;
+using namespace SM;
+
+/******************************************************************************
+* Constructor
+******************************************************************************/
+AttachWfCsResp::AttachWfCsResp():State(State_e::attach_wf_cs_resp)
+{
+}
+
+/******************************************************************************
+* Destructor
+******************************************************************************/
+AttachWfCsResp::~AttachWfCsResp()
+{
+}
+
+/******************************************************************************
+* creates and returns static instance
+******************************************************************************/
+AttachWfCsResp* AttachWfCsResp::Instance()
+{
+        static AttachWfCsResp state;
+        return &state;
+}
+
+/******************************************************************************
+* initializes eventToActionsMap
+******************************************************************************/
+void AttachWfCsResp::initialize()
+{
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::process_cs_resp);
+                actionTable.addAction(&ActionHandlers::send_init_ctxt_req_to_ue);
+                actionTable.setNextState(AttachWfInitCtxtRespAttCmp::Instance());
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::CS_RESP_FROM_SGW, actionTable));
+        }
+}
diff --git a/src/mme-app/mmeStates/attachWfEsmInfoCheck.cpp b/src/mme-app/mmeStates/attachWfEsmInfoCheck.cpp
new file mode 100644
index 0000000..38c50f1
--- /dev/null
+++ b/src/mme-app/mmeStates/attachWfEsmInfoCheck.cpp
@@ -0,0 +1,67 @@
+  
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+ 
+/**************************************
+ * attachWfEsmInfoCheck.cpp
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/SMCodeGen/templates/stateMachineTmpls/state.cpp.tt>
+ **************************************/
+
+#include "smEnumTypes.h"
+#include "actionTable.h"
+#include "actionHandlers/actionHandlers.h"
+
+#include "mmeStates/attachWfEsmInfoCheck.h"	
+#include "mmeStates/attachWfEsmInfoResp.h"	
+#include "mmeStates/attachWfUla.h"
+
+using namespace mme;
+using namespace SM;
+
+/******************************************************************************
+* Constructor
+******************************************************************************/
+AttachWfEsmInfoCheck::AttachWfEsmInfoCheck():State(State_e::attach_wf_esm_info_check)
+{
+}
+
+/******************************************************************************
+* Destructor
+******************************************************************************/
+AttachWfEsmInfoCheck::~AttachWfEsmInfoCheck()
+{
+}
+
+/******************************************************************************
+* creates and returns static instance
+******************************************************************************/
+AttachWfEsmInfoCheck* AttachWfEsmInfoCheck::Instance()
+{
+        static AttachWfEsmInfoCheck state;
+        return &state;
+}
+
+/******************************************************************************
+* initializes eventToActionsMap
+******************************************************************************/
+void AttachWfEsmInfoCheck::initialize()
+{
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::send_esm_info_req_to_ue);
+                actionTable.setNextState(AttachWfEsmInfoResp::Instance());
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::ESM_INFO_REQUIRED, actionTable));
+        }
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::send_ulr_to_hss);
+                actionTable.setNextState(AttachWfUla::Instance());
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::ESM_INFO_NOT_REQUIRED, actionTable));
+        }
+}
diff --git a/src/mme-app/mmeStates/attachWfEsmInfoResp.cpp b/src/mme-app/mmeStates/attachWfEsmInfoResp.cpp
new file mode 100644
index 0000000..f78af08
--- /dev/null
+++ b/src/mme-app/mmeStates/attachWfEsmInfoResp.cpp
@@ -0,0 +1,61 @@
+  
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+ 
+/**************************************
+ * attachWfEsmInfoResp.cpp
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/SMCodeGen/templates/stateMachineTmpls/state.cpp.tt>
+ **************************************/
+
+#include "smEnumTypes.h"
+#include "actionTable.h"
+#include "actionHandlers/actionHandlers.h"
+
+#include "mmeStates/attachWfEsmInfoResp.h"	
+#include "mmeStates/attachWfUla.h"
+
+using namespace mme;
+using namespace SM;
+
+/******************************************************************************
+* Constructor
+******************************************************************************/
+AttachWfEsmInfoResp::AttachWfEsmInfoResp():State(State_e::attach_wf_esm_info_resp)
+{
+}
+
+/******************************************************************************
+* Destructor
+******************************************************************************/
+AttachWfEsmInfoResp::~AttachWfEsmInfoResp()
+{
+}
+
+/******************************************************************************
+* creates and returns static instance
+******************************************************************************/
+AttachWfEsmInfoResp* AttachWfEsmInfoResp::Instance()
+{
+        static AttachWfEsmInfoResp state;
+        return &state;
+}
+
+/******************************************************************************
+* initializes eventToActionsMap
+******************************************************************************/
+void AttachWfEsmInfoResp::initialize()
+{
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::process_esm_info_resp);
+                actionTable.addAction(&ActionHandlers::send_ulr_to_hss);
+                actionTable.setNextState(AttachWfUla::Instance());
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::ESM_INFO_RESP_FROM_UE, actionTable));
+        }
+}
diff --git a/src/mme-app/mmeStates/attachWfIdentityResponse.cpp b/src/mme-app/mmeStates/attachWfIdentityResponse.cpp
new file mode 100644
index 0000000..93af033
--- /dev/null
+++ b/src/mme-app/mmeStates/attachWfIdentityResponse.cpp
@@ -0,0 +1,61 @@
+  
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+ 
+/**************************************
+ * attachWfIdentityResponse.cpp
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/SMCodeGen/templates/stateMachineTmpls/state.cpp.tt>
+ **************************************/
+
+#include "smEnumTypes.h"
+#include "actionTable.h"
+#include "actionHandlers/actionHandlers.h"
+
+#include "mmeStates/attachWfIdentityResponse.h"	
+#include "mmeStates/attachWfAia.h"
+
+using namespace mme;
+using namespace SM;
+
+/******************************************************************************
+* Constructor
+******************************************************************************/
+AttachWfIdentityResponse::AttachWfIdentityResponse():State(State_e::attach_wf_identity_response)
+{
+}
+
+/******************************************************************************
+* Destructor
+******************************************************************************/
+AttachWfIdentityResponse::~AttachWfIdentityResponse()
+{
+}
+
+/******************************************************************************
+* creates and returns static instance
+******************************************************************************/
+AttachWfIdentityResponse* AttachWfIdentityResponse::Instance()
+{
+        static AttachWfIdentityResponse state;
+        return &state;
+}
+
+/******************************************************************************
+* initializes eventToActionsMap
+******************************************************************************/
+void AttachWfIdentityResponse::initialize()
+{
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::process_identity_response);
+                actionTable.addAction(&ActionHandlers::send_air_to_hss);
+                actionTable.setNextState(AttachWfAia::Instance());
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::IDENTITY_RESPONSE_FROM_UE, actionTable));
+        }
+}
diff --git a/src/mme-app/mmeStates/attachWfImsiValidateAction.cpp b/src/mme-app/mmeStates/attachWfImsiValidateAction.cpp
new file mode 100644
index 0000000..a0d974a
--- /dev/null
+++ b/src/mme-app/mmeStates/attachWfImsiValidateAction.cpp
@@ -0,0 +1,67 @@
+  
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+ 
+/**************************************
+ * attachWfImsiValidateAction.cpp
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/SMCodeGen/templates/stateMachineTmpls/state.cpp.tt>
+ **************************************/
+
+#include "smEnumTypes.h"
+#include "actionTable.h"
+#include "actionHandlers/actionHandlers.h"
+
+#include "mmeStates/attachWfImsiValidateAction.h"	
+#include "mmeStates/attachWfAia.h"	
+#include "mmeStates/attachWfIdentityResponse.h"
+
+using namespace mme;
+using namespace SM;
+
+/******************************************************************************
+* Constructor
+******************************************************************************/
+AttachWfImsiValidateAction::AttachWfImsiValidateAction():State(State_e::attach_wf_imsi_validate_action)
+{
+}
+
+/******************************************************************************
+* Destructor
+******************************************************************************/
+AttachWfImsiValidateAction::~AttachWfImsiValidateAction()
+{
+}
+
+/******************************************************************************
+* creates and returns static instance
+******************************************************************************/
+AttachWfImsiValidateAction* AttachWfImsiValidateAction::Instance()
+{
+        static AttachWfImsiValidateAction state;
+        return &state;
+}
+
+/******************************************************************************
+* initializes eventToActionsMap
+******************************************************************************/
+void AttachWfImsiValidateAction::initialize()
+{
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::send_air_to_hss);
+                actionTable.setNextState(AttachWfAia::Instance());
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::IMSI_VALIDATION_SUCCESS, actionTable));
+        }
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::send_identity_request_to_ue);
+                actionTable.setNextState(AttachWfIdentityResponse::Instance());
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::IMSI_VALIDATION_FAILURE, actionTable));
+        }
+}
diff --git a/src/mme-app/mmeStates/attachWfInitCtxtResp.cpp b/src/mme-app/mmeStates/attachWfInitCtxtResp.cpp
new file mode 100644
index 0000000..879fadb
--- /dev/null
+++ b/src/mme-app/mmeStates/attachWfInitCtxtResp.cpp
@@ -0,0 +1,61 @@
+  
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+ 
+/**************************************
+ * attachWfInitCtxtResp.cpp
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/SMCodeGen/templates/stateMachineTmpls/state.cpp.tt>
+ **************************************/
+
+#include "smEnumTypes.h"
+#include "actionTable.h"
+#include "actionHandlers/actionHandlers.h"
+
+#include "mmeStates/attachWfInitCtxtResp.h"	
+#include "mmeStates/attachWfMbResp.h"
+
+using namespace mme;
+using namespace SM;
+
+/******************************************************************************
+* Constructor
+******************************************************************************/
+AttachWfInitCtxtResp::AttachWfInitCtxtResp():State(State_e::attach_wf_init_ctxt_resp)
+{
+}
+
+/******************************************************************************
+* Destructor
+******************************************************************************/
+AttachWfInitCtxtResp::~AttachWfInitCtxtResp()
+{
+}
+
+/******************************************************************************
+* creates and returns static instance
+******************************************************************************/
+AttachWfInitCtxtResp* AttachWfInitCtxtResp::Instance()
+{
+        static AttachWfInitCtxtResp state;
+        return &state;
+}
+
+/******************************************************************************
+* initializes eventToActionsMap
+******************************************************************************/
+void AttachWfInitCtxtResp::initialize()
+{
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::process_init_ctxt_resp);
+                actionTable.addAction(&ActionHandlers::send_mb_req_to_sgw);
+                actionTable.setNextState(AttachWfMbResp::Instance());
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::INIT_CTXT_RESP_FROM_UE, actionTable));
+        }
+}
diff --git a/src/mme-app/mmeStates/attachWfInitCtxtRespAttCmp.cpp b/src/mme-app/mmeStates/attachWfInitCtxtRespAttCmp.cpp
new file mode 100644
index 0000000..5f7e404
--- /dev/null
+++ b/src/mme-app/mmeStates/attachWfInitCtxtRespAttCmp.cpp
@@ -0,0 +1,67 @@
+  
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+ 
+/**************************************
+ * attachWfInitCtxtRespAttCmp.cpp
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/SMCodeGen/templates/stateMachineTmpls/state.cpp.tt>
+ **************************************/
+
+#include "smEnumTypes.h"
+#include "actionTable.h"
+#include "actionHandlers/actionHandlers.h"
+
+#include "mmeStates/attachWfInitCtxtRespAttCmp.h"	
+#include "mmeStates/attachWfAttCmp.h"	
+#include "mmeStates/attachWfInitCtxtResp.h"
+
+using namespace mme;
+using namespace SM;
+
+/******************************************************************************
+* Constructor
+******************************************************************************/
+AttachWfInitCtxtRespAttCmp::AttachWfInitCtxtRespAttCmp():State(State_e::attach_wf_init_ctxt_resp_att_cmp)
+{
+}
+
+/******************************************************************************
+* Destructor
+******************************************************************************/
+AttachWfInitCtxtRespAttCmp::~AttachWfInitCtxtRespAttCmp()
+{
+}
+
+/******************************************************************************
+* creates and returns static instance
+******************************************************************************/
+AttachWfInitCtxtRespAttCmp* AttachWfInitCtxtRespAttCmp::Instance()
+{
+        static AttachWfInitCtxtRespAttCmp state;
+        return &state;
+}
+
+/******************************************************************************
+* initializes eventToActionsMap
+******************************************************************************/
+void AttachWfInitCtxtRespAttCmp::initialize()
+{
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::process_init_ctxt_resp);
+                actionTable.setNextState(AttachWfAttCmp::Instance());
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::INIT_CTXT_RESP_FROM_UE, actionTable));
+        }
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::process_attach_cmp_from_ue);
+                actionTable.setNextState(AttachWfInitCtxtResp::Instance());
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::ATT_CMP_FROM_UE, actionTable));
+        }
+}
diff --git a/src/mme-app/mmeStates/attachWfMbResp.cpp b/src/mme-app/mmeStates/attachWfMbResp.cpp
new file mode 100644
index 0000000..d2fb134
--- /dev/null
+++ b/src/mme-app/mmeStates/attachWfMbResp.cpp
@@ -0,0 +1,59 @@
+  
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+ 
+/**************************************
+ * attachWfMbResp.cpp
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/SMCodeGen/templates/stateMachineTmpls/state.cpp.tt>
+ **************************************/
+
+#include "smEnumTypes.h"
+#include "actionTable.h"
+#include "actionHandlers/actionHandlers.h"
+
+#include "mmeStates/attachWfMbResp.h"
+
+using namespace mme;
+using namespace SM;
+
+/******************************************************************************
+* Constructor
+******************************************************************************/
+AttachWfMbResp::AttachWfMbResp():State(State_e::attach_wf_mb_resp)
+{
+}
+
+/******************************************************************************
+* Destructor
+******************************************************************************/
+AttachWfMbResp::~AttachWfMbResp()
+{
+}
+
+/******************************************************************************
+* creates and returns static instance
+******************************************************************************/
+AttachWfMbResp* AttachWfMbResp::Instance()
+{
+        static AttachWfMbResp state;
+        return &state;
+}
+
+/******************************************************************************
+* initializes eventToActionsMap
+******************************************************************************/
+void AttachWfMbResp::initialize()
+{
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::process_mb_resp);
+                actionTable.addAction(&ActionHandlers::attach_done);
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::MB_RESP_FROM_SGW, actionTable));
+        }
+}
diff --git a/src/mme-app/mmeStates/attachWfSecCmp.cpp b/src/mme-app/mmeStates/attachWfSecCmp.cpp
new file mode 100644
index 0000000..dccd562
--- /dev/null
+++ b/src/mme-app/mmeStates/attachWfSecCmp.cpp
@@ -0,0 +1,61 @@
+  
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+ 
+/**************************************
+ * attachWfSecCmp.cpp
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/SMCodeGen/templates/stateMachineTmpls/state.cpp.tt>
+ **************************************/
+
+#include "smEnumTypes.h"
+#include "actionTable.h"
+#include "actionHandlers/actionHandlers.h"
+
+#include "mmeStates/attachWfSecCmp.h"	
+#include "mmeStates/attachWfEsmInfoCheck.h"
+
+using namespace mme;
+using namespace SM;
+
+/******************************************************************************
+* Constructor
+******************************************************************************/
+AttachWfSecCmp::AttachWfSecCmp():State(State_e::attach_wf_sec_cmp)
+{
+}
+
+/******************************************************************************
+* Destructor
+******************************************************************************/
+AttachWfSecCmp::~AttachWfSecCmp()
+{
+}
+
+/******************************************************************************
+* creates and returns static instance
+******************************************************************************/
+AttachWfSecCmp* AttachWfSecCmp::Instance()
+{
+        static AttachWfSecCmp state;
+        return &state;
+}
+
+/******************************************************************************
+* initializes eventToActionsMap
+******************************************************************************/
+void AttachWfSecCmp::initialize()
+{
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::process_sec_mode_resp);
+                actionTable.addAction(&ActionHandlers::check_esm_info_req_required);
+                actionTable.setNextState(AttachWfEsmInfoCheck::Instance());
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::SEC_MODE_RESP_FROM_UE, actionTable));
+        }
+}
diff --git a/src/mme-app/mmeStates/attachWfUla.cpp b/src/mme-app/mmeStates/attachWfUla.cpp
new file mode 100644
index 0000000..eea1a8b
--- /dev/null
+++ b/src/mme-app/mmeStates/attachWfUla.cpp
@@ -0,0 +1,61 @@
+  
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+ 
+/**************************************
+ * attachWfUla.cpp
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/SMCodeGen/templates/stateMachineTmpls/state.cpp.tt>
+ **************************************/
+
+#include "smEnumTypes.h"
+#include "actionTable.h"
+#include "actionHandlers/actionHandlers.h"
+
+#include "mmeStates/attachWfUla.h"	
+#include "mmeStates/attachWfCsResp.h"
+
+using namespace mme;
+using namespace SM;
+
+/******************************************************************************
+* Constructor
+******************************************************************************/
+AttachWfUla::AttachWfUla():State(State_e::attach_wf_ula)
+{
+}
+
+/******************************************************************************
+* Destructor
+******************************************************************************/
+AttachWfUla::~AttachWfUla()
+{
+}
+
+/******************************************************************************
+* creates and returns static instance
+******************************************************************************/
+AttachWfUla* AttachWfUla::Instance()
+{
+        static AttachWfUla state;
+        return &state;
+}
+
+/******************************************************************************
+* initializes eventToActionsMap
+******************************************************************************/
+void AttachWfUla::initialize()
+{
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::process_ula);
+                actionTable.addAction(&ActionHandlers::cs_req_to_sgw);
+                actionTable.setNextState(AttachWfCsResp::Instance());
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::ULA_FROM_HSS, actionTable));
+        }
+}
diff --git a/src/mme-app/mmeStates/defaultMmeState.cpp b/src/mme-app/mmeStates/defaultMmeState.cpp
new file mode 100644
index 0000000..dcc9e14
--- /dev/null
+++ b/src/mme-app/mmeStates/defaultMmeState.cpp
@@ -0,0 +1,88 @@
+  
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+ 
+/**************************************
+ * defaultMmeState.cpp
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/SMCodeGen/templates/stateMachineTmpls/state.cpp.tt>
+ **************************************/
+
+#include "smEnumTypes.h"
+#include "actionTable.h"
+#include "actionHandlers/actionHandlers.h"
+
+#include "mmeStates/defaultMmeState.h"
+
+using namespace mme;
+using namespace SM;
+
+/******************************************************************************
+* Constructor
+******************************************************************************/
+DefaultMmeState::DefaultMmeState():State(State_e::default_mme_state)
+{
+}
+
+/******************************************************************************
+* Destructor
+******************************************************************************/
+DefaultMmeState::~DefaultMmeState()
+{
+}
+
+/******************************************************************************
+* creates and returns static instance
+******************************************************************************/
+DefaultMmeState* DefaultMmeState::Instance()
+{
+        static DefaultMmeState state;
+        return &state;
+}
+
+/******************************************************************************
+* initializes eventToActionsMap
+******************************************************************************/
+void DefaultMmeState::initialize()
+{
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::default_attach_req_handler);
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::ATTACH_REQ_FROM_UE, actionTable));
+        }
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::default_detach_req_handler);
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::DETACH_REQ_FROM_UE, actionTable));
+        }
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::default_s1_release_req_handler);
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::S1_REL_REQ_FROM_UE, actionTable));
+        }
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::default_ddn_handler);
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::DDN_FROM_SGW, actionTable));
+        }
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::default_service_req_handler);
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::SERVICE_REQUEST_FROM_UE, actionTable));
+        }
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::default_cancel_loc_req_handler);
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::CLR_FROM_HSS, actionTable));
+        }
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::default_tau_req_handler);
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::TAU_REQUEST_FROM_UE, actionTable));
+        }
+}
diff --git a/src/mme-app/mmeStates/detachStart.cpp b/src/mme-app/mmeStates/detachStart.cpp
new file mode 100644
index 0000000..4381f9d
--- /dev/null
+++ b/src/mme-app/mmeStates/detachStart.cpp
@@ -0,0 +1,60 @@
+  
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+ 
+/**************************************
+ * detachStart.cpp
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/SMCodeGen/templates/stateMachineTmpls/state.cpp.tt>
+ **************************************/
+
+#include "smEnumTypes.h"
+#include "actionTable.h"
+#include "actionHandlers/actionHandlers.h"
+
+#include "mmeStates/detachStart.h"	
+#include "mmeStates/detachWfDelSessionResp.h"
+
+using namespace mme;
+using namespace SM;
+
+/******************************************************************************
+* Constructor
+******************************************************************************/
+DetachStart::DetachStart():State(State_e::detach_start)
+{
+}
+
+/******************************************************************************
+* Destructor
+******************************************************************************/
+DetachStart::~DetachStart()
+{
+}
+
+/******************************************************************************
+* creates and returns static instance
+******************************************************************************/
+DetachStart* DetachStart::Instance()
+{
+        static DetachStart state;
+        return &state;
+}
+
+/******************************************************************************
+* initializes eventToActionsMap
+******************************************************************************/
+void DetachStart::initialize()
+{
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::del_session_req);
+                actionTable.setNextState(DetachWfDelSessionResp::Instance());
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::DETACH_REQ_FROM_UE, actionTable));
+        }
+}
diff --git a/src/mme-app/mmeStates/detachWfDelSessionResp.cpp b/src/mme-app/mmeStates/detachWfDelSessionResp.cpp
new file mode 100644
index 0000000..a10f6a7
--- /dev/null
+++ b/src/mme-app/mmeStates/detachWfDelSessionResp.cpp
@@ -0,0 +1,59 @@
+  
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+ 
+/**************************************
+ * detachWfDelSessionResp.cpp
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/SMCodeGen/templates/stateMachineTmpls/state.cpp.tt>
+ **************************************/
+
+#include "smEnumTypes.h"
+#include "actionTable.h"
+#include "actionHandlers/actionHandlers.h"
+
+#include "mmeStates/detachWfDelSessionResp.h"
+
+using namespace mme;
+using namespace SM;
+
+/******************************************************************************
+* Constructor
+******************************************************************************/
+DetachWfDelSessionResp::DetachWfDelSessionResp():State(State_e::detach_wf_del_session_resp)
+{
+}
+
+/******************************************************************************
+* Destructor
+******************************************************************************/
+DetachWfDelSessionResp::~DetachWfDelSessionResp()
+{
+}
+
+/******************************************************************************
+* creates and returns static instance
+******************************************************************************/
+DetachWfDelSessionResp* DetachWfDelSessionResp::Instance()
+{
+        static DetachWfDelSessionResp state;
+        return &state;
+}
+
+/******************************************************************************
+* initializes eventToActionsMap
+******************************************************************************/
+void DetachWfDelSessionResp::initialize()
+{
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::process_del_session_resp);
+                actionTable.addAction(&ActionHandlers::detach_accept_to_ue);
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::DEL_SESSION_RESP_FROM_SGW, actionTable));
+        }
+}
diff --git a/src/mme-app/mmeStates/niDetachStart.cpp b/src/mme-app/mmeStates/niDetachStart.cpp
new file mode 100644
index 0000000..7f16581
--- /dev/null
+++ b/src/mme-app/mmeStates/niDetachStart.cpp
@@ -0,0 +1,61 @@
+  
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+ 
+/**************************************
+ * niDetachStart.cpp
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/SMCodeGen/templates/stateMachineTmpls/state.cpp.tt>
+ **************************************/
+
+#include "smEnumTypes.h"
+#include "actionTable.h"
+#include "actionHandlers/actionHandlers.h"
+
+#include "mmeStates/niDetachStart.h"	
+#include "mmeStates/niDetachWfDetAccptDelSessResp.h"
+
+using namespace mme;
+using namespace SM;
+
+/******************************************************************************
+* Constructor
+******************************************************************************/
+NiDetachStart::NiDetachStart():State(State_e::ni_detach_start)
+{
+}
+
+/******************************************************************************
+* Destructor
+******************************************************************************/
+NiDetachStart::~NiDetachStart()
+{
+}
+
+/******************************************************************************
+* creates and returns static instance
+******************************************************************************/
+NiDetachStart* NiDetachStart::Instance()
+{
+        static NiDetachStart state;
+        return &state;
+}
+
+/******************************************************************************
+* initializes eventToActionsMap
+******************************************************************************/
+void NiDetachStart::initialize()
+{
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::ni_detach_req_to_ue);
+                actionTable.addAction(&ActionHandlers::del_session_req);
+                actionTable.setNextState(NiDetachWfDetAccptDelSessResp::Instance());
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::CLR_FROM_HSS, actionTable));
+        }
+}
diff --git a/src/mme-app/mmeStates/niDetachWfDelSessResp.cpp b/src/mme-app/mmeStates/niDetachWfDelSessResp.cpp
new file mode 100644
index 0000000..5d7dd12
--- /dev/null
+++ b/src/mme-app/mmeStates/niDetachWfDelSessResp.cpp
@@ -0,0 +1,61 @@
+  
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+ 
+/**************************************
+ * niDetachWfDelSessResp.cpp
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/SMCodeGen/templates/stateMachineTmpls/state.cpp.tt>
+ **************************************/
+
+#include "smEnumTypes.h"
+#include "actionTable.h"
+#include "actionHandlers/actionHandlers.h"
+
+#include "mmeStates/niDetachWfDelSessResp.h"	
+#include "mmeStates/niDetachWfS1RelComp.h"
+
+using namespace mme;
+using namespace SM;
+
+/******************************************************************************
+* Constructor
+******************************************************************************/
+NiDetachWfDelSessResp::NiDetachWfDelSessResp():State(State_e::ni_detach_wf_del_sess_resp)
+{
+}
+
+/******************************************************************************
+* Destructor
+******************************************************************************/
+NiDetachWfDelSessResp::~NiDetachWfDelSessResp()
+{
+}
+
+/******************************************************************************
+* creates and returns static instance
+******************************************************************************/
+NiDetachWfDelSessResp* NiDetachWfDelSessResp::Instance()
+{
+        static NiDetachWfDelSessResp state;
+        return &state;
+}
+
+/******************************************************************************
+* initializes eventToActionsMap
+******************************************************************************/
+void NiDetachWfDelSessResp::initialize()
+{
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::process_del_session_resp);
+                actionTable.addAction(&ActionHandlers::send_s1_rel_cmd_to_ue);
+                actionTable.setNextState(NiDetachWfS1RelComp::Instance());
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::DEL_SESSION_RESP_FROM_SGW, actionTable));
+        }
+}
diff --git a/src/mme-app/mmeStates/niDetachWfDetAccptDelSessResp.cpp b/src/mme-app/mmeStates/niDetachWfDetAccptDelSessResp.cpp
new file mode 100644
index 0000000..a6d76b3
--- /dev/null
+++ b/src/mme-app/mmeStates/niDetachWfDetAccptDelSessResp.cpp
@@ -0,0 +1,67 @@
+  
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+ 
+/**************************************
+ * niDetachWfDetAccptDelSessResp.cpp
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/SMCodeGen/templates/stateMachineTmpls/state.cpp.tt>
+ **************************************/
+
+#include "smEnumTypes.h"
+#include "actionTable.h"
+#include "actionHandlers/actionHandlers.h"
+
+#include "mmeStates/niDetachWfDetAccptDelSessResp.h"	
+#include "mmeStates/niDetachWfDelSessResp.h"	
+#include "mmeStates/niDetachWfDetachAccept.h"
+
+using namespace mme;
+using namespace SM;
+
+/******************************************************************************
+* Constructor
+******************************************************************************/
+NiDetachWfDetAccptDelSessResp::NiDetachWfDetAccptDelSessResp():State(State_e::ni_detach_wf_det_accpt_del_sess_resp)
+{
+}
+
+/******************************************************************************
+* Destructor
+******************************************************************************/
+NiDetachWfDetAccptDelSessResp::~NiDetachWfDetAccptDelSessResp()
+{
+}
+
+/******************************************************************************
+* creates and returns static instance
+******************************************************************************/
+NiDetachWfDetAccptDelSessResp* NiDetachWfDetAccptDelSessResp::Instance()
+{
+        static NiDetachWfDetAccptDelSessResp state;
+        return &state;
+}
+
+/******************************************************************************
+* initializes eventToActionsMap
+******************************************************************************/
+void NiDetachWfDetAccptDelSessResp::initialize()
+{
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::process_detach_accept_from_ue);
+                actionTable.setNextState(NiDetachWfDelSessResp::Instance());
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::DETACH_ACCEPT_FROM_UE, actionTable));
+        }
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::process_del_session_resp);
+                actionTable.setNextState(NiDetachWfDetachAccept::Instance());
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::DEL_SESSION_RESP_FROM_SGW, actionTable));
+        }
+}
diff --git a/src/mme-app/mmeStates/niDetachWfDetachAccept.cpp b/src/mme-app/mmeStates/niDetachWfDetachAccept.cpp
new file mode 100644
index 0000000..476a107
--- /dev/null
+++ b/src/mme-app/mmeStates/niDetachWfDetachAccept.cpp
@@ -0,0 +1,61 @@
+  
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+ 
+/**************************************
+ * niDetachWfDetachAccept.cpp
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/SMCodeGen/templates/stateMachineTmpls/state.cpp.tt>
+ **************************************/
+
+#include "smEnumTypes.h"
+#include "actionTable.h"
+#include "actionHandlers/actionHandlers.h"
+
+#include "mmeStates/niDetachWfDetachAccept.h"	
+#include "mmeStates/niDetachWfS1RelComp.h"
+
+using namespace mme;
+using namespace SM;
+
+/******************************************************************************
+* Constructor
+******************************************************************************/
+NiDetachWfDetachAccept::NiDetachWfDetachAccept():State(State_e::ni_detach_wf_detach_accept)
+{
+}
+
+/******************************************************************************
+* Destructor
+******************************************************************************/
+NiDetachWfDetachAccept::~NiDetachWfDetachAccept()
+{
+}
+
+/******************************************************************************
+* creates and returns static instance
+******************************************************************************/
+NiDetachWfDetachAccept* NiDetachWfDetachAccept::Instance()
+{
+        static NiDetachWfDetachAccept state;
+        return &state;
+}
+
+/******************************************************************************
+* initializes eventToActionsMap
+******************************************************************************/
+void NiDetachWfDetachAccept::initialize()
+{
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::process_detach_accept_from_ue);
+                actionTable.addAction(&ActionHandlers::send_s1_rel_cmd_to_ue_for_detach);
+                actionTable.setNextState(NiDetachWfS1RelComp::Instance());
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::DETACH_ACCEPT_FROM_UE, actionTable));
+        }
+}
diff --git a/src/mme-app/mmeStates/niDetachWfS1RelComp.cpp b/src/mme-app/mmeStates/niDetachWfS1RelComp.cpp
new file mode 100644
index 0000000..d9b9b11
--- /dev/null
+++ b/src/mme-app/mmeStates/niDetachWfS1RelComp.cpp
@@ -0,0 +1,58 @@
+  
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+ 
+/**************************************
+ * niDetachWfS1RelComp.cpp
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/SMCodeGen/templates/stateMachineTmpls/state.cpp.tt>
+ **************************************/
+
+#include "smEnumTypes.h"
+#include "actionTable.h"
+#include "actionHandlers/actionHandlers.h"
+
+#include "mmeStates/niDetachWfS1RelComp.h"
+
+using namespace mme;
+using namespace SM;
+
+/******************************************************************************
+* Constructor
+******************************************************************************/
+NiDetachWfS1RelComp::NiDetachWfS1RelComp():State(State_e::ni_detach_wf_s1_rel_comp)
+{
+}
+
+/******************************************************************************
+* Destructor
+******************************************************************************/
+NiDetachWfS1RelComp::~NiDetachWfS1RelComp()
+{
+}
+
+/******************************************************************************
+* creates and returns static instance
+******************************************************************************/
+NiDetachWfS1RelComp* NiDetachWfS1RelComp::Instance()
+{
+        static NiDetachWfS1RelComp state;
+        return &state;
+}
+
+/******************************************************************************
+* initializes eventToActionsMap
+******************************************************************************/
+void NiDetachWfS1RelComp::initialize()
+{
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::process_ue_ctxt_rel_comp_for_detach);
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::UE_CTXT_REL_COMP_FROM_ENB, actionTable));
+        }
+}
diff --git a/src/mme-app/mmeStates/pagingStart.cpp b/src/mme-app/mmeStates/pagingStart.cpp
new file mode 100644
index 0000000..d4d1946
--- /dev/null
+++ b/src/mme-app/mmeStates/pagingStart.cpp
@@ -0,0 +1,60 @@
+  
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+ 
+/**************************************
+ * pagingStart.cpp
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/SMCodeGen/templates/stateMachineTmpls/state.cpp.tt>
+ **************************************/
+
+#include "smEnumTypes.h"
+#include "actionTable.h"
+#include "actionHandlers/actionHandlers.h"
+
+#include "mmeStates/pagingStart.h"	
+#include "mmeStates/pagingWfServiceReq.h"
+
+using namespace mme;
+using namespace SM;
+
+/******************************************************************************
+* Constructor
+******************************************************************************/
+PagingStart::PagingStart():State(State_e::paging_start)
+{
+}
+
+/******************************************************************************
+* Destructor
+******************************************************************************/
+PagingStart::~PagingStart()
+{
+}
+
+/******************************************************************************
+* creates and returns static instance
+******************************************************************************/
+PagingStart* PagingStart::Instance()
+{
+        static PagingStart state;
+        return &state;
+}
+
+/******************************************************************************
+* initializes eventToActionsMap
+******************************************************************************/
+void PagingStart::initialize()
+{
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::send_paging_req_to_ue);
+                actionTable.setNextState(PagingWfServiceReq::Instance());
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::DDN_FROM_SGW, actionTable));
+        }
+}
diff --git a/src/mme-app/mmeStates/pagingWfServiceReq.cpp b/src/mme-app/mmeStates/pagingWfServiceReq.cpp
new file mode 100644
index 0000000..fcc77e4
--- /dev/null
+++ b/src/mme-app/mmeStates/pagingWfServiceReq.cpp
@@ -0,0 +1,62 @@
+  
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+ 
+/**************************************
+ * pagingWfServiceReq.cpp
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/SMCodeGen/templates/stateMachineTmpls/state.cpp.tt>
+ **************************************/
+
+#include "smEnumTypes.h"
+#include "actionTable.h"
+#include "actionHandlers/actionHandlers.h"
+
+#include "mmeStates/pagingWfServiceReq.h"	
+#include "mmeStates/serviceRequestWfAuthAndSecCheckCmp.h"
+
+using namespace mme;
+using namespace SM;
+
+/******************************************************************************
+* Constructor
+******************************************************************************/
+PagingWfServiceReq::PagingWfServiceReq():State(State_e::paging_wf_service_req)
+{
+}
+
+/******************************************************************************
+* Destructor
+******************************************************************************/
+PagingWfServiceReq::~PagingWfServiceReq()
+{
+}
+
+/******************************************************************************
+* creates and returns static instance
+******************************************************************************/
+PagingWfServiceReq* PagingWfServiceReq::Instance()
+{
+        static PagingWfServiceReq state;
+        return &state;
+}
+
+/******************************************************************************
+* initializes eventToActionsMap
+******************************************************************************/
+void PagingWfServiceReq::initialize()
+{
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::process_service_request);
+                actionTable.addAction(&ActionHandlers::send_ddn_ack_to_sgw);
+                actionTable.addAction(&ActionHandlers::perform_auth_and_sec_check);
+                actionTable.setNextState(ServiceRequestWfAuthAndSecCheckCmp::Instance());
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::SERVICE_REQUEST_FROM_UE, actionTable));
+        }
+}
diff --git a/src/mme-app/mmeStates/s1ReleaseStart.cpp b/src/mme-app/mmeStates/s1ReleaseStart.cpp
new file mode 100644
index 0000000..41fd266
--- /dev/null
+++ b/src/mme-app/mmeStates/s1ReleaseStart.cpp
@@ -0,0 +1,60 @@
+  
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+ 
+/**************************************
+ * s1ReleaseStart.cpp
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/SMCodeGen/templates/stateMachineTmpls/state.cpp.tt>
+ **************************************/
+
+#include "smEnumTypes.h"
+#include "actionTable.h"
+#include "actionHandlers/actionHandlers.h"
+
+#include "mmeStates/s1ReleaseStart.h"	
+#include "mmeStates/s1ReleaseWfReleaseAccessBearerResp.h"
+
+using namespace mme;
+using namespace SM;
+
+/******************************************************************************
+* Constructor
+******************************************************************************/
+S1ReleaseStart::S1ReleaseStart():State(State_e::s1_release_start)
+{
+}
+
+/******************************************************************************
+* Destructor
+******************************************************************************/
+S1ReleaseStart::~S1ReleaseStart()
+{
+}
+
+/******************************************************************************
+* creates and returns static instance
+******************************************************************************/
+S1ReleaseStart* S1ReleaseStart::Instance()
+{
+        static S1ReleaseStart state;
+        return &state;
+}
+
+/******************************************************************************
+* initializes eventToActionsMap
+******************************************************************************/
+void S1ReleaseStart::initialize()
+{
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::send_rel_ab_req_to_sgw);
+                actionTable.setNextState(S1ReleaseWfReleaseAccessBearerResp::Instance());
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::S1_REL_REQ_FROM_UE, actionTable));
+        }
+}
diff --git a/src/mme-app/mmeStates/s1ReleaseWfReleaseAccessBearerResp.cpp b/src/mme-app/mmeStates/s1ReleaseWfReleaseAccessBearerResp.cpp
new file mode 100644
index 0000000..917c74d
--- /dev/null
+++ b/src/mme-app/mmeStates/s1ReleaseWfReleaseAccessBearerResp.cpp
@@ -0,0 +1,61 @@
+  
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+ 
+/**************************************
+ * s1ReleaseWfReleaseAccessBearerResp.cpp
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/SMCodeGen/templates/stateMachineTmpls/state.cpp.tt>
+ **************************************/
+
+#include "smEnumTypes.h"
+#include "actionTable.h"
+#include "actionHandlers/actionHandlers.h"
+
+#include "mmeStates/s1ReleaseWfReleaseAccessBearerResp.h"	
+#include "mmeStates/s1ReleaseWfUeCtxtReleaseComp.h"
+
+using namespace mme;
+using namespace SM;
+
+/******************************************************************************
+* Constructor
+******************************************************************************/
+S1ReleaseWfReleaseAccessBearerResp::S1ReleaseWfReleaseAccessBearerResp():State(State_e::s1_release_wf_release_access_bearer_resp)
+{
+}
+
+/******************************************************************************
+* Destructor
+******************************************************************************/
+S1ReleaseWfReleaseAccessBearerResp::~S1ReleaseWfReleaseAccessBearerResp()
+{
+}
+
+/******************************************************************************
+* creates and returns static instance
+******************************************************************************/
+S1ReleaseWfReleaseAccessBearerResp* S1ReleaseWfReleaseAccessBearerResp::Instance()
+{
+        static S1ReleaseWfReleaseAccessBearerResp state;
+        return &state;
+}
+
+/******************************************************************************
+* initializes eventToActionsMap
+******************************************************************************/
+void S1ReleaseWfReleaseAccessBearerResp::initialize()
+{
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::process_rel_ab_resp_from_sgw);
+                actionTable.addAction(&ActionHandlers::send_s1_rel_cmd_to_ue);
+                actionTable.setNextState(S1ReleaseWfUeCtxtReleaseComp::Instance());
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::REL_AB_RESP_FROM_SGW, actionTable));
+        }
+}
diff --git a/src/mme-app/mmeStates/s1ReleaseWfUeCtxtReleaseComp.cpp b/src/mme-app/mmeStates/s1ReleaseWfUeCtxtReleaseComp.cpp
new file mode 100644
index 0000000..a354290
--- /dev/null
+++ b/src/mme-app/mmeStates/s1ReleaseWfUeCtxtReleaseComp.cpp
@@ -0,0 +1,58 @@
+  
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+ 
+/**************************************
+ * s1ReleaseWfUeCtxtReleaseComp.cpp
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/SMCodeGen/templates/stateMachineTmpls/state.cpp.tt>
+ **************************************/
+
+#include "smEnumTypes.h"
+#include "actionTable.h"
+#include "actionHandlers/actionHandlers.h"
+
+#include "mmeStates/s1ReleaseWfUeCtxtReleaseComp.h"
+
+using namespace mme;
+using namespace SM;
+
+/******************************************************************************
+* Constructor
+******************************************************************************/
+S1ReleaseWfUeCtxtReleaseComp::S1ReleaseWfUeCtxtReleaseComp():State(State_e::s1_release_wf_ue_ctxt_release_comp)
+{
+}
+
+/******************************************************************************
+* Destructor
+******************************************************************************/
+S1ReleaseWfUeCtxtReleaseComp::~S1ReleaseWfUeCtxtReleaseComp()
+{
+}
+
+/******************************************************************************
+* creates and returns static instance
+******************************************************************************/
+S1ReleaseWfUeCtxtReleaseComp* S1ReleaseWfUeCtxtReleaseComp::Instance()
+{
+        static S1ReleaseWfUeCtxtReleaseComp state;
+        return &state;
+}
+
+/******************************************************************************
+* initializes eventToActionsMap
+******************************************************************************/
+void S1ReleaseWfUeCtxtReleaseComp::initialize()
+{
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::process_ue_ctxt_rel_comp);
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::UE_CTXT_REL_COMP_FROM_ENB, actionTable));
+        }
+}
diff --git a/src/mme-app/mmeStates/serviceRequestStart.cpp b/src/mme-app/mmeStates/serviceRequestStart.cpp
new file mode 100644
index 0000000..795a067
--- /dev/null
+++ b/src/mme-app/mmeStates/serviceRequestStart.cpp
@@ -0,0 +1,61 @@
+  
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+ 
+/**************************************
+ * serviceRequestStart.cpp
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/SMCodeGen/templates/stateMachineTmpls/state.cpp.tt>
+ **************************************/
+
+#include "smEnumTypes.h"
+#include "actionTable.h"
+#include "actionHandlers/actionHandlers.h"
+
+#include "mmeStates/serviceRequestStart.h"	
+#include "mmeStates/serviceRequestWfAuthAndSecCheckCmp.h"
+
+using namespace mme;
+using namespace SM;
+
+/******************************************************************************
+* Constructor
+******************************************************************************/
+ServiceRequestStart::ServiceRequestStart():State(State_e::service_request_start)
+{
+}
+
+/******************************************************************************
+* Destructor
+******************************************************************************/
+ServiceRequestStart::~ServiceRequestStart()
+{
+}
+
+/******************************************************************************
+* creates and returns static instance
+******************************************************************************/
+ServiceRequestStart* ServiceRequestStart::Instance()
+{
+        static ServiceRequestStart state;
+        return &state;
+}
+
+/******************************************************************************
+* initializes eventToActionsMap
+******************************************************************************/
+void ServiceRequestStart::initialize()
+{
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::process_service_request);
+                actionTable.addAction(&ActionHandlers::perform_auth_and_sec_check);
+                actionTable.setNextState(ServiceRequestWfAuthAndSecCheckCmp::Instance());
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::SERVICE_REQUEST_FROM_UE, actionTable));
+        }
+}
diff --git a/src/mme-app/mmeStates/serviceRequestWfAuthAndSecCheckCmp.cpp b/src/mme-app/mmeStates/serviceRequestWfAuthAndSecCheckCmp.cpp
new file mode 100644
index 0000000..3b63005
--- /dev/null
+++ b/src/mme-app/mmeStates/serviceRequestWfAuthAndSecCheckCmp.cpp
@@ -0,0 +1,60 @@
+  
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+ 
+/**************************************
+ * serviceRequestWfAuthAndSecCheckCmp.cpp
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/SMCodeGen/templates/stateMachineTmpls/state.cpp.tt>
+ **************************************/
+
+#include "smEnumTypes.h"
+#include "actionTable.h"
+#include "actionHandlers/actionHandlers.h"
+
+#include "mmeStates/serviceRequestWfAuthAndSecCheckCmp.h"	
+#include "mmeStates/serviceRequestWfInitCtxtResp.h"
+
+using namespace mme;
+using namespace SM;
+
+/******************************************************************************
+* Constructor
+******************************************************************************/
+ServiceRequestWfAuthAndSecCheckCmp::ServiceRequestWfAuthAndSecCheckCmp():State(State_e::service_request_wf_auth_and_sec_check_cmp)
+{
+}
+
+/******************************************************************************
+* Destructor
+******************************************************************************/
+ServiceRequestWfAuthAndSecCheckCmp::~ServiceRequestWfAuthAndSecCheckCmp()
+{
+}
+
+/******************************************************************************
+* creates and returns static instance
+******************************************************************************/
+ServiceRequestWfAuthAndSecCheckCmp* ServiceRequestWfAuthAndSecCheckCmp::Instance()
+{
+        static ServiceRequestWfAuthAndSecCheckCmp state;
+        return &state;
+}
+
+/******************************************************************************
+* initializes eventToActionsMap
+******************************************************************************/
+void ServiceRequestWfAuthAndSecCheckCmp::initialize()
+{
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::send_init_ctxt_req_to_ue_svc_req);
+                actionTable.setNextState(ServiceRequestWfInitCtxtResp::Instance());
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::AUTH_AND_SEC_CHECK_COMPLETE, actionTable));
+        }
+}
diff --git a/src/mme-app/mmeStates/serviceRequestWfInitCtxtResp.cpp b/src/mme-app/mmeStates/serviceRequestWfInitCtxtResp.cpp
new file mode 100644
index 0000000..7fb820f
--- /dev/null
+++ b/src/mme-app/mmeStates/serviceRequestWfInitCtxtResp.cpp
@@ -0,0 +1,61 @@
+  
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+ 
+/**************************************
+ * serviceRequestWfInitCtxtResp.cpp
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/SMCodeGen/templates/stateMachineTmpls/state.cpp.tt>
+ **************************************/
+
+#include "smEnumTypes.h"
+#include "actionTable.h"
+#include "actionHandlers/actionHandlers.h"
+
+#include "mmeStates/serviceRequestWfInitCtxtResp.h"	
+#include "mmeStates/serviceRequestWfMbResp.h"
+
+using namespace mme;
+using namespace SM;
+
+/******************************************************************************
+* Constructor
+******************************************************************************/
+ServiceRequestWfInitCtxtResp::ServiceRequestWfInitCtxtResp():State(State_e::service_request_wf_init_ctxt_resp)
+{
+}
+
+/******************************************************************************
+* Destructor
+******************************************************************************/
+ServiceRequestWfInitCtxtResp::~ServiceRequestWfInitCtxtResp()
+{
+}
+
+/******************************************************************************
+* creates and returns static instance
+******************************************************************************/
+ServiceRequestWfInitCtxtResp* ServiceRequestWfInitCtxtResp::Instance()
+{
+        static ServiceRequestWfInitCtxtResp state;
+        return &state;
+}
+
+/******************************************************************************
+* initializes eventToActionsMap
+******************************************************************************/
+void ServiceRequestWfInitCtxtResp::initialize()
+{
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::process_init_ctxt_resp_svc_req);
+                actionTable.addAction(&ActionHandlers::send_mb_req_to_sgw_svc_req);
+                actionTable.setNextState(ServiceRequestWfMbResp::Instance());
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::INIT_CTXT_RESP_FROM_UE, actionTable));
+        }
+}
diff --git a/src/mme-app/mmeStates/serviceRequestWfMbResp.cpp b/src/mme-app/mmeStates/serviceRequestWfMbResp.cpp
new file mode 100644
index 0000000..2fc89aa
--- /dev/null
+++ b/src/mme-app/mmeStates/serviceRequestWfMbResp.cpp
@@ -0,0 +1,58 @@
+  
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+ 
+/**************************************
+ * serviceRequestWfMbResp.cpp
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/SMCodeGen/templates/stateMachineTmpls/state.cpp.tt>
+ **************************************/
+
+#include "smEnumTypes.h"
+#include "actionTable.h"
+#include "actionHandlers/actionHandlers.h"
+
+#include "mmeStates/serviceRequestWfMbResp.h"
+
+using namespace mme;
+using namespace SM;
+
+/******************************************************************************
+* Constructor
+******************************************************************************/
+ServiceRequestWfMbResp::ServiceRequestWfMbResp():State(State_e::service_request_wf_mb_resp)
+{
+}
+
+/******************************************************************************
+* Destructor
+******************************************************************************/
+ServiceRequestWfMbResp::~ServiceRequestWfMbResp()
+{
+}
+
+/******************************************************************************
+* creates and returns static instance
+******************************************************************************/
+ServiceRequestWfMbResp* ServiceRequestWfMbResp::Instance()
+{
+        static ServiceRequestWfMbResp state;
+        return &state;
+}
+
+/******************************************************************************
+* initializes eventToActionsMap
+******************************************************************************/
+void ServiceRequestWfMbResp::initialize()
+{
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::process_mb_resp_svc_req);
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::MB_RESP_FROM_SGW, actionTable));
+        }
+}
diff --git a/src/mme-app/mmeStates/stateFactory.cpp b/src/mme-app/mmeStates/stateFactory.cpp
new file mode 100644
index 0000000..8648a53
--- /dev/null
+++ b/src/mme-app/mmeStates/stateFactory.cpp
@@ -0,0 +1,112 @@
+
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+ 
+/**************************************
+ * tauStart.cpp
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/SMCodeGen/templates/stateMachineTmpls/stateFactory.cpp.tt>
+ **************************************/
+
+#include "mmeStates/stateFactory.h"
+#include "mmeStates/attachStart.h"
+#include "mmeStates/attachWfAia.h"
+#include "mmeStates/attachWfAttCmp.h"
+#include "mmeStates/attachWfAuthResp.h"
+#include "mmeStates/attachWfAuthRespValidate.h"
+#include "mmeStates/attachWfCsResp.h"
+#include "mmeStates/attachWfEsmInfoCheck.h"
+#include "mmeStates/attachWfEsmInfoResp.h"
+#include "mmeStates/attachWfIdentityResponse.h"
+#include "mmeStates/attachWfImsiValidateAction.h"
+#include "mmeStates/attachWfInitCtxtResp.h"
+#include "mmeStates/attachWfInitCtxtRespAttCmp.h"
+#include "mmeStates/attachWfMbResp.h"
+#include "mmeStates/attachWfSecCmp.h"
+#include "mmeStates/attachWfUla.h"
+#include "mmeStates/defaultMmeState.h"
+#include "mmeStates/detachStart.h"
+#include "mmeStates/detachWfDelSessionResp.h"
+#include "mmeStates/niDetachStart.h"
+#include "mmeStates/niDetachWfDelSessResp.h"
+#include "mmeStates/niDetachWfDetAccptDelSessResp.h"
+#include "mmeStates/niDetachWfDetachAccept.h"
+#include "mmeStates/niDetachWfS1RelComp.h"
+#include "mmeStates/pagingStart.h"
+#include "mmeStates/pagingWfServiceReq.h"
+#include "mmeStates/s1ReleaseStart.h"
+#include "mmeStates/s1ReleaseWfReleaseAccessBearerResp.h"
+#include "mmeStates/s1ReleaseWfUeCtxtReleaseComp.h"
+#include "mmeStates/serviceRequestStart.h"
+#include "mmeStates/serviceRequestWfAuthAndSecCheckCmp.h"
+#include "mmeStates/serviceRequestWfInitCtxtResp.h"
+#include "mmeStates/serviceRequestWfMbResp.h"
+#include "mmeStates/tauStart.h"    
+
+using namespace mme;
+
+/**********************************************
+* Constructor
+***********************************************/
+StateFactory::StateFactory()
+{
+}
+
+/**********************************************
+* Destructor
+***********************************************/
+StateFactory::~StateFactory()
+{
+}
+
+/**********************************************
+* creates and returns static instance
+***********************************************/
+
+StateFactory* StateFactory::Instance()
+{
+	static StateFactory instance;
+	return &instance;
+}
+
+void StateFactory::initialize()
+{
+	AttachStart::Instance()->initialize();
+	AttachWfAia::Instance()->initialize();
+	AttachWfAttCmp::Instance()->initialize();
+	AttachWfAuthResp::Instance()->initialize();
+	AttachWfAuthRespValidate::Instance()->initialize();
+	AttachWfCsResp::Instance()->initialize();
+	AttachWfEsmInfoCheck::Instance()->initialize();
+	AttachWfEsmInfoResp::Instance()->initialize();
+	AttachWfIdentityResponse::Instance()->initialize();
+	AttachWfImsiValidateAction::Instance()->initialize();
+	AttachWfInitCtxtResp::Instance()->initialize();
+	AttachWfInitCtxtRespAttCmp::Instance()->initialize();
+	AttachWfMbResp::Instance()->initialize();
+	AttachWfSecCmp::Instance()->initialize();
+	AttachWfUla::Instance()->initialize();
+	DefaultMmeState::Instance()->initialize();
+	DetachStart::Instance()->initialize();
+	DetachWfDelSessionResp::Instance()->initialize();
+	NiDetachStart::Instance()->initialize();
+	NiDetachWfDelSessResp::Instance()->initialize();
+	NiDetachWfDetAccptDelSessResp::Instance()->initialize();
+	NiDetachWfDetachAccept::Instance()->initialize();
+	NiDetachWfS1RelComp::Instance()->initialize();
+	PagingStart::Instance()->initialize();
+	PagingWfServiceReq::Instance()->initialize();
+	S1ReleaseStart::Instance()->initialize();
+	S1ReleaseWfReleaseAccessBearerResp::Instance()->initialize();
+	S1ReleaseWfUeCtxtReleaseComp::Instance()->initialize();
+	ServiceRequestStart::Instance()->initialize();
+	ServiceRequestWfAuthAndSecCheckCmp::Instance()->initialize();
+	ServiceRequestWfInitCtxtResp::Instance()->initialize();
+	ServiceRequestWfMbResp::Instance()->initialize();
+	TauStart::Instance()->initialize();
+}
diff --git a/src/mme-app/mmeStates/tauStart.cpp b/src/mme-app/mmeStates/tauStart.cpp
new file mode 100644
index 0000000..d62c3a5
--- /dev/null
+++ b/src/mme-app/mmeStates/tauStart.cpp
@@ -0,0 +1,58 @@
+  
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+ 
+/**************************************
+ * tauStart.cpp
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/SMCodeGen/templates/stateMachineTmpls/state.cpp.tt>
+ **************************************/
+
+#include "smEnumTypes.h"
+#include "actionTable.h"
+#include "actionHandlers/actionHandlers.h"
+
+#include "mmeStates/tauStart.h"
+
+using namespace mme;
+using namespace SM;
+
+/******************************************************************************
+* Constructor
+******************************************************************************/
+TauStart::TauStart():State(State_e::tau_start)
+{
+}
+
+/******************************************************************************
+* Destructor
+******************************************************************************/
+TauStart::~TauStart()
+{
+}
+
+/******************************************************************************
+* creates and returns static instance
+******************************************************************************/
+TauStart* TauStart::Instance()
+{
+        static TauStart state;
+        return &state;
+}
+
+/******************************************************************************
+* initializes eventToActionsMap
+******************************************************************************/
+void TauStart::initialize()
+{
+        {
+                ActionTable actionTable;
+                actionTable.addAction(&ActionHandlers::send_tau_response_to_ue);
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::TAU_REQUEST_FROM_UE, actionTable));
+        }
+}
diff --git a/src/mme-app/mmeThreads.h b/src/mme-app/mmeThreads.h
new file mode 100644
index 0000000..d6e6c91
--- /dev/null
+++ b/src/mme-app/mmeThreads.h
@@ -0,0 +1,104 @@
+/*
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#ifndef SRC_MME_APP_MMETHREADS_H_
+#define SRC_MME_APP_MMETHREADS_H_
+
+#include <blockingCircularFifo.h>
+#include <ipcTypes.h>
+#include <msgBuffer.h>
+#include <interfaces/mmeIpcInterface.h>
+#include <mme_app.h>
+
+#define DATA_BUF_SIZE 255
+
+using namespace cmn::ipc;
+using namespace cmn::utils;
+
+extern MmeIpcInterface* mmeIpcIf_g;
+
+extern cmn::utils::BlockingCircularFifo<MsgBuffer, fifoQSize_c> mmeIpcIngressFifo_g;
+extern cmn::utils::BlockingCircularFifo<MsgBuffer, fifoQSize_c> mmeIpcEgressFifo_g;
+
+class MmeIngressIpcProducerThread
+{
+public:
+	void operator()()
+	{
+		uint16_t bytesRead = 0;
+		cmn::ipc::IpcAddress srcAddr;
+		unsigned char buf[DATA_BUF_SIZE] = {0};
+
+		while(1)
+		{
+			if ((bytesRead = mmeIpcIf_g->reader()->recvMsgFrom(buf, DATA_BUF_SIZE, srcAddr)) > 0 )
+			{
+				MsgBuffer *msgBuf = new MsgBuffer(bytesRead);
+				msgBuf->writeBytes(buf, bytesRead);
+				msgBuf->rewind();
+				if (!mmeIpcIngressFifo_g.push(msgBuf))
+				{
+					delete msgBuf;
+				}
+			}
+
+			memset(buf, 0 , 255);
+		}
+	}
+};
+
+class MmeIngressIpcConsumerThread
+{
+public:
+	void operator()()
+	{
+		while(1)
+		{
+			MsgBuffer* msgBuf = NULL;
+			while(mmeIpcIngressFifo_g.pop(msgBuf) == true)
+			{
+				mmeIpcIf_g->handleIpcMsg(msgBuf);
+			}
+		}
+	}
+};
+
+class MmeEgressIpcConsumerThread
+{
+public:
+	void operator()()
+	{
+		while(1)
+		{
+			MsgBuffer* msgBuf = NULL;
+			while(mmeIpcEgressFifo_g.pop(msgBuf) == true)
+			{
+				if (msgBuf != NULL)
+				{
+					cmn::ipc::IpcMsgHeader ipcHdr;
+					msgBuf->rewind();
+					msgBuf->readUint32(ipcHdr.destAddr.u32);
+					msgBuf->readUint32(ipcHdr.srcAddr.u32);
+					mmeIpcIf_g->sender()->sendMsgTo(msgBuf->getDataPointer(), msgBuf->getLength(), ipcHdr.destAddr);
+	
+					delete msgBuf;
+				}
+			}
+		}
+	}
+};
+
+#endif /* SRC_MME_APP_MMETHREADS_H_ */
diff --git a/src/mme-app/msgHandlers/gtpMsgHandler.cpp b/src/mme-app/msgHandlers/gtpMsgHandler.cpp
new file mode 100644
index 0000000..3888803
--- /dev/null
+++ b/src/mme-app/msgHandlers/gtpMsgHandler.cpp
@@ -0,0 +1,167 @@
+/*
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <msgHandlers/gtpMsgHandler.h>
+
+#include <contextManager/subsDataGroupManager.h>
+#include <event.h>
+#include <ipcTypes.h>
+#include <log.h>
+
+using namespace SM;
+using namespace mme;
+
+GtpMsgHandler::~GtpMsgHandler() {
+
+}
+
+GtpMsgHandler::GtpMsgHandler() {
+
+
+}
+
+GtpMsgHandler* GtpMsgHandler::Instance()
+{
+	static GtpMsgHandler msgHandler;
+	return &msgHandler;
+}
+
+void GtpMsgHandler::handleGtpMessage_v(cmn::utils::MsgBuffer* msgBuf)
+{
+	if (msgBuf == NULL)
+		return;
+
+	const gtp_incoming_msg_data_t* msgData_p = (gtp_incoming_msg_data_t*)(msgBuf->getDataPointer());
+
+	switch (msgData_p->msg_type)
+	{
+		case msg_type_t::create_session_response:
+			log_msg(LOG_DEBUG,"Create Session Response msg rxed\n");
+			handleCreateSessionResponseMsg_v(msgBuf, msgData_p->ue_idx);
+			break;
+
+		case msg_type_t::modify_bearer_response:
+			handleModifyBearerResponseMsg_v(msgBuf, msgData_p->ue_idx);
+			break;
+
+		case msg_type_t::delete_session_response:
+			handleDeleteSessionResponseMsg_v(msgBuf, msgData_p->ue_idx);
+			break;
+			
+		case msg_type_t::release_bearer_response:
+			handleReleaseBearerResponseMsg_v(msgBuf, msgData_p->ue_idx);
+			break;
+		
+		case msg_type_t::downlink_data_notification:
+			handleDdnMsg_v(msgBuf, msgData_p->ue_idx);
+			break;
+
+		default:
+			log_msg(LOG_INFO, "Unhandled Gtp Message %d \n", msgData_p->msg_type);
+			delete msgBuf;
+	}
+
+}
+
+void GtpMsgHandler::handleCreateSessionResponseMsg_v(const cmn::utils::MsgBuffer* msgData_p, uint32_t ueIdx)
+{
+	log_msg(LOG_INFO, "handleCreateSessionResponseMsg_v");
+
+	SM::ControlBlock* controlBlk_p = SubsDataGroupManager::Instance()->findControlBlock(ueIdx);
+	if(controlBlk_p == NULL)
+	{
+		log_msg(LOG_ERROR, "handleCreateSessionResponseMsg_v: "
+							"Failed to find UE context using idx %d\n",
+							ueIdx);
+		return;
+	}
+
+	// Fire CS resp from SGW event, insert cb to procedure queue
+	SM::Event evt(Event_e::CS_RESP_FROM_SGW, (void *)msgData_p);
+	controlBlk_p->addEventToProcQ(evt);
+}
+
+void GtpMsgHandler::handleModifyBearerResponseMsg_v(const cmn::utils::MsgBuffer* msgData_p, uint32_t ueIdx)
+{
+	log_msg(LOG_INFO, "handleModifyBearerResponseMsg_v");
+
+	SM::ControlBlock* controlBlk_p = SubsDataGroupManager::Instance()->findControlBlock(ueIdx);
+	if(controlBlk_p == NULL)
+	{
+		log_msg(LOG_ERROR, "handleModifyBearerResponseMsg_v: "
+							"Failed to find UE context using idx %d\n",
+							ueIdx);
+		return;
+	}
+
+	// Fire MB rep from SGW event, insert cb to procedure queue
+	SM::Event evt(Event_e::MB_RESP_FROM_SGW, (void *)msgData_p);
+	controlBlk_p->addEventToProcQ(evt);
+}
+
+void GtpMsgHandler::handleDeleteSessionResponseMsg_v(const cmn::utils::MsgBuffer* msgData_p, uint32_t ueIdx)
+{
+	log_msg(LOG_INFO, "handleDeleteSessionResponseMsg_v");
+	
+	SM::ControlBlock* controlBlk_p = SubsDataGroupManager::Instance()->findControlBlock(ueIdx);
+	if(controlBlk_p == NULL)
+	{
+		log_msg(LOG_ERROR, "handleDeleteSessionResponse_v: "
+							"Failed to find UE context using idx %d\n",
+							ueIdx);
+		return;
+	}
+
+	SM::Event evt(Event_e::DEL_SESSION_RESP_FROM_SGW, (void *)msgData_p);
+	controlBlk_p->addEventToProcQ(evt);
+}
+
+void GtpMsgHandler::handleReleaseBearerResponseMsg_v(const cmn::utils::MsgBuffer* msgData_p, uint32_t ueIdx)
+{
+	log_msg(LOG_INFO, "handleReleaseBearerResponseMsg_v");
+
+	SM::ControlBlock* controlBlk_p = SubsDataGroupManager::Instance()->findControlBlock(ueIdx);
+	if(controlBlk_p == NULL)
+	{
+		log_msg(LOG_ERROR, "handleReleaseBearerResponse_v: "
+							"Failed to find UE context using idx %d\n",
+							ueIdx);
+		return;
+	}
+	
+	// Fire rel bearer response from sgw event, insert cb to procedure queue
+	SM::Event evt(Event_e::REL_AB_RESP_FROM_SGW, (void *)msgData_p);
+	controlBlk_p->addEventToProcQ(evt);
+}
+
+void GtpMsgHandler::handleDdnMsg_v(const cmn::utils::MsgBuffer* msgData_p, uint32_t ueIdx)
+{
+	log_msg(LOG_INFO,"Inside handle DDN\n");
+
+	SM::ControlBlock* controlBlk_p = SubsDataGroupManager::Instance()->findControlBlock(ueIdx);
+	if(controlBlk_p == NULL)
+	{
+		log_msg(LOG_ERROR, "handleReleaseBearerResponse_v: "
+							"Failed to find UE context using idx %d\n",
+							ueIdx);
+		return;
+	}
+
+	// Fire ddn from sgw event, insert cb to procedure queue
+	SM::Event evt(Event_e::DDN_FROM_SGW, (void *)msgData_p);
+	controlBlk_p->addEventToProcQ(evt);
+}
+
diff --git a/src/mme-app/msgHandlers/s1MsgHandler.cpp b/src/mme-app/msgHandlers/s1MsgHandler.cpp
new file mode 100644
index 0000000..b13a528
--- /dev/null
+++ b/src/mme-app/msgHandlers/s1MsgHandler.cpp
@@ -0,0 +1,349 @@
+/*
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <msgHandlers/s1MsgHandler.h>
+
+#include <event.h>
+#include <ipcTypes.h>
+#include <log.h>
+#include <utils/mmeCommonUtils.h>
+#include <contextManager/subsDataGroupManager.h>
+
+using namespace SM;
+using namespace mme;
+
+S1MsgHandler::S1MsgHandler()
+{
+
+}
+
+S1MsgHandler::~S1MsgHandler()
+{
+
+}
+
+S1MsgHandler* S1MsgHandler::Instance()
+{
+	static S1MsgHandler msgHandler;
+	return &msgHandler;
+}
+
+void S1MsgHandler::handleS1Message_v(const cmn::utils::MsgBuffer* buf)
+{
+	log_msg(LOG_INFO, "S1 - handleS1Message_v\n");
+
+	if (buf == NULL)
+		return;
+
+	cmn::utils::MsgBuffer* msgBuf = const_cast<cmn::utils::MsgBuffer *>(buf);
+
+	const s1_incoming_msg_data_t* msgData_p = (s1_incoming_msg_data_t*)(msgBuf->getDataPointer());
+
+	switch (msgData_p->msg_type)
+	{
+		case msg_type_t::attach_request:
+			handleInitUeAttachRequestMsg_v(msgBuf);
+			break;
+
+		case msg_type_t::id_response:
+			handleIdentityResponseMsg_v(msgBuf, msgData_p->ue_idx);
+			break;
+
+		case msg_type_t::auth_response:
+			handleAuthResponseMsg_v(msgBuf, msgData_p->ue_idx);
+			break;
+
+		case msg_type_t::sec_mode_complete:
+			handleSecurityModeResponse_v(msgBuf, msgData_p->ue_idx);
+			break;
+
+		case msg_type_t::esm_info_response:
+			handleEsmInfoResponse_v(msgBuf, msgData_p->ue_idx);
+			break;
+
+		case msg_type_t::init_ctxt_response:
+			handleInitCtxtResponse_v(msgBuf, msgData_p->ue_idx);
+			break;
+
+		case msg_type_t::attach_complete:
+			handleAttachComplete_v(msgBuf, msgData_p->ue_idx);
+			break;
+                
+		case msg_type_t::detach_request:
+			handleDetachRequest_v(msgBuf, msgData_p->ue_idx);
+			break;
+					
+		case msg_type_t::s1_release_request:
+			handleS1ReleaseRequestMsg_v(msgBuf, msgData_p->ue_idx);
+			break;
+			
+		case msg_type_t::s1_release_complete:
+			handleS1ReleaseComplete_v(msgBuf, msgData_p->ue_idx);
+			break;
+		
+		case msg_type_t::detach_accept_from_ue:
+			handleDetachAcceptFromUE_v(msgBuf, msgData_p->ue_idx);
+			break;
+
+		case  msg_type_t::service_request:
+            		handleServiceRequest_v(msgBuf, msgData_p->ue_idx);
+            		break;
+					
+		case msg_type_t::tau_request:
+			handleTauRequestMsg_v(msgBuf, msgData_p->ue_idx);
+			break;
+		
+		default:
+			log_msg(LOG_INFO, "Unhandled S1 Message %d \n", msgData_p->msg_type);
+			delete msgBuf;
+	}
+}
+
+void S1MsgHandler::handleInitUeAttachRequestMsg_v(const cmn::utils::MsgBuffer* msgData_p)
+{
+	log_msg(LOG_INFO, "S1 - handleInitUeAttachRequestMsg_v\n");
+
+	SM::ControlBlock* controlBlk_p = MmeCommonUtils::findControlBlock(
+					const_cast<cmn::utils::MsgBuffer*>(msgData_p));
+	if (controlBlk_p == NULL)
+	{
+		log_msg(LOG_ERROR, "Failed to allocate ControlBlock \n");
+
+        return;
+	}
+
+	// Fire attach-start event, insert cb to procedure queue
+	SM::Event evt(Event_e::ATTACH_REQ_FROM_UE, (void *)msgData_p);
+	controlBlk_p->addEventToProcQ(evt);
+}
+
+void S1MsgHandler::handleIdentityResponseMsg_v(const cmn::utils::MsgBuffer* msgData_p, uint32_t ueIdx)
+{
+	log_msg(LOG_INFO, "S1 - handleIdentityResponseMsg_v\n");
+
+	SM::ControlBlock* controlBlk_p = SubsDataGroupManager::Instance()->findControlBlock(ueIdx);
+	if(controlBlk_p == NULL)
+	{
+		log_msg(LOG_ERROR, "handleIdentityResponseMsg_v: "
+							"Failed to find UE context using idx %d\n",
+							ueIdx);
+		return;
+	}
+
+	// Fire attach-start event, insert cb to procedure queue
+	SM::Event evt(Event_e::IDENTITY_RESPONSE_FROM_UE, (void *)msgData_p);
+	controlBlk_p->addEventToProcQ(evt);
+}
+
+void S1MsgHandler::handleAuthResponseMsg_v(const cmn::utils::MsgBuffer* msgData_p, uint32_t ueIdx)
+{
+	log_msg(LOG_INFO, "S1 - handleAuthResponseMsg_v\n");
+
+	SM::ControlBlock* controlBlk_p = SubsDataGroupManager::Instance()->findControlBlock(ueIdx);
+	if(controlBlk_p == NULL)
+	{
+		log_msg(LOG_ERROR, "handleAuthResponseMsg_v: "
+							"Failed to find UE context using idx %d\n",
+							ueIdx);
+		return;
+	}
+
+	// Fire attach-start event, insert cb to procedure queue
+	SM::Event evt(Event_e::AUTH_RESP_FROM_UE, (void *)msgData_p);
+	controlBlk_p->addEventToProcQ(evt);
+}
+
+void S1MsgHandler::handleSecurityModeResponse_v(const cmn::utils::MsgBuffer* msgData_p, uint32_t ueIdx)
+{
+	log_msg(LOG_INFO, "S1 - handleSecurityModeResponse_v\n");
+
+	SM::ControlBlock* controlBlk_p = SubsDataGroupManager::Instance()->findControlBlock(ueIdx);
+	if(controlBlk_p == NULL)
+	{
+		log_msg(LOG_ERROR, "handleSecurityModeResponse_v: "
+							"Failed to find UE context using idx %d\n",
+							ueIdx);
+		return;
+	}
+
+	// Fire attach-start event, insert cb to procedure queue
+	SM::Event evt(Event_e::SEC_MODE_RESP_FROM_UE, (void *)msgData_p);
+	controlBlk_p->addEventToProcQ(evt);
+}
+
+void S1MsgHandler::handleEsmInfoResponse_v(const cmn::utils::MsgBuffer* msgData_p, uint32_t ueIdx)
+{
+	log_msg(LOG_INFO, "S1 - handleEsmInfoResponse_v\n");
+
+	SM::ControlBlock* controlBlk_p = SubsDataGroupManager::Instance()->findControlBlock(ueIdx);
+	if(controlBlk_p == NULL)
+	{
+		log_msg(LOG_ERROR, "handleEsmInfoResponse_v: "
+							"Failed to find UE context using idx %d\n",
+							ueIdx);
+		return;
+	}
+
+	// Fire attach-start event, insert cb to procedure queue
+	SM::Event evt(Event_e::ESM_INFO_RESP_FROM_UE, (void *)msgData_p);
+	controlBlk_p->addEventToProcQ(evt);
+}
+
+void S1MsgHandler::handleInitCtxtResponse_v(const cmn::utils::MsgBuffer* msgData_p, uint32_t ueIdx)
+{
+	log_msg(LOG_INFO, "S1 - handleInitCtxtResponse_v\n");
+
+	SM::ControlBlock* controlBlk_p = SubsDataGroupManager::Instance()->findControlBlock(ueIdx);
+	if(controlBlk_p == NULL)
+	{
+		log_msg(LOG_ERROR, "handleInitCtxtResponse_v: "
+							"Failed to find UE context using idx %d\n",
+							ueIdx);
+		return;
+	}
+
+	// Fire attach-start event, insert cb to procedure queue
+	SM::Event evt(Event_e::INIT_CTXT_RESP_FROM_UE, (void *)msgData_p);
+	controlBlk_p->addEventToProcQ(evt);
+}
+
+void S1MsgHandler::handleAttachComplete_v(const cmn::utils::MsgBuffer* msgData_p, uint32_t ueIdx)
+{
+	log_msg(LOG_INFO, "S1 - handleAttachComplete_v\n");
+
+	SM::ControlBlock* controlBlk_p = SubsDataGroupManager::Instance()->findControlBlock(ueIdx);
+	if(controlBlk_p == NULL)
+	{
+		log_msg(LOG_ERROR, "handleAttachComplete_v: "
+							"Failed to find UE context using idx %d\n",
+							ueIdx);
+		return;
+	}
+
+	// Fire attach-start event, insert cb to procedure queue
+	SM::Event evt(Event_e::ATT_CMP_FROM_UE, (void *)msgData_p);
+	controlBlk_p->addEventToProcQ(evt);
+}
+
+void S1MsgHandler::handleDetachRequest_v(const cmn::utils::MsgBuffer* msgData_p, uint32_t ueIdx)
+{
+	log_msg(LOG_INFO, "S1 - handleDetachRequest_v\n");
+
+	SM::ControlBlock* controlBlk_p = MmeCommonUtils::findControlBlock(
+					const_cast<cmn::utils::MsgBuffer*>(msgData_p));
+	if(controlBlk_p == NULL)
+	{
+		log_msg(LOG_ERROR, "handleDetachRequest_v: "
+				"Failed to find UE context using idx %d\n", ueIdx);
+		return;
+	}
+
+	// Fire detach request event, insert cb to procedure queue
+	SM::Event evt(Event_e::DETACH_REQ_FROM_UE, (void *)msgData_p);
+	controlBlk_p->addEventToProcQ(evt);
+}
+
+void S1MsgHandler::handleS1ReleaseRequestMsg_v(const cmn::utils::MsgBuffer* msgData_p, uint32_t ueIdx)
+{
+	log_msg(LOG_INFO, "S1 - handleS1ReleaseRequestMsg_v\n");
+
+	SM::ControlBlock* controlBlk_p = SubsDataGroupManager::Instance()->findControlBlock(ueIdx);
+	if(controlBlk_p == NULL)
+    {
+		log_msg(LOG_ERROR, ":handleS1ReleaseRequestMsg_v: "
+                "Failed to find UE context using idx %d\n",
+                 ueIdx);
+        return;
+    }
+
+	// Fire s1 release event, insert cb to procedure queue
+	SM::Event evt(Event_e::S1_REL_REQ_FROM_UE, (void *)msgData_p);
+	controlBlk_p->addEventToProcQ(evt);
+}
+
+void S1MsgHandler::handleS1ReleaseComplete_v(const cmn::utils::MsgBuffer* msgData_p, uint32_t ueIdx)
+{
+	log_msg(LOG_INFO, "S1 - handleS1ReleaseComplete_v\n");
+
+	SM::ControlBlock* controlBlk_p = SubsDataGroupManager::Instance()->findControlBlock(ueIdx);
+	if(controlBlk_p == NULL)
+    {
+		log_msg(LOG_ERROR, ":handleS1ReleaseComplete_v: "
+                "Failed to find UE context using idx %d\n",
+                 ueIdx);
+        return;
+    }
+
+	// Fire s1 release complete event, insert cb to procedure queue
+	SM::Event evt(Event_e::UE_CTXT_REL_COMP_FROM_ENB, (void *)msgData_p);
+	controlBlk_p->addEventToProcQ(evt);
+}
+
+void S1MsgHandler::handleDetachAcceptFromUE_v(const cmn::utils::MsgBuffer* msgData_p, uint32_t ueIdx)
+{
+	log_msg(LOG_INFO, "S1 - handleDetachAcceptFromUE_v\n");
+
+	SM::ControlBlock* controlBlk_p = SubsDataGroupManager::Instance()->findControlBlock(ueIdx);
+	if(controlBlk_p == NULL)
+	{
+		log_msg(LOG_ERROR, "handleDetachAcceptFromUE_v: "
+				   "Failed to find UE Context using idx %d\n",
+				   ueIdx);
+		return;
+	}
+
+	//Fire NI_Detach Event, insert CB to procedure queue
+	SM::Event evt(Event_e::DETACH_ACCEPT_FROM_UE, (void *)msgData_p);
+	controlBlk_p->addEventToProcQ(evt);
+}
+
+void S1MsgHandler::handleServiceRequest_v(const cmn::utils::MsgBuffer* msgData_p, uint32_t ueIdx)
+{
+	log_msg(LOG_INFO, "S1 - handleServiceRequest_v\n");
+
+	SM::ControlBlock* controlBlk_p = MmeCommonUtils::findControlBlock(
+					const_cast<cmn::utils::MsgBuffer*>(msgData_p));
+	if(controlBlk_p == NULL)
+	{
+		log_msg(LOG_ERROR, "handleServiceRequest_v: "
+				   "Failed to find UE Context using idx %d\n",
+				   ueIdx);
+		return;
+	}
+
+	//Fire NI_Detach Event, insert CB to procedure queue
+	SM::Event evt(Event_e::SERVICE_REQUEST_FROM_UE, (void *)msgData_p);
+	controlBlk_p->addEventToProcQ(evt);
+}
+
+void S1MsgHandler::handleTauRequestMsg_v(const cmn::utils::MsgBuffer* msgData_p, uint32_t ueIdx)
+{
+	log_msg(LOG_INFO, "S1 - handleTauRequestMsg_v\n");
+
+	SM::ControlBlock* controlBlk_p = MmeCommonUtils::findControlBlock(
+					const_cast<cmn::utils::MsgBuffer*>(msgData_p)); 
+	if(controlBlk_p == NULL)
+	{
+		log_msg(LOG_ERROR, "handleTauRequestMsg_v: "
+				   "Failed to find UE Context using idx %d\n",
+				   ueIdx);
+		return;
+	}
+
+	// Fire tau-start event, insert cb to procedure queue
+	SM::Event evt(Event_e::TAU_REQUEST_FROM_UE, (void *)msgData_p);
+	controlBlk_p->addEventToProcQ(evt);
+}
diff --git a/src/mme-app/msgHandlers/s6MsgHandler.cpp b/src/mme-app/msgHandlers/s6MsgHandler.cpp
new file mode 100644
index 0000000..6880229
--- /dev/null
+++ b/src/mme-app/msgHandlers/s6MsgHandler.cpp
@@ -0,0 +1,153 @@
+/*
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+#include <msgHandlers/s6MsgHandler.h>
+
+#include <contextManager/subsDataGroupManager.h>
+#include <event.h>
+#include <ipcTypes.h>
+#include <log.h>
+
+using namespace SM;
+using namespace mme;
+
+
+S6MsgHandler::~S6MsgHandler() {
+
+}
+S6MsgHandler::S6MsgHandler() {
+
+}
+
+S6MsgHandler* S6MsgHandler::Instance()
+{
+	static S6MsgHandler msgHandler;
+	return &msgHandler;
+}
+
+void S6MsgHandler::handleS6Message_v(cmn::utils::MsgBuffer* msgBuf)
+{
+	if (msgBuf == NULL)
+		return;
+
+	const s6_incoming_msg_data_t* msgData_p = (s6_incoming_msg_data_t*)(msgBuf->getDataPointer());
+	switch (msgData_p->msg_type)
+	{
+		case msg_type_t::auth_info_answer:
+			handleAuthInfoAnswer_v(msgBuf, msgData_p->ue_idx);
+			break;
+
+		case msg_type_t::update_loc_answer:
+			handleUpdateLocationAnswer_v(msgBuf,  msgData_p->ue_idx);
+			break;
+
+		case msg_type_t::purge_answser:
+			handlePurgeAnswer_v(msgBuf,  msgData_p->ue_idx);
+			break;
+		
+		case msg_type_t::cancel_location_request:
+			handleCancelLocationRequest_v(msgBuf);
+			break;
+
+		default:
+			log_msg(LOG_INFO, "Unhandled S6 Message %d \n", msgData_p->msg_type);
+	}
+
+}
+
+void S6MsgHandler::handleAuthInfoAnswer_v(cmn::utils::MsgBuffer* msgData_p, uint32_t ueIdx)
+{
+	log_msg(LOG_INFO, "Inside handleAuthInfoAnswer_v \n");
+
+	SM::ControlBlock* controlBlk_p = SubsDataGroupManager::Instance()->findControlBlock(ueIdx);
+	if(controlBlk_p == NULL)
+	{
+		log_msg(LOG_ERROR, "handleAuthInfoAnswer_v: "
+							"Failed to find UE context using idx %d\n",
+							ueIdx);
+		return;
+	}
+
+	// Fire Auth Info Answer event, insert cb to procedure queue
+	SM::Event evt(Event_e::AIA_FROM_HSS, (void *)msgData_p);
+	controlBlk_p->addEventToProcQ(evt);
+}
+
+void S6MsgHandler::handleUpdateLocationAnswer_v(cmn::utils::MsgBuffer* msgData_p, uint32_t ueIdx)
+{
+	log_msg(LOG_INFO, "Inside handleUpdateLocationAnswer_v \n");
+
+	SM::ControlBlock* controlBlk_p = SubsDataGroupManager::Instance()->findControlBlock(ueIdx);
+	if(controlBlk_p == NULL)
+	{
+		log_msg(LOG_ERROR, "handleUpdateLocationAnswer_v: "
+							"Failed to find UE context using idx %d\n",
+							ueIdx);
+		return;
+	}
+	// Fire Update Loc Answer event, insert cb to procedure queue
+	SM::Event evt(Event_e::ULA_FROM_HSS, (void *)msgData_p);
+	controlBlk_p->addEventToProcQ(evt);
+}
+
+void S6MsgHandler::handlePurgeAnswer_v(cmn::utils::MsgBuffer* msgData_p, uint32_t ueIdx)
+{
+	log_msg(LOG_INFO, "Inside handlePurgeAnswer_v \n");
+
+	SM::ControlBlock* controlBlk_p = SubsDataGroupManager::Instance()->findControlBlock(ueIdx);
+	if(controlBlk_p == NULL)
+	{
+		log_msg(LOG_ERROR, "handlePurgeAnswer_v: "
+							"Failed to find UE context using idx %d\n",
+							ueIdx);
+		return;
+	}
+	// Fire attach-start event, insert cb to procedure queue
+	//SM::Event evt(Event_e::DETACH_PUR_RESP_FROM_HSS);
+	//controlBlk_p->addEventToProcQ(evt);
+	//
+}
+
+void S6MsgHandler::handleCancelLocationRequest_v(cmn::utils::MsgBuffer* msgData_p)
+{
+	log_msg(LOG_INFO, "Inside handleCancelLocationRequest \n");
+        
+	const char *buf = static_cast<const char*>(msgData_p->getDataPointer());
+	const s6_incoming_msg_data_t* msgInfo_p = (s6_incoming_msg_data_t*)(buf);
+
+	DigitRegister15 IMSI;
+	IMSI.setImsiDigits(const_cast<uint8_t*> (msgInfo_p->msg_data.clr_Q_msg_m.imsi));
+      
+	int ue_idx =  SubsDataGroupManager::Instance()->findCBWithimsi(IMSI);
+	log_msg(LOG_INFO, "UE_IDX found from map : %d \n", ue_idx);
+
+	if (ue_idx < 1)
+	{
+		log_msg(LOG_ERROR, "Failed to find ue index using IMSI : %d\n", ue_idx);
+		return;
+	}
+
+	SM::ControlBlock* controlBlk_p = SubsDataGroupManager::Instance()->findControlBlock(ue_idx);
+	if(controlBlk_p == NULL)
+	{
+		log_msg(LOG_ERROR, "handleCancelLocationRequest_v: "
+				   "Failed to find UE Context using IMSI in CLR\n");
+		return;
+	}
+	//Fire CLR event, insert CB to Procedure Queue
+	SM::Event evt(Event_e::CLR_FROM_HSS, (void *)msgData_p);
+	controlBlk_p->addEventToProcQ(evt);
+}
+
diff --git a/src/mme-app/procedureStats.cpp b/src/mme-app/procedureStats.cpp
new file mode 100644
index 0000000..d3e538c
--- /dev/null
+++ b/src/mme-app/procedureStats.cpp
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include "procedureStats.h"
+
+using namespace mme;
+
+int ProcedureStats::num_of_air_sent = 0;
+int ProcedureStats::num_of_ulr_sent = 0;
+int ProcedureStats::num_of_processed_aia = 0;
+int ProcedureStats::num_of_processed_ula = 0;
+int ProcedureStats::num_of_auth_req_to_ue_sent = 0;
+int ProcedureStats::num_of_processed_auth_response = 0;
+int ProcedureStats::num_of_sec_mode_cmd_to_ue_sent = 0;
+int ProcedureStats::num_of_processed_sec_mode_resp = 0;
+int ProcedureStats::num_of_esm_info_req_to_ue_sent = 0;
+int ProcedureStats::num_of_handled_esm_info_resp = 0;
+int ProcedureStats::num_of_cs_req_to_sgw_sent = 0;
+int ProcedureStats::num_of_processed_cs_resp = 0;
+int ProcedureStats::num_of_init_ctxt_req_to_ue_sent = 0;
+int ProcedureStats::num_of_processed_init_ctxt_resp = 0;
+int ProcedureStats::num_of_mb_req_to_sgw_sent = 0;
+int ProcedureStats::num_of_processed_attach_cmp_from_ue = 0;
+int ProcedureStats::num_of_processed_mb_resp = 0;
+int ProcedureStats::num_of_attach_done = 0;
+int ProcedureStats::num_of_del_session_req_sent = 0;
+int ProcedureStats::num_of_purge_req_sent = 0;
+int ProcedureStats::num_of_processed_del_session_resp = 0;
+int ProcedureStats::num_of_processed_pur_resp = 0;
+int ProcedureStats::num_of_detach_accept_to_ue_sent = 0;
+int ProcedureStats::num_of_processed_detach_accept = 0;
+int ProcedureStats::num_of_ue_ctxt_release = 0;
+int ProcedureStats::num_of_processed_ctxt_rel_resp = 0;
+int ProcedureStats::num_of_subscribers_attached = 0;
+int ProcedureStats::num_of_rel_access_bearer_req_sent = 0;
+int ProcedureStats::num_of_rel_access_bearer_resp_received = 0;
+int ProcedureStats::num_of_s1_rel_req_received = 0;
+int ProcedureStats::num_of_s1_rel_cmd_sent = 0;
+int ProcedureStats::num_of_s1_rel_comp_received = 0;
+int ProcedureStats::num_of_clr_received = 0;
+int ProcedureStats::num_of_cla_sent = 0;
+int ProcedureStats::num_of_detach_req_to_ue_sent = 0;
+int ProcedureStats::num_of_detach_accept_from_ue = 0;
+int ProcedureStats::total_num_of_subscribers = 0;
+int ProcedureStats::num_of_subscribers_detached = 0;
+int ProcedureStats::num_of_ddn_received = 0;
+int ProcedureStats::num_of_service_request_received = 0;
+int ProcedureStats::num_of_ddn_ack_sent = 0;
+int ProcedureStats::num_of_tau_response_to_ue_sent = 0;
diff --git a/src/mme-app/run.sh b/src/mme-app/run.sh
new file mode 100644
index 0000000..575a70e
--- /dev/null
+++ b/src/mme-app/run.sh
@@ -0,0 +1,28 @@
+#! /bin/bash
+#
+# Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+# Copyright (c) 2017 Intel Corporation
+# Copyright (c) 2019, Infosys Ltd.
+#
+# 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.
+#
+
+export LD_LIBRARY_PATH=./lib:/usr/local/lib
+echo "Start MME application"
+./bin/mme-app &
+sleep 1
+./bin/s1ap-app  &
+sleep 1
+./bin/s6a-app > /dev/null &
+sleep 1
+./bin/s11-app > /dev/null &
diff --git a/src/mme-app/sec/secUtils.cpp b/src/mme-app/sec/secUtils.cpp
new file mode 100644
index 0000000..b6a971b
--- /dev/null
+++ b/src/mme-app/sec/secUtils.cpp
@@ -0,0 +1,102 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <string.h>
+#include <stdint.h>
+
+#include <openssl/x509.h>
+#include <openssl/hmac.h>
+
+#include "sec.h"
+#include "secUtils.h"
+
+/**
+ * @brief Create integrity key
+ * @param[in] kasme key
+ * @param[out] int_key generated integrity key
+ * @return void
+ */
+void SecUtils::create_integrity_key(unsigned char *kasme, unsigned char *int_key)
+{
+	/*TODO : Handle appropriate security values in salt. Remove
+	 * hardcoding*/
+	uint8_t salt[HASH_SALT_LEN] = {
+		0x15,
+		0x02, /*sec algo code*/
+		0,
+		1,
+		1,
+		0,
+		1
+	};
+
+	unsigned char out_key[HMAC_SIZE] = {0};
+	unsigned int out_len = 0;
+	calculate_hmac_sha256(salt, HASH_SALT_LEN, kasme, AIA_KASME_SIZE, out_key, &out_len);
+
+	memcpy(int_key, &out_key[AIA_KASME_SIZE - NAS_INT_KEY_SIZE],
+			NAS_INT_KEY_SIZE);
+}
+
+/**
+ * @brief Create eNodeB key to exchange in init ctx message
+ * @param [in]kasme key
+ * @param [out]kenb_key output the generated key
+ * @return void
+ */
+void SecUtils::create_kenb_key(unsigned char *kasme, unsigned char *kenb_key,
+		unsigned int seq_no)
+{
+	uint8_t salt[HASH_SALT_LEN] = {
+		0x11, /*TODO : Sec algo. handle properly instead of harcoding here*/
+		(seq_no >> 24) & 0xFF, /*Byte 1 of seq no*/
+		(seq_no >> 16) & 0xFF, /*Byte 2 of seq no*/
+		(seq_no >> 8 ) & 0xFF, /*Byte 3 of seq no*/
+		(seq_no      ) & 0xFF, /*Byte 4 of seq no*/
+		0x00,
+		0x04
+	};
+
+	uint8_t out_key[HMAC_SIZE];
+	unsigned int out_len = 0;
+	calculate_hmac_sha256(salt, HASH_SALT_LEN, kasme, AIA_KASME_SIZE, out_key, &out_len);
+	memcpy(kenb_key, out_key, KENB_SIZE);
+
+}
+
+
+/**
+* @brief Create MAC(message authentication code)
+* @param [in]input data and  key
+* @param [out]output MAC, out_len size of MAC
+* @return void
+*/
+
+
+void SecUtils::calculate_hmac_sha256(const unsigned char *input_data,
+				int input_data_len, const unsigned char *key,
+				int key_length, void *output, unsigned int *out_len)
+{
+
+	unsigned int mac_length = 0;
+	unsigned char mac_buffer[EVP_MAX_MD_SIZE] = {0};
+	HMAC(EVP_sha256(), key, key_length, input_data, input_data_len, mac_buffer, &mac_length);
+	memcpy(output, mac_buffer, mac_length);
+	*out_len = mac_length;
+
+}
diff --git a/src/mme-app/stop.sh b/src/mme-app/stop.sh
new file mode 100644
index 0000000..977e139
--- /dev/null
+++ b/src/mme-app/stop.sh
@@ -0,0 +1,21 @@
+#! /bin/bash
+#
+# Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+# Copyright (c) 2017 Intel Corporation
+# Copyright (c) 2019, Infosys Ltd.
+#
+# 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.
+#
+
+echo "Killing MME application"
+killall -9 mme-app s1ap-app s11-app s6a-app
diff --git a/src/mme-app/structs.cpp b/src/mme-app/structs.cpp
new file mode 100644
index 0000000..63f25c5
--- /dev/null
+++ b/src/mme-app/structs.cpp
@@ -0,0 +1,477 @@
+/*
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+#include <string>
+#include <sstream>
+#include <cstring>
+#include <iomanip>
+#include "structs.h"
+#include "log.h"
+
+using namespace std;
+
+uint8_t ASCII_TO_BCD(uint8_t left, uint8_t right)
+{
+	uint8_t bcd_value;
+
+	if(left >= '0' && left <= '9')  // 0-9 range
+	{
+		bcd_value = ( left - 0x30)  << 4 ; // 48 for '0' ASCII offset
+	}
+	else
+	{
+		bcd_value = 0x0f << 4; // filler 1111
+	}
+
+	if(right  >= '0' && right <= '9')  // 0-9 range
+	{
+		bcd_value |= ( right - 0x30); // 48 for '0' ASCII offset
+	}
+	else
+	{
+		bcd_value |= 0x0f; // filler 1111
+	}
+
+	return bcd_value;
+}
+
+/*******************************************************
+ *TAI
+********************************************************/
+Tai::Tai()
+{
+	 memset( &tai_m, 0, sizeof( tai_m ));
+}
+
+Tai::Tai( const TAI& tai_i )
+{
+	memset( &tai_m, 0, sizeof( tai_m ));
+	memcpy( &tai_m, &tai_i, sizeof( tai_i ));
+}
+
+Tai::~Tai()
+{
+}
+
+void Tai::operator = ( const Tai& tai_i )
+{
+	memcpy( &tai_m, &(tai_i.tai_m), sizeof( tai_i.tai_m ));
+}
+
+/*******************************************************
+ *CGI
+********************************************************/
+Cgi::Cgi()
+{
+	memset( &cgi_m, 0, sizeof( cgi_m ));
+}
+
+Cgi::Cgi( const CGI& cgi_i )
+{
+	memset( &cgi_m, 0, sizeof( cgi_m ));
+	memcpy( &cgi_m, &cgi_i, sizeof(cgi_i));
+}
+
+Cgi::~Cgi()
+{
+}
+
+void Cgi::operator = ( const Cgi& cgi_i )
+{
+	memcpy( &cgi_m, &(cgi_i.cgi_m), sizeof(cgi_i.cgi_m));
+}
+
+/*******************************************************
+ *STMSI
+********************************************************/
+Stmsi::Stmsi()
+{
+	 memset( &stmsi_m, 0, sizeof( stmsi_m ));
+}
+
+Stmsi::Stmsi( const STMSI& stmsi_i )
+{
+	memset( &stmsi_m, 0, sizeof( stmsi_m ));
+	memcpy( &stmsi_m, &stmsi_i, sizeof( stmsi_i ));
+}
+
+Stmsi::~Stmsi()
+{
+}
+
+void Stmsi::operator = ( const Stmsi& stmsi_i )
+{
+	memcpy( &stmsi_m, &(stmsi_i.stmsi_m), sizeof( stmsi_i.stmsi_m ));
+}
+
+/*******************************************************
+ *ARP
+********************************************************/
+Arp::Arp()
+{
+	 memset( &arp_m, 0, sizeof( arp_m ));
+}
+
+Arp::Arp( const ARP& arp_i )
+{
+	memset( &arp_m, 0, sizeof( arp_m ));
+	memcpy( &arp_m, &arp_i, sizeof( arp_i ));
+}
+
+Arp::~Arp()
+{
+}
+
+void Arp::operator = ( const Arp& arp_i )
+{
+	memcpy( &arp_m, &(arp_i.arp_m), sizeof( arp_i.arp_m ));
+}
+
+
+/*******************************************************
+ *Ms_net_capab
+********************************************************/
+Ms_net_capab::Ms_net_capab()
+{
+	memset( &ms_net_capab_m, 0, sizeof( ms_net_capab_m ));
+}
+
+Ms_net_capab::Ms_net_capab( const MS_net_capab& net_cap_i )
+{
+	memset( &ms_net_capab_m, 0, sizeof( ms_net_capab_m ));
+	memcpy( &ms_net_capab_m, &net_cap_i, sizeof( net_cap_i ));
+}
+
+Ms_net_capab::~Ms_net_capab()
+{
+}
+
+void Ms_net_capab::operator = ( const Ms_net_capab& net_cap_i )
+{
+	memcpy( &ms_net_capab_m, &(net_cap_i.ms_net_capab_m), sizeof( net_cap_i.ms_net_capab_m ));
+}
+
+/*******************************************************
+*Ue_net_capab
+********************************************************/
+Ue_net_capab::Ue_net_capab()
+{
+	memset( &ue_net_capab_m, 0, sizeof( ue_net_capab_m ));
+}
+
+Ue_net_capab::Ue_net_capab( const UE_net_capab& net_cap_i )
+{
+	memset( &ue_net_capab_m, 0, sizeof( ue_net_capab_m ));
+	memcpy( &ue_net_capab_m, &net_cap_i, sizeof( net_cap_i ));
+}
+
+Ue_net_capab::~Ue_net_capab()
+{
+}
+
+void Ue_net_capab::operator = ( const Ue_net_capab& net_cap_i )
+{
+	memcpy( &ue_net_capab_m, &(net_cap_i.ue_net_capab_m), sizeof( net_cap_i.ue_net_capab_m ));
+}
+
+/*******************************************************
+*Secinfo
+********************************************************/
+Secinfo::Secinfo()
+{
+	memset( &secinfo_m, 0, sizeof( secinfo_m ));
+}
+
+Secinfo::Secinfo( const secinfo& sec_i )
+{
+	memset( &secinfo_m, 0, sizeof( secinfo_m ));
+	memcpy( &secinfo_m, &sec_i, sizeof( sec_i ));
+}
+
+Secinfo::~Secinfo()
+{
+}
+
+void Secinfo::operator = ( const Secinfo& sec_i )
+{
+	memcpy( &secinfo_m, &(sec_i.secinfo_m), sizeof( sec_i.secinfo_m ));
+}
+
+/*******************************************************
+*Ambr
+********************************************************/
+Ambr::Ambr()
+{
+	memset( &ambr_m, 0, sizeof( ambr_m ));
+}
+
+Ambr::Ambr( const AMBR& ambr_i )
+{
+	memset( &ambr_m, 0, sizeof( ambr_m ));
+	memcpy( &ambr_m, &ambr_i, sizeof( ambr_i ));
+}
+
+Ambr::~Ambr()
+{
+}
+
+void Ambr::operator = ( const Ambr& ambr_i )
+{
+	memcpy( &ambr_m, &(ambr_i.ambr_m), sizeof( ambr_i.ambr_m ));
+}
+
+/*******************************************************
+*E_utran_sec_vector
+********************************************************/
+E_utran_sec_vector::E_utran_sec_vector():AiaSecInfo_mp( NULL )
+{
+	AiaSecInfo_mp = (struct E_UTRAN_sec_vector*)calloc(sizeof(struct E_UTRAN_sec_vector), 1);
+}
+
+E_utran_sec_vector::E_utran_sec_vector( const E_UTRAN_sec_vector& secinfo_i )
+{
+	AiaSecInfo_mp = (struct E_UTRAN_sec_vector*)calloc(sizeof(struct E_UTRAN_sec_vector), 1);
+	memcpy( AiaSecInfo_mp, &secinfo_i, sizeof( E_UTRAN_sec_vector ));	
+}
+
+E_utran_sec_vector::~E_utran_sec_vector()
+{
+	free(AiaSecInfo_mp);
+}
+
+void E_utran_sec_vector::operator = ( const E_utran_sec_vector& secinfo_i )
+{
+	if( NULL != secinfo_i.AiaSecInfo_mp )
+	{
+		memcpy( AiaSecInfo_mp, secinfo_i.AiaSecInfo_mp, sizeof( E_UTRAN_sec_vector ));
+	}
+}
+
+std::ostream& operator << ( std::ostream& os, const E_utran_sec_vector& data_i )
+{
+	os << "RAND ";
+	for ( uint32_t i = 0; i < data_i.AiaSecInfo_mp->rand.len; i++) 
+	{
+		os << setfill('0') << setw(2) << std::hex << 
+			static_cast<uint32_t>(data_i.AiaSecInfo_mp->rand.val[i]);
+	}
+	os << std::endl;
+	
+	os  << "RES ";
+	for ( uint32_t i = 0; i < data_i.AiaSecInfo_mp->xres.len; i++)
+	{
+		os << setfill('0') << setw(2) << std::hex << 
+			static_cast<uint32_t>(data_i.AiaSecInfo_mp->xres.val[i]);
+	}
+	os << std::endl;
+	
+	os << "AUTN ";
+	for ( uint32_t i = 0; i < data_i.AiaSecInfo_mp->autn.len; i++)
+	{
+		os << setfill('0') << setw(2) << std::hex << 
+			static_cast<uint32_t>(data_i.AiaSecInfo_mp->autn.val[i]);
+	}
+	os << std::endl;
+	
+	os << "KASME ";
+	for ( uint32_t i = 0; i < data_i.AiaSecInfo_mp->kasme.len; i++)
+	{
+		os << setfill('0') << setw(2) << std::hex << 
+			static_cast<uint32_t>(data_i.AiaSecInfo_mp->kasme.val[i]);
+	}
+	os << std::endl;
+	
+	return os;
+}
+
+/*******************************************************
+*Fteid
+********************************************************/
+Fteid::Fteid()
+{
+	memset( &fteid_m, 0, sizeof( fteid_m ));
+}
+
+Fteid::Fteid( const fteid& fteid_i )
+{
+	memset( &fteid_m, 0, sizeof( fteid_m ));
+	memcpy( &fteid_m, &fteid_i, sizeof( fteid_i ));
+}
+
+Fteid::~Fteid()
+{
+}
+
+void Fteid::operator = ( const Fteid& fteid_i )
+{
+	memcpy( &fteid_m, &(fteid_i.fteid_m), sizeof( fteid_i.fteid_m ));
+}
+
+/*******************************************************
+*Paa
+********************************************************/
+Paa::Paa()
+{
+	memset( &paa_m, 0, sizeof( paa_m ));
+}
+
+Paa::Paa( const PAA& paa_i )
+{
+	memset( &paa_m, 0, sizeof( paa_m ));
+	memcpy( &paa_m, &paa_i, sizeof( paa_i ));
+}
+
+Paa::~Paa()
+{
+}
+
+void Paa::operator = ( const Paa& paa_i )
+{
+	memcpy( &paa_m, &(paa_i.paa_m), sizeof( paa_i.paa_m ));
+}
+
+/*******************************************************
+*Apn_name
+********************************************************/
+Apn_name::Apn_name()
+{
+	memset( &apnname_m, 0, sizeof( apnname_m ));
+}
+
+Apn_name::Apn_name( const apn_name& apn_name_i )
+{
+	memset( &apnname_m, 0, sizeof( apnname_m ));
+	memcpy( &apnname_m, &apn_name_i, sizeof( apn_name_i ));
+}
+
+Apn_name::~Apn_name()
+{
+}
+
+void Apn_name::operator = ( const Apn_name& apn_name_i )
+{
+	memcpy( &apnname_m, &(apn_name_i.apnname_m), sizeof( apn_name_i.apnname_m ));
+}
+
+/*******************************************************
+*DigitRegister15
+********************************************************/
+DigitRegister15::DigitRegister15()
+{
+	memset(&digitsArray,0,15);
+}
+
+void DigitRegister15::convertToBcdArray( uint8_t * arrayOut ) const
+{
+	for( int i=0; i < 7; i++ )
+	{
+		arrayOut[i] = ASCII_TO_BCD(digitsArray[2*i+1],digitsArray[2*i]);
+	}
+	arrayOut[7] = ASCII_TO_BCD(0x0f,digitsArray[14]);
+}
+
+void DigitRegister15::convertFromBcdArray( const uint8_t* bcdArrayIn )
+{
+	// For the imsi value upper nibble of first octect should only be considered
+	if(( bcdArrayIn[0] & 0x0f ) == 0x0f )
+	{
+		digitsArray[0] = (uint8_t)(((bcdArrayIn[0] >> 4) & 0x0f ) + 0x30);
+		for( int i = 1; i < 8; i++ )
+		{
+			digitsArray[2*i] = (uint8_t)(((bcdArrayIn[i] >> 4) & 0x0f) + 0x30);
+			digitsArray[2*i-1] = (uint8_t)((bcdArrayIn[i] & 0x0f) + 0x30);
+		}
+	}
+	else
+	{
+		for( int i = 0; i < 7; i++ )
+		{
+			digitsArray[2*i+1] = (uint8_t)(((bcdArrayIn[i] >> 4) & 0x0f) + 0x30);
+			digitsArray[2*i] = (uint8_t)((bcdArrayIn[i] & 0x0f) + 0x30);
+		}
+		digitsArray[7] = (uint8_t)(((bcdArrayIn[7] >> 4) & 0x0f) + 0x30);
+	}
+	return;
+}
+
+
+void DigitRegister15::setImsiDigits( uint8_t* digitsArrayIn )
+{
+	memcpy( digitsArray, digitsArrayIn, 15);
+}
+
+void DigitRegister15::getImsiDigits( uint8_t* digitsArrayIn ) const
+{
+	memcpy( digitsArrayIn, digitsArray, 15);
+}
+
+bool DigitRegister15::isValid() const
+{
+    bool rc = false;
+    for (uint32_t i = 0; i < 15; i++)
+    {
+        if (digitsArray[i] != 0)
+        {
+            rc = true;
+            break;
+        }
+    }
+    return rc;
+}
+
+void DigitRegister15::operator = ( const DigitRegister15& data_i )
+{
+	memcpy( digitsArray, data_i.digitsArray, sizeof( data_i.digitsArray ));
+}
+
+bool DigitRegister15::operator == ( const DigitRegister15& data_i )const
+{
+	int data_cmp = memcmp(digitsArray, data_i.digitsArray,  sizeof( data_i.digitsArray));
+	bool rc = false;
+	if(data_cmp == 0)
+		rc = true;
+	return rc;
+}
+
+bool DigitRegister15::operator < ( const DigitRegister15& data_i )const
+{
+	bool rc = true;
+	if(*this == data_i)
+		rc = false;
+	else
+	{
+		for(int i=0; i<15; i++)
+		{
+			if(digitsArray[i] > data_i.digitsArray[i])
+			{
+				rc = false;
+				break;
+			}
+		}
+	}
+	return rc;
+}
+
+std::ostream& operator << ( std::ostream& os, const DigitRegister15& data_i )
+{
+	for( auto x : data_i.digitsArray )
+	{
+		if( x  != 0x0f )
+			os << x - 0x30;
+	}
+	os << "\0";	
+	return os;
+}
+
diff --git a/src/mme-app/utils/defaultMmeProcedureCtxt.cpp b/src/mme-app/utils/defaultMmeProcedureCtxt.cpp
new file mode 100644
index 0000000..590ce10
--- /dev/null
+++ b/src/mme-app/utils/defaultMmeProcedureCtxt.cpp
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <utils/defaultMmeProcedureCtxt.h>
+#include <mmeStates/defaultMmeState.h>
+
+using namespace mme;
+
+DefaultMmeProcedureCtxt::DefaultMmeProcedureCtxt()
+{
+    setNextState(DefaultMmeState::Instance());
+    setCtxtType(defaultMmeProcedure_c);
+}
+
+DefaultMmeProcedureCtxt::~DefaultMmeProcedureCtxt()
+{
+
+}
+
+DefaultMmeProcedureCtxt* DefaultMmeProcedureCtxt::Instance()
+{
+    static DefaultMmeProcedureCtxt defaultMmeProcedureCtxt;
+    return &defaultMmeProcedureCtxt;
+}
+
+
+
+
diff --git a/src/mme-app/utils/mmeCommonUtils.cpp b/src/mme-app/utils/mmeCommonUtils.cpp
new file mode 100644
index 0000000..9fc6c68
--- /dev/null
+++ b/src/mme-app/utils/mmeCommonUtils.cpp
@@ -0,0 +1,217 @@
+/*
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <utils/mmeCommonUtils.h>
+#include <controlBlock.h>
+#include <contextManager/dataBlocks.h>
+#include <contextManager/subsDataGroupManager.h>
+#include <log.h>
+#include <mme_app.h>
+#include <msgBuffer.h>
+#include <s1ap_structs.h>
+#include <utils/defaultMmeProcedureCtxt.h>
+
+using namespace mme;
+
+extern mme_config g_mme_cfg;
+
+bool MmeCommonUtils::isLocalGuti(const guti &guti_r)
+{
+	bool rc = false;
+
+	if (guti_r.mme_grp_id == g_mme_cfg.mme_group_id &&
+			guti_r.mme_code == g_mme_cfg.mme_code)
+	{
+		rc = true;
+	}
+
+	return rc;
+}
+
+uint32_t MmeCommonUtils::allocateMtmsi()
+{
+	uint32_t tmsi = 0;
+
+	while(1)
+	{
+		tmsi = rand() % 10000;
+
+		if (SubsDataGroupManager::Instance()->findCBWithmTmsi(tmsi) == -1)
+			break;
+	}
+
+	log_msg(LOG_INFO, "MTMSI allocated is %u\n", tmsi);
+
+	return tmsi;
+}
+
+AttachType MmeCommonUtils::getAttachType(UEContext* ueContext_p,
+		const struct ue_attach_info& ue_info)
+{
+	log_msg(LOG_INFO, "deriveAttachType\n");
+
+	AttachType attachType = maxAttachType_c;
+
+	if(UE_ID_IMSI(ue_info.flags))
+	{
+		log_msg(LOG_INFO, "IMSI attach received.\n");
+
+		attachType = imsiAttach_c;
+	}
+	else if (UE_ID_GUTI(ue_info.flags))
+	{
+		log_msg(LOG_INFO, "GUTI attach received. mTMSI is %u \n",
+				ue_info.mi_guti.m_TMSI);
+
+		attachType = unknownGutiAttach_c;
+
+		if (isLocalGuti(ue_info.mi_guti))
+		{
+			// The guti is allocated by this MME, check if a context exists.
+			// If the context does not exist, treat as unknown GUTI attach?
+			log_msg(LOG_INFO, "GUTI is local..");
+
+			if (ueContext_p != NULL)
+			{
+				if (ueContext_p->getMtmsi() == ue_info.mi_guti.m_TMSI)
+				{
+					log_msg(LOG_INFO, "and known\n");
+
+					attachType = knownGutiAttach_c;
+				}
+				else
+				{
+					log_msg(LOG_INFO, "mTMSI mismatches with UE context. "
+							"Treat as unknown GUTI attach\n");
+				}
+			}
+			else
+			{
+				log_msg(LOG_INFO, "UE context is null. Unknown GUTI attach triggered\n");
+			}
+
+		}
+		else
+		{
+			log_msg(LOG_INFO, "GUTI is not local..");
+		}
+	}
+	return attachType;
+}
+
+SM::ControlBlock* MmeCommonUtils::findControlBlock(cmn::utils::MsgBuffer* buf)
+{
+	SM::ControlBlock *cb = NULL;
+
+	const s1_incoming_msg_data_t* msgData_p = (s1_incoming_msg_data_t*)(buf->getDataPointer());
+	if(msgData_p == NULL)
+	{
+		log_msg(LOG_INFO, "MsgData is NULL .\n");
+		return cb;
+	}
+
+	switch (msgData_p->msg_type)
+	{
+		case attach_request:
+		{
+			const struct ue_attach_info &ue_info = (msgData_p->msg_data.ue_attach_info_m);
+			if(UE_ID_IMSI(ue_info.flags))
+			{
+				log_msg(LOG_INFO, "IMSI attach received.\n");
+
+				cb = SubsDataGroupManager::Instance()->allocateCB();
+				cb->setTempDataBlock(DefaultMmeProcedureCtxt::Instance());
+			}
+			else if (UE_ID_GUTI(ue_info.flags))
+			{
+                		log_msg(LOG_INFO, "GUTI attach received.\n");
+
+				if (isLocalGuti(ue_info.mi_guti))
+				{
+					log_msg(LOG_INFO, "GUTI is local.\n");
+
+					int cbIndex = SubsDataGroupManager::Instance()->findCBWithmTmsi(ue_info.mi_guti.m_TMSI);
+					if (cbIndex > 0)
+					{
+						cb = SubsDataGroupManager::Instance()->findControlBlock(cbIndex);
+					}
+					else
+					{
+						log_msg(LOG_ERROR, "Failed to find control block with mTmsi.\n");
+
+                        // allocate new cb and proceed?
+                        cb = SubsDataGroupManager::Instance()->allocateCB();
+                        cb->setTempDataBlock(DefaultMmeProcedureCtxt::Instance());
+					}
+				}
+                else
+                {
+                    cb = SubsDataGroupManager::Instance()->allocateCB();
+                    cb->setTempDataBlock(DefaultMmeProcedureCtxt::Instance());
+                }
+			}
+			break;
+		}
+		case service_request:
+		{
+			const struct service_req_Q_msg &service_req = (msgData_p->msg_data.service_req_Q_msg_m);
+			int cbIndex = SubsDataGroupManager::Instance()->findCBWithmTmsi(service_req.s_tmsi.m_TMSI);
+			if (cbIndex > 0)
+			{
+				cb = SubsDataGroupManager::Instance()->findControlBlock(cbIndex);
+			}
+			else
+			{
+				log_msg(LOG_INFO, "Failed to find control block with mTmsi.\n");
+			}
+
+			break;
+		}
+		case detach_request:
+		{
+			const struct detach_req_Q_msg &detach_Req = (msgData_p->msg_data.detachReq_Q_msg_m);
+			int cbIndex = SubsDataGroupManager::Instance()->findCBWithmTmsi(detach_Req.ue_m_tmsi);
+			if (cbIndex > 0)
+			{
+				cb = SubsDataGroupManager::Instance()->findControlBlock(cbIndex);
+			}
+			else
+			{
+				log_msg(LOG_INFO, "Failed to find control block with mTmsi. %d\n", detach_Req.ue_m_tmsi);
+			}
+			break;
+		}
+		case tau_request:
+		{
+			cb = SubsDataGroupManager::Instance()->findControlBlock(msgData_p->ue_idx);
+
+			if (cb == NULL)
+				log_msg(LOG_INFO, "Failed to retrieve CB using idx %d.\n", msgData_p->ue_idx);
+
+			break;
+		}
+		default:
+		{
+			log_msg(LOG_INFO, "Unhandled message is NULL .\n");
+		}
+	}
+
+	return cb;
+}
+
+
+
+
diff --git a/src/mme-app/utils/mmeContextManagerUtils.cpp b/src/mme-app/utils/mmeContextManagerUtils.cpp
new file mode 100644
index 0000000..933600a
--- /dev/null
+++ b/src/mme-app/utils/mmeContextManagerUtils.cpp
@@ -0,0 +1,248 @@
+/*
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <controlBlock.h>
+#include <contextManager/subsDataGroupManager.h>
+#include <log.h>
+#include <utils/mmeContextManagerUtils.h>
+
+using namespace mme;
+
+bool MmeContextManagerUtils::deleteProcedureCtxt(MmeProcedureCtxt* procedure_p)
+{
+	log_msg(LOG_DEBUG, "deleteProcedureCtxt: Entry");
+
+	if (procedure_p == NULL)
+	{
+		log_msg(LOG_INFO, "Procedure Context is NULL");
+
+		return false;
+	}
+
+	SubsDataGroupManager* subsDgMgr_p = SubsDataGroupManager::Instance();
+
+	log_msg(LOG_INFO, "Procedure Type is %d", procedure_p->getCtxtType());
+
+	bool rc = true;
+	switch (procedure_p->getCtxtType())
+	{
+		case attach_c:
+		case s1Release_c:
+		{
+			subsDgMgr_p->deleteMmeProcedureCtxt(procedure_p);
+			break;
+		}
+		case detach_c:
+		{
+			MmeDetachProcedureCtxt* detachProc_p = 
+				static_cast<MmeDetachProcedureCtxt *>(procedure_p);
+
+			subsDgMgr_p->deleteMmeDetachProcedureCtxt(detachProc_p);
+
+			break;
+		}
+		case serviceRequest_c:
+		{
+			MmeSvcReqProcedureCtxt* svcReqProc_p =
+					static_cast<MmeSvcReqProcedureCtxt*>(procedure_p);
+
+			subsDgMgr_p->deleteMmeSvcReqProcedureCtxt(svcReqProc_p);
+
+			break;
+		}
+		case tau_c:
+		{
+			MmeTauProcedureCtxt* tauProc_p =
+					static_cast<MmeTauProcedureCtxt*>(procedure_p);
+
+			subsDgMgr_p->deleteMmeTauProcedureCtxt(tauProc_p);
+
+			break;
+		}
+		default:
+		{
+			log_msg(LOG_INFO, "Unsupported procedure type %d\n", procedure_p->getCtxtType());
+			rc = false;
+		}
+	}
+	return rc;
+}
+
+bool MmeContextManagerUtils::deallocateProcedureCtxt(SM::ControlBlock& cb_r, ProcedureType procType)
+{
+    bool rc = false;
+
+	MmeProcedureCtxt* procedure_p =
+			static_cast<MmeProcedureCtxt*>(cb_r.getTempDataBlock());
+
+	MmeProcedureCtxt* prevProcedure_p = NULL;
+	MmeProcedureCtxt* nextProcedure_p = NULL;
+
+    while (procedure_p != NULL)
+    {
+        nextProcedure_p =
+            static_cast<MmeProcedureCtxt*>(procedure_p->getNextTempDataBlock());
+        
+        ProcedureType procedureType = procedure_p->getCtxtType();
+        if (procType == procedureType)
+        {
+            log_msg(LOG_INFO, "Procedure type %d\n", procedureType);
+            
+            rc = deleteProcedureCtxt(procedure_p);
+            
+            if (rc == true)
+            {
+                if (prevProcedure_p != NULL)
+                {
+                    if (nextProcedure_p != NULL)
+                    {
+                        prevProcedure_p->setNextTempDataBlock(nextProcedure_p);
+                    }
+                }
+                else
+                {
+                    cb_r.setTempDataBlock(nextProcedure_p);
+                }
+            }
+            // break out of while loop
+            break;
+        }
+        prevProcedure_p = procedure_p;
+        procedure_p = nextProcedure_p;		
+    }
+
+    return rc;
+}
+
+bool MmeContextManagerUtils::deallocateAllProcedureCtxts(SM::ControlBlock& cb_r)
+{
+    bool rc = false;
+
+    MmeProcedureCtxt* procedure_p =
+    		static_cast<MmeProcedureCtxt*>(cb_r.getTempDataBlock());
+    
+    MmeProcedureCtxt* nextProcedure_p = NULL;
+    
+    while (procedure_p != NULL)
+    {
+        nextProcedure_p =
+    		static_cast<MmeProcedureCtxt*>(procedure_p->getNextTempDataBlock());
+    
+        if (procedure_p->getCtxtType() != defaultMmeProcedure_c)
+        {
+            rc = deleteProcedureCtxt(procedure_p);
+        }
+
+        procedure_p = nextProcedure_p;
+    }
+    return rc;
+}
+
+MmeProcedureCtxt* MmeContextManagerUtils::findProcedureCtxt(SM::ControlBlock& cb_r, ProcedureType procType)
+{
+    MmeProcedureCtxt* mmeProcCtxt_p = NULL;
+
+    MmeProcedureCtxt* currentProcedure_p =
+                static_cast<MmeProcedureCtxt*>(cb_r.getTempDataBlock());
+
+    MmeProcedureCtxt* nextProcedure_p = NULL;
+
+    while (currentProcedure_p != NULL)
+    {
+        nextProcedure_p = static_cast<MmeProcedureCtxt*>(
+                currentProcedure_p->getNextTempDataBlock());
+
+        if (currentProcedure_p->getCtxtType() == procType)
+        {
+            mmeProcCtxt_p = currentProcedure_p;
+            break;
+        }
+        currentProcedure_p = nextProcedure_p;
+    }
+
+    return mmeProcCtxt_p;
+}
+
+void MmeContextManagerUtils::deleteSessionContext(SM::ControlBlock& cb_r)
+{
+    UEContext* ueCtxt_p = static_cast<UEContext *>(cb_r.getPermDataBlock());
+    if (ueCtxt_p == NULL)
+    {
+        log_msg(LOG_DEBUG, "Failed to retrieve UEContext from control block %u", cb_r.getCBIndex());
+        return;
+    }
+
+    SessionContext* sessCtxt_p = ueCtxt_p->getSessionContext();
+    if (sessCtxt_p == NULL)
+    {
+        log_msg(LOG_DEBUG, "Failed to retrieve SessionContext from UEContext %u", cb_r.getCBIndex());
+        return;
+    }
+
+    BearerContext* bearerCtxt_p = sessCtxt_p->getBearerContext();
+    if(bearerCtxt_p != NULL)
+    {
+        log_msg(LOG_INFO, "Deallocating bearer context for UE block %u", cb_r.getCBIndex());
+
+        SubsDataGroupManager::Instance()->deleteBearerContext(bearerCtxt_p);
+        sessCtxt_p->setBearerContext(NULL);
+    }
+
+    log_msg(LOG_INFO, "Deallocating session context for UE block %u", cb_r.getCBIndex());
+
+    SubsDataGroupManager::Instance()->deleteSessionContext(sessCtxt_p);
+    ueCtxt_p->setSessionContext(NULL);
+}
+
+void MmeContextManagerUtils::deleteUEContext(uint32_t cbIndex)
+{
+    SM::ControlBlock* cb_p = SubsDataGroupManager::Instance()->findControlBlock(cbIndex);
+    if (cb_p == NULL)
+    {
+        log_msg(LOG_DEBUG, "Failed to find control block for index %u", cbIndex);
+        return;
+    }
+
+    deallocateAllProcedureCtxts(*cb_p);
+
+    deleteSessionContext(*cb_p);
+
+    UEContext* ueCtxt_p = static_cast<UEContext *>(cb_p->getPermDataBlock());
+    if (ueCtxt_p == NULL)
+    {
+        log_msg(LOG_DEBUG, "Failed to retrieve UEContext from control block %u", cbIndex);
+    }
+    else
+    {
+        MmContext* mmContext_p = ueCtxt_p->getMmContext();
+        if (mmContext_p != NULL)
+        {
+            SubsDataGroupManager::Instance()->deleteMmContext(mmContext_p);
+            ueCtxt_p->setMmContext(NULL);
+        }
+
+        // Remove IMSI -> CBIndex key mapping
+        const DigitRegister15& ue_imsi = ueCtxt_p->getImsi();
+        SubsDataGroupManager::Instance()->deleteimsikey(ue_imsi);
+
+        // Remove mTMSI -> CBIndex mapping
+        SubsDataGroupManager::Instance()->deletemTmsikey(ueCtxt_p->getMtmsi());
+
+        SubsDataGroupManager::Instance()->deleteUEContext(ueCtxt_p);
+    }
+
+    SubsDataGroupManager::Instance()->deAllocateCB(cb_p->getCBIndex());
+}
diff --git a/src/mmeGrpcClient/Makefile b/src/mmeGrpcClient/Makefile
new file mode 100644
index 0000000..3541654
--- /dev/null
+++ b/src/mmeGrpcClient/Makefile
@@ -0,0 +1,43 @@
+#
+# Copyright (c) 2019, Infosys Ltd.
+#
+# 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.
+#
+
+include ../../Makefile.common
+
+CFLAGS := -Wall -I$(GRPC_ROOT)/include -I$(GRPC_ROOT)/third_party/protobuf/src -std=c++11
+LDFLAGS := -L$(GRPC_ROOT)/libs/opt -lgrpc++ -lgrpc -lgpr -L$(GRPC_ROOT)/libs/opt/protobuf -lprotobuf
+
+SRCDIR := .
+SRCS := ./mmeGrpcClient.cpp
+OBJS := $(patsubst $(SRCDIR)/%,$(OBJDIR)/mmeGrpcClient/%,$(SRCS:.cpp=.o))
+
+TARGET := $(BINDIR)/mme-grpc-client
+
+all: $(TARGET)
+
+$(TARGET) : $(OBJS) 
+	@mkdir -p $(BINDIR)
+	g++ -o $(TARGET) $(OBJS) $(LIB_PATH) -lmmeGrpcProtoBuf $(LDFLAGS)
+	
+$(OBJS) : $(OBJDIR)/mmeGrpcClient/%.o : $(SRCDIR)/%.cpp
+	-@mkdir -p $(OBJDIR)/mmeGrpcClient
+	g++ $(CFLAGS) $(INC_DIRS) -c -o $@ $<
+
+install :
+	-@mkdir -p $(TARGET_DIR)/bin
+	-@cp $(TARGET) $(TARGET_DIR)/bin
+
+clean:
+	-@rm -rf $(OBJDIR)/mmeGrpcClient $(TARGET)
diff --git a/src/mmeGrpcClient/mmeGrpcClient.cpp b/src/mmeGrpcClient/mmeGrpcClient.cpp
new file mode 100644
index 0000000..37d7814
--- /dev/null
+++ b/src/mmeGrpcClient/mmeGrpcClient.cpp
@@ -0,0 +1,291 @@
+/*
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <iostream>
+#include <memory>
+#include <string>
+#include <sstream>
+#include <time.h>
+#include <grpcpp/grpcpp.h>
+#include <google/protobuf/text_format.h>
+#include <../mmeGrpcProtos/mmeGrpc.grpc.pb.h>
+
+using grpc::Channel;
+using grpc::ClientContext;
+using grpc::ClientReader;
+using grpc::ClientReaderWriter;
+using grpc::ClientWriter;
+using grpc::Status;
+using mmeGrpc::UeContextReqBuf;
+using mmeGrpc::UeContextRespBuf;
+using mmeGrpc::UeContextRespBuf_SessionContextRespBuf;
+using mmeGrpc::MmeGrpcCli;
+using mmeGrpc::Empty;
+using mmeGrpc::ProcedureStatsRespBuf;
+using mmeGrpc::EventInfoRespBuf;
+using mmeGrpc::EventInfoRespBuf_EventInfoBuf;
+
+using namespace std;
+
+class MmeGrpcCliClient {
+ public:
+  MmeGrpcCliClient(std::shared_ptr<Channel> channel)
+      : stub_(MmeGrpcCli::NewStub(channel)) {}
+
+  // Assembles the client's payload, sends it and presents the response back
+  // from the server.
+  void GetUeContext(const int32_t id) {
+    // Data we are sending to the server.
+    UeContextReqBuf request;
+    request.set_id(id);
+
+    // Container for the data we expect from the server.
+    UeContextRespBuf reply;
+
+    // Context for the client. It could be used to convey extra information to
+    // the server and/or tweak certain RPC behaviors.
+    ClientContext context;
+
+    // The actual RPC.
+    Status status = stub_->GetUeContext(&context, request, &reply);
+
+    // Act upon its status.
+    if (status.ok()) {
+
+	    /*std::string textString;
+	    google::protobuf::TextFormat::PrintToString(reply, &textString);
+	    std::cout << textString << std::endl;
+		*/
+	    cout << "-----mobile context----- " << id << endl; 
+	    cout << "IMSI               " << reply.imsi() << endl;
+	    cout << "MSISDN             " << reply.msisdn() << endl;
+	    cout << "TAI                " << reply.tai() << endl;
+	    cout << "EUTRAN CGI         " << reply.eutran_cgi() << endl;
+	    cout << "Context ID         " << reply.context_id() << endl;
+	    cout << "Enb UE s1ap Teid   " << reply.enb_ue_s1ap_id() << endl;
+	    cout << "UE State           " << reply.ue_state() << endl;
+	    
+	    int sessioncontext_size=reply.sessioncontext_size();	    
+	    for(int i=0;i<sessioncontext_size;i++)
+	    {
+	    	const UeContextRespBuf_SessionContextRespBuf& sessioncontext = reply.sessioncontext(i);
+
+		cout << "-----session context------ " << i+1 << endl;
+		cout << "	apn                     " << sessioncontext.apn() << endl;
+		cout << " 	PDN address             " << sessioncontext.pdn_address() << endl;
+		cout << " 	Bearer ID               " << sessioncontext.bearer_id() << endl;
+		cout << "	s11 sgw gtpc teid       " << sessioncontext.s11_sgw_gtpc_teid() << endl;
+		cout << "	s5 pgw gtpc teid        " << sessioncontext.s5_pgw_gtpc_teid() << endl;
+		cout << "	s1u enb teid            " << sessioncontext.s1u_enb_teid() << endl;
+		cout << "	s1u sgw teid            " << sessioncontext.s1u_sgw_teid() << endl;
+		cout << "	s5u pgw teid            " << sessioncontext.s5u_pgw_teid() << endl;
+	    }
+
+    } else {
+      std::cout << status.error_code() << ": " << status.error_message()
+                << std::endl;
+    }
+  }
+
+  void ShowAllMobileContexts() {
+     UeContextRespBuf reply;
+
+     Empty request;
+     ClientContext context;
+
+     std::unique_ptr<ClientReader<UeContextRespBuf> > reader(
+                stub_->ShowAllMobileContexts(&context, request));
+
+     while (reader->Read(&reply))
+     {
+            cout << "-----mobile context----- " << endl;
+            cout << "IMSI               " << reply.imsi() << endl;
+            cout << "MSISDN             " << reply.msisdn() << endl;
+            cout << "TAI                " << reply.tai() << endl;
+            cout << "EUTRAN CGI         " << reply.eutran_cgi() << endl;
+            cout << "Context ID         " << reply.context_id() << endl;
+            cout << "Enb UE s1ap Teid   " << reply.enb_ue_s1ap_id() << endl;
+            cout << "UE State           " << reply.ue_state() << endl;
+
+            int sessioncontext_size=reply.sessioncontext_size();
+            for(int i=0;i<sessioncontext_size;i++)
+            {
+                const UeContextRespBuf_SessionContextRespBuf& sessioncontext = reply.sessioncontext(i);
+
+                cout << "-----session context------ " << i+1 << endl;
+                cout << "       apn                     " << sessioncontext.apn() << endl;
+                cout << "       PDN address             " << sessioncontext.pdn_address() << endl;
+                cout << "       Bearer ID               " << sessioncontext.bearer_id() << endl;
+                cout << "       s11 sgw gtpc teid       " << sessioncontext.s11_sgw_gtpc_teid() << endl;
+                cout << "       s5 pgw gtpc teid        " << sessioncontext.s5_pgw_gtpc_teid() << endl;
+                cout << "       s1u enb teid            " << sessioncontext.s1u_enb_teid() << endl;
+                cout << "       s1u sgw teid            " << sessioncontext.s1u_sgw_teid() << endl;
+                cout << "       s5u pgw teid            " << sessioncontext.s5u_pgw_teid() << endl;
+            }
+
+     }
+     Status status = reader->Finish();
+     if (status.ok()) {
+              std::cout << "show all mobile-contexts rpc succeeded." << std::endl;
+     } else {
+              std::cout << "show all mobile-contexts rpc failed." << std::endl;
+     }
+  }
+
+
+  void GetProcStats(){
+    // Container for the data we expect from the server.
+    ProcedureStatsRespBuf reply;
+
+    Empty request;
+
+    // Context for the client. It could be used to convey extra information to
+    // the server and/or tweak certain RPC behaviors.
+    ClientContext context;
+    // The actual RPC.
+    Status status = stub_->GetProcStats(&context, request, &reply);
+
+    // Act upon its status.
+    if (status.ok()) {
+            cout << endl << "-----procedure stats-----" << endl;
+	        cout << "num_of_subs_attached                    " << reply.num_of_subscribers_attached() << endl;
+            cout << "num_of_air_sent                         " << reply.num_of_air_sent() << endl;
+			cout << "num_of_ulr_sent                         " << reply.num_of_ulr_sent() << endl;
+            cout << "num_of_processed_aia                    " << reply.num_of_processed_aia() << endl;
+            cout << "num_of_processed_ula                    " << reply.num_of_processed_ula() << endl;
+            cout << "num_of_auth_req_to_ue_sent              " << reply.num_of_auth_req_to_ue_sent() << endl;
+            cout << "num_of_processed_auth_response          " << reply.num_of_processed_auth_response() << endl;
+            cout << "num_of_sec_mode_cmd_to_ue_sent          " << reply.num_of_sec_mode_cmd_to_ue_sent() << endl;
+            cout << "num_of_processed_sec_mode_resp          " << reply.num_of_processed_sec_mode_resp() << endl;
+            cout << "num_of_esm_info_req_to_ue_sent          " << reply.num_of_esm_info_req_to_ue_sent() << endl;
+            cout << "num_of_handled_esm_info_resp            " << reply.num_of_handled_esm_info_resp() << endl;
+            cout << "num_of_cs_req_to_sgw_sent               " << reply.num_of_cs_req_to_sgw_sent() << endl;
+            cout << "num_of_processed_cs_resp                " << reply.num_of_processed_cs_resp() << endl;
+            cout << "num_of_init_ctxt_req_to_ue_sent         " << reply.num_of_init_ctxt_req_to_ue_sent() << endl;
+            cout << "num_of_processed_init_ctxt_resp         " << reply.num_of_processed_init_ctxt_resp() << endl;
+            cout << "num_of_mb_req_to_sgw_sent               " << reply.num_of_mb_req_to_sgw_sent() << endl;
+            cout << "num_of_processed_attach_cmp_from_ue     " << reply.num_of_processed_attach_cmp_from_ue() << endl;
+            cout << "num_of_processed_mb_resp                " << reply.num_of_processed_mb_resp() << endl;
+            cout << "num_of_attach_done                      " << reply.num_of_attach_done() << endl;
+            cout << "num_of_del_session_req_sent             " << reply.num_of_del_session_req_sent() << endl;
+            cout << "num_of_purge_req_sent                   " << reply.num_of_purge_req_sent() << endl;
+            cout << "num_of_processed_del_session_resp       " << reply.num_of_processed_del_session_resp() << endl;
+            cout << "num_of_processed_pur_resp               " << reply.num_of_processed_pur_resp() << endl;
+            cout << "num_of_detach_accept_to_ue_sent         " << reply.num_of_detach_accept_to_ue_sent() << endl;
+            cout << "num_of_processed_detach_accept          " << reply.num_of_processed_detach_accept() << endl;
+            cout << "num_of_ue_ctxt_release                  " << reply.num_of_ue_ctxt_release() << endl;
+            cout << "num_of_processed_ctxt_rel_resp          " << reply.num_of_processed_ctxt_rel_resp() << endl;
+ 	    cout << "num_of_rel_access_bearer_req_sent       " << reply.num_of_rel_access_bearer_req_sent() << endl;											    cout << "num_of_rel_access_bearer_resp_received  " << reply.num_of_rel_access_bearer_resp_received() << endl;
+	    cout << "num_of_s1_rel_req_received              " << reply.num_of_s1_rel_req_received() << endl;
+	    cout << "num_of_s1_rel_cmd_sent                  " << reply.num_of_s1_rel_cmd_sent() << endl;
+	    cout << "num_of_s1_rel_comp_received             " << reply.num_of_s1_rel_comp_received() << endl;
+	    cout << "num_of_clr_received                     " << reply.num_of_clr_received() << endl;
+	    cout << "num_of_cla_sent                         " << reply.num_of_cla_sent() << endl;
+	    cout << "num_of_detach_req_to_ue_sent            " << reply.num_of_detach_req_to_ue_sent() << endl;
+	    cout << "num_of_detach_accept_from_ue            " << reply.num_of_detach_accept_from_ue() << endl;
+	    cout << "total_num_of_subscribers                " << reply.total_num_of_subscribers() << endl;
+	    cout << "num_of_subscribers_detached             " << reply.num_of_subscribers_detached() << endl;
+	    cout << "num_of_tau_response_to_ue_sent          " << reply.num_of_tau_response_to_ue_sent() << endl;
+
+    } else {
+      std::cout << status.error_code() << ": " << status.error_message()
+                << std::endl;
+    }
+  }
+
+  void GetDebugUeContext(const int32_t id){
+    // Container for the data we expect from the server.
+    EventInfoRespBuf reply;
+
+    UeContextReqBuf request;
+    request.set_id(id);
+
+    // Context for the client. It could be used to convey extra information to
+    // the server and/or tweak certain RPC behaviors.
+    ClientContext context;
+    // The actual RPC.
+    Status status = stub_->GetDebugUeContext(&context, request, &reply);
+
+    // Act upon its status.
+    if (status.ok())
+    {
+	    int event_info_buf_size=reply.eventinfo_size();
+	    cout << "EVENT\t\t\t\t\t\tSTATE\t\t\t\t\t\tTIMESTAMP" << endl;
+	    cout << "-----------------------------------------------------------------" << endl;
+	    for(int i=0; i<event_info_buf_size; i++)
+	    {
+		    const EventInfoRespBuf_EventInfoBuf& event_info=reply.eventinfo(i);
+
+		    cout << event_info.event() <<  "\t\t\t\t\t\t"
+		         << event_info.state()  << "\t\t\t\t\t\t"
+		         << event_info.time() << endl;
+	    }
+    } else {
+      cout << status.error_code() << ": " << status.error_message() << endl;
+    }
+  }
+
+
+ private:
+  std::unique_ptr<MmeGrpcCli::Stub> stub_;
+};
+
+int main(int argc, char** argv) {
+  // Instantiate the client. It requires a channel, out of which the actual RPCs
+  // are created. This channel models a connection to an endpoint (in this case,
+  // localhost at port 50051). We indicate that the channel isn't authenticated
+  // (use of InsecureChannelCredentials()).
+
+  if((0==strcmp(argv[1],"mme-app"))&&(0==strcmp(argv[2],"show"))&&(0==strcmp(argv[3],"mobile-context")))
+  {
+  	MmeGrpcCliClient MmeGrpcCli(grpc::CreateChannel(
+      		"localhost:50051", grpc::InsecureChannelCredentials()));
+	stringstream sid;
+	sid << argv[4];
+  	int32_t id = 1;
+	sid >> id;
+
+  	MmeGrpcCli.GetUeContext(id);
+  }
+  else if((0==strcmp(argv[1],"mme-app"))&&(0==strcmp(argv[2],"show"))&&(0==strcmp(argv[3],"procedure-stats")))
+  {
+	MmeGrpcCliClient MmeGrpcCli(grpc::CreateChannel(
+                "localhost:50051", grpc::InsecureChannelCredentials()));
+
+        MmeGrpcCli.GetProcStats();
+  }
+ else if((0==strcmp(argv[1],"mme-app"))&&(0==strcmp(argv[2],"show"))&&(0==strcmp(argv[3],"mobile-contexts-all")))
+  {
+        MmeGrpcCliClient MmeGrpcCli(grpc::CreateChannel(
+                "localhost:50051", grpc::InsecureChannelCredentials()));
+
+        MmeGrpcCli.ShowAllMobileContexts();
+  }
+
+  else if((0==strcmp(argv[1],"mme-app"))&&(0==strcmp(argv[2],"debug"))&&(0==strcmp(argv[3],"show")) &&(0==strcmp(argv[4],"mobile-context")))
+  {
+  	MmeGrpcCliClient MmeGrpcCli(grpc::CreateChannel(
+                "localhost:50051", grpc::InsecureChannelCredentials()));
+        stringstream sid;
+        sid << argv[5];
+        int32_t id = 1;
+        sid >> id;
+	cout << endl << "-----debug mobile context----- " << id << endl;
+	MmeGrpcCli.GetUeContext(id);
+	MmeGrpcCli.GetDebugUeContext(id);
+  }
+  return 0;
+}
diff --git a/src/mmeGrpcProtos/Makefile b/src/mmeGrpcProtos/Makefile
new file mode 100644
index 0000000..158249f
--- /dev/null
+++ b/src/mmeGrpcProtos/Makefile
@@ -0,0 +1,50 @@
+#
+# Copyright (c) 2019, Infosys Ltd.
+#
+# 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.
+#
+include ../../Makefile.common
+
+CC := g++
+CFLAGS = -Wall -I$(GRPC_ROOT)/include -I$(GRPC_ROOT)/third_party/protobuf/src -std=c++11
+LDFLAGS = -L$(GRPC_ROOT)/libs/opt -lgrpc++ -lgrpc -lgpr -L$(GRPC_ROOT)/libs/opt/protobuf -lprotobuf
+
+SRCS := ./mmeGrpc.grpc.pb.cc \
+        ./mmeGrpc.pb.cc
+
+SRCDIR := .
+OBJECTS := $(patsubst $(SRCDIR)/%,$(OBJDIR)/mmeGrpcProtos/%,$(SRCS:.cc=.o))
+
+MMEGRPC_PROTOBUF_LIB = $(LIBDIR)/libmmeGrpcProtoBuf.so
+
+all :  mmeGrpc.pb.h $(MMEGRPC_PROTOBUF_LIB)
+
+mmeGrpc.pb.h : mmeGrpc.proto
+	$(GRPC_ROOT)/bins/opt/protobuf/protoc --cpp_out=. --grpc_out=. --plugin=protoc-gen-grpc=$(GRPC_ROOT)/bins/opt/grpc_cpp_plugin mmeGrpc.proto
+
+
+$(MMEGRPC_PROTOBUF_LIB) : $(OBJECTS)
+	@echo "Linking..."
+	-@mkdir -p $(LIBDIR)
+	$(CC) $(CFLAGS) $(OBJECTS) -shared -o $(MMEGRPC_PROTOBUF_LIB)
+
+$(OBJECTS) : $(OBJDIR)/mmeGrpcProtos/%.o : $(SRCDIR)/%.cc
+	-@mkdir -p $(OBJDIR)/mmeGrpcProtos
+	$(CC) $(CFLAGS) $(INC_DIRS) -fPIC -c -o $@ $<
+
+install:
+	-@mkdir -p $(TARGET_DIR)/lib
+	-@cp $(MMEGRPC_PROTOBUF_LIB) $(TARGET_DIR)/lib
+clean:
+	@echo "Cleaning..."
+	-@rm -rf $(MMEGRPC_PROTOBUF_LIB) $(OBJDIR)/mmeGrpcProtos  *.pb.cc *.pb.h
diff --git a/src/mmeGrpcProtos/mmeGrpc.proto b/src/mmeGrpcProtos/mmeGrpc.proto
new file mode 100644
index 0000000..9704d62
--- /dev/null
+++ b/src/mmeGrpcProtos/mmeGrpc.proto
@@ -0,0 +1,105 @@
+syntax = "proto3";
+
+package mmeGrpc;
+
+service MmeGrpcCli 
+{
+	rpc GetUeContext(UeContextReqBuf) returns(UeContextRespBuf) {}
+	rpc GetDebugUeContext(UeContextReqBuf) returns(EventInfoRespBuf) {}
+	rpc GetProcStats(Empty) returns(ProcedureStatsRespBuf) {}
+	rpc ShowAllMobileContexts(Empty) returns(stream UeContextRespBuf) {}
+
+}
+
+message UeContextReqBuf 
+{
+	int32 id = 1;
+}
+
+message UeContextRespBuf 
+{
+        string		IMSI = 1;
+	string		MSISDN = 2;
+	string		TAI = 3;
+	string		EUTRAN_CGI = 4;
+	uint32		CONTEXT_ID = 5;
+	int32		ENB_UE_S1AP_ID = 6;
+	string          UE_STATE = 7;
+	
+	message SessionContextRespBuf 
+	{
+		string		APN = 1;
+		string		PDN_ADDRESS = 2;
+		uint32		BEARER_ID = 3;
+		string		S11_SGW_GTPC_TEID = 4;
+		string		S5_PGW_GTPC_TEID = 5;
+		string		S1U_ENB_TEID = 6;
+		string		S1U_SGW_TEID = 7;
+		string		S5U_PGW_TEID = 8;
+	}
+	
+	repeated SessionContextRespBuf SessionContext = 8;
+}
+
+message EventInfoRespBuf
+{
+	string UE_STATE = 1;
+
+	message EventInfoBuf
+	{
+		string          EVENT = 1;
+		string          STATE = 2;
+		string          TIME = 3;
+	}
+
+       repeated EventInfoBuf EventInfo = 2;
+}
+
+message ProcedureStatsRespBuf
+{
+	uint32 num_of_air_sent = 1;
+	uint32 num_of_ulr_sent = 2;
+	uint32 num_of_processed_aia = 3;
+	uint32 num_of_processed_ula = 4;
+	uint32 num_of_auth_req_to_ue_sent = 5;
+	uint32 num_of_processed_auth_response = 6;
+	uint32 num_of_sec_mode_cmd_to_ue_sent = 7;
+	uint32 num_of_processed_sec_mode_resp = 8;
+	uint32 num_of_esm_info_req_to_ue_sent = 9;
+	uint32 num_of_handled_esm_info_resp = 10;
+	uint32 num_of_cs_req_to_sgw_sent = 11;
+	uint32 num_of_processed_cs_resp = 12;
+	uint32 num_of_init_ctxt_req_to_ue_sent = 13;
+	uint32 num_of_processed_init_ctxt_resp = 14;
+	uint32 num_of_mb_req_to_sgw_sent = 15;
+	uint32 num_of_processed_attach_cmp_from_ue = 16;
+	uint32 num_of_processed_mb_resp = 17;
+	uint32 num_of_attach_done = 18;
+	uint32 num_of_del_session_req_sent = 19;
+	uint32 num_of_purge_req_sent = 20;
+	uint32 num_of_processed_del_session_resp = 21;
+	uint32 num_of_processed_pur_resp = 22;
+	uint32 num_of_detach_accept_to_ue_sent = 23;
+	uint32 num_of_processed_detach_accept = 24;
+	uint32 num_of_ue_ctxt_release = 25;
+	uint32 num_of_processed_ctxt_rel_resp = 26;
+	uint32 num_of_subscribers_attached =27;
+	uint32 num_of_rel_access_bearer_req_sent =28;
+	uint32 num_of_rel_access_bearer_resp_received =29;
+	uint32 num_of_s1_rel_req_received =30;
+	uint32 num_of_s1_rel_cmd_sent =31;
+	uint32 num_of_s1_rel_comp_received =32;
+	uint32 num_of_clr_received =33;
+	uint32 num_of_cla_sent =34;
+	uint32 num_of_detach_req_to_ue_sent =35;
+	uint32 num_of_detach_accept_from_ue =36;
+	uint32 total_num_of_subscribers =37;
+	uint32 num_of_subscribers_detached =38;
+	uint32 num_of_tau_response_to_ue_sent =39;
+
+	
+}
+
+message Empty
+{
+}
diff --git a/src/s11/Makefile b/src/s11/Makefile
new file mode 100644
index 0000000..c7a11c4
--- /dev/null
+++ b/src/s11/Makefile
@@ -0,0 +1,72 @@
+#
+# Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+# Copyright (c) 2017 Intel Corporation
+#
+# 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.
+#
+include ../../Makefile.common
+
+LIB_PATH +=-L../common/
+
+SRCDIR := .
+TARGET := $(BINDIR)/s11-app
+S11_JSON = s11.json
+
+SRCEXT := c
+
+SOURCES := $(shell find $(SRCDIR) -type f -name '*.$(SRCEXT)')
+
+OBJECTS := $(patsubst $(SRCDIR)/%,$(OBJDIR)/s11/%,$(SOURCES:.$(SRCEXT)=.o))
+
+CFLAGS += -Wall
+
+ifeq ($(DEBUG),true)
+	CFLAGS += -g
+endif
+
+ifeq ($(DEBUG),false)
+	CFLAGS += -O3
+endif
+
+LIBS := \
+        -lpthread \
+	-lthreadpool \
+        -lsctp \
+	-lgtpV2Codec \
+	-lcmnUtils \
+	-linterface \
+	-llog \
+	-ljson 
+
+$(TARGET): $(OBJECTS)
+	@echo " Linking..."
+	@mkdir -p $(BINDIR)
+	g++ $(LFLAGS) $^ -o $(TARGET) $(LIB_PATH) $(LIBS)
+
+$(OBJDIR)/s11/%.o: $(SRCDIR)/%.$(SRCEXT)
+	@mkdir -p $(OBJDIR)/s11/handlers
+	$(CC) $(CFLAGS) $(INC_DIRS) -c -o $@ $<
+
+all:$(TARGET)
+
+clean:
+	@echo " Cleaning...";
+	@rm -rf $(OBJDIR)/s11 $(TARGET)
+
+install:
+	@mkdir -p $(TARGET_DIR)/bin/
+	-@cp $(TARGET) $(TARGET_DIR)/bin/
+	-@cp conf/$(S11_JSON) $(TARGET_DIR)/conf/
+
+.PHONY: clean
+
diff --git a/src/s11/conf/s11.json b/src/s11/conf/s11.json
new file mode 100644
index 0000000..48ecf11
--- /dev/null
+++ b/src/s11/conf/s11.json
@@ -0,0 +1,37 @@
+{
+	"mme": {
+		"ip_addr": "192.168.1.55",
+		"name": "vmmestandalone",
+		"group_id": 1,
+		"code": 1,
+		"__comment__": "Here is comment",
+		"mcc": {
+			"dig1": 2,
+			"dig2": 0,
+			"dig3": 8
+		},
+		"mnc": {
+			"dig1": 0,
+			"dig2": 1,
+			"dig3": -1
+		}
+	},
+	"s1ap": {
+		"s1ap_local_addr": "192.168.1.55",
+		"sctp_port": 36412,
+		"enb_addr": "127.0.0.1",
+		"enb_port": 5003,
+		"egtp_default_hostname": "sutlej.ccin.ccpu.com"
+	},
+	"s11": {
+		"egtp_local_addr": "192.168.1.55",
+		"egtp_default_port": 2123,
+		"sgw_addr": "127.0.0.1",
+		"pgw_addr": "192.168.1.105"
+	},
+	"s6a": {
+		"host_type": "freediameter",
+		"host": "hss.openair4G.eur",
+		"realm": "openair4G.eur"
+	}
+}
diff --git a/src/s11/gtpv2c.c b/src/s11/gtpv2c.c
new file mode 100644
index 0000000..7ec3a38
--- /dev/null
+++ b/src/s11/gtpv2c.c
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <arpa/inet.h>
+#include "gtpv2c.h"
+
+void
+set_gtpv2c_header(struct gtpv2c_header *gtpv2c_tx, uint8_t type, uint32_t teid,
+		uint32_t seq)
+{
+
+	gtpv2c_tx->gtp.message_type = type;
+
+	gtpv2c_tx->gtp.version = GTP_VERSION_GTPV2C;
+	gtpv2c_tx->gtp.piggyback = 0;
+	gtpv2c_tx->gtp.teidFlg = 1;
+	gtpv2c_tx->gtp.spare = 0;
+
+	gtpv2c_tx->teid.has_teid.teid = htonl(teid);
+	gtpv2c_tx->teid.has_teid.seq = htonl(seq) >> 8;
+	gtpv2c_tx->teid.has_teid.spare = 0;
+
+	gtpv2c_tx->gtp.len = htons(8);
+
+	return;
+}
diff --git a/src/s11/handlers/create_session_handler.c b/src/s11/handlers/create_session_handler.c
new file mode 100644
index 0000000..575a8d7
--- /dev/null
+++ b/src/s11/handlers/create_session_handler.c
@@ -0,0 +1,263 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <arpa/inet.h>
+#include <unistd.h>
+#include <string.h>
+#include <pthread.h>
+#include <errno.h>
+
+#include "log.h"
+#include "err_codes.h"
+#include "message_queues.h"
+#include "ipc_api.h"
+#include "msgType.h"
+//#include "stage5_s11_info.h"
+#include "gtpv2c.h"
+#include "gtpv2c_ie.h"
+#include "s11_config.h"
+#include "../../gtpV2Codec/gtpV2StackWrappers.h"
+
+/************************************************************************
+Current file : Stage 5 handler.
+ATTACH stages :
+	Stage 1 : IAM-->[stage1 handler]-->AIR, ULR
+	Stage 2 : AIA, ULA -->[stage2 handler]--> Auth req
+	Stage 3 : Auth resp-->[stage3 handler]-->Sec mode cmd
+	Stage 4 : sec mode resp-->[stage4 handler]-->esm infor req
+-->	Stage 5 : esm infor resp-->[stage5 handler]-->create session
+	Stage 6 : create session resp-->[stage6 handler]-->init ctx setup
+	Stage 7 : attach complete-->[stage7 handler]-->modify bearer
+**************************************************************************/
+
+/****Globals and externs ***/
+
+/*S11 CP communication parameters*/
+extern int g_s11_fd;
+extern struct sockaddr_in g_s11_cp_addr;
+extern socklen_t g_s11_serv_size;
+
+extern s11_config g_s11_cfg;
+volatile uint32_t g_s11_sequence = 1;
+
+/****Global and externs end***/
+static char buf[S11_CSREQ_STAGE5_BUF_SIZE];
+
+struct CS_Q_msg *g_csReqInfo;
+
+extern struct GtpV2Stack* gtpStack_gp;
+struct MsgBuffer*  csReqMsgBuf_p = NULL;
+
+void
+bswap8_array(uint8_t *src, uint8_t *dest, uint32_t len)
+{
+	for (uint32_t i=0; i<len; i++)
+		dest[i] = ((src[i] & 0x0F)<<4 | (src[i] & 0xF0)>>4);
+
+	return;
+}
+uint32_t
+convert_imsi_to_digits_array(uint8_t *src, uint8_t *dest, uint32_t len)
+{
+	uint8_t msb_digit = 0;
+	uint8_t lsb_digit = 0;
+	uint8_t num_of_digits = 0;
+
+	for(uint32_t i = 0; i < len; i++)
+	{
+		lsb_digit = ((src[i] & 0xF0) >> 4);
+		dest[(2*i) + 1] = lsb_digit;
+
+		msb_digit = (src[i] & 0x0F);
+		dest[2*i] = msb_digit;
+
+		if (lsb_digit != 0x0F)
+			num_of_digits = num_of_digits + 2;
+		else
+			num_of_digits++;
+	}
+
+	return num_of_digits;
+}
+
+/**
+* Stage specific message processing.
+*/
+static int
+create_session_processing(struct CS_Q_msg * g_csReqInfo)
+{
+	GtpV2MessageHeader gtpHeader;
+	gtpHeader.msgType = GTP_CREATE_SESSION_REQ;
+	gtpHeader.sequenceNumber = g_s11_sequence;
+	gtpHeader.teidPresent = true;
+	gtpHeader.teid = g_csReqInfo->ue_idx;
+	
+	g_s11_sequence++;
+	
+	log_msg(LOG_INFO,"In create session handler->ue_idx:%d\n",g_csReqInfo->ue_idx);
+
+	CreateSessionRequestMsgData msgData;
+	memset(&msgData, 0, sizeof(msgData));
+
+	msgData.imsiIePresent = true;
+	memset(msgData.imsi.imsiValue.digits, 0x0f, 16);
+	
+
+	uint8_t imsi_len =
+			convert_imsi_to_digits_array(g_csReqInfo->IMSI,
+					msgData.imsi.imsiValue.digits,
+					BINARY_IMSI_LEN);
+
+	msgData.imsi.imsiValue.length = imsi_len;
+	log_msg(LOG_INFO, "IMSI Len: %d\n", imsi_len);
+
+	msgData.msisdnIePresent = true;
+	msgData.msisdn.msisdnValue.length = 10;
+	for (uint8_t i = 1; i <= 5; i++)
+	{
+		msgData.msisdn.msisdnValue.digits[2*(i-1)] = (g_csReqInfo->MSISDN[i-1] & 0x0F);
+		msgData.msisdn.msisdnValue.digits[(2*i) - 1] = ((g_csReqInfo->MSISDN[i-1] & 0xF0) >> 4);
+	}
+
+	struct TAI *tai = &(g_csReqInfo->tai);
+	struct CGI *cgi = &(g_csReqInfo->utran_cgi);
+
+	msgData.userLocationInformationIePresent = true;
+	msgData.userLocationInformation.taipresent = true;
+	msgData.userLocationInformation.ecgipresent = true;
+
+	msgData.userLocationInformation.tai.trackingAreaCode = ntohs(tai->tac);
+	msgData.userLocationInformation.tai.mccDigit1 = tai->plmn_id.idx[0] & 0x0F;
+	msgData.userLocationInformation.tai.mccDigit2 = (tai->plmn_id.idx[0] & 0xF0) >> 4;
+	msgData.userLocationInformation.tai.mccDigit3 = tai->plmn_id.idx[1] & 0x0F;
+	msgData.userLocationInformation.tai.mncDigit1 = tai->plmn_id.idx[2] & 0x0F;
+	msgData.userLocationInformation.tai.mncDigit2 = (tai->plmn_id.idx[2] & 0xF0) >> 4;
+	msgData.userLocationInformation.tai.mncDigit3 = (tai->plmn_id.idx[1] & 0xF0) >> 4;
+
+	msgData.userLocationInformation.ecgi.eUtranCellId = ntohl(cgi->cell_id);
+	msgData.userLocationInformation.ecgi.mccDigit1 = cgi->plmn_id.idx[0] & 0x0F;
+	msgData.userLocationInformation.ecgi.mccDigit2 = (cgi->plmn_id.idx[0] & 0xF0) >> 4;
+	msgData.userLocationInformation.ecgi.mccDigit3 = cgi->plmn_id.idx[1] & 0x0F;
+	msgData.userLocationInformation.ecgi.mncDigit1 = cgi->plmn_id.idx[2] & 0x0F;
+	msgData.userLocationInformation.ecgi.mncDigit2 = (cgi->plmn_id.idx[2] & 0xF0) >> 4;
+	msgData.userLocationInformation.ecgi.mncDigit3 = (cgi->plmn_id.idx[1] & 0xF0) >> 4;
+
+	msgData.servingNetworkIePresent = true;
+	msgData.servingNetwork.mccDigit1 = tai->plmn_id.idx[0] & 0x0F;
+	msgData.servingNetwork.mccDigit2 = (tai->plmn_id.idx[0] & 0xF0) >> 4;
+	msgData.servingNetwork.mccDigit3 = tai->plmn_id.idx[1] & 0x0F;
+	msgData.servingNetwork.mncDigit1 = tai->plmn_id.idx[2] & 0x0F;
+	msgData.servingNetwork.mncDigit2 = (tai->plmn_id.idx[2] & 0xF0) >> 4;
+	msgData.servingNetwork.mncDigit3 = (tai->plmn_id.idx[1] & 0xF0) >> 4;
+
+	msgData.ratType.ratType = 6;
+
+	msgData.indicationFlagsIePresent = true;
+	msgData.indicationFlags.iDFI = true;
+	msgData.indicationFlags.iMSV = true;
+
+	msgData.senderFTeidForControlPlane.ipv4present = true;
+	msgData.senderFTeidForControlPlane.interfaceType = 10;
+	msgData.senderFTeidForControlPlane.ipV4Address.ipValue = g_s11_cfg.local_egtp_ip;
+	msgData.senderFTeidForControlPlane.teidGreKey = g_csReqInfo->ue_idx;
+
+	msgData.pgwS5S8AddressForControlPlaneOrPmipIePresent = true;
+	msgData.pgwS5S8AddressForControlPlaneOrPmip.ipv4present = true;
+	msgData.pgwS5S8AddressForControlPlaneOrPmip.interfaceType = 7;
+	msgData.pgwS5S8AddressForControlPlaneOrPmip.ipV4Address.ipValue = g_s11_cfg.pgw_ip;
+
+	msgData.accessPointName.apnValue.count = g_csReqInfo->apn.len;
+	memcpy(msgData.accessPointName.apnValue.values, g_csReqInfo->apn.val, g_csReqInfo->apn.len);
+
+	msgData.selectionModeIePresent = true;
+	msgData.selectionMode.selectionMode = 1;
+
+	msgData.pdnTypeIePresent = true;
+	msgData.pdnType.pdnType = 1;
+
+	msgData.pdnAddressAllocationIePresent = true;
+	msgData.pdnAddressAllocation.pdnType = 1;
+	msgData.pdnAddressAllocation.ipV4Address.ipValue = 0;
+
+	msgData.maximumApnRestrictionIePresent = true;
+	msgData.maximumApnRestriction.restrictionValue = 0;
+
+	/* Bearer Context */
+	msgData.bearerContextsToBeCreatedCount = 1;
+	msgData.bearerContextsToBeCreated[0].epsBearerId.epsBearerId = 5;
+
+	msgData.bearerContextsToBeCreated[0].bearerLevelQos.pci = 1;
+	msgData.bearerContextsToBeCreated[0].bearerLevelQos.pl = 11;
+	msgData.bearerContextsToBeCreated[0].bearerLevelQos.pvi = 0;
+	msgData.bearerContextsToBeCreated[0].bearerLevelQos.qci = 9;
+
+	uint32_t mbr_uplink = htonl(MBR_UPLINK);
+	uint32_t mbr_downlink = htonl(MBR_DOWNLINK);
+
+	msgData.bearerContextsToBeCreated[0].bearerLevelQos.maxBitRateUl.count = 5;
+	msgData.bearerContextsToBeCreated[0].bearerLevelQos.maxBitRateDl.count = 5;
+	memcpy(&msgData.bearerContextsToBeCreated[0].bearerLevelQos.maxBitRateUl.values, &mbr_uplink, sizeof(mbr_uplink));
+	memcpy(&msgData.bearerContextsToBeCreated[0].bearerLevelQos.maxBitRateDl.values, &mbr_downlink, sizeof(mbr_downlink));
+	msgData.bearerContextsToBeCreated[0].bearerLevelQos.guraranteedBitRateUl.count = 5;
+	msgData.bearerContextsToBeCreated[0].bearerLevelQos.guaranteedBitRateDl.count = 5;
+
+	msgData.aggregateMaximumBitRateIePresent = true;
+	msgData.aggregateMaximumBitRate.maxMbrUplink = g_csReqInfo->max_requested_bw_ul;
+	msgData.aggregateMaximumBitRate.maxMbrDownlink = g_csReqInfo->max_requested_bw_dl;
+
+	bool rc = GtpV2Stack_buildGtpV2Message(gtpStack_gp, csReqMsgBuf_p, &gtpHeader, &msgData);
+	if (rc == false)
+	{
+		log_msg(LOG_ERROR, "Failed to encode create session request\n");
+		return E_FAIL;
+	}
+
+	log_msg(LOG_INFO, "send %d bytes.\n",MsgBuffer_getBufLen(csReqMsgBuf_p));
+
+	int res = sendto (
+			g_s11_fd,
+			MsgBuffer_getDataPointer(csReqMsgBuf_p),
+			MsgBuffer_getBufLen(csReqMsgBuf_p), 0,
+			(struct sockaddr*)&g_s11_cp_addr,
+			g_s11_serv_size);
+	if (res < 0) {
+		log_msg(LOG_ERROR,"Error in sendto in detach stage 3 post to next\n");
+	}
+
+	log_msg(LOG_INFO,"%d bytes sent. Err : %d, %s\n",res,errno,
+			strerror(errno));
+
+	MsgBuffer_reset(csReqMsgBuf_p);
+
+	return SUCCESS;
+}
+
+/**
+* Thread function for stage.
+*/
+void*
+create_session_handler(void *data)
+{
+	log_msg(LOG_INFO, "Create Session Request handler\n");
+
+	create_session_processing((struct CS_Q_msg *) data);
+
+	return NULL;
+}
diff --git a/src/s11/handlers/ddn_ack_handler.c b/src/s11/handlers/ddn_ack_handler.c
new file mode 100644
index 0000000..73a459a
--- /dev/null
+++ b/src/s11/handlers/ddn_ack_handler.c
@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <arpa/inet.h>
+#include <unistd.h>
+#include <string.h>
+#include <pthread.h>
+
+#include "log.h"
+#include "err_codes.h"
+#include "message_queues.h"
+#include "ipc_api.h"
+#include "gtpv2c.h"
+#include "gtpv2c_ie.h"
+#include "msgType.h"
+#include "../../gtpV2Codec/gtpV2StackWrappers.h"
+
+
+/****Globals and externs ***/
+
+/*S11 CP communication parameters*/
+extern int g_s11_fd;
+extern struct sockaddr_in g_s11_cp_addr;
+extern socklen_t g_s11_serv_size;
+extern volatile uint32_t g_s11_sequence;
+static char buf[S11_DDN_ACK_BUF_SIZE];
+
+struct thread_pool *g_tpool;
+
+extern struct GtpV2Stack* gtpStack_gp;
+extern volatile uint32_t g_s11_sequence;
+
+struct MsgBuffer* ddnAckMsgBuf_p = NULL;
+/****Global and externs end***/
+
+/**
+* Stage specific message processing.
+*/
+static int
+ddn_ack_processing(struct DDN_ACK_Q_msg *ddn_ack_msg)
+{
+	GtpV2MessageHeader gtpHeader;
+	gtpHeader.msgType = 177;
+	gtpHeader.sequenceNumber = ddn_ack_msg->seq_no;
+	gtpHeader.teidPresent = true;
+	gtpHeader.teid = ddn_ack_msg->ue_idx;
+
+	DownlinkDataNotificationAcknowledgeMsgData msgData;
+	memset(&msgData, 0, sizeof(DownlinkDataNotificationAcknowledgeMsgData));
+
+	msgData.cause.causeValue = ddn_ack_msg->cause;
+	
+
+	GtpV2Stack_buildGtpV2Message(gtpStack_gp, ddnAckMsgBuf_p, &gtpHeader, &msgData);
+	g_s11_sequence++;
+
+	sendto(g_s11_fd,
+			MsgBuffer_getDataPointer(ddnAckMsgBuf_p),
+			MsgBuffer_getBufLen(ddnAckMsgBuf_p), 0,
+			(struct sockaddr*)&g_s11_cp_addr, g_s11_serv_size);
+	
+	log_msg(LOG_INFO, "DDN Ack Sent, len - %d bytes.\n", MsgBuffer_getBufLen(ddnAckMsgBuf_p));
+	MsgBuffer_reset(ddnAckMsgBuf_p);
+	return SUCCESS;
+}
+
+
+/**
+* Thread function for stage.
+*/
+void*
+ddn_ack_handler(void *data)
+{
+	log_msg(LOG_INFO, "DDN Ack handler initialized\n");
+    ddn_ack_processing((struct DDN_ACK_Q_msg *)data);
+	return NULL;
+}
+
diff --git a/src/s11/handlers/delete_session_handler.c b/src/s11/handlers/delete_session_handler.c
new file mode 100644
index 0000000..b7758b3
--- /dev/null
+++ b/src/s11/handlers/delete_session_handler.c
@@ -0,0 +1,104 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <arpa/inet.h>
+#include <unistd.h>
+#include <string.h>
+#include <pthread.h>
+
+#include "log.h"
+#include "err_codes.h"
+#include "message_queues.h"
+#include "ipc_api.h"
+#include "gtpv2c.h"
+#include "gtpv2c_ie.h"
+#include "msgType.h"
+#include "../../gtpV2Codec/gtpV2StackWrappers.h"
+/************************************************************************
+Current file : Stage 1 handler.
+ATTACH stages :
+	Stage 1 : detach request -->delete session
+**************************************************************************/
+
+/****Globals and externs ***/
+
+/*S11 CP communication parameters*/
+extern int g_s11_fd;
+extern struct sockaddr_in g_s11_cp_addr;
+extern socklen_t g_s11_serv_size;
+extern volatile uint32_t g_s11_sequence;
+static char buf[S11_DTCHREQ_STAGE1_BUF_SIZE];
+
+struct thread_pool *g_tpool;
+
+extern struct GtpV2Stack* gtpStack_gp;
+extern volatile uint32_t g_s11_sequence;
+
+struct MsgBuffer*  dsReqMsgBuf_p = NULL;
+/****Global and externs end***/
+
+/**
+* Stage specific message processing.
+*/
+static int
+delete_session_processing(struct DS_Q_msg *ds_msg)
+{
+	GtpV2MessageHeader gtpHeader;
+	gtpHeader.msgType = GTP_DELETE_SESSION_REQ;
+	gtpHeader.sequenceNumber = g_s11_sequence;
+	gtpHeader.teidPresent = true;
+	gtpHeader.teid = ds_msg->s11_sgw_c_fteid.header.teid_gre;
+
+	DeleteSessionRequestMsgData msgData;
+	memset(&msgData, 0, sizeof(DeleteSessionRequestMsgData));
+
+	msgData.indicationFlagsIePresent = true;
+	msgData.indicationFlags.iOI = true;
+
+	msgData.linkedEpsBearerIdIePresent = true;
+	msgData.linkedEpsBearerId.epsBearerId = ds_msg->bearer_id;
+
+	GtpV2Stack_buildGtpV2Message(gtpStack_gp, dsReqMsgBuf_p, &gtpHeader, &msgData);
+	g_s11_sequence++;
+
+	sendto(g_s11_fd,
+			MsgBuffer_getDataPointer(dsReqMsgBuf_p),
+			MsgBuffer_getBufLen(dsReqMsgBuf_p), 0,
+			(struct sockaddr*)&g_s11_cp_addr, g_s11_serv_size);
+	log_msg(LOG_INFO, "Send delete session request\n");
+
+	MsgBuffer_reset(dsReqMsgBuf_p);
+
+	return SUCCESS;
+}
+
+
+/**
+* Thread function for stage.
+*/
+void*
+delete_session_handler(void *data)
+{
+	log_msg(LOG_INFO, "Delete session handler initialized\n");
+
+        delete_session_processing((struct DS_Q_msg *)data);
+	return NULL;
+}
+
diff --git a/src/s11/handlers/modify_bearer_handler.c b/src/s11/handlers/modify_bearer_handler.c
new file mode 100644
index 0000000..978ae8a
--- /dev/null
+++ b/src/s11/handlers/modify_bearer_handler.c
@@ -0,0 +1,111 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <pthread.h>
+#include <string.h>
+
+#include "log.h"
+#include "err_codes.h"
+#include "message_queues.h"
+#include "ipc_api.h"
+#include "s11_structs.h"
+#include "msgType.h"
+//#include "stage7_info.h"
+#include "gtpv2c.h"
+#include "gtpv2c_ie.h"
+#include "../../gtpV2Codec/gtpV2StackWrappers.h"
+
+/************************************************************************
+Current file : Stage 7 handler. To listen MB from mme-app and fwd to CP
+ATTACH stages :
+	Stage 1 : IAM-->[stage1 handler]-->AIR, ULR
+	Stage 2 : AIA, ULA -->[stage2 handler]--> Auth req
+	Stage 3 : Auth resp-->[stage3 handler]-->Sec mode cmd
+	Stage 4 : sec mode resp-->[stage4 handler]-->esm infor req
+	Stage 5 : esm infor resp-->[stage5 handler]-->create session
+	Stage 6 : create session resp-->[stage6 handler]-->init ctx setup
+-->	Stage 7 : attach complete-->[stage7 handler]-->modify bearer
+**************************************************************************/
+
+/****Globals and externs ***/
+
+extern int g_s11_fd;
+extern struct sockaddr_in g_s11_cp_addr;
+extern socklen_t g_s11_serv_size;
+/*TODO: S11 protocol sequence number - need to make it atomic. multiple thread to access this*/
+extern volatile uint32_t g_s11_sequence;
+static char buf[S11_MBREQ_STAGE7_BUF_SIZE];
+
+/*TODO: S11 protocol sequence number - need to make it atomic. multiple thread to access this*/
+extern volatile uint32_t g_s11_sequence;
+
+struct MsgBuffer*  mbReqMsgBuf_p = NULL;
+extern struct GtpV2Stack* gtpStack_gp;
+/****Global and externs end***/
+/**
+* Stage specific message processing.
+*/
+static int
+modify_bearer_processing(struct MB_Q_msg *mb_msg)
+{
+	GtpV2MessageHeader gtpHeader;
+	gtpHeader.msgType = GTP_MODIFY_BEARER_REQ;
+	gtpHeader.sequenceNumber = g_s11_sequence;
+	gtpHeader.teidPresent = true;
+	gtpHeader.teid = mb_msg->s11_sgw_c_fteid.header.teid_gre;
+
+	g_s11_sequence++;
+
+	ModifyBearerRequestMsgData msgData;
+	memset(&msgData, 0, sizeof(msgData));
+	msgData.bearerContextsToBeModifiedCount = 1;
+	msgData.bearerContextsToBeModified[0].epsBearerId.epsBearerId = 5;
+	msgData.bearerContextsToBeModified[0].s1EnodebFTeidIePresent = true;
+	msgData.bearerContextsToBeModified[0].s1EnodebFTeid.ipv4present = true;
+	msgData.bearerContextsToBeModified[0].s1EnodebFTeid.interfaceType = mb_msg->s1u_enb_fteid.header.iface_type;
+	msgData.bearerContextsToBeModified[0].s1EnodebFTeid.teidGreKey = mb_msg->s1u_enb_fteid.header.teid_gre;
+	msgData.bearerContextsToBeModified[0].s1EnodebFTeid.ipV4Address.ipValue = mb_msg->s1u_enb_fteid.ip.ipv4.s_addr;
+
+	GtpV2Stack_buildGtpV2Message(gtpStack_gp, mbReqMsgBuf_p, &gtpHeader, &msgData);
+	sendto(g_s11_fd,
+			MsgBuffer_getDataPointer(mbReqMsgBuf_p),
+			MsgBuffer_getBufLen(mbReqMsgBuf_p), 0,
+			(struct sockaddr*)&g_s11_cp_addr,
+			g_s11_serv_size);
+	//TODO " error chk, eagain etc?	
+	log_msg(LOG_INFO, "Modify beader send, len - %d bytes.\n", MsgBuffer_getBufLen(mbReqMsgBuf_p));
+
+	MsgBuffer_reset(mbReqMsgBuf_p);
+
+	return SUCCESS;
+}
+
+/**
+* Thread function for stage.
+*/
+void*
+modify_bearer_handler(void *data)
+{
+	log_msg(LOG_INFO, "Modify bearer handler initialized\n");
+	
+	modify_bearer_processing((struct MB_Q_msg *)data);
+
+	return NULL;
+}
diff --git a/src/s11/handlers/release_bearer_handler.c b/src/s11/handlers/release_bearer_handler.c
new file mode 100644
index 0000000..e18cc37
--- /dev/null
+++ b/src/s11/handlers/release_bearer_handler.c
@@ -0,0 +1,110 @@
+/*
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */  
+  
+#include <stdio.h>
+#include <stdlib.h>
+#include <pthread.h>
+#include <string.h>
+
+#include "log.h"
+#include "err_codes.h"
+#include "message_queues.h"
+#include "ipc_api.h"
+#include "s11_structs.h"
+#include "msgType.h"
+//#include "stage7_info.h"
+#include "gtpv2c.h"
+#include "gtpv2c_ie.h"
+#include "../../gtpV2Codec/gtpV2StackWrappers.h"
+
+/************************************************************************
+Current file : Stage 7 handler. To listen MB from mme-app and fwd to CP
+ATTACH stages :
+	Stage 1 : IAM-->[stage1 handler]-->AIR, ULR
+	Stage 2 : AIA, ULA -->[stage2 handler]--> Auth req
+	Stage 3 : Auth resp-->[stage3 handler]-->Sec mode cmd
+	Stage 4 : sec mode resp-->[stage4 handler]-->esm infor req
+	Stage 5 : esm infor resp-->[stage5 handler]-->create session
+	Stage 6 : create session resp-->[stage6 handler]-->init ctx setup
+-->	Stage 7 : attach complete-->[stage7 handler]-->modify bearer
+**************************************************************************/
+
+/****Globals and externs ***/
+
+
+extern int g_s11_fd;
+extern struct sockaddr_in g_s11_cp_addr;
+extern socklen_t g_s11_serv_size;
+/*TODO: S11 protocol sequence number - need to make it atomic. multiple thread to access this*/
+extern volatile uint32_t g_s11_sequence;
+
+struct MsgBuffer*  rbReqMsgBuf_p = NULL;
+extern struct GtpV2Stack* gtpStack_gp;
+
+
+/****Global and externs end***/
+/**
+* Stage specific message processing.
+*/
+static int
+release_bearer_processing(struct RB_Q_msg *rb_msg)
+{
+	GtpV2MessageHeader gtpHeader;	
+        gtpHeader.msgType = GTP_RELEASE_BEARER_REQ;
+        gtpHeader.sequenceNumber = g_s11_sequence;
+        gtpHeader.teidPresent = true;
+        gtpHeader.teid = rb_msg->s11_sgw_c_fteid.header.teid_gre;
+	
+        g_s11_sequence++;
+	
+        ReleaseAccessBearersRequestMsgData msgData;
+	memset(&msgData, 0, sizeof(msgData));
+        
+	msgData.indicationFlagsIePresent = true;
+        msgData.indicationFlags.iOI = true;
+
+        GtpV2Stack_buildGtpV2Message(gtpStack_gp, rbReqMsgBuf_p, &gtpHeader, &msgData);
+	
+        sendto(g_s11_fd,
+                        MsgBuffer_getDataPointer(rbReqMsgBuf_p),
+                        MsgBuffer_getBufLen(rbReqMsgBuf_p), 0,
+                        (struct sockaddr*)&g_s11_cp_addr,
+                        g_s11_serv_size);
+        //TODO " error chk, eagain etc?
+        log_msg(LOG_INFO, "Release Bearer sent, len - %d bytes.\n", MsgBuffer_getBufLen(rbReqMsgBuf_p));
+
+        MsgBuffer_reset(rbReqMsgBuf_p);
+
+        return SUCCESS;
+
+}
+
+
+/**
+* Thread function for stage.
+*/
+void*
+release_bearer_handler(void *data)
+{
+	
+	log_msg(LOG_INFO, "Release bearer handler initialized\n");
+	
+	release_bearer_processing((struct RB_Q_msg *)data);
+
+	return NULL;
+}
+
+
diff --git a/src/s11/handlers/s11_CS_resp_handler.c b/src/s11/handlers/s11_CS_resp_handler.c
new file mode 100644
index 0000000..14c6af7
--- /dev/null
+++ b/src/s11/handlers/s11_CS_resp_handler.c
@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <arpa/inet.h>
+#include <unistd.h>
+#include <string.h>
+#include <pthread.h>
+
+#include "err_codes.h"
+#include "options.h"
+#include "ipc_api.h"
+#include "message_queues.h"
+#include "s11.h"
+#include "s11_config.h"
+#include "msgType.h"
+//#include "stage6_info.h"
+#include "../../gtpV2Codec/gtpV2StackWrappers.h"
+
+/*Globals and externs*/
+extern int g_resp_fd;
+extern struct GtpV2Stack* gtpStack_gp;
+/*End : globals and externs*/
+
+
+int
+s11_CS_resp_handler(MsgBuffer* message, GtpV2MessageHeader* hdr)
+{
+
+	struct gtp_incoming_msg_data_t csr_info;
+	/*****Message structure***
+	*/
+
+	/*Check whether has teid flag is set. Also check whether this check is needed for CSR.*/
+	csr_info.ue_idx = hdr->teid;
+	csr_info.msg_type = create_session_response;
+
+	CreateSessionResponseMsgData msgData;
+	memset(&msgData, 0, sizeof(CreateSessionResponseMsgData));
+
+	bool rc = GtpV2Stack_decodeMessage(gtpStack_gp, hdr, message, &msgData);
+	if(rc == false)
+	{
+			log_msg(LOG_ERROR, "s11_CS_resp_handler: "
+								"Failed to decode Create Session Response Msg %d\n",
+								hdr->teid);
+			return E_PARSING_FAILED;
+	}
+
+	csr_info.msg_data.csr_Q_msg_m.s11_sgw_fteid.header.iface_type = 11;
+	csr_info.msg_data.csr_Q_msg_m.s11_sgw_fteid.header.teid_gre = msgData.senderFTeidForControlPlane.teidGreKey;
+	csr_info.msg_data.csr_Q_msg_m.s11_sgw_fteid.header.v4 = 1;
+	csr_info.msg_data.csr_Q_msg_m.s11_sgw_fteid.ip.ipv4.s_addr = msgData.senderFTeidForControlPlane.ipV4Address.ipValue;
+
+	csr_info.msg_data.csr_Q_msg_m.s5s8_pgwc_fteid.header.iface_type = 7;
+	csr_info.msg_data.csr_Q_msg_m.s5s8_pgwc_fteid.header.teid_gre = msgData.pgwS5S8S2bFTeid.teidGreKey;
+	csr_info.msg_data.csr_Q_msg_m.s5s8_pgwc_fteid.header.v4 = 1;
+	csr_info.msg_data.csr_Q_msg_m.s5s8_pgwc_fteid.ip.ipv4.s_addr = msgData.pgwS5S8S2bFTeid.ipV4Address.ipValue;
+
+	csr_info.msg_data.csr_Q_msg_m.s1u_sgw_fteid.header.iface_type = 1;
+	csr_info.msg_data.csr_Q_msg_m.s1u_sgw_fteid.header.teid_gre = msgData.bearerContextsCreated[0].s1USgwFTeid.teidGreKey;
+	csr_info.msg_data.csr_Q_msg_m.s1u_sgw_fteid.header.v4 = 1;
+	csr_info.msg_data.csr_Q_msg_m.s1u_sgw_fteid.ip.ipv4.s_addr = msgData.bearerContextsCreated[0].s1USgwFTeid.ipV4Address.ipValue;
+
+	csr_info.msg_data.csr_Q_msg_m.s5s8_pgwu_fteid.header.iface_type = 5;
+	csr_info.msg_data.csr_Q_msg_m.s5s8_pgwu_fteid.header.teid_gre = msgData.bearerContextsCreated[0].s5S8UPgwFTeid.teidGreKey;
+	csr_info.msg_data.csr_Q_msg_m.s5s8_pgwu_fteid.header.v4 = 1;
+	csr_info.msg_data.csr_Q_msg_m.s5s8_pgwu_fteid.ip.ipv4.s_addr = msgData.bearerContextsCreated[0].s5S8UPgwFTeid.ipV4Address.ipValue;
+
+	csr_info.msg_data.csr_Q_msg_m.pdn_addr.pdn_type = 1;
+	csr_info.msg_data.csr_Q_msg_m.pdn_addr.ip_type.ipv4.s_addr = msgData.pdnAddressAllocation.ipV4Address.ipValue;
+
+	
+	csr_info.destInstAddr = htonl(mmeAppInstanceNum_c);
+	csr_info.srcInstAddr = htonl(s11AppInstanceNum_c);
+
+	/*Send CS response msg*/
+	send_tipc_message(g_resp_fd, mmeAppInstanceNum_c, (char *)&csr_info, GTP_READ_MSG_BUF_SIZE);
+	log_msg(LOG_INFO, "Send CS resp to mme-app stage6.\n");
+
+	return SUCCESS;
+}
diff --git a/src/s11/handlers/s11_DDN_handler.c b/src/s11/handlers/s11_DDN_handler.c
new file mode 100644
index 0000000..ac10f67
--- /dev/null
+++ b/src/s11/handlers/s11_DDN_handler.c
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <arpa/inet.h>
+#include <unistd.h>
+#include <string.h>
+#include <pthread.h>
+
+#include "err_codes.h"
+#include "options.h"
+#include "ipc_api.h"
+#include "message_queues.h"
+#include "s11.h"
+#include "s11_config.h"
+#include "msgType.h"
+//#include "detach_stage2_info.h"
+#include "../../gtpV2Codec/gtpV2StackWrappers.h"
+/*Globals and externs*/
+extern int g_resp_fd;
+extern struct GtpV2Stack* gtpStack_gp;
+/*End : globals and externs*/
+
+
+int
+s11_DDN_handler(MsgBuffer* message, GtpV2MessageHeader* hdr)
+{
+
+
+	struct gtp_incoming_msg_data_t ddn_info;
+	ddn_info.msg_type = downlink_data_notification;
+	ddn_info.ue_idx = hdr->teid;
+	ddn_info.msg_data.ddn_Q_msg_m.seq_no = hdr->sequenceNumber;
+
+
+	DownlinkDataNotificationMsgData msgData;
+	memset(&msgData, 0, sizeof(DownlinkDataNotificationMsgData));
+
+	bool rc = GtpV2Stack_decodeMessage(gtpStack_gp, hdr, message, &msgData);
+	if(rc == false)
+	{
+			
+			log_msg(LOG_ERROR, "s11_Ddn_handler: "
+					   "Failed to decode ddn Msg %d\n",
+								hdr->teid);
+			return E_PARSING_FAILED;
+	}
+	/*****Message structure****/
+	log_msg(LOG_INFO, "Parse S11 Ddn message\n");
+
+	//TODO : check cause for the result verification
+
+	ddn_info.msg_data.ddn_Q_msg_m.arp.prioLevel = msgData.allocationRetentionPriority.pl;
+	ddn_info.msg_data.ddn_Q_msg_m.arp.preEmptionCapab = msgData.allocationRetentionPriority.pci;
+	ddn_info.msg_data.ddn_Q_msg_m.arp.preEmptionVulnebility = msgData.allocationRetentionPriority.pvi;
+	ddn_info.msg_data.ddn_Q_msg_m.cause = msgData.cause.causeValue;
+	ddn_info.msg_data.ddn_Q_msg_m.eps_bearer_id = msgData.epsBearerId.epsBearerId;
+
+	ddn_info.destInstAddr = htonl(mmeAppInstanceNum_c);
+	ddn_info.srcInstAddr = htonl(s11AppInstanceNum_c);
+
+	/*Send DDN msg*/
+	send_tipc_message(g_resp_fd, mmeAppInstanceNum_c, (char *)&ddn_info, GTP_READ_MSG_BUF_SIZE);
+
+	log_msg(LOG_INFO, "Send ddn to mme-app\n");
+	
+
+	return SUCCESS;
+}
diff --git a/src/s11/handlers/s11_DS_resp_handler.c b/src/s11/handlers/s11_DS_resp_handler.c
new file mode 100644
index 0000000..abb6d53
--- /dev/null
+++ b/src/s11/handlers/s11_DS_resp_handler.c
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <arpa/inet.h>
+#include <unistd.h>
+#include <string.h>
+#include <pthread.h>
+
+#include "err_codes.h"
+#include "options.h"
+#include "ipc_api.h"
+#include "message_queues.h"
+#include "s11.h"
+#include "s11_config.h"
+#include "msgType.h"
+//#include "detach_stage2_info.h"
+#include "../../gtpV2Codec/gtpV2StackWrappers.h"
+/*Globals and externs*/
+extern int g_resp_fd;
+
+/*End : globals and externs*/
+
+int
+s11_DS_resp_handler(MsgBuffer* message, GtpV2MessageHeader* hdr)
+{
+
+
+	struct gtp_incoming_msg_data_t dsr_info;
+	dsr_info.msg_type = delete_session_response;
+
+	/*****Message structure****/
+	log_msg(LOG_INFO, "Parse S11 DS resp message\n");
+
+	//TODO : check cause for the result verification
+
+	/*Check whether has teid flag is set.
+	 * Also check whether this check is needed for DSR.
+	 * */
+	dsr_info.ue_idx = hdr->teid;	
+
+	dsr_info.destInstAddr = htonl(mmeAppInstanceNum_c);
+	dsr_info.srcInstAddr = htonl(s11AppInstanceNum_c);
+
+	/*Send CS response msg*/
+	send_tipc_message(g_resp_fd, mmeAppInstanceNum_c, (char *)&dsr_info,
+			GTP_READ_MSG_BUF_SIZE);
+	log_msg(LOG_INFO, "Send DS resp to mme-app stage8.\n");
+
+	return SUCCESS;
+}
diff --git a/src/s11/handlers/s11_MB_resp_handler.c b/src/s11/handlers/s11_MB_resp_handler.c
new file mode 100644
index 0000000..5c25327
--- /dev/null
+++ b/src/s11/handlers/s11_MB_resp_handler.c
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <arpa/inet.h>
+#include <unistd.h>
+#include <string.h>
+#include <pthread.h>
+
+#include "err_codes.h"
+#include "options.h"
+#include "ipc_api.h"
+#include "message_queues.h"
+#include "s11.h"
+#include "s11_config.h"
+#include "msgType.h"
+//#include "stage8_info.h"
+#include "../../gtpV2Codec/gtpV2StackWrappers.h"
+/*Globals and externs*/
+extern int g_resp_fd;
+
+/*End : globals and externs*/
+
+int
+s11_MB_resp_handler(MsgBuffer* message, GtpV2MessageHeader* hdr)
+{
+	
+	struct gtp_incoming_msg_data_t mbr_info;
+
+	/*****Message structure***
+	*/
+	log_msg(LOG_INFO, "Parse S11 MB resp message\n");
+
+	//TODO : check cause foor the result verification
+	
+	/*Check whether has teid flag is set. Also check whether this check is needed for CSR.*/
+	mbr_info.ue_idx = hdr->teid;
+	mbr_info.msg_type = modify_bearer_response;
+
+	mbr_info.destInstAddr = htonl(mmeAppInstanceNum_c);
+	mbr_info.srcInstAddr = htonl(s11AppInstanceNum_c);
+	/*Send CS response msg*/
+	send_tipc_message(g_resp_fd, mmeAppInstanceNum_c, (char *)&mbr_info, GTP_READ_MSG_BUF_SIZE);
+	log_msg(LOG_INFO, "Send MB resp to mme-app stage8.\n");
+
+	return SUCCESS;
+}
diff --git a/src/s11/handlers/s11_RB_resp_handler.c b/src/s11/handlers/s11_RB_resp_handler.c
new file mode 100644
index 0000000..d9d7897
--- /dev/null
+++ b/src/s11/handlers/s11_RB_resp_handler.c
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <arpa/inet.h>
+#include <unistd.h>
+#include <string.h>
+#include <pthread.h>
+
+#include "err_codes.h"
+#include "options.h"
+#include "ipc_api.h"
+#include "message_queues.h"
+#include "s11.h"
+#include "s11_config.h"
+#include "msgType.h"
+//#include "stage8_info.h"
+#include "../../gtpV2Codec/gtpV2StackWrappers.h"
+
+/*Globals and externs*/
+extern int g_resp_fd;
+extern struct GtpV2Stack* gtpStack_gp;
+
+/*End : globals and externs*/
+
+int
+s11_RB_resp_handler(MsgBuffer* message, GtpV2MessageHeader* hdr)
+{	
+	struct gtp_incoming_msg_data_t rbr_info;
+	
+	/*****Message structure***
+	*/
+	log_msg(LOG_INFO, "Parse S11 RB resp message\n");
+	
+	//TODO : check cause for the result verification
+	
+	rbr_info.ue_idx = hdr->teid;
+	rbr_info.msg_type = release_bearer_response;
+	
+	ReleaseAccessBearersResponseMsgData msgData;
+        memset(&msgData, 0, sizeof(ReleaseAccessBearersResponseMsgData));
+
+        bool rc = GtpV2Stack_decodeMessage(gtpStack_gp, hdr, message, &msgData);
+        if(rc == false)
+        {
+                        log_msg(LOG_ERROR, "s11_RB_resp_handler: "
+                                                                "Failed to decode Release Access Bearer Response Msg %d\n",
+                                                                hdr->teid);
+                        return E_PARSING_FAILED;
+        }
+
+			
+	rbr_info.destInstAddr = htonl(mmeAppInstanceNum_c);
+	rbr_info.srcInstAddr = htonl(s11AppInstanceNum_c);
+
+	/*Send CS response msg*/
+	send_tipc_message(g_resp_fd, mmeAppInstanceNum_c, (char *)&rbr_info, GTP_READ_MSG_BUF_SIZE);
+	log_msg(LOG_INFO, "Send RB resp to mme-app stage2.\n");
+
+	return SUCCESS;
+}
diff --git a/src/s11/handlers/s11_msg_delegator.c b/src/s11/handlers/s11_msg_delegator.c
new file mode 100644
index 0000000..fbb0d7b
--- /dev/null
+++ b/src/s11/handlers/s11_msg_delegator.c
@@ -0,0 +1,207 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <arpa/inet.h>
+#include <unistd.h>
+#include <string.h>
+#include <pthread.h>
+
+#include "err_codes.h"
+#include "options.h"
+#include "ipc_api.h"
+#include "message_queues.h"
+#include "s11.h"
+#include "s11_config.h"
+#include "s11_structs.h"
+#include "../../gtpV2Codec/gtpV2StackWrappers.h"
+
+extern struct GtpV2Stack* gtpStack_gp;
+int s11_CS_resp_handler(MsgBuffer* message, GtpV2MessageHeader* hdr);
+int s11_MB_resp_handler(MsgBuffer* message, GtpV2MessageHeader* hdr);
+int s11_DS_resp_handler(MsgBuffer* message, GtpV2MessageHeader* hdr);
+int s11_RB_resp_handler(MsgBuffer* message, GtpV2MessageHeader* hdr);
+int s11_DDN_handler(MsgBuffer* message, GtpV2MessageHeader* hdr);
+
+/*
+  Get count of no of IEs in gtpv2c msg
+*/
+static int
+get_IE_cnt(char *msg, int len)
+{
+	int cnt = 0;
+	char *tmp = msg+11;
+	struct s11_IE_header *header = (struct s11_IE_header *)tmp;
+
+	for(; (char *)tmp <= msg + len; ++cnt) {
+		tmp += sizeof(struct s11_IE_header) + ntohs(header->ie_len);
+		header = (struct s11_IE_header*)tmp;
+	}
+	return cnt;
+}
+
+void
+network_cp_fteid(struct fteid *teid, char *data)
+{
+	unsigned int *tmp;
+
+	memcpy(teid, data, sizeof(struct fteid));
+	teid->header.teid_gre = ntohl(teid->header.teid_gre);
+	tmp = (unsigned int*)(data+5);
+	*tmp = ntohl(*tmp);
+	memcpy(&(teid->ip.ipv4), tmp, sizeof(struct in_addr));  
+}
+
+int
+parse_bearer_ctx(struct bearer_ctx *bearer, char* data, short len)
+{
+	char no_of_ies = 4;
+	//TODO: count no of IEs
+
+	for(int i=0; i < no_of_ies; ++i) {
+		struct s11_IE_header *header = (struct s11_IE_header*)data;
+		char *value = data + sizeof(struct s11_IE_header);
+
+		switch(header->ie_type){
+		case S11_IE_CAUSE:
+			memcpy(&(bearer->cause), value, sizeof(struct gtp_cause));
+			break;
+
+		case S11_IE_FTEID_C:{
+			#define S1U_SGW_FTEID 1 /*binary 0001*/
+			if((0x0F & (unsigned char)(*value)) 
+				== S1U_SGW_FTEID) {
+				network_cp_fteid(&bearer->s1u_sgw_teid, value);
+			}
+			else { /*s5s8 pgw_U ftied*/
+				network_cp_fteid(&bearer->s5s8_pgw_u_teid, value);
+			}
+			break;
+		}
+
+		case S11_IE_EPS_BEARER_ID:
+			bearer->eps_bearer_id = (unsigned char)(*value);
+			break;
+
+		default:
+		log_msg(LOG_ERROR, "Unhandled S11 bearer IE: %d\n", header->ie_type);
+		}
+
+		data += ntohs(header->ie_len) + sizeof(struct s11_IE_header); /*goto next IE*/
+	}
+	return SUCCESS;
+}
+
+int	
+parse_gtpv2c_IEs(char *msg, int len, struct s11_proto_IE *proto_ies)
+{
+	proto_ies->no_of_ies = get_IE_cnt(msg, len);
+
+	if(0 == proto_ies->no_of_ies) {
+		log_msg(LOG_INFO, "No IEs recvd in message\n");
+		return SUCCESS;
+	}
+	log_msg(LOG_INFO, "No of IEs - %d\n", proto_ies->no_of_ies);
+
+	/*allocated IEs for message*/
+	proto_ies->s11_ies = (struct s11_IE*)calloc(sizeof(struct s11_IE),
+				proto_ies->no_of_ies);
+	msg +=11;
+
+	for(int i=0; i < proto_ies->no_of_ies; ++i) {
+		struct s11_IE *ie = &(proto_ies->s11_ies[i]);
+		char *data = msg + sizeof(struct s11_IE_header);
+
+		memcpy(&(ie->header), msg, sizeof(struct s11_IE_header));
+
+		switch(ie->header.ie_type){
+		case S11_IE_CAUSE:
+			memcpy(&(ie->data.cause), data, sizeof(struct gtp_cause));
+			break;
+
+		case S11_IE_FTEID_C:{
+			#define S11_SGW_C_FTEID 11 /*binary 1011*/
+			if((0x0F & (unsigned char)(*data)) 
+				== S11_SGW_C_FTEID) {
+				network_cp_fteid(&(ie->data.s11_sgw_fteid), data);
+			}
+			else { /*s5s8 pgw_c ftied*/
+				network_cp_fteid(&(ie->data.s5s8_pgw_c_fteid), data);
+			}
+			break;
+		}
+
+		case S11_IE_PAA: {
+			memcpy(&(ie->data.pdn_addr.pdn_type), data,
+				sizeof(ie->data.pdn_addr.pdn_type));
+			memcpy(&(ie->data.pdn_addr.ip_type.ipv4), data+1, sizeof(int));
+			break;
+		}
+
+		case S11_IE_APN_RESTRICTION:
+			break;
+
+		case S11_IE_BEARER_CTX:
+			parse_bearer_ctx(&(ie->data.bearer), data, ntohs(ie->header.ie_len));
+		break;
+
+		default:
+		log_msg(LOG_ERROR, "Unhandled S11 IE: %d\n", ie->header.ie_type);
+		}
+
+		msg += (ntohs(((struct s11_IE_header*)msg)->ie_len) + sizeof(struct s11_IE_header)) ; /*goto next IE*/
+	}
+	return SUCCESS;
+}
+
+void
+handle_s11_message(void *message)
+{
+	log_msg(LOG_INFO, "S11 recv msg handler.\n");
+
+	MsgBuffer* msgBuf_p = (MsgBuffer*)(message);
+	
+	GtpV2MessageHeader msgHeader;
+
+	bool rc = GtpV2Stack_decodeMessageHeader(gtpStack_gp, &msgHeader, msgBuf_p);
+
+	switch(msgHeader.msgType){
+	case S11_GTP_CREATE_SESSION_RESP:
+		s11_CS_resp_handler(msgBuf_p, &msgHeader);
+		break;
+
+	case S11_GTP_MODIFY_BEARER_RESP:
+		s11_MB_resp_handler(msgBuf_p, &msgHeader);
+		break;
+
+	case S11_GTP_DELETE_SESSION_RESP:
+		s11_DS_resp_handler(msgBuf_p, &msgHeader);
+		break;
+	
+	case S11_GTP_RELEASE_BEARER_RESP:
+		s11_RB_resp_handler(msgBuf_p, &msgHeader);
+		break;
+	
+	case S11_GTP_DDN:
+                s11_DDN_handler(msgBuf_p, &msgHeader);
+                break;
+
+	}
+	return;
+}
diff --git a/src/s11/json_config.c b/src/s11/json_config.c
new file mode 100644
index 0000000..5c6c1af
--- /dev/null
+++ b/src/s11/json_config.c
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+#include "json_data.h"
+#include "s11_config.h"
+#include "err_codes.h"
+
+s11_config g_s11_cfg;
+
+void
+init_parser(char *path)
+{
+	load_json(path);
+}
+
+int
+parse_s11_conf()
+{
+	/*s1ap information*/
+	g_s11_cfg.local_egtp_ip = get_ip_scalar("s11.egtp_local_addr");
+	if(-1 == g_s11_cfg.local_egtp_ip) return -1;
+	g_s11_cfg.egtp_def_port = get_int_scalar("s11.egtp_default_port");
+	if(-1 == g_s11_cfg.egtp_def_port) return -1;
+
+	g_s11_cfg.sgw_ip = get_ip_scalar("s11.sgw_addr");
+	if(-1 == g_s11_cfg.sgw_ip) return -1;
+	g_s11_cfg.pgw_ip = get_ip_scalar("s11.pgw_addr");
+	if(-1 == g_s11_cfg.pgw_ip) return -1;
+
+	return SUCCESS;
+}
diff --git a/src/s11/main.c b/src/s11/main.c
new file mode 100644
index 0000000..489a433
--- /dev/null
+++ b/src/s11/main.c
@@ -0,0 +1,274 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <arpa/inet.h>
+#include <unistd.h>
+#include <string.h>
+#include <pthread.h>
+
+#include "thread_pool.h"
+#include "err_codes.h"
+#include "options.h"
+#include "ipc_api.h"
+#include "message_queues.h"
+#include "s11.h"
+#include "s11_config.h"
+#include <sys/types.h>
+#include "msgType.h"
+#include "../gtpV2Codec/gtpV2StackWrappers.h"
+/**Global and externs **/
+extern s11_config g_s11_cfg;
+
+/*S11 CP communication parameters*/
+int g_s11_fd;
+struct sockaddr_in g_s11_cp_addr;
+socklen_t g_s11_serv_size;
+struct sockaddr_in g_client_addr;
+socklen_t g_client_addr_size;
+int ipc_reader_tipc_s11;
+
+/*Connections to send response(CS/MB) to mme-app*/
+int g_resp_fd;
+
+pthread_t tipcReaderS11_t;
+
+pthread_mutex_t s11_net_lock = PTHREAD_MUTEX_INITIALIZER;
+
+struct thread_pool *g_tpool;
+struct thread_pool *g_tpool_tipc_reader_s11;
+/**End: global and externs**/
+
+extern char processName[255];
+extern int pid;
+
+
+void
+handle_mmeapp_message_s11(void * data)
+{
+	char *msg = ((char *) data) + (sizeof(uint32_t)*2);
+
+	msg_type_t* msg_type = (msg_type_t*)(msg);
+
+	switch(*msg_type)
+	{
+	case create_session_request:
+		create_session_handler(msg);
+		break;
+	case modify_bearer_request:
+		modify_bearer_handler(msg);
+		break;
+	case delete_session_request:
+		delete_session_handler(msg);
+		break;
+	case release_bearer_request:
+		release_bearer_handler(msg);
+		break;
+	case ddn_acknowledgement:
+		ddn_ack_handler(msg);
+		break;
+	default:
+		break;
+	}
+	free(data);
+}
+
+void * tipc_msg_handler_s11()
+{
+	int bytesRead = 0;
+	while (1)
+	{
+		unsigned char buffer[255] = {0};
+		if ((bytesRead = read_tipc_msg(ipc_reader_tipc_s11, buffer, 255)) > 0)
+		{
+			unsigned char *tmpBuf = (unsigned char *) malloc(sizeof(char) * bytesRead);
+			memcpy(tmpBuf, buffer, bytesRead);
+			log_msg(LOG_INFO, "S11 message received from mme-app");
+			insert_job(g_tpool_tipc_reader_s11, handle_mmeapp_message_s11, tmpBuf);
+		}
+	}
+}
+struct GtpV2Stack* gtpStack_gp = NULL;
+extern struct MsgBuffer* csReqMsgBuf_p;
+extern struct MsgBuffer* mbReqMsgBuf_p;
+extern struct MsgBuffer* dsReqMsgBuf_p;
+extern struct MsgBuffer* rbReqMsgBuf_p;
+extern struct MsgBuffer* ddnAckMsgBuf_p;
+
+int
+init_s11_workers()
+{
+	if ((ipc_reader_tipc_s11 = create_tipc_socket()) <= 0)
+	{
+		log_msg(LOG_ERROR, "Failed to create IPC Reader tipc socket \n");
+		return -E_FAIL;
+	}
+	if ( bind_tipc_socket(ipc_reader_tipc_s11, s11AppInstanceNum_c) != 1)
+	{
+		log_msg(LOG_ERROR, "Failed to bind IPC Reader tipc socket \n");
+		return -E_FAIL;
+	}
+
+	/* Initialize thread pool for mme-app messages */
+	g_tpool_tipc_reader_s11 = thread_pool_new(3);
+
+	if (g_tpool_tipc_reader_s11 == NULL) {
+		log_msg(LOG_ERROR, "Error in creating thread pool. \n");
+		return -E_FAIL_INIT;
+	}
+
+	log_msg(LOG_INFO, "S11 Listener thead pool initalized.\n");
+
+	// thread to read incoming ipc messages from tipc socket
+	pthread_attr_t attr;
+	pthread_attr_init(&attr);
+	pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+	pthread_create(&tipcReaderS11_t, &attr, &tipc_msg_handler_s11, NULL);
+	pthread_attr_destroy(&attr);
+
+	return 0;
+}
+
+/*Initialize sctp socket connection for eNB*/
+int
+init_gtpv2()
+{
+	/*Create UDP socket*/
+	g_s11_fd = socket(PF_INET, SOCK_DGRAM, 0);
+
+	g_client_addr.sin_family = AF_INET;
+	//g_client_addr.sin_addr.s_addr = htonl(g_s11_cfg.local_egtp_ip);
+	g_client_addr.sin_addr.s_addr = htonl(g_s11_cfg.local_egtp_ip);
+	fprintf(stderr, "....................local egtp %d\n", g_s11_cfg.local_egtp_ip);
+	//g_client_addr.sin_port = htons(0); /* TODO: Read value from config */
+	g_client_addr.sin_port = htons(g_s11_cfg.egtp_def_port);
+
+	bind(g_s11_fd, (struct sockaddr *)&g_client_addr, sizeof(g_client_addr));
+	g_client_addr_size = sizeof(g_client_addr);
+
+	/*Configure settings in address struct*/
+	g_s11_cp_addr.sin_family = AF_INET;
+	//g_s11_cp_addr.sin_port = htons(g_s11_cfg.egtp_def_port);
+	fprintf(stderr, ".................... egtp def port %d\n", g_s11_cfg.egtp_def_port);
+	g_s11_cp_addr.sin_port = htons(g_s11_cfg.egtp_def_port);
+	//g_s11_cp_addr.sin_addr.s_addr = htonl(g_s11_cfg.sgw_ip);
+	fprintf(stderr, "....................sgw ip %d\n", g_s11_cfg.sgw_ip);
+	g_s11_cp_addr.sin_addr.s_addr = htonl(g_s11_cfg.sgw_ip);
+	memset(g_s11_cp_addr.sin_zero, '\0', sizeof(g_s11_cp_addr.sin_zero));
+
+	g_s11_serv_size = sizeof(g_s11_cp_addr);
+
+	return SUCCESS;
+}
+
+/**
+  Opening pipe connection from S11 app to MME(Single queue pipe)
+*/
+int
+init_s11_ipc()
+{
+	log_msg(LOG_INFO, "Connecting to mme-app S11 CS response queue\n");
+	if ((g_resp_fd  = create_tipc_socket()) <= 0)
+		return -E_FAIL;
+
+	log_msg(LOG_INFO, "S11 - mme-app IPC: Connected.\n");
+
+	return 0;
+}
+
+/**
+  Read incoming S11 messages and pass to threadpool
+  for processing.
+*/
+void
+s11_reader()
+{
+	unsigned char buffer[S11_GTPV2C_BUF_LEN];
+	int len;
+
+	while(1) {
+		//len = recvfrom(g_s11_fd, buffer, S11_GTPV2C_BUF_LEN, 0,
+		//	&g_client_addr, &g_client_addr_size);
+		len = recvfrom(g_s11_fd, buffer, S11_GTPV2C_BUF_LEN, 0,
+			(struct sockaddr*)&g_s11_cp_addr, &g_s11_serv_size);
+
+		if(len > 0) {
+			MsgBuffer* tmp_buf_p = createMsgBuffer(len);
+			MsgBuffer_writeBytes(tmp_buf_p, buffer, len, true);
+			MsgBuffer_rewind(tmp_buf_p);
+			log_msg(LOG_INFO, "S11 Received msg len : %d \n",len);
+			insert_job(g_tpool, handle_s11_message, tmp_buf_p);
+		}
+
+	}
+}
+
+int
+main(int argc, char **argv)
+{
+	memcpy (processName, argv[0], strlen(argv[0]));
+	pid = getpid();
+
+	init_parser("conf/s11.json");
+	parse_s11_conf();
+
+	// init stack
+	gtpStack_gp = createGtpV2Stack();
+	if (gtpStack_gp == NULL)
+	{
+		log_msg(LOG_ERROR, "Error in initializing ipc.\n");
+		return -1;
+	}
+
+	csReqMsgBuf_p = createMsgBuffer(4096);
+	mbReqMsgBuf_p = createMsgBuffer(4096);
+	dsReqMsgBuf_p = createMsgBuffer(4096);
+	rbReqMsgBuf_p = createMsgBuffer(4096);
+	ddnAckMsgBuf_p = createMsgBuffer(4096);
+
+	if (csReqMsgBuf_p == NULL || mbReqMsgBuf_p == NULL || dsReqMsgBuf_p == NULL || rbReqMsgBuf_p == NULL || ddnAckMsgBuf_p == NULL)
+	{
+		log_msg(LOG_ERROR, "Error in initializing msg buffers required by gtp codec.\n");
+		return -1;
+	}
+
+	/*Init writer sockets*/
+	if (init_s11_ipc() != 0) {
+		log_msg(LOG_ERROR, "Error in initializing ipc.\n");
+		return -1;
+	}
+
+	init_s11_workers();
+
+	/* Initialize thread pool for S11 messages from CP*/
+	g_tpool = thread_pool_new(S11_THREADPOOL_SIZE);
+
+	if (g_tpool == NULL) {
+		log_msg(LOG_ERROR, "Error in creating thread pool. \n");
+		return -1;
+	}
+	log_msg(LOG_INFO, "S11 listener threadpool initialized.\n");
+
+	if (init_gtpv2() != 0)
+		return -1;
+
+	s11_reader();
+
+	return 0;
+}
diff --git a/src/s11/options.c b/src/s11/options.c
new file mode 100644
index 0000000..aa537e3
--- /dev/null
+++ b/src/s11/options.c
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <getopt.h>
+
+#include "options.h"
+#include "log.h"
+
+void parse_args(int argc, char **argv)
+{
+	int args_set = 0;
+	int c = 0;
+
+	const struct option long_options[] = {
+	  {"config_file",  required_argument, NULL, 'f'},
+	  {0, 0, 0, 0}
+	};
+
+	do {
+		int option_index = 0;
+
+		c = getopt_long(argc, argv, "f:", long_options,
+				&option_index);
+
+		if (c == -1)
+			break;
+
+		switch (c) {
+		case 'f':
+			break;
+		default:
+			log_msg(LOG_ERROR, "Unknown argument - %s.", argv[optind]);
+			exit(0);
+		}
+	} while (c != -1);
+
+	if ((args_set & REQ_ARGS) != REQ_ARGS) {
+		log_msg(LOG_ERROR, "Usage: %s\n", argv[0]);
+		for (c = 0; long_options[c].name; ++c) {
+			log_msg(LOG_ERROR, "\t[ -%s | -%c ] %s\n",
+					long_options[c].name,
+					long_options[c].val,
+					long_options[c].name);
+		}
+		exit(0);
+	}
+}
+
diff --git a/src/s1ap/Makefile b/src/s1ap/Makefile
new file mode 100644
index 0000000..33d1916
--- /dev/null
+++ b/src/s1ap/Makefile
@@ -0,0 +1,75 @@
+#
+# Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+# Copyright (c) 2017 Intel Corporation
+# Copyright (c) 2019, Infosys Ltd.
+#
+# 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.
+#
+
+#SRCDIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
+include ../../Makefile.common
+
+LIB_PATH +=-L../common/ -L./asn1c/asnGenFiles
+
+SRCDIR := .
+TARGET := $(BINDIR)/s1ap-app
+S1AP_CONF = s1ap.json
+
+SRCEXT := c
+SOURCES := $(shell find $(SRCDIR) -type f -name '*.$(SRCEXT)')
+OBJECTS := $(patsubst $(SRCDIR)/%,$(OBJDIR)/s1ap/%,$(SOURCES:.$(SRCEXT)=.o))
+
+CFLAGS += -Wall
+
+ifeq ($(DEBUG),true)
+	CFLAGS += -g
+endif
+
+ifeq ($(DEBUG),false)
+	CFLAGS += -O3
+endif
+
+INCS := $(INC_DIRS)
+
+LIBS := -lpthread \
+	-lsctp \
+	-linterface \
+	-llog \
+	-lthreadpool \
+	-ljson \
+	-lasncodec \
+	-lsecutil
+
+$(TARGET): $(OBJECTS)
+	@echo " Linking..."
+	-@mkdir -p $(BINDIR)
+	$(CC) $(LFLAGS) $^ -o $(TARGET) $(LIB_PATH)  $(LIBS)
+
+$(OBJDIR)/s1ap/%.o: $(SRCDIR)/%.$(SRCEXT)
+	@mkdir -p $(OBJDIR)/s1ap/handlers
+	$(CC) $(CFLAGS) $(INCS) -c -o $@ $<
+
+all:$(TARGET)
+
+clean:
+	@echo " Cleaning...";
+	@rm -rf $(OBJDIR)/s1ap $(TARGET)
+
+install:
+	mkdir -p $(TARGET_DIR)/bin/
+	cp $(TARGET) $(TARGET_DIR)/bin/
+	cp conf/$(S1AP_CONF) $(TARGET_DIR)/conf/
+
+
+.PHONY: clean
+
diff --git a/src/s1ap/asn1c/asn1c b/src/s1ap/asn1c/asn1c
new file mode 100644
index 0000000..16425d5
--- /dev/null
+++ b/src/s1ap/asn1c/asn1c
Binary files differ
diff --git a/src/s1ap/asn1c/asnGenFiles/ANY.h b/src/s1ap/asn1c/asnGenFiles/ANY.h
new file mode 100644
index 0000000..b30381f
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ANY.h
@@ -0,0 +1,65 @@
+/*-
+ * Copyright (c) 2004-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+#ifndef ASN_TYPE_ANY_H
+#define ASN_TYPE_ANY_H
+
+#include <OCTET_STRING.h>	/* Implemented via OCTET STRING type */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct ANY {
+	uint8_t *buf;	/* BER-encoded ANY contents */
+	int size;	/* Size of the above buffer */
+
+	asn_struct_ctx_t _asn_ctx;	/* Parsing across buffer boundaries */
+} ANY_t;
+
+extern asn_TYPE_descriptor_t asn_DEF_ANY;
+extern asn_TYPE_operation_t asn_OP_ANY;
+extern asn_OCTET_STRING_specifics_t asn_SPC_ANY_specs;
+
+asn_struct_free_f ANY_free;
+asn_struct_print_f ANY_print;
+ber_type_decoder_f ANY_decode_ber;
+der_type_encoder_f ANY_encode_der;
+xer_type_encoder_f ANY_encode_xer;
+per_type_decoder_f ANY_decode_uper;
+per_type_encoder_f ANY_encode_uper;
+per_type_decoder_f ANY_decode_aper;
+per_type_encoder_f ANY_encode_aper;
+
+#define ANY_free         OCTET_STRING_free
+#define ANY_print        OCTET_STRING_print
+#define ANY_compare      OCTET_STRING_compare
+#define ANY_constraint   asn_generic_no_constraint
+#define ANY_decode_ber   OCTET_STRING_decode_ber
+#define ANY_encode_der   OCTET_STRING_encode_der
+#define ANY_decode_xer   OCTET_STRING_decode_xer_hex
+
+/******************************
+ * Handy conversion routines. *
+ ******************************/
+
+/* Convert another ASN.1 type into the ANY. This implies DER encoding. */
+int ANY_fromType(ANY_t *, asn_TYPE_descriptor_t *td, void *struct_ptr);
+int ANY_fromType_aper(ANY_t *st, asn_TYPE_descriptor_t *td, void *sptr);
+ANY_t *ANY_new_fromType(asn_TYPE_descriptor_t *td, void *struct_ptr);
+ANY_t *ANY_new_fromType_aper(asn_TYPE_descriptor_t *td, void *sptr);
+
+/* Convert the contents of the ANY type into the specified type. */
+int ANY_to_type(ANY_t *, asn_TYPE_descriptor_t *td, void **struct_ptr);
+int ANY_to_type_aper(ANY_t *, asn_TYPE_descriptor_t *td, void **struct_ptr);
+
+#define	ANY_fromBuf(s, buf, size)	OCTET_STRING_fromBuf((s), (buf), (size))
+#define	ANY_new_fromBuf(buf, size)	OCTET_STRING_new_fromBuf(	\
+						&asn_DEF_ANY, (buf), (size))
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* ASN_TYPE_ANY_H */
diff --git a/src/s1ap/asn1c/asnGenFiles/Additional-GUTI.h b/src/s1ap/asn1c/asnGenFiles/Additional-GUTI.h
new file mode 100644
index 0000000..33c4e03
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Additional-GUTI.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Additional_GUTI_H_
+#define	_Additional_GUTI_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "GUMMEI.h"
+#include "M-TMSI.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* Additional-GUTI */
+typedef struct Additional_GUTI {
+	GUMMEI_t	 gUMMEI;
+	M_TMSI_t	 m_TMSI;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} Additional_GUTI_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_Additional_GUTI;
+extern asn_SEQUENCE_specifics_t asn_SPC_Additional_GUTI_specs_1;
+extern asn_TYPE_member_t asn_MBR_Additional_GUTI_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Additional_GUTI_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/AdditionalCSFallbackIndicator.h b/src/s1ap/asn1c/asnGenFiles/AdditionalCSFallbackIndicator.h
new file mode 100644
index 0000000..dae1d3e
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/AdditionalCSFallbackIndicator.h
@@ -0,0 +1,56 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_AdditionalCSFallbackIndicator_H_
+#define	_AdditionalCSFallbackIndicator_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum AdditionalCSFallbackIndicator {
+	AdditionalCSFallbackIndicator_no_restriction	= 0,
+	AdditionalCSFallbackIndicator_restriction	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_AdditionalCSFallbackIndicator;
+
+/* AdditionalCSFallbackIndicator */
+typedef long	 AdditionalCSFallbackIndicator_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_AdditionalCSFallbackIndicator_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_AdditionalCSFallbackIndicator;
+extern const asn_INTEGER_specifics_t asn_SPC_AdditionalCSFallbackIndicator_specs_1;
+asn_struct_free_f AdditionalCSFallbackIndicator_free;
+asn_struct_print_f AdditionalCSFallbackIndicator_print;
+asn_constr_check_f AdditionalCSFallbackIndicator_constraint;
+ber_type_decoder_f AdditionalCSFallbackIndicator_decode_ber;
+der_type_encoder_f AdditionalCSFallbackIndicator_encode_der;
+xer_type_decoder_f AdditionalCSFallbackIndicator_decode_xer;
+xer_type_encoder_f AdditionalCSFallbackIndicator_encode_xer;
+oer_type_decoder_f AdditionalCSFallbackIndicator_decode_oer;
+oer_type_encoder_f AdditionalCSFallbackIndicator_encode_oer;
+per_type_decoder_f AdditionalCSFallbackIndicator_decode_uper;
+per_type_encoder_f AdditionalCSFallbackIndicator_encode_uper;
+per_type_decoder_f AdditionalCSFallbackIndicator_decode_aper;
+per_type_encoder_f AdditionalCSFallbackIndicator_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _AdditionalCSFallbackIndicator_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/AerialUEsubscriptionInformation.h b/src/s1ap/asn1c/asnGenFiles/AerialUEsubscriptionInformation.h
new file mode 100644
index 0000000..6784f22
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/AerialUEsubscriptionInformation.h
@@ -0,0 +1,56 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_AerialUEsubscriptionInformation_H_
+#define	_AerialUEsubscriptionInformation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum AerialUEsubscriptionInformation {
+	AerialUEsubscriptionInformation_allowed	= 0,
+	AerialUEsubscriptionInformation_not_allowed	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_AerialUEsubscriptionInformation;
+
+/* AerialUEsubscriptionInformation */
+typedef long	 AerialUEsubscriptionInformation_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_AerialUEsubscriptionInformation_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_AerialUEsubscriptionInformation;
+extern const asn_INTEGER_specifics_t asn_SPC_AerialUEsubscriptionInformation_specs_1;
+asn_struct_free_f AerialUEsubscriptionInformation_free;
+asn_struct_print_f AerialUEsubscriptionInformation_print;
+asn_constr_check_f AerialUEsubscriptionInformation_constraint;
+ber_type_decoder_f AerialUEsubscriptionInformation_decode_ber;
+der_type_encoder_f AerialUEsubscriptionInformation_encode_der;
+xer_type_decoder_f AerialUEsubscriptionInformation_decode_xer;
+xer_type_encoder_f AerialUEsubscriptionInformation_encode_xer;
+oer_type_decoder_f AerialUEsubscriptionInformation_decode_oer;
+oer_type_encoder_f AerialUEsubscriptionInformation_encode_oer;
+per_type_decoder_f AerialUEsubscriptionInformation_decode_uper;
+per_type_encoder_f AerialUEsubscriptionInformation_encode_uper;
+per_type_decoder_f AerialUEsubscriptionInformation_decode_aper;
+per_type_encoder_f AerialUEsubscriptionInformation_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _AerialUEsubscriptionInformation_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/AllocationAndRetentionPriority.h b/src/s1ap/asn1c/asnGenFiles/AllocationAndRetentionPriority.h
new file mode 100644
index 0000000..334761b
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/AllocationAndRetentionPriority.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_AllocationAndRetentionPriority_H_
+#define	_AllocationAndRetentionPriority_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "PriorityLevel.h"
+#include "Pre-emptionCapability.h"
+#include "Pre-emptionVulnerability.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* AllocationAndRetentionPriority */
+typedef struct AllocationAndRetentionPriority {
+	PriorityLevel_t	 priorityLevel;
+	Pre_emptionCapability_t	 pre_emptionCapability;
+	Pre_emptionVulnerability_t	 pre_emptionVulnerability;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} AllocationAndRetentionPriority_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_AllocationAndRetentionPriority;
+extern asn_SEQUENCE_specifics_t asn_SPC_AllocationAndRetentionPriority_specs_1;
+extern asn_TYPE_member_t asn_MBR_AllocationAndRetentionPriority_1[4];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _AllocationAndRetentionPriority_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/AreaScopeOfMDT.h b/src/s1ap/asn1c/asnGenFiles/AreaScopeOfMDT.h
new file mode 100644
index 0000000..2f0fda9
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/AreaScopeOfMDT.h
@@ -0,0 +1,66 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_AreaScopeOfMDT_H_
+#define	_AreaScopeOfMDT_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NULL.h>
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum AreaScopeOfMDT_PR {
+	AreaScopeOfMDT_PR_NOTHING,	/* No components present */
+	AreaScopeOfMDT_PR_cellBased,
+	AreaScopeOfMDT_PR_tABased,
+	AreaScopeOfMDT_PR_pLMNWide,
+	/* Extensions may appear below */
+	AreaScopeOfMDT_PR_tAIBased
+} AreaScopeOfMDT_PR;
+
+/* Forward declarations */
+struct CellBasedMDT;
+struct TABasedMDT;
+struct TAIBasedMDT;
+
+/* AreaScopeOfMDT */
+typedef struct AreaScopeOfMDT {
+	AreaScopeOfMDT_PR present;
+	union AreaScopeOfMDT_u {
+		struct CellBasedMDT	*cellBased;
+		struct TABasedMDT	*tABased;
+		NULL_t	 pLMNWide;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+		struct TAIBasedMDT	*tAIBased;
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} AreaScopeOfMDT_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_AreaScopeOfMDT;
+extern asn_CHOICE_specifics_t asn_SPC_AreaScopeOfMDT_specs_1;
+extern asn_TYPE_member_t asn_MBR_AreaScopeOfMDT_1[4];
+extern asn_per_constraints_t asn_PER_type_AreaScopeOfMDT_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _AreaScopeOfMDT_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/AreaScopeOfQMC.h b/src/s1ap/asn1c/asnGenFiles/AreaScopeOfQMC.h
new file mode 100644
index 0000000..7550edb
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/AreaScopeOfQMC.h
@@ -0,0 +1,67 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_AreaScopeOfQMC_H_
+#define	_AreaScopeOfQMC_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum AreaScopeOfQMC_PR {
+	AreaScopeOfQMC_PR_NOTHING,	/* No components present */
+	AreaScopeOfQMC_PR_cellBased,
+	AreaScopeOfQMC_PR_tABased,
+	AreaScopeOfQMC_PR_tAIBased,
+	AreaScopeOfQMC_PR_pLMNAreaBased
+	/* Extensions may appear below */
+	
+} AreaScopeOfQMC_PR;
+
+/* Forward declarations */
+struct CellBasedQMC;
+struct TABasedQMC;
+struct TAIBasedQMC;
+struct PLMNAreaBasedQMC;
+
+/* AreaScopeOfQMC */
+typedef struct AreaScopeOfQMC {
+	AreaScopeOfQMC_PR present;
+	union AreaScopeOfQMC_u {
+		struct CellBasedQMC	*cellBased;
+		struct TABasedQMC	*tABased;
+		struct TAIBasedQMC	*tAIBased;
+		struct PLMNAreaBasedQMC	*pLMNAreaBased;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} AreaScopeOfQMC_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_AreaScopeOfQMC;
+extern asn_CHOICE_specifics_t asn_SPC_AreaScopeOfQMC_specs_1;
+extern asn_TYPE_member_t asn_MBR_AreaScopeOfQMC_1[4];
+extern asn_per_constraints_t asn_PER_type_AreaScopeOfQMC_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _AreaScopeOfQMC_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/AssistanceDataForCECapableUEs.h b/src/s1ap/asn1c/asnGenFiles/AssistanceDataForCECapableUEs.h
new file mode 100644
index 0000000..33d0bbd
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/AssistanceDataForCECapableUEs.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_AssistanceDataForCECapableUEs_H_
+#define	_AssistanceDataForCECapableUEs_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "CellIdentifierAndCELevelForCECapableUEs.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* AssistanceDataForCECapableUEs */
+typedef struct AssistanceDataForCECapableUEs {
+	CellIdentifierAndCELevelForCECapableUEs_t	 cellIdentifierAndCELevelForCECapableUEs;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} AssistanceDataForCECapableUEs_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_AssistanceDataForCECapableUEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_AssistanceDataForCECapableUEs_specs_1;
+extern asn_TYPE_member_t asn_MBR_AssistanceDataForCECapableUEs_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _AssistanceDataForCECapableUEs_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/AssistanceDataForPaging.h b/src/s1ap/asn1c/asnGenFiles/AssistanceDataForPaging.h
new file mode 100644
index 0000000..eb36003
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/AssistanceDataForPaging.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_AssistanceDataForPaging_H_
+#define	_AssistanceDataForPaging_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct AssistanceDataForRecommendedCells;
+struct AssistanceDataForCECapableUEs;
+struct PagingAttemptInformation;
+struct ProtocolExtensionContainer;
+
+/* AssistanceDataForPaging */
+typedef struct AssistanceDataForPaging {
+	struct AssistanceDataForRecommendedCells	*assistanceDataForRecommendedCells;	/* OPTIONAL */
+	struct AssistanceDataForCECapableUEs	*assistanceDataForCECapableUEs;	/* OPTIONAL */
+	struct PagingAttemptInformation	*pagingAttemptInformation;	/* OPTIONAL */
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} AssistanceDataForPaging_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_AssistanceDataForPaging;
+extern asn_SEQUENCE_specifics_t asn_SPC_AssistanceDataForPaging_specs_1;
+extern asn_TYPE_member_t asn_MBR_AssistanceDataForPaging_1[4];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _AssistanceDataForPaging_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/AssistanceDataForRecommendedCells.h b/src/s1ap/asn1c/asnGenFiles/AssistanceDataForRecommendedCells.h
new file mode 100644
index 0000000..baf1bd6
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/AssistanceDataForRecommendedCells.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_AssistanceDataForRecommendedCells_H_
+#define	_AssistanceDataForRecommendedCells_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RecommendedCellsForPaging.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* AssistanceDataForRecommendedCells */
+typedef struct AssistanceDataForRecommendedCells {
+	RecommendedCellsForPaging_t	 recommendedCellsForPaging;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} AssistanceDataForRecommendedCells_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_AssistanceDataForRecommendedCells;
+extern asn_SEQUENCE_specifics_t asn_SPC_AssistanceDataForRecommendedCells_specs_1;
+extern asn_TYPE_member_t asn_MBR_AssistanceDataForRecommendedCells_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _AssistanceDataForRecommendedCells_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/BIT_STRING.h b/src/s1ap/asn1c/asnGenFiles/BIT_STRING.h
new file mode 100644
index 0000000..c1bdbbc
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/BIT_STRING.h
@@ -0,0 +1,48 @@
+/*-
+ * Copyright (c) 2003-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+#ifndef	_BIT_STRING_H_
+#define	_BIT_STRING_H_
+
+#include <OCTET_STRING.h>	/* Some help from OCTET STRING */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct BIT_STRING_s {
+	uint8_t *buf;	/* BIT STRING body */
+	size_t size;	/* Size of the above buffer */
+
+	int bits_unused;/* Unused trailing bits in the last octet (0..7) */
+
+	asn_struct_ctx_t _asn_ctx;	/* Parsing across buffer boundaries */
+} BIT_STRING_t;
+
+extern asn_TYPE_descriptor_t asn_DEF_BIT_STRING;
+extern asn_TYPE_operation_t asn_OP_BIT_STRING;
+extern asn_OCTET_STRING_specifics_t asn_SPC_BIT_STRING_specs;
+
+asn_struct_print_f BIT_STRING_print;	/* Human-readable output */
+asn_struct_compare_f BIT_STRING_compare;
+asn_constr_check_f BIT_STRING_constraint;
+xer_type_encoder_f BIT_STRING_encode_xer;
+oer_type_decoder_f BIT_STRING_decode_oer;
+oer_type_encoder_f BIT_STRING_encode_oer;
+per_type_decoder_f BIT_STRING_decode_uper;
+per_type_encoder_f BIT_STRING_encode_uper;
+asn_random_fill_f  BIT_STRING_random_fill;
+
+#define BIT_STRING_free              OCTET_STRING_free
+#define BIT_STRING_decode_ber        OCTET_STRING_decode_ber
+#define BIT_STRING_encode_der        OCTET_STRING_encode_der
+#define BIT_STRING_decode_xer        OCTET_STRING_decode_xer_binary
+#define BIT_STRING_decode_aper       OCTET_STRING_decode_aper
+#define BIT_STRING_encode_aper       OCTET_STRING_encode_aper
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _BIT_STRING_H_ */
diff --git a/src/s1ap/asn1c/asnGenFiles/BOOLEAN.h b/src/s1ap/asn1c/asnGenFiles/BOOLEAN.h
new file mode 100644
index 0000000..620acf7
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/BOOLEAN.h
@@ -0,0 +1,45 @@
+/*-
+ * Copyright (c) 2003-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+#ifndef	_BOOLEAN_H_
+#define	_BOOLEAN_H_
+
+#include <asn_application.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * The underlying integer may contain various values, but everything
+ * non-zero is capped to 0xff by the DER encoder. The BER decoder may
+ * yield non-zero values different from 1, beware.
+ */
+typedef int BOOLEAN_t;
+
+extern asn_TYPE_descriptor_t asn_DEF_BOOLEAN;
+extern asn_TYPE_operation_t asn_OP_BOOLEAN;
+
+asn_struct_free_f BOOLEAN_free;
+asn_struct_print_f BOOLEAN_print;
+asn_struct_compare_f BOOLEAN_compare;
+ber_type_decoder_f BOOLEAN_decode_ber;
+der_type_encoder_f BOOLEAN_encode_der;
+oer_type_decoder_f BOOLEAN_decode_oer;
+oer_type_encoder_f BOOLEAN_encode_oer;
+per_type_decoder_f BOOLEAN_decode_uper;
+per_type_encoder_f BOOLEAN_encode_uper;
+per_type_decoder_f BOOLEAN_decode_aper;
+per_type_encoder_f BOOLEAN_encode_aper;
+xer_type_decoder_f BOOLEAN_decode_xer;
+xer_type_encoder_f BOOLEAN_encode_xer;
+asn_random_fill_f  BOOLEAN_random_fill;
+
+#define BOOLEAN_constraint     asn_generic_no_constraint
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _BOOLEAN_H_ */
diff --git a/src/s1ap/asn1c/asnGenFiles/BPLMNs.h b/src/s1ap/asn1c/asnGenFiles/BPLMNs.h
new file mode 100644
index 0000000..8a28258
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/BPLMNs.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_BPLMNs_H_
+#define	_BPLMNs_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "PLMNidentity.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* BPLMNs */
+typedef struct BPLMNs {
+	A_SEQUENCE_OF(PLMNidentity_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} BPLMNs_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_BPLMNs;
+extern asn_SET_OF_specifics_t asn_SPC_BPLMNs_specs_1;
+extern asn_TYPE_member_t asn_MBR_BPLMNs_1[1];
+extern asn_per_constraints_t asn_PER_type_BPLMNs_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _BPLMNs_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/BearerType.h b/src/s1ap/asn1c/asnGenFiles/BearerType.h
new file mode 100644
index 0000000..66c6cbf
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/BearerType.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_BearerType_H_
+#define	_BearerType_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum BearerType {
+	BearerType_non_IP	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_BearerType;
+
+/* BearerType */
+typedef long	 BearerType_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_BearerType_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_BearerType;
+extern const asn_INTEGER_specifics_t asn_SPC_BearerType_specs_1;
+asn_struct_free_f BearerType_free;
+asn_struct_print_f BearerType_print;
+asn_constr_check_f BearerType_constraint;
+ber_type_decoder_f BearerType_decode_ber;
+der_type_encoder_f BearerType_encode_der;
+xer_type_decoder_f BearerType_decode_xer;
+xer_type_encoder_f BearerType_encode_xer;
+oer_type_decoder_f BearerType_decode_oer;
+oer_type_encoder_f BearerType_encode_oer;
+per_type_decoder_f BearerType_decode_uper;
+per_type_encoder_f BearerType_encode_uper;
+per_type_decoder_f BearerType_decode_aper;
+per_type_encoder_f BearerType_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _BearerType_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Bearers-SubjectToStatusTransfer-Item.h b/src/s1ap/asn1c/asnGenFiles/Bearers-SubjectToStatusTransfer-Item.h
new file mode 100644
index 0000000..b3a4728
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Bearers-SubjectToStatusTransfer-Item.h
@@ -0,0 +1,53 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Bearers_SubjectToStatusTransfer_Item_H_
+#define	_Bearers_SubjectToStatusTransfer_Item_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "E-RAB-ID.h"
+#include "COUNTvalue.h"
+#include "ReceiveStatusofULPDCPSDUs.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* Bearers-SubjectToStatusTransfer-Item */
+typedef struct Bearers_SubjectToStatusTransfer_Item {
+	E_RAB_ID_t	 e_RAB_ID;
+	COUNTvalue_t	 uL_COUNTvalue;
+	COUNTvalue_t	 dL_COUNTvalue;
+	ReceiveStatusofULPDCPSDUs_t	*receiveStatusofULPDCPSDUs;	/* OPTIONAL */
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} Bearers_SubjectToStatusTransfer_Item_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_Bearers_SubjectToStatusTransfer_Item;
+extern asn_SEQUENCE_specifics_t asn_SPC_Bearers_SubjectToStatusTransfer_Item_specs_1;
+extern asn_TYPE_member_t asn_MBR_Bearers_SubjectToStatusTransfer_Item_1[5];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Bearers_SubjectToStatusTransfer_Item_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Bearers-SubjectToStatusTransferList.h b/src/s1ap/asn1c/asnGenFiles/Bearers-SubjectToStatusTransferList.h
new file mode 100644
index 0000000..4100abd
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Bearers-SubjectToStatusTransferList.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Bearers_SubjectToStatusTransferList_H_
+#define	_Bearers_SubjectToStatusTransferList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolIE_SingleContainer;
+
+/* Bearers-SubjectToStatusTransferList */
+typedef struct Bearers_SubjectToStatusTransferList {
+	A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} Bearers_SubjectToStatusTransferList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_Bearers_SubjectToStatusTransferList;
+extern asn_SET_OF_specifics_t asn_SPC_Bearers_SubjectToStatusTransferList_specs_1;
+extern asn_TYPE_member_t asn_MBR_Bearers_SubjectToStatusTransferList_1[1];
+extern asn_per_constraints_t asn_PER_type_Bearers_SubjectToStatusTransferList_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Bearers_SubjectToStatusTransferList_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/BitRate.h b/src/s1ap/asn1c/asnGenFiles/BitRate.h
new file mode 100644
index 0000000..efba359
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/BitRate.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_BitRate_H_
+#define	_BitRate_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <INTEGER.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* BitRate */
+typedef INTEGER_t	 BitRate_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_BitRate_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_BitRate;
+asn_struct_free_f BitRate_free;
+asn_struct_print_f BitRate_print;
+asn_constr_check_f BitRate_constraint;
+ber_type_decoder_f BitRate_decode_ber;
+der_type_encoder_f BitRate_encode_der;
+xer_type_decoder_f BitRate_decode_xer;
+xer_type_encoder_f BitRate_encode_xer;
+oer_type_decoder_f BitRate_decode_oer;
+oer_type_encoder_f BitRate_encode_oer;
+per_type_decoder_f BitRate_decode_uper;
+per_type_encoder_f BitRate_encode_uper;
+per_type_decoder_f BitRate_decode_aper;
+per_type_encoder_f BitRate_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _BitRate_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/BluetoothMeasConfig.h b/src/s1ap/asn1c/asnGenFiles/BluetoothMeasConfig.h
new file mode 100644
index 0000000..fdcdfe7
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/BluetoothMeasConfig.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_BluetoothMeasConfig_H_
+#define	_BluetoothMeasConfig_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum BluetoothMeasConfig {
+	BluetoothMeasConfig_setup	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_BluetoothMeasConfig;
+
+/* BluetoothMeasConfig */
+typedef long	 BluetoothMeasConfig_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_BluetoothMeasConfig_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_BluetoothMeasConfig;
+extern const asn_INTEGER_specifics_t asn_SPC_BluetoothMeasConfig_specs_1;
+asn_struct_free_f BluetoothMeasConfig_free;
+asn_struct_print_f BluetoothMeasConfig_print;
+asn_constr_check_f BluetoothMeasConfig_constraint;
+ber_type_decoder_f BluetoothMeasConfig_decode_ber;
+der_type_encoder_f BluetoothMeasConfig_encode_der;
+xer_type_decoder_f BluetoothMeasConfig_decode_xer;
+xer_type_encoder_f BluetoothMeasConfig_encode_xer;
+oer_type_decoder_f BluetoothMeasConfig_decode_oer;
+oer_type_encoder_f BluetoothMeasConfig_encode_oer;
+per_type_decoder_f BluetoothMeasConfig_decode_uper;
+per_type_encoder_f BluetoothMeasConfig_encode_uper;
+per_type_decoder_f BluetoothMeasConfig_decode_aper;
+per_type_encoder_f BluetoothMeasConfig_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _BluetoothMeasConfig_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/BluetoothMeasConfigNameList.h b/src/s1ap/asn1c/asnGenFiles/BluetoothMeasConfigNameList.h
new file mode 100644
index 0000000..cbd69d8
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/BluetoothMeasConfigNameList.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_BluetoothMeasConfigNameList_H_
+#define	_BluetoothMeasConfigNameList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "BluetoothName.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* BluetoothMeasConfigNameList */
+typedef struct BluetoothMeasConfigNameList {
+	A_SEQUENCE_OF(BluetoothName_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} BluetoothMeasConfigNameList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_BluetoothMeasConfigNameList;
+extern asn_SET_OF_specifics_t asn_SPC_BluetoothMeasConfigNameList_specs_1;
+extern asn_TYPE_member_t asn_MBR_BluetoothMeasConfigNameList_1[1];
+extern asn_per_constraints_t asn_PER_type_BluetoothMeasConfigNameList_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _BluetoothMeasConfigNameList_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/BluetoothMeasurementConfiguration.h b/src/s1ap/asn1c/asnGenFiles/BluetoothMeasurementConfiguration.h
new file mode 100644
index 0000000..f8cb937
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/BluetoothMeasurementConfiguration.h
@@ -0,0 +1,61 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_BluetoothMeasurementConfiguration_H_
+#define	_BluetoothMeasurementConfiguration_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "BluetoothMeasConfig.h"
+#include <NativeEnumerated.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum BluetoothMeasurementConfiguration__bt_rssi {
+	BluetoothMeasurementConfiguration__bt_rssi_true	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_BluetoothMeasurementConfiguration__bt_rssi;
+
+/* Forward declarations */
+struct BluetoothMeasConfigNameList;
+struct ProtocolExtensionContainer;
+
+/* BluetoothMeasurementConfiguration */
+typedef struct BluetoothMeasurementConfiguration {
+	BluetoothMeasConfig_t	 bluetoothMeasConfig;
+	struct BluetoothMeasConfigNameList	*bluetoothMeasConfigNameList;	/* OPTIONAL */
+	long	*bt_rssi;	/* OPTIONAL */
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} BluetoothMeasurementConfiguration_t;
+
+/* Implementation */
+/* extern asn_TYPE_descriptor_t asn_DEF_bt_rssi_4;	// (Use -fall-defs-global to expose) */
+extern asn_TYPE_descriptor_t asn_DEF_BluetoothMeasurementConfiguration;
+extern asn_SEQUENCE_specifics_t asn_SPC_BluetoothMeasurementConfiguration_specs_1;
+extern asn_TYPE_member_t asn_MBR_BluetoothMeasurementConfiguration_1[4];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _BluetoothMeasurementConfiguration_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/BluetoothName.h b/src/s1ap/asn1c/asnGenFiles/BluetoothName.h
new file mode 100644
index 0000000..0f40011
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/BluetoothName.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_BluetoothName_H_
+#define	_BluetoothName_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* BluetoothName */
+typedef OCTET_STRING_t	 BluetoothName_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_BluetoothName_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_BluetoothName;
+asn_struct_free_f BluetoothName_free;
+asn_struct_print_f BluetoothName_print;
+asn_constr_check_f BluetoothName_constraint;
+ber_type_decoder_f BluetoothName_decode_ber;
+der_type_encoder_f BluetoothName_encode_der;
+xer_type_decoder_f BluetoothName_decode_xer;
+xer_type_encoder_f BluetoothName_encode_xer;
+oer_type_decoder_f BluetoothName_decode_oer;
+oer_type_encoder_f BluetoothName_encode_oer;
+per_type_decoder_f BluetoothName_decode_uper;
+per_type_encoder_f BluetoothName_encode_uper;
+per_type_decoder_f BluetoothName_decode_aper;
+per_type_encoder_f BluetoothName_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _BluetoothName_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/BroadcastCancelledAreaList.h b/src/s1ap/asn1c/asnGenFiles/BroadcastCancelledAreaList.h
new file mode 100644
index 0000000..38ac46d
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/BroadcastCancelledAreaList.h
@@ -0,0 +1,64 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_BroadcastCancelledAreaList_H_
+#define	_BroadcastCancelledAreaList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum BroadcastCancelledAreaList_PR {
+	BroadcastCancelledAreaList_PR_NOTHING,	/* No components present */
+	BroadcastCancelledAreaList_PR_cellID_Cancelled,
+	BroadcastCancelledAreaList_PR_tAI_Cancelled,
+	BroadcastCancelledAreaList_PR_emergencyAreaID_Cancelled
+	/* Extensions may appear below */
+	
+} BroadcastCancelledAreaList_PR;
+
+/* Forward declarations */
+struct CellID_Cancelled;
+struct TAI_Cancelled;
+struct EmergencyAreaID_Cancelled;
+
+/* BroadcastCancelledAreaList */
+typedef struct BroadcastCancelledAreaList {
+	BroadcastCancelledAreaList_PR present;
+	union BroadcastCancelledAreaList_u {
+		struct CellID_Cancelled	*cellID_Cancelled;
+		struct TAI_Cancelled	*tAI_Cancelled;
+		struct EmergencyAreaID_Cancelled	*emergencyAreaID_Cancelled;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} BroadcastCancelledAreaList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_BroadcastCancelledAreaList;
+extern asn_CHOICE_specifics_t asn_SPC_BroadcastCancelledAreaList_specs_1;
+extern asn_TYPE_member_t asn_MBR_BroadcastCancelledAreaList_1[3];
+extern asn_per_constraints_t asn_PER_type_BroadcastCancelledAreaList_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _BroadcastCancelledAreaList_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/BroadcastCompletedAreaList.h b/src/s1ap/asn1c/asnGenFiles/BroadcastCompletedAreaList.h
new file mode 100644
index 0000000..ae73544
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/BroadcastCompletedAreaList.h
@@ -0,0 +1,64 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_BroadcastCompletedAreaList_H_
+#define	_BroadcastCompletedAreaList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum BroadcastCompletedAreaList_PR {
+	BroadcastCompletedAreaList_PR_NOTHING,	/* No components present */
+	BroadcastCompletedAreaList_PR_cellID_Broadcast,
+	BroadcastCompletedAreaList_PR_tAI_Broadcast,
+	BroadcastCompletedAreaList_PR_emergencyAreaID_Broadcast
+	/* Extensions may appear below */
+	
+} BroadcastCompletedAreaList_PR;
+
+/* Forward declarations */
+struct CellID_Broadcast;
+struct TAI_Broadcast;
+struct EmergencyAreaID_Broadcast;
+
+/* BroadcastCompletedAreaList */
+typedef struct BroadcastCompletedAreaList {
+	BroadcastCompletedAreaList_PR present;
+	union BroadcastCompletedAreaList_u {
+		struct CellID_Broadcast	*cellID_Broadcast;
+		struct TAI_Broadcast	*tAI_Broadcast;
+		struct EmergencyAreaID_Broadcast	*emergencyAreaID_Broadcast;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} BroadcastCompletedAreaList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_BroadcastCompletedAreaList;
+extern asn_CHOICE_specifics_t asn_SPC_BroadcastCompletedAreaList_specs_1;
+extern asn_TYPE_member_t asn_MBR_BroadcastCompletedAreaList_1[3];
+extern asn_per_constraints_t asn_PER_type_BroadcastCompletedAreaList_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _BroadcastCompletedAreaList_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CE-ModeBRestricted.h b/src/s1ap/asn1c/asnGenFiles/CE-ModeBRestricted.h
new file mode 100644
index 0000000..783155f
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CE-ModeBRestricted.h
@@ -0,0 +1,56 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CE_ModeBRestricted_H_
+#define	_CE_ModeBRestricted_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum CE_ModeBRestricted {
+	CE_ModeBRestricted_restricted	= 0,
+	CE_ModeBRestricted_not_restricted	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_CE_ModeBRestricted;
+
+/* CE-ModeBRestricted */
+typedef long	 CE_ModeBRestricted_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_CE_ModeBRestricted_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_CE_ModeBRestricted;
+extern const asn_INTEGER_specifics_t asn_SPC_CE_ModeBRestricted_specs_1;
+asn_struct_free_f CE_ModeBRestricted_free;
+asn_struct_print_f CE_ModeBRestricted_print;
+asn_constr_check_f CE_ModeBRestricted_constraint;
+ber_type_decoder_f CE_ModeBRestricted_decode_ber;
+der_type_encoder_f CE_ModeBRestricted_encode_der;
+xer_type_decoder_f CE_ModeBRestricted_decode_xer;
+xer_type_encoder_f CE_ModeBRestricted_encode_xer;
+oer_type_decoder_f CE_ModeBRestricted_decode_oer;
+oer_type_encoder_f CE_ModeBRestricted_encode_oer;
+per_type_decoder_f CE_ModeBRestricted_decode_uper;
+per_type_encoder_f CE_ModeBRestricted_encode_uper;
+per_type_decoder_f CE_ModeBRestricted_decode_aper;
+per_type_encoder_f CE_ModeBRestricted_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CE_ModeBRestricted_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CE-mode-B-SupportIndicator.h b/src/s1ap/asn1c/asnGenFiles/CE-mode-B-SupportIndicator.h
new file mode 100644
index 0000000..ab49e14
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CE-mode-B-SupportIndicator.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CE_mode_B_SupportIndicator_H_
+#define	_CE_mode_B_SupportIndicator_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum CE_mode_B_SupportIndicator {
+	CE_mode_B_SupportIndicator_supported	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_CE_mode_B_SupportIndicator;
+
+/* CE-mode-B-SupportIndicator */
+typedef long	 CE_mode_B_SupportIndicator_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_CE_mode_B_SupportIndicator_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_CE_mode_B_SupportIndicator;
+extern const asn_INTEGER_specifics_t asn_SPC_CE_mode_B_SupportIndicator_specs_1;
+asn_struct_free_f CE_mode_B_SupportIndicator_free;
+asn_struct_print_f CE_mode_B_SupportIndicator_print;
+asn_constr_check_f CE_mode_B_SupportIndicator_constraint;
+ber_type_decoder_f CE_mode_B_SupportIndicator_decode_ber;
+der_type_encoder_f CE_mode_B_SupportIndicator_encode_der;
+xer_type_decoder_f CE_mode_B_SupportIndicator_decode_xer;
+xer_type_encoder_f CE_mode_B_SupportIndicator_encode_xer;
+oer_type_decoder_f CE_mode_B_SupportIndicator_decode_oer;
+oer_type_encoder_f CE_mode_B_SupportIndicator_encode_oer;
+per_type_decoder_f CE_mode_B_SupportIndicator_decode_uper;
+per_type_encoder_f CE_mode_B_SupportIndicator_encode_uper;
+per_type_decoder_f CE_mode_B_SupportIndicator_decode_aper;
+per_type_encoder_f CE_mode_B_SupportIndicator_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CE_mode_B_SupportIndicator_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CELevel.h b/src/s1ap/asn1c/asnGenFiles/CELevel.h
new file mode 100644
index 0000000..8bab70e
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CELevel.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CELevel_H_
+#define	_CELevel_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* CELevel */
+typedef OCTET_STRING_t	 CELevel_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_CELevel;
+asn_struct_free_f CELevel_free;
+asn_struct_print_f CELevel_print;
+asn_constr_check_f CELevel_constraint;
+ber_type_decoder_f CELevel_decode_ber;
+der_type_encoder_f CELevel_encode_der;
+xer_type_decoder_f CELevel_decode_xer;
+xer_type_encoder_f CELevel_encode_xer;
+oer_type_decoder_f CELevel_decode_oer;
+oer_type_encoder_f CELevel_encode_oer;
+per_type_decoder_f CELevel_decode_uper;
+per_type_encoder_f CELevel_encode_uper;
+per_type_decoder_f CELevel_decode_aper;
+per_type_encoder_f CELevel_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CELevel_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CGI.h b/src/s1ap/asn1c/asnGenFiles/CGI.h
new file mode 100644
index 0000000..84910f3
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CGI.h
@@ -0,0 +1,54 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CGI_H_
+#define	_CGI_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "PLMNidentity.h"
+#include "LAC.h"
+#include "CI.h"
+#include "RAC.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* CGI */
+typedef struct CGI {
+	PLMNidentity_t	 pLMNidentity;
+	LAC_t	 lAC;
+	CI_t	 cI;
+	RAC_t	*rAC;	/* OPTIONAL */
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CGI_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_CGI;
+extern asn_SEQUENCE_specifics_t asn_SPC_CGI_specs_1;
+extern asn_TYPE_member_t asn_MBR_CGI_1[5];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CGI_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CI.h b/src/s1ap/asn1c/asnGenFiles/CI.h
new file mode 100644
index 0000000..e6ceb26
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CI.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CI_H_
+#define	_CI_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* CI */
+typedef OCTET_STRING_t	 CI_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_CI_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_CI;
+asn_struct_free_f CI_free;
+asn_struct_print_f CI_print;
+asn_constr_check_f CI_constraint;
+ber_type_decoder_f CI_decode_ber;
+der_type_encoder_f CI_encode_der;
+xer_type_decoder_f CI_decode_xer;
+xer_type_encoder_f CI_encode_xer;
+oer_type_decoder_f CI_decode_oer;
+oer_type_encoder_f CI_encode_oer;
+per_type_decoder_f CI_decode_uper;
+per_type_encoder_f CI_encode_uper;
+per_type_decoder_f CI_decode_aper;
+per_type_encoder_f CI_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CI_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CNDomain.h b/src/s1ap/asn1c/asnGenFiles/CNDomain.h
new file mode 100644
index 0000000..d31dac3
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CNDomain.h
@@ -0,0 +1,53 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CNDomain_H_
+#define	_CNDomain_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum CNDomain {
+	CNDomain_ps	= 0,
+	CNDomain_cs	= 1
+} e_CNDomain;
+
+/* CNDomain */
+typedef long	 CNDomain_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_CNDomain_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_CNDomain;
+extern const asn_INTEGER_specifics_t asn_SPC_CNDomain_specs_1;
+asn_struct_free_f CNDomain_free;
+asn_struct_print_f CNDomain_print;
+asn_constr_check_f CNDomain_constraint;
+ber_type_decoder_f CNDomain_decode_ber;
+der_type_encoder_f CNDomain_encode_der;
+xer_type_decoder_f CNDomain_decode_xer;
+xer_type_encoder_f CNDomain_encode_xer;
+oer_type_decoder_f CNDomain_decode_oer;
+oer_type_encoder_f CNDomain_encode_oer;
+per_type_decoder_f CNDomain_decode_uper;
+per_type_encoder_f CNDomain_encode_uper;
+per_type_decoder_f CNDomain_decode_aper;
+per_type_encoder_f CNDomain_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CNDomain_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CNType.h b/src/s1ap/asn1c/asnGenFiles/CNType.h
new file mode 100644
index 0000000..717bcc4
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CNType.h
@@ -0,0 +1,56 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CNType_H_
+#define	_CNType_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum CNType {
+	CNType_fiveGCForbidden	= 0,
+	/*
+	 * Enumeration is extensible
+	 */
+	CNType_epc_Forbiddden	= 1
+} e_CNType;
+
+/* CNType */
+typedef long	 CNType_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_CNType_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_CNType;
+extern const asn_INTEGER_specifics_t asn_SPC_CNType_specs_1;
+asn_struct_free_f CNType_free;
+asn_struct_print_f CNType_print;
+asn_constr_check_f CNType_constraint;
+ber_type_decoder_f CNType_decode_ber;
+der_type_encoder_f CNType_encode_der;
+xer_type_decoder_f CNType_decode_xer;
+xer_type_encoder_f CNType_encode_xer;
+oer_type_decoder_f CNType_decode_oer;
+oer_type_encoder_f CNType_encode_oer;
+per_type_decoder_f CNType_decode_uper;
+per_type_encoder_f CNType_encode_uper;
+per_type_decoder_f CNType_decode_aper;
+per_type_encoder_f CNType_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CNType_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CNTypeRestrictions-Item.h b/src/s1ap/asn1c/asnGenFiles/CNTypeRestrictions-Item.h
new file mode 100644
index 0000000..7ffdc12
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CNTypeRestrictions-Item.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CNTypeRestrictions_Item_H_
+#define	_CNTypeRestrictions_Item_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "PLMNidentity.h"
+#include "CNType.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* CNTypeRestrictions-Item */
+typedef struct CNTypeRestrictions_Item {
+	PLMNidentity_t	 pLMN_Identity;
+	CNType_t	 cNType;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CNTypeRestrictions_Item_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_CNTypeRestrictions_Item;
+extern asn_SEQUENCE_specifics_t asn_SPC_CNTypeRestrictions_Item_specs_1;
+extern asn_TYPE_member_t asn_MBR_CNTypeRestrictions_Item_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CNTypeRestrictions_Item_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CNTypeRestrictions.h b/src/s1ap/asn1c/asnGenFiles/CNTypeRestrictions.h
new file mode 100644
index 0000000..7bba5b6
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CNTypeRestrictions.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CNTypeRestrictions_H_
+#define	_CNTypeRestrictions_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct CNTypeRestrictions_Item;
+
+/* CNTypeRestrictions */
+typedef struct CNTypeRestrictions {
+	A_SEQUENCE_OF(struct CNTypeRestrictions_Item) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CNTypeRestrictions_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_CNTypeRestrictions;
+extern asn_SET_OF_specifics_t asn_SPC_CNTypeRestrictions_specs_1;
+extern asn_TYPE_member_t asn_MBR_CNTypeRestrictions_1[1];
+extern asn_per_constraints_t asn_PER_type_CNTypeRestrictions_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CNTypeRestrictions_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/COUNTValueExtended.h b/src/s1ap/asn1c/asnGenFiles/COUNTValueExtended.h
new file mode 100644
index 0000000..440270f
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/COUNTValueExtended.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_COUNTValueExtended_H_
+#define	_COUNTValueExtended_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "PDCP-SNExtended.h"
+#include "HFNModified.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* COUNTValueExtended */
+typedef struct COUNTValueExtended {
+	PDCP_SNExtended_t	 pDCP_SNExtended;
+	HFNModified_t	 hFNModified;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} COUNTValueExtended_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_COUNTValueExtended;
+extern asn_SEQUENCE_specifics_t asn_SPC_COUNTValueExtended_specs_1;
+extern asn_TYPE_member_t asn_MBR_COUNTValueExtended_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _COUNTValueExtended_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/COUNTvalue.h b/src/s1ap/asn1c/asnGenFiles/COUNTvalue.h
new file mode 100644
index 0000000..76e0267
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/COUNTvalue.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_COUNTvalue_H_
+#define	_COUNTvalue_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "PDCP-SN.h"
+#include "HFN.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* COUNTvalue */
+typedef struct COUNTvalue {
+	PDCP_SN_t	 pDCP_SN;
+	HFN_t	 hFN;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} COUNTvalue_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_COUNTvalue;
+extern asn_SEQUENCE_specifics_t asn_SPC_COUNTvalue_specs_1;
+extern asn_TYPE_member_t asn_MBR_COUNTvalue_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _COUNTvalue_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/COUNTvaluePDCP-SNlength18.h b/src/s1ap/asn1c/asnGenFiles/COUNTvaluePDCP-SNlength18.h
new file mode 100644
index 0000000..7b862e4
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/COUNTvaluePDCP-SNlength18.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_COUNTvaluePDCP_SNlength18_H_
+#define	_COUNTvaluePDCP_SNlength18_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "PDCP-SNlength18.h"
+#include "HFNforPDCP-SNlength18.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* COUNTvaluePDCP-SNlength18 */
+typedef struct COUNTvaluePDCP_SNlength18 {
+	PDCP_SNlength18_t	 pDCP_SNlength18;
+	HFNforPDCP_SNlength18_t	 hFNforPDCP_SNlength18;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} COUNTvaluePDCP_SNlength18_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_COUNTvaluePDCP_SNlength18;
+extern asn_SEQUENCE_specifics_t asn_SPC_COUNTvaluePDCP_SNlength18_specs_1;
+extern asn_TYPE_member_t asn_MBR_COUNTvaluePDCP_SNlength18_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _COUNTvaluePDCP_SNlength18_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CSFallbackIndicator.h b/src/s1ap/asn1c/asnGenFiles/CSFallbackIndicator.h
new file mode 100644
index 0000000..eedbcec
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CSFallbackIndicator.h
@@ -0,0 +1,56 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CSFallbackIndicator_H_
+#define	_CSFallbackIndicator_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum CSFallbackIndicator {
+	CSFallbackIndicator_cs_fallback_required	= 0,
+	/*
+	 * Enumeration is extensible
+	 */
+	CSFallbackIndicator_cs_fallback_high_priority	= 1
+} e_CSFallbackIndicator;
+
+/* CSFallbackIndicator */
+typedef long	 CSFallbackIndicator_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_CSFallbackIndicator_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_CSFallbackIndicator;
+extern const asn_INTEGER_specifics_t asn_SPC_CSFallbackIndicator_specs_1;
+asn_struct_free_f CSFallbackIndicator_free;
+asn_struct_print_f CSFallbackIndicator_print;
+asn_constr_check_f CSFallbackIndicator_constraint;
+ber_type_decoder_f CSFallbackIndicator_decode_ber;
+der_type_encoder_f CSFallbackIndicator_encode_der;
+xer_type_decoder_f CSFallbackIndicator_decode_xer;
+xer_type_encoder_f CSFallbackIndicator_encode_xer;
+oer_type_decoder_f CSFallbackIndicator_decode_oer;
+oer_type_encoder_f CSFallbackIndicator_encode_oer;
+per_type_decoder_f CSFallbackIndicator_decode_uper;
+per_type_encoder_f CSFallbackIndicator_encode_uper;
+per_type_decoder_f CSFallbackIndicator_decode_aper;
+per_type_encoder_f CSFallbackIndicator_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CSFallbackIndicator_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CSG-Id.h b/src/s1ap/asn1c/asnGenFiles/CSG-Id.h
new file mode 100644
index 0000000..0b8552a
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CSG-Id.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CSG_Id_H_
+#define	_CSG_Id_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* CSG-Id */
+typedef BIT_STRING_t	 CSG_Id_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_CSG_Id_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_CSG_Id;
+asn_struct_free_f CSG_Id_free;
+asn_struct_print_f CSG_Id_print;
+asn_constr_check_f CSG_Id_constraint;
+ber_type_decoder_f CSG_Id_decode_ber;
+der_type_encoder_f CSG_Id_encode_der;
+xer_type_decoder_f CSG_Id_decode_xer;
+xer_type_encoder_f CSG_Id_encode_xer;
+oer_type_decoder_f CSG_Id_decode_oer;
+oer_type_encoder_f CSG_Id_encode_oer;
+per_type_decoder_f CSG_Id_decode_uper;
+per_type_encoder_f CSG_Id_encode_uper;
+per_type_decoder_f CSG_Id_decode_aper;
+per_type_encoder_f CSG_Id_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CSG_Id_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CSG-IdList-Item.h b/src/s1ap/asn1c/asnGenFiles/CSG-IdList-Item.h
new file mode 100644
index 0000000..899a9bf
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CSG-IdList-Item.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CSG_IdList_Item_H_
+#define	_CSG_IdList_Item_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "CSG-Id.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* CSG-IdList-Item */
+typedef struct CSG_IdList_Item {
+	CSG_Id_t	 cSG_Id;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CSG_IdList_Item_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_CSG_IdList_Item;
+extern asn_SEQUENCE_specifics_t asn_SPC_CSG_IdList_Item_specs_1;
+extern asn_TYPE_member_t asn_MBR_CSG_IdList_Item_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CSG_IdList_Item_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CSG-IdList.h b/src/s1ap/asn1c/asnGenFiles/CSG-IdList.h
new file mode 100644
index 0000000..9cf6da9
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CSG-IdList.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CSG_IdList_H_
+#define	_CSG_IdList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct CSG_IdList_Item;
+
+/* CSG-IdList */
+typedef struct CSG_IdList {
+	A_SEQUENCE_OF(struct CSG_IdList_Item) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CSG_IdList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_CSG_IdList;
+extern asn_SET_OF_specifics_t asn_SPC_CSG_IdList_specs_1;
+extern asn_TYPE_member_t asn_MBR_CSG_IdList_1[1];
+extern asn_per_constraints_t asn_PER_type_CSG_IdList_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CSG_IdList_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CSGMembershipInfo.h b/src/s1ap/asn1c/asnGenFiles/CSGMembershipInfo.h
new file mode 100644
index 0000000..240a26e
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CSGMembershipInfo.h
@@ -0,0 +1,54 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CSGMembershipInfo_H_
+#define	_CSGMembershipInfo_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "CSGMembershipStatus.h"
+#include "CSG-Id.h"
+#include "CellAccessMode.h"
+#include "PLMNidentity.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* CSGMembershipInfo */
+typedef struct CSGMembershipInfo {
+	CSGMembershipStatus_t	 cSGMembershipStatus;
+	CSG_Id_t	 cSG_Id;
+	CellAccessMode_t	*cellAccessMode;	/* OPTIONAL */
+	PLMNidentity_t	*pLMNidentity;	/* OPTIONAL */
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CSGMembershipInfo_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_CSGMembershipInfo;
+extern asn_SEQUENCE_specifics_t asn_SPC_CSGMembershipInfo_specs_1;
+extern asn_TYPE_member_t asn_MBR_CSGMembershipInfo_1[5];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CSGMembershipInfo_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CSGMembershipStatus.h b/src/s1ap/asn1c/asnGenFiles/CSGMembershipStatus.h
new file mode 100644
index 0000000..bf58404
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CSGMembershipStatus.h
@@ -0,0 +1,53 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CSGMembershipStatus_H_
+#define	_CSGMembershipStatus_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum CSGMembershipStatus {
+	CSGMembershipStatus_member	= 0,
+	CSGMembershipStatus_not_member	= 1
+} e_CSGMembershipStatus;
+
+/* CSGMembershipStatus */
+typedef long	 CSGMembershipStatus_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_CSGMembershipStatus_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_CSGMembershipStatus;
+extern const asn_INTEGER_specifics_t asn_SPC_CSGMembershipStatus_specs_1;
+asn_struct_free_f CSGMembershipStatus_free;
+asn_struct_print_f CSGMembershipStatus_print;
+asn_constr_check_f CSGMembershipStatus_constraint;
+ber_type_decoder_f CSGMembershipStatus_decode_ber;
+der_type_encoder_f CSGMembershipStatus_encode_der;
+xer_type_decoder_f CSGMembershipStatus_decode_xer;
+xer_type_encoder_f CSGMembershipStatus_encode_xer;
+oer_type_decoder_f CSGMembershipStatus_decode_oer;
+oer_type_encoder_f CSGMembershipStatus_encode_oer;
+per_type_decoder_f CSGMembershipStatus_decode_uper;
+per_type_encoder_f CSGMembershipStatus_encode_uper;
+per_type_decoder_f CSGMembershipStatus_decode_aper;
+per_type_encoder_f CSGMembershipStatus_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CSGMembershipStatus_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CancelledCellinEAI-Item.h b/src/s1ap/asn1c/asnGenFiles/CancelledCellinEAI-Item.h
new file mode 100644
index 0000000..5472cc9
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CancelledCellinEAI-Item.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CancelledCellinEAI_Item_H_
+#define	_CancelledCellinEAI_Item_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "EUTRAN-CGI.h"
+#include "NumberOfBroadcasts.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* CancelledCellinEAI-Item */
+typedef struct CancelledCellinEAI_Item {
+	EUTRAN_CGI_t	 eCGI;
+	NumberOfBroadcasts_t	 numberOfBroadcasts;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CancelledCellinEAI_Item_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_CancelledCellinEAI_Item;
+extern asn_SEQUENCE_specifics_t asn_SPC_CancelledCellinEAI_Item_specs_1;
+extern asn_TYPE_member_t asn_MBR_CancelledCellinEAI_Item_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CancelledCellinEAI_Item_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CancelledCellinEAI.h b/src/s1ap/asn1c/asnGenFiles/CancelledCellinEAI.h
new file mode 100644
index 0000000..a244c3f
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CancelledCellinEAI.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CancelledCellinEAI_H_
+#define	_CancelledCellinEAI_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct CancelledCellinEAI_Item;
+
+/* CancelledCellinEAI */
+typedef struct CancelledCellinEAI {
+	A_SEQUENCE_OF(struct CancelledCellinEAI_Item) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CancelledCellinEAI_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_CancelledCellinEAI;
+extern asn_SET_OF_specifics_t asn_SPC_CancelledCellinEAI_specs_1;
+extern asn_TYPE_member_t asn_MBR_CancelledCellinEAI_1[1];
+extern asn_per_constraints_t asn_PER_type_CancelledCellinEAI_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CancelledCellinEAI_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CancelledCellinTAI-Item.h b/src/s1ap/asn1c/asnGenFiles/CancelledCellinTAI-Item.h
new file mode 100644
index 0000000..37beed5
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CancelledCellinTAI-Item.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CancelledCellinTAI_Item_H_
+#define	_CancelledCellinTAI_Item_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "EUTRAN-CGI.h"
+#include "NumberOfBroadcasts.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* CancelledCellinTAI-Item */
+typedef struct CancelledCellinTAI_Item {
+	EUTRAN_CGI_t	 eCGI;
+	NumberOfBroadcasts_t	 numberOfBroadcasts;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CancelledCellinTAI_Item_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_CancelledCellinTAI_Item;
+extern asn_SEQUENCE_specifics_t asn_SPC_CancelledCellinTAI_Item_specs_1;
+extern asn_TYPE_member_t asn_MBR_CancelledCellinTAI_Item_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CancelledCellinTAI_Item_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CancelledCellinTAI.h b/src/s1ap/asn1c/asnGenFiles/CancelledCellinTAI.h
new file mode 100644
index 0000000..de668a3
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CancelledCellinTAI.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CancelledCellinTAI_H_
+#define	_CancelledCellinTAI_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct CancelledCellinTAI_Item;
+
+/* CancelledCellinTAI */
+typedef struct CancelledCellinTAI {
+	A_SEQUENCE_OF(struct CancelledCellinTAI_Item) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CancelledCellinTAI_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_CancelledCellinTAI;
+extern asn_SET_OF_specifics_t asn_SPC_CancelledCellinTAI_specs_1;
+extern asn_TYPE_member_t asn_MBR_CancelledCellinTAI_1[1];
+extern asn_per_constraints_t asn_PER_type_CancelledCellinTAI_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CancelledCellinTAI_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Cause.h b/src/s1ap/asn1c/asnGenFiles/Cause.h
new file mode 100644
index 0000000..b2d3cbc
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Cause.h
@@ -0,0 +1,68 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Cause_H_
+#define	_Cause_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "CauseRadioNetwork.h"
+#include "CauseTransport.h"
+#include "CauseNas.h"
+#include "CauseProtocol.h"
+#include "CauseMisc.h"
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum Cause_PR {
+	Cause_PR_NOTHING,	/* No components present */
+	Cause_PR_radioNetwork,
+	Cause_PR_transport,
+	Cause_PR_nas,
+	Cause_PR_protocol,
+	Cause_PR_misc
+	/* Extensions may appear below */
+	
+} Cause_PR;
+
+/* Cause */
+typedef struct Cause {
+	Cause_PR present;
+	union Cause_u {
+		CauseRadioNetwork_t	 radioNetwork;
+		CauseTransport_t	 transport;
+		CauseNas_t	 nas;
+		CauseProtocol_t	 protocol;
+		CauseMisc_t	 misc;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} Cause_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_Cause;
+extern asn_CHOICE_specifics_t asn_SPC_Cause_specs_1;
+extern asn_TYPE_member_t asn_MBR_Cause_1[5];
+extern asn_per_constraints_t asn_PER_type_Cause_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Cause_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CauseMisc.h b/src/s1ap/asn1c/asnGenFiles/CauseMisc.h
new file mode 100644
index 0000000..41607d4
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CauseMisc.h
@@ -0,0 +1,60 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CauseMisc_H_
+#define	_CauseMisc_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum CauseMisc {
+	CauseMisc_control_processing_overload	= 0,
+	CauseMisc_not_enough_user_plane_processing_resources	= 1,
+	CauseMisc_hardware_failure	= 2,
+	CauseMisc_om_intervention	= 3,
+	CauseMisc_unspecified	= 4,
+	CauseMisc_unknown_PLMN	= 5
+	/*
+	 * Enumeration is extensible
+	 */
+} e_CauseMisc;
+
+/* CauseMisc */
+typedef long	 CauseMisc_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_CauseMisc_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_CauseMisc;
+extern const asn_INTEGER_specifics_t asn_SPC_CauseMisc_specs_1;
+asn_struct_free_f CauseMisc_free;
+asn_struct_print_f CauseMisc_print;
+asn_constr_check_f CauseMisc_constraint;
+ber_type_decoder_f CauseMisc_decode_ber;
+der_type_encoder_f CauseMisc_encode_der;
+xer_type_decoder_f CauseMisc_decode_xer;
+xer_type_encoder_f CauseMisc_encode_xer;
+oer_type_decoder_f CauseMisc_decode_oer;
+oer_type_encoder_f CauseMisc_encode_oer;
+per_type_decoder_f CauseMisc_decode_uper;
+per_type_encoder_f CauseMisc_encode_uper;
+per_type_decoder_f CauseMisc_decode_aper;
+per_type_encoder_f CauseMisc_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CauseMisc_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CauseNas.h b/src/s1ap/asn1c/asnGenFiles/CauseNas.h
new file mode 100644
index 0000000..0e24347
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CauseNas.h
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CauseNas_H_
+#define	_CauseNas_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum CauseNas {
+	CauseNas_normal_release	= 0,
+	CauseNas_authentication_failure	= 1,
+	CauseNas_detach	= 2,
+	CauseNas_unspecified	= 3,
+	/*
+	 * Enumeration is extensible
+	 */
+	CauseNas_csg_subscription_expiry	= 4
+} e_CauseNas;
+
+/* CauseNas */
+typedef long	 CauseNas_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_CauseNas_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_CauseNas;
+extern const asn_INTEGER_specifics_t asn_SPC_CauseNas_specs_1;
+asn_struct_free_f CauseNas_free;
+asn_struct_print_f CauseNas_print;
+asn_constr_check_f CauseNas_constraint;
+ber_type_decoder_f CauseNas_decode_ber;
+der_type_encoder_f CauseNas_encode_der;
+xer_type_decoder_f CauseNas_decode_xer;
+xer_type_encoder_f CauseNas_encode_xer;
+oer_type_decoder_f CauseNas_decode_oer;
+oer_type_encoder_f CauseNas_encode_oer;
+per_type_decoder_f CauseNas_decode_uper;
+per_type_encoder_f CauseNas_encode_uper;
+per_type_decoder_f CauseNas_decode_aper;
+per_type_encoder_f CauseNas_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CauseNas_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CauseProtocol.h b/src/s1ap/asn1c/asnGenFiles/CauseProtocol.h
new file mode 100644
index 0000000..dfc32ed
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CauseProtocol.h
@@ -0,0 +1,61 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CauseProtocol_H_
+#define	_CauseProtocol_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum CauseProtocol {
+	CauseProtocol_transfer_syntax_error	= 0,
+	CauseProtocol_abstract_syntax_error_reject	= 1,
+	CauseProtocol_abstract_syntax_error_ignore_and_notify	= 2,
+	CauseProtocol_message_not_compatible_with_receiver_state	= 3,
+	CauseProtocol_semantic_error	= 4,
+	CauseProtocol_abstract_syntax_error_falsely_constructed_message	= 5,
+	CauseProtocol_unspecified	= 6
+	/*
+	 * Enumeration is extensible
+	 */
+} e_CauseProtocol;
+
+/* CauseProtocol */
+typedef long	 CauseProtocol_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_CauseProtocol_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_CauseProtocol;
+extern const asn_INTEGER_specifics_t asn_SPC_CauseProtocol_specs_1;
+asn_struct_free_f CauseProtocol_free;
+asn_struct_print_f CauseProtocol_print;
+asn_constr_check_f CauseProtocol_constraint;
+ber_type_decoder_f CauseProtocol_decode_ber;
+der_type_encoder_f CauseProtocol_encode_der;
+xer_type_decoder_f CauseProtocol_decode_xer;
+xer_type_encoder_f CauseProtocol_encode_xer;
+oer_type_decoder_f CauseProtocol_decode_oer;
+oer_type_encoder_f CauseProtocol_encode_oer;
+per_type_decoder_f CauseProtocol_decode_uper;
+per_type_encoder_f CauseProtocol_encode_uper;
+per_type_decoder_f CauseProtocol_decode_aper;
+per_type_encoder_f CauseProtocol_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CauseProtocol_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CauseRadioNetwork.h b/src/s1ap/asn1c/asnGenFiles/CauseRadioNetwork.h
new file mode 100644
index 0000000..b127684
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CauseRadioNetwork.h
@@ -0,0 +1,94 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CauseRadioNetwork_H_
+#define	_CauseRadioNetwork_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum CauseRadioNetwork {
+	CauseRadioNetwork_unspecified	= 0,
+	CauseRadioNetwork_tx2relocoverall_expiry	= 1,
+	CauseRadioNetwork_successful_handover	= 2,
+	CauseRadioNetwork_release_due_to_eutran_generated_reason	= 3,
+	CauseRadioNetwork_handover_cancelled	= 4,
+	CauseRadioNetwork_partial_handover	= 5,
+	CauseRadioNetwork_ho_failure_in_target_EPC_eNB_or_target_system	= 6,
+	CauseRadioNetwork_ho_target_not_allowed	= 7,
+	CauseRadioNetwork_tS1relocoverall_expiry	= 8,
+	CauseRadioNetwork_tS1relocprep_expiry	= 9,
+	CauseRadioNetwork_cell_not_available	= 10,
+	CauseRadioNetwork_unknown_targetID	= 11,
+	CauseRadioNetwork_no_radio_resources_available_in_target_cell	= 12,
+	CauseRadioNetwork_unknown_mme_ue_s1ap_id	= 13,
+	CauseRadioNetwork_unknown_enb_ue_s1ap_id	= 14,
+	CauseRadioNetwork_unknown_pair_ue_s1ap_id	= 15,
+	CauseRadioNetwork_handover_desirable_for_radio_reason	= 16,
+	CauseRadioNetwork_time_critical_handover	= 17,
+	CauseRadioNetwork_resource_optimisation_handover	= 18,
+	CauseRadioNetwork_reduce_load_in_serving_cell	= 19,
+	CauseRadioNetwork_user_inactivity	= 20,
+	CauseRadioNetwork_radio_connection_with_ue_lost	= 21,
+	CauseRadioNetwork_load_balancing_tau_required	= 22,
+	CauseRadioNetwork_cs_fallback_triggered	= 23,
+	CauseRadioNetwork_ue_not_available_for_ps_service	= 24,
+	CauseRadioNetwork_radio_resources_not_available	= 25,
+	CauseRadioNetwork_failure_in_radio_interface_procedure	= 26,
+	CauseRadioNetwork_invalid_qos_combination	= 27,
+	CauseRadioNetwork_interrat_redirection	= 28,
+	CauseRadioNetwork_interaction_with_other_procedure	= 29,
+	CauseRadioNetwork_unknown_E_RAB_ID	= 30,
+	CauseRadioNetwork_multiple_E_RAB_ID_instances	= 31,
+	CauseRadioNetwork_encryption_and_or_integrity_protection_algorithms_not_supported	= 32,
+	CauseRadioNetwork_s1_intra_system_handover_triggered	= 33,
+	CauseRadioNetwork_s1_inter_system_handover_triggered	= 34,
+	CauseRadioNetwork_x2_handover_triggered	= 35,
+	/*
+	 * Enumeration is extensible
+	 */
+	CauseRadioNetwork_redirection_towards_1xRTT	= 36,
+	CauseRadioNetwork_not_supported_QCI_value	= 37,
+	CauseRadioNetwork_invalid_CSG_Id	= 38,
+	CauseRadioNetwork_release_due_to_pre_emption	= 39
+} e_CauseRadioNetwork;
+
+/* CauseRadioNetwork */
+typedef long	 CauseRadioNetwork_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_CauseRadioNetwork_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_CauseRadioNetwork;
+extern const asn_INTEGER_specifics_t asn_SPC_CauseRadioNetwork_specs_1;
+asn_struct_free_f CauseRadioNetwork_free;
+asn_struct_print_f CauseRadioNetwork_print;
+asn_constr_check_f CauseRadioNetwork_constraint;
+ber_type_decoder_f CauseRadioNetwork_decode_ber;
+der_type_encoder_f CauseRadioNetwork_encode_der;
+xer_type_decoder_f CauseRadioNetwork_decode_xer;
+xer_type_encoder_f CauseRadioNetwork_encode_xer;
+oer_type_decoder_f CauseRadioNetwork_decode_oer;
+oer_type_encoder_f CauseRadioNetwork_encode_oer;
+per_type_decoder_f CauseRadioNetwork_decode_uper;
+per_type_encoder_f CauseRadioNetwork_encode_uper;
+per_type_decoder_f CauseRadioNetwork_decode_aper;
+per_type_encoder_f CauseRadioNetwork_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CauseRadioNetwork_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CauseTransport.h b/src/s1ap/asn1c/asnGenFiles/CauseTransport.h
new file mode 100644
index 0000000..a67cb03
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CauseTransport.h
@@ -0,0 +1,56 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CauseTransport_H_
+#define	_CauseTransport_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum CauseTransport {
+	CauseTransport_transport_resource_unavailable	= 0,
+	CauseTransport_unspecified	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_CauseTransport;
+
+/* CauseTransport */
+typedef long	 CauseTransport_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_CauseTransport_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_CauseTransport;
+extern const asn_INTEGER_specifics_t asn_SPC_CauseTransport_specs_1;
+asn_struct_free_f CauseTransport_free;
+asn_struct_print_f CauseTransport_print;
+asn_constr_check_f CauseTransport_constraint;
+ber_type_decoder_f CauseTransport_decode_ber;
+der_type_encoder_f CauseTransport_encode_der;
+xer_type_decoder_f CauseTransport_decode_xer;
+xer_type_encoder_f CauseTransport_encode_xer;
+oer_type_decoder_f CauseTransport_decode_oer;
+oer_type_encoder_f CauseTransport_encode_oer;
+per_type_decoder_f CauseTransport_decode_uper;
+per_type_encoder_f CauseTransport_encode_uper;
+per_type_decoder_f CauseTransport_decode_aper;
+per_type_encoder_f CauseTransport_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CauseTransport_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Cdma2000HORequiredIndication.h b/src/s1ap/asn1c/asnGenFiles/Cdma2000HORequiredIndication.h
new file mode 100644
index 0000000..7cb55c6
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Cdma2000HORequiredIndication.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Cdma2000HORequiredIndication_H_
+#define	_Cdma2000HORequiredIndication_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum Cdma2000HORequiredIndication {
+	Cdma2000HORequiredIndication_true	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_Cdma2000HORequiredIndication;
+
+/* Cdma2000HORequiredIndication */
+typedef long	 Cdma2000HORequiredIndication_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_Cdma2000HORequiredIndication_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_Cdma2000HORequiredIndication;
+extern const asn_INTEGER_specifics_t asn_SPC_Cdma2000HORequiredIndication_specs_1;
+asn_struct_free_f Cdma2000HORequiredIndication_free;
+asn_struct_print_f Cdma2000HORequiredIndication_print;
+asn_constr_check_f Cdma2000HORequiredIndication_constraint;
+ber_type_decoder_f Cdma2000HORequiredIndication_decode_ber;
+der_type_encoder_f Cdma2000HORequiredIndication_encode_der;
+xer_type_decoder_f Cdma2000HORequiredIndication_decode_xer;
+xer_type_encoder_f Cdma2000HORequiredIndication_encode_xer;
+oer_type_decoder_f Cdma2000HORequiredIndication_decode_oer;
+oer_type_encoder_f Cdma2000HORequiredIndication_encode_oer;
+per_type_decoder_f Cdma2000HORequiredIndication_decode_uper;
+per_type_encoder_f Cdma2000HORequiredIndication_encode_uper;
+per_type_decoder_f Cdma2000HORequiredIndication_decode_aper;
+per_type_encoder_f Cdma2000HORequiredIndication_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Cdma2000HORequiredIndication_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Cdma2000HOStatus.h b/src/s1ap/asn1c/asnGenFiles/Cdma2000HOStatus.h
new file mode 100644
index 0000000..6cbb1a2
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Cdma2000HOStatus.h
@@ -0,0 +1,56 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Cdma2000HOStatus_H_
+#define	_Cdma2000HOStatus_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum Cdma2000HOStatus {
+	Cdma2000HOStatus_hOSuccess	= 0,
+	Cdma2000HOStatus_hOFailure	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_Cdma2000HOStatus;
+
+/* Cdma2000HOStatus */
+typedef long	 Cdma2000HOStatus_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_Cdma2000HOStatus_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_Cdma2000HOStatus;
+extern const asn_INTEGER_specifics_t asn_SPC_Cdma2000HOStatus_specs_1;
+asn_struct_free_f Cdma2000HOStatus_free;
+asn_struct_print_f Cdma2000HOStatus_print;
+asn_constr_check_f Cdma2000HOStatus_constraint;
+ber_type_decoder_f Cdma2000HOStatus_decode_ber;
+der_type_encoder_f Cdma2000HOStatus_encode_der;
+xer_type_decoder_f Cdma2000HOStatus_decode_xer;
+xer_type_encoder_f Cdma2000HOStatus_encode_xer;
+oer_type_decoder_f Cdma2000HOStatus_decode_oer;
+oer_type_encoder_f Cdma2000HOStatus_encode_oer;
+per_type_decoder_f Cdma2000HOStatus_decode_uper;
+per_type_encoder_f Cdma2000HOStatus_encode_uper;
+per_type_decoder_f Cdma2000HOStatus_decode_aper;
+per_type_encoder_f Cdma2000HOStatus_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Cdma2000HOStatus_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Cdma2000OneXMEID.h b/src/s1ap/asn1c/asnGenFiles/Cdma2000OneXMEID.h
new file mode 100644
index 0000000..da1a7a2
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Cdma2000OneXMEID.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Cdma2000OneXMEID_H_
+#define	_Cdma2000OneXMEID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Cdma2000OneXMEID */
+typedef OCTET_STRING_t	 Cdma2000OneXMEID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_Cdma2000OneXMEID;
+asn_struct_free_f Cdma2000OneXMEID_free;
+asn_struct_print_f Cdma2000OneXMEID_print;
+asn_constr_check_f Cdma2000OneXMEID_constraint;
+ber_type_decoder_f Cdma2000OneXMEID_decode_ber;
+der_type_encoder_f Cdma2000OneXMEID_encode_der;
+xer_type_decoder_f Cdma2000OneXMEID_decode_xer;
+xer_type_encoder_f Cdma2000OneXMEID_encode_xer;
+oer_type_decoder_f Cdma2000OneXMEID_decode_oer;
+oer_type_encoder_f Cdma2000OneXMEID_encode_oer;
+per_type_decoder_f Cdma2000OneXMEID_decode_uper;
+per_type_encoder_f Cdma2000OneXMEID_encode_uper;
+per_type_decoder_f Cdma2000OneXMEID_decode_aper;
+per_type_encoder_f Cdma2000OneXMEID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Cdma2000OneXMEID_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Cdma2000OneXMSI.h b/src/s1ap/asn1c/asnGenFiles/Cdma2000OneXMSI.h
new file mode 100644
index 0000000..38d6015
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Cdma2000OneXMSI.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Cdma2000OneXMSI_H_
+#define	_Cdma2000OneXMSI_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Cdma2000OneXMSI */
+typedef OCTET_STRING_t	 Cdma2000OneXMSI_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_Cdma2000OneXMSI;
+asn_struct_free_f Cdma2000OneXMSI_free;
+asn_struct_print_f Cdma2000OneXMSI_print;
+asn_constr_check_f Cdma2000OneXMSI_constraint;
+ber_type_decoder_f Cdma2000OneXMSI_decode_ber;
+der_type_encoder_f Cdma2000OneXMSI_encode_der;
+xer_type_decoder_f Cdma2000OneXMSI_decode_xer;
+xer_type_encoder_f Cdma2000OneXMSI_encode_xer;
+oer_type_decoder_f Cdma2000OneXMSI_decode_oer;
+oer_type_encoder_f Cdma2000OneXMSI_encode_oer;
+per_type_decoder_f Cdma2000OneXMSI_decode_uper;
+per_type_encoder_f Cdma2000OneXMSI_encode_uper;
+per_type_decoder_f Cdma2000OneXMSI_decode_aper;
+per_type_encoder_f Cdma2000OneXMSI_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Cdma2000OneXMSI_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Cdma2000OneXPilot.h b/src/s1ap/asn1c/asnGenFiles/Cdma2000OneXPilot.h
new file mode 100644
index 0000000..c25ff66
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Cdma2000OneXPilot.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Cdma2000OneXPilot_H_
+#define	_Cdma2000OneXPilot_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Cdma2000OneXPilot */
+typedef OCTET_STRING_t	 Cdma2000OneXPilot_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_Cdma2000OneXPilot;
+asn_struct_free_f Cdma2000OneXPilot_free;
+asn_struct_print_f Cdma2000OneXPilot_print;
+asn_constr_check_f Cdma2000OneXPilot_constraint;
+ber_type_decoder_f Cdma2000OneXPilot_decode_ber;
+der_type_encoder_f Cdma2000OneXPilot_encode_der;
+xer_type_decoder_f Cdma2000OneXPilot_decode_xer;
+xer_type_encoder_f Cdma2000OneXPilot_encode_xer;
+oer_type_decoder_f Cdma2000OneXPilot_decode_oer;
+oer_type_encoder_f Cdma2000OneXPilot_encode_oer;
+per_type_decoder_f Cdma2000OneXPilot_decode_uper;
+per_type_encoder_f Cdma2000OneXPilot_encode_uper;
+per_type_decoder_f Cdma2000OneXPilot_decode_aper;
+per_type_encoder_f Cdma2000OneXPilot_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Cdma2000OneXPilot_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Cdma2000OneXRAND.h b/src/s1ap/asn1c/asnGenFiles/Cdma2000OneXRAND.h
new file mode 100644
index 0000000..86a6713
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Cdma2000OneXRAND.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Cdma2000OneXRAND_H_
+#define	_Cdma2000OneXRAND_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Cdma2000OneXRAND */
+typedef OCTET_STRING_t	 Cdma2000OneXRAND_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_Cdma2000OneXRAND;
+asn_struct_free_f Cdma2000OneXRAND_free;
+asn_struct_print_f Cdma2000OneXRAND_print;
+asn_constr_check_f Cdma2000OneXRAND_constraint;
+ber_type_decoder_f Cdma2000OneXRAND_decode_ber;
+der_type_encoder_f Cdma2000OneXRAND_encode_der;
+xer_type_decoder_f Cdma2000OneXRAND_decode_xer;
+xer_type_encoder_f Cdma2000OneXRAND_encode_xer;
+oer_type_decoder_f Cdma2000OneXRAND_decode_oer;
+oer_type_encoder_f Cdma2000OneXRAND_encode_oer;
+per_type_decoder_f Cdma2000OneXRAND_decode_uper;
+per_type_encoder_f Cdma2000OneXRAND_encode_uper;
+per_type_decoder_f Cdma2000OneXRAND_decode_aper;
+per_type_encoder_f Cdma2000OneXRAND_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Cdma2000OneXRAND_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Cdma2000OneXSRVCCInfo.h b/src/s1ap/asn1c/asnGenFiles/Cdma2000OneXSRVCCInfo.h
new file mode 100644
index 0000000..24c4e2c
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Cdma2000OneXSRVCCInfo.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Cdma2000OneXSRVCCInfo_H_
+#define	_Cdma2000OneXSRVCCInfo_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "Cdma2000OneXMEID.h"
+#include "Cdma2000OneXMSI.h"
+#include "Cdma2000OneXPilot.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* Cdma2000OneXSRVCCInfo */
+typedef struct Cdma2000OneXSRVCCInfo {
+	Cdma2000OneXMEID_t	 cdma2000OneXMEID;
+	Cdma2000OneXMSI_t	 cdma2000OneXMSI;
+	Cdma2000OneXPilot_t	 cdma2000OneXPilot;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} Cdma2000OneXSRVCCInfo_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_Cdma2000OneXSRVCCInfo;
+extern asn_SEQUENCE_specifics_t asn_SPC_Cdma2000OneXSRVCCInfo_specs_1;
+extern asn_TYPE_member_t asn_MBR_Cdma2000OneXSRVCCInfo_1[4];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Cdma2000OneXSRVCCInfo_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Cdma2000PDU.h b/src/s1ap/asn1c/asnGenFiles/Cdma2000PDU.h
new file mode 100644
index 0000000..c14d356
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Cdma2000PDU.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Cdma2000PDU_H_
+#define	_Cdma2000PDU_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Cdma2000PDU */
+typedef OCTET_STRING_t	 Cdma2000PDU_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_Cdma2000PDU;
+asn_struct_free_f Cdma2000PDU_free;
+asn_struct_print_f Cdma2000PDU_print;
+asn_constr_check_f Cdma2000PDU_constraint;
+ber_type_decoder_f Cdma2000PDU_decode_ber;
+der_type_encoder_f Cdma2000PDU_encode_der;
+xer_type_decoder_f Cdma2000PDU_decode_xer;
+xer_type_encoder_f Cdma2000PDU_encode_xer;
+oer_type_decoder_f Cdma2000PDU_decode_oer;
+oer_type_encoder_f Cdma2000PDU_encode_oer;
+per_type_decoder_f Cdma2000PDU_decode_uper;
+per_type_encoder_f Cdma2000PDU_encode_uper;
+per_type_decoder_f Cdma2000PDU_decode_aper;
+per_type_encoder_f Cdma2000PDU_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Cdma2000PDU_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Cdma2000RATType.h b/src/s1ap/asn1c/asnGenFiles/Cdma2000RATType.h
new file mode 100644
index 0000000..5c4a8e8
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Cdma2000RATType.h
@@ -0,0 +1,56 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Cdma2000RATType_H_
+#define	_Cdma2000RATType_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum Cdma2000RATType {
+	Cdma2000RATType_hRPD	= 0,
+	Cdma2000RATType_onexRTT	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_Cdma2000RATType;
+
+/* Cdma2000RATType */
+typedef long	 Cdma2000RATType_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_Cdma2000RATType_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_Cdma2000RATType;
+extern const asn_INTEGER_specifics_t asn_SPC_Cdma2000RATType_specs_1;
+asn_struct_free_f Cdma2000RATType_free;
+asn_struct_print_f Cdma2000RATType_print;
+asn_constr_check_f Cdma2000RATType_constraint;
+ber_type_decoder_f Cdma2000RATType_decode_ber;
+der_type_encoder_f Cdma2000RATType_encode_der;
+xer_type_decoder_f Cdma2000RATType_decode_xer;
+xer_type_encoder_f Cdma2000RATType_encode_xer;
+oer_type_decoder_f Cdma2000RATType_decode_oer;
+oer_type_encoder_f Cdma2000RATType_encode_oer;
+per_type_decoder_f Cdma2000RATType_decode_uper;
+per_type_encoder_f Cdma2000RATType_encode_uper;
+per_type_decoder_f Cdma2000RATType_decode_aper;
+per_type_encoder_f Cdma2000RATType_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Cdma2000RATType_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Cdma2000SectorID.h b/src/s1ap/asn1c/asnGenFiles/Cdma2000SectorID.h
new file mode 100644
index 0000000..1a2f4d4
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Cdma2000SectorID.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Cdma2000SectorID_H_
+#define	_Cdma2000SectorID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Cdma2000SectorID */
+typedef OCTET_STRING_t	 Cdma2000SectorID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_Cdma2000SectorID;
+asn_struct_free_f Cdma2000SectorID_free;
+asn_struct_print_f Cdma2000SectorID_print;
+asn_constr_check_f Cdma2000SectorID_constraint;
+ber_type_decoder_f Cdma2000SectorID_decode_ber;
+der_type_encoder_f Cdma2000SectorID_encode_der;
+xer_type_decoder_f Cdma2000SectorID_decode_xer;
+xer_type_encoder_f Cdma2000SectorID_encode_xer;
+oer_type_decoder_f Cdma2000SectorID_decode_oer;
+oer_type_encoder_f Cdma2000SectorID_encode_oer;
+per_type_decoder_f Cdma2000SectorID_decode_uper;
+per_type_encoder_f Cdma2000SectorID_encode_uper;
+per_type_decoder_f Cdma2000SectorID_decode_aper;
+per_type_encoder_f Cdma2000SectorID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Cdma2000SectorID_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Cell-Size.h b/src/s1ap/asn1c/asnGenFiles/Cell-Size.h
new file mode 100644
index 0000000..7180089
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Cell-Size.h
@@ -0,0 +1,58 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Cell_Size_H_
+#define	_Cell_Size_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum Cell_Size {
+	Cell_Size_verysmall	= 0,
+	Cell_Size_small	= 1,
+	Cell_Size_medium	= 2,
+	Cell_Size_large	= 3
+	/*
+	 * Enumeration is extensible
+	 */
+} e_Cell_Size;
+
+/* Cell-Size */
+typedef long	 Cell_Size_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_Cell_Size_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_Cell_Size;
+extern const asn_INTEGER_specifics_t asn_SPC_Cell_Size_specs_1;
+asn_struct_free_f Cell_Size_free;
+asn_struct_print_f Cell_Size_print;
+asn_constr_check_f Cell_Size_constraint;
+ber_type_decoder_f Cell_Size_decode_ber;
+der_type_encoder_f Cell_Size_encode_der;
+xer_type_decoder_f Cell_Size_decode_xer;
+xer_type_encoder_f Cell_Size_encode_xer;
+oer_type_decoder_f Cell_Size_decode_oer;
+oer_type_encoder_f Cell_Size_encode_oer;
+per_type_decoder_f Cell_Size_decode_uper;
+per_type_encoder_f Cell_Size_encode_uper;
+per_type_decoder_f Cell_Size_decode_aper;
+per_type_encoder_f Cell_Size_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Cell_Size_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CellAccessMode.h b/src/s1ap/asn1c/asnGenFiles/CellAccessMode.h
new file mode 100644
index 0000000..6da8223
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CellAccessMode.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CellAccessMode_H_
+#define	_CellAccessMode_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum CellAccessMode {
+	CellAccessMode_hybrid	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_CellAccessMode;
+
+/* CellAccessMode */
+typedef long	 CellAccessMode_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_CellAccessMode_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_CellAccessMode;
+extern const asn_INTEGER_specifics_t asn_SPC_CellAccessMode_specs_1;
+asn_struct_free_f CellAccessMode_free;
+asn_struct_print_f CellAccessMode_print;
+asn_constr_check_f CellAccessMode_constraint;
+ber_type_decoder_f CellAccessMode_decode_ber;
+der_type_encoder_f CellAccessMode_encode_der;
+xer_type_decoder_f CellAccessMode_decode_xer;
+xer_type_encoder_f CellAccessMode_encode_xer;
+oer_type_decoder_f CellAccessMode_decode_oer;
+oer_type_encoder_f CellAccessMode_encode_oer;
+per_type_decoder_f CellAccessMode_decode_uper;
+per_type_encoder_f CellAccessMode_encode_uper;
+per_type_decoder_f CellAccessMode_decode_aper;
+per_type_encoder_f CellAccessMode_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CellAccessMode_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CellBasedMDT.h b/src/s1ap/asn1c/asnGenFiles/CellBasedMDT.h
new file mode 100644
index 0000000..d69eca8
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CellBasedMDT.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CellBasedMDT_H_
+#define	_CellBasedMDT_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "CellIdListforMDT.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* CellBasedMDT */
+typedef struct CellBasedMDT {
+	CellIdListforMDT_t	 cellIdListforMDT;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CellBasedMDT_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_CellBasedMDT;
+extern asn_SEQUENCE_specifics_t asn_SPC_CellBasedMDT_specs_1;
+extern asn_TYPE_member_t asn_MBR_CellBasedMDT_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CellBasedMDT_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CellBasedQMC.h b/src/s1ap/asn1c/asnGenFiles/CellBasedQMC.h
new file mode 100644
index 0000000..e6af5fb
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CellBasedQMC.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CellBasedQMC_H_
+#define	_CellBasedQMC_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "CellIdListforQMC.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* CellBasedQMC */
+typedef struct CellBasedQMC {
+	CellIdListforQMC_t	 cellIdListforQMC;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CellBasedQMC_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_CellBasedQMC;
+extern asn_SEQUENCE_specifics_t asn_SPC_CellBasedQMC_specs_1;
+extern asn_TYPE_member_t asn_MBR_CellBasedQMC_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CellBasedQMC_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CellID-Broadcast-Item.h b/src/s1ap/asn1c/asnGenFiles/CellID-Broadcast-Item.h
new file mode 100644
index 0000000..946b453
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CellID-Broadcast-Item.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CellID_Broadcast_Item_H_
+#define	_CellID_Broadcast_Item_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "EUTRAN-CGI.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* CellID-Broadcast-Item */
+typedef struct CellID_Broadcast_Item {
+	EUTRAN_CGI_t	 eCGI;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CellID_Broadcast_Item_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_CellID_Broadcast_Item;
+extern asn_SEQUENCE_specifics_t asn_SPC_CellID_Broadcast_Item_specs_1;
+extern asn_TYPE_member_t asn_MBR_CellID_Broadcast_Item_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CellID_Broadcast_Item_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CellID-Broadcast.h b/src/s1ap/asn1c/asnGenFiles/CellID-Broadcast.h
new file mode 100644
index 0000000..b7d7392
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CellID-Broadcast.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CellID_Broadcast_H_
+#define	_CellID_Broadcast_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct CellID_Broadcast_Item;
+
+/* CellID-Broadcast */
+typedef struct CellID_Broadcast {
+	A_SEQUENCE_OF(struct CellID_Broadcast_Item) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CellID_Broadcast_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_CellID_Broadcast;
+extern asn_SET_OF_specifics_t asn_SPC_CellID_Broadcast_specs_1;
+extern asn_TYPE_member_t asn_MBR_CellID_Broadcast_1[1];
+extern asn_per_constraints_t asn_PER_type_CellID_Broadcast_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CellID_Broadcast_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CellID-Cancelled-Item.h b/src/s1ap/asn1c/asnGenFiles/CellID-Cancelled-Item.h
new file mode 100644
index 0000000..5d66a10
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CellID-Cancelled-Item.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CellID_Cancelled_Item_H_
+#define	_CellID_Cancelled_Item_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "EUTRAN-CGI.h"
+#include "NumberOfBroadcasts.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* CellID-Cancelled-Item */
+typedef struct CellID_Cancelled_Item {
+	EUTRAN_CGI_t	 eCGI;
+	NumberOfBroadcasts_t	 numberOfBroadcasts;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CellID_Cancelled_Item_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_CellID_Cancelled_Item;
+extern asn_SEQUENCE_specifics_t asn_SPC_CellID_Cancelled_Item_specs_1;
+extern asn_TYPE_member_t asn_MBR_CellID_Cancelled_Item_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CellID_Cancelled_Item_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CellID-Cancelled.h b/src/s1ap/asn1c/asnGenFiles/CellID-Cancelled.h
new file mode 100644
index 0000000..f26f3a3
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CellID-Cancelled.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CellID_Cancelled_H_
+#define	_CellID_Cancelled_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct CellID_Cancelled_Item;
+
+/* CellID-Cancelled */
+typedef struct CellID_Cancelled {
+	A_SEQUENCE_OF(struct CellID_Cancelled_Item) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CellID_Cancelled_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_CellID_Cancelled;
+extern asn_SET_OF_specifics_t asn_SPC_CellID_Cancelled_specs_1;
+extern asn_TYPE_member_t asn_MBR_CellID_Cancelled_1[1];
+extern asn_per_constraints_t asn_PER_type_CellID_Cancelled_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CellID_Cancelled_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CellIdListforMDT.h b/src/s1ap/asn1c/asnGenFiles/CellIdListforMDT.h
new file mode 100644
index 0000000..360bd16
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CellIdListforMDT.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CellIdListforMDT_H_
+#define	_CellIdListforMDT_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct EUTRAN_CGI;
+
+/* CellIdListforMDT */
+typedef struct CellIdListforMDT {
+	A_SEQUENCE_OF(struct EUTRAN_CGI) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CellIdListforMDT_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_CellIdListforMDT;
+extern asn_SET_OF_specifics_t asn_SPC_CellIdListforMDT_specs_1;
+extern asn_TYPE_member_t asn_MBR_CellIdListforMDT_1[1];
+extern asn_per_constraints_t asn_PER_type_CellIdListforMDT_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CellIdListforMDT_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CellIdListforQMC.h b/src/s1ap/asn1c/asnGenFiles/CellIdListforQMC.h
new file mode 100644
index 0000000..628e98b
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CellIdListforQMC.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CellIdListforQMC_H_
+#define	_CellIdListforQMC_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct EUTRAN_CGI;
+
+/* CellIdListforQMC */
+typedef struct CellIdListforQMC {
+	A_SEQUENCE_OF(struct EUTRAN_CGI) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CellIdListforQMC_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_CellIdListforQMC;
+extern asn_SET_OF_specifics_t asn_SPC_CellIdListforQMC_specs_1;
+extern asn_TYPE_member_t asn_MBR_CellIdListforQMC_1[1];
+extern asn_per_constraints_t asn_PER_type_CellIdListforQMC_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CellIdListforQMC_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CellIdentifierAndCELevelForCECapableUEs.h b/src/s1ap/asn1c/asnGenFiles/CellIdentifierAndCELevelForCECapableUEs.h
new file mode 100644
index 0000000..89f0cc4
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CellIdentifierAndCELevelForCECapableUEs.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CellIdentifierAndCELevelForCECapableUEs_H_
+#define	_CellIdentifierAndCELevelForCECapableUEs_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "EUTRAN-CGI.h"
+#include "CELevel.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* CellIdentifierAndCELevelForCECapableUEs */
+typedef struct CellIdentifierAndCELevelForCECapableUEs {
+	EUTRAN_CGI_t	 global_Cell_ID;
+	CELevel_t	 cELevel;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CellIdentifierAndCELevelForCECapableUEs_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_CellIdentifierAndCELevelForCECapableUEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_CellIdentifierAndCELevelForCECapableUEs_specs_1;
+extern asn_TYPE_member_t asn_MBR_CellIdentifierAndCELevelForCECapableUEs_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CellIdentifierAndCELevelForCECapableUEs_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CellIdentity.h b/src/s1ap/asn1c/asnGenFiles/CellIdentity.h
new file mode 100644
index 0000000..7a10ea8
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CellIdentity.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CellIdentity_H_
+#define	_CellIdentity_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* CellIdentity */
+typedef BIT_STRING_t	 CellIdentity_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_CellIdentity_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_CellIdentity;
+asn_struct_free_f CellIdentity_free;
+asn_struct_print_f CellIdentity_print;
+asn_constr_check_f CellIdentity_constraint;
+ber_type_decoder_f CellIdentity_decode_ber;
+der_type_encoder_f CellIdentity_encode_der;
+xer_type_decoder_f CellIdentity_decode_xer;
+xer_type_encoder_f CellIdentity_encode_xer;
+oer_type_decoder_f CellIdentity_decode_oer;
+oer_type_encoder_f CellIdentity_encode_oer;
+per_type_decoder_f CellIdentity_decode_uper;
+per_type_encoder_f CellIdentity_encode_uper;
+per_type_decoder_f CellIdentity_decode_aper;
+per_type_encoder_f CellIdentity_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CellIdentity_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CellTrafficTrace.h b/src/s1ap/asn1c/asnGenFiles/CellTrafficTrace.h
new file mode 100644
index 0000000..d6b8bfe
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CellTrafficTrace.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CellTrafficTrace_H_
+#define	_CellTrafficTrace_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* CellTrafficTrace */
+typedef struct CellTrafficTrace {
+	ProtocolIE_Container_129P57_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CellTrafficTrace_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_CellTrafficTrace;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CellTrafficTrace_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CellType.h b/src/s1ap/asn1c/asnGenFiles/CellType.h
new file mode 100644
index 0000000..dfc855a
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CellType.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CellType_H_
+#define	_CellType_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "Cell-Size.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* CellType */
+typedef struct CellType {
+	Cell_Size_t	 cell_Size;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CellType_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_CellType;
+extern asn_SEQUENCE_specifics_t asn_SPC_CellType_specs_1;
+extern asn_TYPE_member_t asn_MBR_CellType_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CellType_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CompletedCellinEAI-Item.h b/src/s1ap/asn1c/asnGenFiles/CompletedCellinEAI-Item.h
new file mode 100644
index 0000000..aa016ef
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CompletedCellinEAI-Item.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CompletedCellinEAI_Item_H_
+#define	_CompletedCellinEAI_Item_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "EUTRAN-CGI.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* CompletedCellinEAI-Item */
+typedef struct CompletedCellinEAI_Item {
+	EUTRAN_CGI_t	 eCGI;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CompletedCellinEAI_Item_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_CompletedCellinEAI_Item;
+extern asn_SEQUENCE_specifics_t asn_SPC_CompletedCellinEAI_Item_specs_1;
+extern asn_TYPE_member_t asn_MBR_CompletedCellinEAI_Item_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CompletedCellinEAI_Item_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CompletedCellinEAI.h b/src/s1ap/asn1c/asnGenFiles/CompletedCellinEAI.h
new file mode 100644
index 0000000..2a685ca
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CompletedCellinEAI.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CompletedCellinEAI_H_
+#define	_CompletedCellinEAI_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct CompletedCellinEAI_Item;
+
+/* CompletedCellinEAI */
+typedef struct CompletedCellinEAI {
+	A_SEQUENCE_OF(struct CompletedCellinEAI_Item) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CompletedCellinEAI_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_CompletedCellinEAI;
+extern asn_SET_OF_specifics_t asn_SPC_CompletedCellinEAI_specs_1;
+extern asn_TYPE_member_t asn_MBR_CompletedCellinEAI_1[1];
+extern asn_per_constraints_t asn_PER_type_CompletedCellinEAI_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CompletedCellinEAI_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CompletedCellinTAI-Item.h b/src/s1ap/asn1c/asnGenFiles/CompletedCellinTAI-Item.h
new file mode 100644
index 0000000..6787d2c
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CompletedCellinTAI-Item.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CompletedCellinTAI_Item_H_
+#define	_CompletedCellinTAI_Item_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "EUTRAN-CGI.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* CompletedCellinTAI-Item */
+typedef struct CompletedCellinTAI_Item {
+	EUTRAN_CGI_t	 eCGI;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CompletedCellinTAI_Item_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_CompletedCellinTAI_Item;
+extern asn_SEQUENCE_specifics_t asn_SPC_CompletedCellinTAI_Item_specs_1;
+extern asn_TYPE_member_t asn_MBR_CompletedCellinTAI_Item_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CompletedCellinTAI_Item_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CompletedCellinTAI.h b/src/s1ap/asn1c/asnGenFiles/CompletedCellinTAI.h
new file mode 100644
index 0000000..108f04d
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CompletedCellinTAI.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CompletedCellinTAI_H_
+#define	_CompletedCellinTAI_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct CompletedCellinTAI_Item;
+
+/* CompletedCellinTAI */
+typedef struct CompletedCellinTAI {
+	A_SEQUENCE_OF(struct CompletedCellinTAI_Item) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CompletedCellinTAI_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_CompletedCellinTAI;
+extern asn_SET_OF_specifics_t asn_SPC_CompletedCellinTAI_specs_1;
+extern asn_TYPE_member_t asn_MBR_CompletedCellinTAI_1[1];
+extern asn_per_constraints_t asn_PER_type_CompletedCellinTAI_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CompletedCellinTAI_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ConcurrentWarningMessageIndicator.h b/src/s1ap/asn1c/asnGenFiles/ConcurrentWarningMessageIndicator.h
new file mode 100644
index 0000000..846ebbb
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ConcurrentWarningMessageIndicator.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ConcurrentWarningMessageIndicator_H_
+#define	_ConcurrentWarningMessageIndicator_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum ConcurrentWarningMessageIndicator {
+	ConcurrentWarningMessageIndicator_true	= 0
+} e_ConcurrentWarningMessageIndicator;
+
+/* ConcurrentWarningMessageIndicator */
+typedef long	 ConcurrentWarningMessageIndicator_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_ConcurrentWarningMessageIndicator_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_ConcurrentWarningMessageIndicator;
+extern const asn_INTEGER_specifics_t asn_SPC_ConcurrentWarningMessageIndicator_specs_1;
+asn_struct_free_f ConcurrentWarningMessageIndicator_free;
+asn_struct_print_f ConcurrentWarningMessageIndicator_print;
+asn_constr_check_f ConcurrentWarningMessageIndicator_constraint;
+ber_type_decoder_f ConcurrentWarningMessageIndicator_decode_ber;
+der_type_encoder_f ConcurrentWarningMessageIndicator_encode_der;
+xer_type_decoder_f ConcurrentWarningMessageIndicator_decode_xer;
+xer_type_encoder_f ConcurrentWarningMessageIndicator_encode_xer;
+oer_type_decoder_f ConcurrentWarningMessageIndicator_decode_oer;
+oer_type_encoder_f ConcurrentWarningMessageIndicator_encode_oer;
+per_type_decoder_f ConcurrentWarningMessageIndicator_decode_uper;
+per_type_encoder_f ConcurrentWarningMessageIndicator_encode_uper;
+per_type_decoder_f ConcurrentWarningMessageIndicator_decode_aper;
+per_type_encoder_f ConcurrentWarningMessageIndicator_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ConcurrentWarningMessageIndicator_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ConnectedengNBItem.h b/src/s1ap/asn1c/asnGenFiles/ConnectedengNBItem.h
new file mode 100644
index 0000000..405f6d4
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ConnectedengNBItem.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ConnectedengNBItem_H_
+#define	_ConnectedengNBItem_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "En-gNB-ID.h"
+#include "SupportedTAs.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* ConnectedengNBItem */
+typedef struct ConnectedengNBItem {
+	En_gNB_ID_t	 en_gNB_ID;
+	SupportedTAs_t	 supportedTAs;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ConnectedengNBItem_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ConnectedengNBItem;
+extern asn_SEQUENCE_specifics_t asn_SPC_ConnectedengNBItem_specs_1;
+extern asn_TYPE_member_t asn_MBR_ConnectedengNBItem_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ConnectedengNBItem_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ConnectedengNBList.h b/src/s1ap/asn1c/asnGenFiles/ConnectedengNBList.h
new file mode 100644
index 0000000..1fe4c7a
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ConnectedengNBList.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ConnectedengNBList_H_
+#define	_ConnectedengNBList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ConnectedengNBItem;
+
+/* ConnectedengNBList */
+typedef struct ConnectedengNBList {
+	A_SEQUENCE_OF(struct ConnectedengNBItem) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ConnectedengNBList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ConnectedengNBList;
+extern asn_SET_OF_specifics_t asn_SPC_ConnectedengNBList_specs_1;
+extern asn_TYPE_member_t asn_MBR_ConnectedengNBList_1[1];
+extern asn_per_constraints_t asn_PER_type_ConnectedengNBList_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ConnectedengNBList_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ConnectionEstablishmentIndication.h b/src/s1ap/asn1c/asnGenFiles/ConnectionEstablishmentIndication.h
new file mode 100644
index 0000000..32bbb0c
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ConnectionEstablishmentIndication.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ConnectionEstablishmentIndication_H_
+#define	_ConnectionEstablishmentIndication_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ConnectionEstablishmentIndication */
+typedef struct ConnectionEstablishmentIndication {
+	ProtocolIE_Container_129P86_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ConnectionEstablishmentIndication_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ConnectionEstablishmentIndication;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ConnectionEstablishmentIndication_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Correlation-ID.h b/src/s1ap/asn1c/asnGenFiles/Correlation-ID.h
new file mode 100644
index 0000000..ce143e3
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Correlation-ID.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Correlation_ID_H_
+#define	_Correlation_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Correlation-ID */
+typedef OCTET_STRING_t	 Correlation_ID_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_Correlation_ID_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_Correlation_ID;
+asn_struct_free_f Correlation_ID_free;
+asn_struct_print_f Correlation_ID_print;
+asn_constr_check_f Correlation_ID_constraint;
+ber_type_decoder_f Correlation_ID_decode_ber;
+der_type_encoder_f Correlation_ID_encode_der;
+xer_type_decoder_f Correlation_ID_decode_xer;
+xer_type_encoder_f Correlation_ID_encode_xer;
+oer_type_decoder_f Correlation_ID_decode_oer;
+oer_type_encoder_f Correlation_ID_encode_oer;
+per_type_decoder_f Correlation_ID_decode_uper;
+per_type_encoder_f Correlation_ID_encode_uper;
+per_type_decoder_f Correlation_ID_decode_aper;
+per_type_encoder_f Correlation_ID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Correlation_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Coverage-Level.h b/src/s1ap/asn1c/asnGenFiles/Coverage-Level.h
new file mode 100644
index 0000000..3c4640a
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Coverage-Level.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Coverage_Level_H_
+#define	_Coverage_Level_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum Coverage_Level {
+	Coverage_Level_extendedcoverage	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_Coverage_Level;
+
+/* Coverage-Level */
+typedef long	 Coverage_Level_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_Coverage_Level_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_Coverage_Level;
+extern const asn_INTEGER_specifics_t asn_SPC_Coverage_Level_specs_1;
+asn_struct_free_f Coverage_Level_free;
+asn_struct_print_f Coverage_Level_print;
+asn_constr_check_f Coverage_Level_constraint;
+ber_type_decoder_f Coverage_Level_decode_ber;
+der_type_encoder_f Coverage_Level_encode_der;
+xer_type_decoder_f Coverage_Level_decode_xer;
+xer_type_encoder_f Coverage_Level_encode_xer;
+oer_type_decoder_f Coverage_Level_decode_oer;
+oer_type_encoder_f Coverage_Level_encode_oer;
+per_type_decoder_f Coverage_Level_decode_uper;
+per_type_encoder_f Coverage_Level_encode_uper;
+per_type_decoder_f Coverage_Level_decode_aper;
+per_type_encoder_f Coverage_Level_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Coverage_Level_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Criticality.h b/src/s1ap/asn1c/asnGenFiles/Criticality.h
new file mode 100644
index 0000000..977d55d
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Criticality.h
@@ -0,0 +1,54 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-CommonDataTypes"
+ * 	found in "./asn1c/S1AP-CommonDataTypes.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Criticality_H_
+#define	_Criticality_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum Criticality {
+	Criticality_reject	= 0,
+	Criticality_ignore	= 1,
+	Criticality_notify	= 2
+} e_Criticality;
+
+/* Criticality */
+typedef long	 Criticality_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_Criticality_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_Criticality;
+extern const asn_INTEGER_specifics_t asn_SPC_Criticality_specs_1;
+asn_struct_free_f Criticality_free;
+asn_struct_print_f Criticality_print;
+asn_constr_check_f Criticality_constraint;
+ber_type_decoder_f Criticality_decode_ber;
+der_type_encoder_f Criticality_encode_der;
+xer_type_decoder_f Criticality_decode_xer;
+xer_type_encoder_f Criticality_encode_xer;
+oer_type_decoder_f Criticality_decode_oer;
+oer_type_encoder_f Criticality_encode_oer;
+per_type_decoder_f Criticality_decode_uper;
+per_type_encoder_f Criticality_encode_uper;
+per_type_decoder_f Criticality_decode_aper;
+per_type_encoder_f Criticality_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Criticality_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CriticalityDiagnostics-IE-Item.h b/src/s1ap/asn1c/asnGenFiles/CriticalityDiagnostics-IE-Item.h
new file mode 100644
index 0000000..b708fea
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CriticalityDiagnostics-IE-Item.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CriticalityDiagnostics_IE_Item_H_
+#define	_CriticalityDiagnostics_IE_Item_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "Criticality.h"
+#include "ProtocolIE-ID.h"
+#include "TypeOfError.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* CriticalityDiagnostics-IE-Item */
+typedef struct CriticalityDiagnostics_IE_Item {
+	Criticality_t	 iECriticality;
+	ProtocolIE_ID_t	 iE_ID;
+	TypeOfError_t	 typeOfError;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CriticalityDiagnostics_IE_Item_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_CriticalityDiagnostics_IE_Item;
+extern asn_SEQUENCE_specifics_t asn_SPC_CriticalityDiagnostics_IE_Item_specs_1;
+extern asn_TYPE_member_t asn_MBR_CriticalityDiagnostics_IE_Item_1[4];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CriticalityDiagnostics_IE_Item_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CriticalityDiagnostics-IE-List.h b/src/s1ap/asn1c/asnGenFiles/CriticalityDiagnostics-IE-List.h
new file mode 100644
index 0000000..f9455a7
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CriticalityDiagnostics-IE-List.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CriticalityDiagnostics_IE_List_H_
+#define	_CriticalityDiagnostics_IE_List_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct CriticalityDiagnostics_IE_Item;
+
+/* CriticalityDiagnostics-IE-List */
+typedef struct CriticalityDiagnostics_IE_List {
+	A_SEQUENCE_OF(struct CriticalityDiagnostics_IE_Item) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CriticalityDiagnostics_IE_List_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_CriticalityDiagnostics_IE_List;
+extern asn_SET_OF_specifics_t asn_SPC_CriticalityDiagnostics_IE_List_specs_1;
+extern asn_TYPE_member_t asn_MBR_CriticalityDiagnostics_IE_List_1[1];
+extern asn_per_constraints_t asn_PER_type_CriticalityDiagnostics_IE_List_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CriticalityDiagnostics_IE_List_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/CriticalityDiagnostics.h b/src/s1ap/asn1c/asnGenFiles/CriticalityDiagnostics.h
new file mode 100644
index 0000000..db2a108
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/CriticalityDiagnostics.h
@@ -0,0 +1,54 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_CriticalityDiagnostics_H_
+#define	_CriticalityDiagnostics_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProcedureCode.h"
+#include "TriggeringMessage.h"
+#include "Criticality.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct CriticalityDiagnostics_IE_List;
+struct ProtocolExtensionContainer;
+
+/* CriticalityDiagnostics */
+typedef struct CriticalityDiagnostics {
+	ProcedureCode_t	*procedureCode;	/* OPTIONAL */
+	TriggeringMessage_t	*triggeringMessage;	/* OPTIONAL */
+	Criticality_t	*procedureCriticality;	/* OPTIONAL */
+	struct CriticalityDiagnostics_IE_List	*iEsCriticalityDiagnostics;	/* OPTIONAL */
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CriticalityDiagnostics_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_CriticalityDiagnostics;
+extern asn_SEQUENCE_specifics_t asn_SPC_CriticalityDiagnostics_specs_1;
+extern asn_TYPE_member_t asn_MBR_CriticalityDiagnostics_1[5];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CriticalityDiagnostics_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/DCN-ID.h b/src/s1ap/asn1c/asnGenFiles/DCN-ID.h
new file mode 100644
index 0000000..327597e
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/DCN-ID.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_DCN_ID_H_
+#define	_DCN_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* DCN-ID */
+typedef long	 DCN_ID_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_DCN_ID_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_DCN_ID;
+asn_struct_free_f DCN_ID_free;
+asn_struct_print_f DCN_ID_print;
+asn_constr_check_f DCN_ID_constraint;
+ber_type_decoder_f DCN_ID_decode_ber;
+der_type_encoder_f DCN_ID_encode_der;
+xer_type_decoder_f DCN_ID_decode_xer;
+xer_type_encoder_f DCN_ID_encode_xer;
+oer_type_decoder_f DCN_ID_decode_oer;
+oer_type_encoder_f DCN_ID_encode_oer;
+per_type_decoder_f DCN_ID_decode_uper;
+per_type_encoder_f DCN_ID_encode_uper;
+per_type_decoder_f DCN_ID_decode_aper;
+per_type_encoder_f DCN_ID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _DCN_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/DL-CP-SecurityInformation.h b/src/s1ap/asn1c/asnGenFiles/DL-CP-SecurityInformation.h
new file mode 100644
index 0000000..03ffffc
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/DL-CP-SecurityInformation.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_DL_CP_SecurityInformation_H_
+#define	_DL_CP_SecurityInformation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "DL-NAS-MAC.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* DL-CP-SecurityInformation */
+typedef struct DL_CP_SecurityInformation {
+	DL_NAS_MAC_t	 dl_NAS_MAC;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} DL_CP_SecurityInformation_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_DL_CP_SecurityInformation;
+extern asn_SEQUENCE_specifics_t asn_SPC_DL_CP_SecurityInformation_specs_1;
+extern asn_TYPE_member_t asn_MBR_DL_CP_SecurityInformation_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _DL_CP_SecurityInformation_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/DL-Forwarding.h b/src/s1ap/asn1c/asnGenFiles/DL-Forwarding.h
new file mode 100644
index 0000000..ee785dd
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/DL-Forwarding.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_DL_Forwarding_H_
+#define	_DL_Forwarding_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum DL_Forwarding {
+	DL_Forwarding_dL_Forwarding_proposed	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_DL_Forwarding;
+
+/* DL-Forwarding */
+typedef long	 DL_Forwarding_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_DL_Forwarding_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_DL_Forwarding;
+extern const asn_INTEGER_specifics_t asn_SPC_DL_Forwarding_specs_1;
+asn_struct_free_f DL_Forwarding_free;
+asn_struct_print_f DL_Forwarding_print;
+asn_constr_check_f DL_Forwarding_constraint;
+ber_type_decoder_f DL_Forwarding_decode_ber;
+der_type_encoder_f DL_Forwarding_encode_der;
+xer_type_decoder_f DL_Forwarding_decode_xer;
+xer_type_encoder_f DL_Forwarding_encode_xer;
+oer_type_decoder_f DL_Forwarding_decode_oer;
+oer_type_encoder_f DL_Forwarding_encode_oer;
+per_type_decoder_f DL_Forwarding_decode_uper;
+per_type_encoder_f DL_Forwarding_encode_uper;
+per_type_decoder_f DL_Forwarding_decode_aper;
+per_type_encoder_f DL_Forwarding_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _DL_Forwarding_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/DL-NAS-MAC.h b/src/s1ap/asn1c/asnGenFiles/DL-NAS-MAC.h
new file mode 100644
index 0000000..7e892b3
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/DL-NAS-MAC.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_DL_NAS_MAC_H_
+#define	_DL_NAS_MAC_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* DL-NAS-MAC */
+typedef BIT_STRING_t	 DL_NAS_MAC_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_DL_NAS_MAC_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_DL_NAS_MAC;
+asn_struct_free_f DL_NAS_MAC_free;
+asn_struct_print_f DL_NAS_MAC_print;
+asn_constr_check_f DL_NAS_MAC_constraint;
+ber_type_decoder_f DL_NAS_MAC_decode_ber;
+der_type_encoder_f DL_NAS_MAC_encode_der;
+xer_type_decoder_f DL_NAS_MAC_decode_xer;
+xer_type_encoder_f DL_NAS_MAC_encode_xer;
+oer_type_decoder_f DL_NAS_MAC_decode_oer;
+oer_type_encoder_f DL_NAS_MAC_encode_oer;
+per_type_decoder_f DL_NAS_MAC_decode_uper;
+per_type_encoder_f DL_NAS_MAC_encode_uper;
+per_type_decoder_f DL_NAS_MAC_decode_aper;
+per_type_encoder_f DL_NAS_MAC_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _DL_NAS_MAC_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/DLNASPDUDeliveryAckRequest.h b/src/s1ap/asn1c/asnGenFiles/DLNASPDUDeliveryAckRequest.h
new file mode 100644
index 0000000..bb97161
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/DLNASPDUDeliveryAckRequest.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_DLNASPDUDeliveryAckRequest_H_
+#define	_DLNASPDUDeliveryAckRequest_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum DLNASPDUDeliveryAckRequest {
+	DLNASPDUDeliveryAckRequest_requested	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_DLNASPDUDeliveryAckRequest;
+
+/* DLNASPDUDeliveryAckRequest */
+typedef long	 DLNASPDUDeliveryAckRequest_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_DLNASPDUDeliveryAckRequest_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_DLNASPDUDeliveryAckRequest;
+extern const asn_INTEGER_specifics_t asn_SPC_DLNASPDUDeliveryAckRequest_specs_1;
+asn_struct_free_f DLNASPDUDeliveryAckRequest_free;
+asn_struct_print_f DLNASPDUDeliveryAckRequest_print;
+asn_constr_check_f DLNASPDUDeliveryAckRequest_constraint;
+ber_type_decoder_f DLNASPDUDeliveryAckRequest_decode_ber;
+der_type_encoder_f DLNASPDUDeliveryAckRequest_encode_der;
+xer_type_decoder_f DLNASPDUDeliveryAckRequest_decode_xer;
+xer_type_encoder_f DLNASPDUDeliveryAckRequest_encode_xer;
+oer_type_decoder_f DLNASPDUDeliveryAckRequest_decode_oer;
+oer_type_encoder_f DLNASPDUDeliveryAckRequest_encode_oer;
+per_type_decoder_f DLNASPDUDeliveryAckRequest_decode_uper;
+per_type_encoder_f DLNASPDUDeliveryAckRequest_encode_uper;
+per_type_decoder_f DLNASPDUDeliveryAckRequest_decode_aper;
+per_type_encoder_f DLNASPDUDeliveryAckRequest_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _DLNASPDUDeliveryAckRequest_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Data-Forwarding-Not-Possible.h b/src/s1ap/asn1c/asnGenFiles/Data-Forwarding-Not-Possible.h
new file mode 100644
index 0000000..ea6e1d9
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Data-Forwarding-Not-Possible.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Data_Forwarding_Not_Possible_H_
+#define	_Data_Forwarding_Not_Possible_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum Data_Forwarding_Not_Possible {
+	Data_Forwarding_Not_Possible_data_Forwarding_not_Possible	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_Data_Forwarding_Not_Possible;
+
+/* Data-Forwarding-Not-Possible */
+typedef long	 Data_Forwarding_Not_Possible_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_Data_Forwarding_Not_Possible_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_Data_Forwarding_Not_Possible;
+extern const asn_INTEGER_specifics_t asn_SPC_Data_Forwarding_Not_Possible_specs_1;
+asn_struct_free_f Data_Forwarding_Not_Possible_free;
+asn_struct_print_f Data_Forwarding_Not_Possible_print;
+asn_constr_check_f Data_Forwarding_Not_Possible_constraint;
+ber_type_decoder_f Data_Forwarding_Not_Possible_decode_ber;
+der_type_encoder_f Data_Forwarding_Not_Possible_encode_der;
+xer_type_decoder_f Data_Forwarding_Not_Possible_decode_xer;
+xer_type_encoder_f Data_Forwarding_Not_Possible_encode_xer;
+oer_type_decoder_f Data_Forwarding_Not_Possible_decode_oer;
+oer_type_encoder_f Data_Forwarding_Not_Possible_encode_oer;
+per_type_decoder_f Data_Forwarding_Not_Possible_decode_uper;
+per_type_encoder_f Data_Forwarding_Not_Possible_encode_uper;
+per_type_decoder_f Data_Forwarding_Not_Possible_decode_aper;
+per_type_encoder_f Data_Forwarding_Not_Possible_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Data_Forwarding_Not_Possible_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/DataCodingScheme.h b/src/s1ap/asn1c/asnGenFiles/DataCodingScheme.h
new file mode 100644
index 0000000..3d83258
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/DataCodingScheme.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_DataCodingScheme_H_
+#define	_DataCodingScheme_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* DataCodingScheme */
+typedef BIT_STRING_t	 DataCodingScheme_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_DataCodingScheme_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_DataCodingScheme;
+asn_struct_free_f DataCodingScheme_free;
+asn_struct_print_f DataCodingScheme_print;
+asn_constr_check_f DataCodingScheme_constraint;
+ber_type_decoder_f DataCodingScheme_decode_ber;
+der_type_encoder_f DataCodingScheme_encode_der;
+xer_type_decoder_f DataCodingScheme_decode_xer;
+xer_type_encoder_f DataCodingScheme_encode_xer;
+oer_type_decoder_f DataCodingScheme_decode_oer;
+oer_type_encoder_f DataCodingScheme_encode_oer;
+per_type_decoder_f DataCodingScheme_decode_uper;
+per_type_encoder_f DataCodingScheme_encode_uper;
+per_type_decoder_f DataCodingScheme_decode_aper;
+per_type_encoder_f DataCodingScheme_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _DataCodingScheme_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/DeactivateTrace.h b/src/s1ap/asn1c/asnGenFiles/DeactivateTrace.h
new file mode 100644
index 0000000..5517918
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/DeactivateTrace.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_DeactivateTrace_H_
+#define	_DeactivateTrace_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* DeactivateTrace */
+typedef struct DeactivateTrace {
+	ProtocolIE_Container_129P56_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} DeactivateTrace_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_DeactivateTrace;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _DeactivateTrace_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Direct-Forwarding-Path-Availability.h b/src/s1ap/asn1c/asnGenFiles/Direct-Forwarding-Path-Availability.h
new file mode 100644
index 0000000..c88ec2b
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Direct-Forwarding-Path-Availability.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Direct_Forwarding_Path_Availability_H_
+#define	_Direct_Forwarding_Path_Availability_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum Direct_Forwarding_Path_Availability {
+	Direct_Forwarding_Path_Availability_directPathAvailable	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_Direct_Forwarding_Path_Availability;
+
+/* Direct-Forwarding-Path-Availability */
+typedef long	 Direct_Forwarding_Path_Availability_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_Direct_Forwarding_Path_Availability_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_Direct_Forwarding_Path_Availability;
+extern const asn_INTEGER_specifics_t asn_SPC_Direct_Forwarding_Path_Availability_specs_1;
+asn_struct_free_f Direct_Forwarding_Path_Availability_free;
+asn_struct_print_f Direct_Forwarding_Path_Availability_print;
+asn_constr_check_f Direct_Forwarding_Path_Availability_constraint;
+ber_type_decoder_f Direct_Forwarding_Path_Availability_decode_ber;
+der_type_encoder_f Direct_Forwarding_Path_Availability_encode_der;
+xer_type_decoder_f Direct_Forwarding_Path_Availability_decode_xer;
+xer_type_encoder_f Direct_Forwarding_Path_Availability_encode_xer;
+oer_type_decoder_f Direct_Forwarding_Path_Availability_decode_oer;
+oer_type_encoder_f Direct_Forwarding_Path_Availability_encode_oer;
+per_type_decoder_f Direct_Forwarding_Path_Availability_decode_uper;
+per_type_encoder_f Direct_Forwarding_Path_Availability_encode_uper;
+per_type_decoder_f Direct_Forwarding_Path_Availability_decode_aper;
+per_type_encoder_f Direct_Forwarding_Path_Availability_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Direct_Forwarding_Path_Availability_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/DownlinkNASTransport.h b/src/s1ap/asn1c/asnGenFiles/DownlinkNASTransport.h
new file mode 100644
index 0000000..5c37f2c
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/DownlinkNASTransport.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_DownlinkNASTransport_H_
+#define	_DownlinkNASTransport_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* DownlinkNASTransport */
+typedef struct DownlinkNASTransport {
+	ProtocolIE_Container_129P31_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} DownlinkNASTransport_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_DownlinkNASTransport;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _DownlinkNASTransport_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/DownlinkNonUEAssociatedLPPaTransport.h b/src/s1ap/asn1c/asnGenFiles/DownlinkNonUEAssociatedLPPaTransport.h
new file mode 100644
index 0000000..41d64e6
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/DownlinkNonUEAssociatedLPPaTransport.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_DownlinkNonUEAssociatedLPPaTransport_H_
+#define	_DownlinkNonUEAssociatedLPPaTransport_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* DownlinkNonUEAssociatedLPPaTransport */
+typedef struct DownlinkNonUEAssociatedLPPaTransport {
+	ProtocolIE_Container_129P75_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} DownlinkNonUEAssociatedLPPaTransport_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_DownlinkNonUEAssociatedLPPaTransport;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _DownlinkNonUEAssociatedLPPaTransport_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/DownlinkS1cdma2000tunnelling.h b/src/s1ap/asn1c/asnGenFiles/DownlinkS1cdma2000tunnelling.h
new file mode 100644
index 0000000..f064101
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/DownlinkS1cdma2000tunnelling.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_DownlinkS1cdma2000tunnelling_H_
+#define	_DownlinkS1cdma2000tunnelling_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* DownlinkS1cdma2000tunnelling */
+typedef struct DownlinkS1cdma2000tunnelling {
+	ProtocolIE_Container_129P49_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} DownlinkS1cdma2000tunnelling_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_DownlinkS1cdma2000tunnelling;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _DownlinkS1cdma2000tunnelling_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/DownlinkUEAssociatedLPPaTransport.h b/src/s1ap/asn1c/asnGenFiles/DownlinkUEAssociatedLPPaTransport.h
new file mode 100644
index 0000000..0a1138e
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/DownlinkUEAssociatedLPPaTransport.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_DownlinkUEAssociatedLPPaTransport_H_
+#define	_DownlinkUEAssociatedLPPaTransport_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* DownlinkUEAssociatedLPPaTransport */
+typedef struct DownlinkUEAssociatedLPPaTransport {
+	ProtocolIE_Container_129P73_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} DownlinkUEAssociatedLPPaTransport_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_DownlinkUEAssociatedLPPaTransport;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _DownlinkUEAssociatedLPPaTransport_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RAB-ID.h b/src/s1ap/asn1c/asnGenFiles/E-RAB-ID.h
new file mode 100644
index 0000000..40e0ab6
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RAB-ID.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RAB_ID_H_
+#define	_E_RAB_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E-RAB-ID */
+typedef long	 E_RAB_ID_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_E_RAB_ID_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_E_RAB_ID;
+asn_struct_free_f E_RAB_ID_free;
+asn_struct_print_f E_RAB_ID_print;
+asn_constr_check_f E_RAB_ID_constraint;
+ber_type_decoder_f E_RAB_ID_decode_ber;
+der_type_encoder_f E_RAB_ID_encode_der;
+xer_type_decoder_f E_RAB_ID_decode_xer;
+xer_type_encoder_f E_RAB_ID_encode_xer;
+oer_type_decoder_f E_RAB_ID_decode_oer;
+oer_type_encoder_f E_RAB_ID_encode_oer;
+per_type_decoder_f E_RAB_ID_decode_uper;
+per_type_encoder_f E_RAB_ID_encode_uper;
+per_type_decoder_f E_RAB_ID_decode_aper;
+per_type_encoder_f E_RAB_ID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RAB_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RAB-IE-ContainerList.h b/src/s1ap/asn1c/asnGenFiles/E-RAB-IE-ContainerList.h
new file mode 100644
index 0000000..5db2bf4
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RAB-IE-ContainerList.h
@@ -0,0 +1,190 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RAB_IE_ContainerList_H_
+#define	_E_RAB_IE_ContainerList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-ContainerList.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E-RAB-IE-ContainerList */
+typedef ProtocolIE_ContainerList_166P0_t	 E_RAB_IE_ContainerList_456P0_t;
+typedef ProtocolIE_ContainerList_166P1_t	 E_RAB_IE_ContainerList_456P1_t;
+typedef ProtocolIE_ContainerList_166P2_t	 E_RAB_IE_ContainerList_456P2_t;
+typedef ProtocolIE_ContainerList_166P3_t	 E_RAB_IE_ContainerList_456P3_t;
+typedef ProtocolIE_ContainerList_166P4_t	 E_RAB_IE_ContainerList_456P4_t;
+typedef ProtocolIE_ContainerList_166P5_t	 E_RAB_IE_ContainerList_456P5_t;
+typedef ProtocolIE_ContainerList_166P6_t	 E_RAB_IE_ContainerList_456P6_t;
+typedef ProtocolIE_ContainerList_166P7_t	 E_RAB_IE_ContainerList_456P7_t;
+typedef ProtocolIE_ContainerList_166P8_t	 E_RAB_IE_ContainerList_456P8_t;
+typedef ProtocolIE_ContainerList_166P9_t	 E_RAB_IE_ContainerList_456P9_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_E_RAB_IE_ContainerList_456P0_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_E_RAB_IE_ContainerList_456P0;
+asn_struct_free_f E_RAB_IE_ContainerList_456P0_free;
+asn_struct_print_f E_RAB_IE_ContainerList_456P0_print;
+asn_constr_check_f E_RAB_IE_ContainerList_456P0_constraint;
+ber_type_decoder_f E_RAB_IE_ContainerList_456P0_decode_ber;
+der_type_encoder_f E_RAB_IE_ContainerList_456P0_encode_der;
+xer_type_decoder_f E_RAB_IE_ContainerList_456P0_decode_xer;
+xer_type_encoder_f E_RAB_IE_ContainerList_456P0_encode_xer;
+oer_type_decoder_f E_RAB_IE_ContainerList_456P0_decode_oer;
+oer_type_encoder_f E_RAB_IE_ContainerList_456P0_encode_oer;
+per_type_decoder_f E_RAB_IE_ContainerList_456P0_decode_uper;
+per_type_encoder_f E_RAB_IE_ContainerList_456P0_encode_uper;
+per_type_decoder_f E_RAB_IE_ContainerList_456P0_decode_aper;
+per_type_encoder_f E_RAB_IE_ContainerList_456P0_encode_aper;
+extern asn_per_constraints_t asn_PER_type_E_RAB_IE_ContainerList_456P1_constr_2;
+extern asn_TYPE_descriptor_t asn_DEF_E_RAB_IE_ContainerList_456P1;
+asn_struct_free_f E_RAB_IE_ContainerList_456P1_free;
+asn_struct_print_f E_RAB_IE_ContainerList_456P1_print;
+asn_constr_check_f E_RAB_IE_ContainerList_456P1_constraint;
+ber_type_decoder_f E_RAB_IE_ContainerList_456P1_decode_ber;
+der_type_encoder_f E_RAB_IE_ContainerList_456P1_encode_der;
+xer_type_decoder_f E_RAB_IE_ContainerList_456P1_decode_xer;
+xer_type_encoder_f E_RAB_IE_ContainerList_456P1_encode_xer;
+oer_type_decoder_f E_RAB_IE_ContainerList_456P1_decode_oer;
+oer_type_encoder_f E_RAB_IE_ContainerList_456P1_encode_oer;
+per_type_decoder_f E_RAB_IE_ContainerList_456P1_decode_uper;
+per_type_encoder_f E_RAB_IE_ContainerList_456P1_encode_uper;
+per_type_decoder_f E_RAB_IE_ContainerList_456P1_decode_aper;
+per_type_encoder_f E_RAB_IE_ContainerList_456P1_encode_aper;
+extern asn_per_constraints_t asn_PER_type_E_RAB_IE_ContainerList_456P2_constr_3;
+extern asn_TYPE_descriptor_t asn_DEF_E_RAB_IE_ContainerList_456P2;
+asn_struct_free_f E_RAB_IE_ContainerList_456P2_free;
+asn_struct_print_f E_RAB_IE_ContainerList_456P2_print;
+asn_constr_check_f E_RAB_IE_ContainerList_456P2_constraint;
+ber_type_decoder_f E_RAB_IE_ContainerList_456P2_decode_ber;
+der_type_encoder_f E_RAB_IE_ContainerList_456P2_encode_der;
+xer_type_decoder_f E_RAB_IE_ContainerList_456P2_decode_xer;
+xer_type_encoder_f E_RAB_IE_ContainerList_456P2_encode_xer;
+oer_type_decoder_f E_RAB_IE_ContainerList_456P2_decode_oer;
+oer_type_encoder_f E_RAB_IE_ContainerList_456P2_encode_oer;
+per_type_decoder_f E_RAB_IE_ContainerList_456P2_decode_uper;
+per_type_encoder_f E_RAB_IE_ContainerList_456P2_encode_uper;
+per_type_decoder_f E_RAB_IE_ContainerList_456P2_decode_aper;
+per_type_encoder_f E_RAB_IE_ContainerList_456P2_encode_aper;
+extern asn_per_constraints_t asn_PER_type_E_RAB_IE_ContainerList_456P3_constr_4;
+extern asn_TYPE_descriptor_t asn_DEF_E_RAB_IE_ContainerList_456P3;
+asn_struct_free_f E_RAB_IE_ContainerList_456P3_free;
+asn_struct_print_f E_RAB_IE_ContainerList_456P3_print;
+asn_constr_check_f E_RAB_IE_ContainerList_456P3_constraint;
+ber_type_decoder_f E_RAB_IE_ContainerList_456P3_decode_ber;
+der_type_encoder_f E_RAB_IE_ContainerList_456P3_encode_der;
+xer_type_decoder_f E_RAB_IE_ContainerList_456P3_decode_xer;
+xer_type_encoder_f E_RAB_IE_ContainerList_456P3_encode_xer;
+oer_type_decoder_f E_RAB_IE_ContainerList_456P3_decode_oer;
+oer_type_encoder_f E_RAB_IE_ContainerList_456P3_encode_oer;
+per_type_decoder_f E_RAB_IE_ContainerList_456P3_decode_uper;
+per_type_encoder_f E_RAB_IE_ContainerList_456P3_encode_uper;
+per_type_decoder_f E_RAB_IE_ContainerList_456P3_decode_aper;
+per_type_encoder_f E_RAB_IE_ContainerList_456P3_encode_aper;
+extern asn_per_constraints_t asn_PER_type_E_RAB_IE_ContainerList_456P4_constr_5;
+extern asn_TYPE_descriptor_t asn_DEF_E_RAB_IE_ContainerList_456P4;
+asn_struct_free_f E_RAB_IE_ContainerList_456P4_free;
+asn_struct_print_f E_RAB_IE_ContainerList_456P4_print;
+asn_constr_check_f E_RAB_IE_ContainerList_456P4_constraint;
+ber_type_decoder_f E_RAB_IE_ContainerList_456P4_decode_ber;
+der_type_encoder_f E_RAB_IE_ContainerList_456P4_encode_der;
+xer_type_decoder_f E_RAB_IE_ContainerList_456P4_decode_xer;
+xer_type_encoder_f E_RAB_IE_ContainerList_456P4_encode_xer;
+oer_type_decoder_f E_RAB_IE_ContainerList_456P4_decode_oer;
+oer_type_encoder_f E_RAB_IE_ContainerList_456P4_encode_oer;
+per_type_decoder_f E_RAB_IE_ContainerList_456P4_decode_uper;
+per_type_encoder_f E_RAB_IE_ContainerList_456P4_encode_uper;
+per_type_decoder_f E_RAB_IE_ContainerList_456P4_decode_aper;
+per_type_encoder_f E_RAB_IE_ContainerList_456P4_encode_aper;
+extern asn_per_constraints_t asn_PER_type_E_RAB_IE_ContainerList_456P5_constr_6;
+extern asn_TYPE_descriptor_t asn_DEF_E_RAB_IE_ContainerList_456P5;
+asn_struct_free_f E_RAB_IE_ContainerList_456P5_free;
+asn_struct_print_f E_RAB_IE_ContainerList_456P5_print;
+asn_constr_check_f E_RAB_IE_ContainerList_456P5_constraint;
+ber_type_decoder_f E_RAB_IE_ContainerList_456P5_decode_ber;
+der_type_encoder_f E_RAB_IE_ContainerList_456P5_encode_der;
+xer_type_decoder_f E_RAB_IE_ContainerList_456P5_decode_xer;
+xer_type_encoder_f E_RAB_IE_ContainerList_456P5_encode_xer;
+oer_type_decoder_f E_RAB_IE_ContainerList_456P5_decode_oer;
+oer_type_encoder_f E_RAB_IE_ContainerList_456P5_encode_oer;
+per_type_decoder_f E_RAB_IE_ContainerList_456P5_decode_uper;
+per_type_encoder_f E_RAB_IE_ContainerList_456P5_encode_uper;
+per_type_decoder_f E_RAB_IE_ContainerList_456P5_decode_aper;
+per_type_encoder_f E_RAB_IE_ContainerList_456P5_encode_aper;
+extern asn_per_constraints_t asn_PER_type_E_RAB_IE_ContainerList_456P6_constr_7;
+extern asn_TYPE_descriptor_t asn_DEF_E_RAB_IE_ContainerList_456P6;
+asn_struct_free_f E_RAB_IE_ContainerList_456P6_free;
+asn_struct_print_f E_RAB_IE_ContainerList_456P6_print;
+asn_constr_check_f E_RAB_IE_ContainerList_456P6_constraint;
+ber_type_decoder_f E_RAB_IE_ContainerList_456P6_decode_ber;
+der_type_encoder_f E_RAB_IE_ContainerList_456P6_encode_der;
+xer_type_decoder_f E_RAB_IE_ContainerList_456P6_decode_xer;
+xer_type_encoder_f E_RAB_IE_ContainerList_456P6_encode_xer;
+oer_type_decoder_f E_RAB_IE_ContainerList_456P6_decode_oer;
+oer_type_encoder_f E_RAB_IE_ContainerList_456P6_encode_oer;
+per_type_decoder_f E_RAB_IE_ContainerList_456P6_decode_uper;
+per_type_encoder_f E_RAB_IE_ContainerList_456P6_encode_uper;
+per_type_decoder_f E_RAB_IE_ContainerList_456P6_decode_aper;
+per_type_encoder_f E_RAB_IE_ContainerList_456P6_encode_aper;
+extern asn_per_constraints_t asn_PER_type_E_RAB_IE_ContainerList_456P7_constr_8;
+extern asn_TYPE_descriptor_t asn_DEF_E_RAB_IE_ContainerList_456P7;
+asn_struct_free_f E_RAB_IE_ContainerList_456P7_free;
+asn_struct_print_f E_RAB_IE_ContainerList_456P7_print;
+asn_constr_check_f E_RAB_IE_ContainerList_456P7_constraint;
+ber_type_decoder_f E_RAB_IE_ContainerList_456P7_decode_ber;
+der_type_encoder_f E_RAB_IE_ContainerList_456P7_encode_der;
+xer_type_decoder_f E_RAB_IE_ContainerList_456P7_decode_xer;
+xer_type_encoder_f E_RAB_IE_ContainerList_456P7_encode_xer;
+oer_type_decoder_f E_RAB_IE_ContainerList_456P7_decode_oer;
+oer_type_encoder_f E_RAB_IE_ContainerList_456P7_encode_oer;
+per_type_decoder_f E_RAB_IE_ContainerList_456P7_decode_uper;
+per_type_encoder_f E_RAB_IE_ContainerList_456P7_encode_uper;
+per_type_decoder_f E_RAB_IE_ContainerList_456P7_decode_aper;
+per_type_encoder_f E_RAB_IE_ContainerList_456P7_encode_aper;
+extern asn_per_constraints_t asn_PER_type_E_RAB_IE_ContainerList_456P8_constr_9;
+extern asn_TYPE_descriptor_t asn_DEF_E_RAB_IE_ContainerList_456P8;
+asn_struct_free_f E_RAB_IE_ContainerList_456P8_free;
+asn_struct_print_f E_RAB_IE_ContainerList_456P8_print;
+asn_constr_check_f E_RAB_IE_ContainerList_456P8_constraint;
+ber_type_decoder_f E_RAB_IE_ContainerList_456P8_decode_ber;
+der_type_encoder_f E_RAB_IE_ContainerList_456P8_encode_der;
+xer_type_decoder_f E_RAB_IE_ContainerList_456P8_decode_xer;
+xer_type_encoder_f E_RAB_IE_ContainerList_456P8_encode_xer;
+oer_type_decoder_f E_RAB_IE_ContainerList_456P8_decode_oer;
+oer_type_encoder_f E_RAB_IE_ContainerList_456P8_encode_oer;
+per_type_decoder_f E_RAB_IE_ContainerList_456P8_decode_uper;
+per_type_encoder_f E_RAB_IE_ContainerList_456P8_encode_uper;
+per_type_decoder_f E_RAB_IE_ContainerList_456P8_decode_aper;
+per_type_encoder_f E_RAB_IE_ContainerList_456P8_encode_aper;
+extern asn_per_constraints_t asn_PER_type_E_RAB_IE_ContainerList_456P9_constr_10;
+extern asn_TYPE_descriptor_t asn_DEF_E_RAB_IE_ContainerList_456P9;
+asn_struct_free_f E_RAB_IE_ContainerList_456P9_free;
+asn_struct_print_f E_RAB_IE_ContainerList_456P9_print;
+asn_constr_check_f E_RAB_IE_ContainerList_456P9_constraint;
+ber_type_decoder_f E_RAB_IE_ContainerList_456P9_decode_ber;
+der_type_encoder_f E_RAB_IE_ContainerList_456P9_encode_der;
+xer_type_decoder_f E_RAB_IE_ContainerList_456P9_decode_xer;
+xer_type_encoder_f E_RAB_IE_ContainerList_456P9_encode_xer;
+oer_type_decoder_f E_RAB_IE_ContainerList_456P9_decode_oer;
+oer_type_encoder_f E_RAB_IE_ContainerList_456P9_encode_oer;
+per_type_decoder_f E_RAB_IE_ContainerList_456P9_decode_uper;
+per_type_encoder_f E_RAB_IE_ContainerList_456P9_encode_uper;
+per_type_decoder_f E_RAB_IE_ContainerList_456P9_decode_aper;
+per_type_encoder_f E_RAB_IE_ContainerList_456P9_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RAB_IE_ContainerList_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RAB-IE-ContainerPairList.h b/src/s1ap/asn1c/asnGenFiles/E-RAB-IE-ContainerPairList.h
new file mode 100644
index 0000000..aea32f0
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RAB-IE-ContainerPairList.h
@@ -0,0 +1,23 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RAB_IE_ContainerPairList_H_
+#define	_E_RAB_IE_ContainerPairList_H_
+
+
+#include <asn_application.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RAB_IE_ContainerPairList_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABAdmittedItem.h b/src/s1ap/asn1c/asnGenFiles/E-RABAdmittedItem.h
new file mode 100644
index 0000000..33ee68c
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABAdmittedItem.h
@@ -0,0 +1,56 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABAdmittedItem_H_
+#define	_E_RABAdmittedItem_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "E-RAB-ID.h"
+#include "TransportLayerAddress.h"
+#include "GTP-TEID.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* E-RABAdmittedItem */
+typedef struct E_RABAdmittedItem {
+	E_RAB_ID_t	 e_RAB_ID;
+	TransportLayerAddress_t	 transportLayerAddress;
+	GTP_TEID_t	 gTP_TEID;
+	TransportLayerAddress_t	*dL_transportLayerAddress;	/* OPTIONAL */
+	GTP_TEID_t	*dL_gTP_TEID;	/* OPTIONAL */
+	TransportLayerAddress_t	*uL_TransportLayerAddress;	/* OPTIONAL */
+	GTP_TEID_t	*uL_GTP_TEID;	/* OPTIONAL */
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABAdmittedItem_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E_RABAdmittedItem;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABAdmittedItem_specs_1;
+extern asn_TYPE_member_t asn_MBR_E_RABAdmittedItem_1[8];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABAdmittedItem_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABAdmittedList.h b/src/s1ap/asn1c/asnGenFiles/E-RABAdmittedList.h
new file mode 100644
index 0000000..e6882a7
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABAdmittedList.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABAdmittedList_H_
+#define	_E_RABAdmittedList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "E-RAB-IE-ContainerList.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E-RABAdmittedList */
+typedef E_RAB_IE_ContainerList_456P2_t	 E_RABAdmittedList_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_E_RABAdmittedList_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_E_RABAdmittedList;
+asn_struct_free_f E_RABAdmittedList_free;
+asn_struct_print_f E_RABAdmittedList_print;
+asn_constr_check_f E_RABAdmittedList_constraint;
+ber_type_decoder_f E_RABAdmittedList_decode_ber;
+der_type_encoder_f E_RABAdmittedList_encode_der;
+xer_type_decoder_f E_RABAdmittedList_decode_xer;
+xer_type_encoder_f E_RABAdmittedList_encode_xer;
+oer_type_decoder_f E_RABAdmittedList_decode_oer;
+oer_type_encoder_f E_RABAdmittedList_encode_oer;
+per_type_decoder_f E_RABAdmittedList_decode_uper;
+per_type_encoder_f E_RABAdmittedList_encode_uper;
+per_type_decoder_f E_RABAdmittedList_decode_aper;
+per_type_encoder_f E_RABAdmittedList_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABAdmittedList_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABDataForwardingItem.h b/src/s1ap/asn1c/asnGenFiles/E-RABDataForwardingItem.h
new file mode 100644
index 0000000..acd8902
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABDataForwardingItem.h
@@ -0,0 +1,54 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABDataForwardingItem_H_
+#define	_E_RABDataForwardingItem_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "E-RAB-ID.h"
+#include "TransportLayerAddress.h"
+#include "GTP-TEID.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* E-RABDataForwardingItem */
+typedef struct E_RABDataForwardingItem {
+	E_RAB_ID_t	 e_RAB_ID;
+	TransportLayerAddress_t	*dL_transportLayerAddress;	/* OPTIONAL */
+	GTP_TEID_t	*dL_gTP_TEID;	/* OPTIONAL */
+	TransportLayerAddress_t	*uL_TransportLayerAddress;	/* OPTIONAL */
+	GTP_TEID_t	*uL_GTP_TEID;	/* OPTIONAL */
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABDataForwardingItem_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E_RABDataForwardingItem;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABDataForwardingItem_specs_1;
+extern asn_TYPE_member_t asn_MBR_E_RABDataForwardingItem_1[6];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABDataForwardingItem_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABFailedToResumeItemResumeReq.h b/src/s1ap/asn1c/asnGenFiles/E-RABFailedToResumeItemResumeReq.h
new file mode 100644
index 0000000..5ab2f98
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABFailedToResumeItemResumeReq.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABFailedToResumeItemResumeReq_H_
+#define	_E_RABFailedToResumeItemResumeReq_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "E-RAB-ID.h"
+#include "Cause.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* E-RABFailedToResumeItemResumeReq */
+typedef struct E_RABFailedToResumeItemResumeReq {
+	E_RAB_ID_t	 e_RAB_ID;
+	Cause_t	 cause;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABFailedToResumeItemResumeReq_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E_RABFailedToResumeItemResumeReq;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABFailedToResumeItemResumeReq_specs_1;
+extern asn_TYPE_member_t asn_MBR_E_RABFailedToResumeItemResumeReq_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABFailedToResumeItemResumeReq_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABFailedToResumeItemResumeRes.h b/src/s1ap/asn1c/asnGenFiles/E-RABFailedToResumeItemResumeRes.h
new file mode 100644
index 0000000..ede6192
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABFailedToResumeItemResumeRes.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABFailedToResumeItemResumeRes_H_
+#define	_E_RABFailedToResumeItemResumeRes_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "E-RAB-ID.h"
+#include "Cause.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* E-RABFailedToResumeItemResumeRes */
+typedef struct E_RABFailedToResumeItemResumeRes {
+	E_RAB_ID_t	 e_RAB_ID;
+	Cause_t	 cause;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABFailedToResumeItemResumeRes_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E_RABFailedToResumeItemResumeRes;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABFailedToResumeItemResumeRes_specs_1;
+extern asn_TYPE_member_t asn_MBR_E_RABFailedToResumeItemResumeRes_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABFailedToResumeItemResumeRes_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABFailedToResumeListResumeReq.h b/src/s1ap/asn1c/asnGenFiles/E-RABFailedToResumeListResumeReq.h
new file mode 100644
index 0000000..d59bb52
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABFailedToResumeListResumeReq.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABFailedToResumeListResumeReq_H_
+#define	_E_RABFailedToResumeListResumeReq_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "E-RAB-IE-ContainerList.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E-RABFailedToResumeListResumeReq */
+typedef E_RAB_IE_ContainerList_456P8_t	 E_RABFailedToResumeListResumeReq_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_E_RABFailedToResumeListResumeReq_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_E_RABFailedToResumeListResumeReq;
+asn_struct_free_f E_RABFailedToResumeListResumeReq_free;
+asn_struct_print_f E_RABFailedToResumeListResumeReq_print;
+asn_constr_check_f E_RABFailedToResumeListResumeReq_constraint;
+ber_type_decoder_f E_RABFailedToResumeListResumeReq_decode_ber;
+der_type_encoder_f E_RABFailedToResumeListResumeReq_encode_der;
+xer_type_decoder_f E_RABFailedToResumeListResumeReq_decode_xer;
+xer_type_encoder_f E_RABFailedToResumeListResumeReq_encode_xer;
+oer_type_decoder_f E_RABFailedToResumeListResumeReq_decode_oer;
+oer_type_encoder_f E_RABFailedToResumeListResumeReq_encode_oer;
+per_type_decoder_f E_RABFailedToResumeListResumeReq_decode_uper;
+per_type_encoder_f E_RABFailedToResumeListResumeReq_encode_uper;
+per_type_decoder_f E_RABFailedToResumeListResumeReq_decode_aper;
+per_type_encoder_f E_RABFailedToResumeListResumeReq_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABFailedToResumeListResumeReq_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABFailedToResumeListResumeRes.h b/src/s1ap/asn1c/asnGenFiles/E-RABFailedToResumeListResumeRes.h
new file mode 100644
index 0000000..74b30af
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABFailedToResumeListResumeRes.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABFailedToResumeListResumeRes_H_
+#define	_E_RABFailedToResumeListResumeRes_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "E-RAB-IE-ContainerList.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E-RABFailedToResumeListResumeRes */
+typedef E_RAB_IE_ContainerList_456P9_t	 E_RABFailedToResumeListResumeRes_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_E_RABFailedToResumeListResumeRes_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_E_RABFailedToResumeListResumeRes;
+asn_struct_free_f E_RABFailedToResumeListResumeRes_free;
+asn_struct_print_f E_RABFailedToResumeListResumeRes_print;
+asn_constr_check_f E_RABFailedToResumeListResumeRes_constraint;
+ber_type_decoder_f E_RABFailedToResumeListResumeRes_decode_ber;
+der_type_encoder_f E_RABFailedToResumeListResumeRes_encode_der;
+xer_type_decoder_f E_RABFailedToResumeListResumeRes_decode_xer;
+xer_type_encoder_f E_RABFailedToResumeListResumeRes_encode_xer;
+oer_type_decoder_f E_RABFailedToResumeListResumeRes_decode_oer;
+oer_type_encoder_f E_RABFailedToResumeListResumeRes_encode_oer;
+per_type_decoder_f E_RABFailedToResumeListResumeRes_decode_uper;
+per_type_encoder_f E_RABFailedToResumeListResumeRes_encode_uper;
+per_type_decoder_f E_RABFailedToResumeListResumeRes_decode_aper;
+per_type_encoder_f E_RABFailedToResumeListResumeRes_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABFailedToResumeListResumeRes_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABFailedToSetupItemHOReqAck.h b/src/s1ap/asn1c/asnGenFiles/E-RABFailedToSetupItemHOReqAck.h
new file mode 100644
index 0000000..6727d23
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABFailedToSetupItemHOReqAck.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABFailedToSetupItemHOReqAck_H_
+#define	_E_RABFailedToSetupItemHOReqAck_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "E-RAB-ID.h"
+#include "Cause.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* E-RABFailedToSetupItemHOReqAck */
+typedef struct E_RABFailedToSetupItemHOReqAck {
+	E_RAB_ID_t	 e_RAB_ID;
+	Cause_t	 cause;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABFailedToSetupItemHOReqAck_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E_RABFailedToSetupItemHOReqAck;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABFailedToSetupItemHOReqAck_specs_1;
+extern asn_TYPE_member_t asn_MBR_E_RABFailedToSetupItemHOReqAck_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABFailedToSetupItemHOReqAck_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABFailedtoSetupListHOReqAck.h b/src/s1ap/asn1c/asnGenFiles/E-RABFailedtoSetupListHOReqAck.h
new file mode 100644
index 0000000..3050e7f
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABFailedtoSetupListHOReqAck.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABFailedtoSetupListHOReqAck_H_
+#define	_E_RABFailedtoSetupListHOReqAck_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "E-RAB-IE-ContainerList.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E-RABFailedtoSetupListHOReqAck */
+typedef E_RAB_IE_ContainerList_456P3_t	 E_RABFailedtoSetupListHOReqAck_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_E_RABFailedtoSetupListHOReqAck_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_E_RABFailedtoSetupListHOReqAck;
+asn_struct_free_f E_RABFailedtoSetupListHOReqAck_free;
+asn_struct_print_f E_RABFailedtoSetupListHOReqAck_print;
+asn_constr_check_f E_RABFailedtoSetupListHOReqAck_constraint;
+ber_type_decoder_f E_RABFailedtoSetupListHOReqAck_decode_ber;
+der_type_encoder_f E_RABFailedtoSetupListHOReqAck_encode_der;
+xer_type_decoder_f E_RABFailedtoSetupListHOReqAck_decode_xer;
+xer_type_encoder_f E_RABFailedtoSetupListHOReqAck_encode_xer;
+oer_type_decoder_f E_RABFailedtoSetupListHOReqAck_decode_oer;
+oer_type_encoder_f E_RABFailedtoSetupListHOReqAck_encode_oer;
+per_type_decoder_f E_RABFailedtoSetupListHOReqAck_decode_uper;
+per_type_encoder_f E_RABFailedtoSetupListHOReqAck_encode_uper;
+per_type_decoder_f E_RABFailedtoSetupListHOReqAck_decode_aper;
+per_type_encoder_f E_RABFailedtoSetupListHOReqAck_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABFailedtoSetupListHOReqAck_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABInformationList.h b/src/s1ap/asn1c/asnGenFiles/E-RABInformationList.h
new file mode 100644
index 0000000..58db860
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABInformationList.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABInformationList_H_
+#define	_E_RABInformationList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolIE_SingleContainer;
+
+/* E-RABInformationList */
+typedef struct E_RABInformationList {
+	A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABInformationList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E_RABInformationList;
+extern asn_SET_OF_specifics_t asn_SPC_E_RABInformationList_specs_1;
+extern asn_TYPE_member_t asn_MBR_E_RABInformationList_1[1];
+extern asn_per_constraints_t asn_PER_type_E_RABInformationList_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABInformationList_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABInformationListItem.h b/src/s1ap/asn1c/asnGenFiles/E-RABInformationListItem.h
new file mode 100644
index 0000000..9ad32d3
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABInformationListItem.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABInformationListItem_H_
+#define	_E_RABInformationListItem_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "E-RAB-ID.h"
+#include "DL-Forwarding.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* E-RABInformationListItem */
+typedef struct E_RABInformationListItem {
+	E_RAB_ID_t	 e_RAB_ID;
+	DL_Forwarding_t	*dL_Forwarding;	/* OPTIONAL */
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABInformationListItem_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E_RABInformationListItem;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABInformationListItem_specs_1;
+extern asn_TYPE_member_t asn_MBR_E_RABInformationListItem_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABInformationListItem_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABItem.h b/src/s1ap/asn1c/asnGenFiles/E-RABItem.h
new file mode 100644
index 0000000..5d8d22d
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABItem.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABItem_H_
+#define	_E_RABItem_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "E-RAB-ID.h"
+#include "Cause.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* E-RABItem */
+typedef struct E_RABItem {
+	E_RAB_ID_t	 e_RAB_ID;
+	Cause_t	 cause;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABItem_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E_RABItem;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABItem_specs_1;
+extern asn_TYPE_member_t asn_MBR_E_RABItem_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABItem_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABLevelQoSParameters.h b/src/s1ap/asn1c/asnGenFiles/E-RABLevelQoSParameters.h
new file mode 100644
index 0000000..6c9182c
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABLevelQoSParameters.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABLevelQoSParameters_H_
+#define	_E_RABLevelQoSParameters_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "QCI.h"
+#include "AllocationAndRetentionPriority.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct GBR_QosInformation;
+struct ProtocolExtensionContainer;
+
+/* E-RABLevelQoSParameters */
+typedef struct E_RABLevelQoSParameters {
+	QCI_t	 qCI;
+	AllocationAndRetentionPriority_t	 allocationRetentionPriority;
+	struct GBR_QosInformation	*gbrQosInformation;	/* OPTIONAL */
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABLevelQoSParameters_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E_RABLevelQoSParameters;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABLevelQoSParameters_specs_1;
+extern asn_TYPE_member_t asn_MBR_E_RABLevelQoSParameters_1[4];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABLevelQoSParameters_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABList.h b/src/s1ap/asn1c/asnGenFiles/E-RABList.h
new file mode 100644
index 0000000..770fab3
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABList.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABList_H_
+#define	_E_RABList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolIE_SingleContainer;
+
+/* E-RABList */
+typedef struct E_RABList {
+	A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E_RABList;
+extern asn_SET_OF_specifics_t asn_SPC_E_RABList_specs_1;
+extern asn_TYPE_member_t asn_MBR_E_RABList_1[1];
+extern asn_per_constraints_t asn_PER_type_E_RABList_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABList_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABModificationConfirm.h b/src/s1ap/asn1c/asnGenFiles/E-RABModificationConfirm.h
new file mode 100644
index 0000000..25e2b2f
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABModificationConfirm.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABModificationConfirm_H_
+#define	_E_RABModificationConfirm_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E-RABModificationConfirm */
+typedef struct E_RABModificationConfirm {
+	ProtocolIE_Container_129P78_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABModificationConfirm_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E_RABModificationConfirm;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABModificationConfirm_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABModificationIndication.h b/src/s1ap/asn1c/asnGenFiles/E-RABModificationIndication.h
new file mode 100644
index 0000000..2ec8ac0
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABModificationIndication.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABModificationIndication_H_
+#define	_E_RABModificationIndication_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E-RABModificationIndication */
+typedef struct E_RABModificationIndication {
+	ProtocolIE_Container_129P77_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABModificationIndication_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E_RABModificationIndication;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABModificationIndication_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABModifyItemBearerModConf.h b/src/s1ap/asn1c/asnGenFiles/E-RABModifyItemBearerModConf.h
new file mode 100644
index 0000000..bbeeba7
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABModifyItemBearerModConf.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABModifyItemBearerModConf_H_
+#define	_E_RABModifyItemBearerModConf_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "E-RAB-ID.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* E-RABModifyItemBearerModConf */
+typedef struct E_RABModifyItemBearerModConf {
+	E_RAB_ID_t	 e_RAB_ID;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABModifyItemBearerModConf_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E_RABModifyItemBearerModConf;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABModifyItemBearerModConf_specs_1;
+extern asn_TYPE_member_t asn_MBR_E_RABModifyItemBearerModConf_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABModifyItemBearerModConf_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABModifyItemBearerModRes.h b/src/s1ap/asn1c/asnGenFiles/E-RABModifyItemBearerModRes.h
new file mode 100644
index 0000000..bd21af2
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABModifyItemBearerModRes.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABModifyItemBearerModRes_H_
+#define	_E_RABModifyItemBearerModRes_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "E-RAB-ID.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* E-RABModifyItemBearerModRes */
+typedef struct E_RABModifyItemBearerModRes {
+	E_RAB_ID_t	 e_RAB_ID;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABModifyItemBearerModRes_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E_RABModifyItemBearerModRes;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABModifyItemBearerModRes_specs_1;
+extern asn_TYPE_member_t asn_MBR_E_RABModifyItemBearerModRes_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABModifyItemBearerModRes_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABModifyListBearerModConf.h b/src/s1ap/asn1c/asnGenFiles/E-RABModifyListBearerModConf.h
new file mode 100644
index 0000000..326e103
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABModifyListBearerModConf.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABModifyListBearerModConf_H_
+#define	_E_RABModifyListBearerModConf_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolIE_SingleContainer;
+
+/* E-RABModifyListBearerModConf */
+typedef struct E_RABModifyListBearerModConf {
+	A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABModifyListBearerModConf_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E_RABModifyListBearerModConf;
+extern asn_SET_OF_specifics_t asn_SPC_E_RABModifyListBearerModConf_specs_1;
+extern asn_TYPE_member_t asn_MBR_E_RABModifyListBearerModConf_1[1];
+extern asn_per_constraints_t asn_PER_type_E_RABModifyListBearerModConf_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABModifyListBearerModConf_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABModifyListBearerModRes.h b/src/s1ap/asn1c/asnGenFiles/E-RABModifyListBearerModRes.h
new file mode 100644
index 0000000..857ea21
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABModifyListBearerModRes.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABModifyListBearerModRes_H_
+#define	_E_RABModifyListBearerModRes_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolIE_SingleContainer;
+
+/* E-RABModifyListBearerModRes */
+typedef struct E_RABModifyListBearerModRes {
+	A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABModifyListBearerModRes_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E_RABModifyListBearerModRes;
+extern asn_SET_OF_specifics_t asn_SPC_E_RABModifyListBearerModRes_specs_1;
+extern asn_TYPE_member_t asn_MBR_E_RABModifyListBearerModRes_1[1];
+extern asn_per_constraints_t asn_PER_type_E_RABModifyListBearerModRes_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABModifyListBearerModRes_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABModifyRequest.h b/src/s1ap/asn1c/asnGenFiles/E-RABModifyRequest.h
new file mode 100644
index 0000000..8834a20
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABModifyRequest.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABModifyRequest_H_
+#define	_E_RABModifyRequest_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E-RABModifyRequest */
+typedef struct E_RABModifyRequest {
+	ProtocolIE_Container_129P14_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABModifyRequest_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E_RABModifyRequest;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABModifyRequest_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABModifyResponse.h b/src/s1ap/asn1c/asnGenFiles/E-RABModifyResponse.h
new file mode 100644
index 0000000..04e224e
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABModifyResponse.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABModifyResponse_H_
+#define	_E_RABModifyResponse_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E-RABModifyResponse */
+typedef struct E_RABModifyResponse {
+	ProtocolIE_Container_129P15_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABModifyResponse_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E_RABModifyResponse;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABModifyResponse_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABNotToBeModifiedItemBearerModInd.h b/src/s1ap/asn1c/asnGenFiles/E-RABNotToBeModifiedItemBearerModInd.h
new file mode 100644
index 0000000..2e950c5
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABNotToBeModifiedItemBearerModInd.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABNotToBeModifiedItemBearerModInd_H_
+#define	_E_RABNotToBeModifiedItemBearerModInd_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "E-RAB-ID.h"
+#include "TransportLayerAddress.h"
+#include "GTP-TEID.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* E-RABNotToBeModifiedItemBearerModInd */
+typedef struct E_RABNotToBeModifiedItemBearerModInd {
+	E_RAB_ID_t	 e_RAB_ID;
+	TransportLayerAddress_t	 transportLayerAddress;
+	GTP_TEID_t	 dL_GTP_TEID;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABNotToBeModifiedItemBearerModInd_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E_RABNotToBeModifiedItemBearerModInd;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABNotToBeModifiedItemBearerModInd_specs_1;
+extern asn_TYPE_member_t asn_MBR_E_RABNotToBeModifiedItemBearerModInd_1[4];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABNotToBeModifiedItemBearerModInd_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABNotToBeModifiedListBearerModInd.h b/src/s1ap/asn1c/asnGenFiles/E-RABNotToBeModifiedListBearerModInd.h
new file mode 100644
index 0000000..e946ec2
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABNotToBeModifiedListBearerModInd.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABNotToBeModifiedListBearerModInd_H_
+#define	_E_RABNotToBeModifiedListBearerModInd_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "E-RAB-IE-ContainerList.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E-RABNotToBeModifiedListBearerModInd */
+typedef E_RAB_IE_ContainerList_456P7_t	 E_RABNotToBeModifiedListBearerModInd_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_E_RABNotToBeModifiedListBearerModInd_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_E_RABNotToBeModifiedListBearerModInd;
+asn_struct_free_f E_RABNotToBeModifiedListBearerModInd_free;
+asn_struct_print_f E_RABNotToBeModifiedListBearerModInd_print;
+asn_constr_check_f E_RABNotToBeModifiedListBearerModInd_constraint;
+ber_type_decoder_f E_RABNotToBeModifiedListBearerModInd_decode_ber;
+der_type_encoder_f E_RABNotToBeModifiedListBearerModInd_encode_der;
+xer_type_decoder_f E_RABNotToBeModifiedListBearerModInd_decode_xer;
+xer_type_encoder_f E_RABNotToBeModifiedListBearerModInd_encode_xer;
+oer_type_decoder_f E_RABNotToBeModifiedListBearerModInd_decode_oer;
+oer_type_encoder_f E_RABNotToBeModifiedListBearerModInd_encode_oer;
+per_type_decoder_f E_RABNotToBeModifiedListBearerModInd_decode_uper;
+per_type_encoder_f E_RABNotToBeModifiedListBearerModInd_encode_uper;
+per_type_decoder_f E_RABNotToBeModifiedListBearerModInd_decode_aper;
+per_type_encoder_f E_RABNotToBeModifiedListBearerModInd_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABNotToBeModifiedListBearerModInd_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABReleaseCommand.h b/src/s1ap/asn1c/asnGenFiles/E-RABReleaseCommand.h
new file mode 100644
index 0000000..9c52c30
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABReleaseCommand.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABReleaseCommand_H_
+#define	_E_RABReleaseCommand_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E-RABReleaseCommand */
+typedef struct E_RABReleaseCommand {
+	ProtocolIE_Container_129P16_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABReleaseCommand_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E_RABReleaseCommand;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABReleaseCommand_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABReleaseIndication.h b/src/s1ap/asn1c/asnGenFiles/E-RABReleaseIndication.h
new file mode 100644
index 0000000..3bcce74
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABReleaseIndication.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABReleaseIndication_H_
+#define	_E_RABReleaseIndication_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E-RABReleaseIndication */
+typedef struct E_RABReleaseIndication {
+	ProtocolIE_Container_129P18_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABReleaseIndication_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E_RABReleaseIndication;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABReleaseIndication_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABReleaseItemBearerRelComp.h b/src/s1ap/asn1c/asnGenFiles/E-RABReleaseItemBearerRelComp.h
new file mode 100644
index 0000000..4edc17b
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABReleaseItemBearerRelComp.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABReleaseItemBearerRelComp_H_
+#define	_E_RABReleaseItemBearerRelComp_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "E-RAB-ID.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* E-RABReleaseItemBearerRelComp */
+typedef struct E_RABReleaseItemBearerRelComp {
+	E_RAB_ID_t	 e_RAB_ID;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABReleaseItemBearerRelComp_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E_RABReleaseItemBearerRelComp;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABReleaseItemBearerRelComp_specs_1;
+extern asn_TYPE_member_t asn_MBR_E_RABReleaseItemBearerRelComp_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABReleaseItemBearerRelComp_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABReleaseListBearerRelComp.h b/src/s1ap/asn1c/asnGenFiles/E-RABReleaseListBearerRelComp.h
new file mode 100644
index 0000000..b3a21d9
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABReleaseListBearerRelComp.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABReleaseListBearerRelComp_H_
+#define	_E_RABReleaseListBearerRelComp_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolIE_SingleContainer;
+
+/* E-RABReleaseListBearerRelComp */
+typedef struct E_RABReleaseListBearerRelComp {
+	A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABReleaseListBearerRelComp_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E_RABReleaseListBearerRelComp;
+extern asn_SET_OF_specifics_t asn_SPC_E_RABReleaseListBearerRelComp_specs_1;
+extern asn_TYPE_member_t asn_MBR_E_RABReleaseListBearerRelComp_1[1];
+extern asn_per_constraints_t asn_PER_type_E_RABReleaseListBearerRelComp_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABReleaseListBearerRelComp_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABReleaseResponse.h b/src/s1ap/asn1c/asnGenFiles/E-RABReleaseResponse.h
new file mode 100644
index 0000000..08bee42
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABReleaseResponse.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABReleaseResponse_H_
+#define	_E_RABReleaseResponse_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E-RABReleaseResponse */
+typedef struct E_RABReleaseResponse {
+	ProtocolIE_Container_129P17_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABReleaseResponse_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E_RABReleaseResponse;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABReleaseResponse_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABSetupItemBearerSURes.h b/src/s1ap/asn1c/asnGenFiles/E-RABSetupItemBearerSURes.h
new file mode 100644
index 0000000..6d45719
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABSetupItemBearerSURes.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABSetupItemBearerSURes_H_
+#define	_E_RABSetupItemBearerSURes_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "E-RAB-ID.h"
+#include "TransportLayerAddress.h"
+#include "GTP-TEID.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* E-RABSetupItemBearerSURes */
+typedef struct E_RABSetupItemBearerSURes {
+	E_RAB_ID_t	 e_RAB_ID;
+	TransportLayerAddress_t	 transportLayerAddress;
+	GTP_TEID_t	 gTP_TEID;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABSetupItemBearerSURes_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E_RABSetupItemBearerSURes;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABSetupItemBearerSURes_specs_1;
+extern asn_TYPE_member_t asn_MBR_E_RABSetupItemBearerSURes_1[4];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABSetupItemBearerSURes_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABSetupItemCtxtSURes.h b/src/s1ap/asn1c/asnGenFiles/E-RABSetupItemCtxtSURes.h
new file mode 100644
index 0000000..0243d30
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABSetupItemCtxtSURes.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABSetupItemCtxtSURes_H_
+#define	_E_RABSetupItemCtxtSURes_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "E-RAB-ID.h"
+#include "TransportLayerAddress.h"
+#include "GTP-TEID.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* E-RABSetupItemCtxtSURes */
+typedef struct E_RABSetupItemCtxtSURes {
+	E_RAB_ID_t	 e_RAB_ID;
+	TransportLayerAddress_t	 transportLayerAddress;
+	GTP_TEID_t	 gTP_TEID;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABSetupItemCtxtSURes_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E_RABSetupItemCtxtSURes;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABSetupItemCtxtSURes_specs_1;
+extern asn_TYPE_member_t asn_MBR_E_RABSetupItemCtxtSURes_1[4];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABSetupItemCtxtSURes_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABSetupListBearerSURes.h b/src/s1ap/asn1c/asnGenFiles/E-RABSetupListBearerSURes.h
new file mode 100644
index 0000000..bba9e13
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABSetupListBearerSURes.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABSetupListBearerSURes_H_
+#define	_E_RABSetupListBearerSURes_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolIE_SingleContainer;
+
+/* E-RABSetupListBearerSURes */
+typedef struct E_RABSetupListBearerSURes {
+	A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABSetupListBearerSURes_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E_RABSetupListBearerSURes;
+extern asn_SET_OF_specifics_t asn_SPC_E_RABSetupListBearerSURes_specs_1;
+extern asn_TYPE_member_t asn_MBR_E_RABSetupListBearerSURes_1[1];
+extern asn_per_constraints_t asn_PER_type_E_RABSetupListBearerSURes_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABSetupListBearerSURes_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABSetupListCtxtSURes.h b/src/s1ap/asn1c/asnGenFiles/E-RABSetupListCtxtSURes.h
new file mode 100644
index 0000000..19574dd
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABSetupListCtxtSURes.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABSetupListCtxtSURes_H_
+#define	_E_RABSetupListCtxtSURes_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolIE_SingleContainer;
+
+/* E-RABSetupListCtxtSURes */
+typedef struct E_RABSetupListCtxtSURes {
+	A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABSetupListCtxtSURes_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E_RABSetupListCtxtSURes;
+extern asn_SET_OF_specifics_t asn_SPC_E_RABSetupListCtxtSURes_specs_1;
+extern asn_TYPE_member_t asn_MBR_E_RABSetupListCtxtSURes_1[1];
+extern asn_per_constraints_t asn_PER_type_E_RABSetupListCtxtSURes_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABSetupListCtxtSURes_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABSetupRequest.h b/src/s1ap/asn1c/asnGenFiles/E-RABSetupRequest.h
new file mode 100644
index 0000000..4036c84
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABSetupRequest.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABSetupRequest_H_
+#define	_E_RABSetupRequest_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E-RABSetupRequest */
+typedef struct E_RABSetupRequest {
+	ProtocolIE_Container_129P12_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABSetupRequest_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E_RABSetupRequest;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABSetupRequest_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABSetupResponse.h b/src/s1ap/asn1c/asnGenFiles/E-RABSetupResponse.h
new file mode 100644
index 0000000..1c12414
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABSetupResponse.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABSetupResponse_H_
+#define	_E_RABSetupResponse_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E-RABSetupResponse */
+typedef struct E_RABSetupResponse {
+	ProtocolIE_Container_129P13_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABSetupResponse_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E_RABSetupResponse;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABSetupResponse_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABSubjecttoDataForwardingList.h b/src/s1ap/asn1c/asnGenFiles/E-RABSubjecttoDataForwardingList.h
new file mode 100644
index 0000000..f2c42cd
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABSubjecttoDataForwardingList.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABSubjecttoDataForwardingList_H_
+#define	_E_RABSubjecttoDataForwardingList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "E-RAB-IE-ContainerList.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E-RABSubjecttoDataForwardingList */
+typedef E_RAB_IE_ContainerList_456P0_t	 E_RABSubjecttoDataForwardingList_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_E_RABSubjecttoDataForwardingList_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_E_RABSubjecttoDataForwardingList;
+asn_struct_free_f E_RABSubjecttoDataForwardingList_free;
+asn_struct_print_f E_RABSubjecttoDataForwardingList_print;
+asn_constr_check_f E_RABSubjecttoDataForwardingList_constraint;
+ber_type_decoder_f E_RABSubjecttoDataForwardingList_decode_ber;
+der_type_encoder_f E_RABSubjecttoDataForwardingList_encode_der;
+xer_type_decoder_f E_RABSubjecttoDataForwardingList_decode_xer;
+xer_type_encoder_f E_RABSubjecttoDataForwardingList_encode_xer;
+oer_type_decoder_f E_RABSubjecttoDataForwardingList_decode_oer;
+oer_type_encoder_f E_RABSubjecttoDataForwardingList_encode_oer;
+per_type_decoder_f E_RABSubjecttoDataForwardingList_decode_uper;
+per_type_encoder_f E_RABSubjecttoDataForwardingList_encode_uper;
+per_type_decoder_f E_RABSubjecttoDataForwardingList_decode_aper;
+per_type_encoder_f E_RABSubjecttoDataForwardingList_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABSubjecttoDataForwardingList_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABToBeModifiedItemBearerModInd.h b/src/s1ap/asn1c/asnGenFiles/E-RABToBeModifiedItemBearerModInd.h
new file mode 100644
index 0000000..68e0063
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABToBeModifiedItemBearerModInd.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABToBeModifiedItemBearerModInd_H_
+#define	_E_RABToBeModifiedItemBearerModInd_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "E-RAB-ID.h"
+#include "TransportLayerAddress.h"
+#include "GTP-TEID.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* E-RABToBeModifiedItemBearerModInd */
+typedef struct E_RABToBeModifiedItemBearerModInd {
+	E_RAB_ID_t	 e_RAB_ID;
+	TransportLayerAddress_t	 transportLayerAddress;
+	GTP_TEID_t	 dL_GTP_TEID;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABToBeModifiedItemBearerModInd_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E_RABToBeModifiedItemBearerModInd;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABToBeModifiedItemBearerModInd_specs_1;
+extern asn_TYPE_member_t asn_MBR_E_RABToBeModifiedItemBearerModInd_1[4];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABToBeModifiedItemBearerModInd_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABToBeModifiedItemBearerModReq.h b/src/s1ap/asn1c/asnGenFiles/E-RABToBeModifiedItemBearerModReq.h
new file mode 100644
index 0000000..3ab5c08
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABToBeModifiedItemBearerModReq.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABToBeModifiedItemBearerModReq_H_
+#define	_E_RABToBeModifiedItemBearerModReq_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "E-RAB-ID.h"
+#include "E-RABLevelQoSParameters.h"
+#include "NAS-PDU.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* E-RABToBeModifiedItemBearerModReq */
+typedef struct E_RABToBeModifiedItemBearerModReq {
+	E_RAB_ID_t	 e_RAB_ID;
+	E_RABLevelQoSParameters_t	 e_RABLevelQoSParameters;
+	NAS_PDU_t	 nAS_PDU;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABToBeModifiedItemBearerModReq_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E_RABToBeModifiedItemBearerModReq;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABToBeModifiedItemBearerModReq_specs_1;
+extern asn_TYPE_member_t asn_MBR_E_RABToBeModifiedItemBearerModReq_1[4];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABToBeModifiedItemBearerModReq_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABToBeModifiedListBearerModInd.h b/src/s1ap/asn1c/asnGenFiles/E-RABToBeModifiedListBearerModInd.h
new file mode 100644
index 0000000..2cc3166
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABToBeModifiedListBearerModInd.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABToBeModifiedListBearerModInd_H_
+#define	_E_RABToBeModifiedListBearerModInd_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "E-RAB-IE-ContainerList.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E-RABToBeModifiedListBearerModInd */
+typedef E_RAB_IE_ContainerList_456P6_t	 E_RABToBeModifiedListBearerModInd_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_E_RABToBeModifiedListBearerModInd_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_E_RABToBeModifiedListBearerModInd;
+asn_struct_free_f E_RABToBeModifiedListBearerModInd_free;
+asn_struct_print_f E_RABToBeModifiedListBearerModInd_print;
+asn_constr_check_f E_RABToBeModifiedListBearerModInd_constraint;
+ber_type_decoder_f E_RABToBeModifiedListBearerModInd_decode_ber;
+der_type_encoder_f E_RABToBeModifiedListBearerModInd_encode_der;
+xer_type_decoder_f E_RABToBeModifiedListBearerModInd_decode_xer;
+xer_type_encoder_f E_RABToBeModifiedListBearerModInd_encode_xer;
+oer_type_decoder_f E_RABToBeModifiedListBearerModInd_decode_oer;
+oer_type_encoder_f E_RABToBeModifiedListBearerModInd_encode_oer;
+per_type_decoder_f E_RABToBeModifiedListBearerModInd_decode_uper;
+per_type_encoder_f E_RABToBeModifiedListBearerModInd_encode_uper;
+per_type_decoder_f E_RABToBeModifiedListBearerModInd_decode_aper;
+per_type_encoder_f E_RABToBeModifiedListBearerModInd_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABToBeModifiedListBearerModInd_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABToBeModifiedListBearerModReq.h b/src/s1ap/asn1c/asnGenFiles/E-RABToBeModifiedListBearerModReq.h
new file mode 100644
index 0000000..1e11c2d
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABToBeModifiedListBearerModReq.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABToBeModifiedListBearerModReq_H_
+#define	_E_RABToBeModifiedListBearerModReq_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolIE_SingleContainer;
+
+/* E-RABToBeModifiedListBearerModReq */
+typedef struct E_RABToBeModifiedListBearerModReq {
+	A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABToBeModifiedListBearerModReq_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E_RABToBeModifiedListBearerModReq;
+extern asn_SET_OF_specifics_t asn_SPC_E_RABToBeModifiedListBearerModReq_specs_1;
+extern asn_TYPE_member_t asn_MBR_E_RABToBeModifiedListBearerModReq_1[1];
+extern asn_per_constraints_t asn_PER_type_E_RABToBeModifiedListBearerModReq_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABToBeModifiedListBearerModReq_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABToBeSetupItemBearerSUReq.h b/src/s1ap/asn1c/asnGenFiles/E-RABToBeSetupItemBearerSUReq.h
new file mode 100644
index 0000000..cb3076c
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABToBeSetupItemBearerSUReq.h
@@ -0,0 +1,56 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABToBeSetupItemBearerSUReq_H_
+#define	_E_RABToBeSetupItemBearerSUReq_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "E-RAB-ID.h"
+#include "E-RABLevelQoSParameters.h"
+#include "TransportLayerAddress.h"
+#include "GTP-TEID.h"
+#include "NAS-PDU.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* E-RABToBeSetupItemBearerSUReq */
+typedef struct E_RABToBeSetupItemBearerSUReq {
+	E_RAB_ID_t	 e_RAB_ID;
+	E_RABLevelQoSParameters_t	 e_RABlevelQoSParameters;
+	TransportLayerAddress_t	 transportLayerAddress;
+	GTP_TEID_t	 gTP_TEID;
+	NAS_PDU_t	 nAS_PDU;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABToBeSetupItemBearerSUReq_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E_RABToBeSetupItemBearerSUReq;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABToBeSetupItemBearerSUReq_specs_1;
+extern asn_TYPE_member_t asn_MBR_E_RABToBeSetupItemBearerSUReq_1[6];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABToBeSetupItemBearerSUReq_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABToBeSetupItemCtxtSUReq.h b/src/s1ap/asn1c/asnGenFiles/E-RABToBeSetupItemCtxtSUReq.h
new file mode 100644
index 0000000..d31dc17
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABToBeSetupItemCtxtSUReq.h
@@ -0,0 +1,56 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABToBeSetupItemCtxtSUReq_H_
+#define	_E_RABToBeSetupItemCtxtSUReq_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "E-RAB-ID.h"
+#include "E-RABLevelQoSParameters.h"
+#include "TransportLayerAddress.h"
+#include "GTP-TEID.h"
+#include "NAS-PDU.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* E-RABToBeSetupItemCtxtSUReq */
+typedef struct E_RABToBeSetupItemCtxtSUReq {
+	E_RAB_ID_t	 e_RAB_ID;
+	E_RABLevelQoSParameters_t	 e_RABlevelQoSParameters;
+	TransportLayerAddress_t	 transportLayerAddress;
+	GTP_TEID_t	 gTP_TEID;
+	NAS_PDU_t	*nAS_PDU;	/* OPTIONAL */
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABToBeSetupItemCtxtSUReq_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E_RABToBeSetupItemCtxtSUReq;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABToBeSetupItemCtxtSUReq_specs_1;
+extern asn_TYPE_member_t asn_MBR_E_RABToBeSetupItemCtxtSUReq_1[6];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABToBeSetupItemCtxtSUReq_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABToBeSetupItemHOReq.h b/src/s1ap/asn1c/asnGenFiles/E-RABToBeSetupItemHOReq.h
new file mode 100644
index 0000000..c68a5b7
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABToBeSetupItemHOReq.h
@@ -0,0 +1,54 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABToBeSetupItemHOReq_H_
+#define	_E_RABToBeSetupItemHOReq_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "E-RAB-ID.h"
+#include "TransportLayerAddress.h"
+#include "GTP-TEID.h"
+#include "E-RABLevelQoSParameters.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* E-RABToBeSetupItemHOReq */
+typedef struct E_RABToBeSetupItemHOReq {
+	E_RAB_ID_t	 e_RAB_ID;
+	TransportLayerAddress_t	 transportLayerAddress;
+	GTP_TEID_t	 gTP_TEID;
+	E_RABLevelQoSParameters_t	 e_RABlevelQosParameters;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABToBeSetupItemHOReq_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E_RABToBeSetupItemHOReq;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABToBeSetupItemHOReq_specs_1;
+extern asn_TYPE_member_t asn_MBR_E_RABToBeSetupItemHOReq_1[5];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABToBeSetupItemHOReq_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABToBeSetupListBearerSUReq.h b/src/s1ap/asn1c/asnGenFiles/E-RABToBeSetupListBearerSUReq.h
new file mode 100644
index 0000000..da3eafb
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABToBeSetupListBearerSUReq.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABToBeSetupListBearerSUReq_H_
+#define	_E_RABToBeSetupListBearerSUReq_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolIE_SingleContainer;
+
+/* E-RABToBeSetupListBearerSUReq */
+typedef struct E_RABToBeSetupListBearerSUReq {
+	A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABToBeSetupListBearerSUReq_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E_RABToBeSetupListBearerSUReq;
+extern asn_SET_OF_specifics_t asn_SPC_E_RABToBeSetupListBearerSUReq_specs_1;
+extern asn_TYPE_member_t asn_MBR_E_RABToBeSetupListBearerSUReq_1[1];
+extern asn_per_constraints_t asn_PER_type_E_RABToBeSetupListBearerSUReq_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABToBeSetupListBearerSUReq_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABToBeSetupListCtxtSUReq.h b/src/s1ap/asn1c/asnGenFiles/E-RABToBeSetupListCtxtSUReq.h
new file mode 100644
index 0000000..c4c3cd9
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABToBeSetupListCtxtSUReq.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABToBeSetupListCtxtSUReq_H_
+#define	_E_RABToBeSetupListCtxtSUReq_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolIE_SingleContainer;
+
+/* E-RABToBeSetupListCtxtSUReq */
+typedef struct E_RABToBeSetupListCtxtSUReq {
+	A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABToBeSetupListCtxtSUReq_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E_RABToBeSetupListCtxtSUReq;
+extern asn_SET_OF_specifics_t asn_SPC_E_RABToBeSetupListCtxtSUReq_specs_1;
+extern asn_TYPE_member_t asn_MBR_E_RABToBeSetupListCtxtSUReq_1[1];
+extern asn_per_constraints_t asn_PER_type_E_RABToBeSetupListCtxtSUReq_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABToBeSetupListCtxtSUReq_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABToBeSetupListHOReq.h b/src/s1ap/asn1c/asnGenFiles/E-RABToBeSetupListHOReq.h
new file mode 100644
index 0000000..90a342f
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABToBeSetupListHOReq.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABToBeSetupListHOReq_H_
+#define	_E_RABToBeSetupListHOReq_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "E-RAB-IE-ContainerList.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E-RABToBeSetupListHOReq */
+typedef E_RAB_IE_ContainerList_456P1_t	 E_RABToBeSetupListHOReq_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_E_RABToBeSetupListHOReq_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_E_RABToBeSetupListHOReq;
+asn_struct_free_f E_RABToBeSetupListHOReq_free;
+asn_struct_print_f E_RABToBeSetupListHOReq_print;
+asn_constr_check_f E_RABToBeSetupListHOReq_constraint;
+ber_type_decoder_f E_RABToBeSetupListHOReq_decode_ber;
+der_type_encoder_f E_RABToBeSetupListHOReq_encode_der;
+xer_type_decoder_f E_RABToBeSetupListHOReq_decode_xer;
+xer_type_encoder_f E_RABToBeSetupListHOReq_encode_xer;
+oer_type_decoder_f E_RABToBeSetupListHOReq_decode_oer;
+oer_type_encoder_f E_RABToBeSetupListHOReq_encode_oer;
+per_type_decoder_f E_RABToBeSetupListHOReq_decode_uper;
+per_type_encoder_f E_RABToBeSetupListHOReq_encode_uper;
+per_type_decoder_f E_RABToBeSetupListHOReq_decode_aper;
+per_type_encoder_f E_RABToBeSetupListHOReq_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABToBeSetupListHOReq_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABToBeSwitchedDLItem.h b/src/s1ap/asn1c/asnGenFiles/E-RABToBeSwitchedDLItem.h
new file mode 100644
index 0000000..3162177
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABToBeSwitchedDLItem.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABToBeSwitchedDLItem_H_
+#define	_E_RABToBeSwitchedDLItem_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "E-RAB-ID.h"
+#include "TransportLayerAddress.h"
+#include "GTP-TEID.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* E-RABToBeSwitchedDLItem */
+typedef struct E_RABToBeSwitchedDLItem {
+	E_RAB_ID_t	 e_RAB_ID;
+	TransportLayerAddress_t	 transportLayerAddress;
+	GTP_TEID_t	 gTP_TEID;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABToBeSwitchedDLItem_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E_RABToBeSwitchedDLItem;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABToBeSwitchedDLItem_specs_1;
+extern asn_TYPE_member_t asn_MBR_E_RABToBeSwitchedDLItem_1[4];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABToBeSwitchedDLItem_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABToBeSwitchedDLList.h b/src/s1ap/asn1c/asnGenFiles/E-RABToBeSwitchedDLList.h
new file mode 100644
index 0000000..506fe3b
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABToBeSwitchedDLList.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABToBeSwitchedDLList_H_
+#define	_E_RABToBeSwitchedDLList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "E-RAB-IE-ContainerList.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E-RABToBeSwitchedDLList */
+typedef E_RAB_IE_ContainerList_456P4_t	 E_RABToBeSwitchedDLList_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_E_RABToBeSwitchedDLList_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_E_RABToBeSwitchedDLList;
+asn_struct_free_f E_RABToBeSwitchedDLList_free;
+asn_struct_print_f E_RABToBeSwitchedDLList_print;
+asn_constr_check_f E_RABToBeSwitchedDLList_constraint;
+ber_type_decoder_f E_RABToBeSwitchedDLList_decode_ber;
+der_type_encoder_f E_RABToBeSwitchedDLList_encode_der;
+xer_type_decoder_f E_RABToBeSwitchedDLList_decode_xer;
+xer_type_encoder_f E_RABToBeSwitchedDLList_encode_xer;
+oer_type_decoder_f E_RABToBeSwitchedDLList_decode_oer;
+oer_type_encoder_f E_RABToBeSwitchedDLList_encode_oer;
+per_type_decoder_f E_RABToBeSwitchedDLList_decode_uper;
+per_type_encoder_f E_RABToBeSwitchedDLList_encode_uper;
+per_type_decoder_f E_RABToBeSwitchedDLList_decode_aper;
+per_type_encoder_f E_RABToBeSwitchedDLList_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABToBeSwitchedDLList_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABToBeSwitchedULItem.h b/src/s1ap/asn1c/asnGenFiles/E-RABToBeSwitchedULItem.h
new file mode 100644
index 0000000..9206021
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABToBeSwitchedULItem.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABToBeSwitchedULItem_H_
+#define	_E_RABToBeSwitchedULItem_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "E-RAB-ID.h"
+#include "TransportLayerAddress.h"
+#include "GTP-TEID.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* E-RABToBeSwitchedULItem */
+typedef struct E_RABToBeSwitchedULItem {
+	E_RAB_ID_t	 e_RAB_ID;
+	TransportLayerAddress_t	 transportLayerAddress;
+	GTP_TEID_t	 gTP_TEID;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABToBeSwitchedULItem_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E_RABToBeSwitchedULItem;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABToBeSwitchedULItem_specs_1;
+extern asn_TYPE_member_t asn_MBR_E_RABToBeSwitchedULItem_1[4];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABToBeSwitchedULItem_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABToBeSwitchedULList.h b/src/s1ap/asn1c/asnGenFiles/E-RABToBeSwitchedULList.h
new file mode 100644
index 0000000..a4bb9c8
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABToBeSwitchedULList.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABToBeSwitchedULList_H_
+#define	_E_RABToBeSwitchedULList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "E-RAB-IE-ContainerList.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E-RABToBeSwitchedULList */
+typedef E_RAB_IE_ContainerList_456P5_t	 E_RABToBeSwitchedULList_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_E_RABToBeSwitchedULList_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_E_RABToBeSwitchedULList;
+asn_struct_free_f E_RABToBeSwitchedULList_free;
+asn_struct_print_f E_RABToBeSwitchedULList_print;
+asn_constr_check_f E_RABToBeSwitchedULList_constraint;
+ber_type_decoder_f E_RABToBeSwitchedULList_decode_ber;
+der_type_encoder_f E_RABToBeSwitchedULList_encode_der;
+xer_type_decoder_f E_RABToBeSwitchedULList_decode_xer;
+xer_type_encoder_f E_RABToBeSwitchedULList_encode_xer;
+oer_type_decoder_f E_RABToBeSwitchedULList_decode_oer;
+oer_type_encoder_f E_RABToBeSwitchedULList_encode_oer;
+per_type_decoder_f E_RABToBeSwitchedULList_decode_uper;
+per_type_encoder_f E_RABToBeSwitchedULList_encode_uper;
+per_type_decoder_f E_RABToBeSwitchedULList_decode_aper;
+per_type_encoder_f E_RABToBeSwitchedULList_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABToBeSwitchedULList_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABUsageReportItem.h b/src/s1ap/asn1c/asnGenFiles/E-RABUsageReportItem.h
new file mode 100644
index 0000000..e9e2a39
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABUsageReportItem.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABUsageReportItem_H_
+#define	_E_RABUsageReportItem_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+#include <NativeInteger.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* E-RABUsageReportItem */
+typedef struct E_RABUsageReportItem {
+	OCTET_STRING_t	 startTimestamp;
+	OCTET_STRING_t	 endTimestamp;
+	long	 usageCountUL;
+	long	 usageCountDL;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABUsageReportItem_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E_RABUsageReportItem;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABUsageReportItem_specs_1;
+extern asn_TYPE_member_t asn_MBR_E_RABUsageReportItem_1[5];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABUsageReportItem_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-RABUsageReportList.h b/src/s1ap/asn1c/asnGenFiles/E-RABUsageReportList.h
new file mode 100644
index 0000000..d28023c
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-RABUsageReportList.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_RABUsageReportList_H_
+#define	_E_RABUsageReportList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolIE_SingleContainer;
+
+/* E-RABUsageReportList */
+typedef struct E_RABUsageReportList {
+	A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABUsageReportList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_E_RABUsageReportList;
+extern asn_SET_OF_specifics_t asn_SPC_E_RABUsageReportList_specs_1;
+extern asn_TYPE_member_t asn_MBR_E_RABUsageReportList_1[1];
+extern asn_per_constraints_t asn_PER_type_E_RABUsageReportList_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_RABUsageReportList_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/E-UTRAN-Trace-ID.h b/src/s1ap/asn1c/asnGenFiles/E-UTRAN-Trace-ID.h
new file mode 100644
index 0000000..c49b629
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/E-UTRAN-Trace-ID.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_E_UTRAN_Trace_ID_H_
+#define	_E_UTRAN_Trace_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* E-UTRAN-Trace-ID */
+typedef OCTET_STRING_t	 E_UTRAN_Trace_ID_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_E_UTRAN_Trace_ID_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_E_UTRAN_Trace_ID;
+asn_struct_free_f E_UTRAN_Trace_ID_free;
+asn_struct_print_f E_UTRAN_Trace_ID_print;
+asn_constr_check_f E_UTRAN_Trace_ID_constraint;
+ber_type_decoder_f E_UTRAN_Trace_ID_decode_ber;
+der_type_encoder_f E_UTRAN_Trace_ID_encode_der;
+xer_type_decoder_f E_UTRAN_Trace_ID_decode_xer;
+xer_type_encoder_f E_UTRAN_Trace_ID_encode_xer;
+oer_type_decoder_f E_UTRAN_Trace_ID_decode_oer;
+oer_type_encoder_f E_UTRAN_Trace_ID_encode_oer;
+per_type_decoder_f E_UTRAN_Trace_ID_decode_uper;
+per_type_encoder_f E_UTRAN_Trace_ID_encode_uper;
+per_type_decoder_f E_UTRAN_Trace_ID_decode_aper;
+per_type_encoder_f E_UTRAN_Trace_ID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _E_UTRAN_Trace_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/EARFCN.h b/src/s1ap/asn1c/asnGenFiles/EARFCN.h
new file mode 100644
index 0000000..fa34f32
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/EARFCN.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_EARFCN_H_
+#define	_EARFCN_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* EARFCN */
+typedef long	 EARFCN_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_EARFCN_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_EARFCN;
+asn_struct_free_f EARFCN_free;
+asn_struct_print_f EARFCN_print;
+asn_constr_check_f EARFCN_constraint;
+ber_type_decoder_f EARFCN_decode_ber;
+der_type_encoder_f EARFCN_encode_der;
+xer_type_decoder_f EARFCN_decode_xer;
+xer_type_encoder_f EARFCN_encode_xer;
+oer_type_decoder_f EARFCN_decode_oer;
+oer_type_encoder_f EARFCN_encode_oer;
+per_type_decoder_f EARFCN_decode_uper;
+per_type_encoder_f EARFCN_encode_uper;
+per_type_decoder_f EARFCN_decode_aper;
+per_type_encoder_f EARFCN_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _EARFCN_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ECGI-List.h b/src/s1ap/asn1c/asnGenFiles/ECGI-List.h
new file mode 100644
index 0000000..7e2f5d2
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ECGI-List.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ECGI_List_H_
+#define	_ECGI_List_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct EUTRAN_CGI;
+
+/* ECGI-List */
+typedef struct ECGI_List {
+	A_SEQUENCE_OF(struct EUTRAN_CGI) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ECGI_List_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ECGI_List;
+extern asn_SET_OF_specifics_t asn_SPC_ECGI_List_specs_1;
+extern asn_TYPE_member_t asn_MBR_ECGI_List_1[1];
+extern asn_per_constraints_t asn_PER_type_ECGI_List_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ECGI_List_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ECGIList.h b/src/s1ap/asn1c/asnGenFiles/ECGIList.h
new file mode 100644
index 0000000..9bf40c9
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ECGIList.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ECGIList_H_
+#define	_ECGIList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct EUTRAN_CGI;
+
+/* ECGIList */
+typedef struct ECGIList {
+	A_SEQUENCE_OF(struct EUTRAN_CGI) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ECGIList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ECGIList;
+extern asn_SET_OF_specifics_t asn_SPC_ECGIList_specs_1;
+extern asn_TYPE_member_t asn_MBR_ECGIList_1[1];
+extern asn_per_constraints_t asn_PER_type_ECGIList_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ECGIList_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ECGIListForRestart.h b/src/s1ap/asn1c/asnGenFiles/ECGIListForRestart.h
new file mode 100644
index 0000000..38c4fbe
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ECGIListForRestart.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ECGIListForRestart_H_
+#define	_ECGIListForRestart_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct EUTRAN_CGI;
+
+/* ECGIListForRestart */
+typedef struct ECGIListForRestart {
+	A_SEQUENCE_OF(struct EUTRAN_CGI) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ECGIListForRestart_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ECGIListForRestart;
+extern asn_SET_OF_specifics_t asn_SPC_ECGIListForRestart_specs_1;
+extern asn_TYPE_member_t asn_MBR_ECGIListForRestart_1[1];
+extern asn_per_constraints_t asn_PER_type_ECGIListForRestart_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ECGIListForRestart_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/EDT-Session.h b/src/s1ap/asn1c/asnGenFiles/EDT-Session.h
new file mode 100644
index 0000000..bfe0841
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/EDT-Session.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_EDT_Session_H_
+#define	_EDT_Session_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum EDT_Session {
+	EDT_Session_true	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_EDT_Session;
+
+/* EDT-Session */
+typedef long	 EDT_Session_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_EDT_Session_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_EDT_Session;
+extern const asn_INTEGER_specifics_t asn_SPC_EDT_Session_specs_1;
+asn_struct_free_f EDT_Session_free;
+asn_struct_print_f EDT_Session_print;
+asn_constr_check_f EDT_Session_constraint;
+ber_type_decoder_f EDT_Session_decode_ber;
+der_type_encoder_f EDT_Session_encode_der;
+xer_type_decoder_f EDT_Session_decode_xer;
+xer_type_encoder_f EDT_Session_encode_xer;
+oer_type_decoder_f EDT_Session_decode_oer;
+oer_type_encoder_f EDT_Session_encode_oer;
+per_type_decoder_f EDT_Session_decode_uper;
+per_type_encoder_f EDT_Session_encode_uper;
+per_type_decoder_f EDT_Session_decode_aper;
+per_type_encoder_f EDT_Session_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _EDT_Session_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/EN-DCSONConfigurationTransfer.h b/src/s1ap/asn1c/asnGenFiles/EN-DCSONConfigurationTransfer.h
new file mode 100644
index 0000000..53c7cb6
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/EN-DCSONConfigurationTransfer.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_EN_DCSONConfigurationTransfer_H_
+#define	_EN_DCSONConfigurationTransfer_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "EN-DCSONTransferType.h"
+#include "SONInformation.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct X2TNLConfigurationInfo;
+struct ProtocolExtensionContainer;
+
+/* EN-DCSONConfigurationTransfer */
+typedef struct EN_DCSONConfigurationTransfer {
+	EN_DCSONTransferType_t	 transfertype;
+	SONInformation_t	 sONInformation;
+	struct X2TNLConfigurationInfo	*x2TNLConfigInfo;	/* OPTIONAL */
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} EN_DCSONConfigurationTransfer_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_EN_DCSONConfigurationTransfer;
+extern asn_SEQUENCE_specifics_t asn_SPC_EN_DCSONConfigurationTransfer_specs_1;
+extern asn_TYPE_member_t asn_MBR_EN_DCSONConfigurationTransfer_1[4];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _EN_DCSONConfigurationTransfer_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/EN-DCSONTransferType.h b/src/s1ap/asn1c/asnGenFiles/EN-DCSONTransferType.h
new file mode 100644
index 0000000..6a2fd41
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/EN-DCSONTransferType.h
@@ -0,0 +1,61 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_EN_DCSONTransferType_H_
+#define	_EN_DCSONTransferType_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum EN_DCSONTransferType_PR {
+	EN_DCSONTransferType_PR_NOTHING,	/* No components present */
+	EN_DCSONTransferType_PR_request,
+	EN_DCSONTransferType_PR_reply
+	/* Extensions may appear below */
+	
+} EN_DCSONTransferType_PR;
+
+/* Forward declarations */
+struct EN_DCTransferTypeRequest;
+struct EN_DCTransferTypeReply;
+
+/* EN-DCSONTransferType */
+typedef struct EN_DCSONTransferType {
+	EN_DCSONTransferType_PR present;
+	union EN_DCSONTransferType_u {
+		struct EN_DCTransferTypeRequest	*request;
+		struct EN_DCTransferTypeReply	*reply;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} EN_DCSONTransferType_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_EN_DCSONTransferType;
+extern asn_CHOICE_specifics_t asn_SPC_EN_DCSONTransferType_specs_1;
+extern asn_TYPE_member_t asn_MBR_EN_DCSONTransferType_1[2];
+extern asn_per_constraints_t asn_PER_type_EN_DCSONTransferType_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _EN_DCSONTransferType_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/EN-DCSONeNBIdentification.h b/src/s1ap/asn1c/asnGenFiles/EN-DCSONeNBIdentification.h
new file mode 100644
index 0000000..533b6d2
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/EN-DCSONeNBIdentification.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_EN_DCSONeNBIdentification_H_
+#define	_EN_DCSONeNBIdentification_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "Global-ENB-ID.h"
+#include "TAI.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* EN-DCSONeNBIdentification */
+typedef struct EN_DCSONeNBIdentification {
+	Global_ENB_ID_t	 globaleNBID;
+	TAI_t	 selectedTAI;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} EN_DCSONeNBIdentification_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_EN_DCSONeNBIdentification;
+extern asn_SEQUENCE_specifics_t asn_SPC_EN_DCSONeNBIdentification_specs_1;
+extern asn_TYPE_member_t asn_MBR_EN_DCSONeNBIdentification_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _EN_DCSONeNBIdentification_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/EN-DCSONengNBIdentification.h b/src/s1ap/asn1c/asnGenFiles/EN-DCSONengNBIdentification.h
new file mode 100644
index 0000000..49b4ebf
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/EN-DCSONengNBIdentification.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_EN_DCSONengNBIdentification_H_
+#define	_EN_DCSONengNBIdentification_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "Global-en-gNB-ID.h"
+#include "TAI.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* EN-DCSONengNBIdentification */
+typedef struct EN_DCSONengNBIdentification {
+	Global_en_gNB_ID_t	 globalengNBID;
+	TAI_t	 selectedTAI;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} EN_DCSONengNBIdentification_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_EN_DCSONengNBIdentification;
+extern asn_SEQUENCE_specifics_t asn_SPC_EN_DCSONengNBIdentification_specs_1;
+extern asn_TYPE_member_t asn_MBR_EN_DCSONengNBIdentification_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _EN_DCSONengNBIdentification_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/EN-DCTransferTypeReply.h b/src/s1ap/asn1c/asnGenFiles/EN-DCTransferTypeReply.h
new file mode 100644
index 0000000..859d406
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/EN-DCTransferTypeReply.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_EN_DCTransferTypeReply_H_
+#define	_EN_DCTransferTypeReply_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "EN-DCSONengNBIdentification.h"
+#include "EN-DCSONeNBIdentification.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* EN-DCTransferTypeReply */
+typedef struct EN_DCTransferTypeReply {
+	EN_DCSONengNBIdentification_t	 sourceengNB;
+	EN_DCSONeNBIdentification_t	 targeteNB;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} EN_DCTransferTypeReply_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_EN_DCTransferTypeReply;
+extern asn_SEQUENCE_specifics_t asn_SPC_EN_DCTransferTypeReply_specs_1;
+extern asn_TYPE_member_t asn_MBR_EN_DCTransferTypeReply_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _EN_DCTransferTypeReply_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/EN-DCTransferTypeRequest.h b/src/s1ap/asn1c/asnGenFiles/EN-DCTransferTypeRequest.h
new file mode 100644
index 0000000..12a53b0
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/EN-DCTransferTypeRequest.h
@@ -0,0 +1,56 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_EN_DCTransferTypeRequest_H_
+#define	_EN_DCTransferTypeRequest_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "EN-DCSONeNBIdentification.h"
+#include "EN-DCSONengNBIdentification.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct EN_DCSONeNBIdentification;
+struct S_TAI;
+struct FiveGSTAI;
+struct ProtocolExtensionContainer;
+
+/* EN-DCTransferTypeRequest */
+typedef struct EN_DCTransferTypeRequest {
+	EN_DCSONeNBIdentification_t	 sourceeNB;
+	EN_DCSONengNBIdentification_t	 targetengNB;
+	struct EN_DCSONeNBIdentification	*targeteNB;	/* OPTIONAL */
+	struct S_TAI	*associatedTAI;	/* OPTIONAL */
+	struct FiveGSTAI	*broadcast5GSTAI;	/* OPTIONAL */
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} EN_DCTransferTypeRequest_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_EN_DCTransferTypeRequest;
+extern asn_SEQUENCE_specifics_t asn_SPC_EN_DCTransferTypeRequest_specs_1;
+extern asn_TYPE_member_t asn_MBR_EN_DCTransferTypeRequest_1[6];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _EN_DCTransferTypeRequest_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ENB-ID.h b/src/s1ap/asn1c/asnGenFiles/ENB-ID.h
new file mode 100644
index 0000000..d9178b9
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ENB-ID.h
@@ -0,0 +1,61 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ENB_ID_H_
+#define	_ENB_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum ENB_ID_PR {
+	ENB_ID_PR_NOTHING,	/* No components present */
+	ENB_ID_PR_macroENB_ID,
+	ENB_ID_PR_homeENB_ID,
+	/* Extensions may appear below */
+	ENB_ID_PR_short_macroENB_ID,
+	ENB_ID_PR_long_macroENB_ID
+} ENB_ID_PR;
+
+/* ENB-ID */
+typedef struct ENB_ID {
+	ENB_ID_PR present;
+	union ENB_ID_u {
+		BIT_STRING_t	 macroENB_ID;
+		BIT_STRING_t	 homeENB_ID;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+		BIT_STRING_t	 short_macroENB_ID;
+		BIT_STRING_t	 long_macroENB_ID;
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ENB_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ENB_ID;
+extern asn_CHOICE_specifics_t asn_SPC_ENB_ID_specs_1;
+extern asn_TYPE_member_t asn_MBR_ENB_ID_1[4];
+extern asn_per_constraints_t asn_PER_type_ENB_ID_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ENB_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ENB-StatusTransfer-TransparentContainer.h b/src/s1ap/asn1c/asnGenFiles/ENB-StatusTransfer-TransparentContainer.h
new file mode 100644
index 0000000..b994d1c
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ENB-StatusTransfer-TransparentContainer.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ENB_StatusTransfer_TransparentContainer_H_
+#define	_ENB_StatusTransfer_TransparentContainer_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "Bearers-SubjectToStatusTransferList.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* ENB-StatusTransfer-TransparentContainer */
+typedef struct ENB_StatusTransfer_TransparentContainer {
+	Bearers_SubjectToStatusTransferList_t	 bearers_SubjectToStatusTransferList;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ENB_StatusTransfer_TransparentContainer_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ENB_StatusTransfer_TransparentContainer;
+extern asn_SEQUENCE_specifics_t asn_SPC_ENB_StatusTransfer_TransparentContainer_specs_1;
+extern asn_TYPE_member_t asn_MBR_ENB_StatusTransfer_TransparentContainer_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ENB_StatusTransfer_TransparentContainer_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ENB-UE-S1AP-ID.h b/src/s1ap/asn1c/asnGenFiles/ENB-UE-S1AP-ID.h
new file mode 100644
index 0000000..b236b03
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ENB-UE-S1AP-ID.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ENB_UE_S1AP_ID_H_
+#define	_ENB_UE_S1AP_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ENB-UE-S1AP-ID */
+typedef long	 ENB_UE_S1AP_ID_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_ENB_UE_S1AP_ID_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_ENB_UE_S1AP_ID;
+asn_struct_free_f ENB_UE_S1AP_ID_free;
+asn_struct_print_f ENB_UE_S1AP_ID_print;
+asn_constr_check_f ENB_UE_S1AP_ID_constraint;
+ber_type_decoder_f ENB_UE_S1AP_ID_decode_ber;
+der_type_encoder_f ENB_UE_S1AP_ID_encode_der;
+xer_type_decoder_f ENB_UE_S1AP_ID_decode_xer;
+xer_type_encoder_f ENB_UE_S1AP_ID_encode_xer;
+oer_type_decoder_f ENB_UE_S1AP_ID_decode_oer;
+oer_type_encoder_f ENB_UE_S1AP_ID_encode_oer;
+per_type_decoder_f ENB_UE_S1AP_ID_decode_uper;
+per_type_encoder_f ENB_UE_S1AP_ID_encode_uper;
+per_type_decoder_f ENB_UE_S1AP_ID_decode_aper;
+per_type_encoder_f ENB_UE_S1AP_ID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ENB_UE_S1AP_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ENBCPRelocationIndication.h b/src/s1ap/asn1c/asnGenFiles/ENBCPRelocationIndication.h
new file mode 100644
index 0000000..c5517dd
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ENBCPRelocationIndication.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ENBCPRelocationIndication_H_
+#define	_ENBCPRelocationIndication_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ENBCPRelocationIndication */
+typedef struct ENBCPRelocationIndication {
+	ProtocolIE_Container_129P89_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ENBCPRelocationIndication_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ENBCPRelocationIndication;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ENBCPRelocationIndication_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ENBConfigurationTransfer.h b/src/s1ap/asn1c/asnGenFiles/ENBConfigurationTransfer.h
new file mode 100644
index 0000000..16e6f0d
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ENBConfigurationTransfer.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ENBConfigurationTransfer_H_
+#define	_ENBConfigurationTransfer_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ENBConfigurationTransfer */
+typedef struct ENBConfigurationTransfer {
+	ProtocolIE_Container_129P67_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ENBConfigurationTransfer_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ENBConfigurationTransfer;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ENBConfigurationTransfer_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ENBConfigurationUpdate.h b/src/s1ap/asn1c/asnGenFiles/ENBConfigurationUpdate.h
new file mode 100644
index 0000000..290e2e2
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ENBConfigurationUpdate.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ENBConfigurationUpdate_H_
+#define	_ENBConfigurationUpdate_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ENBConfigurationUpdate */
+typedef struct ENBConfigurationUpdate {
+	ProtocolIE_Container_129P43_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ENBConfigurationUpdate_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ENBConfigurationUpdate;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ENBConfigurationUpdate_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ENBConfigurationUpdateAcknowledge.h b/src/s1ap/asn1c/asnGenFiles/ENBConfigurationUpdateAcknowledge.h
new file mode 100644
index 0000000..a7db110
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ENBConfigurationUpdateAcknowledge.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ENBConfigurationUpdateAcknowledge_H_
+#define	_ENBConfigurationUpdateAcknowledge_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ENBConfigurationUpdateAcknowledge */
+typedef struct ENBConfigurationUpdateAcknowledge {
+	ProtocolIE_Container_129P44_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ENBConfigurationUpdateAcknowledge_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ENBConfigurationUpdateAcknowledge;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ENBConfigurationUpdateAcknowledge_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ENBConfigurationUpdateFailure.h b/src/s1ap/asn1c/asnGenFiles/ENBConfigurationUpdateFailure.h
new file mode 100644
index 0000000..4f7d2d3
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ENBConfigurationUpdateFailure.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ENBConfigurationUpdateFailure_H_
+#define	_ENBConfigurationUpdateFailure_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ENBConfigurationUpdateFailure */
+typedef struct ENBConfigurationUpdateFailure {
+	ProtocolIE_Container_129P45_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ENBConfigurationUpdateFailure_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ENBConfigurationUpdateFailure;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ENBConfigurationUpdateFailure_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ENBDirectInformationTransfer.h b/src/s1ap/asn1c/asnGenFiles/ENBDirectInformationTransfer.h
new file mode 100644
index 0000000..95139bf
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ENBDirectInformationTransfer.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ENBDirectInformationTransfer_H_
+#define	_ENBDirectInformationTransfer_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ENBDirectInformationTransfer */
+typedef struct ENBDirectInformationTransfer {
+	ProtocolIE_Container_129P65_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ENBDirectInformationTransfer_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ENBDirectInformationTransfer;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ENBDirectInformationTransfer_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ENBIndirectX2TransportLayerAddresses.h b/src/s1ap/asn1c/asnGenFiles/ENBIndirectX2TransportLayerAddresses.h
new file mode 100644
index 0000000..d7ffaa0
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ENBIndirectX2TransportLayerAddresses.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ENBIndirectX2TransportLayerAddresses_H_
+#define	_ENBIndirectX2TransportLayerAddresses_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "TransportLayerAddress.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ENBIndirectX2TransportLayerAddresses */
+typedef struct ENBIndirectX2TransportLayerAddresses {
+	A_SEQUENCE_OF(TransportLayerAddress_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ENBIndirectX2TransportLayerAddresses_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ENBIndirectX2TransportLayerAddresses;
+extern asn_SET_OF_specifics_t asn_SPC_ENBIndirectX2TransportLayerAddresses_specs_1;
+extern asn_TYPE_member_t asn_MBR_ENBIndirectX2TransportLayerAddresses_1[1];
+extern asn_per_constraints_t asn_PER_type_ENBIndirectX2TransportLayerAddresses_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ENBIndirectX2TransportLayerAddresses_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ENBStatusTransfer.h b/src/s1ap/asn1c/asnGenFiles/ENBStatusTransfer.h
new file mode 100644
index 0000000..ed952bf
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ENBStatusTransfer.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ENBStatusTransfer_H_
+#define	_ENBStatusTransfer_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ENBStatusTransfer */
+typedef struct ENBStatusTransfer {
+	ProtocolIE_Container_129P52_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ENBStatusTransfer_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ENBStatusTransfer;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ENBStatusTransfer_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ENBX2ExtTLA.h b/src/s1ap/asn1c/asnGenFiles/ENBX2ExtTLA.h
new file mode 100644
index 0000000..ddd4f28
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ENBX2ExtTLA.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ENBX2ExtTLA_H_
+#define	_ENBX2ExtTLA_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "TransportLayerAddress.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ENBX2GTPTLAs;
+struct ProtocolExtensionContainer;
+
+/* ENBX2ExtTLA */
+typedef struct ENBX2ExtTLA {
+	TransportLayerAddress_t	*iPsecTLA;	/* OPTIONAL */
+	struct ENBX2GTPTLAs	*gTPTLAa;	/* OPTIONAL */
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ENBX2ExtTLA_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ENBX2ExtTLA;
+extern asn_SEQUENCE_specifics_t asn_SPC_ENBX2ExtTLA_specs_1;
+extern asn_TYPE_member_t asn_MBR_ENBX2ExtTLA_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ENBX2ExtTLA_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ENBX2ExtTLAs.h b/src/s1ap/asn1c/asnGenFiles/ENBX2ExtTLAs.h
new file mode 100644
index 0000000..adb9e75
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ENBX2ExtTLAs.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ENBX2ExtTLAs_H_
+#define	_ENBX2ExtTLAs_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ENBX2ExtTLA;
+
+/* ENBX2ExtTLAs */
+typedef struct ENBX2ExtTLAs {
+	A_SEQUENCE_OF(struct ENBX2ExtTLA) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ENBX2ExtTLAs_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ENBX2ExtTLAs;
+extern asn_SET_OF_specifics_t asn_SPC_ENBX2ExtTLAs_specs_1;
+extern asn_TYPE_member_t asn_MBR_ENBX2ExtTLAs_1[1];
+extern asn_per_constraints_t asn_PER_type_ENBX2ExtTLAs_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ENBX2ExtTLAs_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ENBX2GTPTLAs.h b/src/s1ap/asn1c/asnGenFiles/ENBX2GTPTLAs.h
new file mode 100644
index 0000000..e99f06d
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ENBX2GTPTLAs.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ENBX2GTPTLAs_H_
+#define	_ENBX2GTPTLAs_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "TransportLayerAddress.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ENBX2GTPTLAs */
+typedef struct ENBX2GTPTLAs {
+	A_SEQUENCE_OF(TransportLayerAddress_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ENBX2GTPTLAs_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ENBX2GTPTLAs;
+extern asn_SET_OF_specifics_t asn_SPC_ENBX2GTPTLAs_specs_1;
+extern asn_TYPE_member_t asn_MBR_ENBX2GTPTLAs_1[1];
+extern asn_per_constraints_t asn_PER_type_ENBX2GTPTLAs_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ENBX2GTPTLAs_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ENBX2TLAs.h b/src/s1ap/asn1c/asnGenFiles/ENBX2TLAs.h
new file mode 100644
index 0000000..6491556
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ENBX2TLAs.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ENBX2TLAs_H_
+#define	_ENBX2TLAs_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "TransportLayerAddress.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ENBX2TLAs */
+typedef struct ENBX2TLAs {
+	A_SEQUENCE_OF(TransportLayerAddress_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ENBX2TLAs_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ENBX2TLAs;
+extern asn_SET_OF_specifics_t asn_SPC_ENBX2TLAs_specs_1;
+extern asn_TYPE_member_t asn_MBR_ENBX2TLAs_1[1];
+extern asn_per_constraints_t asn_PER_type_ENBX2TLAs_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ENBX2TLAs_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ENBname.h b/src/s1ap/asn1c/asnGenFiles/ENBname.h
new file mode 100644
index 0000000..a1a727f
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ENBname.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ENBname_H_
+#define	_ENBname_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <PrintableString.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ENBname */
+typedef PrintableString_t	 ENBname_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_ENBname_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_ENBname;
+asn_struct_free_f ENBname_free;
+asn_struct_print_f ENBname_print;
+asn_constr_check_f ENBname_constraint;
+ber_type_decoder_f ENBname_decode_ber;
+der_type_encoder_f ENBname_encode_der;
+xer_type_decoder_f ENBname_decode_xer;
+xer_type_encoder_f ENBname_encode_xer;
+oer_type_decoder_f ENBname_decode_oer;
+oer_type_encoder_f ENBname_encode_oer;
+per_type_decoder_f ENBname_decode_uper;
+per_type_encoder_f ENBname_encode_uper;
+per_type_decoder_f ENBname_decode_aper;
+per_type_encoder_f ENBname_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ENBname_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/EPLMNs.h b/src/s1ap/asn1c/asnGenFiles/EPLMNs.h
new file mode 100644
index 0000000..76b9543
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/EPLMNs.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_EPLMNs_H_
+#define	_EPLMNs_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "PLMNidentity.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* EPLMNs */
+typedef struct EPLMNs {
+	A_SEQUENCE_OF(PLMNidentity_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} EPLMNs_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_EPLMNs;
+extern asn_SET_OF_specifics_t asn_SPC_EPLMNs_specs_1;
+extern asn_TYPE_member_t asn_MBR_EPLMNs_1[1];
+extern asn_per_constraints_t asn_PER_type_EPLMNs_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _EPLMNs_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/EUTRAN-CGI.h b/src/s1ap/asn1c/asnGenFiles/EUTRAN-CGI.h
new file mode 100644
index 0000000..c06eb08
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/EUTRAN-CGI.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_EUTRAN_CGI_H_
+#define	_EUTRAN_CGI_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "PLMNidentity.h"
+#include "CellIdentity.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* EUTRAN-CGI */
+typedef struct EUTRAN_CGI {
+	PLMNidentity_t	 pLMNidentity;
+	CellIdentity_t	 cell_ID;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} EUTRAN_CGI_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_EUTRAN_CGI;
+extern asn_SEQUENCE_specifics_t asn_SPC_EUTRAN_CGI_specs_1;
+extern asn_TYPE_member_t asn_MBR_EUTRAN_CGI_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _EUTRAN_CGI_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/EUTRANRoundTripDelayEstimationInfo.h b/src/s1ap/asn1c/asnGenFiles/EUTRANRoundTripDelayEstimationInfo.h
new file mode 100644
index 0000000..0ceafb3
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/EUTRANRoundTripDelayEstimationInfo.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_EUTRANRoundTripDelayEstimationInfo_H_
+#define	_EUTRANRoundTripDelayEstimationInfo_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* EUTRANRoundTripDelayEstimationInfo */
+typedef long	 EUTRANRoundTripDelayEstimationInfo_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_EUTRANRoundTripDelayEstimationInfo_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_EUTRANRoundTripDelayEstimationInfo;
+asn_struct_free_f EUTRANRoundTripDelayEstimationInfo_free;
+asn_struct_print_f EUTRANRoundTripDelayEstimationInfo_print;
+asn_constr_check_f EUTRANRoundTripDelayEstimationInfo_constraint;
+ber_type_decoder_f EUTRANRoundTripDelayEstimationInfo_decode_ber;
+der_type_encoder_f EUTRANRoundTripDelayEstimationInfo_encode_der;
+xer_type_decoder_f EUTRANRoundTripDelayEstimationInfo_decode_xer;
+xer_type_encoder_f EUTRANRoundTripDelayEstimationInfo_encode_xer;
+oer_type_decoder_f EUTRANRoundTripDelayEstimationInfo_decode_oer;
+oer_type_encoder_f EUTRANRoundTripDelayEstimationInfo_encode_oer;
+per_type_decoder_f EUTRANRoundTripDelayEstimationInfo_decode_uper;
+per_type_encoder_f EUTRANRoundTripDelayEstimationInfo_encode_uper;
+per_type_decoder_f EUTRANRoundTripDelayEstimationInfo_decode_aper;
+per_type_encoder_f EUTRANRoundTripDelayEstimationInfo_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _EUTRANRoundTripDelayEstimationInfo_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/EXTERNAL.h b/src/s1ap/asn1c/asnGenFiles/EXTERNAL.h
new file mode 100644
index 0000000..4b073c1
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/EXTERNAL.h
@@ -0,0 +1,65 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "ASN1C-UsefulInformationObjectClasses"
+ * 	found in "/users/badhri85/share/asn1c/standard-modules/ASN1C-UsefulInformationObjectClasses.asn1"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_EXTERNAL_H_
+#define	_EXTERNAL_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OBJECT_IDENTIFIER.h>
+#include <NativeInteger.h>
+#include <ObjectDescriptor.h>
+#include <ANY.h>
+#include <OCTET_STRING.h>
+#include <BIT_STRING.h>
+#include <constr_CHOICE.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum EXTERNAL__encoding_PR {
+	EXTERNAL__encoding_PR_NOTHING,	/* No components present */
+	EXTERNAL__encoding_PR_single_ASN1_type,
+	EXTERNAL__encoding_PR_octet_aligned,
+	EXTERNAL__encoding_PR_arbitrary
+} EXTERNAL__encoding_PR;
+
+/* EXTERNAL */
+typedef struct EXTERNAL {
+	OBJECT_IDENTIFIER_t	*direct_reference;	/* OPTIONAL */
+	long	*indirect_reference;	/* OPTIONAL */
+	ObjectDescriptor_t	*data_value_descriptor;	/* OPTIONAL */
+	struct EXTERNAL__encoding {
+		EXTERNAL__encoding_PR present;
+		union EXTERNAL__encoding_u {
+			ANY_t	 single_ASN1_type;
+			OCTET_STRING_t	 octet_aligned;
+			BIT_STRING_t	 arbitrary;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} encoding;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} EXTERNAL_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_EXTERNAL;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _EXTERNAL_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/EmergencyAreaID-Broadcast-Item.h b/src/s1ap/asn1c/asnGenFiles/EmergencyAreaID-Broadcast-Item.h
new file mode 100644
index 0000000..e18b9ff
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/EmergencyAreaID-Broadcast-Item.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_EmergencyAreaID_Broadcast_Item_H_
+#define	_EmergencyAreaID_Broadcast_Item_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "EmergencyAreaID.h"
+#include "CompletedCellinEAI.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* EmergencyAreaID-Broadcast-Item */
+typedef struct EmergencyAreaID_Broadcast_Item {
+	EmergencyAreaID_t	 emergencyAreaID;
+	CompletedCellinEAI_t	 completedCellinEAI;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} EmergencyAreaID_Broadcast_Item_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_EmergencyAreaID_Broadcast_Item;
+extern asn_SEQUENCE_specifics_t asn_SPC_EmergencyAreaID_Broadcast_Item_specs_1;
+extern asn_TYPE_member_t asn_MBR_EmergencyAreaID_Broadcast_Item_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _EmergencyAreaID_Broadcast_Item_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/EmergencyAreaID-Broadcast.h b/src/s1ap/asn1c/asnGenFiles/EmergencyAreaID-Broadcast.h
new file mode 100644
index 0000000..dd672f5
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/EmergencyAreaID-Broadcast.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_EmergencyAreaID_Broadcast_H_
+#define	_EmergencyAreaID_Broadcast_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct EmergencyAreaID_Broadcast_Item;
+
+/* EmergencyAreaID-Broadcast */
+typedef struct EmergencyAreaID_Broadcast {
+	A_SEQUENCE_OF(struct EmergencyAreaID_Broadcast_Item) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} EmergencyAreaID_Broadcast_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_EmergencyAreaID_Broadcast;
+extern asn_SET_OF_specifics_t asn_SPC_EmergencyAreaID_Broadcast_specs_1;
+extern asn_TYPE_member_t asn_MBR_EmergencyAreaID_Broadcast_1[1];
+extern asn_per_constraints_t asn_PER_type_EmergencyAreaID_Broadcast_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _EmergencyAreaID_Broadcast_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/EmergencyAreaID-Cancelled-Item.h b/src/s1ap/asn1c/asnGenFiles/EmergencyAreaID-Cancelled-Item.h
new file mode 100644
index 0000000..04714ee
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/EmergencyAreaID-Cancelled-Item.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_EmergencyAreaID_Cancelled_Item_H_
+#define	_EmergencyAreaID_Cancelled_Item_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "EmergencyAreaID.h"
+#include "CancelledCellinEAI.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* EmergencyAreaID-Cancelled-Item */
+typedef struct EmergencyAreaID_Cancelled_Item {
+	EmergencyAreaID_t	 emergencyAreaID;
+	CancelledCellinEAI_t	 cancelledCellinEAI;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} EmergencyAreaID_Cancelled_Item_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_EmergencyAreaID_Cancelled_Item;
+extern asn_SEQUENCE_specifics_t asn_SPC_EmergencyAreaID_Cancelled_Item_specs_1;
+extern asn_TYPE_member_t asn_MBR_EmergencyAreaID_Cancelled_Item_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _EmergencyAreaID_Cancelled_Item_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/EmergencyAreaID-Cancelled.h b/src/s1ap/asn1c/asnGenFiles/EmergencyAreaID-Cancelled.h
new file mode 100644
index 0000000..014a105
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/EmergencyAreaID-Cancelled.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_EmergencyAreaID_Cancelled_H_
+#define	_EmergencyAreaID_Cancelled_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct EmergencyAreaID_Cancelled_Item;
+
+/* EmergencyAreaID-Cancelled */
+typedef struct EmergencyAreaID_Cancelled {
+	A_SEQUENCE_OF(struct EmergencyAreaID_Cancelled_Item) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} EmergencyAreaID_Cancelled_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_EmergencyAreaID_Cancelled;
+extern asn_SET_OF_specifics_t asn_SPC_EmergencyAreaID_Cancelled_specs_1;
+extern asn_TYPE_member_t asn_MBR_EmergencyAreaID_Cancelled_1[1];
+extern asn_per_constraints_t asn_PER_type_EmergencyAreaID_Cancelled_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _EmergencyAreaID_Cancelled_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/EmergencyAreaID.h b/src/s1ap/asn1c/asnGenFiles/EmergencyAreaID.h
new file mode 100644
index 0000000..888eefc
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/EmergencyAreaID.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_EmergencyAreaID_H_
+#define	_EmergencyAreaID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* EmergencyAreaID */
+typedef OCTET_STRING_t	 EmergencyAreaID_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_EmergencyAreaID_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_EmergencyAreaID;
+asn_struct_free_f EmergencyAreaID_free;
+asn_struct_print_f EmergencyAreaID_print;
+asn_constr_check_f EmergencyAreaID_constraint;
+ber_type_decoder_f EmergencyAreaID_decode_ber;
+der_type_encoder_f EmergencyAreaID_encode_der;
+xer_type_decoder_f EmergencyAreaID_decode_xer;
+xer_type_encoder_f EmergencyAreaID_encode_xer;
+oer_type_decoder_f EmergencyAreaID_decode_oer;
+oer_type_encoder_f EmergencyAreaID_encode_oer;
+per_type_decoder_f EmergencyAreaID_decode_uper;
+per_type_encoder_f EmergencyAreaID_encode_uper;
+per_type_decoder_f EmergencyAreaID_decode_aper;
+per_type_encoder_f EmergencyAreaID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _EmergencyAreaID_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/EmergencyAreaIDList.h b/src/s1ap/asn1c/asnGenFiles/EmergencyAreaIDList.h
new file mode 100644
index 0000000..e210cbc
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/EmergencyAreaIDList.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_EmergencyAreaIDList_H_
+#define	_EmergencyAreaIDList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "EmergencyAreaID.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* EmergencyAreaIDList */
+typedef struct EmergencyAreaIDList {
+	A_SEQUENCE_OF(EmergencyAreaID_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} EmergencyAreaIDList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_EmergencyAreaIDList;
+extern asn_SET_OF_specifics_t asn_SPC_EmergencyAreaIDList_specs_1;
+extern asn_TYPE_member_t asn_MBR_EmergencyAreaIDList_1[1];
+extern asn_per_constraints_t asn_PER_type_EmergencyAreaIDList_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _EmergencyAreaIDList_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/EmergencyAreaIDListForRestart.h b/src/s1ap/asn1c/asnGenFiles/EmergencyAreaIDListForRestart.h
new file mode 100644
index 0000000..ed2dd7f
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/EmergencyAreaIDListForRestart.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_EmergencyAreaIDListForRestart_H_
+#define	_EmergencyAreaIDListForRestart_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "EmergencyAreaID.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* EmergencyAreaIDListForRestart */
+typedef struct EmergencyAreaIDListForRestart {
+	A_SEQUENCE_OF(EmergencyAreaID_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} EmergencyAreaIDListForRestart_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_EmergencyAreaIDListForRestart;
+extern asn_SET_OF_specifics_t asn_SPC_EmergencyAreaIDListForRestart_specs_1;
+extern asn_TYPE_member_t asn_MBR_EmergencyAreaIDListForRestart_1[1];
+extern asn_per_constraints_t asn_PER_type_EmergencyAreaIDListForRestart_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _EmergencyAreaIDListForRestart_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/En-gNB-ID.h b/src/s1ap/asn1c/asnGenFiles/En-gNB-ID.h
new file mode 100644
index 0000000..9201b1b
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/En-gNB-ID.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_En_gNB_ID_H_
+#define	_En_gNB_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* En-gNB-ID */
+typedef BIT_STRING_t	 En_gNB_ID_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_En_gNB_ID_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_En_gNB_ID;
+asn_struct_free_f En_gNB_ID_free;
+asn_struct_print_f En_gNB_ID_print;
+asn_constr_check_f En_gNB_ID_constraint;
+ber_type_decoder_f En_gNB_ID_decode_ber;
+der_type_encoder_f En_gNB_ID_encode_der;
+xer_type_decoder_f En_gNB_ID_decode_xer;
+xer_type_encoder_f En_gNB_ID_encode_xer;
+oer_type_decoder_f En_gNB_ID_decode_oer;
+oer_type_encoder_f En_gNB_ID_encode_oer;
+per_type_decoder_f En_gNB_ID_decode_uper;
+per_type_encoder_f En_gNB_ID_encode_uper;
+per_type_decoder_f En_gNB_ID_decode_aper;
+per_type_encoder_f En_gNB_ID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _En_gNB_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/EncryptionAlgorithms.h b/src/s1ap/asn1c/asnGenFiles/EncryptionAlgorithms.h
new file mode 100644
index 0000000..eddcf78
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/EncryptionAlgorithms.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_EncryptionAlgorithms_H_
+#define	_EncryptionAlgorithms_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* EncryptionAlgorithms */
+typedef BIT_STRING_t	 EncryptionAlgorithms_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_EncryptionAlgorithms_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_EncryptionAlgorithms;
+asn_struct_free_f EncryptionAlgorithms_free;
+asn_struct_print_f EncryptionAlgorithms_print;
+asn_constr_check_f EncryptionAlgorithms_constraint;
+ber_type_decoder_f EncryptionAlgorithms_decode_ber;
+der_type_encoder_f EncryptionAlgorithms_encode_der;
+xer_type_decoder_f EncryptionAlgorithms_decode_xer;
+xer_type_encoder_f EncryptionAlgorithms_encode_xer;
+oer_type_decoder_f EncryptionAlgorithms_decode_oer;
+oer_type_encoder_f EncryptionAlgorithms_encode_oer;
+per_type_decoder_f EncryptionAlgorithms_decode_uper;
+per_type_encoder_f EncryptionAlgorithms_encode_uper;
+per_type_decoder_f EncryptionAlgorithms_decode_aper;
+per_type_encoder_f EncryptionAlgorithms_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _EncryptionAlgorithms_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/EndIndication.h b/src/s1ap/asn1c/asnGenFiles/EndIndication.h
new file mode 100644
index 0000000..65a320a
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/EndIndication.h
@@ -0,0 +1,56 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_EndIndication_H_
+#define	_EndIndication_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum EndIndication {
+	EndIndication_no_further_data	= 0,
+	EndIndication_further_data_exists	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_EndIndication;
+
+/* EndIndication */
+typedef long	 EndIndication_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_EndIndication_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_EndIndication;
+extern const asn_INTEGER_specifics_t asn_SPC_EndIndication_specs_1;
+asn_struct_free_f EndIndication_free;
+asn_struct_print_f EndIndication_print;
+asn_constr_check_f EndIndication_constraint;
+ber_type_decoder_f EndIndication_decode_ber;
+der_type_encoder_f EndIndication_encode_der;
+xer_type_decoder_f EndIndication_decode_xer;
+xer_type_encoder_f EndIndication_encode_xer;
+oer_type_decoder_f EndIndication_decode_oer;
+oer_type_encoder_f EndIndication_encode_oer;
+per_type_decoder_f EndIndication_decode_uper;
+per_type_encoder_f EndIndication_encode_uper;
+per_type_decoder_f EndIndication_decode_aper;
+per_type_encoder_f EndIndication_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _EndIndication_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/EnhancedCoverageRestricted.h b/src/s1ap/asn1c/asnGenFiles/EnhancedCoverageRestricted.h
new file mode 100644
index 0000000..5dbb90c
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/EnhancedCoverageRestricted.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_EnhancedCoverageRestricted_H_
+#define	_EnhancedCoverageRestricted_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum EnhancedCoverageRestricted {
+	EnhancedCoverageRestricted_restricted	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_EnhancedCoverageRestricted;
+
+/* EnhancedCoverageRestricted */
+typedef long	 EnhancedCoverageRestricted_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_EnhancedCoverageRestricted_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_EnhancedCoverageRestricted;
+extern const asn_INTEGER_specifics_t asn_SPC_EnhancedCoverageRestricted_specs_1;
+asn_struct_free_f EnhancedCoverageRestricted_free;
+asn_struct_print_f EnhancedCoverageRestricted_print;
+asn_constr_check_f EnhancedCoverageRestricted_constraint;
+ber_type_decoder_f EnhancedCoverageRestricted_decode_ber;
+der_type_encoder_f EnhancedCoverageRestricted_encode_der;
+xer_type_decoder_f EnhancedCoverageRestricted_decode_xer;
+xer_type_encoder_f EnhancedCoverageRestricted_encode_xer;
+oer_type_decoder_f EnhancedCoverageRestricted_decode_oer;
+oer_type_encoder_f EnhancedCoverageRestricted_encode_oer;
+per_type_decoder_f EnhancedCoverageRestricted_decode_uper;
+per_type_encoder_f EnhancedCoverageRestricted_encode_uper;
+per_type_decoder_f EnhancedCoverageRestricted_decode_aper;
+per_type_encoder_f EnhancedCoverageRestricted_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _EnhancedCoverageRestricted_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ErrorIndication.h b/src/s1ap/asn1c/asnGenFiles/ErrorIndication.h
new file mode 100644
index 0000000..ebdd227
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ErrorIndication.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ErrorIndication_H_
+#define	_ErrorIndication_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ErrorIndication */
+typedef struct ErrorIndication {
+	ProtocolIE_Container_129P39_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ErrorIndication_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ErrorIndication;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ErrorIndication_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/EventType.h b/src/s1ap/asn1c/asnGenFiles/EventType.h
new file mode 100644
index 0000000..9dd0c7b
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/EventType.h
@@ -0,0 +1,57 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_EventType_H_
+#define	_EventType_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum EventType {
+	EventType_direct	= 0,
+	EventType_change_of_serve_cell	= 1,
+	EventType_stop_change_of_serve_cell	= 2
+	/*
+	 * Enumeration is extensible
+	 */
+} e_EventType;
+
+/* EventType */
+typedef long	 EventType_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_EventType_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_EventType;
+extern const asn_INTEGER_specifics_t asn_SPC_EventType_specs_1;
+asn_struct_free_f EventType_free;
+asn_struct_print_f EventType_print;
+asn_constr_check_f EventType_constraint;
+ber_type_decoder_f EventType_decode_ber;
+der_type_encoder_f EventType_encode_der;
+xer_type_decoder_f EventType_decode_xer;
+xer_type_encoder_f EventType_encode_xer;
+oer_type_decoder_f EventType_decode_oer;
+oer_type_encoder_f EventType_encode_oer;
+per_type_decoder_f EventType_decode_uper;
+per_type_encoder_f EventType_encode_uper;
+per_type_decoder_f EventType_decode_aper;
+per_type_encoder_f EventType_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _EventType_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ExpectedActivityPeriod.h b/src/s1ap/asn1c/asnGenFiles/ExpectedActivityPeriod.h
new file mode 100644
index 0000000..de517cb
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ExpectedActivityPeriod.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ExpectedActivityPeriod_H_
+#define	_ExpectedActivityPeriod_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ExpectedActivityPeriod */
+typedef long	 ExpectedActivityPeriod_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_ExpectedActivityPeriod_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_ExpectedActivityPeriod;
+asn_struct_free_f ExpectedActivityPeriod_free;
+asn_struct_print_f ExpectedActivityPeriod_print;
+asn_constr_check_f ExpectedActivityPeriod_constraint;
+ber_type_decoder_f ExpectedActivityPeriod_decode_ber;
+der_type_encoder_f ExpectedActivityPeriod_encode_der;
+xer_type_decoder_f ExpectedActivityPeriod_decode_xer;
+xer_type_encoder_f ExpectedActivityPeriod_encode_xer;
+oer_type_decoder_f ExpectedActivityPeriod_decode_oer;
+oer_type_encoder_f ExpectedActivityPeriod_encode_oer;
+per_type_decoder_f ExpectedActivityPeriod_decode_uper;
+per_type_encoder_f ExpectedActivityPeriod_encode_uper;
+per_type_decoder_f ExpectedActivityPeriod_decode_aper;
+per_type_encoder_f ExpectedActivityPeriod_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ExpectedActivityPeriod_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ExpectedHOInterval.h b/src/s1ap/asn1c/asnGenFiles/ExpectedHOInterval.h
new file mode 100644
index 0000000..2ca7c18
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ExpectedHOInterval.h
@@ -0,0 +1,61 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ExpectedHOInterval_H_
+#define	_ExpectedHOInterval_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum ExpectedHOInterval {
+	ExpectedHOInterval_sec15	= 0,
+	ExpectedHOInterval_sec30	= 1,
+	ExpectedHOInterval_sec60	= 2,
+	ExpectedHOInterval_sec90	= 3,
+	ExpectedHOInterval_sec120	= 4,
+	ExpectedHOInterval_sec180	= 5,
+	ExpectedHOInterval_long_time	= 6
+	/*
+	 * Enumeration is extensible
+	 */
+} e_ExpectedHOInterval;
+
+/* ExpectedHOInterval */
+typedef long	 ExpectedHOInterval_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_ExpectedHOInterval_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_ExpectedHOInterval;
+extern const asn_INTEGER_specifics_t asn_SPC_ExpectedHOInterval_specs_1;
+asn_struct_free_f ExpectedHOInterval_free;
+asn_struct_print_f ExpectedHOInterval_print;
+asn_constr_check_f ExpectedHOInterval_constraint;
+ber_type_decoder_f ExpectedHOInterval_decode_ber;
+der_type_encoder_f ExpectedHOInterval_encode_der;
+xer_type_decoder_f ExpectedHOInterval_decode_xer;
+xer_type_encoder_f ExpectedHOInterval_encode_xer;
+oer_type_decoder_f ExpectedHOInterval_decode_oer;
+oer_type_encoder_f ExpectedHOInterval_encode_oer;
+per_type_decoder_f ExpectedHOInterval_decode_uper;
+per_type_encoder_f ExpectedHOInterval_encode_uper;
+per_type_decoder_f ExpectedHOInterval_decode_aper;
+per_type_encoder_f ExpectedHOInterval_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ExpectedHOInterval_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ExpectedIdlePeriod.h b/src/s1ap/asn1c/asnGenFiles/ExpectedIdlePeriod.h
new file mode 100644
index 0000000..6f2af75
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ExpectedIdlePeriod.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ExpectedIdlePeriod_H_
+#define	_ExpectedIdlePeriod_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ExpectedIdlePeriod */
+typedef long	 ExpectedIdlePeriod_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_ExpectedIdlePeriod_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_ExpectedIdlePeriod;
+asn_struct_free_f ExpectedIdlePeriod_free;
+asn_struct_print_f ExpectedIdlePeriod_print;
+asn_constr_check_f ExpectedIdlePeriod_constraint;
+ber_type_decoder_f ExpectedIdlePeriod_decode_ber;
+der_type_encoder_f ExpectedIdlePeriod_encode_der;
+xer_type_decoder_f ExpectedIdlePeriod_decode_xer;
+xer_type_encoder_f ExpectedIdlePeriod_encode_xer;
+oer_type_decoder_f ExpectedIdlePeriod_decode_oer;
+oer_type_encoder_f ExpectedIdlePeriod_encode_oer;
+per_type_decoder_f ExpectedIdlePeriod_decode_uper;
+per_type_encoder_f ExpectedIdlePeriod_encode_uper;
+per_type_decoder_f ExpectedIdlePeriod_decode_aper;
+per_type_encoder_f ExpectedIdlePeriod_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ExpectedIdlePeriod_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ExpectedUEActivityBehaviour.h b/src/s1ap/asn1c/asnGenFiles/ExpectedUEActivityBehaviour.h
new file mode 100644
index 0000000..6c1fadc
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ExpectedUEActivityBehaviour.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ExpectedUEActivityBehaviour_H_
+#define	_ExpectedUEActivityBehaviour_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ExpectedActivityPeriod.h"
+#include "ExpectedIdlePeriod.h"
+#include "SourceOfUEActivityBehaviourInformation.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* ExpectedUEActivityBehaviour */
+typedef struct ExpectedUEActivityBehaviour {
+	ExpectedActivityPeriod_t	*expectedActivityPeriod;	/* OPTIONAL */
+	ExpectedIdlePeriod_t	*expectedIdlePeriod;	/* OPTIONAL */
+	SourceOfUEActivityBehaviourInformation_t	*sourceofUEActivityBehaviourInformation;	/* OPTIONAL */
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ExpectedUEActivityBehaviour_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ExpectedUEActivityBehaviour;
+extern asn_SEQUENCE_specifics_t asn_SPC_ExpectedUEActivityBehaviour_specs_1;
+extern asn_TYPE_member_t asn_MBR_ExpectedUEActivityBehaviour_1[4];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ExpectedUEActivityBehaviour_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ExpectedUEBehaviour.h b/src/s1ap/asn1c/asnGenFiles/ExpectedUEBehaviour.h
new file mode 100644
index 0000000..383dad6
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ExpectedUEBehaviour.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ExpectedUEBehaviour_H_
+#define	_ExpectedUEBehaviour_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ExpectedHOInterval.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ExpectedUEActivityBehaviour;
+struct ProtocolExtensionContainer;
+
+/* ExpectedUEBehaviour */
+typedef struct ExpectedUEBehaviour {
+	struct ExpectedUEActivityBehaviour	*expectedActivity;	/* OPTIONAL */
+	ExpectedHOInterval_t	*expectedHOInterval;	/* OPTIONAL */
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ExpectedUEBehaviour_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ExpectedUEBehaviour;
+extern asn_SEQUENCE_specifics_t asn_SPC_ExpectedUEBehaviour_specs_1;
+extern asn_TYPE_member_t asn_MBR_ExpectedUEBehaviour_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ExpectedUEBehaviour_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Extended-UEIdentityIndexValue.h b/src/s1ap/asn1c/asnGenFiles/Extended-UEIdentityIndexValue.h
new file mode 100644
index 0000000..d168ac6
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Extended-UEIdentityIndexValue.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Extended_UEIdentityIndexValue_H_
+#define	_Extended_UEIdentityIndexValue_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Extended-UEIdentityIndexValue */
+typedef BIT_STRING_t	 Extended_UEIdentityIndexValue_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_Extended_UEIdentityIndexValue_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_Extended_UEIdentityIndexValue;
+asn_struct_free_f Extended_UEIdentityIndexValue_free;
+asn_struct_print_f Extended_UEIdentityIndexValue_print;
+asn_constr_check_f Extended_UEIdentityIndexValue_constraint;
+ber_type_decoder_f Extended_UEIdentityIndexValue_decode_ber;
+der_type_encoder_f Extended_UEIdentityIndexValue_encode_der;
+xer_type_decoder_f Extended_UEIdentityIndexValue_decode_xer;
+xer_type_encoder_f Extended_UEIdentityIndexValue_encode_xer;
+oer_type_decoder_f Extended_UEIdentityIndexValue_decode_oer;
+oer_type_encoder_f Extended_UEIdentityIndexValue_encode_oer;
+per_type_decoder_f Extended_UEIdentityIndexValue_decode_uper;
+per_type_encoder_f Extended_UEIdentityIndexValue_encode_uper;
+per_type_decoder_f Extended_UEIdentityIndexValue_decode_aper;
+per_type_encoder_f Extended_UEIdentityIndexValue_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Extended_UEIdentityIndexValue_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ExtendedBitRate.h b/src/s1ap/asn1c/asnGenFiles/ExtendedBitRate.h
new file mode 100644
index 0000000..b7e4629
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ExtendedBitRate.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ExtendedBitRate_H_
+#define	_ExtendedBitRate_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <INTEGER.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ExtendedBitRate */
+typedef INTEGER_t	 ExtendedBitRate_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_ExtendedBitRate_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_ExtendedBitRate;
+asn_struct_free_f ExtendedBitRate_free;
+asn_struct_print_f ExtendedBitRate_print;
+asn_constr_check_f ExtendedBitRate_constraint;
+ber_type_decoder_f ExtendedBitRate_decode_ber;
+der_type_encoder_f ExtendedBitRate_encode_der;
+xer_type_decoder_f ExtendedBitRate_decode_xer;
+xer_type_encoder_f ExtendedBitRate_encode_xer;
+oer_type_decoder_f ExtendedBitRate_decode_oer;
+oer_type_encoder_f ExtendedBitRate_encode_oer;
+per_type_decoder_f ExtendedBitRate_decode_uper;
+per_type_encoder_f ExtendedBitRate_encode_uper;
+per_type_decoder_f ExtendedBitRate_decode_aper;
+per_type_encoder_f ExtendedBitRate_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ExtendedBitRate_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ExtendedRNC-ID.h b/src/s1ap/asn1c/asnGenFiles/ExtendedRNC-ID.h
new file mode 100644
index 0000000..1963e82
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ExtendedRNC-ID.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ExtendedRNC_ID_H_
+#define	_ExtendedRNC_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ExtendedRNC-ID */
+typedef long	 ExtendedRNC_ID_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_ExtendedRNC_ID_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_ExtendedRNC_ID;
+asn_struct_free_f ExtendedRNC_ID_free;
+asn_struct_print_f ExtendedRNC_ID_print;
+asn_constr_check_f ExtendedRNC_ID_constraint;
+ber_type_decoder_f ExtendedRNC_ID_decode_ber;
+der_type_encoder_f ExtendedRNC_ID_encode_der;
+xer_type_decoder_f ExtendedRNC_ID_decode_xer;
+xer_type_encoder_f ExtendedRNC_ID_encode_xer;
+oer_type_decoder_f ExtendedRNC_ID_decode_oer;
+oer_type_encoder_f ExtendedRNC_ID_encode_oer;
+per_type_decoder_f ExtendedRNC_ID_decode_uper;
+per_type_encoder_f ExtendedRNC_ID_encode_uper;
+per_type_decoder_f ExtendedRNC_ID_decode_aper;
+per_type_encoder_f ExtendedRNC_ID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ExtendedRNC_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ExtendedRepetitionPeriod.h b/src/s1ap/asn1c/asnGenFiles/ExtendedRepetitionPeriod.h
new file mode 100644
index 0000000..c684617
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ExtendedRepetitionPeriod.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ExtendedRepetitionPeriod_H_
+#define	_ExtendedRepetitionPeriod_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ExtendedRepetitionPeriod */
+typedef long	 ExtendedRepetitionPeriod_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_ExtendedRepetitionPeriod_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_ExtendedRepetitionPeriod;
+asn_struct_free_f ExtendedRepetitionPeriod_free;
+asn_struct_print_f ExtendedRepetitionPeriod_print;
+asn_constr_check_f ExtendedRepetitionPeriod_constraint;
+ber_type_decoder_f ExtendedRepetitionPeriod_decode_ber;
+der_type_encoder_f ExtendedRepetitionPeriod_encode_der;
+xer_type_decoder_f ExtendedRepetitionPeriod_decode_xer;
+xer_type_encoder_f ExtendedRepetitionPeriod_encode_xer;
+oer_type_decoder_f ExtendedRepetitionPeriod_decode_oer;
+oer_type_encoder_f ExtendedRepetitionPeriod_encode_oer;
+per_type_decoder_f ExtendedRepetitionPeriod_decode_uper;
+per_type_encoder_f ExtendedRepetitionPeriod_encode_uper;
+per_type_decoder_f ExtendedRepetitionPeriod_decode_aper;
+per_type_encoder_f ExtendedRepetitionPeriod_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ExtendedRepetitionPeriod_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/FiveGSTAC.h b/src/s1ap/asn1c/asnGenFiles/FiveGSTAC.h
new file mode 100644
index 0000000..ca79525
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/FiveGSTAC.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_FiveGSTAC_H_
+#define	_FiveGSTAC_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* FiveGSTAC */
+typedef OCTET_STRING_t	 FiveGSTAC_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_FiveGSTAC_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_FiveGSTAC;
+asn_struct_free_f FiveGSTAC_free;
+asn_struct_print_f FiveGSTAC_print;
+asn_constr_check_f FiveGSTAC_constraint;
+ber_type_decoder_f FiveGSTAC_decode_ber;
+der_type_encoder_f FiveGSTAC_encode_der;
+xer_type_decoder_f FiveGSTAC_decode_xer;
+xer_type_encoder_f FiveGSTAC_encode_xer;
+oer_type_decoder_f FiveGSTAC_decode_oer;
+oer_type_encoder_f FiveGSTAC_encode_oer;
+per_type_decoder_f FiveGSTAC_decode_uper;
+per_type_encoder_f FiveGSTAC_encode_uper;
+per_type_decoder_f FiveGSTAC_decode_aper;
+per_type_encoder_f FiveGSTAC_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _FiveGSTAC_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/FiveGSTAI.h b/src/s1ap/asn1c/asnGenFiles/FiveGSTAI.h
new file mode 100644
index 0000000..9ba9f99
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/FiveGSTAI.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_FiveGSTAI_H_
+#define	_FiveGSTAI_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "PLMNidentity.h"
+#include "FiveGSTAC.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* FiveGSTAI */
+typedef struct FiveGSTAI {
+	PLMNidentity_t	 pLMNidentity;
+	FiveGSTAC_t	 fiveGSTAC;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} FiveGSTAI_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_FiveGSTAI;
+extern asn_SEQUENCE_specifics_t asn_SPC_FiveGSTAI_specs_1;
+extern asn_TYPE_member_t asn_MBR_FiveGSTAI_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _FiveGSTAI_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ForbiddenInterRATs.h b/src/s1ap/asn1c/asnGenFiles/ForbiddenInterRATs.h
new file mode 100644
index 0000000..71d7854
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ForbiddenInterRATs.h
@@ -0,0 +1,60 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ForbiddenInterRATs_H_
+#define	_ForbiddenInterRATs_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum ForbiddenInterRATs {
+	ForbiddenInterRATs_all	= 0,
+	ForbiddenInterRATs_geran	= 1,
+	ForbiddenInterRATs_utran	= 2,
+	ForbiddenInterRATs_cdma2000	= 3,
+	/*
+	 * Enumeration is extensible
+	 */
+	ForbiddenInterRATs_geranandutran	= 4,
+	ForbiddenInterRATs_cdma2000andutran	= 5
+} e_ForbiddenInterRATs;
+
+/* ForbiddenInterRATs */
+typedef long	 ForbiddenInterRATs_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_ForbiddenInterRATs_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_ForbiddenInterRATs;
+extern const asn_INTEGER_specifics_t asn_SPC_ForbiddenInterRATs_specs_1;
+asn_struct_free_f ForbiddenInterRATs_free;
+asn_struct_print_f ForbiddenInterRATs_print;
+asn_constr_check_f ForbiddenInterRATs_constraint;
+ber_type_decoder_f ForbiddenInterRATs_decode_ber;
+der_type_encoder_f ForbiddenInterRATs_encode_der;
+xer_type_decoder_f ForbiddenInterRATs_decode_xer;
+xer_type_encoder_f ForbiddenInterRATs_encode_xer;
+oer_type_decoder_f ForbiddenInterRATs_decode_oer;
+oer_type_encoder_f ForbiddenInterRATs_encode_oer;
+per_type_decoder_f ForbiddenInterRATs_decode_uper;
+per_type_encoder_f ForbiddenInterRATs_encode_uper;
+per_type_decoder_f ForbiddenInterRATs_decode_aper;
+per_type_encoder_f ForbiddenInterRATs_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ForbiddenInterRATs_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ForbiddenLACs.h b/src/s1ap/asn1c/asnGenFiles/ForbiddenLACs.h
new file mode 100644
index 0000000..3a93c4e
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ForbiddenLACs.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ForbiddenLACs_H_
+#define	_ForbiddenLACs_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "LAC.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ForbiddenLACs */
+typedef struct ForbiddenLACs {
+	A_SEQUENCE_OF(LAC_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ForbiddenLACs_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ForbiddenLACs;
+extern asn_SET_OF_specifics_t asn_SPC_ForbiddenLACs_specs_1;
+extern asn_TYPE_member_t asn_MBR_ForbiddenLACs_1[1];
+extern asn_per_constraints_t asn_PER_type_ForbiddenLACs_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ForbiddenLACs_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ForbiddenLAs-Item.h b/src/s1ap/asn1c/asnGenFiles/ForbiddenLAs-Item.h
new file mode 100644
index 0000000..59dc7ed
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ForbiddenLAs-Item.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ForbiddenLAs_Item_H_
+#define	_ForbiddenLAs_Item_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "PLMNidentity.h"
+#include "ForbiddenLACs.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* ForbiddenLAs-Item */
+typedef struct ForbiddenLAs_Item {
+	PLMNidentity_t	 pLMN_Identity;
+	ForbiddenLACs_t	 forbiddenLACs;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ForbiddenLAs_Item_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ForbiddenLAs_Item;
+extern asn_SEQUENCE_specifics_t asn_SPC_ForbiddenLAs_Item_specs_1;
+extern asn_TYPE_member_t asn_MBR_ForbiddenLAs_Item_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ForbiddenLAs_Item_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ForbiddenLAs.h b/src/s1ap/asn1c/asnGenFiles/ForbiddenLAs.h
new file mode 100644
index 0000000..1ebd0e6
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ForbiddenLAs.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ForbiddenLAs_H_
+#define	_ForbiddenLAs_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ForbiddenLAs_Item;
+
+/* ForbiddenLAs */
+typedef struct ForbiddenLAs {
+	A_SEQUENCE_OF(struct ForbiddenLAs_Item) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ForbiddenLAs_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ForbiddenLAs;
+extern asn_SET_OF_specifics_t asn_SPC_ForbiddenLAs_specs_1;
+extern asn_TYPE_member_t asn_MBR_ForbiddenLAs_1[1];
+extern asn_per_constraints_t asn_PER_type_ForbiddenLAs_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ForbiddenLAs_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ForbiddenTACs.h b/src/s1ap/asn1c/asnGenFiles/ForbiddenTACs.h
new file mode 100644
index 0000000..af2eec1
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ForbiddenTACs.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ForbiddenTACs_H_
+#define	_ForbiddenTACs_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "TAC.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ForbiddenTACs */
+typedef struct ForbiddenTACs {
+	A_SEQUENCE_OF(TAC_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ForbiddenTACs_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ForbiddenTACs;
+extern asn_SET_OF_specifics_t asn_SPC_ForbiddenTACs_specs_1;
+extern asn_TYPE_member_t asn_MBR_ForbiddenTACs_1[1];
+extern asn_per_constraints_t asn_PER_type_ForbiddenTACs_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ForbiddenTACs_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ForbiddenTAs-Item.h b/src/s1ap/asn1c/asnGenFiles/ForbiddenTAs-Item.h
new file mode 100644
index 0000000..e23bc88
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ForbiddenTAs-Item.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ForbiddenTAs_Item_H_
+#define	_ForbiddenTAs_Item_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "PLMNidentity.h"
+#include "ForbiddenTACs.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* ForbiddenTAs-Item */
+typedef struct ForbiddenTAs_Item {
+	PLMNidentity_t	 pLMN_Identity;
+	ForbiddenTACs_t	 forbiddenTACs;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ForbiddenTAs_Item_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ForbiddenTAs_Item;
+extern asn_SEQUENCE_specifics_t asn_SPC_ForbiddenTAs_Item_specs_1;
+extern asn_TYPE_member_t asn_MBR_ForbiddenTAs_Item_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ForbiddenTAs_Item_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ForbiddenTAs.h b/src/s1ap/asn1c/asnGenFiles/ForbiddenTAs.h
new file mode 100644
index 0000000..5a3f227
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ForbiddenTAs.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ForbiddenTAs_H_
+#define	_ForbiddenTAs_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ForbiddenTAs_Item;
+
+/* ForbiddenTAs */
+typedef struct ForbiddenTAs {
+	A_SEQUENCE_OF(struct ForbiddenTAs_Item) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ForbiddenTAs_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ForbiddenTAs;
+extern asn_SET_OF_specifics_t asn_SPC_ForbiddenTAs_specs_1;
+extern asn_TYPE_member_t asn_MBR_ForbiddenTAs_1[1];
+extern asn_per_constraints_t asn_PER_type_ForbiddenTAs_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ForbiddenTAs_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/GBR-QosInformation.h b/src/s1ap/asn1c/asnGenFiles/GBR-QosInformation.h
new file mode 100644
index 0000000..5ba95a3
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/GBR-QosInformation.h
@@ -0,0 +1,51 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_GBR_QosInformation_H_
+#define	_GBR_QosInformation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "BitRate.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* GBR-QosInformation */
+typedef struct GBR_QosInformation {
+	BitRate_t	 e_RAB_MaximumBitrateDL;
+	BitRate_t	 e_RAB_MaximumBitrateUL;
+	BitRate_t	 e_RAB_GuaranteedBitrateDL;
+	BitRate_t	 e_RAB_GuaranteedBitrateUL;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} GBR_QosInformation_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_GBR_QosInformation;
+extern asn_SEQUENCE_specifics_t asn_SPC_GBR_QosInformation_specs_1;
+extern asn_TYPE_member_t asn_MBR_GBR_QosInformation_1[5];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _GBR_QosInformation_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/GERAN-Cell-ID.h b/src/s1ap/asn1c/asnGenFiles/GERAN-Cell-ID.h
new file mode 100644
index 0000000..376ba70
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/GERAN-Cell-ID.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_GERAN_Cell_ID_H_
+#define	_GERAN_Cell_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "LAI.h"
+#include "RAC.h"
+#include "CI.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* GERAN-Cell-ID */
+typedef struct GERAN_Cell_ID {
+	LAI_t	 lAI;
+	RAC_t	 rAC;
+	CI_t	 cI;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} GERAN_Cell_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_GERAN_Cell_ID;
+extern asn_SEQUENCE_specifics_t asn_SPC_GERAN_Cell_ID_specs_1;
+extern asn_TYPE_member_t asn_MBR_GERAN_Cell_ID_1[4];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _GERAN_Cell_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/GNB-ID.h b/src/s1ap/asn1c/asnGenFiles/GNB-ID.h
new file mode 100644
index 0000000..dd7f3eb
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/GNB-ID.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_GNB_ID_H_
+#define	_GNB_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* GNB-ID */
+typedef BIT_STRING_t	 GNB_ID_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_GNB_ID_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_GNB_ID;
+asn_struct_free_f GNB_ID_free;
+asn_struct_print_f GNB_ID_print;
+asn_constr_check_f GNB_ID_constraint;
+ber_type_decoder_f GNB_ID_decode_ber;
+der_type_encoder_f GNB_ID_encode_der;
+xer_type_decoder_f GNB_ID_decode_xer;
+xer_type_encoder_f GNB_ID_encode_xer;
+oer_type_decoder_f GNB_ID_decode_oer;
+oer_type_encoder_f GNB_ID_encode_oer;
+per_type_decoder_f GNB_ID_decode_uper;
+per_type_encoder_f GNB_ID_encode_uper;
+per_type_decoder_f GNB_ID_decode_aper;
+per_type_encoder_f GNB_ID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _GNB_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/GNB-Identity.h b/src/s1ap/asn1c/asnGenFiles/GNB-Identity.h
new file mode 100644
index 0000000..8c7d05d
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/GNB-Identity.h
@@ -0,0 +1,56 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_GNB_Identity_H_
+#define	_GNB_Identity_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "GNB-ID.h"
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum GNB_Identity_PR {
+	GNB_Identity_PR_NOTHING,	/* No components present */
+	GNB_Identity_PR_gNB_ID
+	/* Extensions may appear below */
+	
+} GNB_Identity_PR;
+
+/* GNB-Identity */
+typedef struct GNB_Identity {
+	GNB_Identity_PR present;
+	union GNB_Identity_u {
+		GNB_ID_t	 gNB_ID;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} GNB_Identity_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_GNB_Identity;
+extern asn_CHOICE_specifics_t asn_SPC_GNB_Identity_specs_1;
+extern asn_TYPE_member_t asn_MBR_GNB_Identity_1[1];
+extern asn_per_constraints_t asn_PER_type_GNB_Identity_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _GNB_Identity_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/GNB.h b/src/s1ap/asn1c/asnGenFiles/GNB.h
new file mode 100644
index 0000000..8250e06
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/GNB.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_GNB_H_
+#define	_GNB_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "Global-GNB-ID.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* GNB */
+typedef struct GNB {
+	Global_GNB_ID_t	 global_gNB_ID;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} GNB_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_GNB;
+extern asn_SEQUENCE_specifics_t asn_SPC_GNB_specs_1;
+extern asn_TYPE_member_t asn_MBR_GNB_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _GNB_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/GTP-TEID.h b/src/s1ap/asn1c/asnGenFiles/GTP-TEID.h
new file mode 100644
index 0000000..df5c619
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/GTP-TEID.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_GTP_TEID_H_
+#define	_GTP_TEID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* GTP-TEID */
+typedef OCTET_STRING_t	 GTP_TEID_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_GTP_TEID_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_GTP_TEID;
+asn_struct_free_f GTP_TEID_free;
+asn_struct_print_f GTP_TEID_print;
+asn_constr_check_f GTP_TEID_constraint;
+ber_type_decoder_f GTP_TEID_decode_ber;
+der_type_encoder_f GTP_TEID_encode_der;
+xer_type_decoder_f GTP_TEID_decode_xer;
+xer_type_encoder_f GTP_TEID_encode_xer;
+oer_type_decoder_f GTP_TEID_decode_oer;
+oer_type_encoder_f GTP_TEID_encode_oer;
+per_type_decoder_f GTP_TEID_decode_uper;
+per_type_encoder_f GTP_TEID_encode_uper;
+per_type_decoder_f GTP_TEID_decode_aper;
+per_type_encoder_f GTP_TEID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _GTP_TEID_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/GUMMEI.h b/src/s1ap/asn1c/asnGenFiles/GUMMEI.h
new file mode 100644
index 0000000..8d6e6e5
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/GUMMEI.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_GUMMEI_H_
+#define	_GUMMEI_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "PLMNidentity.h"
+#include "MME-Group-ID.h"
+#include "MME-Code.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* GUMMEI */
+typedef struct GUMMEI {
+	PLMNidentity_t	 pLMN_Identity;
+	MME_Group_ID_t	 mME_Group_ID;
+	MME_Code_t	 mME_Code;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} GUMMEI_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_GUMMEI;
+extern asn_SEQUENCE_specifics_t asn_SPC_GUMMEI_specs_1;
+extern asn_TYPE_member_t asn_MBR_GUMMEI_1[4];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _GUMMEI_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/GUMMEIList.h b/src/s1ap/asn1c/asnGenFiles/GUMMEIList.h
new file mode 100644
index 0000000..c62176d
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/GUMMEIList.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_GUMMEIList_H_
+#define	_GUMMEIList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct GUMMEI;
+
+/* GUMMEIList */
+typedef struct GUMMEIList {
+	A_SEQUENCE_OF(struct GUMMEI) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} GUMMEIList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_GUMMEIList;
+extern asn_SET_OF_specifics_t asn_SPC_GUMMEIList_specs_1;
+extern asn_TYPE_member_t asn_MBR_GUMMEIList_1[1];
+extern asn_per_constraints_t asn_PER_type_GUMMEIList_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _GUMMEIList_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/GUMMEIType.h b/src/s1ap/asn1c/asnGenFiles/GUMMEIType.h
new file mode 100644
index 0000000..801decf
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/GUMMEIType.h
@@ -0,0 +1,57 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_GUMMEIType_H_
+#define	_GUMMEIType_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum GUMMEIType {
+	GUMMEIType_native	= 0,
+	GUMMEIType_mapped	= 1,
+	/*
+	 * Enumeration is extensible
+	 */
+	GUMMEIType_mappedFrom5G	= 2
+} e_GUMMEIType;
+
+/* GUMMEIType */
+typedef long	 GUMMEIType_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_GUMMEIType_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_GUMMEIType;
+extern const asn_INTEGER_specifics_t asn_SPC_GUMMEIType_specs_1;
+asn_struct_free_f GUMMEIType_free;
+asn_struct_print_f GUMMEIType_print;
+asn_constr_check_f GUMMEIType_constraint;
+ber_type_decoder_f GUMMEIType_decode_ber;
+der_type_encoder_f GUMMEIType_encode_der;
+xer_type_decoder_f GUMMEIType_decode_xer;
+xer_type_encoder_f GUMMEIType_encode_xer;
+oer_type_decoder_f GUMMEIType_decode_oer;
+oer_type_encoder_f GUMMEIType_encode_oer;
+per_type_decoder_f GUMMEIType_decode_uper;
+per_type_encoder_f GUMMEIType_encode_uper;
+per_type_decoder_f GUMMEIType_decode_aper;
+per_type_encoder_f GUMMEIType_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _GUMMEIType_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/GWContextReleaseIndication.h b/src/s1ap/asn1c/asnGenFiles/GWContextReleaseIndication.h
new file mode 100644
index 0000000..4d81440
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/GWContextReleaseIndication.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_GWContextReleaseIndication_H_
+#define	_GWContextReleaseIndication_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum GWContextReleaseIndication {
+	GWContextReleaseIndication_true	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_GWContextReleaseIndication;
+
+/* GWContextReleaseIndication */
+typedef long	 GWContextReleaseIndication_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_GWContextReleaseIndication_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_GWContextReleaseIndication;
+extern const asn_INTEGER_specifics_t asn_SPC_GWContextReleaseIndication_specs_1;
+asn_struct_free_f GWContextReleaseIndication_free;
+asn_struct_print_f GWContextReleaseIndication_print;
+asn_constr_check_f GWContextReleaseIndication_constraint;
+ber_type_decoder_f GWContextReleaseIndication_decode_ber;
+der_type_encoder_f GWContextReleaseIndication_encode_der;
+xer_type_decoder_f GWContextReleaseIndication_decode_xer;
+xer_type_encoder_f GWContextReleaseIndication_encode_xer;
+oer_type_decoder_f GWContextReleaseIndication_decode_oer;
+oer_type_encoder_f GWContextReleaseIndication_encode_oer;
+per_type_decoder_f GWContextReleaseIndication_decode_uper;
+per_type_encoder_f GWContextReleaseIndication_encode_uper;
+per_type_decoder_f GWContextReleaseIndication_decode_aper;
+per_type_encoder_f GWContextReleaseIndication_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _GWContextReleaseIndication_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Global-ENB-ID.h b/src/s1ap/asn1c/asnGenFiles/Global-ENB-ID.h
new file mode 100644
index 0000000..3c40574
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Global-ENB-ID.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Global_ENB_ID_H_
+#define	_Global_ENB_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "PLMNidentity.h"
+#include "ENB-ID.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* Global-ENB-ID */
+typedef struct Global_ENB_ID {
+	PLMNidentity_t	 pLMNidentity;
+	ENB_ID_t	 eNB_ID;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} Global_ENB_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_Global_ENB_ID;
+extern asn_SEQUENCE_specifics_t asn_SPC_Global_ENB_ID_specs_1;
+extern asn_TYPE_member_t asn_MBR_Global_ENB_ID_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Global_ENB_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Global-GNB-ID.h b/src/s1ap/asn1c/asnGenFiles/Global-GNB-ID.h
new file mode 100644
index 0000000..c67bca8
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Global-GNB-ID.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Global_GNB_ID_H_
+#define	_Global_GNB_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "PLMNidentity.h"
+#include "GNB-Identity.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* Global-GNB-ID */
+typedef struct Global_GNB_ID {
+	PLMNidentity_t	 pLMN_Identity;
+	GNB_Identity_t	 gNB_ID;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} Global_GNB_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_Global_GNB_ID;
+extern asn_SEQUENCE_specifics_t asn_SPC_Global_GNB_ID_specs_1;
+extern asn_TYPE_member_t asn_MBR_Global_GNB_ID_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Global_GNB_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Global-RAN-NODE-ID.h b/src/s1ap/asn1c/asnGenFiles/Global-RAN-NODE-ID.h
new file mode 100644
index 0000000..d54ed34
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Global-RAN-NODE-ID.h
@@ -0,0 +1,61 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Global_RAN_NODE_ID_H_
+#define	_Global_RAN_NODE_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum Global_RAN_NODE_ID_PR {
+	Global_RAN_NODE_ID_PR_NOTHING,	/* No components present */
+	Global_RAN_NODE_ID_PR_gNB,
+	Global_RAN_NODE_ID_PR_ng_eNB
+	/* Extensions may appear below */
+	
+} Global_RAN_NODE_ID_PR;
+
+/* Forward declarations */
+struct GNB;
+struct NG_eNB;
+
+/* Global-RAN-NODE-ID */
+typedef struct Global_RAN_NODE_ID {
+	Global_RAN_NODE_ID_PR present;
+	union Global_RAN_NODE_ID_u {
+		struct GNB	*gNB;
+		struct NG_eNB	*ng_eNB;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} Global_RAN_NODE_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_Global_RAN_NODE_ID;
+extern asn_CHOICE_specifics_t asn_SPC_Global_RAN_NODE_ID_specs_1;
+extern asn_TYPE_member_t asn_MBR_Global_RAN_NODE_ID_1[2];
+extern asn_per_constraints_t asn_PER_type_Global_RAN_NODE_ID_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Global_RAN_NODE_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Global-en-gNB-ID.h b/src/s1ap/asn1c/asnGenFiles/Global-en-gNB-ID.h
new file mode 100644
index 0000000..860bb38
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Global-en-gNB-ID.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Global_en_gNB_ID_H_
+#define	_Global_en_gNB_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "PLMNidentity.h"
+#include "En-gNB-ID.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* Global-en-gNB-ID */
+typedef struct Global_en_gNB_ID {
+	PLMNidentity_t	 pLMNidentity;
+	En_gNB_ID_t	 en_gNB_ID;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} Global_en_gNB_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_Global_en_gNB_ID;
+extern asn_SEQUENCE_specifics_t asn_SPC_Global_en_gNB_ID_specs_1;
+extern asn_TYPE_member_t asn_MBR_Global_en_gNB_ID_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Global_en_gNB_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/GraphicString.h b/src/s1ap/asn1c/asnGenFiles/GraphicString.h
new file mode 100644
index 0000000..19cac68
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/GraphicString.h
@@ -0,0 +1,36 @@
+/*-
+ * Copyright (c) 2003-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+#ifndef	_GraphicString_H_
+#define	_GraphicString_H_
+
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef OCTET_STRING_t GraphicString_t;	/* Implemented via OCTET STRING */
+
+extern asn_TYPE_descriptor_t asn_DEF_GraphicString;
+extern asn_TYPE_operation_t asn_OP_GraphicString;
+
+#define GraphicString_free          OCTET_STRING_free
+#define GraphicString_print         OCTET_STRING_print
+#define GraphicString_compare       OCTET_STRING_compare
+#define GraphicString_constraint    asn_generic_unknown_constraint
+#define GraphicString_decode_ber    OCTET_STRING_decode_ber
+#define GraphicString_encode_der    OCTET_STRING_encode_der
+#define GraphicString_decode_xer    OCTET_STRING_decode_xer_hex
+#define GraphicString_encode_xer    OCTET_STRING_encode_xer
+#define GraphicString_decode_uper   OCTET_STRING_decode_uper
+#define GraphicString_encode_uper   OCTET_STRING_encode_uper
+#define GraphicString_decode_aper   OCTET_STRING_decode_aper
+#define GraphicString_encode_aper   OCTET_STRING_encode_aper
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _GraphicString_H_ */
diff --git a/src/s1ap/asn1c/asnGenFiles/HFN.h b/src/s1ap/asn1c/asnGenFiles/HFN.h
new file mode 100644
index 0000000..ec20ce7
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/HFN.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_HFN_H_
+#define	_HFN_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* HFN */
+typedef long	 HFN_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_HFN_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_HFN;
+asn_struct_free_f HFN_free;
+asn_struct_print_f HFN_print;
+asn_constr_check_f HFN_constraint;
+ber_type_decoder_f HFN_decode_ber;
+der_type_encoder_f HFN_encode_der;
+xer_type_decoder_f HFN_decode_xer;
+xer_type_encoder_f HFN_encode_xer;
+oer_type_decoder_f HFN_decode_oer;
+oer_type_encoder_f HFN_encode_oer;
+per_type_decoder_f HFN_decode_uper;
+per_type_encoder_f HFN_encode_uper;
+per_type_decoder_f HFN_decode_aper;
+per_type_encoder_f HFN_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _HFN_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/HFNModified.h b/src/s1ap/asn1c/asnGenFiles/HFNModified.h
new file mode 100644
index 0000000..4f4b13c
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/HFNModified.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_HFNModified_H_
+#define	_HFNModified_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* HFNModified */
+typedef long	 HFNModified_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_HFNModified_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_HFNModified;
+asn_struct_free_f HFNModified_free;
+asn_struct_print_f HFNModified_print;
+asn_constr_check_f HFNModified_constraint;
+ber_type_decoder_f HFNModified_decode_ber;
+der_type_encoder_f HFNModified_encode_der;
+xer_type_decoder_f HFNModified_decode_xer;
+xer_type_encoder_f HFNModified_encode_xer;
+oer_type_decoder_f HFNModified_decode_oer;
+oer_type_encoder_f HFNModified_encode_oer;
+per_type_decoder_f HFNModified_decode_uper;
+per_type_encoder_f HFNModified_encode_uper;
+per_type_decoder_f HFNModified_decode_aper;
+per_type_encoder_f HFNModified_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _HFNModified_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/HFNforPDCP-SNlength18.h b/src/s1ap/asn1c/asnGenFiles/HFNforPDCP-SNlength18.h
new file mode 100644
index 0000000..79cc2c4
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/HFNforPDCP-SNlength18.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_HFNforPDCP_SNlength18_H_
+#define	_HFNforPDCP_SNlength18_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* HFNforPDCP-SNlength18 */
+typedef long	 HFNforPDCP_SNlength18_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_HFNforPDCP_SNlength18_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_HFNforPDCP_SNlength18;
+asn_struct_free_f HFNforPDCP_SNlength18_free;
+asn_struct_print_f HFNforPDCP_SNlength18_print;
+asn_constr_check_f HFNforPDCP_SNlength18_constraint;
+ber_type_decoder_f HFNforPDCP_SNlength18_decode_ber;
+der_type_encoder_f HFNforPDCP_SNlength18_encode_der;
+xer_type_decoder_f HFNforPDCP_SNlength18_decode_xer;
+xer_type_encoder_f HFNforPDCP_SNlength18_encode_xer;
+oer_type_decoder_f HFNforPDCP_SNlength18_decode_oer;
+oer_type_encoder_f HFNforPDCP_SNlength18_encode_oer;
+per_type_decoder_f HFNforPDCP_SNlength18_decode_uper;
+per_type_encoder_f HFNforPDCP_SNlength18_encode_uper;
+per_type_decoder_f HFNforPDCP_SNlength18_decode_aper;
+per_type_encoder_f HFNforPDCP_SNlength18_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _HFNforPDCP_SNlength18_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/HandoverCancel.h b/src/s1ap/asn1c/asnGenFiles/HandoverCancel.h
new file mode 100644
index 0000000..08928fc
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/HandoverCancel.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_HandoverCancel_H_
+#define	_HandoverCancel_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* HandoverCancel */
+typedef struct HandoverCancel {
+	ProtocolIE_Container_129P10_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} HandoverCancel_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_HandoverCancel;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _HandoverCancel_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/HandoverCancelAcknowledge.h b/src/s1ap/asn1c/asnGenFiles/HandoverCancelAcknowledge.h
new file mode 100644
index 0000000..ecc04b4
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/HandoverCancelAcknowledge.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_HandoverCancelAcknowledge_H_
+#define	_HandoverCancelAcknowledge_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* HandoverCancelAcknowledge */
+typedef struct HandoverCancelAcknowledge {
+	ProtocolIE_Container_129P11_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} HandoverCancelAcknowledge_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_HandoverCancelAcknowledge;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _HandoverCancelAcknowledge_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/HandoverCommand.h b/src/s1ap/asn1c/asnGenFiles/HandoverCommand.h
new file mode 100644
index 0000000..95ecff7
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/HandoverCommand.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_HandoverCommand_H_
+#define	_HandoverCommand_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* HandoverCommand */
+typedef struct HandoverCommand {
+	ProtocolIE_Container_129P1_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} HandoverCommand_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_HandoverCommand;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _HandoverCommand_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/HandoverFailure.h b/src/s1ap/asn1c/asnGenFiles/HandoverFailure.h
new file mode 100644
index 0000000..7b53d8b
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/HandoverFailure.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_HandoverFailure_H_
+#define	_HandoverFailure_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* HandoverFailure */
+typedef struct HandoverFailure {
+	ProtocolIE_Container_129P5_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} HandoverFailure_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_HandoverFailure;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _HandoverFailure_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/HandoverFlag.h b/src/s1ap/asn1c/asnGenFiles/HandoverFlag.h
new file mode 100644
index 0000000..17fd34e
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/HandoverFlag.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_HandoverFlag_H_
+#define	_HandoverFlag_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum HandoverFlag {
+	HandoverFlag_handoverPreparation	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_HandoverFlag;
+
+/* HandoverFlag */
+typedef long	 HandoverFlag_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_HandoverFlag_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_HandoverFlag;
+extern const asn_INTEGER_specifics_t asn_SPC_HandoverFlag_specs_1;
+asn_struct_free_f HandoverFlag_free;
+asn_struct_print_f HandoverFlag_print;
+asn_constr_check_f HandoverFlag_constraint;
+ber_type_decoder_f HandoverFlag_decode_ber;
+der_type_encoder_f HandoverFlag_encode_der;
+xer_type_decoder_f HandoverFlag_decode_xer;
+xer_type_encoder_f HandoverFlag_encode_xer;
+oer_type_decoder_f HandoverFlag_decode_oer;
+oer_type_encoder_f HandoverFlag_encode_oer;
+per_type_decoder_f HandoverFlag_decode_uper;
+per_type_encoder_f HandoverFlag_encode_uper;
+per_type_decoder_f HandoverFlag_decode_aper;
+per_type_encoder_f HandoverFlag_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _HandoverFlag_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/HandoverNotify.h b/src/s1ap/asn1c/asnGenFiles/HandoverNotify.h
new file mode 100644
index 0000000..65655c2
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/HandoverNotify.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_HandoverNotify_H_
+#define	_HandoverNotify_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* HandoverNotify */
+typedef struct HandoverNotify {
+	ProtocolIE_Container_129P6_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} HandoverNotify_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_HandoverNotify;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _HandoverNotify_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/HandoverPreparationFailure.h b/src/s1ap/asn1c/asnGenFiles/HandoverPreparationFailure.h
new file mode 100644
index 0000000..84e88ee
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/HandoverPreparationFailure.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_HandoverPreparationFailure_H_
+#define	_HandoverPreparationFailure_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* HandoverPreparationFailure */
+typedef struct HandoverPreparationFailure {
+	ProtocolIE_Container_129P2_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} HandoverPreparationFailure_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_HandoverPreparationFailure;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _HandoverPreparationFailure_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/HandoverRequest.h b/src/s1ap/asn1c/asnGenFiles/HandoverRequest.h
new file mode 100644
index 0000000..49e8338
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/HandoverRequest.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_HandoverRequest_H_
+#define	_HandoverRequest_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* HandoverRequest */
+typedef struct HandoverRequest {
+	ProtocolIE_Container_129P3_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} HandoverRequest_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_HandoverRequest;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _HandoverRequest_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/HandoverRequestAcknowledge.h b/src/s1ap/asn1c/asnGenFiles/HandoverRequestAcknowledge.h
new file mode 100644
index 0000000..cc55db8
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/HandoverRequestAcknowledge.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_HandoverRequestAcknowledge_H_
+#define	_HandoverRequestAcknowledge_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* HandoverRequestAcknowledge */
+typedef struct HandoverRequestAcknowledge {
+	ProtocolIE_Container_129P4_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} HandoverRequestAcknowledge_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_HandoverRequestAcknowledge;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _HandoverRequestAcknowledge_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/HandoverRequired.h b/src/s1ap/asn1c/asnGenFiles/HandoverRequired.h
new file mode 100644
index 0000000..eea8253
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/HandoverRequired.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_HandoverRequired_H_
+#define	_HandoverRequired_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* HandoverRequired */
+typedef struct HandoverRequired {
+	ProtocolIE_Container_129P0_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} HandoverRequired_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_HandoverRequired;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _HandoverRequired_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/HandoverRestrictionList.h b/src/s1ap/asn1c/asnGenFiles/HandoverRestrictionList.h
new file mode 100644
index 0000000..a5f2231
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/HandoverRestrictionList.h
@@ -0,0 +1,56 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_HandoverRestrictionList_H_
+#define	_HandoverRestrictionList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "PLMNidentity.h"
+#include "ForbiddenInterRATs.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct EPLMNs;
+struct ForbiddenTAs;
+struct ForbiddenLAs;
+struct ProtocolExtensionContainer;
+
+/* HandoverRestrictionList */
+typedef struct HandoverRestrictionList {
+	PLMNidentity_t	 servingPLMN;
+	struct EPLMNs	*equivalentPLMNs;	/* OPTIONAL */
+	struct ForbiddenTAs	*forbiddenTAs;	/* OPTIONAL */
+	struct ForbiddenLAs	*forbiddenLAs;	/* OPTIONAL */
+	ForbiddenInterRATs_t	*forbiddenInterRATs;	/* OPTIONAL */
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} HandoverRestrictionList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_HandoverRestrictionList;
+extern asn_SEQUENCE_specifics_t asn_SPC_HandoverRestrictionList_specs_1;
+extern asn_TYPE_member_t asn_MBR_HandoverRestrictionList_1[6];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _HandoverRestrictionList_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/HandoverType.h b/src/s1ap/asn1c/asnGenFiles/HandoverType.h
new file mode 100644
index 0000000..324c78e
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/HandoverType.h
@@ -0,0 +1,61 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_HandoverType_H_
+#define	_HandoverType_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum HandoverType {
+	HandoverType_intralte	= 0,
+	HandoverType_ltetoutran	= 1,
+	HandoverType_ltetogeran	= 2,
+	HandoverType_utrantolte	= 3,
+	HandoverType_gerantolte	= 4,
+	/*
+	 * Enumeration is extensible
+	 */
+	HandoverType_eps_to_5gs	= 5,
+	HandoverType_fivegs_to_eps	= 6
+} e_HandoverType;
+
+/* HandoverType */
+typedef long	 HandoverType_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_HandoverType_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_HandoverType;
+extern const asn_INTEGER_specifics_t asn_SPC_HandoverType_specs_1;
+asn_struct_free_f HandoverType_free;
+asn_struct_print_f HandoverType_print;
+asn_constr_check_f HandoverType_constraint;
+ber_type_decoder_f HandoverType_decode_ber;
+der_type_encoder_f HandoverType_encode_der;
+xer_type_decoder_f HandoverType_decode_xer;
+xer_type_encoder_f HandoverType_encode_xer;
+oer_type_decoder_f HandoverType_decode_oer;
+oer_type_encoder_f HandoverType_encode_oer;
+per_type_decoder_f HandoverType_decode_uper;
+per_type_encoder_f HandoverType_encode_uper;
+per_type_decoder_f HandoverType_decode_aper;
+per_type_encoder_f HandoverType_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _HandoverType_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/IMSI.h b/src/s1ap/asn1c/asnGenFiles/IMSI.h
new file mode 100644
index 0000000..3ef1f23
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/IMSI.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_IMSI_H_
+#define	_IMSI_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* IMSI */
+typedef OCTET_STRING_t	 IMSI_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_IMSI_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_IMSI;
+asn_struct_free_f IMSI_free;
+asn_struct_print_f IMSI_print;
+asn_constr_check_f IMSI_constraint;
+ber_type_decoder_f IMSI_decode_ber;
+der_type_encoder_f IMSI_encode_der;
+xer_type_decoder_f IMSI_decode_xer;
+xer_type_encoder_f IMSI_encode_xer;
+oer_type_decoder_f IMSI_decode_oer;
+oer_type_encoder_f IMSI_encode_oer;
+per_type_decoder_f IMSI_decode_uper;
+per_type_encoder_f IMSI_encode_uper;
+per_type_decoder_f IMSI_decode_aper;
+per_type_encoder_f IMSI_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _IMSI_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/IMSvoiceEPSfallbackfrom5G.h b/src/s1ap/asn1c/asnGenFiles/IMSvoiceEPSfallbackfrom5G.h
new file mode 100644
index 0000000..597f3ec
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/IMSvoiceEPSfallbackfrom5G.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_IMSvoiceEPSfallbackfrom5G_H_
+#define	_IMSvoiceEPSfallbackfrom5G_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum IMSvoiceEPSfallbackfrom5G {
+	IMSvoiceEPSfallbackfrom5G_true	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_IMSvoiceEPSfallbackfrom5G;
+
+/* IMSvoiceEPSfallbackfrom5G */
+typedef long	 IMSvoiceEPSfallbackfrom5G_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_IMSvoiceEPSfallbackfrom5G_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_IMSvoiceEPSfallbackfrom5G;
+extern const asn_INTEGER_specifics_t asn_SPC_IMSvoiceEPSfallbackfrom5G_specs_1;
+asn_struct_free_f IMSvoiceEPSfallbackfrom5G_free;
+asn_struct_print_f IMSvoiceEPSfallbackfrom5G_print;
+asn_constr_check_f IMSvoiceEPSfallbackfrom5G_constraint;
+ber_type_decoder_f IMSvoiceEPSfallbackfrom5G_decode_ber;
+der_type_encoder_f IMSvoiceEPSfallbackfrom5G_encode_der;
+xer_type_decoder_f IMSvoiceEPSfallbackfrom5G_decode_xer;
+xer_type_encoder_f IMSvoiceEPSfallbackfrom5G_encode_xer;
+oer_type_decoder_f IMSvoiceEPSfallbackfrom5G_decode_oer;
+oer_type_encoder_f IMSvoiceEPSfallbackfrom5G_encode_oer;
+per_type_decoder_f IMSvoiceEPSfallbackfrom5G_decode_uper;
+per_type_encoder_f IMSvoiceEPSfallbackfrom5G_encode_uper;
+per_type_decoder_f IMSvoiceEPSfallbackfrom5G_decode_aper;
+per_type_encoder_f IMSvoiceEPSfallbackfrom5G_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _IMSvoiceEPSfallbackfrom5G_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/INTEGER.h b/src/s1ap/asn1c/asnGenFiles/INTEGER.h
new file mode 100644
index 0000000..f776c07
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/INTEGER.h
@@ -0,0 +1,108 @@
+/*-
+ * Copyright (c) 2003-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+#ifndef	_INTEGER_H_
+#define	_INTEGER_H_
+
+#include <asn_application.h>
+#include <asn_codecs_prim.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef ASN__PRIMITIVE_TYPE_t INTEGER_t;
+
+extern asn_TYPE_descriptor_t asn_DEF_INTEGER;
+extern asn_TYPE_operation_t asn_OP_INTEGER;
+
+/* Map with <tag> to integer value association */
+typedef struct asn_INTEGER_enum_map_s {
+	long		 nat_value;	/* associated native integer value */
+	size_t		 enum_len;	/* strlen("tag") */
+	const char	*enum_name;	/* "tag" */
+} asn_INTEGER_enum_map_t;
+
+/* This type describes an enumeration for INTEGER and ENUMERATED types */
+typedef struct asn_INTEGER_specifics_s {
+	const asn_INTEGER_enum_map_t *value2enum;	/* N -> "tag"; sorted by N */
+	const unsigned int *enum2value;		/* "tag" => N; sorted by tag */
+	int map_count;				/* Elements in either map */
+	int extension;				/* This map is extensible */
+	int strict_enumeration;			/* Enumeration set is fixed */
+	int field_width;			/* Size of native integer */
+	int field_unsigned;			/* Signed=0, unsigned=1 */
+} asn_INTEGER_specifics_t;
+
+#define INTEGER_free    ASN__PRIMITIVE_TYPE_free
+#define INTEGER_decode_ber	ber_decode_primitive
+#define INTEGER_constraint	asn_generic_no_constraint
+asn_struct_print_f INTEGER_print;
+asn_struct_compare_f INTEGER_compare;
+der_type_encoder_f INTEGER_encode_der;
+xer_type_decoder_f INTEGER_decode_xer;
+xer_type_encoder_f INTEGER_encode_xer;
+oer_type_decoder_f INTEGER_decode_oer;
+oer_type_encoder_f INTEGER_encode_oer;
+per_type_decoder_f INTEGER_decode_uper;
+per_type_encoder_f INTEGER_encode_uper;
+per_type_decoder_f INTEGER_decode_aper;
+per_type_encoder_f INTEGER_encode_aper;
+asn_random_fill_f  INTEGER_random_fill;
+
+/***********************************
+ * Some handy conversion routines. *
+ ***********************************/
+
+/*
+ * Natiwe size-independent conversion of native integers to/from INTEGER.
+ * (l_size) is in bytes.
+ * Returns 0 if it was possible to convert, -1 otherwise.
+ * -1/EINVAL: Mandatory argument missing
+ * -1/ERANGE: Value encoded is out of range for long representation
+ * -1/ENOMEM: Memory allocation failed (in asn_*2INTEGER()).
+ */
+int asn_INTEGER2imax(const INTEGER_t *i, intmax_t *l);
+int asn_INTEGER2umax(const INTEGER_t *i, uintmax_t *l);
+int asn_imax2INTEGER(INTEGER_t *i, intmax_t l);
+int asn_umax2INTEGER(INTEGER_t *i, uintmax_t l);
+
+/*
+ * Size-specific conversion helpers.
+ */
+int asn_INTEGER2long(const INTEGER_t *i, long *l);
+int asn_INTEGER2ulong(const INTEGER_t *i, unsigned long *l);
+int asn_long2INTEGER(INTEGER_t *i, long l);
+int asn_ulong2INTEGER(INTEGER_t *i, unsigned long l);
+int asn_int642INTEGER(INTEGER_t *i, int64_t l);
+int asn_uint642INTEGER(INTEGER_t *i, uint64_t l);
+
+/* A version of strtol/strtoimax(3) with nicer error reporting. */
+enum asn_strtox_result_e {
+    ASN_STRTOX_ERROR_RANGE = -3,  /* Input outside of supported numeric range */
+    ASN_STRTOX_ERROR_INVAL = -2,  /* Invalid data encountered (e.g., "+-") */
+    ASN_STRTOX_EXPECT_MORE = -1,  /* More data expected (e.g. "+") */
+    ASN_STRTOX_OK          =  0,  /* Conversion succeded, number ends at (*end) */
+    ASN_STRTOX_EXTRA_DATA  =  1   /* Conversion succeded, but the string has extra stuff */
+};
+enum asn_strtox_result_e asn_strtol_lim(const char *str, const char **end,
+                                        long *l);
+enum asn_strtox_result_e asn_strtoul_lim(const char *str, const char **end,
+                                         unsigned long *l);
+enum asn_strtox_result_e asn_strtoimax_lim(const char *str, const char **end,
+                                           intmax_t *l);
+enum asn_strtox_result_e asn_strtoumax_lim(const char *str, const char **end,
+                                           uintmax_t *l);
+
+/*
+ * Convert the integer value into the corresponding enumeration map entry.
+ */
+const asn_INTEGER_enum_map_t *INTEGER_map_value2enum(
+    const asn_INTEGER_specifics_t *specs, long value);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _INTEGER_H_ */
diff --git a/src/s1ap/asn1c/asnGenFiles/ImmediateMDT.h b/src/s1ap/asn1c/asnGenFiles/ImmediateMDT.h
new file mode 100644
index 0000000..179637e
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ImmediateMDT.h
@@ -0,0 +1,54 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ImmediateMDT_H_
+#define	_ImmediateMDT_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "MeasurementsToActivate.h"
+#include "M1ReportingTrigger.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct M1ThresholdEventA2;
+struct M1PeriodicReporting;
+struct ProtocolExtensionContainer;
+
+/* ImmediateMDT */
+typedef struct ImmediateMDT {
+	MeasurementsToActivate_t	 measurementsToActivate;
+	M1ReportingTrigger_t	 m1reportingTrigger;
+	struct M1ThresholdEventA2	*m1thresholdeventA2;	/* OPTIONAL */
+	struct M1PeriodicReporting	*m1periodicReporting;	/* OPTIONAL */
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ImmediateMDT_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ImmediateMDT;
+extern asn_SEQUENCE_specifics_t asn_SPC_ImmediateMDT_specs_1;
+extern asn_TYPE_member_t asn_MBR_ImmediateMDT_1[5];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ImmediateMDT_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/InformationOnRecommendedCellsAndENBsForPaging.h b/src/s1ap/asn1c/asnGenFiles/InformationOnRecommendedCellsAndENBsForPaging.h
new file mode 100644
index 0000000..36e87e3
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/InformationOnRecommendedCellsAndENBsForPaging.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_InformationOnRecommendedCellsAndENBsForPaging_H_
+#define	_InformationOnRecommendedCellsAndENBsForPaging_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RecommendedCellsForPaging.h"
+#include "RecommendedENBsForPaging.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* InformationOnRecommendedCellsAndENBsForPaging */
+typedef struct InformationOnRecommendedCellsAndENBsForPaging {
+	RecommendedCellsForPaging_t	 recommendedCellsForPaging;
+	RecommendedENBsForPaging_t	 recommendENBsForPaging;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} InformationOnRecommendedCellsAndENBsForPaging_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_InformationOnRecommendedCellsAndENBsForPaging;
+extern asn_SEQUENCE_specifics_t asn_SPC_InformationOnRecommendedCellsAndENBsForPaging_specs_1;
+extern asn_TYPE_member_t asn_MBR_InformationOnRecommendedCellsAndENBsForPaging_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _InformationOnRecommendedCellsAndENBsForPaging_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/InitialContextSetupFailure.h b/src/s1ap/asn1c/asnGenFiles/InitialContextSetupFailure.h
new file mode 100644
index 0000000..a5f7ae9
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/InitialContextSetupFailure.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_InitialContextSetupFailure_H_
+#define	_InitialContextSetupFailure_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* InitialContextSetupFailure */
+typedef struct InitialContextSetupFailure {
+	ProtocolIE_Container_129P21_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} InitialContextSetupFailure_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_InitialContextSetupFailure;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _InitialContextSetupFailure_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/InitialContextSetupRequest.h b/src/s1ap/asn1c/asnGenFiles/InitialContextSetupRequest.h
new file mode 100644
index 0000000..26707c3
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/InitialContextSetupRequest.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_InitialContextSetupRequest_H_
+#define	_InitialContextSetupRequest_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* InitialContextSetupRequest */
+typedef struct InitialContextSetupRequest {
+	ProtocolIE_Container_129P19_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} InitialContextSetupRequest_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_InitialContextSetupRequest;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _InitialContextSetupRequest_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/InitialContextSetupResponse.h b/src/s1ap/asn1c/asnGenFiles/InitialContextSetupResponse.h
new file mode 100644
index 0000000..d5b60da
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/InitialContextSetupResponse.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_InitialContextSetupResponse_H_
+#define	_InitialContextSetupResponse_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* InitialContextSetupResponse */
+typedef struct InitialContextSetupResponse {
+	ProtocolIE_Container_129P20_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} InitialContextSetupResponse_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_InitialContextSetupResponse;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _InitialContextSetupResponse_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/InitialUEMessage.h b/src/s1ap/asn1c/asnGenFiles/InitialUEMessage.h
new file mode 100644
index 0000000..0b24259
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/InitialUEMessage.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_InitialUEMessage_H_
+#define	_InitialUEMessage_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* InitialUEMessage */
+typedef struct InitialUEMessage {
+	ProtocolIE_Container_129P32_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} InitialUEMessage_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_InitialUEMessage;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _InitialUEMessage_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/InitiatingMessage.h b/src/s1ap/asn1c/asnGenFiles/InitiatingMessage.h
new file mode 100644
index 0000000..23c7821
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/InitiatingMessage.h
@@ -0,0 +1,278 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Descriptions"
+ * 	found in "./asn1c/S1AP-PDU-Descriptions.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_InitiatingMessage_H_
+#define	_InitiatingMessage_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProcedureCode.h"
+#include "Criticality.h"
+#include <ANY.h>
+#include <asn_ioc.h>
+#include "HandoverRequired.h"
+#include "HandoverCommand.h"
+#include "HandoverPreparationFailure.h"
+#include "HandoverRequest.h"
+#include "HandoverRequestAcknowledge.h"
+#include "HandoverFailure.h"
+#include "PathSwitchRequest.h"
+#include "PathSwitchRequestAcknowledge.h"
+#include "PathSwitchRequestFailure.h"
+#include "E-RABSetupRequest.h"
+#include "E-RABSetupResponse.h"
+#include "E-RABModifyRequest.h"
+#include "E-RABModifyResponse.h"
+#include "E-RABReleaseCommand.h"
+#include "E-RABReleaseResponse.h"
+#include "InitialContextSetupRequest.h"
+#include "InitialContextSetupResponse.h"
+#include "InitialContextSetupFailure.h"
+#include "HandoverCancel.h"
+#include "HandoverCancelAcknowledge.h"
+#include "KillRequest.h"
+#include "KillResponse.h"
+#include "Reset.h"
+#include "ResetAcknowledge.h"
+#include "S1SetupRequest.h"
+#include "S1SetupResponse.h"
+#include "S1SetupFailure.h"
+#include "UEContextModificationRequest.h"
+#include "UEContextModificationResponse.h"
+#include "UEContextModificationFailure.h"
+#include "UEContextReleaseCommand.h"
+#include "UEContextReleaseComplete.h"
+#include "ENBConfigurationUpdate.h"
+#include "ENBConfigurationUpdateAcknowledge.h"
+#include "ENBConfigurationUpdateFailure.h"
+#include "MMEConfigurationUpdate.h"
+#include "MMEConfigurationUpdateAcknowledge.h"
+#include "MMEConfigurationUpdateFailure.h"
+#include "WriteReplaceWarningRequest.h"
+#include "WriteReplaceWarningResponse.h"
+#include "UERadioCapabilityMatchRequest.h"
+#include "UERadioCapabilityMatchResponse.h"
+#include "E-RABModificationIndication.h"
+#include "E-RABModificationConfirm.h"
+#include "UEContextModificationIndication.h"
+#include "UEContextModificationConfirm.h"
+#include "UEContextSuspendRequest.h"
+#include "UEContextSuspendResponse.h"
+#include "UEContextResumeRequest.h"
+#include "UEContextResumeResponse.h"
+#include "UEContextResumeFailure.h"
+#include "HandoverNotify.h"
+#include "E-RABReleaseIndication.h"
+#include "Paging.h"
+#include "DownlinkNASTransport.h"
+#include "InitialUEMessage.h"
+#include "UplinkNASTransport.h"
+#include "ErrorIndication.h"
+#include "NASNonDeliveryIndication.h"
+#include "UEContextReleaseRequest.h"
+#include "DownlinkS1cdma2000tunnelling.h"
+#include "UplinkS1cdma2000tunnelling.h"
+#include "UECapabilityInfoIndication.h"
+#include "ENBStatusTransfer.h"
+#include "MMEStatusTransfer.h"
+#include "DeactivateTrace.h"
+#include "TraceStart.h"
+#include "TraceFailureIndication.h"
+#include "CellTrafficTrace.h"
+#include "LocationReportingControl.h"
+#include "LocationReportingFailureIndication.h"
+#include "LocationReport.h"
+#include "OverloadStart.h"
+#include "OverloadStop.h"
+#include "ENBDirectInformationTransfer.h"
+#include "MMEDirectInformationTransfer.h"
+#include "ENBConfigurationTransfer.h"
+#include "MMEConfigurationTransfer.h"
+#include "PrivateMessage.h"
+#include "DownlinkUEAssociatedLPPaTransport.h"
+#include "UplinkUEAssociatedLPPaTransport.h"
+#include "DownlinkNonUEAssociatedLPPaTransport.h"
+#include "UplinkNonUEAssociatedLPPaTransport.h"
+#include "PWSRestartIndication.h"
+#include "RerouteNASRequest.h"
+#include "PWSFailureIndication.h"
+#include "ConnectionEstablishmentIndication.h"
+#include "NASDeliveryIndication.h"
+#include "RetrieveUEInformation.h"
+#include "UEInformationTransfer.h"
+#include "ENBCPRelocationIndication.h"
+#include "MMECPRelocationIndication.h"
+#include "SecondaryRATDataUsageReport.h"
+#include <OPEN_TYPE.h>
+#include <constr_CHOICE.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum InitiatingMessage__value_PR {
+	InitiatingMessage__value_PR_NOTHING,	/* No components present */
+	InitiatingMessage__value_PR_HandoverRequired,
+	InitiatingMessage__value_PR_HandoverRequest,
+	InitiatingMessage__value_PR_PathSwitchRequest,
+	InitiatingMessage__value_PR_E_RABSetupRequest,
+	InitiatingMessage__value_PR_E_RABModifyRequest,
+	InitiatingMessage__value_PR_E_RABReleaseCommand,
+	InitiatingMessage__value_PR_InitialContextSetupRequest,
+	InitiatingMessage__value_PR_HandoverCancel,
+	InitiatingMessage__value_PR_KillRequest,
+	InitiatingMessage__value_PR_Reset,
+	InitiatingMessage__value_PR_S1SetupRequest,
+	InitiatingMessage__value_PR_UEContextModificationRequest,
+	InitiatingMessage__value_PR_UEContextReleaseCommand,
+	InitiatingMessage__value_PR_ENBConfigurationUpdate,
+	InitiatingMessage__value_PR_MMEConfigurationUpdate,
+	InitiatingMessage__value_PR_WriteReplaceWarningRequest,
+	InitiatingMessage__value_PR_UERadioCapabilityMatchRequest,
+	InitiatingMessage__value_PR_E_RABModificationIndication,
+	InitiatingMessage__value_PR_UEContextModificationIndication,
+	InitiatingMessage__value_PR_UEContextSuspendRequest,
+	InitiatingMessage__value_PR_UEContextResumeRequest,
+	InitiatingMessage__value_PR_HandoverNotify,
+	InitiatingMessage__value_PR_E_RABReleaseIndication,
+	InitiatingMessage__value_PR_Paging,
+	InitiatingMessage__value_PR_DownlinkNASTransport,
+	InitiatingMessage__value_PR_InitialUEMessage,
+	InitiatingMessage__value_PR_UplinkNASTransport,
+	InitiatingMessage__value_PR_ErrorIndication,
+	InitiatingMessage__value_PR_NASNonDeliveryIndication,
+	InitiatingMessage__value_PR_UEContextReleaseRequest,
+	InitiatingMessage__value_PR_DownlinkS1cdma2000tunnelling,
+	InitiatingMessage__value_PR_UplinkS1cdma2000tunnelling,
+	InitiatingMessage__value_PR_UECapabilityInfoIndication,
+	InitiatingMessage__value_PR_ENBStatusTransfer,
+	InitiatingMessage__value_PR_MMEStatusTransfer,
+	InitiatingMessage__value_PR_DeactivateTrace,
+	InitiatingMessage__value_PR_TraceStart,
+	InitiatingMessage__value_PR_TraceFailureIndication,
+	InitiatingMessage__value_PR_CellTrafficTrace,
+	InitiatingMessage__value_PR_LocationReportingControl,
+	InitiatingMessage__value_PR_LocationReportingFailureIndication,
+	InitiatingMessage__value_PR_LocationReport,
+	InitiatingMessage__value_PR_OverloadStart,
+	InitiatingMessage__value_PR_OverloadStop,
+	InitiatingMessage__value_PR_ENBDirectInformationTransfer,
+	InitiatingMessage__value_PR_MMEDirectInformationTransfer,
+	InitiatingMessage__value_PR_ENBConfigurationTransfer,
+	InitiatingMessage__value_PR_MMEConfigurationTransfer,
+	InitiatingMessage__value_PR_PrivateMessage,
+	InitiatingMessage__value_PR_DownlinkUEAssociatedLPPaTransport,
+	InitiatingMessage__value_PR_UplinkUEAssociatedLPPaTransport,
+	InitiatingMessage__value_PR_DownlinkNonUEAssociatedLPPaTransport,
+	InitiatingMessage__value_PR_UplinkNonUEAssociatedLPPaTransport,
+	InitiatingMessage__value_PR_PWSRestartIndication,
+	InitiatingMessage__value_PR_RerouteNASRequest,
+	InitiatingMessage__value_PR_PWSFailureIndication,
+	InitiatingMessage__value_PR_ConnectionEstablishmentIndication,
+	InitiatingMessage__value_PR_NASDeliveryIndication,
+	InitiatingMessage__value_PR_RetrieveUEInformation,
+	InitiatingMessage__value_PR_UEInformationTransfer,
+	InitiatingMessage__value_PR_ENBCPRelocationIndication,
+	InitiatingMessage__value_PR_MMECPRelocationIndication,
+	InitiatingMessage__value_PR_SecondaryRATDataUsageReport
+} InitiatingMessage__value_PR;
+
+/* InitiatingMessage */
+typedef struct InitiatingMessage {
+	ProcedureCode_t	 procedureCode;
+	Criticality_t	 criticality;
+	struct InitiatingMessage__value {
+		InitiatingMessage__value_PR present;
+		union InitiatingMessage__value_u {
+			HandoverRequired_t	 HandoverRequired;
+			HandoverRequest_t	 HandoverRequest;
+			PathSwitchRequest_t	 PathSwitchRequest;
+			E_RABSetupRequest_t	 E_RABSetupRequest;
+			E_RABModifyRequest_t	 E_RABModifyRequest;
+			E_RABReleaseCommand_t	 E_RABReleaseCommand;
+			InitialContextSetupRequest_t	 InitialContextSetupRequest;
+			HandoverCancel_t	 HandoverCancel;
+			KillRequest_t	 KillRequest;
+			Reset_t	 Reset;
+			S1SetupRequest_t	 S1SetupRequest;
+			UEContextModificationRequest_t	 UEContextModificationRequest;
+			UEContextReleaseCommand_t	 UEContextReleaseCommand;
+			ENBConfigurationUpdate_t	 ENBConfigurationUpdate;
+			MMEConfigurationUpdate_t	 MMEConfigurationUpdate;
+			WriteReplaceWarningRequest_t	 WriteReplaceWarningRequest;
+			UERadioCapabilityMatchRequest_t	 UERadioCapabilityMatchRequest;
+			E_RABModificationIndication_t	 E_RABModificationIndication;
+			UEContextModificationIndication_t	 UEContextModificationIndication;
+			UEContextSuspendRequest_t	 UEContextSuspendRequest;
+			UEContextResumeRequest_t	 UEContextResumeRequest;
+			HandoverNotify_t	 HandoverNotify;
+			E_RABReleaseIndication_t	 E_RABReleaseIndication;
+			Paging_t	 Paging;
+			DownlinkNASTransport_t	 DownlinkNASTransport;
+			InitialUEMessage_t	 InitialUEMessage;
+			UplinkNASTransport_t	 UplinkNASTransport;
+			ErrorIndication_t	 ErrorIndication;
+			NASNonDeliveryIndication_t	 NASNonDeliveryIndication;
+			UEContextReleaseRequest_t	 UEContextReleaseRequest;
+			DownlinkS1cdma2000tunnelling_t	 DownlinkS1cdma2000tunnelling;
+			UplinkS1cdma2000tunnelling_t	 UplinkS1cdma2000tunnelling;
+			UECapabilityInfoIndication_t	 UECapabilityInfoIndication;
+			ENBStatusTransfer_t	 ENBStatusTransfer;
+			MMEStatusTransfer_t	 MMEStatusTransfer;
+			DeactivateTrace_t	 DeactivateTrace;
+			TraceStart_t	 TraceStart;
+			TraceFailureIndication_t	 TraceFailureIndication;
+			CellTrafficTrace_t	 CellTrafficTrace;
+			LocationReportingControl_t	 LocationReportingControl;
+			LocationReportingFailureIndication_t	 LocationReportingFailureIndication;
+			LocationReport_t	 LocationReport;
+			OverloadStart_t	 OverloadStart;
+			OverloadStop_t	 OverloadStop;
+			ENBDirectInformationTransfer_t	 ENBDirectInformationTransfer;
+			MMEDirectInformationTransfer_t	 MMEDirectInformationTransfer;
+			ENBConfigurationTransfer_t	 ENBConfigurationTransfer;
+			MMEConfigurationTransfer_t	 MMEConfigurationTransfer;
+			PrivateMessage_t	 PrivateMessage;
+			DownlinkUEAssociatedLPPaTransport_t	 DownlinkUEAssociatedLPPaTransport;
+			UplinkUEAssociatedLPPaTransport_t	 UplinkUEAssociatedLPPaTransport;
+			DownlinkNonUEAssociatedLPPaTransport_t	 DownlinkNonUEAssociatedLPPaTransport;
+			UplinkNonUEAssociatedLPPaTransport_t	 UplinkNonUEAssociatedLPPaTransport;
+			PWSRestartIndication_t	 PWSRestartIndication;
+			RerouteNASRequest_t	 RerouteNASRequest;
+			PWSFailureIndication_t	 PWSFailureIndication;
+			ConnectionEstablishmentIndication_t	 ConnectionEstablishmentIndication;
+			NASDeliveryIndication_t	 NASDeliveryIndication;
+			RetrieveUEInformation_t	 RetrieveUEInformation;
+			UEInformationTransfer_t	 UEInformationTransfer;
+			ENBCPRelocationIndication_t	 ENBCPRelocationIndication;
+			MMECPRelocationIndication_t	 MMECPRelocationIndication;
+			SecondaryRATDataUsageReport_t	 SecondaryRATDataUsageReport;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} InitiatingMessage_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_InitiatingMessage;
+extern asn_SEQUENCE_specifics_t asn_SPC_InitiatingMessage_specs_1;
+extern asn_TYPE_member_t asn_MBR_InitiatingMessage_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _InitiatingMessage_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/IntegrityProtectionAlgorithms.h b/src/s1ap/asn1c/asnGenFiles/IntegrityProtectionAlgorithms.h
new file mode 100644
index 0000000..5260538
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/IntegrityProtectionAlgorithms.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_IntegrityProtectionAlgorithms_H_
+#define	_IntegrityProtectionAlgorithms_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* IntegrityProtectionAlgorithms */
+typedef BIT_STRING_t	 IntegrityProtectionAlgorithms_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_IntegrityProtectionAlgorithms_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_IntegrityProtectionAlgorithms;
+asn_struct_free_f IntegrityProtectionAlgorithms_free;
+asn_struct_print_f IntegrityProtectionAlgorithms_print;
+asn_constr_check_f IntegrityProtectionAlgorithms_constraint;
+ber_type_decoder_f IntegrityProtectionAlgorithms_decode_ber;
+der_type_encoder_f IntegrityProtectionAlgorithms_encode_der;
+xer_type_decoder_f IntegrityProtectionAlgorithms_decode_xer;
+xer_type_encoder_f IntegrityProtectionAlgorithms_encode_xer;
+oer_type_decoder_f IntegrityProtectionAlgorithms_decode_oer;
+oer_type_encoder_f IntegrityProtectionAlgorithms_encode_oer;
+per_type_decoder_f IntegrityProtectionAlgorithms_decode_uper;
+per_type_encoder_f IntegrityProtectionAlgorithms_encode_uper;
+per_type_decoder_f IntegrityProtectionAlgorithms_decode_aper;
+per_type_encoder_f IntegrityProtectionAlgorithms_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _IntegrityProtectionAlgorithms_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/IntendedNumberOfPagingAttempts.h b/src/s1ap/asn1c/asnGenFiles/IntendedNumberOfPagingAttempts.h
new file mode 100644
index 0000000..89398c9
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/IntendedNumberOfPagingAttempts.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_IntendedNumberOfPagingAttempts_H_
+#define	_IntendedNumberOfPagingAttempts_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* IntendedNumberOfPagingAttempts */
+typedef long	 IntendedNumberOfPagingAttempts_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_IntendedNumberOfPagingAttempts_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_IntendedNumberOfPagingAttempts;
+asn_struct_free_f IntendedNumberOfPagingAttempts_free;
+asn_struct_print_f IntendedNumberOfPagingAttempts_print;
+asn_constr_check_f IntendedNumberOfPagingAttempts_constraint;
+ber_type_decoder_f IntendedNumberOfPagingAttempts_decode_ber;
+der_type_encoder_f IntendedNumberOfPagingAttempts_encode_der;
+xer_type_decoder_f IntendedNumberOfPagingAttempts_decode_xer;
+xer_type_encoder_f IntendedNumberOfPagingAttempts_encode_xer;
+oer_type_decoder_f IntendedNumberOfPagingAttempts_decode_oer;
+oer_type_encoder_f IntendedNumberOfPagingAttempts_encode_oer;
+per_type_decoder_f IntendedNumberOfPagingAttempts_decode_uper;
+per_type_encoder_f IntendedNumberOfPagingAttempts_encode_uper;
+per_type_decoder_f IntendedNumberOfPagingAttempts_decode_aper;
+per_type_encoder_f IntendedNumberOfPagingAttempts_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _IntendedNumberOfPagingAttempts_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Inter-SystemInformationTransferType.h b/src/s1ap/asn1c/asnGenFiles/Inter-SystemInformationTransferType.h
new file mode 100644
index 0000000..d797d9b
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Inter-SystemInformationTransferType.h
@@ -0,0 +1,58 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Inter_SystemInformationTransferType_H_
+#define	_Inter_SystemInformationTransferType_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum Inter_SystemInformationTransferType_PR {
+	Inter_SystemInformationTransferType_PR_NOTHING,	/* No components present */
+	Inter_SystemInformationTransferType_PR_rIMTransfer
+	/* Extensions may appear below */
+	
+} Inter_SystemInformationTransferType_PR;
+
+/* Forward declarations */
+struct RIMTransfer;
+
+/* Inter-SystemInformationTransferType */
+typedef struct Inter_SystemInformationTransferType {
+	Inter_SystemInformationTransferType_PR present;
+	union Inter_SystemInformationTransferType_u {
+		struct RIMTransfer	*rIMTransfer;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} Inter_SystemInformationTransferType_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_Inter_SystemInformationTransferType;
+extern asn_CHOICE_specifics_t asn_SPC_Inter_SystemInformationTransferType_specs_1;
+extern asn_TYPE_member_t asn_MBR_Inter_SystemInformationTransferType_1[1];
+extern asn_per_constraints_t asn_PER_type_Inter_SystemInformationTransferType_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Inter_SystemInformationTransferType_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/InterfacesToTrace.h b/src/s1ap/asn1c/asnGenFiles/InterfacesToTrace.h
new file mode 100644
index 0000000..0c609ec
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/InterfacesToTrace.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_InterfacesToTrace_H_
+#define	_InterfacesToTrace_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* InterfacesToTrace */
+typedef BIT_STRING_t	 InterfacesToTrace_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_InterfacesToTrace_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_InterfacesToTrace;
+asn_struct_free_f InterfacesToTrace_free;
+asn_struct_print_f InterfacesToTrace_print;
+asn_constr_check_f InterfacesToTrace_constraint;
+ber_type_decoder_f InterfacesToTrace_decode_ber;
+der_type_encoder_f InterfacesToTrace_encode_der;
+xer_type_decoder_f InterfacesToTrace_decode_xer;
+xer_type_encoder_f InterfacesToTrace_encode_xer;
+oer_type_decoder_f InterfacesToTrace_decode_oer;
+oer_type_encoder_f InterfacesToTrace_encode_oer;
+per_type_decoder_f InterfacesToTrace_decode_uper;
+per_type_encoder_f InterfacesToTrace_encode_uper;
+per_type_decoder_f InterfacesToTrace_decode_aper;
+per_type_encoder_f InterfacesToTrace_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _InterfacesToTrace_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/KillAllWarningMessages.h b/src/s1ap/asn1c/asnGenFiles/KillAllWarningMessages.h
new file mode 100644
index 0000000..bc085f3
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/KillAllWarningMessages.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_KillAllWarningMessages_H_
+#define	_KillAllWarningMessages_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum KillAllWarningMessages {
+	KillAllWarningMessages_true	= 0
+} e_KillAllWarningMessages;
+
+/* KillAllWarningMessages */
+typedef long	 KillAllWarningMessages_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_KillAllWarningMessages_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_KillAllWarningMessages;
+extern const asn_INTEGER_specifics_t asn_SPC_KillAllWarningMessages_specs_1;
+asn_struct_free_f KillAllWarningMessages_free;
+asn_struct_print_f KillAllWarningMessages_print;
+asn_constr_check_f KillAllWarningMessages_constraint;
+ber_type_decoder_f KillAllWarningMessages_decode_ber;
+der_type_encoder_f KillAllWarningMessages_encode_der;
+xer_type_decoder_f KillAllWarningMessages_decode_xer;
+xer_type_encoder_f KillAllWarningMessages_encode_xer;
+oer_type_decoder_f KillAllWarningMessages_decode_oer;
+oer_type_encoder_f KillAllWarningMessages_encode_oer;
+per_type_decoder_f KillAllWarningMessages_decode_uper;
+per_type_encoder_f KillAllWarningMessages_encode_uper;
+per_type_decoder_f KillAllWarningMessages_decode_aper;
+per_type_encoder_f KillAllWarningMessages_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _KillAllWarningMessages_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/KillRequest.h b/src/s1ap/asn1c/asnGenFiles/KillRequest.h
new file mode 100644
index 0000000..b71b534
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/KillRequest.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_KillRequest_H_
+#define	_KillRequest_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* KillRequest */
+typedef struct KillRequest {
+	ProtocolIE_Container_129P69_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} KillRequest_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_KillRequest;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _KillRequest_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/KillResponse.h b/src/s1ap/asn1c/asnGenFiles/KillResponse.h
new file mode 100644
index 0000000..b4a623c
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/KillResponse.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_KillResponse_H_
+#define	_KillResponse_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* KillResponse */
+typedef struct KillResponse {
+	ProtocolIE_Container_129P70_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} KillResponse_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_KillResponse;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _KillResponse_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/L3-Information.h b/src/s1ap/asn1c/asnGenFiles/L3-Information.h
new file mode 100644
index 0000000..9650afd
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/L3-Information.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_L3_Information_H_
+#define	_L3_Information_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* L3-Information */
+typedef OCTET_STRING_t	 L3_Information_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_L3_Information;
+asn_struct_free_f L3_Information_free;
+asn_struct_print_f L3_Information_print;
+asn_constr_check_f L3_Information_constraint;
+ber_type_decoder_f L3_Information_decode_ber;
+der_type_encoder_f L3_Information_encode_der;
+xer_type_decoder_f L3_Information_decode_xer;
+xer_type_encoder_f L3_Information_encode_xer;
+oer_type_decoder_f L3_Information_decode_oer;
+oer_type_encoder_f L3_Information_encode_oer;
+per_type_decoder_f L3_Information_decode_uper;
+per_type_encoder_f L3_Information_encode_uper;
+per_type_decoder_f L3_Information_decode_aper;
+per_type_encoder_f L3_Information_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _L3_Information_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/LAC.h b/src/s1ap/asn1c/asnGenFiles/LAC.h
new file mode 100644
index 0000000..32862d7
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/LAC.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_LAC_H_
+#define	_LAC_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* LAC */
+typedef OCTET_STRING_t	 LAC_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_LAC_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_LAC;
+asn_struct_free_f LAC_free;
+asn_struct_print_f LAC_print;
+asn_constr_check_f LAC_constraint;
+ber_type_decoder_f LAC_decode_ber;
+der_type_encoder_f LAC_encode_der;
+xer_type_decoder_f LAC_decode_xer;
+xer_type_encoder_f LAC_encode_xer;
+oer_type_decoder_f LAC_decode_oer;
+oer_type_encoder_f LAC_encode_oer;
+per_type_decoder_f LAC_decode_uper;
+per_type_encoder_f LAC_encode_uper;
+per_type_decoder_f LAC_decode_aper;
+per_type_encoder_f LAC_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _LAC_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/LAI.h b/src/s1ap/asn1c/asnGenFiles/LAI.h
new file mode 100644
index 0000000..632741e
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/LAI.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_LAI_H_
+#define	_LAI_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "PLMNidentity.h"
+#include "LAC.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* LAI */
+typedef struct LAI {
+	PLMNidentity_t	 pLMNidentity;
+	LAC_t	 lAC;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} LAI_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_LAI;
+extern asn_SEQUENCE_specifics_t asn_SPC_LAI_specs_1;
+extern asn_TYPE_member_t asn_MBR_LAI_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _LAI_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/LHN-ID.h b/src/s1ap/asn1c/asnGenFiles/LHN-ID.h
new file mode 100644
index 0000000..bf26f7f
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/LHN-ID.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_LHN_ID_H_
+#define	_LHN_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* LHN-ID */
+typedef OCTET_STRING_t	 LHN_ID_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_LHN_ID_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_LHN_ID;
+asn_struct_free_f LHN_ID_free;
+asn_struct_print_f LHN_ID_print;
+asn_constr_check_f LHN_ID_constraint;
+ber_type_decoder_f LHN_ID_decode_ber;
+der_type_encoder_f LHN_ID_encode_der;
+xer_type_decoder_f LHN_ID_decode_xer;
+xer_type_encoder_f LHN_ID_encode_xer;
+oer_type_decoder_f LHN_ID_decode_oer;
+oer_type_encoder_f LHN_ID_encode_oer;
+per_type_decoder_f LHN_ID_decode_uper;
+per_type_encoder_f LHN_ID_encode_uper;
+per_type_decoder_f LHN_ID_decode_aper;
+per_type_encoder_f LHN_ID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _LHN_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/LPPa-PDU.h b/src/s1ap/asn1c/asnGenFiles/LPPa-PDU.h
new file mode 100644
index 0000000..09ec4c8
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/LPPa-PDU.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_LPPa_PDU_H_
+#define	_LPPa_PDU_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* LPPa-PDU */
+typedef OCTET_STRING_t	 LPPa_PDU_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_LPPa_PDU;
+asn_struct_free_f LPPa_PDU_free;
+asn_struct_print_f LPPa_PDU_print;
+asn_constr_check_f LPPa_PDU_constraint;
+ber_type_decoder_f LPPa_PDU_decode_ber;
+der_type_encoder_f LPPa_PDU_encode_der;
+xer_type_decoder_f LPPa_PDU_decode_xer;
+xer_type_encoder_f LPPa_PDU_encode_xer;
+oer_type_decoder_f LPPa_PDU_decode_oer;
+oer_type_encoder_f LPPa_PDU_encode_oer;
+per_type_decoder_f LPPa_PDU_decode_uper;
+per_type_encoder_f LPPa_PDU_encode_uper;
+per_type_decoder_f LPPa_PDU_decode_aper;
+per_type_encoder_f LPPa_PDU_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _LPPa_PDU_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/LTE-M-Indication.h b/src/s1ap/asn1c/asnGenFiles/LTE-M-Indication.h
new file mode 100644
index 0000000..64f0bd7
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/LTE-M-Indication.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_LTE_M_Indication_H_
+#define	_LTE_M_Indication_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum LTE_M_Indication {
+	LTE_M_Indication_lte_m	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_LTE_M_Indication;
+
+/* LTE-M-Indication */
+typedef long	 LTE_M_Indication_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_LTE_M_Indication_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_LTE_M_Indication;
+extern const asn_INTEGER_specifics_t asn_SPC_LTE_M_Indication_specs_1;
+asn_struct_free_f LTE_M_Indication_free;
+asn_struct_print_f LTE_M_Indication_print;
+asn_constr_check_f LTE_M_Indication_constraint;
+ber_type_decoder_f LTE_M_Indication_decode_ber;
+der_type_encoder_f LTE_M_Indication_encode_der;
+xer_type_decoder_f LTE_M_Indication_decode_xer;
+xer_type_encoder_f LTE_M_Indication_encode_xer;
+oer_type_decoder_f LTE_M_Indication_decode_oer;
+oer_type_encoder_f LTE_M_Indication_encode_oer;
+per_type_decoder_f LTE_M_Indication_decode_uper;
+per_type_encoder_f LTE_M_Indication_encode_uper;
+per_type_decoder_f LTE_M_Indication_decode_aper;
+per_type_encoder_f LTE_M_Indication_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _LTE_M_Indication_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/LastVisitedCell-Item.h b/src/s1ap/asn1c/asnGenFiles/LastVisitedCell-Item.h
new file mode 100644
index 0000000..5d90e20
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/LastVisitedCell-Item.h
@@ -0,0 +1,66 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_LastVisitedCell_Item_H_
+#define	_LastVisitedCell_Item_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "LastVisitedUTRANCellInformation.h"
+#include "LastVisitedNGRANCellInformation.h"
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum LastVisitedCell_Item_PR {
+	LastVisitedCell_Item_PR_NOTHING,	/* No components present */
+	LastVisitedCell_Item_PR_e_UTRAN_Cell,
+	LastVisitedCell_Item_PR_uTRAN_Cell,
+	LastVisitedCell_Item_PR_gERAN_Cell,
+	/* Extensions may appear below */
+	LastVisitedCell_Item_PR_nG_RAN_Cell
+} LastVisitedCell_Item_PR;
+
+/* Forward declarations */
+struct LastVisitedEUTRANCellInformation;
+struct LastVisitedGERANCellInformation;
+
+/* LastVisitedCell-Item */
+typedef struct LastVisitedCell_Item {
+	LastVisitedCell_Item_PR present;
+	union LastVisitedCell_Item_u {
+		struct LastVisitedEUTRANCellInformation	*e_UTRAN_Cell;
+		LastVisitedUTRANCellInformation_t	 uTRAN_Cell;
+		struct LastVisitedGERANCellInformation	*gERAN_Cell;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+		LastVisitedNGRANCellInformation_t	 nG_RAN_Cell;
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} LastVisitedCell_Item_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_LastVisitedCell_Item;
+extern asn_CHOICE_specifics_t asn_SPC_LastVisitedCell_Item_specs_1;
+extern asn_TYPE_member_t asn_MBR_LastVisitedCell_Item_1[4];
+extern asn_per_constraints_t asn_PER_type_LastVisitedCell_Item_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _LastVisitedCell_Item_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/LastVisitedEUTRANCellInformation.h b/src/s1ap/asn1c/asnGenFiles/LastVisitedEUTRANCellInformation.h
new file mode 100644
index 0000000..6c6804b
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/LastVisitedEUTRANCellInformation.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_LastVisitedEUTRANCellInformation_H_
+#define	_LastVisitedEUTRANCellInformation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "EUTRAN-CGI.h"
+#include "CellType.h"
+#include "Time-UE-StayedInCell.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* LastVisitedEUTRANCellInformation */
+typedef struct LastVisitedEUTRANCellInformation {
+	EUTRAN_CGI_t	 global_Cell_ID;
+	CellType_t	 cellType;
+	Time_UE_StayedInCell_t	 time_UE_StayedInCell;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} LastVisitedEUTRANCellInformation_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_LastVisitedEUTRANCellInformation;
+extern asn_SEQUENCE_specifics_t asn_SPC_LastVisitedEUTRANCellInformation_specs_1;
+extern asn_TYPE_member_t asn_MBR_LastVisitedEUTRANCellInformation_1[4];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _LastVisitedEUTRANCellInformation_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/LastVisitedGERANCellInformation.h b/src/s1ap/asn1c/asnGenFiles/LastVisitedGERANCellInformation.h
new file mode 100644
index 0000000..c4068f1
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/LastVisitedGERANCellInformation.h
@@ -0,0 +1,56 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_LastVisitedGERANCellInformation_H_
+#define	_LastVisitedGERANCellInformation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NULL.h>
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum LastVisitedGERANCellInformation_PR {
+	LastVisitedGERANCellInformation_PR_NOTHING,	/* No components present */
+	LastVisitedGERANCellInformation_PR_undefined
+	/* Extensions may appear below */
+	
+} LastVisitedGERANCellInformation_PR;
+
+/* LastVisitedGERANCellInformation */
+typedef struct LastVisitedGERANCellInformation {
+	LastVisitedGERANCellInformation_PR present;
+	union LastVisitedGERANCellInformation_u {
+		NULL_t	 undefined;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} LastVisitedGERANCellInformation_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_LastVisitedGERANCellInformation;
+extern asn_CHOICE_specifics_t asn_SPC_LastVisitedGERANCellInformation_specs_1;
+extern asn_TYPE_member_t asn_MBR_LastVisitedGERANCellInformation_1[1];
+extern asn_per_constraints_t asn_PER_type_LastVisitedGERANCellInformation_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _LastVisitedGERANCellInformation_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/LastVisitedNGRANCellInformation.h b/src/s1ap/asn1c/asnGenFiles/LastVisitedNGRANCellInformation.h
new file mode 100644
index 0000000..be12df4
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/LastVisitedNGRANCellInformation.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_LastVisitedNGRANCellInformation_H_
+#define	_LastVisitedNGRANCellInformation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* LastVisitedNGRANCellInformation */
+typedef OCTET_STRING_t	 LastVisitedNGRANCellInformation_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_LastVisitedNGRANCellInformation;
+asn_struct_free_f LastVisitedNGRANCellInformation_free;
+asn_struct_print_f LastVisitedNGRANCellInformation_print;
+asn_constr_check_f LastVisitedNGRANCellInformation_constraint;
+ber_type_decoder_f LastVisitedNGRANCellInformation_decode_ber;
+der_type_encoder_f LastVisitedNGRANCellInformation_encode_der;
+xer_type_decoder_f LastVisitedNGRANCellInformation_decode_xer;
+xer_type_encoder_f LastVisitedNGRANCellInformation_encode_xer;
+oer_type_decoder_f LastVisitedNGRANCellInformation_decode_oer;
+oer_type_encoder_f LastVisitedNGRANCellInformation_encode_oer;
+per_type_decoder_f LastVisitedNGRANCellInformation_decode_uper;
+per_type_encoder_f LastVisitedNGRANCellInformation_encode_uper;
+per_type_decoder_f LastVisitedNGRANCellInformation_decode_aper;
+per_type_encoder_f LastVisitedNGRANCellInformation_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _LastVisitedNGRANCellInformation_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/LastVisitedUTRANCellInformation.h b/src/s1ap/asn1c/asnGenFiles/LastVisitedUTRANCellInformation.h
new file mode 100644
index 0000000..549cc3c
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/LastVisitedUTRANCellInformation.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_LastVisitedUTRANCellInformation_H_
+#define	_LastVisitedUTRANCellInformation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* LastVisitedUTRANCellInformation */
+typedef OCTET_STRING_t	 LastVisitedUTRANCellInformation_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_LastVisitedUTRANCellInformation;
+asn_struct_free_f LastVisitedUTRANCellInformation_free;
+asn_struct_print_f LastVisitedUTRANCellInformation_print;
+asn_constr_check_f LastVisitedUTRANCellInformation_constraint;
+ber_type_decoder_f LastVisitedUTRANCellInformation_decode_ber;
+der_type_encoder_f LastVisitedUTRANCellInformation_encode_der;
+xer_type_decoder_f LastVisitedUTRANCellInformation_decode_xer;
+xer_type_encoder_f LastVisitedUTRANCellInformation_encode_xer;
+oer_type_decoder_f LastVisitedUTRANCellInformation_decode_oer;
+oer_type_encoder_f LastVisitedUTRANCellInformation_encode_oer;
+per_type_decoder_f LastVisitedUTRANCellInformation_decode_uper;
+per_type_encoder_f LastVisitedUTRANCellInformation_encode_uper;
+per_type_decoder_f LastVisitedUTRANCellInformation_decode_aper;
+per_type_encoder_f LastVisitedUTRANCellInformation_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _LastVisitedUTRANCellInformation_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Links-to-log.h b/src/s1ap/asn1c/asnGenFiles/Links-to-log.h
new file mode 100644
index 0000000..ef19965
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Links-to-log.h
@@ -0,0 +1,57 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Links_to_log_H_
+#define	_Links_to_log_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum Links_to_log {
+	Links_to_log_uplink	= 0,
+	Links_to_log_downlink	= 1,
+	Links_to_log_both_uplink_and_downlink	= 2
+	/*
+	 * Enumeration is extensible
+	 */
+} e_Links_to_log;
+
+/* Links-to-log */
+typedef long	 Links_to_log_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_Links_to_log_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_Links_to_log;
+extern const asn_INTEGER_specifics_t asn_SPC_Links_to_log_specs_1;
+asn_struct_free_f Links_to_log_free;
+asn_struct_print_f Links_to_log_print;
+asn_constr_check_f Links_to_log_constraint;
+ber_type_decoder_f Links_to_log_decode_ber;
+der_type_encoder_f Links_to_log_encode_der;
+xer_type_decoder_f Links_to_log_decode_xer;
+xer_type_encoder_f Links_to_log_encode_xer;
+oer_type_decoder_f Links_to_log_decode_oer;
+oer_type_encoder_f Links_to_log_encode_oer;
+per_type_decoder_f Links_to_log_decode_uper;
+per_type_encoder_f Links_to_log_encode_uper;
+per_type_decoder_f Links_to_log_decode_aper;
+per_type_encoder_f Links_to_log_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Links_to_log_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ListeningSubframePattern.h b/src/s1ap/asn1c/asnGenFiles/ListeningSubframePattern.h
new file mode 100644
index 0000000..bde5142
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ListeningSubframePattern.h
@@ -0,0 +1,62 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ListeningSubframePattern_H_
+#define	_ListeningSubframePattern_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+#include <NativeInteger.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum ListeningSubframePattern__pattern_period {
+	ListeningSubframePattern__pattern_period_ms1280	= 0,
+	ListeningSubframePattern__pattern_period_ms2560	= 1,
+	ListeningSubframePattern__pattern_period_ms5120	= 2,
+	ListeningSubframePattern__pattern_period_ms10240	= 3
+	/*
+	 * Enumeration is extensible
+	 */
+} e_ListeningSubframePattern__pattern_period;
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* ListeningSubframePattern */
+typedef struct ListeningSubframePattern {
+	long	 pattern_period;
+	long	 pattern_offset;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ListeningSubframePattern_t;
+
+/* Implementation */
+/* extern asn_TYPE_descriptor_t asn_DEF_pattern_period_2;	// (Use -fall-defs-global to expose) */
+extern asn_TYPE_descriptor_t asn_DEF_ListeningSubframePattern;
+extern asn_SEQUENCE_specifics_t asn_SPC_ListeningSubframePattern_specs_1;
+extern asn_TYPE_member_t asn_MBR_ListeningSubframePattern_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ListeningSubframePattern_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/LocationReport.h b/src/s1ap/asn1c/asnGenFiles/LocationReport.h
new file mode 100644
index 0000000..c551295
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/LocationReport.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_LocationReport_H_
+#define	_LocationReport_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* LocationReport */
+typedef struct LocationReport {
+	ProtocolIE_Container_129P60_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} LocationReport_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_LocationReport;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _LocationReport_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/LocationReportingControl.h b/src/s1ap/asn1c/asnGenFiles/LocationReportingControl.h
new file mode 100644
index 0000000..aa65ea3
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/LocationReportingControl.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_LocationReportingControl_H_
+#define	_LocationReportingControl_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* LocationReportingControl */
+typedef struct LocationReportingControl {
+	ProtocolIE_Container_129P58_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} LocationReportingControl_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_LocationReportingControl;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _LocationReportingControl_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/LocationReportingFailureIndication.h b/src/s1ap/asn1c/asnGenFiles/LocationReportingFailureIndication.h
new file mode 100644
index 0000000..83eaf9e
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/LocationReportingFailureIndication.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_LocationReportingFailureIndication_H_
+#define	_LocationReportingFailureIndication_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* LocationReportingFailureIndication */
+typedef struct LocationReportingFailureIndication {
+	ProtocolIE_Container_129P59_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} LocationReportingFailureIndication_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_LocationReportingFailureIndication;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _LocationReportingFailureIndication_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/LoggedMBSFNMDT.h b/src/s1ap/asn1c/asnGenFiles/LoggedMBSFNMDT.h
new file mode 100644
index 0000000..bfaaf53
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/LoggedMBSFNMDT.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_LoggedMBSFNMDT_H_
+#define	_LoggedMBSFNMDT_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "LoggingInterval.h"
+#include "LoggingDuration.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct MBSFN_ResultToLog;
+struct ProtocolExtensionContainer;
+
+/* LoggedMBSFNMDT */
+typedef struct LoggedMBSFNMDT {
+	LoggingInterval_t	 loggingInterval;
+	LoggingDuration_t	 loggingDuration;
+	struct MBSFN_ResultToLog	*mBSFN_ResultToLog;	/* OPTIONAL */
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} LoggedMBSFNMDT_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_LoggedMBSFNMDT;
+extern asn_SEQUENCE_specifics_t asn_SPC_LoggedMBSFNMDT_specs_1;
+extern asn_TYPE_member_t asn_MBR_LoggedMBSFNMDT_1[4];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _LoggedMBSFNMDT_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/LoggedMDT.h b/src/s1ap/asn1c/asnGenFiles/LoggedMDT.h
new file mode 100644
index 0000000..d65d6c5
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/LoggedMDT.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_LoggedMDT_H_
+#define	_LoggedMDT_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "LoggingInterval.h"
+#include "LoggingDuration.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* LoggedMDT */
+typedef struct LoggedMDT {
+	LoggingInterval_t	 loggingInterval;
+	LoggingDuration_t	 loggingDuration;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} LoggedMDT_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_LoggedMDT;
+extern asn_SEQUENCE_specifics_t asn_SPC_LoggedMDT_specs_1;
+extern asn_TYPE_member_t asn_MBR_LoggedMDT_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _LoggedMDT_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/LoggingDuration.h b/src/s1ap/asn1c/asnGenFiles/LoggingDuration.h
new file mode 100644
index 0000000..c9ed65e
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/LoggingDuration.h
@@ -0,0 +1,57 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_LoggingDuration_H_
+#define	_LoggingDuration_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum LoggingDuration {
+	LoggingDuration_m10	= 0,
+	LoggingDuration_m20	= 1,
+	LoggingDuration_m40	= 2,
+	LoggingDuration_m60	= 3,
+	LoggingDuration_m90	= 4,
+	LoggingDuration_m120	= 5
+} e_LoggingDuration;
+
+/* LoggingDuration */
+typedef long	 LoggingDuration_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_LoggingDuration_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_LoggingDuration;
+extern const asn_INTEGER_specifics_t asn_SPC_LoggingDuration_specs_1;
+asn_struct_free_f LoggingDuration_free;
+asn_struct_print_f LoggingDuration_print;
+asn_constr_check_f LoggingDuration_constraint;
+ber_type_decoder_f LoggingDuration_decode_ber;
+der_type_encoder_f LoggingDuration_encode_der;
+xer_type_decoder_f LoggingDuration_decode_xer;
+xer_type_encoder_f LoggingDuration_encode_xer;
+oer_type_decoder_f LoggingDuration_decode_oer;
+oer_type_encoder_f LoggingDuration_encode_oer;
+per_type_decoder_f LoggingDuration_decode_uper;
+per_type_encoder_f LoggingDuration_encode_uper;
+per_type_decoder_f LoggingDuration_decode_aper;
+per_type_encoder_f LoggingDuration_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _LoggingDuration_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/LoggingInterval.h b/src/s1ap/asn1c/asnGenFiles/LoggingInterval.h
new file mode 100644
index 0000000..e1f5149
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/LoggingInterval.h
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_LoggingInterval_H_
+#define	_LoggingInterval_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum LoggingInterval {
+	LoggingInterval_ms128	= 0,
+	LoggingInterval_ms256	= 1,
+	LoggingInterval_ms512	= 2,
+	LoggingInterval_ms1024	= 3,
+	LoggingInterval_ms2048	= 4,
+	LoggingInterval_ms3072	= 5,
+	LoggingInterval_ms4096	= 6,
+	LoggingInterval_ms6144	= 7
+} e_LoggingInterval;
+
+/* LoggingInterval */
+typedef long	 LoggingInterval_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_LoggingInterval_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_LoggingInterval;
+extern const asn_INTEGER_specifics_t asn_SPC_LoggingInterval_specs_1;
+asn_struct_free_f LoggingInterval_free;
+asn_struct_print_f LoggingInterval_print;
+asn_constr_check_f LoggingInterval_constraint;
+ber_type_decoder_f LoggingInterval_decode_ber;
+der_type_encoder_f LoggingInterval_encode_der;
+xer_type_decoder_f LoggingInterval_decode_xer;
+xer_type_encoder_f LoggingInterval_encode_xer;
+oer_type_decoder_f LoggingInterval_decode_oer;
+oer_type_encoder_f LoggingInterval_encode_oer;
+per_type_decoder_f LoggingInterval_decode_uper;
+per_type_encoder_f LoggingInterval_encode_uper;
+per_type_decoder_f LoggingInterval_decode_aper;
+per_type_encoder_f LoggingInterval_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _LoggingInterval_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/M-TMSI.h b/src/s1ap/asn1c/asnGenFiles/M-TMSI.h
new file mode 100644
index 0000000..c4e318f
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/M-TMSI.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_M_TMSI_H_
+#define	_M_TMSI_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* M-TMSI */
+typedef OCTET_STRING_t	 M_TMSI_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_M_TMSI_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_M_TMSI;
+asn_struct_free_f M_TMSI_free;
+asn_struct_print_f M_TMSI_print;
+asn_constr_check_f M_TMSI_constraint;
+ber_type_decoder_f M_TMSI_decode_ber;
+der_type_encoder_f M_TMSI_encode_der;
+xer_type_decoder_f M_TMSI_decode_xer;
+xer_type_encoder_f M_TMSI_encode_xer;
+oer_type_decoder_f M_TMSI_decode_oer;
+oer_type_encoder_f M_TMSI_encode_oer;
+per_type_decoder_f M_TMSI_decode_uper;
+per_type_encoder_f M_TMSI_encode_uper;
+per_type_decoder_f M_TMSI_decode_aper;
+per_type_encoder_f M_TMSI_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _M_TMSI_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/M1PeriodicReporting.h b/src/s1ap/asn1c/asnGenFiles/M1PeriodicReporting.h
new file mode 100644
index 0000000..d7fa354
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/M1PeriodicReporting.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_M1PeriodicReporting_H_
+#define	_M1PeriodicReporting_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ReportIntervalMDT.h"
+#include "ReportAmountMDT.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* M1PeriodicReporting */
+typedef struct M1PeriodicReporting {
+	ReportIntervalMDT_t	 reportInterval;
+	ReportAmountMDT_t	 reportAmount;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} M1PeriodicReporting_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_M1PeriodicReporting;
+extern asn_SEQUENCE_specifics_t asn_SPC_M1PeriodicReporting_specs_1;
+extern asn_TYPE_member_t asn_MBR_M1PeriodicReporting_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _M1PeriodicReporting_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/M1ReportingTrigger.h b/src/s1ap/asn1c/asnGenFiles/M1ReportingTrigger.h
new file mode 100644
index 0000000..ecf7d87
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/M1ReportingTrigger.h
@@ -0,0 +1,57 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_M1ReportingTrigger_H_
+#define	_M1ReportingTrigger_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum M1ReportingTrigger {
+	M1ReportingTrigger_periodic	= 0,
+	M1ReportingTrigger_a2eventtriggered	= 1,
+	/*
+	 * Enumeration is extensible
+	 */
+	M1ReportingTrigger_a2eventtriggered_periodic	= 2
+} e_M1ReportingTrigger;
+
+/* M1ReportingTrigger */
+typedef long	 M1ReportingTrigger_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_M1ReportingTrigger_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_M1ReportingTrigger;
+extern const asn_INTEGER_specifics_t asn_SPC_M1ReportingTrigger_specs_1;
+asn_struct_free_f M1ReportingTrigger_free;
+asn_struct_print_f M1ReportingTrigger_print;
+asn_constr_check_f M1ReportingTrigger_constraint;
+ber_type_decoder_f M1ReportingTrigger_decode_ber;
+der_type_encoder_f M1ReportingTrigger_encode_der;
+xer_type_decoder_f M1ReportingTrigger_decode_xer;
+xer_type_encoder_f M1ReportingTrigger_encode_xer;
+oer_type_decoder_f M1ReportingTrigger_decode_oer;
+oer_type_encoder_f M1ReportingTrigger_encode_oer;
+per_type_decoder_f M1ReportingTrigger_decode_uper;
+per_type_encoder_f M1ReportingTrigger_encode_uper;
+per_type_decoder_f M1ReportingTrigger_decode_aper;
+per_type_encoder_f M1ReportingTrigger_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _M1ReportingTrigger_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/M1ThresholdEventA2.h b/src/s1ap/asn1c/asnGenFiles/M1ThresholdEventA2.h
new file mode 100644
index 0000000..765cb15
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/M1ThresholdEventA2.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_M1ThresholdEventA2_H_
+#define	_M1ThresholdEventA2_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "MeasurementThresholdA2.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* M1ThresholdEventA2 */
+typedef struct M1ThresholdEventA2 {
+	MeasurementThresholdA2_t	 measurementThreshold;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} M1ThresholdEventA2_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_M1ThresholdEventA2;
+extern asn_SEQUENCE_specifics_t asn_SPC_M1ThresholdEventA2_specs_1;
+extern asn_TYPE_member_t asn_MBR_M1ThresholdEventA2_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _M1ThresholdEventA2_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/M3Configuration.h b/src/s1ap/asn1c/asnGenFiles/M3Configuration.h
new file mode 100644
index 0000000..6cd43ab
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/M3Configuration.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_M3Configuration_H_
+#define	_M3Configuration_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "M3period.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* M3Configuration */
+typedef struct M3Configuration {
+	M3period_t	 m3period;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} M3Configuration_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_M3Configuration;
+extern asn_SEQUENCE_specifics_t asn_SPC_M3Configuration_specs_1;
+extern asn_TYPE_member_t asn_MBR_M3Configuration_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _M3Configuration_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/M3period.h b/src/s1ap/asn1c/asnGenFiles/M3period.h
new file mode 100644
index 0000000..3dd18cc
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/M3period.h
@@ -0,0 +1,64 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_M3period_H_
+#define	_M3period_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum M3period {
+	M3period_ms100	= 0,
+	M3period_ms1000	= 1,
+	M3period_ms10000	= 2,
+	/*
+	 * Enumeration is extensible
+	 */
+	M3period_ms1024	= 3,
+	M3period_ms1280	= 4,
+	M3period_ms2048	= 5,
+	M3period_ms2560	= 6,
+	M3period_ms5120	= 7,
+	M3period_ms10240	= 8,
+	M3period_min1	= 9
+} e_M3period;
+
+/* M3period */
+typedef long	 M3period_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_M3period_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_M3period;
+extern const asn_INTEGER_specifics_t asn_SPC_M3period_specs_1;
+asn_struct_free_f M3period_free;
+asn_struct_print_f M3period_print;
+asn_constr_check_f M3period_constraint;
+ber_type_decoder_f M3period_decode_ber;
+der_type_encoder_f M3period_encode_der;
+xer_type_decoder_f M3period_decode_xer;
+xer_type_encoder_f M3period_encode_xer;
+oer_type_decoder_f M3period_decode_oer;
+oer_type_encoder_f M3period_encode_oer;
+per_type_decoder_f M3period_decode_uper;
+per_type_encoder_f M3period_encode_uper;
+per_type_decoder_f M3period_decode_aper;
+per_type_encoder_f M3period_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _M3period_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/M4Configuration.h b/src/s1ap/asn1c/asnGenFiles/M4Configuration.h
new file mode 100644
index 0000000..e4fc32e
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/M4Configuration.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_M4Configuration_H_
+#define	_M4Configuration_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "M4period.h"
+#include "Links-to-log.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* M4Configuration */
+typedef struct M4Configuration {
+	M4period_t	 m4period;
+	Links_to_log_t	 m4_links_to_log;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} M4Configuration_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_M4Configuration;
+extern asn_SEQUENCE_specifics_t asn_SPC_M4Configuration_specs_1;
+extern asn_TYPE_member_t asn_MBR_M4Configuration_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _M4Configuration_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/M4period.h b/src/s1ap/asn1c/asnGenFiles/M4period.h
new file mode 100644
index 0000000..98d8fa6
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/M4period.h
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_M4period_H_
+#define	_M4period_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum M4period {
+	M4period_ms1024	= 0,
+	M4period_ms2048	= 1,
+	M4period_ms5120	= 2,
+	M4period_ms10240	= 3,
+	M4period_min1	= 4
+	/*
+	 * Enumeration is extensible
+	 */
+} e_M4period;
+
+/* M4period */
+typedef long	 M4period_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_M4period_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_M4period;
+extern const asn_INTEGER_specifics_t asn_SPC_M4period_specs_1;
+asn_struct_free_f M4period_free;
+asn_struct_print_f M4period_print;
+asn_constr_check_f M4period_constraint;
+ber_type_decoder_f M4period_decode_ber;
+der_type_encoder_f M4period_encode_der;
+xer_type_decoder_f M4period_decode_xer;
+xer_type_encoder_f M4period_encode_xer;
+oer_type_decoder_f M4period_decode_oer;
+oer_type_encoder_f M4period_encode_oer;
+per_type_decoder_f M4period_decode_uper;
+per_type_encoder_f M4period_encode_uper;
+per_type_decoder_f M4period_decode_aper;
+per_type_encoder_f M4period_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _M4period_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/M5Configuration.h b/src/s1ap/asn1c/asnGenFiles/M5Configuration.h
new file mode 100644
index 0000000..2b916d0
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/M5Configuration.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_M5Configuration_H_
+#define	_M5Configuration_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "M5period.h"
+#include "Links-to-log.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* M5Configuration */
+typedef struct M5Configuration {
+	M5period_t	 m5period;
+	Links_to_log_t	 m5_links_to_log;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} M5Configuration_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_M5Configuration;
+extern asn_SEQUENCE_specifics_t asn_SPC_M5Configuration_specs_1;
+extern asn_TYPE_member_t asn_MBR_M5Configuration_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _M5Configuration_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/M5period.h b/src/s1ap/asn1c/asnGenFiles/M5period.h
new file mode 100644
index 0000000..eb18fbf
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/M5period.h
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_M5period_H_
+#define	_M5period_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum M5period {
+	M5period_ms1024	= 0,
+	M5period_ms2048	= 1,
+	M5period_ms5120	= 2,
+	M5period_ms10240	= 3,
+	M5period_min1	= 4
+	/*
+	 * Enumeration is extensible
+	 */
+} e_M5period;
+
+/* M5period */
+typedef long	 M5period_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_M5period_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_M5period;
+extern const asn_INTEGER_specifics_t asn_SPC_M5period_specs_1;
+asn_struct_free_f M5period_free;
+asn_struct_print_f M5period_print;
+asn_constr_check_f M5period_constraint;
+ber_type_decoder_f M5period_decode_ber;
+der_type_encoder_f M5period_encode_der;
+xer_type_decoder_f M5period_decode_xer;
+xer_type_encoder_f M5period_encode_xer;
+oer_type_decoder_f M5period_decode_oer;
+oer_type_encoder_f M5period_encode_oer;
+per_type_decoder_f M5period_decode_uper;
+per_type_encoder_f M5period_encode_uper;
+per_type_decoder_f M5period_decode_aper;
+per_type_encoder_f M5period_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _M5period_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/M6Configuration.h b/src/s1ap/asn1c/asnGenFiles/M6Configuration.h
new file mode 100644
index 0000000..86bbfd6
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/M6Configuration.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_M6Configuration_H_
+#define	_M6Configuration_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "M6report-Interval.h"
+#include "M6delay-threshold.h"
+#include "Links-to-log.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* M6Configuration */
+typedef struct M6Configuration {
+	M6report_Interval_t	 m6report_Interval;
+	M6delay_threshold_t	*m6delay_threshold;	/* OPTIONAL */
+	Links_to_log_t	 m6_links_to_log;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} M6Configuration_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_M6Configuration;
+extern asn_SEQUENCE_specifics_t asn_SPC_M6Configuration_specs_1;
+extern asn_TYPE_member_t asn_MBR_M6Configuration_1[4];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _M6Configuration_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/M6delay-threshold.h b/src/s1ap/asn1c/asnGenFiles/M6delay-threshold.h
new file mode 100644
index 0000000..7caa560
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/M6delay-threshold.h
@@ -0,0 +1,66 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_M6delay_threshold_H_
+#define	_M6delay_threshold_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum M6delay_threshold {
+	M6delay_threshold_ms30	= 0,
+	M6delay_threshold_ms40	= 1,
+	M6delay_threshold_ms50	= 2,
+	M6delay_threshold_ms60	= 3,
+	M6delay_threshold_ms70	= 4,
+	M6delay_threshold_ms80	= 5,
+	M6delay_threshold_ms90	= 6,
+	M6delay_threshold_ms100	= 7,
+	M6delay_threshold_ms150	= 8,
+	M6delay_threshold_ms300	= 9,
+	M6delay_threshold_ms500	= 10,
+	M6delay_threshold_ms750	= 11
+	/*
+	 * Enumeration is extensible
+	 */
+} e_M6delay_threshold;
+
+/* M6delay-threshold */
+typedef long	 M6delay_threshold_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_M6delay_threshold_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_M6delay_threshold;
+extern const asn_INTEGER_specifics_t asn_SPC_M6delay_threshold_specs_1;
+asn_struct_free_f M6delay_threshold_free;
+asn_struct_print_f M6delay_threshold_print;
+asn_constr_check_f M6delay_threshold_constraint;
+ber_type_decoder_f M6delay_threshold_decode_ber;
+der_type_encoder_f M6delay_threshold_encode_der;
+xer_type_decoder_f M6delay_threshold_decode_xer;
+xer_type_encoder_f M6delay_threshold_encode_xer;
+oer_type_decoder_f M6delay_threshold_decode_oer;
+oer_type_encoder_f M6delay_threshold_encode_oer;
+per_type_decoder_f M6delay_threshold_decode_uper;
+per_type_encoder_f M6delay_threshold_encode_uper;
+per_type_decoder_f M6delay_threshold_decode_aper;
+per_type_encoder_f M6delay_threshold_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _M6delay_threshold_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/M6report-Interval.h b/src/s1ap/asn1c/asnGenFiles/M6report-Interval.h
new file mode 100644
index 0000000..af6153e
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/M6report-Interval.h
@@ -0,0 +1,58 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_M6report_Interval_H_
+#define	_M6report_Interval_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum M6report_Interval {
+	M6report_Interval_ms1024	= 0,
+	M6report_Interval_ms2048	= 1,
+	M6report_Interval_ms5120	= 2,
+	M6report_Interval_ms10240	= 3
+	/*
+	 * Enumeration is extensible
+	 */
+} e_M6report_Interval;
+
+/* M6report-Interval */
+typedef long	 M6report_Interval_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_M6report_Interval_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_M6report_Interval;
+extern const asn_INTEGER_specifics_t asn_SPC_M6report_Interval_specs_1;
+asn_struct_free_f M6report_Interval_free;
+asn_struct_print_f M6report_Interval_print;
+asn_constr_check_f M6report_Interval_constraint;
+ber_type_decoder_f M6report_Interval_decode_ber;
+der_type_encoder_f M6report_Interval_encode_der;
+xer_type_decoder_f M6report_Interval_decode_xer;
+xer_type_encoder_f M6report_Interval_encode_xer;
+oer_type_decoder_f M6report_Interval_decode_oer;
+oer_type_encoder_f M6report_Interval_encode_oer;
+per_type_decoder_f M6report_Interval_decode_uper;
+per_type_encoder_f M6report_Interval_encode_uper;
+per_type_decoder_f M6report_Interval_decode_aper;
+per_type_encoder_f M6report_Interval_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _M6report_Interval_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/M7Configuration.h b/src/s1ap/asn1c/asnGenFiles/M7Configuration.h
new file mode 100644
index 0000000..96aaef2
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/M7Configuration.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_M7Configuration_H_
+#define	_M7Configuration_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "M7period.h"
+#include "Links-to-log.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* M7Configuration */
+typedef struct M7Configuration {
+	M7period_t	 m7period;
+	Links_to_log_t	 m7_links_to_log;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} M7Configuration_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_M7Configuration;
+extern asn_SEQUENCE_specifics_t asn_SPC_M7Configuration_specs_1;
+extern asn_TYPE_member_t asn_MBR_M7Configuration_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _M7Configuration_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/M7period.h b/src/s1ap/asn1c/asnGenFiles/M7period.h
new file mode 100644
index 0000000..f868ba3
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/M7period.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_M7period_H_
+#define	_M7period_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* M7period */
+typedef long	 M7period_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_M7period_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_M7period;
+asn_struct_free_f M7period_free;
+asn_struct_print_f M7period_print;
+asn_constr_check_f M7period_constraint;
+ber_type_decoder_f M7period_decode_ber;
+der_type_encoder_f M7period_encode_der;
+xer_type_decoder_f M7period_decode_xer;
+xer_type_encoder_f M7period_encode_xer;
+oer_type_decoder_f M7period_decode_oer;
+oer_type_encoder_f M7period_encode_oer;
+per_type_decoder_f M7period_decode_uper;
+per_type_encoder_f M7period_encode_uper;
+per_type_decoder_f M7period_decode_aper;
+per_type_encoder_f M7period_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _M7period_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/MBSFN-ResultToLog.h b/src/s1ap/asn1c/asnGenFiles/MBSFN-ResultToLog.h
new file mode 100644
index 0000000..ebf87ce
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/MBSFN-ResultToLog.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_MBSFN_ResultToLog_H_
+#define	_MBSFN_ResultToLog_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct MBSFN_ResultToLogInfo;
+
+/* MBSFN-ResultToLog */
+typedef struct MBSFN_ResultToLog {
+	A_SEQUENCE_OF(struct MBSFN_ResultToLogInfo) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} MBSFN_ResultToLog_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_MBSFN_ResultToLog;
+extern asn_SET_OF_specifics_t asn_SPC_MBSFN_ResultToLog_specs_1;
+extern asn_TYPE_member_t asn_MBR_MBSFN_ResultToLog_1[1];
+extern asn_per_constraints_t asn_PER_type_MBSFN_ResultToLog_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _MBSFN_ResultToLog_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/MBSFN-ResultToLogInfo.h b/src/s1ap/asn1c/asnGenFiles/MBSFN-ResultToLogInfo.h
new file mode 100644
index 0000000..a783c3d
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/MBSFN-ResultToLogInfo.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_MBSFN_ResultToLogInfo_H_
+#define	_MBSFN_ResultToLogInfo_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+#include "EARFCN.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* MBSFN-ResultToLogInfo */
+typedef struct MBSFN_ResultToLogInfo {
+	long	*mBSFN_AreaId;	/* OPTIONAL */
+	EARFCN_t	 carrierFreq;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} MBSFN_ResultToLogInfo_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_MBSFN_ResultToLogInfo;
+extern asn_SEQUENCE_specifics_t asn_SPC_MBSFN_ResultToLogInfo_specs_1;
+extern asn_TYPE_member_t asn_MBR_MBSFN_ResultToLogInfo_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _MBSFN_ResultToLogInfo_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/MDT-Activation.h b/src/s1ap/asn1c/asnGenFiles/MDT-Activation.h
new file mode 100644
index 0000000..9c39d76
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/MDT-Activation.h
@@ -0,0 +1,58 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_MDT_Activation_H_
+#define	_MDT_Activation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum MDT_Activation {
+	MDT_Activation_immediate_MDT_only	= 0,
+	MDT_Activation_immediate_MDT_and_Trace	= 1,
+	MDT_Activation_logged_MDT_only	= 2,
+	/*
+	 * Enumeration is extensible
+	 */
+	MDT_Activation_logged_MBSFN_MDT	= 3
+} e_MDT_Activation;
+
+/* MDT-Activation */
+typedef long	 MDT_Activation_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_MDT_Activation_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_MDT_Activation;
+extern const asn_INTEGER_specifics_t asn_SPC_MDT_Activation_specs_1;
+asn_struct_free_f MDT_Activation_free;
+asn_struct_print_f MDT_Activation_print;
+asn_constr_check_f MDT_Activation_constraint;
+ber_type_decoder_f MDT_Activation_decode_ber;
+der_type_encoder_f MDT_Activation_encode_der;
+xer_type_decoder_f MDT_Activation_decode_xer;
+xer_type_encoder_f MDT_Activation_encode_xer;
+oer_type_decoder_f MDT_Activation_decode_oer;
+oer_type_encoder_f MDT_Activation_encode_oer;
+per_type_decoder_f MDT_Activation_decode_uper;
+per_type_encoder_f MDT_Activation_encode_uper;
+per_type_decoder_f MDT_Activation_decode_aper;
+per_type_encoder_f MDT_Activation_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _MDT_Activation_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/MDT-Configuration.h b/src/s1ap/asn1c/asnGenFiles/MDT-Configuration.h
new file mode 100644
index 0000000..fd042ac
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/MDT-Configuration.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_MDT_Configuration_H_
+#define	_MDT_Configuration_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "MDT-Activation.h"
+#include "AreaScopeOfMDT.h"
+#include "MDTMode.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* MDT-Configuration */
+typedef struct MDT_Configuration {
+	MDT_Activation_t	 mdt_Activation;
+	AreaScopeOfMDT_t	 areaScopeOfMDT;
+	MDTMode_t	 mDTMode;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} MDT_Configuration_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_MDT_Configuration;
+extern asn_SEQUENCE_specifics_t asn_SPC_MDT_Configuration_specs_1;
+extern asn_TYPE_member_t asn_MBR_MDT_Configuration_1[4];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _MDT_Configuration_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/MDT-Location-Info.h b/src/s1ap/asn1c/asnGenFiles/MDT-Location-Info.h
new file mode 100644
index 0000000..4a01749
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/MDT-Location-Info.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_MDT_Location_Info_H_
+#define	_MDT_Location_Info_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* MDT-Location-Info */
+typedef BIT_STRING_t	 MDT_Location_Info_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_MDT_Location_Info_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_MDT_Location_Info;
+asn_struct_free_f MDT_Location_Info_free;
+asn_struct_print_f MDT_Location_Info_print;
+asn_constr_check_f MDT_Location_Info_constraint;
+ber_type_decoder_f MDT_Location_Info_decode_ber;
+der_type_encoder_f MDT_Location_Info_encode_der;
+xer_type_decoder_f MDT_Location_Info_decode_xer;
+xer_type_encoder_f MDT_Location_Info_encode_xer;
+oer_type_decoder_f MDT_Location_Info_decode_oer;
+oer_type_encoder_f MDT_Location_Info_encode_oer;
+per_type_decoder_f MDT_Location_Info_decode_uper;
+per_type_encoder_f MDT_Location_Info_encode_uper;
+per_type_decoder_f MDT_Location_Info_decode_aper;
+per_type_encoder_f MDT_Location_Info_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _MDT_Location_Info_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/MDTMode-Extension.h b/src/s1ap/asn1c/asnGenFiles/MDTMode-Extension.h
new file mode 100644
index 0000000..3dd700e
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/MDTMode-Extension.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_MDTMode_Extension_H_
+#define	_MDTMode_Extension_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-SingleContainer.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* MDTMode-Extension */
+typedef ProtocolIE_SingleContainer_132P4_t	 MDTMode_Extension_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_MDTMode_Extension;
+asn_struct_free_f MDTMode_Extension_free;
+asn_struct_print_f MDTMode_Extension_print;
+asn_constr_check_f MDTMode_Extension_constraint;
+ber_type_decoder_f MDTMode_Extension_decode_ber;
+der_type_encoder_f MDTMode_Extension_encode_der;
+xer_type_decoder_f MDTMode_Extension_decode_xer;
+xer_type_encoder_f MDTMode_Extension_encode_xer;
+oer_type_decoder_f MDTMode_Extension_decode_oer;
+oer_type_encoder_f MDTMode_Extension_encode_oer;
+per_type_decoder_f MDTMode_Extension_decode_uper;
+per_type_encoder_f MDTMode_Extension_encode_uper;
+per_type_decoder_f MDTMode_Extension_decode_aper;
+per_type_encoder_f MDTMode_Extension_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _MDTMode_Extension_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/MDTMode.h b/src/s1ap/asn1c/asnGenFiles/MDTMode.h
new file mode 100644
index 0000000..8594543
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/MDTMode.h
@@ -0,0 +1,63 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_MDTMode_H_
+#define	_MDTMode_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum MDTMode_PR {
+	MDTMode_PR_NOTHING,	/* No components present */
+	MDTMode_PR_immediateMDT,
+	MDTMode_PR_loggedMDT,
+	/* Extensions may appear below */
+	MDTMode_PR_mDTMode_Extension
+} MDTMode_PR;
+
+/* Forward declarations */
+struct ImmediateMDT;
+struct LoggedMDT;
+struct MDTMode_Extension;
+
+/* MDTMode */
+typedef struct MDTMode {
+	MDTMode_PR present;
+	union MDTMode_u {
+		struct ImmediateMDT	*immediateMDT;
+		struct LoggedMDT	*loggedMDT;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+		struct MDTMode_Extension	*mDTMode_Extension;
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} MDTMode_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_MDTMode;
+extern asn_CHOICE_specifics_t asn_SPC_MDTMode_specs_1;
+extern asn_TYPE_member_t asn_MBR_MDTMode_1[3];
+extern asn_per_constraints_t asn_PER_type_MDTMode_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _MDTMode_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/MDTPLMNList.h b/src/s1ap/asn1c/asnGenFiles/MDTPLMNList.h
new file mode 100644
index 0000000..b2d673b
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/MDTPLMNList.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_MDTPLMNList_H_
+#define	_MDTPLMNList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "PLMNidentity.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* MDTPLMNList */
+typedef struct MDTPLMNList {
+	A_SEQUENCE_OF(PLMNidentity_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} MDTPLMNList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_MDTPLMNList;
+extern asn_SET_OF_specifics_t asn_SPC_MDTPLMNList_specs_1;
+extern asn_TYPE_member_t asn_MBR_MDTPLMNList_1[1];
+extern asn_per_constraints_t asn_PER_type_MDTPLMNList_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _MDTPLMNList_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/MME-Code.h b/src/s1ap/asn1c/asnGenFiles/MME-Code.h
new file mode 100644
index 0000000..83908a4
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/MME-Code.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_MME_Code_H_
+#define	_MME_Code_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* MME-Code */
+typedef OCTET_STRING_t	 MME_Code_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_MME_Code_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_MME_Code;
+asn_struct_free_f MME_Code_free;
+asn_struct_print_f MME_Code_print;
+asn_constr_check_f MME_Code_constraint;
+ber_type_decoder_f MME_Code_decode_ber;
+der_type_encoder_f MME_Code_encode_der;
+xer_type_decoder_f MME_Code_decode_xer;
+xer_type_encoder_f MME_Code_encode_xer;
+oer_type_decoder_f MME_Code_decode_oer;
+oer_type_encoder_f MME_Code_encode_oer;
+per_type_decoder_f MME_Code_decode_uper;
+per_type_encoder_f MME_Code_encode_uper;
+per_type_decoder_f MME_Code_decode_aper;
+per_type_encoder_f MME_Code_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _MME_Code_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/MME-Group-ID.h b/src/s1ap/asn1c/asnGenFiles/MME-Group-ID.h
new file mode 100644
index 0000000..8766143
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/MME-Group-ID.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_MME_Group_ID_H_
+#define	_MME_Group_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* MME-Group-ID */
+typedef OCTET_STRING_t	 MME_Group_ID_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_MME_Group_ID_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_MME_Group_ID;
+asn_struct_free_f MME_Group_ID_free;
+asn_struct_print_f MME_Group_ID_print;
+asn_constr_check_f MME_Group_ID_constraint;
+ber_type_decoder_f MME_Group_ID_decode_ber;
+der_type_encoder_f MME_Group_ID_encode_der;
+xer_type_decoder_f MME_Group_ID_decode_xer;
+xer_type_encoder_f MME_Group_ID_encode_xer;
+oer_type_decoder_f MME_Group_ID_decode_oer;
+oer_type_encoder_f MME_Group_ID_encode_oer;
+per_type_decoder_f MME_Group_ID_decode_uper;
+per_type_encoder_f MME_Group_ID_encode_uper;
+per_type_decoder_f MME_Group_ID_decode_aper;
+per_type_encoder_f MME_Group_ID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _MME_Group_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/MME-UE-S1AP-ID.h b/src/s1ap/asn1c/asnGenFiles/MME-UE-S1AP-ID.h
new file mode 100644
index 0000000..ad56cf8
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/MME-UE-S1AP-ID.h
@@ -0,0 +1,47 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_MME_UE_S1AP_ID_H_
+#define	_MME_UE_S1AP_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* MME-UE-S1AP-ID */
+typedef unsigned long	 MME_UE_S1AP_ID_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_MME_UE_S1AP_ID_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_MME_UE_S1AP_ID;
+extern const asn_INTEGER_specifics_t asn_SPC_MME_UE_S1AP_ID_specs_1;
+asn_struct_free_f MME_UE_S1AP_ID_free;
+asn_struct_print_f MME_UE_S1AP_ID_print;
+asn_constr_check_f MME_UE_S1AP_ID_constraint;
+ber_type_decoder_f MME_UE_S1AP_ID_decode_ber;
+der_type_encoder_f MME_UE_S1AP_ID_encode_der;
+xer_type_decoder_f MME_UE_S1AP_ID_decode_xer;
+xer_type_encoder_f MME_UE_S1AP_ID_encode_xer;
+oer_type_decoder_f MME_UE_S1AP_ID_decode_oer;
+oer_type_encoder_f MME_UE_S1AP_ID_encode_oer;
+per_type_decoder_f MME_UE_S1AP_ID_decode_uper;
+per_type_encoder_f MME_UE_S1AP_ID_encode_uper;
+per_type_decoder_f MME_UE_S1AP_ID_decode_aper;
+per_type_encoder_f MME_UE_S1AP_ID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _MME_UE_S1AP_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/MMECPRelocationIndication.h b/src/s1ap/asn1c/asnGenFiles/MMECPRelocationIndication.h
new file mode 100644
index 0000000..d456871
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/MMECPRelocationIndication.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_MMECPRelocationIndication_H_
+#define	_MMECPRelocationIndication_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* MMECPRelocationIndication */
+typedef struct MMECPRelocationIndication {
+	ProtocolIE_Container_129P90_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} MMECPRelocationIndication_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_MMECPRelocationIndication;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _MMECPRelocationIndication_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/MMEConfigurationTransfer.h b/src/s1ap/asn1c/asnGenFiles/MMEConfigurationTransfer.h
new file mode 100644
index 0000000..b6f87cd
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/MMEConfigurationTransfer.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_MMEConfigurationTransfer_H_
+#define	_MMEConfigurationTransfer_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* MMEConfigurationTransfer */
+typedef struct MMEConfigurationTransfer {
+	ProtocolIE_Container_129P68_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} MMEConfigurationTransfer_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_MMEConfigurationTransfer;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _MMEConfigurationTransfer_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/MMEConfigurationUpdate.h b/src/s1ap/asn1c/asnGenFiles/MMEConfigurationUpdate.h
new file mode 100644
index 0000000..0b8cf53
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/MMEConfigurationUpdate.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_MMEConfigurationUpdate_H_
+#define	_MMEConfigurationUpdate_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* MMEConfigurationUpdate */
+typedef struct MMEConfigurationUpdate {
+	ProtocolIE_Container_129P46_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} MMEConfigurationUpdate_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_MMEConfigurationUpdate;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _MMEConfigurationUpdate_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/MMEConfigurationUpdateAcknowledge.h b/src/s1ap/asn1c/asnGenFiles/MMEConfigurationUpdateAcknowledge.h
new file mode 100644
index 0000000..eaf77f3
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/MMEConfigurationUpdateAcknowledge.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_MMEConfigurationUpdateAcknowledge_H_
+#define	_MMEConfigurationUpdateAcknowledge_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* MMEConfigurationUpdateAcknowledge */
+typedef struct MMEConfigurationUpdateAcknowledge {
+	ProtocolIE_Container_129P47_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} MMEConfigurationUpdateAcknowledge_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_MMEConfigurationUpdateAcknowledge;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _MMEConfigurationUpdateAcknowledge_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/MMEConfigurationUpdateFailure.h b/src/s1ap/asn1c/asnGenFiles/MMEConfigurationUpdateFailure.h
new file mode 100644
index 0000000..e5ba87c
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/MMEConfigurationUpdateFailure.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_MMEConfigurationUpdateFailure_H_
+#define	_MMEConfigurationUpdateFailure_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* MMEConfigurationUpdateFailure */
+typedef struct MMEConfigurationUpdateFailure {
+	ProtocolIE_Container_129P48_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} MMEConfigurationUpdateFailure_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_MMEConfigurationUpdateFailure;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _MMEConfigurationUpdateFailure_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/MMEDirectInformationTransfer.h b/src/s1ap/asn1c/asnGenFiles/MMEDirectInformationTransfer.h
new file mode 100644
index 0000000..7a27af5
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/MMEDirectInformationTransfer.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_MMEDirectInformationTransfer_H_
+#define	_MMEDirectInformationTransfer_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* MMEDirectInformationTransfer */
+typedef struct MMEDirectInformationTransfer {
+	ProtocolIE_Container_129P66_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} MMEDirectInformationTransfer_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_MMEDirectInformationTransfer;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _MMEDirectInformationTransfer_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/MMEPagingTarget.h b/src/s1ap/asn1c/asnGenFiles/MMEPagingTarget.h
new file mode 100644
index 0000000..6d1c682
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/MMEPagingTarget.h
@@ -0,0 +1,61 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_MMEPagingTarget_H_
+#define	_MMEPagingTarget_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum MMEPagingTarget_PR {
+	MMEPagingTarget_PR_NOTHING,	/* No components present */
+	MMEPagingTarget_PR_global_ENB_ID,
+	MMEPagingTarget_PR_tAI
+	/* Extensions may appear below */
+	
+} MMEPagingTarget_PR;
+
+/* Forward declarations */
+struct Global_ENB_ID;
+struct S_TAI;
+
+/* MMEPagingTarget */
+typedef struct MMEPagingTarget {
+	MMEPagingTarget_PR present;
+	union MMEPagingTarget_u {
+		struct Global_ENB_ID	*global_ENB_ID;
+		struct S_TAI	*tAI;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} MMEPagingTarget_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_MMEPagingTarget;
+extern asn_CHOICE_specifics_t asn_SPC_MMEPagingTarget_specs_1;
+extern asn_TYPE_member_t asn_MBR_MMEPagingTarget_1[2];
+extern asn_per_constraints_t asn_PER_type_MMEPagingTarget_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _MMEPagingTarget_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/MMERelaySupportIndicator.h b/src/s1ap/asn1c/asnGenFiles/MMERelaySupportIndicator.h
new file mode 100644
index 0000000..acb42e0
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/MMERelaySupportIndicator.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_MMERelaySupportIndicator_H_
+#define	_MMERelaySupportIndicator_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum MMERelaySupportIndicator {
+	MMERelaySupportIndicator_true	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_MMERelaySupportIndicator;
+
+/* MMERelaySupportIndicator */
+typedef long	 MMERelaySupportIndicator_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_MMERelaySupportIndicator_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_MMERelaySupportIndicator;
+extern const asn_INTEGER_specifics_t asn_SPC_MMERelaySupportIndicator_specs_1;
+asn_struct_free_f MMERelaySupportIndicator_free;
+asn_struct_print_f MMERelaySupportIndicator_print;
+asn_constr_check_f MMERelaySupportIndicator_constraint;
+ber_type_decoder_f MMERelaySupportIndicator_decode_ber;
+der_type_encoder_f MMERelaySupportIndicator_encode_der;
+xer_type_decoder_f MMERelaySupportIndicator_decode_xer;
+xer_type_encoder_f MMERelaySupportIndicator_encode_xer;
+oer_type_decoder_f MMERelaySupportIndicator_decode_oer;
+oer_type_encoder_f MMERelaySupportIndicator_encode_oer;
+per_type_decoder_f MMERelaySupportIndicator_decode_uper;
+per_type_encoder_f MMERelaySupportIndicator_encode_uper;
+per_type_decoder_f MMERelaySupportIndicator_decode_aper;
+per_type_encoder_f MMERelaySupportIndicator_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _MMERelaySupportIndicator_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/MMEStatusTransfer.h b/src/s1ap/asn1c/asnGenFiles/MMEStatusTransfer.h
new file mode 100644
index 0000000..16a0688
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/MMEStatusTransfer.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_MMEStatusTransfer_H_
+#define	_MMEStatusTransfer_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* MMEStatusTransfer */
+typedef struct MMEStatusTransfer {
+	ProtocolIE_Container_129P53_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} MMEStatusTransfer_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_MMEStatusTransfer;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _MMEStatusTransfer_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/MMEname.h b/src/s1ap/asn1c/asnGenFiles/MMEname.h
new file mode 100644
index 0000000..966a804
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/MMEname.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_MMEname_H_
+#define	_MMEname_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <PrintableString.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* MMEname */
+typedef PrintableString_t	 MMEname_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_MMEname_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_MMEname;
+asn_struct_free_f MMEname_free;
+asn_struct_print_f MMEname_print;
+asn_constr_check_f MMEname_constraint;
+ber_type_decoder_f MMEname_decode_ber;
+der_type_encoder_f MMEname_encode_der;
+xer_type_decoder_f MMEname_decode_xer;
+xer_type_encoder_f MMEname_encode_xer;
+oer_type_decoder_f MMEname_decode_oer;
+oer_type_encoder_f MMEname_encode_oer;
+per_type_decoder_f MMEname_decode_uper;
+per_type_encoder_f MMEname_encode_uper;
+per_type_decoder_f MMEname_decode_aper;
+per_type_encoder_f MMEname_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _MMEname_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/MSClassmark2.h b/src/s1ap/asn1c/asnGenFiles/MSClassmark2.h
new file mode 100644
index 0000000..ea6827a
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/MSClassmark2.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_MSClassmark2_H_
+#define	_MSClassmark2_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* MSClassmark2 */
+typedef OCTET_STRING_t	 MSClassmark2_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_MSClassmark2;
+asn_struct_free_f MSClassmark2_free;
+asn_struct_print_f MSClassmark2_print;
+asn_constr_check_f MSClassmark2_constraint;
+ber_type_decoder_f MSClassmark2_decode_ber;
+der_type_encoder_f MSClassmark2_encode_der;
+xer_type_decoder_f MSClassmark2_decode_xer;
+xer_type_encoder_f MSClassmark2_encode_xer;
+oer_type_decoder_f MSClassmark2_decode_oer;
+oer_type_encoder_f MSClassmark2_encode_oer;
+per_type_decoder_f MSClassmark2_decode_uper;
+per_type_encoder_f MSClassmark2_encode_uper;
+per_type_decoder_f MSClassmark2_decode_aper;
+per_type_encoder_f MSClassmark2_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _MSClassmark2_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/MSClassmark3.h b/src/s1ap/asn1c/asnGenFiles/MSClassmark3.h
new file mode 100644
index 0000000..1e08564
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/MSClassmark3.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_MSClassmark3_H_
+#define	_MSClassmark3_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* MSClassmark3 */
+typedef OCTET_STRING_t	 MSClassmark3_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_MSClassmark3;
+asn_struct_free_f MSClassmark3_free;
+asn_struct_print_f MSClassmark3_print;
+asn_constr_check_f MSClassmark3_constraint;
+ber_type_decoder_f MSClassmark3_decode_ber;
+der_type_encoder_f MSClassmark3_encode_der;
+xer_type_decoder_f MSClassmark3_decode_xer;
+xer_type_encoder_f MSClassmark3_encode_xer;
+oer_type_decoder_f MSClassmark3_decode_oer;
+oer_type_encoder_f MSClassmark3_encode_oer;
+per_type_decoder_f MSClassmark3_decode_uper;
+per_type_encoder_f MSClassmark3_encode_uper;
+per_type_decoder_f MSClassmark3_decode_aper;
+per_type_encoder_f MSClassmark3_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _MSClassmark3_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Makefile.am.asn1convert b/src/s1ap/asn1c/asnGenFiles/Makefile.am.asn1convert
new file mode 100644
index 0000000..acb5e59
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Makefile.am.asn1convert
@@ -0,0 +1,13 @@
+include Makefile.am.libasncodec
+
+bin_PROGRAMS += asn1convert
+asn1convert_CFLAGS = $(ASN_MODULE_CFLAGS) -DPDU=S1AP_PDU 
+asn1convert_CPPFLAGS = -I$(top_srcdir)/
+asn1convert_LDADD = libasncodec.la
+asn1convert_SOURCES = \
+	converter-example.c
+regen: regenerate-from-asn1-source
+
+regenerate-from-asn1-source:
+	asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU ./asn1c/S1AP-CommonDataTypes.asn ./asn1c/S1AP-Constants.asn ./asn1c/S1AP-Containers.asn ./asn1c/S1AP-IEs.asn ./asn1c/S1AP-PDU-Contents.asn ./asn1c/S1AP-PDU-Descriptions.asn
+
diff --git a/src/s1ap/asn1c/asnGenFiles/Makefile.am.libasncodec b/src/s1ap/asn1c/asnGenFiles/Makefile.am.libasncodec
new file mode 100644
index 0000000..2c5fb29
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Makefile.am.libasncodec
@@ -0,0 +1,1294 @@
+ASN_MODULE_SRCS=	\
+	Criticality.c	\
+	Presence.c	\
+	PrivateIE-ID.c	\
+	ProcedureCode.c	\
+	ProtocolExtensionID.c	\
+	ProtocolIE-ID.c	\
+	TriggeringMessage.c	\
+	ProtocolIE-Container.c	\
+	ProtocolIE-SingleContainer.c	\
+	ProtocolIE-Field.c	\
+	ProtocolIE-ContainerPair.c	\
+	ProtocolIE-FieldPair.c	\
+	ProtocolIE-ContainerList.c	\
+	ProtocolIE-ContainerPairList.c	\
+	ProtocolExtensionContainer.c	\
+	ProtocolExtensionField.c	\
+	PrivateIE-Container.c	\
+	PrivateIE-Field.c	\
+	Additional-GUTI.c	\
+	AerialUEsubscriptionInformation.c	\
+	AreaScopeOfMDT.c	\
+	AreaScopeOfQMC.c	\
+	AllocationAndRetentionPriority.c	\
+	AssistanceDataForCECapableUEs.c	\
+	AssistanceDataForPaging.c	\
+	AssistanceDataForRecommendedCells.c	\
+	Bearers-SubjectToStatusTransferList.c	\
+	Bearers-SubjectToStatusTransfer-Item.c	\
+	BearerType.c	\
+	BitRate.c	\
+	BluetoothMeasurementConfiguration.c	\
+	BluetoothMeasConfigNameList.c	\
+	BluetoothMeasConfig.c	\
+	BluetoothName.c	\
+	BPLMNs.c	\
+	BroadcastCancelledAreaList.c	\
+	BroadcastCompletedAreaList.c	\
+	CancelledCellinEAI.c	\
+	CancelledCellinEAI-Item.c	\
+	CancelledCellinTAI.c	\
+	CancelledCellinTAI-Item.c	\
+	Cause.c	\
+	CauseMisc.c	\
+	CauseProtocol.c	\
+	CauseRadioNetwork.c	\
+	CauseTransport.c	\
+	CauseNas.c	\
+	CellAccessMode.c	\
+	CellIdentifierAndCELevelForCECapableUEs.c	\
+	CELevel.c	\
+	CE-mode-B-SupportIndicator.c	\
+	CellIdentity.c	\
+	CellID-Broadcast.c	\
+	CellID-Broadcast-Item.c	\
+	CellID-Cancelled.c	\
+	CellID-Cancelled-Item.c	\
+	CellBasedMDT.c	\
+	CellIdListforMDT.c	\
+	CellBasedQMC.c	\
+	CellIdListforQMC.c	\
+	Cdma2000PDU.c	\
+	Cdma2000RATType.c	\
+	Cdma2000SectorID.c	\
+	Cdma2000HOStatus.c	\
+	Cdma2000HORequiredIndication.c	\
+	Cdma2000OneXSRVCCInfo.c	\
+	Cdma2000OneXMEID.c	\
+	Cdma2000OneXMSI.c	\
+	Cdma2000OneXPilot.c	\
+	Cdma2000OneXRAND.c	\
+	Cell-Size.c	\
+	CellType.c	\
+	CGI.c	\
+	CI.c	\
+	CNDomain.c	\
+	CNTypeRestrictions.c	\
+	CNTypeRestrictions-Item.c	\
+	CNType.c	\
+	ConcurrentWarningMessageIndicator.c	\
+	ConnectedengNBList.c	\
+	ConnectedengNBItem.c	\
+	Correlation-ID.c	\
+	CSFallbackIndicator.c	\
+	AdditionalCSFallbackIndicator.c	\
+	CSG-Id.c	\
+	CSG-IdList.c	\
+	CSG-IdList-Item.c	\
+	CSGMembershipStatus.c	\
+	COUNTvalue.c	\
+	COUNTValueExtended.c	\
+	COUNTvaluePDCP-SNlength18.c	\
+	Coverage-Level.c	\
+	CriticalityDiagnostics.c	\
+	CriticalityDiagnostics-IE-List.c	\
+	CriticalityDiagnostics-IE-Item.c	\
+	DataCodingScheme.c	\
+	DCN-ID.c	\
+	ServedDCNs.c	\
+	ServedDCNsItem.c	\
+	DL-CP-SecurityInformation.c	\
+	DL-Forwarding.c	\
+	DL-NAS-MAC.c	\
+	Direct-Forwarding-Path-Availability.c	\
+	Data-Forwarding-Not-Possible.c	\
+	DLNASPDUDeliveryAckRequest.c	\
+	EARFCN.c	\
+	ECGIList.c	\
+	PWSfailedECGIList.c	\
+	EDT-Session.c	\
+	EmergencyAreaIDList.c	\
+	EmergencyAreaID.c	\
+	EmergencyAreaID-Broadcast.c	\
+	EmergencyAreaID-Broadcast-Item.c	\
+	EmergencyAreaID-Cancelled.c	\
+	EmergencyAreaID-Cancelled-Item.c	\
+	CompletedCellinEAI.c	\
+	CompletedCellinEAI-Item.c	\
+	ECGI-List.c	\
+	EmergencyAreaIDListForRestart.c	\
+	ENB-ID.c	\
+	En-gNB-ID.c	\
+	GERAN-Cell-ID.c	\
+	Global-ENB-ID.c	\
+	Global-en-gNB-ID.c	\
+	GUMMEIList.c	\
+	ENB-StatusTransfer-TransparentContainer.c	\
+	ENB-UE-S1AP-ID.c	\
+	ENBname.c	\
+	ENBX2TLAs.c	\
+	EncryptionAlgorithms.c	\
+	EN-DCSONConfigurationTransfer.c	\
+	EN-DCSONTransferType.c	\
+	EN-DCTransferTypeRequest.c	\
+	EN-DCTransferTypeReply.c	\
+	EN-DCSONeNBIdentification.c	\
+	EN-DCSONengNBIdentification.c	\
+	EndIndication.c	\
+	EnhancedCoverageRestricted.c	\
+	CE-ModeBRestricted.c	\
+	EPLMNs.c	\
+	EventType.c	\
+	E-RAB-ID.c	\
+	E-RABInformationList.c	\
+	E-RABInformationListItem.c	\
+	E-RABList.c	\
+	E-RABItem.c	\
+	E-RABLevelQoSParameters.c	\
+	E-RABUsageReportList.c	\
+	E-RABUsageReportItem.c	\
+	EUTRAN-CGI.c	\
+	EUTRANRoundTripDelayEstimationInfo.c	\
+	ExpectedUEBehaviour.c	\
+	ExpectedUEActivityBehaviour.c	\
+	ExpectedActivityPeriod.c	\
+	ExpectedIdlePeriod.c	\
+	SourceOfUEActivityBehaviourInformation.c	\
+	ExpectedHOInterval.c	\
+	ExtendedBitRate.c	\
+	ExtendedRNC-ID.c	\
+	ExtendedRepetitionPeriod.c	\
+	Extended-UEIdentityIndexValue.c	\
+	FiveGSTAC.c	\
+	FiveGSTAI.c	\
+	ForbiddenInterRATs.c	\
+	ForbiddenTAs.c	\
+	ForbiddenTAs-Item.c	\
+	ForbiddenTACs.c	\
+	ForbiddenLAs.c	\
+	ForbiddenLAs-Item.c	\
+	ForbiddenLACs.c	\
+	GBR-QosInformation.c	\
+	GTP-TEID.c	\
+	GUMMEI.c	\
+	GUMMEIType.c	\
+	GWContextReleaseIndication.c	\
+	HandoverFlag.c	\
+	HandoverRestrictionList.c	\
+	HandoverType.c	\
+	HFN.c	\
+	HFNModified.c	\
+	HFNforPDCP-SNlength18.c	\
+	Masked-IMEISV.c	\
+	ImmediateMDT.c	\
+	IMSI.c	\
+	InformationOnRecommendedCellsAndENBsForPaging.c	\
+	IntegrityProtectionAlgorithms.c	\
+	IntendedNumberOfPagingAttempts.c	\
+	InterfacesToTrace.c	\
+	IMSvoiceEPSfallbackfrom5G.c	\
+	KillAllWarningMessages.c	\
+	LAC.c	\
+	LAI.c	\
+	LastVisitedCell-Item.c	\
+	LastVisitedEUTRANCellInformation.c	\
+	LastVisitedNGRANCellInformation.c	\
+	LastVisitedUTRANCellInformation.c	\
+	LastVisitedGERANCellInformation.c	\
+	L3-Information.c	\
+	LPPa-PDU.c	\
+	LHN-ID.c	\
+	Links-to-log.c	\
+	ListeningSubframePattern.c	\
+	LoggedMDT.c	\
+	LoggingInterval.c	\
+	LoggingDuration.c	\
+	LoggedMBSFNMDT.c	\
+	LTE-M-Indication.c	\
+	M3Configuration.c	\
+	M3period.c	\
+	M4Configuration.c	\
+	M4period.c	\
+	M5Configuration.c	\
+	M5period.c	\
+	M6Configuration.c	\
+	M6report-Interval.c	\
+	M6delay-threshold.c	\
+	M7Configuration.c	\
+	M7period.c	\
+	MDT-Activation.c	\
+	MDT-Location-Info.c	\
+	MDT-Configuration.c	\
+	ManagementBasedMDTAllowed.c	\
+	MBSFN-ResultToLog.c	\
+	MBSFN-ResultToLogInfo.c	\
+	MDTPLMNList.c	\
+	PrivacyIndicator.c	\
+	MDTMode.c	\
+	MDTMode-Extension.c	\
+	MeasurementsToActivate.c	\
+	MeasurementThresholdA2.c	\
+	MessageIdentifier.c	\
+	MobilityInformation.c	\
+	MMEname.c	\
+	MMEPagingTarget.c	\
+	MMERelaySupportIndicator.c	\
+	MME-Group-ID.c	\
+	MME-Code.c	\
+	MME-UE-S1AP-ID.c	\
+	M-TMSI.c	\
+	MSClassmark2.c	\
+	MSClassmark3.c	\
+	MutingAvailabilityIndication.c	\
+	MutingPatternInformation.c	\
+	NAS-PDU.c	\
+	NASSecurityParametersfromE-UTRAN.c	\
+	NASSecurityParameterstoE-UTRAN.c	\
+	NB-IoT-DefaultPagingDRX.c	\
+	NB-IoT-Paging-eDRXInformation.c	\
+	NB-IoT-Paging-eDRX-Cycle.c	\
+	NB-IoT-PagingTimeWindow.c	\
+	NB-IoT-UEIdentityIndexValue.c	\
+	NextPagingAreaScope.c	\
+	NRCellIdentity.c	\
+	NR-CGI.c	\
+	NRencryptionAlgorithms.c	\
+	NRintegrityProtectionAlgorithms.c	\
+	NRrestrictioninEPSasSecondaryRAT.c	\
+	NRrestrictionin5GS.c	\
+	NRUESecurityCapabilities.c	\
+	NumberofBroadcastRequest.c	\
+	NumberOfBroadcasts.c	\
+	OldBSS-ToNewBSS-Information.c	\
+	OverloadAction.c	\
+	OverloadResponse.c	\
+	Packet-LossRate.c	\
+	PagingAttemptInformation.c	\
+	PagingAttemptCount.c	\
+	Paging-eDRXInformation.c	\
+	Paging-eDRX-Cycle.c	\
+	PagingTimeWindow.c	\
+	PagingDRX.c	\
+	PagingPriority.c	\
+	PDCP-SN.c	\
+	PDCP-SNExtended.c	\
+	PDCP-SNlength18.c	\
+	PendingDataIndication.c	\
+	M1PeriodicReporting.c	\
+	PLMNidentity.c	\
+	PLMNAreaBasedQMC.c	\
+	PLMNListforQMC.c	\
+	Port-Number.c	\
+	Pre-emptionCapability.c	\
+	Pre-emptionVulnerability.c	\
+	PriorityLevel.c	\
+	ProSeAuthorized.c	\
+	ProSeDirectDiscovery.c	\
+	ProSeUEtoNetworkRelaying.c	\
+	ProSeDirectCommunication.c	\
+	PS-ServiceNotAvailable.c	\
+	PSCellInformation.c	\
+	QCI.c	\
+	ReceiveStatusofULPDCPSDUs.c	\
+	ReceiveStatusOfULPDCPSDUsExtended.c	\
+	ReceiveStatusOfULPDCPSDUsPDCP-SNlength18.c	\
+	RecommendedCellsForPaging.c	\
+	RecommendedCellList.c	\
+	RecommendedCellItem.c	\
+	RecommendedENBsForPaging.c	\
+	RecommendedENBList.c	\
+	RecommendedENBItem.c	\
+	RelativeMMECapacity.c	\
+	RelayNode-Indicator.c	\
+	RAC.c	\
+	RAT-Type.c	\
+	ReportAmountMDT.c	\
+	ReportIntervalMDT.c	\
+	M1ReportingTrigger.c	\
+	RequestType.c	\
+	RequestTypeAdditionalInfo.c	\
+	RIMTransfer.c	\
+	RIMInformation.c	\
+	RIMRoutingAddress.c	\
+	ReportArea.c	\
+	RepetitionPeriod.c	\
+	RLFReportInformation.c	\
+	RNC-ID.c	\
+	RRC-Container.c	\
+	RRC-Establishment-Cause.c	\
+	ECGIListForRestart.c	\
+	Routing-ID.c	\
+	SecurityKey.c	\
+	SecurityContext.c	\
+	SecondaryRATType.c	\
+	SecondaryRATDataUsageRequest.c	\
+	SecondaryRATDataUsageReportList.c	\
+	SecondaryRATDataUsageReportItem.c	\
+	SerialNumber.c	\
+	ServiceType.c	\
+	SONInformation.c	\
+	SONInformation-Extension.c	\
+	SONInformationRequest.c	\
+	SONInformationReply.c	\
+	SONInformationReport.c	\
+	SONConfigurationTransfer.c	\
+	SynchronisationInformation.c	\
+	Source-ToTarget-TransparentContainer.c	\
+	SourceBSS-ToTargetBSS-TransparentContainer.c	\
+	SourceeNB-ID.c	\
+	SRVCCOperationNotPossible.c	\
+	SRVCCOperationPossible.c	\
+	SRVCCHOIndication.c	\
+	SourceeNB-ToTargeteNB-TransparentContainer.c	\
+	SourceRNC-ToTargetRNC-TransparentContainer.c	\
+	SourceNgRanNode-ToTargetNgRanNode-TransparentContainer.c	\
+	ServedGUMMEIs.c	\
+	ServedGUMMEIsItem.c	\
+	ServedGroupIDs.c	\
+	ServedMMECs.c	\
+	ServedPLMNs.c	\
+	SubscriberProfileIDforRFP.c	\
+	Subscription-Based-UE-DifferentiationInfo.c	\
+	ScheduledCommunicationTime.c	\
+	SupportedTAs.c	\
+	SupportedTAs-Item.c	\
+	StratumLevel.c	\
+	SynchronisationStatus.c	\
+	TimeSynchronisationInfo.c	\
+	S-TMSI.c	\
+	TAC.c	\
+	TAIBasedMDT.c	\
+	TAIListforMDT.c	\
+	TAIListforWarning.c	\
+	TAI.c	\
+	TAI-Broadcast.c	\
+	TAI-Broadcast-Item.c	\
+	TAI-Cancelled.c	\
+	TAI-Cancelled-Item.c	\
+	TABasedMDT.c	\
+	TAListforMDT.c	\
+	TABasedQMC.c	\
+	TAListforQMC.c	\
+	TAIBasedQMC.c	\
+	TAIListforQMC.c	\
+	CompletedCellinTAI.c	\
+	CompletedCellinTAI-Item.c	\
+	TBCD-STRING.c	\
+	TargetID.c	\
+	TargeteNB-ID.c	\
+	TargetRNC-ID.c	\
+	TargetNgRanNode-ID.c	\
+	Global-RAN-NODE-ID.c	\
+	GNB.c	\
+	Global-GNB-ID.c	\
+	GNB-Identity.c	\
+	NG-eNB.c	\
+	GNB-ID.c	\
+	TargeteNB-ToSourceeNB-TransparentContainer.c	\
+	Target-ToSource-TransparentContainer.c	\
+	TargetRNC-ToSourceRNC-TransparentContainer.c	\
+	TargetBSS-ToSourceBSS-TransparentContainer.c	\
+	TargetNgRanNode-ToSourceNgRanNode-TransparentContainer.c	\
+	M1ThresholdEventA2.c	\
+	Threshold-RSRP.c	\
+	Threshold-RSRQ.c	\
+	TimeToWait.c	\
+	Time-UE-StayedInCell.c	\
+	Time-UE-StayedInCell-EnhancedGranularity.c	\
+	TimeSinceSecondaryNodeRelease.c	\
+	TransportInformation.c	\
+	TransportLayerAddress.c	\
+	TraceActivation.c	\
+	TraceDepth.c	\
+	E-UTRAN-Trace-ID.c	\
+	TrafficLoadReductionIndication.c	\
+	TunnelInformation.c	\
+	TypeOfError.c	\
+	TAIListForRestart.c	\
+	UEAggregateMaximumBitrate.c	\
+	UEAppLayerMeasConfig.c	\
+	UECapabilityInfoRequest.c	\
+	UE-RetentionInformation.c	\
+	UE-S1AP-IDs.c	\
+	UE-S1AP-ID-pair.c	\
+	UE-associatedLogicalS1-ConnectionItem.c	\
+	UEIdentityIndexValue.c	\
+	UE-HistoryInformation.c	\
+	UE-HistoryInformationFromTheUE.c	\
+	UEPagingID.c	\
+	UERadioCapability.c	\
+	UERadioCapabilityForPaging.c	\
+	UE-RLF-Report-Container.c	\
+	UE-RLF-Report-Container-for-extended-bands.c	\
+	UESecurityCapabilities.c	\
+	UESidelinkAggregateMaximumBitrate.c	\
+	UE-Usage-Type.c	\
+	UL-CP-SecurityInformation.c	\
+	UL-NAS-MAC.c	\
+	UL-NAS-Count.c	\
+	UnlicensedSpectrumRestriction.c	\
+	UserLocationInformation.c	\
+	UEUserPlaneCIoTSupportIndicator.c	\
+	UE-Application-Layer-Measurement-Capability.c	\
+	VoiceSupportMatchIndicator.c	\
+	V2XServicesAuthorized.c	\
+	VehicleUE.c	\
+	PedestrianUE.c	\
+	WarningAreaCoordinates.c	\
+	WarningAreaList.c	\
+	WarningType.c	\
+	WarningSecurityInfo.c	\
+	WarningMessageContents.c	\
+	WLANMeasurementConfiguration.c	\
+	WLANMeasConfigNameList.c	\
+	WLANMeasConfig.c	\
+	WLANName.c	\
+	X2TNLConfigurationInfo.c	\
+	ENBX2ExtTLAs.c	\
+	ENBX2ExtTLA.c	\
+	ENBX2GTPTLAs.c	\
+	ENBIndirectX2TransportLayerAddresses.c	\
+	E-RAB-IE-ContainerList.c	\
+	E-RAB-IE-ContainerPairList.c	\
+	ProtocolError-IE-ContainerList.c	\
+	HandoverRequired.c	\
+	HandoverCommand.c	\
+	E-RABSubjecttoDataForwardingList.c	\
+	E-RABDataForwardingItem.c	\
+	HandoverPreparationFailure.c	\
+	HandoverRequest.c	\
+	E-RABToBeSetupListHOReq.c	\
+	E-RABToBeSetupItemHOReq.c	\
+	HandoverRequestAcknowledge.c	\
+	E-RABAdmittedList.c	\
+	E-RABAdmittedItem.c	\
+	E-RABFailedtoSetupListHOReqAck.c	\
+	E-RABFailedToSetupItemHOReqAck.c	\
+	HandoverFailure.c	\
+	HandoverNotify.c	\
+	PathSwitchRequest.c	\
+	E-RABToBeSwitchedDLList.c	\
+	E-RABToBeSwitchedDLItem.c	\
+	PathSwitchRequestAcknowledge.c	\
+	E-RABToBeSwitchedULList.c	\
+	E-RABToBeSwitchedULItem.c	\
+	PathSwitchRequestFailure.c	\
+	HandoverCancel.c	\
+	HandoverCancelAcknowledge.c	\
+	E-RABSetupRequest.c	\
+	E-RABToBeSetupListBearerSUReq.c	\
+	E-RABToBeSetupItemBearerSUReq.c	\
+	E-RABSetupResponse.c	\
+	E-RABSetupListBearerSURes.c	\
+	E-RABSetupItemBearerSURes.c	\
+	E-RABModifyRequest.c	\
+	E-RABToBeModifiedListBearerModReq.c	\
+	E-RABToBeModifiedItemBearerModReq.c	\
+	E-RABModifyResponse.c	\
+	E-RABModifyListBearerModRes.c	\
+	E-RABModifyItemBearerModRes.c	\
+	E-RABReleaseCommand.c	\
+	E-RABReleaseResponse.c	\
+	E-RABReleaseListBearerRelComp.c	\
+	E-RABReleaseItemBearerRelComp.c	\
+	E-RABReleaseIndication.c	\
+	InitialContextSetupRequest.c	\
+	E-RABToBeSetupListCtxtSUReq.c	\
+	E-RABToBeSetupItemCtxtSUReq.c	\
+	InitialContextSetupResponse.c	\
+	E-RABSetupListCtxtSURes.c	\
+	E-RABSetupItemCtxtSURes.c	\
+	InitialContextSetupFailure.c	\
+	Paging.c	\
+	TAIList.c	\
+	TAIItem.c	\
+	UEContextReleaseRequest.c	\
+	UEContextReleaseCommand.c	\
+	UEContextReleaseComplete.c	\
+	UEContextModificationRequest.c	\
+	UEContextModificationResponse.c	\
+	UEContextModificationFailure.c	\
+	UERadioCapabilityMatchRequest.c	\
+	UERadioCapabilityMatchResponse.c	\
+	DownlinkNASTransport.c	\
+	InitialUEMessage.c	\
+	UplinkNASTransport.c	\
+	NASNonDeliveryIndication.c	\
+	RerouteNASRequest.c	\
+	NASDeliveryIndication.c	\
+	Reset.c	\
+	ResetType.c	\
+	ResetAll.c	\
+	UE-associatedLogicalS1-ConnectionListRes.c	\
+	ResetAcknowledge.c	\
+	UE-associatedLogicalS1-ConnectionListResAck.c	\
+	ErrorIndication.c	\
+	S1SetupRequest.c	\
+	S1SetupResponse.c	\
+	S1SetupFailure.c	\
+	ENBConfigurationUpdate.c	\
+	ENBConfigurationUpdateAcknowledge.c	\
+	ENBConfigurationUpdateFailure.c	\
+	MMEConfigurationUpdate.c	\
+	MMEConfigurationUpdateAcknowledge.c	\
+	MMEConfigurationUpdateFailure.c	\
+	DownlinkS1cdma2000tunnelling.c	\
+	UplinkS1cdma2000tunnelling.c	\
+	UECapabilityInfoIndication.c	\
+	ENBStatusTransfer.c	\
+	MMEStatusTransfer.c	\
+	TraceStart.c	\
+	TraceFailureIndication.c	\
+	DeactivateTrace.c	\
+	CellTrafficTrace.c	\
+	LocationReportingControl.c	\
+	LocationReportingFailureIndication.c	\
+	LocationReport.c	\
+	OverloadStart.c	\
+	OverloadStop.c	\
+	WriteReplaceWarningRequest.c	\
+	WriteReplaceWarningResponse.c	\
+	ENBDirectInformationTransfer.c	\
+	Inter-SystemInformationTransferType.c	\
+	MMEDirectInformationTransfer.c	\
+	ENBConfigurationTransfer.c	\
+	MMEConfigurationTransfer.c	\
+	PrivateMessage.c	\
+	KillRequest.c	\
+	KillResponse.c	\
+	PWSRestartIndication.c	\
+	PWSFailureIndication.c	\
+	DownlinkUEAssociatedLPPaTransport.c	\
+	UplinkUEAssociatedLPPaTransport.c	\
+	DownlinkNonUEAssociatedLPPaTransport.c	\
+	UplinkNonUEAssociatedLPPaTransport.c	\
+	E-RABModificationIndication.c	\
+	E-RABToBeModifiedListBearerModInd.c	\
+	E-RABToBeModifiedItemBearerModInd.c	\
+	E-RABNotToBeModifiedListBearerModInd.c	\
+	E-RABNotToBeModifiedItemBearerModInd.c	\
+	CSGMembershipInfo.c	\
+	E-RABModificationConfirm.c	\
+	E-RABModifyListBearerModConf.c	\
+	E-RABModifyItemBearerModConf.c	\
+	UEContextModificationIndication.c	\
+	UEContextModificationConfirm.c	\
+	UEContextSuspendRequest.c	\
+	UEContextSuspendResponse.c	\
+	UEContextResumeRequest.c	\
+	E-RABFailedToResumeListResumeReq.c	\
+	E-RABFailedToResumeItemResumeReq.c	\
+	UEContextResumeResponse.c	\
+	E-RABFailedToResumeListResumeRes.c	\
+	E-RABFailedToResumeItemResumeRes.c	\
+	UEContextResumeFailure.c	\
+	ConnectionEstablishmentIndication.c	\
+	RetrieveUEInformation.c	\
+	UEInformationTransfer.c	\
+	ENBCPRelocationIndication.c	\
+	MMECPRelocationIndication.c	\
+	SecondaryRATDataUsageReport.c	\
+	S1AP-PDU.c	\
+	InitiatingMessage.c	\
+	SuccessfulOutcome.c	\
+	UnsuccessfulOutcome.c	\
+	EXTERNAL.c
+
+ASN_MODULE_HDRS=	\
+	Criticality.h	\
+	Presence.h	\
+	PrivateIE-ID.h	\
+	ProcedureCode.h	\
+	ProtocolExtensionID.h	\
+	ProtocolIE-ID.h	\
+	TriggeringMessage.h	\
+	ProtocolIE-Container.h	\
+	ProtocolIE-SingleContainer.h	\
+	ProtocolIE-Field.h	\
+	ProtocolIE-ContainerPair.h	\
+	ProtocolIE-FieldPair.h	\
+	ProtocolIE-ContainerList.h	\
+	ProtocolIE-ContainerPairList.h	\
+	ProtocolExtensionContainer.h	\
+	ProtocolExtensionField.h	\
+	PrivateIE-Container.h	\
+	PrivateIE-Field.h	\
+	Additional-GUTI.h	\
+	AerialUEsubscriptionInformation.h	\
+	AreaScopeOfMDT.h	\
+	AreaScopeOfQMC.h	\
+	AllocationAndRetentionPriority.h	\
+	AssistanceDataForCECapableUEs.h	\
+	AssistanceDataForPaging.h	\
+	AssistanceDataForRecommendedCells.h	\
+	Bearers-SubjectToStatusTransferList.h	\
+	Bearers-SubjectToStatusTransfer-Item.h	\
+	BearerType.h	\
+	BitRate.h	\
+	BluetoothMeasurementConfiguration.h	\
+	BluetoothMeasConfigNameList.h	\
+	BluetoothMeasConfig.h	\
+	BluetoothName.h	\
+	BPLMNs.h	\
+	BroadcastCancelledAreaList.h	\
+	BroadcastCompletedAreaList.h	\
+	CancelledCellinEAI.h	\
+	CancelledCellinEAI-Item.h	\
+	CancelledCellinTAI.h	\
+	CancelledCellinTAI-Item.h	\
+	Cause.h	\
+	CauseMisc.h	\
+	CauseProtocol.h	\
+	CauseRadioNetwork.h	\
+	CauseTransport.h	\
+	CauseNas.h	\
+	CellAccessMode.h	\
+	CellIdentifierAndCELevelForCECapableUEs.h	\
+	CELevel.h	\
+	CE-mode-B-SupportIndicator.h	\
+	CellIdentity.h	\
+	CellID-Broadcast.h	\
+	CellID-Broadcast-Item.h	\
+	CellID-Cancelled.h	\
+	CellID-Cancelled-Item.h	\
+	CellBasedMDT.h	\
+	CellIdListforMDT.h	\
+	CellBasedQMC.h	\
+	CellIdListforQMC.h	\
+	Cdma2000PDU.h	\
+	Cdma2000RATType.h	\
+	Cdma2000SectorID.h	\
+	Cdma2000HOStatus.h	\
+	Cdma2000HORequiredIndication.h	\
+	Cdma2000OneXSRVCCInfo.h	\
+	Cdma2000OneXMEID.h	\
+	Cdma2000OneXMSI.h	\
+	Cdma2000OneXPilot.h	\
+	Cdma2000OneXRAND.h	\
+	Cell-Size.h	\
+	CellType.h	\
+	CGI.h	\
+	CI.h	\
+	CNDomain.h	\
+	CNTypeRestrictions.h	\
+	CNTypeRestrictions-Item.h	\
+	CNType.h	\
+	ConcurrentWarningMessageIndicator.h	\
+	ConnectedengNBList.h	\
+	ConnectedengNBItem.h	\
+	Correlation-ID.h	\
+	CSFallbackIndicator.h	\
+	AdditionalCSFallbackIndicator.h	\
+	CSG-Id.h	\
+	CSG-IdList.h	\
+	CSG-IdList-Item.h	\
+	CSGMembershipStatus.h	\
+	COUNTvalue.h	\
+	COUNTValueExtended.h	\
+	COUNTvaluePDCP-SNlength18.h	\
+	Coverage-Level.h	\
+	CriticalityDiagnostics.h	\
+	CriticalityDiagnostics-IE-List.h	\
+	CriticalityDiagnostics-IE-Item.h	\
+	DataCodingScheme.h	\
+	DCN-ID.h	\
+	ServedDCNs.h	\
+	ServedDCNsItem.h	\
+	DL-CP-SecurityInformation.h	\
+	DL-Forwarding.h	\
+	DL-NAS-MAC.h	\
+	Direct-Forwarding-Path-Availability.h	\
+	Data-Forwarding-Not-Possible.h	\
+	DLNASPDUDeliveryAckRequest.h	\
+	EARFCN.h	\
+	ECGIList.h	\
+	PWSfailedECGIList.h	\
+	EDT-Session.h	\
+	EmergencyAreaIDList.h	\
+	EmergencyAreaID.h	\
+	EmergencyAreaID-Broadcast.h	\
+	EmergencyAreaID-Broadcast-Item.h	\
+	EmergencyAreaID-Cancelled.h	\
+	EmergencyAreaID-Cancelled-Item.h	\
+	CompletedCellinEAI.h	\
+	CompletedCellinEAI-Item.h	\
+	ECGI-List.h	\
+	EmergencyAreaIDListForRestart.h	\
+	ENB-ID.h	\
+	En-gNB-ID.h	\
+	GERAN-Cell-ID.h	\
+	Global-ENB-ID.h	\
+	Global-en-gNB-ID.h	\
+	GUMMEIList.h	\
+	ENB-StatusTransfer-TransparentContainer.h	\
+	ENB-UE-S1AP-ID.h	\
+	ENBname.h	\
+	ENBX2TLAs.h	\
+	EncryptionAlgorithms.h	\
+	EN-DCSONConfigurationTransfer.h	\
+	EN-DCSONTransferType.h	\
+	EN-DCTransferTypeRequest.h	\
+	EN-DCTransferTypeReply.h	\
+	EN-DCSONeNBIdentification.h	\
+	EN-DCSONengNBIdentification.h	\
+	EndIndication.h	\
+	EnhancedCoverageRestricted.h	\
+	CE-ModeBRestricted.h	\
+	EPLMNs.h	\
+	EventType.h	\
+	E-RAB-ID.h	\
+	E-RABInformationList.h	\
+	E-RABInformationListItem.h	\
+	E-RABList.h	\
+	E-RABItem.h	\
+	E-RABLevelQoSParameters.h	\
+	E-RABUsageReportList.h	\
+	E-RABUsageReportItem.h	\
+	EUTRAN-CGI.h	\
+	EUTRANRoundTripDelayEstimationInfo.h	\
+	ExpectedUEBehaviour.h	\
+	ExpectedUEActivityBehaviour.h	\
+	ExpectedActivityPeriod.h	\
+	ExpectedIdlePeriod.h	\
+	SourceOfUEActivityBehaviourInformation.h	\
+	ExpectedHOInterval.h	\
+	ExtendedBitRate.h	\
+	ExtendedRNC-ID.h	\
+	ExtendedRepetitionPeriod.h	\
+	Extended-UEIdentityIndexValue.h	\
+	FiveGSTAC.h	\
+	FiveGSTAI.h	\
+	ForbiddenInterRATs.h	\
+	ForbiddenTAs.h	\
+	ForbiddenTAs-Item.h	\
+	ForbiddenTACs.h	\
+	ForbiddenLAs.h	\
+	ForbiddenLAs-Item.h	\
+	ForbiddenLACs.h	\
+	GBR-QosInformation.h	\
+	GTP-TEID.h	\
+	GUMMEI.h	\
+	GUMMEIType.h	\
+	GWContextReleaseIndication.h	\
+	HandoverFlag.h	\
+	HandoverRestrictionList.h	\
+	HandoverType.h	\
+	HFN.h	\
+	HFNModified.h	\
+	HFNforPDCP-SNlength18.h	\
+	Masked-IMEISV.h	\
+	ImmediateMDT.h	\
+	IMSI.h	\
+	InformationOnRecommendedCellsAndENBsForPaging.h	\
+	IntegrityProtectionAlgorithms.h	\
+	IntendedNumberOfPagingAttempts.h	\
+	InterfacesToTrace.h	\
+	IMSvoiceEPSfallbackfrom5G.h	\
+	KillAllWarningMessages.h	\
+	LAC.h	\
+	LAI.h	\
+	LastVisitedCell-Item.h	\
+	LastVisitedEUTRANCellInformation.h	\
+	LastVisitedNGRANCellInformation.h	\
+	LastVisitedUTRANCellInformation.h	\
+	LastVisitedGERANCellInformation.h	\
+	L3-Information.h	\
+	LPPa-PDU.h	\
+	LHN-ID.h	\
+	Links-to-log.h	\
+	ListeningSubframePattern.h	\
+	LoggedMDT.h	\
+	LoggingInterval.h	\
+	LoggingDuration.h	\
+	LoggedMBSFNMDT.h	\
+	LTE-M-Indication.h	\
+	M3Configuration.h	\
+	M3period.h	\
+	M4Configuration.h	\
+	M4period.h	\
+	M5Configuration.h	\
+	M5period.h	\
+	M6Configuration.h	\
+	M6report-Interval.h	\
+	M6delay-threshold.h	\
+	M7Configuration.h	\
+	M7period.h	\
+	MDT-Activation.h	\
+	MDT-Location-Info.h	\
+	MDT-Configuration.h	\
+	ManagementBasedMDTAllowed.h	\
+	MBSFN-ResultToLog.h	\
+	MBSFN-ResultToLogInfo.h	\
+	MDTPLMNList.h	\
+	PrivacyIndicator.h	\
+	MDTMode.h	\
+	MDTMode-Extension.h	\
+	MeasurementsToActivate.h	\
+	MeasurementThresholdA2.h	\
+	MessageIdentifier.h	\
+	MobilityInformation.h	\
+	MMEname.h	\
+	MMEPagingTarget.h	\
+	MMERelaySupportIndicator.h	\
+	MME-Group-ID.h	\
+	MME-Code.h	\
+	MME-UE-S1AP-ID.h	\
+	M-TMSI.h	\
+	MSClassmark2.h	\
+	MSClassmark3.h	\
+	MutingAvailabilityIndication.h	\
+	MutingPatternInformation.h	\
+	NAS-PDU.h	\
+	NASSecurityParametersfromE-UTRAN.h	\
+	NASSecurityParameterstoE-UTRAN.h	\
+	NB-IoT-DefaultPagingDRX.h	\
+	NB-IoT-Paging-eDRXInformation.h	\
+	NB-IoT-Paging-eDRX-Cycle.h	\
+	NB-IoT-PagingTimeWindow.h	\
+	NB-IoT-UEIdentityIndexValue.h	\
+	NextPagingAreaScope.h	\
+	NRCellIdentity.h	\
+	NR-CGI.h	\
+	NRencryptionAlgorithms.h	\
+	NRintegrityProtectionAlgorithms.h	\
+	NRrestrictioninEPSasSecondaryRAT.h	\
+	NRrestrictionin5GS.h	\
+	NRUESecurityCapabilities.h	\
+	NumberofBroadcastRequest.h	\
+	NumberOfBroadcasts.h	\
+	OldBSS-ToNewBSS-Information.h	\
+	OverloadAction.h	\
+	OverloadResponse.h	\
+	Packet-LossRate.h	\
+	PagingAttemptInformation.h	\
+	PagingAttemptCount.h	\
+	Paging-eDRXInformation.h	\
+	Paging-eDRX-Cycle.h	\
+	PagingTimeWindow.h	\
+	PagingDRX.h	\
+	PagingPriority.h	\
+	PDCP-SN.h	\
+	PDCP-SNExtended.h	\
+	PDCP-SNlength18.h	\
+	PendingDataIndication.h	\
+	M1PeriodicReporting.h	\
+	PLMNidentity.h	\
+	PLMNAreaBasedQMC.h	\
+	PLMNListforQMC.h	\
+	Port-Number.h	\
+	Pre-emptionCapability.h	\
+	Pre-emptionVulnerability.h	\
+	PriorityLevel.h	\
+	ProSeAuthorized.h	\
+	ProSeDirectDiscovery.h	\
+	ProSeUEtoNetworkRelaying.h	\
+	ProSeDirectCommunication.h	\
+	PS-ServiceNotAvailable.h	\
+	PSCellInformation.h	\
+	QCI.h	\
+	ReceiveStatusofULPDCPSDUs.h	\
+	ReceiveStatusOfULPDCPSDUsExtended.h	\
+	ReceiveStatusOfULPDCPSDUsPDCP-SNlength18.h	\
+	RecommendedCellsForPaging.h	\
+	RecommendedCellList.h	\
+	RecommendedCellItem.h	\
+	RecommendedENBsForPaging.h	\
+	RecommendedENBList.h	\
+	RecommendedENBItem.h	\
+	RelativeMMECapacity.h	\
+	RelayNode-Indicator.h	\
+	RAC.h	\
+	RAT-Type.h	\
+	ReportAmountMDT.h	\
+	ReportIntervalMDT.h	\
+	M1ReportingTrigger.h	\
+	RequestType.h	\
+	RequestTypeAdditionalInfo.h	\
+	RIMTransfer.h	\
+	RIMInformation.h	\
+	RIMRoutingAddress.h	\
+	ReportArea.h	\
+	RepetitionPeriod.h	\
+	RLFReportInformation.h	\
+	RNC-ID.h	\
+	RRC-Container.h	\
+	RRC-Establishment-Cause.h	\
+	ECGIListForRestart.h	\
+	Routing-ID.h	\
+	SecurityKey.h	\
+	SecurityContext.h	\
+	SecondaryRATType.h	\
+	SecondaryRATDataUsageRequest.h	\
+	SecondaryRATDataUsageReportList.h	\
+	SecondaryRATDataUsageReportItem.h	\
+	SerialNumber.h	\
+	ServiceType.h	\
+	SONInformation.h	\
+	SONInformation-Extension.h	\
+	SONInformationRequest.h	\
+	SONInformationReply.h	\
+	SONInformationReport.h	\
+	SONConfigurationTransfer.h	\
+	SynchronisationInformation.h	\
+	Source-ToTarget-TransparentContainer.h	\
+	SourceBSS-ToTargetBSS-TransparentContainer.h	\
+	SourceeNB-ID.h	\
+	SRVCCOperationNotPossible.h	\
+	SRVCCOperationPossible.h	\
+	SRVCCHOIndication.h	\
+	SourceeNB-ToTargeteNB-TransparentContainer.h	\
+	SourceRNC-ToTargetRNC-TransparentContainer.h	\
+	SourceNgRanNode-ToTargetNgRanNode-TransparentContainer.h	\
+	ServedGUMMEIs.h	\
+	ServedGUMMEIsItem.h	\
+	ServedGroupIDs.h	\
+	ServedMMECs.h	\
+	ServedPLMNs.h	\
+	SubscriberProfileIDforRFP.h	\
+	Subscription-Based-UE-DifferentiationInfo.h	\
+	ScheduledCommunicationTime.h	\
+	SupportedTAs.h	\
+	SupportedTAs-Item.h	\
+	StratumLevel.h	\
+	SynchronisationStatus.h	\
+	TimeSynchronisationInfo.h	\
+	S-TMSI.h	\
+	TAC.h	\
+	TAIBasedMDT.h	\
+	TAIListforMDT.h	\
+	TAIListforWarning.h	\
+	TAI.h	\
+	TAI-Broadcast.h	\
+	TAI-Broadcast-Item.h	\
+	TAI-Cancelled.h	\
+	TAI-Cancelled-Item.h	\
+	TABasedMDT.h	\
+	TAListforMDT.h	\
+	TABasedQMC.h	\
+	TAListforQMC.h	\
+	TAIBasedQMC.h	\
+	TAIListforQMC.h	\
+	CompletedCellinTAI.h	\
+	CompletedCellinTAI-Item.h	\
+	TBCD-STRING.h	\
+	TargetID.h	\
+	TargeteNB-ID.h	\
+	TargetRNC-ID.h	\
+	TargetNgRanNode-ID.h	\
+	Global-RAN-NODE-ID.h	\
+	GNB.h	\
+	Global-GNB-ID.h	\
+	GNB-Identity.h	\
+	NG-eNB.h	\
+	GNB-ID.h	\
+	TargeteNB-ToSourceeNB-TransparentContainer.h	\
+	Target-ToSource-TransparentContainer.h	\
+	TargetRNC-ToSourceRNC-TransparentContainer.h	\
+	TargetBSS-ToSourceBSS-TransparentContainer.h	\
+	TargetNgRanNode-ToSourceNgRanNode-TransparentContainer.h	\
+	M1ThresholdEventA2.h	\
+	Threshold-RSRP.h	\
+	Threshold-RSRQ.h	\
+	TimeToWait.h	\
+	Time-UE-StayedInCell.h	\
+	Time-UE-StayedInCell-EnhancedGranularity.h	\
+	TimeSinceSecondaryNodeRelease.h	\
+	TransportInformation.h	\
+	TransportLayerAddress.h	\
+	TraceActivation.h	\
+	TraceDepth.h	\
+	E-UTRAN-Trace-ID.h	\
+	TrafficLoadReductionIndication.h	\
+	TunnelInformation.h	\
+	TypeOfError.h	\
+	TAIListForRestart.h	\
+	UEAggregateMaximumBitrate.h	\
+	UEAppLayerMeasConfig.h	\
+	UECapabilityInfoRequest.h	\
+	UE-RetentionInformation.h	\
+	UE-S1AP-IDs.h	\
+	UE-S1AP-ID-pair.h	\
+	UE-associatedLogicalS1-ConnectionItem.h	\
+	UEIdentityIndexValue.h	\
+	UE-HistoryInformation.h	\
+	UE-HistoryInformationFromTheUE.h	\
+	UEPagingID.h	\
+	UERadioCapability.h	\
+	UERadioCapabilityForPaging.h	\
+	UE-RLF-Report-Container.h	\
+	UE-RLF-Report-Container-for-extended-bands.h	\
+	UESecurityCapabilities.h	\
+	UESidelinkAggregateMaximumBitrate.h	\
+	UE-Usage-Type.h	\
+	UL-CP-SecurityInformation.h	\
+	UL-NAS-MAC.h	\
+	UL-NAS-Count.h	\
+	UnlicensedSpectrumRestriction.h	\
+	UserLocationInformation.h	\
+	UEUserPlaneCIoTSupportIndicator.h	\
+	UE-Application-Layer-Measurement-Capability.h	\
+	VoiceSupportMatchIndicator.h	\
+	V2XServicesAuthorized.h	\
+	VehicleUE.h	\
+	PedestrianUE.h	\
+	WarningAreaCoordinates.h	\
+	WarningAreaList.h	\
+	WarningType.h	\
+	WarningSecurityInfo.h	\
+	WarningMessageContents.h	\
+	WLANMeasurementConfiguration.h	\
+	WLANMeasConfigNameList.h	\
+	WLANMeasConfig.h	\
+	WLANName.h	\
+	X2TNLConfigurationInfo.h	\
+	ENBX2ExtTLAs.h	\
+	ENBX2ExtTLA.h	\
+	ENBX2GTPTLAs.h	\
+	ENBIndirectX2TransportLayerAddresses.h	\
+	E-RAB-IE-ContainerList.h	\
+	E-RAB-IE-ContainerPairList.h	\
+	ProtocolError-IE-ContainerList.h	\
+	HandoverRequired.h	\
+	HandoverCommand.h	\
+	E-RABSubjecttoDataForwardingList.h	\
+	E-RABDataForwardingItem.h	\
+	HandoverPreparationFailure.h	\
+	HandoverRequest.h	\
+	E-RABToBeSetupListHOReq.h	\
+	E-RABToBeSetupItemHOReq.h	\
+	HandoverRequestAcknowledge.h	\
+	E-RABAdmittedList.h	\
+	E-RABAdmittedItem.h	\
+	E-RABFailedtoSetupListHOReqAck.h	\
+	E-RABFailedToSetupItemHOReqAck.h	\
+	HandoverFailure.h	\
+	HandoverNotify.h	\
+	PathSwitchRequest.h	\
+	E-RABToBeSwitchedDLList.h	\
+	E-RABToBeSwitchedDLItem.h	\
+	PathSwitchRequestAcknowledge.h	\
+	E-RABToBeSwitchedULList.h	\
+	E-RABToBeSwitchedULItem.h	\
+	PathSwitchRequestFailure.h	\
+	HandoverCancel.h	\
+	HandoverCancelAcknowledge.h	\
+	E-RABSetupRequest.h	\
+	E-RABToBeSetupListBearerSUReq.h	\
+	E-RABToBeSetupItemBearerSUReq.h	\
+	E-RABSetupResponse.h	\
+	E-RABSetupListBearerSURes.h	\
+	E-RABSetupItemBearerSURes.h	\
+	E-RABModifyRequest.h	\
+	E-RABToBeModifiedListBearerModReq.h	\
+	E-RABToBeModifiedItemBearerModReq.h	\
+	E-RABModifyResponse.h	\
+	E-RABModifyListBearerModRes.h	\
+	E-RABModifyItemBearerModRes.h	\
+	E-RABReleaseCommand.h	\
+	E-RABReleaseResponse.h	\
+	E-RABReleaseListBearerRelComp.h	\
+	E-RABReleaseItemBearerRelComp.h	\
+	E-RABReleaseIndication.h	\
+	InitialContextSetupRequest.h	\
+	E-RABToBeSetupListCtxtSUReq.h	\
+	E-RABToBeSetupItemCtxtSUReq.h	\
+	InitialContextSetupResponse.h	\
+	E-RABSetupListCtxtSURes.h	\
+	E-RABSetupItemCtxtSURes.h	\
+	InitialContextSetupFailure.h	\
+	Paging.h	\
+	TAIList.h	\
+	TAIItem.h	\
+	UEContextReleaseRequest.h	\
+	UEContextReleaseCommand.h	\
+	UEContextReleaseComplete.h	\
+	UEContextModificationRequest.h	\
+	UEContextModificationResponse.h	\
+	UEContextModificationFailure.h	\
+	UERadioCapabilityMatchRequest.h	\
+	UERadioCapabilityMatchResponse.h	\
+	DownlinkNASTransport.h	\
+	InitialUEMessage.h	\
+	UplinkNASTransport.h	\
+	NASNonDeliveryIndication.h	\
+	RerouteNASRequest.h	\
+	NASDeliveryIndication.h	\
+	Reset.h	\
+	ResetType.h	\
+	ResetAll.h	\
+	UE-associatedLogicalS1-ConnectionListRes.h	\
+	ResetAcknowledge.h	\
+	UE-associatedLogicalS1-ConnectionListResAck.h	\
+	ErrorIndication.h	\
+	S1SetupRequest.h	\
+	S1SetupResponse.h	\
+	S1SetupFailure.h	\
+	ENBConfigurationUpdate.h	\
+	ENBConfigurationUpdateAcknowledge.h	\
+	ENBConfigurationUpdateFailure.h	\
+	MMEConfigurationUpdate.h	\
+	MMEConfigurationUpdateAcknowledge.h	\
+	MMEConfigurationUpdateFailure.h	\
+	DownlinkS1cdma2000tunnelling.h	\
+	UplinkS1cdma2000tunnelling.h	\
+	UECapabilityInfoIndication.h	\
+	ENBStatusTransfer.h	\
+	MMEStatusTransfer.h	\
+	TraceStart.h	\
+	TraceFailureIndication.h	\
+	DeactivateTrace.h	\
+	CellTrafficTrace.h	\
+	LocationReportingControl.h	\
+	LocationReportingFailureIndication.h	\
+	LocationReport.h	\
+	OverloadStart.h	\
+	OverloadStop.h	\
+	WriteReplaceWarningRequest.h	\
+	WriteReplaceWarningResponse.h	\
+	ENBDirectInformationTransfer.h	\
+	Inter-SystemInformationTransferType.h	\
+	MMEDirectInformationTransfer.h	\
+	ENBConfigurationTransfer.h	\
+	MMEConfigurationTransfer.h	\
+	PrivateMessage.h	\
+	KillRequest.h	\
+	KillResponse.h	\
+	PWSRestartIndication.h	\
+	PWSFailureIndication.h	\
+	DownlinkUEAssociatedLPPaTransport.h	\
+	UplinkUEAssociatedLPPaTransport.h	\
+	DownlinkNonUEAssociatedLPPaTransport.h	\
+	UplinkNonUEAssociatedLPPaTransport.h	\
+	E-RABModificationIndication.h	\
+	E-RABToBeModifiedListBearerModInd.h	\
+	E-RABToBeModifiedItemBearerModInd.h	\
+	E-RABNotToBeModifiedListBearerModInd.h	\
+	E-RABNotToBeModifiedItemBearerModInd.h	\
+	CSGMembershipInfo.h	\
+	E-RABModificationConfirm.h	\
+	E-RABModifyListBearerModConf.h	\
+	E-RABModifyItemBearerModConf.h	\
+	UEContextModificationIndication.h	\
+	UEContextModificationConfirm.h	\
+	UEContextSuspendRequest.h	\
+	UEContextSuspendResponse.h	\
+	UEContextResumeRequest.h	\
+	E-RABFailedToResumeListResumeReq.h	\
+	E-RABFailedToResumeItemResumeReq.h	\
+	UEContextResumeResponse.h	\
+	E-RABFailedToResumeListResumeRes.h	\
+	E-RABFailedToResumeItemResumeRes.h	\
+	UEContextResumeFailure.h	\
+	ConnectionEstablishmentIndication.h	\
+	RetrieveUEInformation.h	\
+	UEInformationTransfer.h	\
+	ENBCPRelocationIndication.h	\
+	MMECPRelocationIndication.h	\
+	SecondaryRATDataUsageReport.h	\
+	S1AP-PDU.h	\
+	InitiatingMessage.h	\
+	SuccessfulOutcome.h	\
+	UnsuccessfulOutcome.h	\
+	EXTERNAL.h
+
+ASN_MODULE_HDRS+=ANY.h
+ASN_MODULE_SRCS+=ANY.c
+ASN_MODULE_HDRS+=OCTET_STRING.h
+ASN_MODULE_HDRS+=OPEN_TYPE.h
+ASN_MODULE_SRCS+=OPEN_TYPE.c
+ASN_MODULE_HDRS+=constr_CHOICE.h
+ASN_MODULE_HDRS+=BOOLEAN.h
+ASN_MODULE_SRCS+=BOOLEAN.c
+ASN_MODULE_HDRS+=GraphicString.h
+ASN_MODULE_SRCS+=GraphicString.c
+ASN_MODULE_HDRS+=INTEGER.h
+ASN_MODULE_SRCS+=INTEGER.c
+ASN_MODULE_HDRS+=NULL.h
+ASN_MODULE_SRCS+=NULL.c
+ASN_MODULE_HDRS+=NativeEnumerated.h
+ASN_MODULE_SRCS+=NativeEnumerated.c
+ASN_MODULE_HDRS+=NativeInteger.h
+ASN_MODULE_SRCS+=NativeInteger.c
+ASN_MODULE_HDRS+=OBJECT_IDENTIFIER.h
+ASN_MODULE_SRCS+=OBJECT_IDENTIFIER.c
+ASN_MODULE_HDRS+=ObjectDescriptor.h
+ASN_MODULE_SRCS+=ObjectDescriptor.c
+ASN_MODULE_HDRS+=PrintableString.h
+ASN_MODULE_SRCS+=PrintableString.c
+ASN_MODULE_HDRS+=asn_SEQUENCE_OF.h
+ASN_MODULE_SRCS+=asn_SEQUENCE_OF.c
+ASN_MODULE_HDRS+=asn_SET_OF.h
+ASN_MODULE_SRCS+=asn_SET_OF.c
+ASN_MODULE_SRCS+=constr_CHOICE.c
+ASN_MODULE_HDRS+=constr_SEQUENCE.h
+ASN_MODULE_SRCS+=constr_SEQUENCE.c
+ASN_MODULE_HDRS+=constr_SEQUENCE_OF.h
+ASN_MODULE_SRCS+=constr_SEQUENCE_OF.c
+ASN_MODULE_HDRS+=constr_SET_OF.h
+ASN_MODULE_SRCS+=constr_SET_OF.c
+ASN_MODULE_HDRS+=asn_application.h
+ASN_MODULE_SRCS+=asn_application.c
+ASN_MODULE_HDRS+=asn_ioc.h
+ASN_MODULE_HDRS+=asn_system.h
+ASN_MODULE_HDRS+=asn_codecs.h
+ASN_MODULE_HDRS+=asn_internal.h
+ASN_MODULE_SRCS+=asn_internal.c
+ASN_MODULE_HDRS+=asn_random_fill.h
+ASN_MODULE_SRCS+=asn_random_fill.c
+ASN_MODULE_HDRS+=asn_bit_data.h
+ASN_MODULE_SRCS+=asn_bit_data.c
+ASN_MODULE_SRCS+=OCTET_STRING.c
+ASN_MODULE_HDRS+=BIT_STRING.h
+ASN_MODULE_SRCS+=BIT_STRING.c
+ASN_MODULE_SRCS+=asn_codecs_prim.c
+ASN_MODULE_HDRS+=asn_codecs_prim.h
+ASN_MODULE_HDRS+=ber_tlv_length.h
+ASN_MODULE_SRCS+=ber_tlv_length.c
+ASN_MODULE_HDRS+=ber_tlv_tag.h
+ASN_MODULE_SRCS+=ber_tlv_tag.c
+ASN_MODULE_HDRS+=ber_decoder.h
+ASN_MODULE_SRCS+=ber_decoder.c
+ASN_MODULE_HDRS+=der_encoder.h
+ASN_MODULE_SRCS+=der_encoder.c
+ASN_MODULE_HDRS+=constr_TYPE.h
+ASN_MODULE_SRCS+=constr_TYPE.c
+ASN_MODULE_HDRS+=constraints.h
+ASN_MODULE_SRCS+=constraints.c
+ASN_MODULE_HDRS+=xer_support.h
+ASN_MODULE_SRCS+=xer_support.c
+ASN_MODULE_HDRS+=xer_decoder.h
+ASN_MODULE_SRCS+=xer_decoder.c
+ASN_MODULE_HDRS+=xer_encoder.h
+ASN_MODULE_SRCS+=xer_encoder.c
+ASN_MODULE_HDRS+=per_support.h
+ASN_MODULE_SRCS+=per_support.c
+ASN_MODULE_HDRS+=per_decoder.h
+ASN_MODULE_SRCS+=per_decoder.c
+ASN_MODULE_HDRS+=per_encoder.h
+ASN_MODULE_SRCS+=per_encoder.c
+ASN_MODULE_HDRS+=per_opentype.h
+ASN_MODULE_SRCS+=per_opentype.c
+ASN_MODULE_HDRS+=oer_decoder.h
+ASN_MODULE_HDRS+=oer_encoder.h
+ASN_MODULE_HDRS+=oer_support.h
+ASN_MODULE_SRCS+=oer_decoder.c
+ASN_MODULE_SRCS+=oer_encoder.c
+ASN_MODULE_SRCS+=oer_support.c
+ASN_MODULE_SRCS+=OPEN_TYPE_oer.c
+ASN_MODULE_SRCS+=INTEGER_oer.c
+ASN_MODULE_SRCS+=BIT_STRING_oer.c
+ASN_MODULE_SRCS+=OCTET_STRING_oer.c
+ASN_MODULE_SRCS+=NativeInteger_oer.c
+ASN_MODULE_SRCS+=NativeEnumerated_oer.c
+ASN_MODULE_SRCS+=constr_CHOICE_oer.c
+ASN_MODULE_SRCS+=constr_SEQUENCE_oer.c
+ASN_MODULE_SRCS+=constr_SET_OF_oer.c
+
+ASN_MODULE_CFLAGS=
+
+lib_LTLIBRARIES+=libasncodec.la
+libasncodec_la_SOURCES=$(ASN_MODULE_SRCS) $(ASN_MODULE_HDRS)
+libasncodec_la_CPPFLAGS=-I$(top_srcdir)/
+libasncodec_la_CFLAGS=$(ASN_MODULE_CFLAGS)
+libasncodec_la_LDFLAGS=-lm
diff --git a/src/s1ap/asn1c/asnGenFiles/ManagementBasedMDTAllowed.h b/src/s1ap/asn1c/asnGenFiles/ManagementBasedMDTAllowed.h
new file mode 100644
index 0000000..94271fb
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ManagementBasedMDTAllowed.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ManagementBasedMDTAllowed_H_
+#define	_ManagementBasedMDTAllowed_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum ManagementBasedMDTAllowed {
+	ManagementBasedMDTAllowed_allowed	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_ManagementBasedMDTAllowed;
+
+/* ManagementBasedMDTAllowed */
+typedef long	 ManagementBasedMDTAllowed_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_ManagementBasedMDTAllowed_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_ManagementBasedMDTAllowed;
+extern const asn_INTEGER_specifics_t asn_SPC_ManagementBasedMDTAllowed_specs_1;
+asn_struct_free_f ManagementBasedMDTAllowed_free;
+asn_struct_print_f ManagementBasedMDTAllowed_print;
+asn_constr_check_f ManagementBasedMDTAllowed_constraint;
+ber_type_decoder_f ManagementBasedMDTAllowed_decode_ber;
+der_type_encoder_f ManagementBasedMDTAllowed_encode_der;
+xer_type_decoder_f ManagementBasedMDTAllowed_decode_xer;
+xer_type_encoder_f ManagementBasedMDTAllowed_encode_xer;
+oer_type_decoder_f ManagementBasedMDTAllowed_decode_oer;
+oer_type_encoder_f ManagementBasedMDTAllowed_encode_oer;
+per_type_decoder_f ManagementBasedMDTAllowed_decode_uper;
+per_type_encoder_f ManagementBasedMDTAllowed_encode_uper;
+per_type_decoder_f ManagementBasedMDTAllowed_decode_aper;
+per_type_encoder_f ManagementBasedMDTAllowed_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ManagementBasedMDTAllowed_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Masked-IMEISV.h b/src/s1ap/asn1c/asnGenFiles/Masked-IMEISV.h
new file mode 100644
index 0000000..16d4e19
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Masked-IMEISV.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Masked_IMEISV_H_
+#define	_Masked_IMEISV_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Masked-IMEISV */
+typedef BIT_STRING_t	 Masked_IMEISV_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_Masked_IMEISV_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_Masked_IMEISV;
+asn_struct_free_f Masked_IMEISV_free;
+asn_struct_print_f Masked_IMEISV_print;
+asn_constr_check_f Masked_IMEISV_constraint;
+ber_type_decoder_f Masked_IMEISV_decode_ber;
+der_type_encoder_f Masked_IMEISV_encode_der;
+xer_type_decoder_f Masked_IMEISV_decode_xer;
+xer_type_encoder_f Masked_IMEISV_encode_xer;
+oer_type_decoder_f Masked_IMEISV_decode_oer;
+oer_type_encoder_f Masked_IMEISV_encode_oer;
+per_type_decoder_f Masked_IMEISV_decode_uper;
+per_type_encoder_f Masked_IMEISV_encode_uper;
+per_type_decoder_f Masked_IMEISV_decode_aper;
+per_type_encoder_f Masked_IMEISV_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Masked_IMEISV_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/MeasurementThresholdA2.h b/src/s1ap/asn1c/asnGenFiles/MeasurementThresholdA2.h
new file mode 100644
index 0000000..b5f41b6
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/MeasurementThresholdA2.h
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_MeasurementThresholdA2_H_
+#define	_MeasurementThresholdA2_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "Threshold-RSRP.h"
+#include "Threshold-RSRQ.h"
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum MeasurementThresholdA2_PR {
+	MeasurementThresholdA2_PR_NOTHING,	/* No components present */
+	MeasurementThresholdA2_PR_threshold_RSRP,
+	MeasurementThresholdA2_PR_threshold_RSRQ
+	/* Extensions may appear below */
+	
+} MeasurementThresholdA2_PR;
+
+/* MeasurementThresholdA2 */
+typedef struct MeasurementThresholdA2 {
+	MeasurementThresholdA2_PR present;
+	union MeasurementThresholdA2_u {
+		Threshold_RSRP_t	 threshold_RSRP;
+		Threshold_RSRQ_t	 threshold_RSRQ;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} MeasurementThresholdA2_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_MeasurementThresholdA2;
+extern asn_CHOICE_specifics_t asn_SPC_MeasurementThresholdA2_specs_1;
+extern asn_TYPE_member_t asn_MBR_MeasurementThresholdA2_1[2];
+extern asn_per_constraints_t asn_PER_type_MeasurementThresholdA2_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _MeasurementThresholdA2_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/MeasurementsToActivate.h b/src/s1ap/asn1c/asnGenFiles/MeasurementsToActivate.h
new file mode 100644
index 0000000..0b039d5
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/MeasurementsToActivate.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_MeasurementsToActivate_H_
+#define	_MeasurementsToActivate_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* MeasurementsToActivate */
+typedef BIT_STRING_t	 MeasurementsToActivate_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_MeasurementsToActivate_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_MeasurementsToActivate;
+asn_struct_free_f MeasurementsToActivate_free;
+asn_struct_print_f MeasurementsToActivate_print;
+asn_constr_check_f MeasurementsToActivate_constraint;
+ber_type_decoder_f MeasurementsToActivate_decode_ber;
+der_type_encoder_f MeasurementsToActivate_encode_der;
+xer_type_decoder_f MeasurementsToActivate_decode_xer;
+xer_type_encoder_f MeasurementsToActivate_encode_xer;
+oer_type_decoder_f MeasurementsToActivate_decode_oer;
+oer_type_encoder_f MeasurementsToActivate_encode_oer;
+per_type_decoder_f MeasurementsToActivate_decode_uper;
+per_type_encoder_f MeasurementsToActivate_encode_uper;
+per_type_decoder_f MeasurementsToActivate_decode_aper;
+per_type_encoder_f MeasurementsToActivate_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _MeasurementsToActivate_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/MessageIdentifier.h b/src/s1ap/asn1c/asnGenFiles/MessageIdentifier.h
new file mode 100644
index 0000000..599d8a1
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/MessageIdentifier.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_MessageIdentifier_H_
+#define	_MessageIdentifier_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* MessageIdentifier */
+typedef BIT_STRING_t	 MessageIdentifier_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_MessageIdentifier_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_MessageIdentifier;
+asn_struct_free_f MessageIdentifier_free;
+asn_struct_print_f MessageIdentifier_print;
+asn_constr_check_f MessageIdentifier_constraint;
+ber_type_decoder_f MessageIdentifier_decode_ber;
+der_type_encoder_f MessageIdentifier_encode_der;
+xer_type_decoder_f MessageIdentifier_decode_xer;
+xer_type_encoder_f MessageIdentifier_encode_xer;
+oer_type_decoder_f MessageIdentifier_decode_oer;
+oer_type_encoder_f MessageIdentifier_encode_oer;
+per_type_decoder_f MessageIdentifier_decode_uper;
+per_type_encoder_f MessageIdentifier_encode_uper;
+per_type_decoder_f MessageIdentifier_decode_aper;
+per_type_encoder_f MessageIdentifier_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _MessageIdentifier_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/MobilityInformation.h b/src/s1ap/asn1c/asnGenFiles/MobilityInformation.h
new file mode 100644
index 0000000..773b2bd
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/MobilityInformation.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_MobilityInformation_H_
+#define	_MobilityInformation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* MobilityInformation */
+typedef BIT_STRING_t	 MobilityInformation_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_MobilityInformation_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_MobilityInformation;
+asn_struct_free_f MobilityInformation_free;
+asn_struct_print_f MobilityInformation_print;
+asn_constr_check_f MobilityInformation_constraint;
+ber_type_decoder_f MobilityInformation_decode_ber;
+der_type_encoder_f MobilityInformation_encode_der;
+xer_type_decoder_f MobilityInformation_decode_xer;
+xer_type_encoder_f MobilityInformation_encode_xer;
+oer_type_decoder_f MobilityInformation_decode_oer;
+oer_type_encoder_f MobilityInformation_encode_oer;
+per_type_decoder_f MobilityInformation_decode_uper;
+per_type_encoder_f MobilityInformation_encode_uper;
+per_type_decoder_f MobilityInformation_decode_aper;
+per_type_encoder_f MobilityInformation_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _MobilityInformation_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/MutingAvailabilityIndication.h b/src/s1ap/asn1c/asnGenFiles/MutingAvailabilityIndication.h
new file mode 100644
index 0000000..4a1cc87
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/MutingAvailabilityIndication.h
@@ -0,0 +1,56 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_MutingAvailabilityIndication_H_
+#define	_MutingAvailabilityIndication_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum MutingAvailabilityIndication {
+	MutingAvailabilityIndication_available	= 0,
+	MutingAvailabilityIndication_unavailable	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_MutingAvailabilityIndication;
+
+/* MutingAvailabilityIndication */
+typedef long	 MutingAvailabilityIndication_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_MutingAvailabilityIndication_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_MutingAvailabilityIndication;
+extern const asn_INTEGER_specifics_t asn_SPC_MutingAvailabilityIndication_specs_1;
+asn_struct_free_f MutingAvailabilityIndication_free;
+asn_struct_print_f MutingAvailabilityIndication_print;
+asn_constr_check_f MutingAvailabilityIndication_constraint;
+ber_type_decoder_f MutingAvailabilityIndication_decode_ber;
+der_type_encoder_f MutingAvailabilityIndication_encode_der;
+xer_type_decoder_f MutingAvailabilityIndication_decode_xer;
+xer_type_encoder_f MutingAvailabilityIndication_encode_xer;
+oer_type_decoder_f MutingAvailabilityIndication_decode_oer;
+oer_type_encoder_f MutingAvailabilityIndication_encode_oer;
+per_type_decoder_f MutingAvailabilityIndication_decode_uper;
+per_type_encoder_f MutingAvailabilityIndication_encode_uper;
+per_type_decoder_f MutingAvailabilityIndication_decode_aper;
+per_type_encoder_f MutingAvailabilityIndication_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _MutingAvailabilityIndication_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/MutingPatternInformation.h b/src/s1ap/asn1c/asnGenFiles/MutingPatternInformation.h
new file mode 100644
index 0000000..01498e5
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/MutingPatternInformation.h
@@ -0,0 +1,63 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_MutingPatternInformation_H_
+#define	_MutingPatternInformation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+#include <NativeInteger.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum MutingPatternInformation__muting_pattern_period {
+	MutingPatternInformation__muting_pattern_period_ms0	= 0,
+	MutingPatternInformation__muting_pattern_period_ms1280	= 1,
+	MutingPatternInformation__muting_pattern_period_ms2560	= 2,
+	MutingPatternInformation__muting_pattern_period_ms5120	= 3,
+	MutingPatternInformation__muting_pattern_period_ms10240	= 4
+	/*
+	 * Enumeration is extensible
+	 */
+} e_MutingPatternInformation__muting_pattern_period;
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* MutingPatternInformation */
+typedef struct MutingPatternInformation {
+	long	 muting_pattern_period;
+	long	*muting_pattern_offset;	/* OPTIONAL */
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} MutingPatternInformation_t;
+
+/* Implementation */
+/* extern asn_TYPE_descriptor_t asn_DEF_muting_pattern_period_2;	// (Use -fall-defs-global to expose) */
+extern asn_TYPE_descriptor_t asn_DEF_MutingPatternInformation;
+extern asn_SEQUENCE_specifics_t asn_SPC_MutingPatternInformation_specs_1;
+extern asn_TYPE_member_t asn_MBR_MutingPatternInformation_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _MutingPatternInformation_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/NAS-PDU.h b/src/s1ap/asn1c/asnGenFiles/NAS-PDU.h
new file mode 100644
index 0000000..a7d8f88
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/NAS-PDU.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_NAS_PDU_H_
+#define	_NAS_PDU_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* NAS-PDU */
+typedef OCTET_STRING_t	 NAS_PDU_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_NAS_PDU;
+asn_struct_free_f NAS_PDU_free;
+asn_struct_print_f NAS_PDU_print;
+asn_constr_check_f NAS_PDU_constraint;
+ber_type_decoder_f NAS_PDU_decode_ber;
+der_type_encoder_f NAS_PDU_encode_der;
+xer_type_decoder_f NAS_PDU_decode_xer;
+xer_type_encoder_f NAS_PDU_encode_xer;
+oer_type_decoder_f NAS_PDU_decode_oer;
+oer_type_encoder_f NAS_PDU_encode_oer;
+per_type_decoder_f NAS_PDU_decode_uper;
+per_type_encoder_f NAS_PDU_encode_uper;
+per_type_decoder_f NAS_PDU_decode_aper;
+per_type_encoder_f NAS_PDU_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _NAS_PDU_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/NASDeliveryIndication.h b/src/s1ap/asn1c/asnGenFiles/NASDeliveryIndication.h
new file mode 100644
index 0000000..81cbf85
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/NASDeliveryIndication.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_NASDeliveryIndication_H_
+#define	_NASDeliveryIndication_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* NASDeliveryIndication */
+typedef struct NASDeliveryIndication {
+	ProtocolIE_Container_129P36_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} NASDeliveryIndication_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_NASDeliveryIndication;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _NASDeliveryIndication_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/NASNonDeliveryIndication.h b/src/s1ap/asn1c/asnGenFiles/NASNonDeliveryIndication.h
new file mode 100644
index 0000000..d00543b
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/NASNonDeliveryIndication.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_NASNonDeliveryIndication_H_
+#define	_NASNonDeliveryIndication_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* NASNonDeliveryIndication */
+typedef struct NASNonDeliveryIndication {
+	ProtocolIE_Container_129P34_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} NASNonDeliveryIndication_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_NASNonDeliveryIndication;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _NASNonDeliveryIndication_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/NASSecurityParametersfromE-UTRAN.h b/src/s1ap/asn1c/asnGenFiles/NASSecurityParametersfromE-UTRAN.h
new file mode 100644
index 0000000..1cee507
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/NASSecurityParametersfromE-UTRAN.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_NASSecurityParametersfromE_UTRAN_H_
+#define	_NASSecurityParametersfromE_UTRAN_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* NASSecurityParametersfromE-UTRAN */
+typedef OCTET_STRING_t	 NASSecurityParametersfromE_UTRAN_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_NASSecurityParametersfromE_UTRAN;
+asn_struct_free_f NASSecurityParametersfromE_UTRAN_free;
+asn_struct_print_f NASSecurityParametersfromE_UTRAN_print;
+asn_constr_check_f NASSecurityParametersfromE_UTRAN_constraint;
+ber_type_decoder_f NASSecurityParametersfromE_UTRAN_decode_ber;
+der_type_encoder_f NASSecurityParametersfromE_UTRAN_encode_der;
+xer_type_decoder_f NASSecurityParametersfromE_UTRAN_decode_xer;
+xer_type_encoder_f NASSecurityParametersfromE_UTRAN_encode_xer;
+oer_type_decoder_f NASSecurityParametersfromE_UTRAN_decode_oer;
+oer_type_encoder_f NASSecurityParametersfromE_UTRAN_encode_oer;
+per_type_decoder_f NASSecurityParametersfromE_UTRAN_decode_uper;
+per_type_encoder_f NASSecurityParametersfromE_UTRAN_encode_uper;
+per_type_decoder_f NASSecurityParametersfromE_UTRAN_decode_aper;
+per_type_encoder_f NASSecurityParametersfromE_UTRAN_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _NASSecurityParametersfromE_UTRAN_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/NASSecurityParameterstoE-UTRAN.h b/src/s1ap/asn1c/asnGenFiles/NASSecurityParameterstoE-UTRAN.h
new file mode 100644
index 0000000..28f388e
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/NASSecurityParameterstoE-UTRAN.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_NASSecurityParameterstoE_UTRAN_H_
+#define	_NASSecurityParameterstoE_UTRAN_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* NASSecurityParameterstoE-UTRAN */
+typedef OCTET_STRING_t	 NASSecurityParameterstoE_UTRAN_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_NASSecurityParameterstoE_UTRAN;
+asn_struct_free_f NASSecurityParameterstoE_UTRAN_free;
+asn_struct_print_f NASSecurityParameterstoE_UTRAN_print;
+asn_constr_check_f NASSecurityParameterstoE_UTRAN_constraint;
+ber_type_decoder_f NASSecurityParameterstoE_UTRAN_decode_ber;
+der_type_encoder_f NASSecurityParameterstoE_UTRAN_encode_der;
+xer_type_decoder_f NASSecurityParameterstoE_UTRAN_decode_xer;
+xer_type_encoder_f NASSecurityParameterstoE_UTRAN_encode_xer;
+oer_type_decoder_f NASSecurityParameterstoE_UTRAN_decode_oer;
+oer_type_encoder_f NASSecurityParameterstoE_UTRAN_encode_oer;
+per_type_decoder_f NASSecurityParameterstoE_UTRAN_decode_uper;
+per_type_encoder_f NASSecurityParameterstoE_UTRAN_encode_uper;
+per_type_decoder_f NASSecurityParameterstoE_UTRAN_decode_aper;
+per_type_encoder_f NASSecurityParameterstoE_UTRAN_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _NASSecurityParameterstoE_UTRAN_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/NB-IoT-DefaultPagingDRX.h b/src/s1ap/asn1c/asnGenFiles/NB-IoT-DefaultPagingDRX.h
new file mode 100644
index 0000000..5f46965
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/NB-IoT-DefaultPagingDRX.h
@@ -0,0 +1,58 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_NB_IoT_DefaultPagingDRX_H_
+#define	_NB_IoT_DefaultPagingDRX_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum NB_IoT_DefaultPagingDRX {
+	NB_IoT_DefaultPagingDRX_v128	= 0,
+	NB_IoT_DefaultPagingDRX_v256	= 1,
+	NB_IoT_DefaultPagingDRX_v512	= 2,
+	NB_IoT_DefaultPagingDRX_v1024	= 3
+	/*
+	 * Enumeration is extensible
+	 */
+} e_NB_IoT_DefaultPagingDRX;
+
+/* NB-IoT-DefaultPagingDRX */
+typedef long	 NB_IoT_DefaultPagingDRX_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_NB_IoT_DefaultPagingDRX_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_NB_IoT_DefaultPagingDRX;
+extern const asn_INTEGER_specifics_t asn_SPC_NB_IoT_DefaultPagingDRX_specs_1;
+asn_struct_free_f NB_IoT_DefaultPagingDRX_free;
+asn_struct_print_f NB_IoT_DefaultPagingDRX_print;
+asn_constr_check_f NB_IoT_DefaultPagingDRX_constraint;
+ber_type_decoder_f NB_IoT_DefaultPagingDRX_decode_ber;
+der_type_encoder_f NB_IoT_DefaultPagingDRX_encode_der;
+xer_type_decoder_f NB_IoT_DefaultPagingDRX_decode_xer;
+xer_type_encoder_f NB_IoT_DefaultPagingDRX_encode_xer;
+oer_type_decoder_f NB_IoT_DefaultPagingDRX_decode_oer;
+oer_type_encoder_f NB_IoT_DefaultPagingDRX_encode_oer;
+per_type_decoder_f NB_IoT_DefaultPagingDRX_decode_uper;
+per_type_encoder_f NB_IoT_DefaultPagingDRX_encode_uper;
+per_type_decoder_f NB_IoT_DefaultPagingDRX_decode_aper;
+per_type_encoder_f NB_IoT_DefaultPagingDRX_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _NB_IoT_DefaultPagingDRX_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/NB-IoT-Paging-eDRX-Cycle.h b/src/s1ap/asn1c/asnGenFiles/NB-IoT-Paging-eDRX-Cycle.h
new file mode 100644
index 0000000..b9ccac7
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/NB-IoT-Paging-eDRX-Cycle.h
@@ -0,0 +1,68 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_NB_IoT_Paging_eDRX_Cycle_H_
+#define	_NB_IoT_Paging_eDRX_Cycle_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum NB_IoT_Paging_eDRX_Cycle {
+	NB_IoT_Paging_eDRX_Cycle_hf2	= 0,
+	NB_IoT_Paging_eDRX_Cycle_hf4	= 1,
+	NB_IoT_Paging_eDRX_Cycle_hf6	= 2,
+	NB_IoT_Paging_eDRX_Cycle_hf8	= 3,
+	NB_IoT_Paging_eDRX_Cycle_hf10	= 4,
+	NB_IoT_Paging_eDRX_Cycle_hf12	= 5,
+	NB_IoT_Paging_eDRX_Cycle_hf14	= 6,
+	NB_IoT_Paging_eDRX_Cycle_hf16	= 7,
+	NB_IoT_Paging_eDRX_Cycle_hf32	= 8,
+	NB_IoT_Paging_eDRX_Cycle_hf64	= 9,
+	NB_IoT_Paging_eDRX_Cycle_hf128	= 10,
+	NB_IoT_Paging_eDRX_Cycle_hf256	= 11,
+	NB_IoT_Paging_eDRX_Cycle_hf512	= 12,
+	NB_IoT_Paging_eDRX_Cycle_hf1024	= 13
+	/*
+	 * Enumeration is extensible
+	 */
+} e_NB_IoT_Paging_eDRX_Cycle;
+
+/* NB-IoT-Paging-eDRX-Cycle */
+typedef long	 NB_IoT_Paging_eDRX_Cycle_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_NB_IoT_Paging_eDRX_Cycle_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_NB_IoT_Paging_eDRX_Cycle;
+extern const asn_INTEGER_specifics_t asn_SPC_NB_IoT_Paging_eDRX_Cycle_specs_1;
+asn_struct_free_f NB_IoT_Paging_eDRX_Cycle_free;
+asn_struct_print_f NB_IoT_Paging_eDRX_Cycle_print;
+asn_constr_check_f NB_IoT_Paging_eDRX_Cycle_constraint;
+ber_type_decoder_f NB_IoT_Paging_eDRX_Cycle_decode_ber;
+der_type_encoder_f NB_IoT_Paging_eDRX_Cycle_encode_der;
+xer_type_decoder_f NB_IoT_Paging_eDRX_Cycle_decode_xer;
+xer_type_encoder_f NB_IoT_Paging_eDRX_Cycle_encode_xer;
+oer_type_decoder_f NB_IoT_Paging_eDRX_Cycle_decode_oer;
+oer_type_encoder_f NB_IoT_Paging_eDRX_Cycle_encode_oer;
+per_type_decoder_f NB_IoT_Paging_eDRX_Cycle_decode_uper;
+per_type_encoder_f NB_IoT_Paging_eDRX_Cycle_encode_uper;
+per_type_decoder_f NB_IoT_Paging_eDRX_Cycle_decode_aper;
+per_type_encoder_f NB_IoT_Paging_eDRX_Cycle_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _NB_IoT_Paging_eDRX_Cycle_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/NB-IoT-Paging-eDRXInformation.h b/src/s1ap/asn1c/asnGenFiles/NB-IoT-Paging-eDRXInformation.h
new file mode 100644
index 0000000..50731c3
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/NB-IoT-Paging-eDRXInformation.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_NB_IoT_Paging_eDRXInformation_H_
+#define	_NB_IoT_Paging_eDRXInformation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "NB-IoT-Paging-eDRX-Cycle.h"
+#include "NB-IoT-PagingTimeWindow.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* NB-IoT-Paging-eDRXInformation */
+typedef struct NB_IoT_Paging_eDRXInformation {
+	NB_IoT_Paging_eDRX_Cycle_t	 nB_IoT_paging_eDRX_Cycle;
+	NB_IoT_PagingTimeWindow_t	*nB_IoT_pagingTimeWindow;	/* OPTIONAL */
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} NB_IoT_Paging_eDRXInformation_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_NB_IoT_Paging_eDRXInformation;
+extern asn_SEQUENCE_specifics_t asn_SPC_NB_IoT_Paging_eDRXInformation_specs_1;
+extern asn_TYPE_member_t asn_MBR_NB_IoT_Paging_eDRXInformation_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _NB_IoT_Paging_eDRXInformation_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/NB-IoT-PagingTimeWindow.h b/src/s1ap/asn1c/asnGenFiles/NB-IoT-PagingTimeWindow.h
new file mode 100644
index 0000000..6fdb6e2
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/NB-IoT-PagingTimeWindow.h
@@ -0,0 +1,70 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_NB_IoT_PagingTimeWindow_H_
+#define	_NB_IoT_PagingTimeWindow_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum NB_IoT_PagingTimeWindow {
+	NB_IoT_PagingTimeWindow_s1	= 0,
+	NB_IoT_PagingTimeWindow_s2	= 1,
+	NB_IoT_PagingTimeWindow_s3	= 2,
+	NB_IoT_PagingTimeWindow_s4	= 3,
+	NB_IoT_PagingTimeWindow_s5	= 4,
+	NB_IoT_PagingTimeWindow_s6	= 5,
+	NB_IoT_PagingTimeWindow_s7	= 6,
+	NB_IoT_PagingTimeWindow_s8	= 7,
+	NB_IoT_PagingTimeWindow_s9	= 8,
+	NB_IoT_PagingTimeWindow_s10	= 9,
+	NB_IoT_PagingTimeWindow_s11	= 10,
+	NB_IoT_PagingTimeWindow_s12	= 11,
+	NB_IoT_PagingTimeWindow_s13	= 12,
+	NB_IoT_PagingTimeWindow_s14	= 13,
+	NB_IoT_PagingTimeWindow_s15	= 14,
+	NB_IoT_PagingTimeWindow_s16	= 15
+	/*
+	 * Enumeration is extensible
+	 */
+} e_NB_IoT_PagingTimeWindow;
+
+/* NB-IoT-PagingTimeWindow */
+typedef long	 NB_IoT_PagingTimeWindow_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_NB_IoT_PagingTimeWindow_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_NB_IoT_PagingTimeWindow;
+extern const asn_INTEGER_specifics_t asn_SPC_NB_IoT_PagingTimeWindow_specs_1;
+asn_struct_free_f NB_IoT_PagingTimeWindow_free;
+asn_struct_print_f NB_IoT_PagingTimeWindow_print;
+asn_constr_check_f NB_IoT_PagingTimeWindow_constraint;
+ber_type_decoder_f NB_IoT_PagingTimeWindow_decode_ber;
+der_type_encoder_f NB_IoT_PagingTimeWindow_encode_der;
+xer_type_decoder_f NB_IoT_PagingTimeWindow_decode_xer;
+xer_type_encoder_f NB_IoT_PagingTimeWindow_encode_xer;
+oer_type_decoder_f NB_IoT_PagingTimeWindow_decode_oer;
+oer_type_encoder_f NB_IoT_PagingTimeWindow_encode_oer;
+per_type_decoder_f NB_IoT_PagingTimeWindow_decode_uper;
+per_type_encoder_f NB_IoT_PagingTimeWindow_encode_uper;
+per_type_decoder_f NB_IoT_PagingTimeWindow_decode_aper;
+per_type_encoder_f NB_IoT_PagingTimeWindow_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _NB_IoT_PagingTimeWindow_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/NB-IoT-UEIdentityIndexValue.h b/src/s1ap/asn1c/asnGenFiles/NB-IoT-UEIdentityIndexValue.h
new file mode 100644
index 0000000..9c29703
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/NB-IoT-UEIdentityIndexValue.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_NB_IoT_UEIdentityIndexValue_H_
+#define	_NB_IoT_UEIdentityIndexValue_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* NB-IoT-UEIdentityIndexValue */
+typedef BIT_STRING_t	 NB_IoT_UEIdentityIndexValue_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_NB_IoT_UEIdentityIndexValue_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_NB_IoT_UEIdentityIndexValue;
+asn_struct_free_f NB_IoT_UEIdentityIndexValue_free;
+asn_struct_print_f NB_IoT_UEIdentityIndexValue_print;
+asn_constr_check_f NB_IoT_UEIdentityIndexValue_constraint;
+ber_type_decoder_f NB_IoT_UEIdentityIndexValue_decode_ber;
+der_type_encoder_f NB_IoT_UEIdentityIndexValue_encode_der;
+xer_type_decoder_f NB_IoT_UEIdentityIndexValue_decode_xer;
+xer_type_encoder_f NB_IoT_UEIdentityIndexValue_encode_xer;
+oer_type_decoder_f NB_IoT_UEIdentityIndexValue_decode_oer;
+oer_type_encoder_f NB_IoT_UEIdentityIndexValue_encode_oer;
+per_type_decoder_f NB_IoT_UEIdentityIndexValue_decode_uper;
+per_type_encoder_f NB_IoT_UEIdentityIndexValue_encode_uper;
+per_type_decoder_f NB_IoT_UEIdentityIndexValue_decode_aper;
+per_type_encoder_f NB_IoT_UEIdentityIndexValue_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _NB_IoT_UEIdentityIndexValue_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/NG-eNB.h b/src/s1ap/asn1c/asnGenFiles/NG-eNB.h
new file mode 100644
index 0000000..77f7f70
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/NG-eNB.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_NG_eNB_H_
+#define	_NG_eNB_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "Global-ENB-ID.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* NG-eNB */
+typedef struct NG_eNB {
+	Global_ENB_ID_t	 global_ng_eNB_ID;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} NG_eNB_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_NG_eNB;
+extern asn_SEQUENCE_specifics_t asn_SPC_NG_eNB_specs_1;
+extern asn_TYPE_member_t asn_MBR_NG_eNB_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _NG_eNB_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/NR-CGI.h b/src/s1ap/asn1c/asnGenFiles/NR-CGI.h
new file mode 100644
index 0000000..3288408
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/NR-CGI.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_NR_CGI_H_
+#define	_NR_CGI_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "PLMNidentity.h"
+#include "NRCellIdentity.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* NR-CGI */
+typedef struct NR_CGI {
+	PLMNidentity_t	 pLMNIdentity;
+	NRCellIdentity_t	 nRCellIdentity;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} NR_CGI_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_NR_CGI;
+extern asn_SEQUENCE_specifics_t asn_SPC_NR_CGI_specs_1;
+extern asn_TYPE_member_t asn_MBR_NR_CGI_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _NR_CGI_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/NRCellIdentity.h b/src/s1ap/asn1c/asnGenFiles/NRCellIdentity.h
new file mode 100644
index 0000000..bb55c69
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/NRCellIdentity.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_NRCellIdentity_H_
+#define	_NRCellIdentity_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* NRCellIdentity */
+typedef BIT_STRING_t	 NRCellIdentity_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_NRCellIdentity_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_NRCellIdentity;
+asn_struct_free_f NRCellIdentity_free;
+asn_struct_print_f NRCellIdentity_print;
+asn_constr_check_f NRCellIdentity_constraint;
+ber_type_decoder_f NRCellIdentity_decode_ber;
+der_type_encoder_f NRCellIdentity_encode_der;
+xer_type_decoder_f NRCellIdentity_decode_xer;
+xer_type_encoder_f NRCellIdentity_encode_xer;
+oer_type_decoder_f NRCellIdentity_decode_oer;
+oer_type_encoder_f NRCellIdentity_encode_oer;
+per_type_decoder_f NRCellIdentity_decode_uper;
+per_type_encoder_f NRCellIdentity_encode_uper;
+per_type_decoder_f NRCellIdentity_decode_aper;
+per_type_encoder_f NRCellIdentity_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _NRCellIdentity_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/NRUESecurityCapabilities.h b/src/s1ap/asn1c/asnGenFiles/NRUESecurityCapabilities.h
new file mode 100644
index 0000000..e70b5cd
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/NRUESecurityCapabilities.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_NRUESecurityCapabilities_H_
+#define	_NRUESecurityCapabilities_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "NRencryptionAlgorithms.h"
+#include "NRintegrityProtectionAlgorithms.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* NRUESecurityCapabilities */
+typedef struct NRUESecurityCapabilities {
+	NRencryptionAlgorithms_t	 nRencryptionAlgorithms;
+	NRintegrityProtectionAlgorithms_t	 nRintegrityProtectionAlgorithms;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} NRUESecurityCapabilities_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_NRUESecurityCapabilities;
+extern asn_SEQUENCE_specifics_t asn_SPC_NRUESecurityCapabilities_specs_1;
+extern asn_TYPE_member_t asn_MBR_NRUESecurityCapabilities_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _NRUESecurityCapabilities_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/NRencryptionAlgorithms.h b/src/s1ap/asn1c/asnGenFiles/NRencryptionAlgorithms.h
new file mode 100644
index 0000000..e67c5d4
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/NRencryptionAlgorithms.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_NRencryptionAlgorithms_H_
+#define	_NRencryptionAlgorithms_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* NRencryptionAlgorithms */
+typedef BIT_STRING_t	 NRencryptionAlgorithms_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_NRencryptionAlgorithms_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_NRencryptionAlgorithms;
+asn_struct_free_f NRencryptionAlgorithms_free;
+asn_struct_print_f NRencryptionAlgorithms_print;
+asn_constr_check_f NRencryptionAlgorithms_constraint;
+ber_type_decoder_f NRencryptionAlgorithms_decode_ber;
+der_type_encoder_f NRencryptionAlgorithms_encode_der;
+xer_type_decoder_f NRencryptionAlgorithms_decode_xer;
+xer_type_encoder_f NRencryptionAlgorithms_encode_xer;
+oer_type_decoder_f NRencryptionAlgorithms_decode_oer;
+oer_type_encoder_f NRencryptionAlgorithms_encode_oer;
+per_type_decoder_f NRencryptionAlgorithms_decode_uper;
+per_type_encoder_f NRencryptionAlgorithms_encode_uper;
+per_type_decoder_f NRencryptionAlgorithms_decode_aper;
+per_type_encoder_f NRencryptionAlgorithms_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _NRencryptionAlgorithms_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/NRintegrityProtectionAlgorithms.h b/src/s1ap/asn1c/asnGenFiles/NRintegrityProtectionAlgorithms.h
new file mode 100644
index 0000000..c9a988a
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/NRintegrityProtectionAlgorithms.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_NRintegrityProtectionAlgorithms_H_
+#define	_NRintegrityProtectionAlgorithms_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* NRintegrityProtectionAlgorithms */
+typedef BIT_STRING_t	 NRintegrityProtectionAlgorithms_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_NRintegrityProtectionAlgorithms_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_NRintegrityProtectionAlgorithms;
+asn_struct_free_f NRintegrityProtectionAlgorithms_free;
+asn_struct_print_f NRintegrityProtectionAlgorithms_print;
+asn_constr_check_f NRintegrityProtectionAlgorithms_constraint;
+ber_type_decoder_f NRintegrityProtectionAlgorithms_decode_ber;
+der_type_encoder_f NRintegrityProtectionAlgorithms_encode_der;
+xer_type_decoder_f NRintegrityProtectionAlgorithms_decode_xer;
+xer_type_encoder_f NRintegrityProtectionAlgorithms_encode_xer;
+oer_type_decoder_f NRintegrityProtectionAlgorithms_decode_oer;
+oer_type_encoder_f NRintegrityProtectionAlgorithms_encode_oer;
+per_type_decoder_f NRintegrityProtectionAlgorithms_decode_uper;
+per_type_encoder_f NRintegrityProtectionAlgorithms_encode_uper;
+per_type_decoder_f NRintegrityProtectionAlgorithms_decode_aper;
+per_type_encoder_f NRintegrityProtectionAlgorithms_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _NRintegrityProtectionAlgorithms_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/NRrestrictionin5GS.h b/src/s1ap/asn1c/asnGenFiles/NRrestrictionin5GS.h
new file mode 100644
index 0000000..88957d4
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/NRrestrictionin5GS.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_NRrestrictionin5GS_H_
+#define	_NRrestrictionin5GS_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum NRrestrictionin5GS {
+	NRrestrictionin5GS_nRrestrictedin5GS	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_NRrestrictionin5GS;
+
+/* NRrestrictionin5GS */
+typedef long	 NRrestrictionin5GS_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_NRrestrictionin5GS_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_NRrestrictionin5GS;
+extern const asn_INTEGER_specifics_t asn_SPC_NRrestrictionin5GS_specs_1;
+asn_struct_free_f NRrestrictionin5GS_free;
+asn_struct_print_f NRrestrictionin5GS_print;
+asn_constr_check_f NRrestrictionin5GS_constraint;
+ber_type_decoder_f NRrestrictionin5GS_decode_ber;
+der_type_encoder_f NRrestrictionin5GS_encode_der;
+xer_type_decoder_f NRrestrictionin5GS_decode_xer;
+xer_type_encoder_f NRrestrictionin5GS_encode_xer;
+oer_type_decoder_f NRrestrictionin5GS_decode_oer;
+oer_type_encoder_f NRrestrictionin5GS_encode_oer;
+per_type_decoder_f NRrestrictionin5GS_decode_uper;
+per_type_encoder_f NRrestrictionin5GS_encode_uper;
+per_type_decoder_f NRrestrictionin5GS_decode_aper;
+per_type_encoder_f NRrestrictionin5GS_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _NRrestrictionin5GS_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/NRrestrictioninEPSasSecondaryRAT.h b/src/s1ap/asn1c/asnGenFiles/NRrestrictioninEPSasSecondaryRAT.h
new file mode 100644
index 0000000..c30adbd
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/NRrestrictioninEPSasSecondaryRAT.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_NRrestrictioninEPSasSecondaryRAT_H_
+#define	_NRrestrictioninEPSasSecondaryRAT_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum NRrestrictioninEPSasSecondaryRAT {
+	NRrestrictioninEPSasSecondaryRAT_nRrestrictedinEPSasSecondaryRAT	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_NRrestrictioninEPSasSecondaryRAT;
+
+/* NRrestrictioninEPSasSecondaryRAT */
+typedef long	 NRrestrictioninEPSasSecondaryRAT_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_NRrestrictioninEPSasSecondaryRAT_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_NRrestrictioninEPSasSecondaryRAT;
+extern const asn_INTEGER_specifics_t asn_SPC_NRrestrictioninEPSasSecondaryRAT_specs_1;
+asn_struct_free_f NRrestrictioninEPSasSecondaryRAT_free;
+asn_struct_print_f NRrestrictioninEPSasSecondaryRAT_print;
+asn_constr_check_f NRrestrictioninEPSasSecondaryRAT_constraint;
+ber_type_decoder_f NRrestrictioninEPSasSecondaryRAT_decode_ber;
+der_type_encoder_f NRrestrictioninEPSasSecondaryRAT_encode_der;
+xer_type_decoder_f NRrestrictioninEPSasSecondaryRAT_decode_xer;
+xer_type_encoder_f NRrestrictioninEPSasSecondaryRAT_encode_xer;
+oer_type_decoder_f NRrestrictioninEPSasSecondaryRAT_decode_oer;
+oer_type_encoder_f NRrestrictioninEPSasSecondaryRAT_encode_oer;
+per_type_decoder_f NRrestrictioninEPSasSecondaryRAT_decode_uper;
+per_type_encoder_f NRrestrictioninEPSasSecondaryRAT_encode_uper;
+per_type_decoder_f NRrestrictioninEPSasSecondaryRAT_decode_aper;
+per_type_encoder_f NRrestrictioninEPSasSecondaryRAT_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _NRrestrictioninEPSasSecondaryRAT_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/NULL.h b/src/s1ap/asn1c/asnGenFiles/NULL.h
new file mode 100644
index 0000000..802d12c
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/NULL.h
@@ -0,0 +1,45 @@
+/*-
+ * Copyright (c) 2003-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+#ifndef	ASN_TYPE_NULL_H
+#define	ASN_TYPE_NULL_H
+
+#include <asn_application.h>
+#include <BOOLEAN.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * The value of the NULL type is meaningless: see BOOLEAN if you want to
+ * carry true/false semantics.
+ */
+typedef int NULL_t;
+
+extern asn_TYPE_descriptor_t asn_DEF_NULL;
+extern asn_TYPE_operation_t asn_OP_NULL;
+
+asn_struct_print_f NULL_print;
+asn_struct_compare_f NULL_compare;
+der_type_encoder_f NULL_encode_der;
+xer_type_decoder_f NULL_decode_xer;
+xer_type_encoder_f NULL_encode_xer;
+oer_type_decoder_f NULL_decode_oer;
+oer_type_encoder_f NULL_encode_oer;
+per_type_decoder_f NULL_decode_uper;
+per_type_encoder_f NULL_encode_uper;
+per_type_decoder_f NULL_decode_aper;
+per_type_encoder_f NULL_encode_aper;
+asn_random_fill_f  NULL_random_fill;
+
+#define NULL_free	BOOLEAN_free
+#define NULL_decode_ber	BOOLEAN_decode_ber
+#define NULL_constraint	asn_generic_no_constraint
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* NULL_H */
diff --git a/src/s1ap/asn1c/asnGenFiles/NativeEnumerated.h b/src/s1ap/asn1c/asnGenFiles/NativeEnumerated.h
new file mode 100644
index 0000000..459f0e6
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/NativeEnumerated.h
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2004-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+/*
+ * This type differs from the standard ENUMERATED in that it is modelled using
+ * the fixed machine type (long, int, short), so it can hold only values of
+ * limited length. There is no type (i.e., NativeEnumerated_t, any integer type
+ * will do).
+ * This type may be used when integer range is limited by subtype constraints.
+ */
+#ifndef	_NativeEnumerated_H_
+#define	_NativeEnumerated_H_
+
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern asn_TYPE_descriptor_t asn_DEF_NativeEnumerated;
+extern asn_TYPE_operation_t asn_OP_NativeEnumerated;
+
+xer_type_encoder_f NativeEnumerated_encode_xer;
+oer_type_decoder_f NativeEnumerated_decode_oer;
+oer_type_encoder_f NativeEnumerated_encode_oer;
+per_type_decoder_f NativeEnumerated_decode_uper;
+per_type_encoder_f NativeEnumerated_encode_uper;
+per_type_decoder_f NativeEnumerated_decode_aper;
+per_type_encoder_f NativeEnumerated_encode_aper;
+
+#define NativeEnumerated_free       NativeInteger_free
+#define NativeEnumerated_print      NativeInteger_print
+#define NativeEnumerated_compare    NativeInteger_compare
+#define NativeEnumerated_random_fill NativeInteger_random_fill
+#define NativeEnumerated_constraint asn_generic_no_constraint
+#define NativeEnumerated_decode_ber NativeInteger_decode_ber
+#define NativeEnumerated_encode_der NativeInteger_encode_der
+#define NativeEnumerated_decode_xer NativeInteger_decode_xer
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _NativeEnumerated_H_ */
diff --git a/src/s1ap/asn1c/asnGenFiles/NativeInteger.h b/src/s1ap/asn1c/asnGenFiles/NativeInteger.h
new file mode 100644
index 0000000..c74406a
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/NativeInteger.h
@@ -0,0 +1,46 @@
+/*-
+ * Copyright (c) 2004-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+/*
+ * This type differs from the standard INTEGER in that it is modelled using
+ * the fixed machine type (long, int, short), so it can hold only values of
+ * limited length. There is no type (i.e., NativeInteger_t, any integer type
+ * will do).
+ * This type may be used when integer range is limited by subtype constraints.
+ */
+#ifndef	_NativeInteger_H_
+#define	_NativeInteger_H_
+
+#include <asn_application.h>
+#include <INTEGER.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern asn_TYPE_descriptor_t asn_DEF_NativeInteger;
+extern asn_TYPE_operation_t asn_OP_NativeInteger;
+
+asn_struct_free_f  NativeInteger_free;
+asn_struct_print_f NativeInteger_print;
+asn_struct_compare_f NativeInteger_compare;
+ber_type_decoder_f NativeInteger_decode_ber;
+der_type_encoder_f NativeInteger_encode_der;
+xer_type_decoder_f NativeInteger_decode_xer;
+xer_type_encoder_f NativeInteger_encode_xer;
+oer_type_decoder_f NativeInteger_decode_oer;
+oer_type_encoder_f NativeInteger_encode_oer;
+per_type_decoder_f NativeInteger_decode_uper;
+per_type_encoder_f NativeInteger_encode_uper;
+per_type_decoder_f NativeInteger_decode_aper;
+per_type_encoder_f NativeInteger_encode_aper;
+asn_random_fill_f  NativeInteger_random_fill;
+
+#define NativeInteger_constraint  asn_generic_no_constraint
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _NativeInteger_H_ */
diff --git a/src/s1ap/asn1c/asnGenFiles/NextPagingAreaScope.h b/src/s1ap/asn1c/asnGenFiles/NextPagingAreaScope.h
new file mode 100644
index 0000000..d1d1c6d
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/NextPagingAreaScope.h
@@ -0,0 +1,56 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_NextPagingAreaScope_H_
+#define	_NextPagingAreaScope_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum NextPagingAreaScope {
+	NextPagingAreaScope_same	= 0,
+	NextPagingAreaScope_changed	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_NextPagingAreaScope;
+
+/* NextPagingAreaScope */
+typedef long	 NextPagingAreaScope_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_NextPagingAreaScope_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_NextPagingAreaScope;
+extern const asn_INTEGER_specifics_t asn_SPC_NextPagingAreaScope_specs_1;
+asn_struct_free_f NextPagingAreaScope_free;
+asn_struct_print_f NextPagingAreaScope_print;
+asn_constr_check_f NextPagingAreaScope_constraint;
+ber_type_decoder_f NextPagingAreaScope_decode_ber;
+der_type_encoder_f NextPagingAreaScope_encode_der;
+xer_type_decoder_f NextPagingAreaScope_decode_xer;
+xer_type_encoder_f NextPagingAreaScope_encode_xer;
+oer_type_decoder_f NextPagingAreaScope_decode_oer;
+oer_type_encoder_f NextPagingAreaScope_encode_oer;
+per_type_decoder_f NextPagingAreaScope_decode_uper;
+per_type_encoder_f NextPagingAreaScope_encode_uper;
+per_type_decoder_f NextPagingAreaScope_decode_aper;
+per_type_encoder_f NextPagingAreaScope_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _NextPagingAreaScope_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/NumberOfBroadcasts.h b/src/s1ap/asn1c/asnGenFiles/NumberOfBroadcasts.h
new file mode 100644
index 0000000..ec5e9cb
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/NumberOfBroadcasts.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_NumberOfBroadcasts_H_
+#define	_NumberOfBroadcasts_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* NumberOfBroadcasts */
+typedef long	 NumberOfBroadcasts_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_NumberOfBroadcasts_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_NumberOfBroadcasts;
+asn_struct_free_f NumberOfBroadcasts_free;
+asn_struct_print_f NumberOfBroadcasts_print;
+asn_constr_check_f NumberOfBroadcasts_constraint;
+ber_type_decoder_f NumberOfBroadcasts_decode_ber;
+der_type_encoder_f NumberOfBroadcasts_encode_der;
+xer_type_decoder_f NumberOfBroadcasts_decode_xer;
+xer_type_encoder_f NumberOfBroadcasts_encode_xer;
+oer_type_decoder_f NumberOfBroadcasts_decode_oer;
+oer_type_encoder_f NumberOfBroadcasts_encode_oer;
+per_type_decoder_f NumberOfBroadcasts_decode_uper;
+per_type_encoder_f NumberOfBroadcasts_encode_uper;
+per_type_decoder_f NumberOfBroadcasts_decode_aper;
+per_type_encoder_f NumberOfBroadcasts_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _NumberOfBroadcasts_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/NumberofBroadcastRequest.h b/src/s1ap/asn1c/asnGenFiles/NumberofBroadcastRequest.h
new file mode 100644
index 0000000..54fd539
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/NumberofBroadcastRequest.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_NumberofBroadcastRequest_H_
+#define	_NumberofBroadcastRequest_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* NumberofBroadcastRequest */
+typedef long	 NumberofBroadcastRequest_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_NumberofBroadcastRequest_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_NumberofBroadcastRequest;
+asn_struct_free_f NumberofBroadcastRequest_free;
+asn_struct_print_f NumberofBroadcastRequest_print;
+asn_constr_check_f NumberofBroadcastRequest_constraint;
+ber_type_decoder_f NumberofBroadcastRequest_decode_ber;
+der_type_encoder_f NumberofBroadcastRequest_encode_der;
+xer_type_decoder_f NumberofBroadcastRequest_decode_xer;
+xer_type_encoder_f NumberofBroadcastRequest_encode_xer;
+oer_type_decoder_f NumberofBroadcastRequest_decode_oer;
+oer_type_encoder_f NumberofBroadcastRequest_encode_oer;
+per_type_decoder_f NumberofBroadcastRequest_decode_uper;
+per_type_encoder_f NumberofBroadcastRequest_encode_uper;
+per_type_decoder_f NumberofBroadcastRequest_decode_aper;
+per_type_encoder_f NumberofBroadcastRequest_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _NumberofBroadcastRequest_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/OBJECT_IDENTIFIER.h b/src/s1ap/asn1c/asnGenFiles/OBJECT_IDENTIFIER.h
new file mode 100644
index 0000000..087c6fd
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/OBJECT_IDENTIFIER.h
@@ -0,0 +1,156 @@
+/*
+ * Copyright (c) 2003-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+#ifndef	_OBJECT_IDENTIFIER_H_
+#define	_OBJECT_IDENTIFIER_H_
+
+#include <asn_application.h>
+#include <asn_codecs_prim.h>
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef uint32_t asn_oid_arc_t;
+#define ASN_OID_ARC_MAX (~((asn_oid_arc_t)0))
+
+typedef ASN__PRIMITIVE_TYPE_t OBJECT_IDENTIFIER_t;
+
+extern asn_TYPE_descriptor_t asn_DEF_OBJECT_IDENTIFIER;
+extern asn_TYPE_operation_t asn_OP_OBJECT_IDENTIFIER;
+
+asn_struct_print_f OBJECT_IDENTIFIER_print;
+asn_constr_check_f OBJECT_IDENTIFIER_constraint;
+der_type_encoder_f OBJECT_IDENTIFIER_encode_der;
+xer_type_decoder_f OBJECT_IDENTIFIER_decode_xer;
+xer_type_encoder_f OBJECT_IDENTIFIER_encode_xer;
+asn_random_fill_f  OBJECT_IDENTIFIER_random_fill;
+
+#define OBJECT_IDENTIFIER_free           ASN__PRIMITIVE_TYPE_free
+#define OBJECT_IDENTIFIER_compare        OCTET_STRING_compare
+#define OBJECT_IDENTIFIER_decode_ber     ber_decode_primitive
+#define OBJECT_IDENTIFIER_encode_der     der_encode_primitive
+#define OBJECT_IDENTIFIER_decode_oer     oer_decode_primitive
+#define OBJECT_IDENTIFIER_encode_oer     oer_encode_primitive
+#define OBJECT_IDENTIFIER_decode_uper    OCTET_STRING_decode_uper
+#define OBJECT_IDENTIFIER_encode_uper    OCTET_STRING_encode_uper
+#define OBJECT_IDENTIFIER_decode_aper    OCTET_STRING_decode_aper
+#define OBJECT_IDENTIFIER_encode_aper    OCTET_STRING_encode_aper
+
+/**********************************
+ * Some handy conversion routines *
+ **********************************/
+
+/*
+ * This function fills an (arcs) array with OBJECT IDENTIFIER arcs
+ * up to specified (arc_slots) elements.
+ *
+ * EXAMPLE:
+ * 	void print_arcs(OBJECT_IDENTIFIER_t *oid) {
+ * 		asn_oid_arc_t fixed_arcs[10];	// Try with fixed space first
+ * 		asn_oid_arc_t *arcs = fixed_arcs;
+ * 		size_t arc_slots = sizeof(fixed_arcs)/sizeof(fixed_arcs[0]); // 10
+ * 		ssize_t count;	// Real number of arcs.
+ * 		int i;
+ *
+ * 		count = OBJECT_IDENTIFIER_get_arcs(oid, arcs, arc_slots);
+ * 		// If necessary, reallocate arcs array and try again.
+ * 		if(count > arc_slots) {
+ * 			arc_slots = count;
+ * 			arcs = malloc(sizeof(asn_oid_arc_t) * arc_slots);
+ * 			if(!arcs) return;
+ * 			count = OBJECT_IDENTIFIER_get_arcs(oid, arcs, arc_slots);
+ * 			assert(count == arc_slots);
+ * 		}
+ *
+ * 		// Print the contents of the arcs array.
+ * 		for(i = 0; i < count; i++)
+ * 			printf("%"PRIu32"\n", arcs[i]);
+ *
+ * 		// Avoid memory leak.
+ * 		if(arcs != fixed_arcs) free(arcs);
+ * 	}
+ *
+ * RETURN VALUES:
+ * -1/EINVAL:	Invalid arguments (oid is missing)
+ * -1/ERANGE:	One or more arcs have value out of array cell type range.
+ * >=0:		Number of arcs contained in the OBJECT IDENTIFIER
+ *
+ * WARNING: The function always returns the actual number of arcs,
+ * even if there is no sufficient (arc_slots) provided.
+ */
+ssize_t OBJECT_IDENTIFIER_get_arcs(const OBJECT_IDENTIFIER_t *oid,
+                                   asn_oid_arc_t *arcs, size_t arc_slots);
+
+/*
+ * This functions initializes the OBJECT IDENTIFIER object with
+ * the given set of arcs.
+ * The minimum of two arcs must be present; some restrictions apply.
+ * RETURN VALUES:
+ * -1/EINVAL:	Invalid arguments
+ * -1/ERANGE:	The first two arcs do not conform to ASN.1 restrictions.
+ * -1/ENOMEM:	Memory allocation failed
+ * 0:		The object was initialized with new arcs.
+ */
+int OBJECT_IDENTIFIER_set_arcs(OBJECT_IDENTIFIER_t *oid,
+                               const asn_oid_arc_t *arcs, size_t arcs_count);
+
+
+/*
+ * Parse the OBJECT IDENTIFIER textual representation ("1.3.6.1.4.1.9363").
+ * No arc can exceed the (0..ASN_OID_ARC_MAX, which is the same as UINT32_MAX).
+ * This function is not specific to OBJECT IDENTIFIER, it may be used to parse
+ * the RELATIVE-OID data, or any other data consisting of dot-separated
+ * series of numeric values.
+ *
+ * If (oid_txt_length == -1), the strlen() will be invoked to determine the
+ * size of the (oid_text) string.
+ * 
+ * After return, the optional (opt_oid_text_end) is set to the character after
+ * the last parsed one. (opt_oid_text_end) is never less than (oid_text).
+ * 
+ * RETURN VALUES:
+ *   -1:	Parse error.
+ * >= 0:	Number of arcs contained in the OBJECT IDENTIFIER.
+ * 
+ * WARNING: The function always returns the real number of arcs,
+ * even if there is no sufficient (arc_slots) provided.
+ * This is useful for (arc_slots) value estimation.
+ */
+ssize_t OBJECT_IDENTIFIER_parse_arcs(const char *oid_text,
+                                     ssize_t oid_txt_length,
+                                     asn_oid_arc_t *arcs, size_t arcs_count,
+                                     const char **opt_oid_text_end);
+
+/*
+ * Internal functions.
+ * Used by RELATIVE-OID implementation in particular.
+ */
+
+/*
+ * Retrieve a single arc of size from the (arcbuf) buffer.
+ * RETURN VALUES:
+ *  -1: Failed to retrieve the value from the (arcbuf).
+ *  >0: Number of bytes consumed from the (arcbuf), <= (arcbuf_len).
+ */
+ssize_t OBJECT_IDENTIFIER_get_single_arc(const uint8_t *arcbuf,
+                                         size_t arcbuf_len,
+                                         asn_oid_arc_t *ret_value);
+
+/*
+ * Write the unterminated arc value into the (arcbuf) which has the size at
+ * least (arcbuf_len).
+ * RETURN VALUES:
+ *   -1: (arcbuf_len) size is not sufficient to write the value.
+ *  <n>: Number of bytes appended to the arcbuf (<= arcbuf_len).
+ */
+ssize_t OBJECT_IDENTIFIER_set_single_arc(uint8_t *arcbuf, size_t arcbuf_len,
+                                         asn_oid_arc_t arc_value);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _OBJECT_IDENTIFIER_H_ */
diff --git a/src/s1ap/asn1c/asnGenFiles/OCTET_STRING.h b/src/s1ap/asn1c/asnGenFiles/OCTET_STRING.h
new file mode 100644
index 0000000..c2f8bae
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/OCTET_STRING.h
@@ -0,0 +1,102 @@
+/*-
+ * Copyright (c) 2003-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+#ifndef	_OCTET_STRING_H_
+#define	_OCTET_STRING_H_
+
+#include <asn_application.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct OCTET_STRING {
+	uint8_t *buf;	/* Buffer with consecutive OCTET_STRING bits */
+	size_t size;	/* Size of the buffer */
+
+	asn_struct_ctx_t _asn_ctx;	/* Parsing across buffer boundaries */
+} OCTET_STRING_t;
+
+extern asn_TYPE_descriptor_t asn_DEF_OCTET_STRING;
+extern asn_TYPE_operation_t asn_OP_OCTET_STRING;
+
+asn_struct_free_f OCTET_STRING_free;
+asn_struct_print_f OCTET_STRING_print;
+asn_struct_print_f OCTET_STRING_print_utf8;
+asn_struct_compare_f OCTET_STRING_compare;
+ber_type_decoder_f OCTET_STRING_decode_ber;
+der_type_encoder_f OCTET_STRING_encode_der;
+xer_type_decoder_f OCTET_STRING_decode_xer_hex;		/* Hexadecimal */
+xer_type_decoder_f OCTET_STRING_decode_xer_binary;	/* 01010111010 */
+xer_type_decoder_f OCTET_STRING_decode_xer_utf8;	/* ASCII/UTF-8 */
+xer_type_encoder_f OCTET_STRING_encode_xer;
+xer_type_encoder_f OCTET_STRING_encode_xer_utf8;
+oer_type_decoder_f OCTET_STRING_decode_oer;
+oer_type_encoder_f OCTET_STRING_encode_oer;
+per_type_decoder_f OCTET_STRING_decode_uper;
+per_type_encoder_f OCTET_STRING_encode_uper;
+per_type_decoder_f OCTET_STRING_decode_aper;
+per_type_encoder_f OCTET_STRING_encode_aper;
+asn_random_fill_f  OCTET_STRING_random_fill;
+
+#define OCTET_STRING_constraint  asn_generic_no_constraint
+#define OCTET_STRING_decode_xer  OCTET_STRING_decode_xer_hex
+
+/******************************
+ * Handy conversion routines. *
+ ******************************/
+
+/*
+ * This function clears the previous value of the OCTET STRING (if any)
+ * and then allocates a new memory with the specified content (str/size).
+ * If size = -1, the size of the original string will be determined
+ * using strlen(str).
+ * If str equals to NULL, the function will silently clear the
+ * current contents of the OCTET STRING.
+ * Returns 0 if it was possible to perform operation, -1 otherwise.
+ */
+int OCTET_STRING_fromBuf(OCTET_STRING_t *s, const char *str, int size);
+
+/* Handy conversion from the C string into the OCTET STRING. */
+#define	OCTET_STRING_fromString(s, str)	OCTET_STRING_fromBuf(s, str, -1)
+
+/*
+ * Allocate and fill the new OCTET STRING and return a pointer to the newly
+ * allocated object. NULL is permitted in str: the function will just allocate
+ * empty OCTET STRING.
+ */
+OCTET_STRING_t *OCTET_STRING_new_fromBuf(const asn_TYPE_descriptor_t *td,
+                                         const char *str, int size);
+
+/****************************
+ * Internally useful stuff. *
+ ****************************/
+
+typedef struct asn_OCTET_STRING_specifics_s {
+    /*
+     * Target structure description.
+     */
+    unsigned struct_size;   /* Size of the structure */
+    unsigned ctx_offset;    /* Offset of the asn_struct_ctx_t member */
+
+    enum asn_OS_Subvariant {
+        ASN_OSUBV_ANY, /* The open type (ANY) */
+        ASN_OSUBV_BIT, /* BIT STRING */
+        ASN_OSUBV_STR, /* String types, not {BMP,Universal}String  */
+        ASN_OSUBV_U16, /* 16-bit character (BMPString) */
+        ASN_OSUBV_U32  /* 32-bit character (UniversalString) */
+    } subvariant;
+} asn_OCTET_STRING_specifics_t;
+
+extern asn_OCTET_STRING_specifics_t asn_SPC_OCTET_STRING_specs;
+
+size_t OCTET_STRING_random_length_constrained(
+    const asn_TYPE_descriptor_t *, const asn_encoding_constraints_t *,
+    size_t max_length);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _OCTET_STRING_H_ */
diff --git a/src/s1ap/asn1c/asnGenFiles/OPEN_TYPE.h b/src/s1ap/asn1c/asnGenFiles/OPEN_TYPE.h
new file mode 100644
index 0000000..b0d023c
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/OPEN_TYPE.h
@@ -0,0 +1,77 @@
+/*-
+ * Copyright (c) 2017-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+#ifndef ASN_OPEN_TYPE_H
+#define ASN_OPEN_TYPE_H
+
+#include <asn_application.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define OPEN_TYPE_free CHOICE_free
+#define OPEN_TYPE_print CHOICE_print
+#define OPEN_TYPE_compare CHOICE_compare
+#define OPEN_TYPE_constraint CHOICE_constraint
+#define OPEN_TYPE_decode_ber NULL
+#define OPEN_TYPE_encode_der CHOICE_encode_der
+#define OPEN_TYPE_decode_xer NULL
+#define OPEN_TYPE_encode_xer CHOICE_encode_xer
+#define OPEN_TYPE_decode_oer NULL
+#define OPEN_TYPE_encode_oer CHOICE_encode_oer
+#define OPEN_TYPE_decode_uper NULL
+#define OPEN_TYPE_decode_aper NULL
+
+extern asn_TYPE_operation_t asn_OP_OPEN_TYPE;
+
+/*
+ * Decode an Open Type which is potentially constraiend
+ * by the other members of the parent structure.
+ */
+asn_dec_rval_t OPEN_TYPE_ber_get(const asn_codec_ctx_t *opt_codec_ctx,
+                                 const asn_TYPE_descriptor_t *parent_type,
+                                 void *parent_structure,
+                                 const asn_TYPE_member_t *element,
+                                 const void *ptr, size_t size);
+
+asn_dec_rval_t OPEN_TYPE_xer_get(const asn_codec_ctx_t *opt_codec_ctx,
+                                 const asn_TYPE_descriptor_t *parent_type,
+                                 void *parent_structure,
+                                 const asn_TYPE_member_t *element,
+                                 const void *ptr, size_t size);
+
+asn_dec_rval_t OPEN_TYPE_oer_get(const asn_codec_ctx_t *opt_codec_ctx,
+                                 const asn_TYPE_descriptor_t *parent_type,
+                                 void *parent_structure,
+                                 asn_TYPE_member_t *element, const void *ptr,
+                                 size_t size);
+
+asn_dec_rval_t OPEN_TYPE_uper_get(const asn_codec_ctx_t *opt_codec_ctx,
+                                  const asn_TYPE_descriptor_t *parent_type,
+                                  void *parent_structure,
+                                  const asn_TYPE_member_t *element,
+                                  asn_per_data_t *pd);
+
+asn_dec_rval_t OPEN_TYPE_aper_get(const asn_codec_ctx_t *opt_codec_ctx,
+                                  const asn_TYPE_descriptor_t *parent_type,
+                                  void *parent_structure,
+                                  const asn_TYPE_member_t *element,
+                                  asn_per_data_t *pd);
+
+asn_enc_rval_t OPEN_TYPE_encode_uper(
+    const asn_TYPE_descriptor_t *type_descriptor,
+    const asn_per_constraints_t *constraints, const void *struct_ptr,
+    asn_per_outp_t *per_output);
+
+asn_enc_rval_t OPEN_TYPE_encode_aper(
+    const asn_TYPE_descriptor_t *type_descriptor,
+    const asn_per_constraints_t *constraints, const void *struct_ptr,
+    asn_per_outp_t *per_output);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* ASN_OPEN_TYPE_H */
diff --git a/src/s1ap/asn1c/asnGenFiles/ObjectDescriptor.h b/src/s1ap/asn1c/asnGenFiles/ObjectDescriptor.h
new file mode 100644
index 0000000..fa1c1fc
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ObjectDescriptor.h
@@ -0,0 +1,35 @@
+/*-
+ * Copyright (c) 2003-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+#ifndef	_ObjectDescriptor_H_
+#define	_ObjectDescriptor_H_
+
+#include <GraphicString.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef GraphicString_t ObjectDescriptor_t;  /* Implemented via GraphicString */
+
+extern asn_TYPE_descriptor_t asn_DEF_ObjectDescriptor;
+extern asn_TYPE_operation_t asn_OP_ObjectDescriptor;
+
+#define ObjectDescriptor_free         OCTET_STRING_free
+#define ObjectDescriptor_print        OCTET_STRING_print_utf8
+#define ObjectDescriptor_constraint   asn_generic_unknown_constraint
+#define ObjectDescriptor_decode_ber   OCTET_STRING_decode_ber
+#define ObjectDescriptor_encode_der   OCTET_STRING_encode_der
+#define ObjectDescriptor_decode_xer   OCTET_STRING_decode_xer_utf8
+#define ObjectDescriptor_encode_xer   OCTET_STRING_encode_xer_utf8
+#define ObjectDescriptor_decode_uper  OCTET_STRING_decode_uper
+#define ObjectDescriptor_encode_uper  OCTET_STRING_encode_uper
+#define ObjectDescriptor_decode_aper  OCTET_STRING_decode_aper
+#define ObjectDescriptor_encode_aper  OCTET_STRING_encode_aper
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ObjectDescriptor_H_ */
diff --git a/src/s1ap/asn1c/asnGenFiles/OldBSS-ToNewBSS-Information.h b/src/s1ap/asn1c/asnGenFiles/OldBSS-ToNewBSS-Information.h
new file mode 100644
index 0000000..6c3b2c0
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/OldBSS-ToNewBSS-Information.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_OldBSS_ToNewBSS_Information_H_
+#define	_OldBSS_ToNewBSS_Information_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* OldBSS-ToNewBSS-Information */
+typedef OCTET_STRING_t	 OldBSS_ToNewBSS_Information_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_OldBSS_ToNewBSS_Information;
+asn_struct_free_f OldBSS_ToNewBSS_Information_free;
+asn_struct_print_f OldBSS_ToNewBSS_Information_print;
+asn_constr_check_f OldBSS_ToNewBSS_Information_constraint;
+ber_type_decoder_f OldBSS_ToNewBSS_Information_decode_ber;
+der_type_encoder_f OldBSS_ToNewBSS_Information_encode_der;
+xer_type_decoder_f OldBSS_ToNewBSS_Information_decode_xer;
+xer_type_encoder_f OldBSS_ToNewBSS_Information_encode_xer;
+oer_type_decoder_f OldBSS_ToNewBSS_Information_decode_oer;
+oer_type_encoder_f OldBSS_ToNewBSS_Information_encode_oer;
+per_type_decoder_f OldBSS_ToNewBSS_Information_decode_uper;
+per_type_encoder_f OldBSS_ToNewBSS_Information_encode_uper;
+per_type_decoder_f OldBSS_ToNewBSS_Information_decode_aper;
+per_type_encoder_f OldBSS_ToNewBSS_Information_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _OldBSS_ToNewBSS_Information_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/OverloadAction.h b/src/s1ap/asn1c/asnGenFiles/OverloadAction.h
new file mode 100644
index 0000000..de7abd5
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/OverloadAction.h
@@ -0,0 +1,61 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_OverloadAction_H_
+#define	_OverloadAction_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum OverloadAction {
+	OverloadAction_reject_non_emergency_mo_dt	= 0,
+	OverloadAction_reject_rrc_cr_signalling	= 1,
+	OverloadAction_permit_emergency_sessions_and_mobile_terminated_services_only	= 2,
+	/*
+	 * Enumeration is extensible
+	 */
+	OverloadAction_permit_high_priority_sessions_and_mobile_terminated_services_only	= 3,
+	OverloadAction_reject_delay_tolerant_access	= 4,
+	OverloadAction_permit_high_priority_sessions_and_exception_reporting_and_mobile_terminated_services_only	= 5,
+	OverloadAction_not_accept_mo_data_or_delay_tolerant_access_from_CP_CIoT	= 6
+} e_OverloadAction;
+
+/* OverloadAction */
+typedef long	 OverloadAction_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_OverloadAction_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_OverloadAction;
+extern const asn_INTEGER_specifics_t asn_SPC_OverloadAction_specs_1;
+asn_struct_free_f OverloadAction_free;
+asn_struct_print_f OverloadAction_print;
+asn_constr_check_f OverloadAction_constraint;
+ber_type_decoder_f OverloadAction_decode_ber;
+der_type_encoder_f OverloadAction_encode_der;
+xer_type_decoder_f OverloadAction_decode_xer;
+xer_type_encoder_f OverloadAction_encode_xer;
+oer_type_decoder_f OverloadAction_decode_oer;
+oer_type_encoder_f OverloadAction_encode_oer;
+per_type_decoder_f OverloadAction_decode_uper;
+per_type_encoder_f OverloadAction_encode_uper;
+per_type_decoder_f OverloadAction_decode_aper;
+per_type_encoder_f OverloadAction_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _OverloadAction_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/OverloadResponse.h b/src/s1ap/asn1c/asnGenFiles/OverloadResponse.h
new file mode 100644
index 0000000..fbb09cd
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/OverloadResponse.h
@@ -0,0 +1,56 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_OverloadResponse_H_
+#define	_OverloadResponse_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "OverloadAction.h"
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum OverloadResponse_PR {
+	OverloadResponse_PR_NOTHING,	/* No components present */
+	OverloadResponse_PR_overloadAction
+	/* Extensions may appear below */
+	
+} OverloadResponse_PR;
+
+/* OverloadResponse */
+typedef struct OverloadResponse {
+	OverloadResponse_PR present;
+	union OverloadResponse_u {
+		OverloadAction_t	 overloadAction;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} OverloadResponse_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_OverloadResponse;
+extern asn_CHOICE_specifics_t asn_SPC_OverloadResponse_specs_1;
+extern asn_TYPE_member_t asn_MBR_OverloadResponse_1[1];
+extern asn_per_constraints_t asn_PER_type_OverloadResponse_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _OverloadResponse_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/OverloadStart.h b/src/s1ap/asn1c/asnGenFiles/OverloadStart.h
new file mode 100644
index 0000000..3b99027
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/OverloadStart.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_OverloadStart_H_
+#define	_OverloadStart_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* OverloadStart */
+typedef struct OverloadStart {
+	ProtocolIE_Container_129P61_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} OverloadStart_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_OverloadStart;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _OverloadStart_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/OverloadStop.h b/src/s1ap/asn1c/asnGenFiles/OverloadStop.h
new file mode 100644
index 0000000..af9fd67
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/OverloadStop.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_OverloadStop_H_
+#define	_OverloadStop_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* OverloadStop */
+typedef struct OverloadStop {
+	ProtocolIE_Container_129P62_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} OverloadStop_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_OverloadStop;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _OverloadStop_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/PDCP-SN.h b/src/s1ap/asn1c/asnGenFiles/PDCP-SN.h
new file mode 100644
index 0000000..62dd773
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/PDCP-SN.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_PDCP_SN_H_
+#define	_PDCP_SN_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* PDCP-SN */
+typedef long	 PDCP_SN_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_PDCP_SN_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_PDCP_SN;
+asn_struct_free_f PDCP_SN_free;
+asn_struct_print_f PDCP_SN_print;
+asn_constr_check_f PDCP_SN_constraint;
+ber_type_decoder_f PDCP_SN_decode_ber;
+der_type_encoder_f PDCP_SN_encode_der;
+xer_type_decoder_f PDCP_SN_decode_xer;
+xer_type_encoder_f PDCP_SN_encode_xer;
+oer_type_decoder_f PDCP_SN_decode_oer;
+oer_type_encoder_f PDCP_SN_encode_oer;
+per_type_decoder_f PDCP_SN_decode_uper;
+per_type_encoder_f PDCP_SN_encode_uper;
+per_type_decoder_f PDCP_SN_decode_aper;
+per_type_encoder_f PDCP_SN_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _PDCP_SN_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/PDCP-SNExtended.h b/src/s1ap/asn1c/asnGenFiles/PDCP-SNExtended.h
new file mode 100644
index 0000000..912acf5
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/PDCP-SNExtended.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_PDCP_SNExtended_H_
+#define	_PDCP_SNExtended_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* PDCP-SNExtended */
+typedef long	 PDCP_SNExtended_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_PDCP_SNExtended_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_PDCP_SNExtended;
+asn_struct_free_f PDCP_SNExtended_free;
+asn_struct_print_f PDCP_SNExtended_print;
+asn_constr_check_f PDCP_SNExtended_constraint;
+ber_type_decoder_f PDCP_SNExtended_decode_ber;
+der_type_encoder_f PDCP_SNExtended_encode_der;
+xer_type_decoder_f PDCP_SNExtended_decode_xer;
+xer_type_encoder_f PDCP_SNExtended_encode_xer;
+oer_type_decoder_f PDCP_SNExtended_decode_oer;
+oer_type_encoder_f PDCP_SNExtended_encode_oer;
+per_type_decoder_f PDCP_SNExtended_decode_uper;
+per_type_encoder_f PDCP_SNExtended_encode_uper;
+per_type_decoder_f PDCP_SNExtended_decode_aper;
+per_type_encoder_f PDCP_SNExtended_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _PDCP_SNExtended_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/PDCP-SNlength18.h b/src/s1ap/asn1c/asnGenFiles/PDCP-SNlength18.h
new file mode 100644
index 0000000..5f3b656
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/PDCP-SNlength18.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_PDCP_SNlength18_H_
+#define	_PDCP_SNlength18_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* PDCP-SNlength18 */
+typedef long	 PDCP_SNlength18_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_PDCP_SNlength18_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_PDCP_SNlength18;
+asn_struct_free_f PDCP_SNlength18_free;
+asn_struct_print_f PDCP_SNlength18_print;
+asn_constr_check_f PDCP_SNlength18_constraint;
+ber_type_decoder_f PDCP_SNlength18_decode_ber;
+der_type_encoder_f PDCP_SNlength18_encode_der;
+xer_type_decoder_f PDCP_SNlength18_decode_xer;
+xer_type_encoder_f PDCP_SNlength18_encode_xer;
+oer_type_decoder_f PDCP_SNlength18_decode_oer;
+oer_type_encoder_f PDCP_SNlength18_encode_oer;
+per_type_decoder_f PDCP_SNlength18_decode_uper;
+per_type_encoder_f PDCP_SNlength18_encode_uper;
+per_type_decoder_f PDCP_SNlength18_decode_aper;
+per_type_encoder_f PDCP_SNlength18_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _PDCP_SNlength18_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/PLMNAreaBasedQMC.h b/src/s1ap/asn1c/asnGenFiles/PLMNAreaBasedQMC.h
new file mode 100644
index 0000000..8c6baf3
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/PLMNAreaBasedQMC.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_PLMNAreaBasedQMC_H_
+#define	_PLMNAreaBasedQMC_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "PLMNListforQMC.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* PLMNAreaBasedQMC */
+typedef struct PLMNAreaBasedQMC {
+	PLMNListforQMC_t	 plmnListforQMC;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} PLMNAreaBasedQMC_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_PLMNAreaBasedQMC;
+extern asn_SEQUENCE_specifics_t asn_SPC_PLMNAreaBasedQMC_specs_1;
+extern asn_TYPE_member_t asn_MBR_PLMNAreaBasedQMC_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _PLMNAreaBasedQMC_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/PLMNListforQMC.h b/src/s1ap/asn1c/asnGenFiles/PLMNListforQMC.h
new file mode 100644
index 0000000..4eb8f6e
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/PLMNListforQMC.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_PLMNListforQMC_H_
+#define	_PLMNListforQMC_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "PLMNidentity.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* PLMNListforQMC */
+typedef struct PLMNListforQMC {
+	A_SEQUENCE_OF(PLMNidentity_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} PLMNListforQMC_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_PLMNListforQMC;
+extern asn_SET_OF_specifics_t asn_SPC_PLMNListforQMC_specs_1;
+extern asn_TYPE_member_t asn_MBR_PLMNListforQMC_1[1];
+extern asn_per_constraints_t asn_PER_type_PLMNListforQMC_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _PLMNListforQMC_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/PLMNidentity.h b/src/s1ap/asn1c/asnGenFiles/PLMNidentity.h
new file mode 100644
index 0000000..ab1603e
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/PLMNidentity.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_PLMNidentity_H_
+#define	_PLMNidentity_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "TBCD-STRING.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* PLMNidentity */
+typedef TBCD_STRING_t	 PLMNidentity_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_PLMNidentity_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_PLMNidentity;
+asn_struct_free_f PLMNidentity_free;
+asn_struct_print_f PLMNidentity_print;
+asn_constr_check_f PLMNidentity_constraint;
+ber_type_decoder_f PLMNidentity_decode_ber;
+der_type_encoder_f PLMNidentity_encode_der;
+xer_type_decoder_f PLMNidentity_decode_xer;
+xer_type_encoder_f PLMNidentity_encode_xer;
+oer_type_decoder_f PLMNidentity_decode_oer;
+oer_type_encoder_f PLMNidentity_encode_oer;
+per_type_decoder_f PLMNidentity_decode_uper;
+per_type_encoder_f PLMNidentity_encode_uper;
+per_type_decoder_f PLMNidentity_decode_aper;
+per_type_encoder_f PLMNidentity_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _PLMNidentity_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/PS-ServiceNotAvailable.h b/src/s1ap/asn1c/asnGenFiles/PS-ServiceNotAvailable.h
new file mode 100644
index 0000000..64a6ee5
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/PS-ServiceNotAvailable.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_PS_ServiceNotAvailable_H_
+#define	_PS_ServiceNotAvailable_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum PS_ServiceNotAvailable {
+	PS_ServiceNotAvailable_ps_service_not_available	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_PS_ServiceNotAvailable;
+
+/* PS-ServiceNotAvailable */
+typedef long	 PS_ServiceNotAvailable_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_PS_ServiceNotAvailable_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_PS_ServiceNotAvailable;
+extern const asn_INTEGER_specifics_t asn_SPC_PS_ServiceNotAvailable_specs_1;
+asn_struct_free_f PS_ServiceNotAvailable_free;
+asn_struct_print_f PS_ServiceNotAvailable_print;
+asn_constr_check_f PS_ServiceNotAvailable_constraint;
+ber_type_decoder_f PS_ServiceNotAvailable_decode_ber;
+der_type_encoder_f PS_ServiceNotAvailable_encode_der;
+xer_type_decoder_f PS_ServiceNotAvailable_decode_xer;
+xer_type_encoder_f PS_ServiceNotAvailable_encode_xer;
+oer_type_decoder_f PS_ServiceNotAvailable_decode_oer;
+oer_type_encoder_f PS_ServiceNotAvailable_encode_oer;
+per_type_decoder_f PS_ServiceNotAvailable_decode_uper;
+per_type_encoder_f PS_ServiceNotAvailable_encode_uper;
+per_type_decoder_f PS_ServiceNotAvailable_decode_aper;
+per_type_encoder_f PS_ServiceNotAvailable_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _PS_ServiceNotAvailable_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/PSCellInformation.h b/src/s1ap/asn1c/asnGenFiles/PSCellInformation.h
new file mode 100644
index 0000000..961b090
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/PSCellInformation.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_PSCellInformation_H_
+#define	_PSCellInformation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "NR-CGI.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* PSCellInformation */
+typedef struct PSCellInformation {
+	NR_CGI_t	 nCGI;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} PSCellInformation_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_PSCellInformation;
+extern asn_SEQUENCE_specifics_t asn_SPC_PSCellInformation_specs_1;
+extern asn_TYPE_member_t asn_MBR_PSCellInformation_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _PSCellInformation_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/PWSFailureIndication.h b/src/s1ap/asn1c/asnGenFiles/PWSFailureIndication.h
new file mode 100644
index 0000000..cfe9392
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/PWSFailureIndication.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_PWSFailureIndication_H_
+#define	_PWSFailureIndication_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* PWSFailureIndication */
+typedef struct PWSFailureIndication {
+	ProtocolIE_Container_129P72_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} PWSFailureIndication_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_PWSFailureIndication;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _PWSFailureIndication_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/PWSRestartIndication.h b/src/s1ap/asn1c/asnGenFiles/PWSRestartIndication.h
new file mode 100644
index 0000000..4a5e2c0
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/PWSRestartIndication.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_PWSRestartIndication_H_
+#define	_PWSRestartIndication_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* PWSRestartIndication */
+typedef struct PWSRestartIndication {
+	ProtocolIE_Container_129P71_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} PWSRestartIndication_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_PWSRestartIndication;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _PWSRestartIndication_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/PWSfailedECGIList.h b/src/s1ap/asn1c/asnGenFiles/PWSfailedECGIList.h
new file mode 100644
index 0000000..760a309
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/PWSfailedECGIList.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_PWSfailedECGIList_H_
+#define	_PWSfailedECGIList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct EUTRAN_CGI;
+
+/* PWSfailedECGIList */
+typedef struct PWSfailedECGIList {
+	A_SEQUENCE_OF(struct EUTRAN_CGI) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} PWSfailedECGIList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_PWSfailedECGIList;
+extern asn_SET_OF_specifics_t asn_SPC_PWSfailedECGIList_specs_1;
+extern asn_TYPE_member_t asn_MBR_PWSfailedECGIList_1[1];
+extern asn_per_constraints_t asn_PER_type_PWSfailedECGIList_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _PWSfailedECGIList_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Packet-LossRate.h b/src/s1ap/asn1c/asnGenFiles/Packet-LossRate.h
new file mode 100644
index 0000000..3644bf2
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Packet-LossRate.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Packet_LossRate_H_
+#define	_Packet_LossRate_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Packet-LossRate */
+typedef long	 Packet_LossRate_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_Packet_LossRate_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_Packet_LossRate;
+asn_struct_free_f Packet_LossRate_free;
+asn_struct_print_f Packet_LossRate_print;
+asn_constr_check_f Packet_LossRate_constraint;
+ber_type_decoder_f Packet_LossRate_decode_ber;
+der_type_encoder_f Packet_LossRate_encode_der;
+xer_type_decoder_f Packet_LossRate_decode_xer;
+xer_type_encoder_f Packet_LossRate_encode_xer;
+oer_type_decoder_f Packet_LossRate_decode_oer;
+oer_type_encoder_f Packet_LossRate_encode_oer;
+per_type_decoder_f Packet_LossRate_decode_uper;
+per_type_encoder_f Packet_LossRate_encode_uper;
+per_type_decoder_f Packet_LossRate_decode_aper;
+per_type_encoder_f Packet_LossRate_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Packet_LossRate_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Paging-eDRX-Cycle.h b/src/s1ap/asn1c/asnGenFiles/Paging-eDRX-Cycle.h
new file mode 100644
index 0000000..9a325f8
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Paging-eDRX-Cycle.h
@@ -0,0 +1,68 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Paging_eDRX_Cycle_H_
+#define	_Paging_eDRX_Cycle_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum Paging_eDRX_Cycle {
+	Paging_eDRX_Cycle_hfhalf	= 0,
+	Paging_eDRX_Cycle_hf1	= 1,
+	Paging_eDRX_Cycle_hf2	= 2,
+	Paging_eDRX_Cycle_hf4	= 3,
+	Paging_eDRX_Cycle_hf6	= 4,
+	Paging_eDRX_Cycle_hf8	= 5,
+	Paging_eDRX_Cycle_hf10	= 6,
+	Paging_eDRX_Cycle_hf12	= 7,
+	Paging_eDRX_Cycle_hf14	= 8,
+	Paging_eDRX_Cycle_hf16	= 9,
+	Paging_eDRX_Cycle_hf32	= 10,
+	Paging_eDRX_Cycle_hf64	= 11,
+	Paging_eDRX_Cycle_hf128	= 12,
+	Paging_eDRX_Cycle_hf256	= 13
+	/*
+	 * Enumeration is extensible
+	 */
+} e_Paging_eDRX_Cycle;
+
+/* Paging-eDRX-Cycle */
+typedef long	 Paging_eDRX_Cycle_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_Paging_eDRX_Cycle_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_Paging_eDRX_Cycle;
+extern const asn_INTEGER_specifics_t asn_SPC_Paging_eDRX_Cycle_specs_1;
+asn_struct_free_f Paging_eDRX_Cycle_free;
+asn_struct_print_f Paging_eDRX_Cycle_print;
+asn_constr_check_f Paging_eDRX_Cycle_constraint;
+ber_type_decoder_f Paging_eDRX_Cycle_decode_ber;
+der_type_encoder_f Paging_eDRX_Cycle_encode_der;
+xer_type_decoder_f Paging_eDRX_Cycle_decode_xer;
+xer_type_encoder_f Paging_eDRX_Cycle_encode_xer;
+oer_type_decoder_f Paging_eDRX_Cycle_decode_oer;
+oer_type_encoder_f Paging_eDRX_Cycle_encode_oer;
+per_type_decoder_f Paging_eDRX_Cycle_decode_uper;
+per_type_encoder_f Paging_eDRX_Cycle_encode_uper;
+per_type_decoder_f Paging_eDRX_Cycle_decode_aper;
+per_type_encoder_f Paging_eDRX_Cycle_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Paging_eDRX_Cycle_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Paging-eDRXInformation.h b/src/s1ap/asn1c/asnGenFiles/Paging-eDRXInformation.h
new file mode 100644
index 0000000..e4a0e5d
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Paging-eDRXInformation.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Paging_eDRXInformation_H_
+#define	_Paging_eDRXInformation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "Paging-eDRX-Cycle.h"
+#include "PagingTimeWindow.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* Paging-eDRXInformation */
+typedef struct Paging_eDRXInformation {
+	Paging_eDRX_Cycle_t	 paging_eDRX_Cycle;
+	PagingTimeWindow_t	*pagingTimeWindow;	/* OPTIONAL */
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} Paging_eDRXInformation_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_Paging_eDRXInformation;
+extern asn_SEQUENCE_specifics_t asn_SPC_Paging_eDRXInformation_specs_1;
+extern asn_TYPE_member_t asn_MBR_Paging_eDRXInformation_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Paging_eDRXInformation_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Paging.h b/src/s1ap/asn1c/asnGenFiles/Paging.h
new file mode 100644
index 0000000..f2f2b2f
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Paging.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Paging_H_
+#define	_Paging_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Paging */
+typedef struct Paging {
+	ProtocolIE_Container_129P22_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} Paging_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_Paging;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Paging_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/PagingAttemptCount.h b/src/s1ap/asn1c/asnGenFiles/PagingAttemptCount.h
new file mode 100644
index 0000000..5c0dd0e
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/PagingAttemptCount.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_PagingAttemptCount_H_
+#define	_PagingAttemptCount_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* PagingAttemptCount */
+typedef long	 PagingAttemptCount_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_PagingAttemptCount_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_PagingAttemptCount;
+asn_struct_free_f PagingAttemptCount_free;
+asn_struct_print_f PagingAttemptCount_print;
+asn_constr_check_f PagingAttemptCount_constraint;
+ber_type_decoder_f PagingAttemptCount_decode_ber;
+der_type_encoder_f PagingAttemptCount_encode_der;
+xer_type_decoder_f PagingAttemptCount_decode_xer;
+xer_type_encoder_f PagingAttemptCount_encode_xer;
+oer_type_decoder_f PagingAttemptCount_decode_oer;
+oer_type_encoder_f PagingAttemptCount_encode_oer;
+per_type_decoder_f PagingAttemptCount_decode_uper;
+per_type_encoder_f PagingAttemptCount_encode_uper;
+per_type_decoder_f PagingAttemptCount_decode_aper;
+per_type_encoder_f PagingAttemptCount_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _PagingAttemptCount_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/PagingAttemptInformation.h b/src/s1ap/asn1c/asnGenFiles/PagingAttemptInformation.h
new file mode 100644
index 0000000..7bf54ec
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/PagingAttemptInformation.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_PagingAttemptInformation_H_
+#define	_PagingAttemptInformation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "PagingAttemptCount.h"
+#include "IntendedNumberOfPagingAttempts.h"
+#include "NextPagingAreaScope.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* PagingAttemptInformation */
+typedef struct PagingAttemptInformation {
+	PagingAttemptCount_t	 pagingAttemptCount;
+	IntendedNumberOfPagingAttempts_t	 intendedNumberOfPagingAttempts;
+	NextPagingAreaScope_t	*nextPagingAreaScope;	/* OPTIONAL */
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} PagingAttemptInformation_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_PagingAttemptInformation;
+extern asn_SEQUENCE_specifics_t asn_SPC_PagingAttemptInformation_specs_1;
+extern asn_TYPE_member_t asn_MBR_PagingAttemptInformation_1[4];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _PagingAttemptInformation_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/PagingDRX.h b/src/s1ap/asn1c/asnGenFiles/PagingDRX.h
new file mode 100644
index 0000000..b8e668f
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/PagingDRX.h
@@ -0,0 +1,58 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_PagingDRX_H_
+#define	_PagingDRX_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum PagingDRX {
+	PagingDRX_v32	= 0,
+	PagingDRX_v64	= 1,
+	PagingDRX_v128	= 2,
+	PagingDRX_v256	= 3
+	/*
+	 * Enumeration is extensible
+	 */
+} e_PagingDRX;
+
+/* PagingDRX */
+typedef long	 PagingDRX_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_PagingDRX_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_PagingDRX;
+extern const asn_INTEGER_specifics_t asn_SPC_PagingDRX_specs_1;
+asn_struct_free_f PagingDRX_free;
+asn_struct_print_f PagingDRX_print;
+asn_constr_check_f PagingDRX_constraint;
+ber_type_decoder_f PagingDRX_decode_ber;
+der_type_encoder_f PagingDRX_encode_der;
+xer_type_decoder_f PagingDRX_decode_xer;
+xer_type_encoder_f PagingDRX_encode_xer;
+oer_type_decoder_f PagingDRX_decode_oer;
+oer_type_encoder_f PagingDRX_encode_oer;
+per_type_decoder_f PagingDRX_decode_uper;
+per_type_encoder_f PagingDRX_encode_uper;
+per_type_decoder_f PagingDRX_decode_aper;
+per_type_encoder_f PagingDRX_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _PagingDRX_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/PagingPriority.h b/src/s1ap/asn1c/asnGenFiles/PagingPriority.h
new file mode 100644
index 0000000..0b02bc9
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/PagingPriority.h
@@ -0,0 +1,62 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_PagingPriority_H_
+#define	_PagingPriority_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum PagingPriority {
+	PagingPriority_priolevel1	= 0,
+	PagingPriority_priolevel2	= 1,
+	PagingPriority_priolevel3	= 2,
+	PagingPriority_priolevel4	= 3,
+	PagingPriority_priolevel5	= 4,
+	PagingPriority_priolevel6	= 5,
+	PagingPriority_priolevel7	= 6,
+	PagingPriority_priolevel8	= 7
+	/*
+	 * Enumeration is extensible
+	 */
+} e_PagingPriority;
+
+/* PagingPriority */
+typedef long	 PagingPriority_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_PagingPriority_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_PagingPriority;
+extern const asn_INTEGER_specifics_t asn_SPC_PagingPriority_specs_1;
+asn_struct_free_f PagingPriority_free;
+asn_struct_print_f PagingPriority_print;
+asn_constr_check_f PagingPriority_constraint;
+ber_type_decoder_f PagingPriority_decode_ber;
+der_type_encoder_f PagingPriority_encode_der;
+xer_type_decoder_f PagingPriority_decode_xer;
+xer_type_encoder_f PagingPriority_encode_xer;
+oer_type_decoder_f PagingPriority_decode_oer;
+oer_type_encoder_f PagingPriority_encode_oer;
+per_type_decoder_f PagingPriority_decode_uper;
+per_type_encoder_f PagingPriority_encode_uper;
+per_type_decoder_f PagingPriority_decode_aper;
+per_type_encoder_f PagingPriority_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _PagingPriority_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/PagingTimeWindow.h b/src/s1ap/asn1c/asnGenFiles/PagingTimeWindow.h
new file mode 100644
index 0000000..d3e8b87
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/PagingTimeWindow.h
@@ -0,0 +1,70 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_PagingTimeWindow_H_
+#define	_PagingTimeWindow_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum PagingTimeWindow {
+	PagingTimeWindow_s1	= 0,
+	PagingTimeWindow_s2	= 1,
+	PagingTimeWindow_s3	= 2,
+	PagingTimeWindow_s4	= 3,
+	PagingTimeWindow_s5	= 4,
+	PagingTimeWindow_s6	= 5,
+	PagingTimeWindow_s7	= 6,
+	PagingTimeWindow_s8	= 7,
+	PagingTimeWindow_s9	= 8,
+	PagingTimeWindow_s10	= 9,
+	PagingTimeWindow_s11	= 10,
+	PagingTimeWindow_s12	= 11,
+	PagingTimeWindow_s13	= 12,
+	PagingTimeWindow_s14	= 13,
+	PagingTimeWindow_s15	= 14,
+	PagingTimeWindow_s16	= 15
+	/*
+	 * Enumeration is extensible
+	 */
+} e_PagingTimeWindow;
+
+/* PagingTimeWindow */
+typedef long	 PagingTimeWindow_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_PagingTimeWindow_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_PagingTimeWindow;
+extern const asn_INTEGER_specifics_t asn_SPC_PagingTimeWindow_specs_1;
+asn_struct_free_f PagingTimeWindow_free;
+asn_struct_print_f PagingTimeWindow_print;
+asn_constr_check_f PagingTimeWindow_constraint;
+ber_type_decoder_f PagingTimeWindow_decode_ber;
+der_type_encoder_f PagingTimeWindow_encode_der;
+xer_type_decoder_f PagingTimeWindow_decode_xer;
+xer_type_encoder_f PagingTimeWindow_encode_xer;
+oer_type_decoder_f PagingTimeWindow_decode_oer;
+oer_type_encoder_f PagingTimeWindow_encode_oer;
+per_type_decoder_f PagingTimeWindow_decode_uper;
+per_type_encoder_f PagingTimeWindow_encode_uper;
+per_type_decoder_f PagingTimeWindow_decode_aper;
+per_type_encoder_f PagingTimeWindow_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _PagingTimeWindow_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/PathSwitchRequest.h b/src/s1ap/asn1c/asnGenFiles/PathSwitchRequest.h
new file mode 100644
index 0000000..9fd53d1
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/PathSwitchRequest.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_PathSwitchRequest_H_
+#define	_PathSwitchRequest_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* PathSwitchRequest */
+typedef struct PathSwitchRequest {
+	ProtocolIE_Container_129P7_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} PathSwitchRequest_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_PathSwitchRequest;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _PathSwitchRequest_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/PathSwitchRequestAcknowledge.h b/src/s1ap/asn1c/asnGenFiles/PathSwitchRequestAcknowledge.h
new file mode 100644
index 0000000..c07b94f
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/PathSwitchRequestAcknowledge.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_PathSwitchRequestAcknowledge_H_
+#define	_PathSwitchRequestAcknowledge_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* PathSwitchRequestAcknowledge */
+typedef struct PathSwitchRequestAcknowledge {
+	ProtocolIE_Container_129P8_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} PathSwitchRequestAcknowledge_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_PathSwitchRequestAcknowledge;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _PathSwitchRequestAcknowledge_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/PathSwitchRequestFailure.h b/src/s1ap/asn1c/asnGenFiles/PathSwitchRequestFailure.h
new file mode 100644
index 0000000..532c7ee
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/PathSwitchRequestFailure.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_PathSwitchRequestFailure_H_
+#define	_PathSwitchRequestFailure_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* PathSwitchRequestFailure */
+typedef struct PathSwitchRequestFailure {
+	ProtocolIE_Container_129P9_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} PathSwitchRequestFailure_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_PathSwitchRequestFailure;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _PathSwitchRequestFailure_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/PedestrianUE.h b/src/s1ap/asn1c/asnGenFiles/PedestrianUE.h
new file mode 100644
index 0000000..60cc0a7
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/PedestrianUE.h
@@ -0,0 +1,56 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_PedestrianUE_H_
+#define	_PedestrianUE_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum PedestrianUE {
+	PedestrianUE_authorized	= 0,
+	PedestrianUE_not_authorized	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_PedestrianUE;
+
+/* PedestrianUE */
+typedef long	 PedestrianUE_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_PedestrianUE_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_PedestrianUE;
+extern const asn_INTEGER_specifics_t asn_SPC_PedestrianUE_specs_1;
+asn_struct_free_f PedestrianUE_free;
+asn_struct_print_f PedestrianUE_print;
+asn_constr_check_f PedestrianUE_constraint;
+ber_type_decoder_f PedestrianUE_decode_ber;
+der_type_encoder_f PedestrianUE_encode_der;
+xer_type_decoder_f PedestrianUE_decode_xer;
+xer_type_encoder_f PedestrianUE_encode_xer;
+oer_type_decoder_f PedestrianUE_decode_oer;
+oer_type_encoder_f PedestrianUE_encode_oer;
+per_type_decoder_f PedestrianUE_decode_uper;
+per_type_encoder_f PedestrianUE_encode_uper;
+per_type_decoder_f PedestrianUE_decode_aper;
+per_type_encoder_f PedestrianUE_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _PedestrianUE_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/PendingDataIndication.h b/src/s1ap/asn1c/asnGenFiles/PendingDataIndication.h
new file mode 100644
index 0000000..495a08c
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/PendingDataIndication.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_PendingDataIndication_H_
+#define	_PendingDataIndication_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum PendingDataIndication {
+	PendingDataIndication_true	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_PendingDataIndication;
+
+/* PendingDataIndication */
+typedef long	 PendingDataIndication_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_PendingDataIndication_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_PendingDataIndication;
+extern const asn_INTEGER_specifics_t asn_SPC_PendingDataIndication_specs_1;
+asn_struct_free_f PendingDataIndication_free;
+asn_struct_print_f PendingDataIndication_print;
+asn_constr_check_f PendingDataIndication_constraint;
+ber_type_decoder_f PendingDataIndication_decode_ber;
+der_type_encoder_f PendingDataIndication_encode_der;
+xer_type_decoder_f PendingDataIndication_decode_xer;
+xer_type_encoder_f PendingDataIndication_encode_xer;
+oer_type_decoder_f PendingDataIndication_decode_oer;
+oer_type_encoder_f PendingDataIndication_encode_oer;
+per_type_decoder_f PendingDataIndication_decode_uper;
+per_type_encoder_f PendingDataIndication_encode_uper;
+per_type_decoder_f PendingDataIndication_decode_aper;
+per_type_encoder_f PendingDataIndication_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _PendingDataIndication_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Port-Number.h b/src/s1ap/asn1c/asnGenFiles/Port-Number.h
new file mode 100644
index 0000000..d73e5f5
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Port-Number.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Port_Number_H_
+#define	_Port_Number_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Port-Number */
+typedef OCTET_STRING_t	 Port_Number_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_Port_Number_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_Port_Number;
+asn_struct_free_f Port_Number_free;
+asn_struct_print_f Port_Number_print;
+asn_constr_check_f Port_Number_constraint;
+ber_type_decoder_f Port_Number_decode_ber;
+der_type_encoder_f Port_Number_encode_der;
+xer_type_decoder_f Port_Number_decode_xer;
+xer_type_encoder_f Port_Number_encode_xer;
+oer_type_decoder_f Port_Number_decode_oer;
+oer_type_encoder_f Port_Number_encode_oer;
+per_type_decoder_f Port_Number_decode_uper;
+per_type_encoder_f Port_Number_encode_uper;
+per_type_decoder_f Port_Number_decode_aper;
+per_type_encoder_f Port_Number_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Port_Number_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Pre-emptionCapability.h b/src/s1ap/asn1c/asnGenFiles/Pre-emptionCapability.h
new file mode 100644
index 0000000..58d81c4
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Pre-emptionCapability.h
@@ -0,0 +1,53 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Pre_emptionCapability_H_
+#define	_Pre_emptionCapability_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum Pre_emptionCapability {
+	Pre_emptionCapability_shall_not_trigger_pre_emption	= 0,
+	Pre_emptionCapability_may_trigger_pre_emption	= 1
+} e_Pre_emptionCapability;
+
+/* Pre-emptionCapability */
+typedef long	 Pre_emptionCapability_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_Pre_emptionCapability_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_Pre_emptionCapability;
+extern const asn_INTEGER_specifics_t asn_SPC_Pre_emptionCapability_specs_1;
+asn_struct_free_f Pre_emptionCapability_free;
+asn_struct_print_f Pre_emptionCapability_print;
+asn_constr_check_f Pre_emptionCapability_constraint;
+ber_type_decoder_f Pre_emptionCapability_decode_ber;
+der_type_encoder_f Pre_emptionCapability_encode_der;
+xer_type_decoder_f Pre_emptionCapability_decode_xer;
+xer_type_encoder_f Pre_emptionCapability_encode_xer;
+oer_type_decoder_f Pre_emptionCapability_decode_oer;
+oer_type_encoder_f Pre_emptionCapability_encode_oer;
+per_type_decoder_f Pre_emptionCapability_decode_uper;
+per_type_encoder_f Pre_emptionCapability_encode_uper;
+per_type_decoder_f Pre_emptionCapability_decode_aper;
+per_type_encoder_f Pre_emptionCapability_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Pre_emptionCapability_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Pre-emptionVulnerability.h b/src/s1ap/asn1c/asnGenFiles/Pre-emptionVulnerability.h
new file mode 100644
index 0000000..66b7524
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Pre-emptionVulnerability.h
@@ -0,0 +1,53 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Pre_emptionVulnerability_H_
+#define	_Pre_emptionVulnerability_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum Pre_emptionVulnerability {
+	Pre_emptionVulnerability_not_pre_emptable	= 0,
+	Pre_emptionVulnerability_pre_emptable	= 1
+} e_Pre_emptionVulnerability;
+
+/* Pre-emptionVulnerability */
+typedef long	 Pre_emptionVulnerability_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_Pre_emptionVulnerability_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_Pre_emptionVulnerability;
+extern const asn_INTEGER_specifics_t asn_SPC_Pre_emptionVulnerability_specs_1;
+asn_struct_free_f Pre_emptionVulnerability_free;
+asn_struct_print_f Pre_emptionVulnerability_print;
+asn_constr_check_f Pre_emptionVulnerability_constraint;
+ber_type_decoder_f Pre_emptionVulnerability_decode_ber;
+der_type_encoder_f Pre_emptionVulnerability_encode_der;
+xer_type_decoder_f Pre_emptionVulnerability_decode_xer;
+xer_type_encoder_f Pre_emptionVulnerability_encode_xer;
+oer_type_decoder_f Pre_emptionVulnerability_decode_oer;
+oer_type_encoder_f Pre_emptionVulnerability_encode_oer;
+per_type_decoder_f Pre_emptionVulnerability_decode_uper;
+per_type_encoder_f Pre_emptionVulnerability_encode_uper;
+per_type_decoder_f Pre_emptionVulnerability_decode_aper;
+per_type_encoder_f Pre_emptionVulnerability_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Pre_emptionVulnerability_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Presence.h b/src/s1ap/asn1c/asnGenFiles/Presence.h
new file mode 100644
index 0000000..15becd5
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Presence.h
@@ -0,0 +1,54 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-CommonDataTypes"
+ * 	found in "./asn1c/S1AP-CommonDataTypes.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Presence_H_
+#define	_Presence_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum Presence {
+	Presence_optional	= 0,
+	Presence_conditional	= 1,
+	Presence_mandatory	= 2
+} e_Presence;
+
+/* Presence */
+typedef long	 Presence_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_Presence_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_Presence;
+extern const asn_INTEGER_specifics_t asn_SPC_Presence_specs_1;
+asn_struct_free_f Presence_free;
+asn_struct_print_f Presence_print;
+asn_constr_check_f Presence_constraint;
+ber_type_decoder_f Presence_decode_ber;
+der_type_encoder_f Presence_encode_der;
+xer_type_decoder_f Presence_decode_xer;
+xer_type_encoder_f Presence_encode_xer;
+oer_type_decoder_f Presence_decode_oer;
+oer_type_encoder_f Presence_encode_oer;
+per_type_decoder_f Presence_decode_uper;
+per_type_encoder_f Presence_encode_uper;
+per_type_decoder_f Presence_decode_aper;
+per_type_encoder_f Presence_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Presence_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/PrintableString.h b/src/s1ap/asn1c/asnGenFiles/PrintableString.h
new file mode 100644
index 0000000..8c2b61a
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/PrintableString.h
@@ -0,0 +1,37 @@
+/*-
+ * Copyright (c) 2003-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+#ifndef	_PrintableString_H_
+#define	_PrintableString_H_
+
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef OCTET_STRING_t PrintableString_t;  /* Implemented via OCTET STRING */
+
+extern asn_TYPE_descriptor_t asn_DEF_PrintableString;
+extern asn_TYPE_operation_t asn_OP_PrintableString;
+
+asn_constr_check_f PrintableString_constraint;
+
+#define PrintableString_free            OCTET_STRING_free
+#define PrintableString_print           OCTET_STRING_print_utf8
+#define PrintableString_compare         OCTET_STRING_compare
+#define PrintableString_decode_ber      OCTET_STRING_decode_ber
+#define PrintableString_encode_der      OCTET_STRING_encode_der
+#define PrintableString_decode_xer      OCTET_STRING_decode_xer_utf8
+#define PrintableString_encode_xer      OCTET_STRING_encode_xer_utf8
+#define PrintableString_decode_uper     OCTET_STRING_decode_uper
+#define PrintableString_encode_uper     OCTET_STRING_encode_uper
+#define PrintableString_decode_aper     OCTET_STRING_decode_aper
+#define PrintableString_encode_aper     OCTET_STRING_encode_aper
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _PrintableString_H_ */
diff --git a/src/s1ap/asn1c/asnGenFiles/PriorityLevel.h b/src/s1ap/asn1c/asnGenFiles/PriorityLevel.h
new file mode 100644
index 0000000..7182f48
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/PriorityLevel.h
@@ -0,0 +1,54 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_PriorityLevel_H_
+#define	_PriorityLevel_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum PriorityLevel {
+	PriorityLevel_spare	= 0,
+	PriorityLevel_highest	= 1,
+	PriorityLevel_lowest	= 14,
+	PriorityLevel_no_priority	= 15
+} e_PriorityLevel;
+
+/* PriorityLevel */
+typedef long	 PriorityLevel_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_PriorityLevel_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_PriorityLevel;
+asn_struct_free_f PriorityLevel_free;
+asn_struct_print_f PriorityLevel_print;
+asn_constr_check_f PriorityLevel_constraint;
+ber_type_decoder_f PriorityLevel_decode_ber;
+der_type_encoder_f PriorityLevel_encode_der;
+xer_type_decoder_f PriorityLevel_decode_xer;
+xer_type_encoder_f PriorityLevel_encode_xer;
+oer_type_decoder_f PriorityLevel_decode_oer;
+oer_type_encoder_f PriorityLevel_encode_oer;
+per_type_decoder_f PriorityLevel_decode_uper;
+per_type_encoder_f PriorityLevel_encode_uper;
+per_type_decoder_f PriorityLevel_decode_aper;
+per_type_encoder_f PriorityLevel_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _PriorityLevel_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/PrivacyIndicator.h b/src/s1ap/asn1c/asnGenFiles/PrivacyIndicator.h
new file mode 100644
index 0000000..e94c58e
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/PrivacyIndicator.h
@@ -0,0 +1,56 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_PrivacyIndicator_H_
+#define	_PrivacyIndicator_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum PrivacyIndicator {
+	PrivacyIndicator_immediate_MDT	= 0,
+	PrivacyIndicator_logged_MDT	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_PrivacyIndicator;
+
+/* PrivacyIndicator */
+typedef long	 PrivacyIndicator_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_PrivacyIndicator_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_PrivacyIndicator;
+extern const asn_INTEGER_specifics_t asn_SPC_PrivacyIndicator_specs_1;
+asn_struct_free_f PrivacyIndicator_free;
+asn_struct_print_f PrivacyIndicator_print;
+asn_constr_check_f PrivacyIndicator_constraint;
+ber_type_decoder_f PrivacyIndicator_decode_ber;
+der_type_encoder_f PrivacyIndicator_encode_der;
+xer_type_decoder_f PrivacyIndicator_decode_xer;
+xer_type_encoder_f PrivacyIndicator_encode_xer;
+oer_type_decoder_f PrivacyIndicator_decode_oer;
+oer_type_encoder_f PrivacyIndicator_encode_oer;
+per_type_decoder_f PrivacyIndicator_decode_uper;
+per_type_encoder_f PrivacyIndicator_encode_uper;
+per_type_decoder_f PrivacyIndicator_decode_aper;
+per_type_encoder_f PrivacyIndicator_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _PrivacyIndicator_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/PrivateIE-Container.h b/src/s1ap/asn1c/asnGenFiles/PrivateIE-Container.h
new file mode 100644
index 0000000..91a0be4
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/PrivateIE-Container.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-Containers"
+ * 	found in "./asn1c/S1AP-Containers.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_PrivateIE_Container_H_
+#define	_PrivateIE_Container_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct PrivateMessageIEs;
+
+/* PrivateIE-Container */
+typedef struct PrivateIE_Container_196P0 {
+	A_SEQUENCE_OF(struct PrivateMessageIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} PrivateIE_Container_196P0_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_PrivateIE_Container_196P0;
+extern asn_SET_OF_specifics_t asn_SPC_PrivateIE_Container_196P0_specs_1;
+extern asn_TYPE_member_t asn_MBR_PrivateIE_Container_196P0_1[1];
+extern asn_per_constraints_t asn_PER_type_PrivateIE_Container_196P0_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _PrivateIE_Container_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/PrivateIE-Field.h b/src/s1ap/asn1c/asnGenFiles/PrivateIE-Field.h
new file mode 100644
index 0000000..6381ac6
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/PrivateIE-Field.h
@@ -0,0 +1,60 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-Containers"
+ * 	found in "./asn1c/S1AP-Containers.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_PrivateIE_Field_H_
+#define	_PrivateIE_Field_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "PrivateIE-ID.h"
+#include "Criticality.h"
+#include <ANY.h>
+#include <asn_ioc.h>
+#include <OPEN_TYPE.h>
+#include <constr_CHOICE.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum PrivateMessageIEs__value_PR {
+	PrivateMessageIEs__value_PR_NOTHING	/* No components present */
+	
+} PrivateMessageIEs__value_PR;
+
+/* PrivateIE-Field */
+typedef struct PrivateMessageIEs {
+	PrivateIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct PrivateMessageIEs__value {
+		PrivateMessageIEs__value_PR present;
+		union PrivateMessageIEs__value_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} PrivateMessageIEs_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_PrivateMessageIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_PrivateMessageIEs_specs_1;
+extern asn_TYPE_member_t asn_MBR_PrivateMessageIEs_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _PrivateIE_Field_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/PrivateIE-ID.h b/src/s1ap/asn1c/asnGenFiles/PrivateIE-ID.h
new file mode 100644
index 0000000..6aa07c0
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/PrivateIE-ID.h
@@ -0,0 +1,53 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-CommonDataTypes"
+ * 	found in "./asn1c/S1AP-CommonDataTypes.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_PrivateIE_ID_H_
+#define	_PrivateIE_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+#include <OBJECT_IDENTIFIER.h>
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum PrivateIE_ID_PR {
+	PrivateIE_ID_PR_NOTHING,	/* No components present */
+	PrivateIE_ID_PR_local,
+	PrivateIE_ID_PR_global
+} PrivateIE_ID_PR;
+
+/* PrivateIE-ID */
+typedef struct PrivateIE_ID {
+	PrivateIE_ID_PR present;
+	union PrivateIE_ID_u {
+		long	 local;
+		OBJECT_IDENTIFIER_t	 global;
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} PrivateIE_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_PrivateIE_ID;
+extern asn_CHOICE_specifics_t asn_SPC_PrivateIE_ID_specs_1;
+extern asn_TYPE_member_t asn_MBR_PrivateIE_ID_1[2];
+extern asn_per_constraints_t asn_PER_type_PrivateIE_ID_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _PrivateIE_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/PrivateMessage.h b/src/s1ap/asn1c/asnGenFiles/PrivateMessage.h
new file mode 100644
index 0000000..9bd22bf
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/PrivateMessage.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_PrivateMessage_H_
+#define	_PrivateMessage_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "PrivateIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* PrivateMessage */
+typedef struct PrivateMessage {
+	PrivateIE_Container_196P0_t	 privateIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} PrivateMessage_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_PrivateMessage;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _PrivateMessage_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ProSeAuthorized.h b/src/s1ap/asn1c/asnGenFiles/ProSeAuthorized.h
new file mode 100644
index 0000000..9ab2216
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ProSeAuthorized.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ProSeAuthorized_H_
+#define	_ProSeAuthorized_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProSeDirectDiscovery.h"
+#include "ProSeDirectCommunication.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* ProSeAuthorized */
+typedef struct ProSeAuthorized {
+	ProSeDirectDiscovery_t	*proSeDirectDiscovery;	/* OPTIONAL */
+	ProSeDirectCommunication_t	*proSeDirectCommunication;	/* OPTIONAL */
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProSeAuthorized_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ProSeAuthorized;
+extern asn_SEQUENCE_specifics_t asn_SPC_ProSeAuthorized_specs_1;
+extern asn_TYPE_member_t asn_MBR_ProSeAuthorized_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ProSeAuthorized_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ProSeDirectCommunication.h b/src/s1ap/asn1c/asnGenFiles/ProSeDirectCommunication.h
new file mode 100644
index 0000000..6c8980e
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ProSeDirectCommunication.h
@@ -0,0 +1,56 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ProSeDirectCommunication_H_
+#define	_ProSeDirectCommunication_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum ProSeDirectCommunication {
+	ProSeDirectCommunication_authorized	= 0,
+	ProSeDirectCommunication_not_authorized	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_ProSeDirectCommunication;
+
+/* ProSeDirectCommunication */
+typedef long	 ProSeDirectCommunication_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_ProSeDirectCommunication_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_ProSeDirectCommunication;
+extern const asn_INTEGER_specifics_t asn_SPC_ProSeDirectCommunication_specs_1;
+asn_struct_free_f ProSeDirectCommunication_free;
+asn_struct_print_f ProSeDirectCommunication_print;
+asn_constr_check_f ProSeDirectCommunication_constraint;
+ber_type_decoder_f ProSeDirectCommunication_decode_ber;
+der_type_encoder_f ProSeDirectCommunication_encode_der;
+xer_type_decoder_f ProSeDirectCommunication_decode_xer;
+xer_type_encoder_f ProSeDirectCommunication_encode_xer;
+oer_type_decoder_f ProSeDirectCommunication_decode_oer;
+oer_type_encoder_f ProSeDirectCommunication_encode_oer;
+per_type_decoder_f ProSeDirectCommunication_decode_uper;
+per_type_encoder_f ProSeDirectCommunication_encode_uper;
+per_type_decoder_f ProSeDirectCommunication_decode_aper;
+per_type_encoder_f ProSeDirectCommunication_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ProSeDirectCommunication_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ProSeDirectDiscovery.h b/src/s1ap/asn1c/asnGenFiles/ProSeDirectDiscovery.h
new file mode 100644
index 0000000..d6f11f5
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ProSeDirectDiscovery.h
@@ -0,0 +1,56 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ProSeDirectDiscovery_H_
+#define	_ProSeDirectDiscovery_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum ProSeDirectDiscovery {
+	ProSeDirectDiscovery_authorized	= 0,
+	ProSeDirectDiscovery_not_authorized	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_ProSeDirectDiscovery;
+
+/* ProSeDirectDiscovery */
+typedef long	 ProSeDirectDiscovery_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_ProSeDirectDiscovery_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_ProSeDirectDiscovery;
+extern const asn_INTEGER_specifics_t asn_SPC_ProSeDirectDiscovery_specs_1;
+asn_struct_free_f ProSeDirectDiscovery_free;
+asn_struct_print_f ProSeDirectDiscovery_print;
+asn_constr_check_f ProSeDirectDiscovery_constraint;
+ber_type_decoder_f ProSeDirectDiscovery_decode_ber;
+der_type_encoder_f ProSeDirectDiscovery_encode_der;
+xer_type_decoder_f ProSeDirectDiscovery_decode_xer;
+xer_type_encoder_f ProSeDirectDiscovery_encode_xer;
+oer_type_decoder_f ProSeDirectDiscovery_decode_oer;
+oer_type_encoder_f ProSeDirectDiscovery_encode_oer;
+per_type_decoder_f ProSeDirectDiscovery_decode_uper;
+per_type_encoder_f ProSeDirectDiscovery_encode_uper;
+per_type_decoder_f ProSeDirectDiscovery_decode_aper;
+per_type_encoder_f ProSeDirectDiscovery_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ProSeDirectDiscovery_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ProSeUEtoNetworkRelaying.h b/src/s1ap/asn1c/asnGenFiles/ProSeUEtoNetworkRelaying.h
new file mode 100644
index 0000000..162a954
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ProSeUEtoNetworkRelaying.h
@@ -0,0 +1,56 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ProSeUEtoNetworkRelaying_H_
+#define	_ProSeUEtoNetworkRelaying_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum ProSeUEtoNetworkRelaying {
+	ProSeUEtoNetworkRelaying_authorized	= 0,
+	ProSeUEtoNetworkRelaying_not_authorized	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_ProSeUEtoNetworkRelaying;
+
+/* ProSeUEtoNetworkRelaying */
+typedef long	 ProSeUEtoNetworkRelaying_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_ProSeUEtoNetworkRelaying_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_ProSeUEtoNetworkRelaying;
+extern const asn_INTEGER_specifics_t asn_SPC_ProSeUEtoNetworkRelaying_specs_1;
+asn_struct_free_f ProSeUEtoNetworkRelaying_free;
+asn_struct_print_f ProSeUEtoNetworkRelaying_print;
+asn_constr_check_f ProSeUEtoNetworkRelaying_constraint;
+ber_type_decoder_f ProSeUEtoNetworkRelaying_decode_ber;
+der_type_encoder_f ProSeUEtoNetworkRelaying_encode_der;
+xer_type_decoder_f ProSeUEtoNetworkRelaying_decode_xer;
+xer_type_encoder_f ProSeUEtoNetworkRelaying_encode_xer;
+oer_type_decoder_f ProSeUEtoNetworkRelaying_decode_oer;
+oer_type_encoder_f ProSeUEtoNetworkRelaying_encode_oer;
+per_type_decoder_f ProSeUEtoNetworkRelaying_decode_uper;
+per_type_encoder_f ProSeUEtoNetworkRelaying_encode_uper;
+per_type_decoder_f ProSeUEtoNetworkRelaying_decode_aper;
+per_type_encoder_f ProSeUEtoNetworkRelaying_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ProSeUEtoNetworkRelaying_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ProcedureCode.h b/src/s1ap/asn1c/asnGenFiles/ProcedureCode.h
new file mode 100644
index 0000000..ef453e0
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ProcedureCode.h
@@ -0,0 +1,109 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-CommonDataTypes"
+ * 	found in "./asn1c/S1AP-CommonDataTypes.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ProcedureCode_H_
+#define	_ProcedureCode_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ProcedureCode */
+typedef long	 ProcedureCode_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_ProcedureCode_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_ProcedureCode;
+asn_struct_free_f ProcedureCode_free;
+asn_struct_print_f ProcedureCode_print;
+asn_constr_check_f ProcedureCode_constraint;
+ber_type_decoder_f ProcedureCode_decode_ber;
+der_type_encoder_f ProcedureCode_encode_der;
+xer_type_decoder_f ProcedureCode_decode_xer;
+xer_type_encoder_f ProcedureCode_encode_xer;
+oer_type_decoder_f ProcedureCode_decode_oer;
+oer_type_encoder_f ProcedureCode_encode_oer;
+per_type_decoder_f ProcedureCode_decode_uper;
+per_type_encoder_f ProcedureCode_encode_uper;
+per_type_decoder_f ProcedureCode_decode_aper;
+per_type_encoder_f ProcedureCode_encode_aper;
+#define ProcedureCode_id_HandoverPreparation	((ProcedureCode_t)0)
+#define ProcedureCode_id_HandoverResourceAllocation	((ProcedureCode_t)1)
+#define ProcedureCode_id_HandoverNotification	((ProcedureCode_t)2)
+#define ProcedureCode_id_PathSwitchRequest	((ProcedureCode_t)3)
+#define ProcedureCode_id_HandoverCancel	((ProcedureCode_t)4)
+#define ProcedureCode_id_E_RABSetup	((ProcedureCode_t)5)
+#define ProcedureCode_id_E_RABModify	((ProcedureCode_t)6)
+#define ProcedureCode_id_E_RABRelease	((ProcedureCode_t)7)
+#define ProcedureCode_id_E_RABReleaseIndication	((ProcedureCode_t)8)
+#define ProcedureCode_id_InitialContextSetup	((ProcedureCode_t)9)
+#define ProcedureCode_id_Paging	((ProcedureCode_t)10)
+#define ProcedureCode_id_downlinkNASTransport	((ProcedureCode_t)11)
+#define ProcedureCode_id_initialUEMessage	((ProcedureCode_t)12)
+#define ProcedureCode_id_uplinkNASTransport	((ProcedureCode_t)13)
+#define ProcedureCode_id_Reset	((ProcedureCode_t)14)
+#define ProcedureCode_id_ErrorIndication	((ProcedureCode_t)15)
+#define ProcedureCode_id_NASNonDeliveryIndication	((ProcedureCode_t)16)
+#define ProcedureCode_id_S1Setup	((ProcedureCode_t)17)
+#define ProcedureCode_id_UEContextReleaseRequest	((ProcedureCode_t)18)
+#define ProcedureCode_id_DownlinkS1cdma2000tunnelling	((ProcedureCode_t)19)
+#define ProcedureCode_id_UplinkS1cdma2000tunnelling	((ProcedureCode_t)20)
+#define ProcedureCode_id_UEContextModification	((ProcedureCode_t)21)
+#define ProcedureCode_id_UECapabilityInfoIndication	((ProcedureCode_t)22)
+#define ProcedureCode_id_UEContextRelease	((ProcedureCode_t)23)
+#define ProcedureCode_id_eNBStatusTransfer	((ProcedureCode_t)24)
+#define ProcedureCode_id_MMEStatusTransfer	((ProcedureCode_t)25)
+#define ProcedureCode_id_DeactivateTrace	((ProcedureCode_t)26)
+#define ProcedureCode_id_TraceStart	((ProcedureCode_t)27)
+#define ProcedureCode_id_TraceFailureIndication	((ProcedureCode_t)28)
+#define ProcedureCode_id_ENBConfigurationUpdate	((ProcedureCode_t)29)
+#define ProcedureCode_id_MMEConfigurationUpdate	((ProcedureCode_t)30)
+#define ProcedureCode_id_LocationReportingControl	((ProcedureCode_t)31)
+#define ProcedureCode_id_LocationReportingFailureIndication	((ProcedureCode_t)32)
+#define ProcedureCode_id_LocationReport	((ProcedureCode_t)33)
+#define ProcedureCode_id_OverloadStart	((ProcedureCode_t)34)
+#define ProcedureCode_id_OverloadStop	((ProcedureCode_t)35)
+#define ProcedureCode_id_WriteReplaceWarning	((ProcedureCode_t)36)
+#define ProcedureCode_id_eNBDirectInformationTransfer	((ProcedureCode_t)37)
+#define ProcedureCode_id_MMEDirectInformationTransfer	((ProcedureCode_t)38)
+#define ProcedureCode_id_PrivateMessage	((ProcedureCode_t)39)
+#define ProcedureCode_id_eNBConfigurationTransfer	((ProcedureCode_t)40)
+#define ProcedureCode_id_MMEConfigurationTransfer	((ProcedureCode_t)41)
+#define ProcedureCode_id_CellTrafficTrace	((ProcedureCode_t)42)
+#define ProcedureCode_id_Kill	((ProcedureCode_t)43)
+#define ProcedureCode_id_downlinkUEAssociatedLPPaTransport	((ProcedureCode_t)44)
+#define ProcedureCode_id_uplinkUEAssociatedLPPaTransport	((ProcedureCode_t)45)
+#define ProcedureCode_id_downlinkNonUEAssociatedLPPaTransport	((ProcedureCode_t)46)
+#define ProcedureCode_id_uplinkNonUEAssociatedLPPaTransport	((ProcedureCode_t)47)
+#define ProcedureCode_id_UERadioCapabilityMatch	((ProcedureCode_t)48)
+#define ProcedureCode_id_PWSRestartIndication	((ProcedureCode_t)49)
+#define ProcedureCode_id_E_RABModificationIndication	((ProcedureCode_t)50)
+#define ProcedureCode_id_PWSFailureIndication	((ProcedureCode_t)51)
+#define ProcedureCode_id_RerouteNASRequest	((ProcedureCode_t)52)
+#define ProcedureCode_id_UEContextModificationIndication	((ProcedureCode_t)53)
+#define ProcedureCode_id_ConnectionEstablishmentIndication	((ProcedureCode_t)54)
+#define ProcedureCode_id_UEContextSuspend	((ProcedureCode_t)55)
+#define ProcedureCode_id_UEContextResume	((ProcedureCode_t)56)
+#define ProcedureCode_id_NASDeliveryIndication	((ProcedureCode_t)57)
+#define ProcedureCode_id_RetrieveUEInformation	((ProcedureCode_t)58)
+#define ProcedureCode_id_UEInformationTransfer	((ProcedureCode_t)59)
+#define ProcedureCode_id_eNBCPRelocationIndication	((ProcedureCode_t)60)
+#define ProcedureCode_id_MMECPRelocationIndication	((ProcedureCode_t)61)
+#define ProcedureCode_id_SecondaryRATDataUsageReport	((ProcedureCode_t)62)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ProcedureCode_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ProtocolError-IE-ContainerList.h b/src/s1ap/asn1c/asnGenFiles/ProtocolError-IE-ContainerList.h
new file mode 100644
index 0000000..dc08575
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ProtocolError-IE-ContainerList.h
@@ -0,0 +1,23 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ProtocolError_IE_ContainerList_H_
+#define	_ProtocolError_IE_ContainerList_H_
+
+
+#include <asn_application.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ProtocolError_IE_ContainerList_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ProtocolExtensionContainer.h b/src/s1ap/asn1c/asnGenFiles/ProtocolExtensionContainer.h
new file mode 100644
index 0000000..681ae55
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ProtocolExtensionContainer.h
@@ -0,0 +1,1639 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-Containers"
+ * 	found in "./asn1c/S1AP-Containers.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ProtocolExtensionContainer_H_
+#define	_ProtocolExtensionContainer_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct Additional_GUTI_ExtIEs;
+struct AllocationAndRetentionPriority_ExtIEs;
+struct InformationForCECapableUEs_ExtIEs;
+struct AssistanceDataForPaging_ExtIEs;
+struct AssistanceDataForRecommendedCells_ExtIEs;
+struct Bearers_SubjectToStatusTransfer_ItemExtIEs;
+struct BluetoothMeasurementConfiguration_ExtIEs;
+struct CancelledCellinEAI_Item_ExtIEs;
+struct CancelledCellinTAI_Item_ExtIEs;
+struct CellIdentifierAndCELevelForCECapableUEs_ExtIEs;
+struct CellID_Broadcast_Item_ExtIEs;
+struct CellID_Cancelled_Item_ExtIEs;
+struct CellBasedMDT_ExtIEs;
+struct CellBasedQMC_ExtIEs;
+struct Cdma2000OneXSRVCCInfo_ExtIEs;
+struct CellType_ExtIEs;
+struct CGI_ExtIEs;
+struct CNTypeRestrictions_Item_ExtIEs;
+struct ConnectedengNBItem_ExtIEs;
+struct CSG_IdList_Item_ExtIEs;
+struct COUNTvalue_ExtIEs;
+struct COUNTValueExtended_ExtIEs;
+struct COUNTvaluePDCP_SNlength18_ExtIEs;
+struct CriticalityDiagnostics_ExtIEs;
+struct CriticalityDiagnostics_IE_Item_ExtIEs;
+struct ServedDCNsItem_ExtIEs;
+struct DL_CP_SecurityInformation_ExtIEs;
+struct EmergencyAreaID_Broadcast_Item_ExtIEs;
+struct EmergencyAreaID_Cancelled_Item_ExtIEs;
+struct CompletedCellinEAI_Item_ExtIEs;
+struct GERAN_Cell_ID_ExtIEs;
+struct GlobalENB_ID_ExtIEs;
+struct Global_en_gNB_ID_ExtIEs;
+struct ENB_StatusTransfer_TransparentContainer_ExtIEs;
+struct EN_DCSONConfigurationTransfer_ExtIEs;
+struct EN_DCTransferTypeRequest_ExtIEs;
+struct EN_DCTransferTypeReply_ExtIEs;
+struct EN_DCSONeNBIdentification_ExtIEs;
+struct EN_DCSONengNBIdentification_ExtIEs;
+struct E_RABInformationListItem_ExtIEs;
+struct E_RABItem_ExtIEs;
+struct E_RABQoSParameters_ExtIEs;
+struct E_RABUsageReportItem_ExtIEs;
+struct EUTRAN_CGI_ExtIEs;
+struct ExpectedUEBehaviour_ExtIEs;
+struct ExpectedUEActivityBehaviour_ExtIEs;
+struct FiveGSTAI_ExtIEs;
+struct ForbiddenTAs_Item_ExtIEs;
+struct ForbiddenLAs_Item_ExtIEs;
+struct GBR_QosInformation_ExtIEs;
+struct GUMMEI_ExtIEs;
+struct HandoverRestrictionList_ExtIEs;
+struct ImmediateMDT_ExtIEs;
+struct InformationOnRecommendedCellsAndENBsForPaging_ExtIEs;
+struct LAI_ExtIEs;
+struct LastVisitedEUTRANCellInformation_ExtIEs;
+struct ListeningSubframePattern_ExtIEs;
+struct LoggedMDT_ExtIEs;
+struct LoggedMBSFNMDT_ExtIEs;
+struct M3Configuration_ExtIEs;
+struct M4Configuration_ExtIEs;
+struct M5Configuration_ExtIEs;
+struct M6Configuration_ExtIEs;
+struct M7Configuration_ExtIEs;
+struct MDT_Configuration_ExtIEs;
+struct MBSFN_ResultToLogInfo_ExtIEs;
+struct MutingPatternInformation_ExtIEs;
+struct NB_IoT_Paging_eDRXInformation_ExtIEs;
+struct NR_CGI_ExtIEs;
+struct NRUESecurityCapabilities_ExtIEs;
+struct PagingAttemptInformation_ExtIEs;
+struct Paging_eDRXInformation_ExtIEs;
+struct M1PeriodicReporting_ExtIEs;
+struct PLMNAreaBasedQMC_ExtIEs;
+struct ProSeAuthorized_ExtIEs;
+struct PSCellInformation_ExtIEs;
+struct RecommendedCellsForPaging_ExtIEs;
+struct RecommendedCellsForPagingItem_ExtIEs;
+struct RecommendedENBsForPaging_ExtIEs;
+struct RecommendedENBItem_ExtIEs;
+struct RequestType_ExtIEs;
+struct RIMTransfer_ExtIEs;
+struct RLFReportInformation_ExtIEs;
+struct SecurityContext_ExtIEs;
+struct SecondaryRATDataUsageReportItem_ExtIEs;
+struct SONInformationReply_ExtIEs;
+struct SONConfigurationTransfer_ExtIEs;
+struct SynchronisationInformation_ExtIEs;
+struct SourceeNB_ID_ExtIEs;
+struct SourceeNB_ToTargeteNB_TransparentContainer_ExtIEs;
+struct ServedGUMMEIsItem_ExtIEs;
+struct Subscription_Based_UE_DifferentiationInfo_ExtIEs;
+struct ScheduledCommunicationTime_ExtIEs;
+struct SupportedTAs_Item_ExtIEs;
+struct TimeSynchronisationInfo_ExtIEs;
+struct S_TMSI_ExtIEs;
+struct TAIBasedMDT_ExtIEs;
+struct TAI_ExtIEs;
+struct TAI_Broadcast_Item_ExtIEs;
+struct TAI_Cancelled_Item_ExtIEs;
+struct TABasedMDT_ExtIEs;
+struct TABasedQMC_ExtIEs;
+struct TAIBasedQMC_ExtIEs;
+struct CompletedCellinTAI_Item_ExtIEs;
+struct TargeteNB_ID_ExtIEs;
+struct TargetRNC_ID_ExtIEs;
+struct TargetNgRanNode_ID_ExtIEs;
+struct GNB_ExtIEs;
+struct Global_GNB_ID_ExtIEs;
+struct NG_eNB_ExtIEs;
+struct TargeteNB_ToSourceeNB_TransparentContainer_ExtIEs;
+struct M1ThresholdEventA2_ExtIEs;
+struct TraceActivation_ExtIEs;
+struct Tunnel_Information_ExtIEs;
+struct UEAggregate_MaximumBitrates_ExtIEs;
+struct UEAppLayerMeasConfig_ExtIEs;
+struct UE_S1AP_ID_pair_ExtIEs;
+struct UE_associatedLogicalS1_ConnectionItemExtIEs;
+struct UESecurityCapabilities_ExtIEs;
+struct UE_Sidelink_Aggregate_MaximumBitrates_ExtIEs;
+struct UL_CP_SecurityInformation_ExtIEs;
+struct UserLocationInformation_ExtIEs;
+struct V2XServicesAuthorized_ExtIEs;
+struct WLANMeasurementConfiguration_ExtIEs;
+struct X2TNLConfigurationInfo_ExtIEs;
+struct ENBX2ExtTLA_ExtIEs;
+struct E_RABDataForwardingItem_ExtIEs;
+struct E_RABToBeSetupItemHOReq_ExtIEs;
+struct E_RABAdmittedItem_ExtIEs;
+struct E_RABFailedToSetupItemHOReqAckExtIEs;
+struct E_RABToBeSwitchedDLItem_ExtIEs;
+struct E_RABToBeSwitchedULItem_ExtIEs;
+struct E_RABToBeSetupItemBearerSUReqExtIEs;
+struct E_RABSetupItemBearerSUResExtIEs;
+struct E_RABToBeModifyItemBearerModReqExtIEs;
+struct E_RABModifyItemBearerModResExtIEs;
+struct E_RABReleaseItemBearerRelCompExtIEs;
+struct E_RABToBeSetupItemCtxtSUReqExtIEs;
+struct E_RABSetupItemCtxtSUResExtIEs;
+struct TAIItemExtIEs;
+struct E_RABToBeModifiedItemBearerModInd_ExtIEs;
+struct E_RABNotToBeModifiedItemBearerModInd_ExtIEs;
+struct CSGMembershipInfo_ExtIEs;
+struct E_RABModifyItemBearerModConfExtIEs;
+struct E_RABFailedToResumeItemResumeReq_ExtIEs;
+struct E_RABFailedToResumeItemResumeRes_ExtIEs;
+
+/* ProtocolExtensionContainer */
+typedef struct ProtocolExtensionContainer_180P0 {
+	A_SEQUENCE_OF(struct Additional_GUTI_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P0_t;
+typedef struct ProtocolExtensionContainer_180P1 {
+	A_SEQUENCE_OF(struct AllocationAndRetentionPriority_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P1_t;
+typedef struct ProtocolExtensionContainer_180P2 {
+	A_SEQUENCE_OF(struct InformationForCECapableUEs_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P2_t;
+typedef struct ProtocolExtensionContainer_180P3 {
+	A_SEQUENCE_OF(struct AssistanceDataForPaging_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P3_t;
+typedef struct ProtocolExtensionContainer_180P4 {
+	A_SEQUENCE_OF(struct AssistanceDataForRecommendedCells_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P4_t;
+typedef struct ProtocolExtensionContainer_180P5 {
+	A_SEQUENCE_OF(struct Bearers_SubjectToStatusTransfer_ItemExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P5_t;
+typedef struct ProtocolExtensionContainer_180P6 {
+	A_SEQUENCE_OF(struct BluetoothMeasurementConfiguration_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P6_t;
+typedef struct ProtocolExtensionContainer_180P7 {
+	A_SEQUENCE_OF(struct CancelledCellinEAI_Item_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P7_t;
+typedef struct ProtocolExtensionContainer_180P8 {
+	A_SEQUENCE_OF(struct CancelledCellinTAI_Item_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P8_t;
+typedef struct ProtocolExtensionContainer_180P9 {
+	A_SEQUENCE_OF(struct CellIdentifierAndCELevelForCECapableUEs_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P9_t;
+typedef struct ProtocolExtensionContainer_180P10 {
+	A_SEQUENCE_OF(struct CellID_Broadcast_Item_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P10_t;
+typedef struct ProtocolExtensionContainer_180P11 {
+	A_SEQUENCE_OF(struct CellID_Cancelled_Item_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P11_t;
+typedef struct ProtocolExtensionContainer_180P12 {
+	A_SEQUENCE_OF(struct CellBasedMDT_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P12_t;
+typedef struct ProtocolExtensionContainer_180P13 {
+	A_SEQUENCE_OF(struct CellBasedQMC_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P13_t;
+typedef struct ProtocolExtensionContainer_180P14 {
+	A_SEQUENCE_OF(struct Cdma2000OneXSRVCCInfo_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P14_t;
+typedef struct ProtocolExtensionContainer_180P15 {
+	A_SEQUENCE_OF(struct CellType_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P15_t;
+typedef struct ProtocolExtensionContainer_180P16 {
+	A_SEQUENCE_OF(struct CGI_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P16_t;
+typedef struct ProtocolExtensionContainer_180P17 {
+	A_SEQUENCE_OF(struct CNTypeRestrictions_Item_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P17_t;
+typedef struct ProtocolExtensionContainer_180P18 {
+	A_SEQUENCE_OF(struct ConnectedengNBItem_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P18_t;
+typedef struct ProtocolExtensionContainer_180P19 {
+	A_SEQUENCE_OF(struct CSG_IdList_Item_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P19_t;
+typedef struct ProtocolExtensionContainer_180P20 {
+	A_SEQUENCE_OF(struct COUNTvalue_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P20_t;
+typedef struct ProtocolExtensionContainer_180P21 {
+	A_SEQUENCE_OF(struct COUNTValueExtended_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P21_t;
+typedef struct ProtocolExtensionContainer_180P22 {
+	A_SEQUENCE_OF(struct COUNTvaluePDCP_SNlength18_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P22_t;
+typedef struct ProtocolExtensionContainer_180P23 {
+	A_SEQUENCE_OF(struct CriticalityDiagnostics_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P23_t;
+typedef struct ProtocolExtensionContainer_180P24 {
+	A_SEQUENCE_OF(struct CriticalityDiagnostics_IE_Item_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P24_t;
+typedef struct ProtocolExtensionContainer_180P25 {
+	A_SEQUENCE_OF(struct ServedDCNsItem_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P25_t;
+typedef struct ProtocolExtensionContainer_180P26 {
+	A_SEQUENCE_OF(struct DL_CP_SecurityInformation_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P26_t;
+typedef struct ProtocolExtensionContainer_180P27 {
+	A_SEQUENCE_OF(struct EmergencyAreaID_Broadcast_Item_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P27_t;
+typedef struct ProtocolExtensionContainer_180P28 {
+	A_SEQUENCE_OF(struct EmergencyAreaID_Cancelled_Item_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P28_t;
+typedef struct ProtocolExtensionContainer_180P29 {
+	A_SEQUENCE_OF(struct CompletedCellinEAI_Item_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P29_t;
+typedef struct ProtocolExtensionContainer_180P30 {
+	A_SEQUENCE_OF(struct GERAN_Cell_ID_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P30_t;
+typedef struct ProtocolExtensionContainer_180P31 {
+	A_SEQUENCE_OF(struct GlobalENB_ID_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P31_t;
+typedef struct ProtocolExtensionContainer_180P32 {
+	A_SEQUENCE_OF(struct Global_en_gNB_ID_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P32_t;
+typedef struct ProtocolExtensionContainer_180P33 {
+	A_SEQUENCE_OF(struct ENB_StatusTransfer_TransparentContainer_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P33_t;
+typedef struct ProtocolExtensionContainer_180P34 {
+	A_SEQUENCE_OF(struct EN_DCSONConfigurationTransfer_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P34_t;
+typedef struct ProtocolExtensionContainer_180P35 {
+	A_SEQUENCE_OF(struct EN_DCTransferTypeRequest_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P35_t;
+typedef struct ProtocolExtensionContainer_180P36 {
+	A_SEQUENCE_OF(struct EN_DCTransferTypeReply_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P36_t;
+typedef struct ProtocolExtensionContainer_180P37 {
+	A_SEQUENCE_OF(struct EN_DCSONeNBIdentification_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P37_t;
+typedef struct ProtocolExtensionContainer_180P38 {
+	A_SEQUENCE_OF(struct EN_DCSONengNBIdentification_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P38_t;
+typedef struct ProtocolExtensionContainer_180P39 {
+	A_SEQUENCE_OF(struct E_RABInformationListItem_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P39_t;
+typedef struct ProtocolExtensionContainer_180P40 {
+	A_SEQUENCE_OF(struct E_RABItem_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P40_t;
+typedef struct ProtocolExtensionContainer_180P41 {
+	A_SEQUENCE_OF(struct E_RABQoSParameters_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P41_t;
+typedef struct ProtocolExtensionContainer_180P42 {
+	A_SEQUENCE_OF(struct E_RABUsageReportItem_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P42_t;
+typedef struct ProtocolExtensionContainer_180P43 {
+	A_SEQUENCE_OF(struct EUTRAN_CGI_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P43_t;
+typedef struct ProtocolExtensionContainer_180P44 {
+	A_SEQUENCE_OF(struct ExpectedUEBehaviour_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P44_t;
+typedef struct ProtocolExtensionContainer_180P45 {
+	A_SEQUENCE_OF(struct ExpectedUEActivityBehaviour_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P45_t;
+typedef struct ProtocolExtensionContainer_180P46 {
+	A_SEQUENCE_OF(struct FiveGSTAI_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P46_t;
+typedef struct ProtocolExtensionContainer_180P47 {
+	A_SEQUENCE_OF(struct ForbiddenTAs_Item_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P47_t;
+typedef struct ProtocolExtensionContainer_180P48 {
+	A_SEQUENCE_OF(struct ForbiddenLAs_Item_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P48_t;
+typedef struct ProtocolExtensionContainer_180P49 {
+	A_SEQUENCE_OF(struct GBR_QosInformation_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P49_t;
+typedef struct ProtocolExtensionContainer_180P50 {
+	A_SEQUENCE_OF(struct GUMMEI_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P50_t;
+typedef struct ProtocolExtensionContainer_180P51 {
+	A_SEQUENCE_OF(struct HandoverRestrictionList_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P51_t;
+typedef struct ProtocolExtensionContainer_180P52 {
+	A_SEQUENCE_OF(struct ImmediateMDT_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P52_t;
+typedef struct ProtocolExtensionContainer_180P53 {
+	A_SEQUENCE_OF(struct InformationOnRecommendedCellsAndENBsForPaging_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P53_t;
+typedef struct ProtocolExtensionContainer_180P54 {
+	A_SEQUENCE_OF(struct LAI_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P54_t;
+typedef struct ProtocolExtensionContainer_180P55 {
+	A_SEQUENCE_OF(struct LastVisitedEUTRANCellInformation_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P55_t;
+typedef struct ProtocolExtensionContainer_180P56 {
+	A_SEQUENCE_OF(struct ListeningSubframePattern_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P56_t;
+typedef struct ProtocolExtensionContainer_180P57 {
+	A_SEQUENCE_OF(struct LoggedMDT_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P57_t;
+typedef struct ProtocolExtensionContainer_180P58 {
+	A_SEQUENCE_OF(struct LoggedMBSFNMDT_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P58_t;
+typedef struct ProtocolExtensionContainer_180P59 {
+	A_SEQUENCE_OF(struct M3Configuration_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P59_t;
+typedef struct ProtocolExtensionContainer_180P60 {
+	A_SEQUENCE_OF(struct M4Configuration_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P60_t;
+typedef struct ProtocolExtensionContainer_180P61 {
+	A_SEQUENCE_OF(struct M5Configuration_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P61_t;
+typedef struct ProtocolExtensionContainer_180P62 {
+	A_SEQUENCE_OF(struct M6Configuration_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P62_t;
+typedef struct ProtocolExtensionContainer_180P63 {
+	A_SEQUENCE_OF(struct M7Configuration_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P63_t;
+typedef struct ProtocolExtensionContainer_180P64 {
+	A_SEQUENCE_OF(struct MDT_Configuration_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P64_t;
+typedef struct ProtocolExtensionContainer_180P65 {
+	A_SEQUENCE_OF(struct MBSFN_ResultToLogInfo_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P65_t;
+typedef struct ProtocolExtensionContainer_180P66 {
+	A_SEQUENCE_OF(struct MutingPatternInformation_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P66_t;
+typedef struct ProtocolExtensionContainer_180P67 {
+	A_SEQUENCE_OF(struct NB_IoT_Paging_eDRXInformation_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P67_t;
+typedef struct ProtocolExtensionContainer_180P68 {
+	A_SEQUENCE_OF(struct NR_CGI_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P68_t;
+typedef struct ProtocolExtensionContainer_180P69 {
+	A_SEQUENCE_OF(struct NRUESecurityCapabilities_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P69_t;
+typedef struct ProtocolExtensionContainer_180P70 {
+	A_SEQUENCE_OF(struct PagingAttemptInformation_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P70_t;
+typedef struct ProtocolExtensionContainer_180P71 {
+	A_SEQUENCE_OF(struct Paging_eDRXInformation_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P71_t;
+typedef struct ProtocolExtensionContainer_180P72 {
+	A_SEQUENCE_OF(struct M1PeriodicReporting_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P72_t;
+typedef struct ProtocolExtensionContainer_180P73 {
+	A_SEQUENCE_OF(struct PLMNAreaBasedQMC_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P73_t;
+typedef struct ProtocolExtensionContainer_180P74 {
+	A_SEQUENCE_OF(struct ProSeAuthorized_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P74_t;
+typedef struct ProtocolExtensionContainer_180P75 {
+	A_SEQUENCE_OF(struct PSCellInformation_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P75_t;
+typedef struct ProtocolExtensionContainer_180P76 {
+	A_SEQUENCE_OF(struct RecommendedCellsForPaging_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P76_t;
+typedef struct ProtocolExtensionContainer_180P77 {
+	A_SEQUENCE_OF(struct RecommendedCellsForPagingItem_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P77_t;
+typedef struct ProtocolExtensionContainer_180P78 {
+	A_SEQUENCE_OF(struct RecommendedENBsForPaging_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P78_t;
+typedef struct ProtocolExtensionContainer_180P79 {
+	A_SEQUENCE_OF(struct RecommendedENBItem_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P79_t;
+typedef struct ProtocolExtensionContainer_180P80 {
+	A_SEQUENCE_OF(struct RequestType_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P80_t;
+typedef struct ProtocolExtensionContainer_180P81 {
+	A_SEQUENCE_OF(struct RIMTransfer_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P81_t;
+typedef struct ProtocolExtensionContainer_180P82 {
+	A_SEQUENCE_OF(struct RLFReportInformation_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P82_t;
+typedef struct ProtocolExtensionContainer_180P83 {
+	A_SEQUENCE_OF(struct SecurityContext_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P83_t;
+typedef struct ProtocolExtensionContainer_180P84 {
+	A_SEQUENCE_OF(struct SecondaryRATDataUsageReportItem_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P84_t;
+typedef struct ProtocolExtensionContainer_180P85 {
+	A_SEQUENCE_OF(struct SONInformationReply_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P85_t;
+typedef struct ProtocolExtensionContainer_180P86 {
+	A_SEQUENCE_OF(struct SONConfigurationTransfer_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P86_t;
+typedef struct ProtocolExtensionContainer_180P87 {
+	A_SEQUENCE_OF(struct SynchronisationInformation_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P87_t;
+typedef struct ProtocolExtensionContainer_180P88 {
+	A_SEQUENCE_OF(struct SourceeNB_ID_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P88_t;
+typedef struct ProtocolExtensionContainer_180P89 {
+	A_SEQUENCE_OF(struct SourceeNB_ToTargeteNB_TransparentContainer_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P89_t;
+typedef struct ProtocolExtensionContainer_180P90 {
+	A_SEQUENCE_OF(struct ServedGUMMEIsItem_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P90_t;
+typedef struct ProtocolExtensionContainer_180P91 {
+	A_SEQUENCE_OF(struct Subscription_Based_UE_DifferentiationInfo_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P91_t;
+typedef struct ProtocolExtensionContainer_180P92 {
+	A_SEQUENCE_OF(struct ScheduledCommunicationTime_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P92_t;
+typedef struct ProtocolExtensionContainer_180P93 {
+	A_SEQUENCE_OF(struct SupportedTAs_Item_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P93_t;
+typedef struct ProtocolExtensionContainer_180P94 {
+	A_SEQUENCE_OF(struct TimeSynchronisationInfo_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P94_t;
+typedef struct ProtocolExtensionContainer_180P95 {
+	A_SEQUENCE_OF(struct S_TMSI_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P95_t;
+typedef struct ProtocolExtensionContainer_180P96 {
+	A_SEQUENCE_OF(struct TAIBasedMDT_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P96_t;
+typedef struct ProtocolExtensionContainer_180P97 {
+	A_SEQUENCE_OF(struct TAI_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P97_t;
+typedef struct ProtocolExtensionContainer_180P98 {
+	A_SEQUENCE_OF(struct TAI_Broadcast_Item_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P98_t;
+typedef struct ProtocolExtensionContainer_180P99 {
+	A_SEQUENCE_OF(struct TAI_Cancelled_Item_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P99_t;
+typedef struct ProtocolExtensionContainer_180P100 {
+	A_SEQUENCE_OF(struct TABasedMDT_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P100_t;
+typedef struct ProtocolExtensionContainer_180P101 {
+	A_SEQUENCE_OF(struct TABasedQMC_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P101_t;
+typedef struct ProtocolExtensionContainer_180P102 {
+	A_SEQUENCE_OF(struct TAIBasedQMC_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P102_t;
+typedef struct ProtocolExtensionContainer_180P103 {
+	A_SEQUENCE_OF(struct CompletedCellinTAI_Item_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P103_t;
+typedef struct ProtocolExtensionContainer_180P104 {
+	A_SEQUENCE_OF(struct TargeteNB_ID_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P104_t;
+typedef struct ProtocolExtensionContainer_180P105 {
+	A_SEQUENCE_OF(struct TargetRNC_ID_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P105_t;
+typedef struct ProtocolExtensionContainer_180P106 {
+	A_SEQUENCE_OF(struct TargetNgRanNode_ID_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P106_t;
+typedef struct ProtocolExtensionContainer_180P107 {
+	A_SEQUENCE_OF(struct GNB_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P107_t;
+typedef struct ProtocolExtensionContainer_180P108 {
+	A_SEQUENCE_OF(struct Global_GNB_ID_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P108_t;
+typedef struct ProtocolExtensionContainer_180P109 {
+	A_SEQUENCE_OF(struct NG_eNB_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P109_t;
+typedef struct ProtocolExtensionContainer_180P110 {
+	A_SEQUENCE_OF(struct TargeteNB_ToSourceeNB_TransparentContainer_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P110_t;
+typedef struct ProtocolExtensionContainer_180P111 {
+	A_SEQUENCE_OF(struct M1ThresholdEventA2_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P111_t;
+typedef struct ProtocolExtensionContainer_180P112 {
+	A_SEQUENCE_OF(struct TraceActivation_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P112_t;
+typedef struct ProtocolExtensionContainer_180P113 {
+	A_SEQUENCE_OF(struct Tunnel_Information_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P113_t;
+typedef struct ProtocolExtensionContainer_180P114 {
+	A_SEQUENCE_OF(struct UEAggregate_MaximumBitrates_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P114_t;
+typedef struct ProtocolExtensionContainer_180P115 {
+	A_SEQUENCE_OF(struct UEAppLayerMeasConfig_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P115_t;
+typedef struct ProtocolExtensionContainer_180P116 {
+	A_SEQUENCE_OF(struct UE_S1AP_ID_pair_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P116_t;
+typedef struct ProtocolExtensionContainer_180P117 {
+	A_SEQUENCE_OF(struct UE_associatedLogicalS1_ConnectionItemExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P117_t;
+typedef struct ProtocolExtensionContainer_180P118 {
+	A_SEQUENCE_OF(struct UESecurityCapabilities_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P118_t;
+typedef struct ProtocolExtensionContainer_180P119 {
+	A_SEQUENCE_OF(struct UE_Sidelink_Aggregate_MaximumBitrates_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P119_t;
+typedef struct ProtocolExtensionContainer_180P120 {
+	A_SEQUENCE_OF(struct UL_CP_SecurityInformation_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P120_t;
+typedef struct ProtocolExtensionContainer_180P121 {
+	A_SEQUENCE_OF(struct UserLocationInformation_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P121_t;
+typedef struct ProtocolExtensionContainer_180P122 {
+	A_SEQUENCE_OF(struct V2XServicesAuthorized_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P122_t;
+typedef struct ProtocolExtensionContainer_180P123 {
+	A_SEQUENCE_OF(struct WLANMeasurementConfiguration_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P123_t;
+typedef struct ProtocolExtensionContainer_180P124 {
+	A_SEQUENCE_OF(struct X2TNLConfigurationInfo_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P124_t;
+typedef struct ProtocolExtensionContainer_180P125 {
+	A_SEQUENCE_OF(struct ENBX2ExtTLA_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P125_t;
+typedef struct ProtocolExtensionContainer_180P126 {
+	A_SEQUENCE_OF(struct E_RABDataForwardingItem_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P126_t;
+typedef struct ProtocolExtensionContainer_180P127 {
+	A_SEQUENCE_OF(struct E_RABToBeSetupItemHOReq_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P127_t;
+typedef struct ProtocolExtensionContainer_180P128 {
+	A_SEQUENCE_OF(struct E_RABAdmittedItem_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P128_t;
+typedef struct ProtocolExtensionContainer_180P129 {
+	A_SEQUENCE_OF(struct E_RABFailedToSetupItemHOReqAckExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P129_t;
+typedef struct ProtocolExtensionContainer_180P130 {
+	A_SEQUENCE_OF(struct E_RABToBeSwitchedDLItem_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P130_t;
+typedef struct ProtocolExtensionContainer_180P131 {
+	A_SEQUENCE_OF(struct E_RABToBeSwitchedULItem_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P131_t;
+typedef struct ProtocolExtensionContainer_180P132 {
+	A_SEQUENCE_OF(struct E_RABToBeSetupItemBearerSUReqExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P132_t;
+typedef struct ProtocolExtensionContainer_180P133 {
+	A_SEQUENCE_OF(struct E_RABSetupItemBearerSUResExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P133_t;
+typedef struct ProtocolExtensionContainer_180P134 {
+	A_SEQUENCE_OF(struct E_RABToBeModifyItemBearerModReqExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P134_t;
+typedef struct ProtocolExtensionContainer_180P135 {
+	A_SEQUENCE_OF(struct E_RABModifyItemBearerModResExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P135_t;
+typedef struct ProtocolExtensionContainer_180P136 {
+	A_SEQUENCE_OF(struct E_RABReleaseItemBearerRelCompExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P136_t;
+typedef struct ProtocolExtensionContainer_180P137 {
+	A_SEQUENCE_OF(struct E_RABToBeSetupItemCtxtSUReqExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P137_t;
+typedef struct ProtocolExtensionContainer_180P138 {
+	A_SEQUENCE_OF(struct E_RABSetupItemCtxtSUResExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P138_t;
+typedef struct ProtocolExtensionContainer_180P139 {
+	A_SEQUENCE_OF(struct TAIItemExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P139_t;
+typedef struct ProtocolExtensionContainer_180P140 {
+	A_SEQUENCE_OF(struct E_RABToBeModifiedItemBearerModInd_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P140_t;
+typedef struct ProtocolExtensionContainer_180P141 {
+	A_SEQUENCE_OF(struct E_RABNotToBeModifiedItemBearerModInd_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P141_t;
+typedef struct ProtocolExtensionContainer_180P142 {
+	A_SEQUENCE_OF(struct CSGMembershipInfo_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P142_t;
+typedef struct ProtocolExtensionContainer_180P143 {
+	A_SEQUENCE_OF(struct E_RABModifyItemBearerModConfExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P143_t;
+typedef struct ProtocolExtensionContainer_180P144 {
+	A_SEQUENCE_OF(struct E_RABFailedToResumeItemResumeReq_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P144_t;
+typedef struct ProtocolExtensionContainer_180P145 {
+	A_SEQUENCE_OF(struct E_RABFailedToResumeItemResumeRes_ExtIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolExtensionContainer_180P145_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P0;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P0_specs_1;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P0_1[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P0_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P1;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P1_specs_3;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P1_3[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P1_constr_3;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P2;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P2_specs_5;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P2_5[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P2_constr_5;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P3;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P3_specs_7;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P3_7[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P3_constr_7;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P4;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P4_specs_9;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P4_9[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P4_constr_9;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P5;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P5_specs_11;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P5_11[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P5_constr_11;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P6;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P6_specs_13;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P6_13[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P6_constr_13;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P7;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P7_specs_15;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P7_15[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P7_constr_15;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P8;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P8_specs_17;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P8_17[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P8_constr_17;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P9;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P9_specs_19;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P9_19[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P9_constr_19;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P10;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P10_specs_21;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P10_21[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P10_constr_21;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P11;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P11_specs_23;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P11_23[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P11_constr_23;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P12;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P12_specs_25;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P12_25[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P12_constr_25;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P13;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P13_specs_27;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P13_27[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P13_constr_27;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P14;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P14_specs_29;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P14_29[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P14_constr_29;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P15;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P15_specs_31;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P15_31[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P15_constr_31;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P16;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P16_specs_33;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P16_33[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P16_constr_33;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P17;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P17_specs_35;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P17_35[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P17_constr_35;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P18;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P18_specs_37;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P18_37[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P18_constr_37;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P19;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P19_specs_39;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P19_39[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P19_constr_39;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P20;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P20_specs_41;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P20_41[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P20_constr_41;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P21;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P21_specs_43;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P21_43[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P21_constr_43;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P22;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P22_specs_45;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P22_45[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P22_constr_45;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P23;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P23_specs_47;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P23_47[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P23_constr_47;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P24;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P24_specs_49;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P24_49[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P24_constr_49;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P25;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P25_specs_51;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P25_51[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P25_constr_51;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P26;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P26_specs_53;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P26_53[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P26_constr_53;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P27;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P27_specs_55;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P27_55[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P27_constr_55;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P28;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P28_specs_57;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P28_57[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P28_constr_57;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P29;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P29_specs_59;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P29_59[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P29_constr_59;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P30;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P30_specs_61;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P30_61[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P30_constr_61;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P31;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P31_specs_63;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P31_63[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P31_constr_63;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P32;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P32_specs_65;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P32_65[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P32_constr_65;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P33;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P33_specs_67;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P33_67[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P33_constr_67;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P34;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P34_specs_69;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P34_69[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P34_constr_69;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P35;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P35_specs_71;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P35_71[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P35_constr_71;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P36;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P36_specs_73;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P36_73[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P36_constr_73;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P37;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P37_specs_75;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P37_75[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P37_constr_75;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P38;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P38_specs_77;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P38_77[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P38_constr_77;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P39;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P39_specs_79;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P39_79[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P39_constr_79;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P40;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P40_specs_81;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P40_81[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P40_constr_81;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P41;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P41_specs_83;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P41_83[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P41_constr_83;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P42;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P42_specs_85;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P42_85[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P42_constr_85;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P43;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P43_specs_87;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P43_87[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P43_constr_87;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P44;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P44_specs_89;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P44_89[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P44_constr_89;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P45;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P45_specs_91;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P45_91[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P45_constr_91;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P46;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P46_specs_93;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P46_93[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P46_constr_93;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P47;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P47_specs_95;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P47_95[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P47_constr_95;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P48;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P48_specs_97;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P48_97[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P48_constr_97;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P49;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P49_specs_99;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P49_99[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P49_constr_99;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P50;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P50_specs_101;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P50_101[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P50_constr_101;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P51;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P51_specs_103;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P51_103[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P51_constr_103;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P52;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P52_specs_105;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P52_105[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P52_constr_105;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P53;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P53_specs_107;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P53_107[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P53_constr_107;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P54;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P54_specs_109;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P54_109[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P54_constr_109;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P55;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P55_specs_111;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P55_111[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P55_constr_111;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P56;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P56_specs_113;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P56_113[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P56_constr_113;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P57;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P57_specs_115;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P57_115[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P57_constr_115;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P58;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P58_specs_117;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P58_117[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P58_constr_117;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P59;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P59_specs_119;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P59_119[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P59_constr_119;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P60;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P60_specs_121;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P60_121[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P60_constr_121;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P61;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P61_specs_123;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P61_123[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P61_constr_123;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P62;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P62_specs_125;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P62_125[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P62_constr_125;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P63;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P63_specs_127;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P63_127[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P63_constr_127;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P64;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P64_specs_129;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P64_129[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P64_constr_129;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P65;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P65_specs_131;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P65_131[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P65_constr_131;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P66;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P66_specs_133;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P66_133[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P66_constr_133;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P67;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P67_specs_135;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P67_135[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P67_constr_135;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P68;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P68_specs_137;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P68_137[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P68_constr_137;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P69;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P69_specs_139;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P69_139[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P69_constr_139;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P70;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P70_specs_141;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P70_141[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P70_constr_141;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P71;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P71_specs_143;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P71_143[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P71_constr_143;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P72;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P72_specs_145;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P72_145[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P72_constr_145;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P73;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P73_specs_147;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P73_147[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P73_constr_147;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P74;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P74_specs_149;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P74_149[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P74_constr_149;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P75;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P75_specs_151;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P75_151[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P75_constr_151;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P76;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P76_specs_153;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P76_153[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P76_constr_153;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P77;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P77_specs_155;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P77_155[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P77_constr_155;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P78;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P78_specs_157;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P78_157[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P78_constr_157;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P79;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P79_specs_159;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P79_159[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P79_constr_159;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P80;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P80_specs_161;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P80_161[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P80_constr_161;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P81;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P81_specs_163;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P81_163[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P81_constr_163;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P82;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P82_specs_165;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P82_165[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P82_constr_165;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P83;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P83_specs_167;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P83_167[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P83_constr_167;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P84;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P84_specs_169;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P84_169[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P84_constr_169;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P85;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P85_specs_171;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P85_171[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P85_constr_171;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P86;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P86_specs_173;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P86_173[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P86_constr_173;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P87;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P87_specs_175;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P87_175[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P87_constr_175;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P88;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P88_specs_177;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P88_177[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P88_constr_177;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P89;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P89_specs_179;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P89_179[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P89_constr_179;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P90;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P90_specs_181;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P90_181[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P90_constr_181;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P91;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P91_specs_183;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P91_183[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P91_constr_183;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P92;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P92_specs_185;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P92_185[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P92_constr_185;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P93;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P93_specs_187;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P93_187[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P93_constr_187;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P94;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P94_specs_189;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P94_189[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P94_constr_189;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P95;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P95_specs_191;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P95_191[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P95_constr_191;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P96;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P96_specs_193;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P96_193[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P96_constr_193;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P97;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P97_specs_195;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P97_195[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P97_constr_195;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P98;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P98_specs_197;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P98_197[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P98_constr_197;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P99;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P99_specs_199;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P99_199[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P99_constr_199;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P100;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P100_specs_201;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P100_201[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P100_constr_201;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P101;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P101_specs_203;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P101_203[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P101_constr_203;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P102;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P102_specs_205;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P102_205[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P102_constr_205;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P103;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P103_specs_207;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P103_207[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P103_constr_207;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P104;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P104_specs_209;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P104_209[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P104_constr_209;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P105;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P105_specs_211;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P105_211[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P105_constr_211;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P106;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P106_specs_213;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P106_213[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P106_constr_213;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P107;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P107_specs_215;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P107_215[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P107_constr_215;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P108;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P108_specs_217;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P108_217[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P108_constr_217;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P109;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P109_specs_219;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P109_219[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P109_constr_219;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P110;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P110_specs_221;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P110_221[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P110_constr_221;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P111;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P111_specs_223;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P111_223[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P111_constr_223;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P112;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P112_specs_225;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P112_225[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P112_constr_225;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P113;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P113_specs_227;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P113_227[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P113_constr_227;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P114;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P114_specs_229;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P114_229[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P114_constr_229;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P115;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P115_specs_231;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P115_231[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P115_constr_231;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P116;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P116_specs_233;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P116_233[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P116_constr_233;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P117;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P117_specs_235;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P117_235[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P117_constr_235;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P118;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P118_specs_237;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P118_237[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P118_constr_237;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P119;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P119_specs_239;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P119_239[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P119_constr_239;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P120;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P120_specs_241;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P120_241[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P120_constr_241;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P121;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P121_specs_243;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P121_243[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P121_constr_243;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P122;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P122_specs_245;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P122_245[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P122_constr_245;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P123;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P123_specs_247;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P123_247[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P123_constr_247;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P124;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P124_specs_249;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P124_249[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P124_constr_249;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P125;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P125_specs_251;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P125_251[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P125_constr_251;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P126;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P126_specs_253;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P126_253[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P126_constr_253;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P127;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P127_specs_255;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P127_255[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P127_constr_255;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P128;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P128_specs_257;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P128_257[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P128_constr_257;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P129;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P129_specs_259;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P129_259[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P129_constr_259;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P130;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P130_specs_261;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P130_261[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P130_constr_261;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P131;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P131_specs_263;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P131_263[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P131_constr_263;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P132;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P132_specs_265;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P132_265[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P132_constr_265;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P133;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P133_specs_267;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P133_267[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P133_constr_267;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P134;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P134_specs_269;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P134_269[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P134_constr_269;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P135;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P135_specs_271;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P135_271[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P135_constr_271;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P136;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P136_specs_273;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P136_273[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P136_constr_273;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P137;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P137_specs_275;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P137_275[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P137_constr_275;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P138;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P138_specs_277;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P138_277[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P138_constr_277;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P139;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P139_specs_279;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P139_279[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P139_constr_279;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P140;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P140_specs_281;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P140_281[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P140_constr_281;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P141;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P141_specs_283;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P141_283[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P141_constr_283;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P142;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P142_specs_285;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P142_285[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P142_constr_285;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P143;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P143_specs_287;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P143_287[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P143_constr_287;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P144;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P144_specs_289;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P144_289[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P144_constr_289;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionContainer_180P145;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolExtensionContainer_180P145_specs_291;
+extern asn_TYPE_member_t asn_MBR_ProtocolExtensionContainer_180P145_291[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionContainer_180P145_constr_291;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ProtocolExtensionContainer_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ProtocolExtensionField.h b/src/s1ap/asn1c/asnGenFiles/ProtocolExtensionField.h
new file mode 100644
index 0000000..bc54276
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ProtocolExtensionField.h
@@ -0,0 +1,3386 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-Containers"
+ * 	found in "./asn1c/S1AP-Containers.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ProtocolExtensionField_H_
+#define	_ProtocolExtensionField_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolExtensionID.h"
+#include "Criticality.h"
+#include <ANY.h>
+#include <asn_ioc.h>
+#include <OPEN_TYPE.h>
+#include <constr_CHOICE.h>
+#include <constr_SEQUENCE.h>
+#include "COUNTValueExtended.h"
+#include "Presence.h"
+#include "ReceiveStatusOfULPDCPSDUsExtended.h"
+#include "COUNTvaluePDCP-SNlength18.h"
+#include "ReceiveStatusOfULPDCPSDUsPDCP-SNlength18.h"
+#include "Packet-LossRate.h"
+#include "ExtendedBitRate.h"
+#include "NRrestrictioninEPSasSecondaryRAT.h"
+#include "UnlicensedSpectrumRestriction.h"
+#include "CNTypeRestrictions.h"
+#include "NRrestrictionin5GS.h"
+#include "PLMNidentity.h"
+#include "M3Configuration.h"
+#include "M4Configuration.h"
+#include "M5Configuration.h"
+#include "MDT-Location-Info.h"
+#include "M6Configuration.h"
+#include "M7Configuration.h"
+#include "BluetoothMeasurementConfiguration.h"
+#include "WLANMeasurementConfiguration.h"
+#include "Time-UE-StayedInCell-EnhancedGranularity.h"
+#include "Cause.h"
+#include "MDTPLMNList.h"
+#include "ProSeUEtoNetworkRelaying.h"
+#include "RequestTypeAdditionalInfo.h"
+#include "TimeSynchronisationInfo.h"
+#include "MutingPatternInformation.h"
+#include "X2TNLConfigurationInfo.h"
+#include "SynchronisationInformation.h"
+#include "MobilityInformation.h"
+#include "UE-HistoryInformationFromTheUE.h"
+#include "IMSvoiceEPSfallbackfrom5G.h"
+#include "RAT-Type.h"
+#include "MutingAvailabilityIndication.h"
+#include "MDT-Configuration.h"
+#include "UEAppLayerMeasConfig.h"
+#include "ServiceType.h"
+#include "PSCellInformation.h"
+#include "ENBX2ExtTLAs.h"
+#include "ENBIndirectX2TransportLayerAddresses.h"
+#include "Data-Forwarding-Not-Possible.h"
+#include "BearerType.h"
+#include "Correlation-ID.h"
+#include "TransportInformation.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum Additional_GUTI_ExtIEs__extensionValue_PR {
+	Additional_GUTI_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} Additional_GUTI_ExtIEs__extensionValue_PR;
+typedef enum AllocationAndRetentionPriority_ExtIEs__extensionValue_PR {
+	AllocationAndRetentionPriority_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} AllocationAndRetentionPriority_ExtIEs__extensionValue_PR;
+typedef enum InformationForCECapableUEs_ExtIEs__extensionValue_PR {
+	InformationForCECapableUEs_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} InformationForCECapableUEs_ExtIEs__extensionValue_PR;
+typedef enum AssistanceDataForPaging_ExtIEs__extensionValue_PR {
+	AssistanceDataForPaging_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} AssistanceDataForPaging_ExtIEs__extensionValue_PR;
+typedef enum AssistanceDataForRecommendedCells_ExtIEs__extensionValue_PR {
+	AssistanceDataForRecommendedCells_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} AssistanceDataForRecommendedCells_ExtIEs__extensionValue_PR;
+typedef enum Bearers_SubjectToStatusTransfer_ItemExtIEs__extensionValue_PR {
+	Bearers_SubjectToStatusTransfer_ItemExtIEs__extensionValue_PR_NOTHING,	/* No components present */
+	Bearers_SubjectToStatusTransfer_ItemExtIEs__extensionValue_PR_COUNTValueExtended,
+	Bearers_SubjectToStatusTransfer_ItemExtIEs__extensionValue_PR_COUNTValueExtended_1,
+	Bearers_SubjectToStatusTransfer_ItemExtIEs__extensionValue_PR_ReceiveStatusOfULPDCPSDUsExtended,
+	Bearers_SubjectToStatusTransfer_ItemExtIEs__extensionValue_PR_COUNTvaluePDCP_SNlength18,
+	Bearers_SubjectToStatusTransfer_ItemExtIEs__extensionValue_PR_COUNTvaluePDCP_SNlength18_1,
+	Bearers_SubjectToStatusTransfer_ItemExtIEs__extensionValue_PR_ReceiveStatusOfULPDCPSDUsPDCP_SNlength18
+} Bearers_SubjectToStatusTransfer_ItemExtIEs__extensionValue_PR;
+typedef enum BluetoothMeasurementConfiguration_ExtIEs__extensionValue_PR {
+	BluetoothMeasurementConfiguration_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} BluetoothMeasurementConfiguration_ExtIEs__extensionValue_PR;
+typedef enum CancelledCellinEAI_Item_ExtIEs__extensionValue_PR {
+	CancelledCellinEAI_Item_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} CancelledCellinEAI_Item_ExtIEs__extensionValue_PR;
+typedef enum CancelledCellinTAI_Item_ExtIEs__extensionValue_PR {
+	CancelledCellinTAI_Item_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} CancelledCellinTAI_Item_ExtIEs__extensionValue_PR;
+typedef enum CellIdentifierAndCELevelForCECapableUEs_ExtIEs__extensionValue_PR {
+	CellIdentifierAndCELevelForCECapableUEs_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} CellIdentifierAndCELevelForCECapableUEs_ExtIEs__extensionValue_PR;
+typedef enum CellID_Broadcast_Item_ExtIEs__extensionValue_PR {
+	CellID_Broadcast_Item_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} CellID_Broadcast_Item_ExtIEs__extensionValue_PR;
+typedef enum CellID_Cancelled_Item_ExtIEs__extensionValue_PR {
+	CellID_Cancelled_Item_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} CellID_Cancelled_Item_ExtIEs__extensionValue_PR;
+typedef enum CellBasedMDT_ExtIEs__extensionValue_PR {
+	CellBasedMDT_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} CellBasedMDT_ExtIEs__extensionValue_PR;
+typedef enum CellBasedQMC_ExtIEs__extensionValue_PR {
+	CellBasedQMC_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} CellBasedQMC_ExtIEs__extensionValue_PR;
+typedef enum Cdma2000OneXSRVCCInfo_ExtIEs__extensionValue_PR {
+	Cdma2000OneXSRVCCInfo_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} Cdma2000OneXSRVCCInfo_ExtIEs__extensionValue_PR;
+typedef enum CellType_ExtIEs__extensionValue_PR {
+	CellType_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} CellType_ExtIEs__extensionValue_PR;
+typedef enum CGI_ExtIEs__extensionValue_PR {
+	CGI_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} CGI_ExtIEs__extensionValue_PR;
+typedef enum CNTypeRestrictions_Item_ExtIEs__extensionValue_PR {
+	CNTypeRestrictions_Item_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} CNTypeRestrictions_Item_ExtIEs__extensionValue_PR;
+typedef enum ConnectedengNBItem_ExtIEs__extensionValue_PR {
+	ConnectedengNBItem_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} ConnectedengNBItem_ExtIEs__extensionValue_PR;
+typedef enum CSG_IdList_Item_ExtIEs__extensionValue_PR {
+	CSG_IdList_Item_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} CSG_IdList_Item_ExtIEs__extensionValue_PR;
+typedef enum COUNTvalue_ExtIEs__extensionValue_PR {
+	COUNTvalue_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} COUNTvalue_ExtIEs__extensionValue_PR;
+typedef enum COUNTValueExtended_ExtIEs__extensionValue_PR {
+	COUNTValueExtended_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} COUNTValueExtended_ExtIEs__extensionValue_PR;
+typedef enum COUNTvaluePDCP_SNlength18_ExtIEs__extensionValue_PR {
+	COUNTvaluePDCP_SNlength18_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} COUNTvaluePDCP_SNlength18_ExtIEs__extensionValue_PR;
+typedef enum CriticalityDiagnostics_ExtIEs__extensionValue_PR {
+	CriticalityDiagnostics_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} CriticalityDiagnostics_ExtIEs__extensionValue_PR;
+typedef enum CriticalityDiagnostics_IE_Item_ExtIEs__extensionValue_PR {
+	CriticalityDiagnostics_IE_Item_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} CriticalityDiagnostics_IE_Item_ExtIEs__extensionValue_PR;
+typedef enum ServedDCNsItem_ExtIEs__extensionValue_PR {
+	ServedDCNsItem_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} ServedDCNsItem_ExtIEs__extensionValue_PR;
+typedef enum DL_CP_SecurityInformation_ExtIEs__extensionValue_PR {
+	DL_CP_SecurityInformation_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} DL_CP_SecurityInformation_ExtIEs__extensionValue_PR;
+typedef enum EmergencyAreaID_Broadcast_Item_ExtIEs__extensionValue_PR {
+	EmergencyAreaID_Broadcast_Item_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} EmergencyAreaID_Broadcast_Item_ExtIEs__extensionValue_PR;
+typedef enum EmergencyAreaID_Cancelled_Item_ExtIEs__extensionValue_PR {
+	EmergencyAreaID_Cancelled_Item_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} EmergencyAreaID_Cancelled_Item_ExtIEs__extensionValue_PR;
+typedef enum CompletedCellinEAI_Item_ExtIEs__extensionValue_PR {
+	CompletedCellinEAI_Item_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} CompletedCellinEAI_Item_ExtIEs__extensionValue_PR;
+typedef enum GERAN_Cell_ID_ExtIEs__extensionValue_PR {
+	GERAN_Cell_ID_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} GERAN_Cell_ID_ExtIEs__extensionValue_PR;
+typedef enum GlobalENB_ID_ExtIEs__extensionValue_PR {
+	GlobalENB_ID_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} GlobalENB_ID_ExtIEs__extensionValue_PR;
+typedef enum Global_en_gNB_ID_ExtIEs__extensionValue_PR {
+	Global_en_gNB_ID_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} Global_en_gNB_ID_ExtIEs__extensionValue_PR;
+typedef enum ENB_StatusTransfer_TransparentContainer_ExtIEs__extensionValue_PR {
+	ENB_StatusTransfer_TransparentContainer_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} ENB_StatusTransfer_TransparentContainer_ExtIEs__extensionValue_PR;
+typedef enum EN_DCSONConfigurationTransfer_ExtIEs__extensionValue_PR {
+	EN_DCSONConfigurationTransfer_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} EN_DCSONConfigurationTransfer_ExtIEs__extensionValue_PR;
+typedef enum EN_DCTransferTypeRequest_ExtIEs__extensionValue_PR {
+	EN_DCTransferTypeRequest_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} EN_DCTransferTypeRequest_ExtIEs__extensionValue_PR;
+typedef enum EN_DCTransferTypeReply_ExtIEs__extensionValue_PR {
+	EN_DCTransferTypeReply_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} EN_DCTransferTypeReply_ExtIEs__extensionValue_PR;
+typedef enum EN_DCSONeNBIdentification_ExtIEs__extensionValue_PR {
+	EN_DCSONeNBIdentification_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} EN_DCSONeNBIdentification_ExtIEs__extensionValue_PR;
+typedef enum EN_DCSONengNBIdentification_ExtIEs__extensionValue_PR {
+	EN_DCSONengNBIdentification_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} EN_DCSONengNBIdentification_ExtIEs__extensionValue_PR;
+typedef enum E_RABInformationListItem_ExtIEs__extensionValue_PR {
+	E_RABInformationListItem_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} E_RABInformationListItem_ExtIEs__extensionValue_PR;
+typedef enum E_RABItem_ExtIEs__extensionValue_PR {
+	E_RABItem_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} E_RABItem_ExtIEs__extensionValue_PR;
+typedef enum E_RABQoSParameters_ExtIEs__extensionValue_PR {
+	E_RABQoSParameters_ExtIEs__extensionValue_PR_NOTHING,	/* No components present */
+	E_RABQoSParameters_ExtIEs__extensionValue_PR_Packet_LossRate,
+	E_RABQoSParameters_ExtIEs__extensionValue_PR_Packet_LossRate_1
+} E_RABQoSParameters_ExtIEs__extensionValue_PR;
+typedef enum E_RABUsageReportItem_ExtIEs__extensionValue_PR {
+	E_RABUsageReportItem_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} E_RABUsageReportItem_ExtIEs__extensionValue_PR;
+typedef enum EUTRAN_CGI_ExtIEs__extensionValue_PR {
+	EUTRAN_CGI_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} EUTRAN_CGI_ExtIEs__extensionValue_PR;
+typedef enum ExpectedUEBehaviour_ExtIEs__extensionValue_PR {
+	ExpectedUEBehaviour_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} ExpectedUEBehaviour_ExtIEs__extensionValue_PR;
+typedef enum ExpectedUEActivityBehaviour_ExtIEs__extensionValue_PR {
+	ExpectedUEActivityBehaviour_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} ExpectedUEActivityBehaviour_ExtIEs__extensionValue_PR;
+typedef enum FiveGSTAI_ExtIEs__extensionValue_PR {
+	FiveGSTAI_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} FiveGSTAI_ExtIEs__extensionValue_PR;
+typedef enum ForbiddenTAs_Item_ExtIEs__extensionValue_PR {
+	ForbiddenTAs_Item_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} ForbiddenTAs_Item_ExtIEs__extensionValue_PR;
+typedef enum ForbiddenLAs_Item_ExtIEs__extensionValue_PR {
+	ForbiddenLAs_Item_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} ForbiddenLAs_Item_ExtIEs__extensionValue_PR;
+typedef enum GBR_QosInformation_ExtIEs__extensionValue_PR {
+	GBR_QosInformation_ExtIEs__extensionValue_PR_NOTHING,	/* No components present */
+	GBR_QosInformation_ExtIEs__extensionValue_PR_ExtendedBitRate,
+	GBR_QosInformation_ExtIEs__extensionValue_PR_ExtendedBitRate_1,
+	GBR_QosInformation_ExtIEs__extensionValue_PR_ExtendedBitRate_2,
+	GBR_QosInformation_ExtIEs__extensionValue_PR_ExtendedBitRate_3
+} GBR_QosInformation_ExtIEs__extensionValue_PR;
+typedef enum GUMMEI_ExtIEs__extensionValue_PR {
+	GUMMEI_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} GUMMEI_ExtIEs__extensionValue_PR;
+typedef enum HandoverRestrictionList_ExtIEs__extensionValue_PR {
+	HandoverRestrictionList_ExtIEs__extensionValue_PR_NOTHING,	/* No components present */
+	HandoverRestrictionList_ExtIEs__extensionValue_PR_NRrestrictioninEPSasSecondaryRAT,
+	HandoverRestrictionList_ExtIEs__extensionValue_PR_UnlicensedSpectrumRestriction,
+	HandoverRestrictionList_ExtIEs__extensionValue_PR_CNTypeRestrictions,
+	HandoverRestrictionList_ExtIEs__extensionValue_PR_NRrestrictionin5GS,
+	HandoverRestrictionList_ExtIEs__extensionValue_PR_PLMNidentity
+} HandoverRestrictionList_ExtIEs__extensionValue_PR;
+typedef enum ImmediateMDT_ExtIEs__extensionValue_PR {
+	ImmediateMDT_ExtIEs__extensionValue_PR_NOTHING,	/* No components present */
+	ImmediateMDT_ExtIEs__extensionValue_PR_M3Configuration,
+	ImmediateMDT_ExtIEs__extensionValue_PR_M4Configuration,
+	ImmediateMDT_ExtIEs__extensionValue_PR_M5Configuration,
+	ImmediateMDT_ExtIEs__extensionValue_PR_MDT_Location_Info,
+	ImmediateMDT_ExtIEs__extensionValue_PR_M6Configuration,
+	ImmediateMDT_ExtIEs__extensionValue_PR_M7Configuration,
+	ImmediateMDT_ExtIEs__extensionValue_PR_BluetoothMeasurementConfiguration,
+	ImmediateMDT_ExtIEs__extensionValue_PR_WLANMeasurementConfiguration
+} ImmediateMDT_ExtIEs__extensionValue_PR;
+typedef enum InformationOnRecommendedCellsAndENBsForPaging_ExtIEs__extensionValue_PR {
+	InformationOnRecommendedCellsAndENBsForPaging_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} InformationOnRecommendedCellsAndENBsForPaging_ExtIEs__extensionValue_PR;
+typedef enum LAI_ExtIEs__extensionValue_PR {
+	LAI_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} LAI_ExtIEs__extensionValue_PR;
+typedef enum LastVisitedEUTRANCellInformation_ExtIEs__extensionValue_PR {
+	LastVisitedEUTRANCellInformation_ExtIEs__extensionValue_PR_NOTHING,	/* No components present */
+	LastVisitedEUTRANCellInformation_ExtIEs__extensionValue_PR_Time_UE_StayedInCell_EnhancedGranularity,
+	LastVisitedEUTRANCellInformation_ExtIEs__extensionValue_PR_Cause
+} LastVisitedEUTRANCellInformation_ExtIEs__extensionValue_PR;
+typedef enum ListeningSubframePattern_ExtIEs__extensionValue_PR {
+	ListeningSubframePattern_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} ListeningSubframePattern_ExtIEs__extensionValue_PR;
+typedef enum LoggedMDT_ExtIEs__extensionValue_PR {
+	LoggedMDT_ExtIEs__extensionValue_PR_NOTHING,	/* No components present */
+	LoggedMDT_ExtIEs__extensionValue_PR_BluetoothMeasurementConfiguration,
+	LoggedMDT_ExtIEs__extensionValue_PR_WLANMeasurementConfiguration
+} LoggedMDT_ExtIEs__extensionValue_PR;
+typedef enum LoggedMBSFNMDT_ExtIEs__extensionValue_PR {
+	LoggedMBSFNMDT_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} LoggedMBSFNMDT_ExtIEs__extensionValue_PR;
+typedef enum M3Configuration_ExtIEs__extensionValue_PR {
+	M3Configuration_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} M3Configuration_ExtIEs__extensionValue_PR;
+typedef enum M4Configuration_ExtIEs__extensionValue_PR {
+	M4Configuration_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} M4Configuration_ExtIEs__extensionValue_PR;
+typedef enum M5Configuration_ExtIEs__extensionValue_PR {
+	M5Configuration_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} M5Configuration_ExtIEs__extensionValue_PR;
+typedef enum M6Configuration_ExtIEs__extensionValue_PR {
+	M6Configuration_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} M6Configuration_ExtIEs__extensionValue_PR;
+typedef enum M7Configuration_ExtIEs__extensionValue_PR {
+	M7Configuration_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} M7Configuration_ExtIEs__extensionValue_PR;
+typedef enum MDT_Configuration_ExtIEs__extensionValue_PR {
+	MDT_Configuration_ExtIEs__extensionValue_PR_NOTHING,	/* No components present */
+	MDT_Configuration_ExtIEs__extensionValue_PR_MDTPLMNList
+} MDT_Configuration_ExtIEs__extensionValue_PR;
+typedef enum MBSFN_ResultToLogInfo_ExtIEs__extensionValue_PR {
+	MBSFN_ResultToLogInfo_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} MBSFN_ResultToLogInfo_ExtIEs__extensionValue_PR;
+typedef enum MutingPatternInformation_ExtIEs__extensionValue_PR {
+	MutingPatternInformation_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} MutingPatternInformation_ExtIEs__extensionValue_PR;
+typedef enum NB_IoT_Paging_eDRXInformation_ExtIEs__extensionValue_PR {
+	NB_IoT_Paging_eDRXInformation_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} NB_IoT_Paging_eDRXInformation_ExtIEs__extensionValue_PR;
+typedef enum NR_CGI_ExtIEs__extensionValue_PR {
+	NR_CGI_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} NR_CGI_ExtIEs__extensionValue_PR;
+typedef enum NRUESecurityCapabilities_ExtIEs__extensionValue_PR {
+	NRUESecurityCapabilities_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} NRUESecurityCapabilities_ExtIEs__extensionValue_PR;
+typedef enum PagingAttemptInformation_ExtIEs__extensionValue_PR {
+	PagingAttemptInformation_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} PagingAttemptInformation_ExtIEs__extensionValue_PR;
+typedef enum Paging_eDRXInformation_ExtIEs__extensionValue_PR {
+	Paging_eDRXInformation_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} Paging_eDRXInformation_ExtIEs__extensionValue_PR;
+typedef enum M1PeriodicReporting_ExtIEs__extensionValue_PR {
+	M1PeriodicReporting_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} M1PeriodicReporting_ExtIEs__extensionValue_PR;
+typedef enum PLMNAreaBasedQMC_ExtIEs__extensionValue_PR {
+	PLMNAreaBasedQMC_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} PLMNAreaBasedQMC_ExtIEs__extensionValue_PR;
+typedef enum ProSeAuthorized_ExtIEs__extensionValue_PR {
+	ProSeAuthorized_ExtIEs__extensionValue_PR_NOTHING,	/* No components present */
+	ProSeAuthorized_ExtIEs__extensionValue_PR_ProSeUEtoNetworkRelaying
+} ProSeAuthorized_ExtIEs__extensionValue_PR;
+typedef enum PSCellInformation_ExtIEs__extensionValue_PR {
+	PSCellInformation_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} PSCellInformation_ExtIEs__extensionValue_PR;
+typedef enum RecommendedCellsForPaging_ExtIEs__extensionValue_PR {
+	RecommendedCellsForPaging_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} RecommendedCellsForPaging_ExtIEs__extensionValue_PR;
+typedef enum RecommendedCellsForPagingItem_ExtIEs__extensionValue_PR {
+	RecommendedCellsForPagingItem_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} RecommendedCellsForPagingItem_ExtIEs__extensionValue_PR;
+typedef enum RecommendedENBsForPaging_ExtIEs__extensionValue_PR {
+	RecommendedENBsForPaging_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} RecommendedENBsForPaging_ExtIEs__extensionValue_PR;
+typedef enum RecommendedENBItem_ExtIEs__extensionValue_PR {
+	RecommendedENBItem_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} RecommendedENBItem_ExtIEs__extensionValue_PR;
+typedef enum RequestType_ExtIEs__extensionValue_PR {
+	RequestType_ExtIEs__extensionValue_PR_NOTHING,	/* No components present */
+	RequestType_ExtIEs__extensionValue_PR_RequestTypeAdditionalInfo
+} RequestType_ExtIEs__extensionValue_PR;
+typedef enum RIMTransfer_ExtIEs__extensionValue_PR {
+	RIMTransfer_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} RIMTransfer_ExtIEs__extensionValue_PR;
+typedef enum RLFReportInformation_ExtIEs__extensionValue_PR {
+	RLFReportInformation_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} RLFReportInformation_ExtIEs__extensionValue_PR;
+typedef enum SecurityContext_ExtIEs__extensionValue_PR {
+	SecurityContext_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} SecurityContext_ExtIEs__extensionValue_PR;
+typedef enum SecondaryRATDataUsageReportItem_ExtIEs__extensionValue_PR {
+	SecondaryRATDataUsageReportItem_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} SecondaryRATDataUsageReportItem_ExtIEs__extensionValue_PR;
+typedef enum SONInformationReply_ExtIEs__extensionValue_PR {
+	SONInformationReply_ExtIEs__extensionValue_PR_NOTHING,	/* No components present */
+	SONInformationReply_ExtIEs__extensionValue_PR_TimeSynchronisationInfo,
+	SONInformationReply_ExtIEs__extensionValue_PR_MutingPatternInformation
+} SONInformationReply_ExtIEs__extensionValue_PR;
+typedef enum SONConfigurationTransfer_ExtIEs__extensionValue_PR {
+	SONConfigurationTransfer_ExtIEs__extensionValue_PR_NOTHING,	/* No components present */
+	SONConfigurationTransfer_ExtIEs__extensionValue_PR_X2TNLConfigurationInfo,
+	SONConfigurationTransfer_ExtIEs__extensionValue_PR_SynchronisationInformation
+} SONConfigurationTransfer_ExtIEs__extensionValue_PR;
+typedef enum SynchronisationInformation_ExtIEs__extensionValue_PR {
+	SynchronisationInformation_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} SynchronisationInformation_ExtIEs__extensionValue_PR;
+typedef enum SourceeNB_ID_ExtIEs__extensionValue_PR {
+	SourceeNB_ID_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} SourceeNB_ID_ExtIEs__extensionValue_PR;
+typedef enum SourceeNB_ToTargeteNB_TransparentContainer_ExtIEs__extensionValue_PR {
+	SourceeNB_ToTargeteNB_TransparentContainer_ExtIEs__extensionValue_PR_NOTHING,	/* No components present */
+	SourceeNB_ToTargeteNB_TransparentContainer_ExtIEs__extensionValue_PR_MobilityInformation,
+	SourceeNB_ToTargeteNB_TransparentContainer_ExtIEs__extensionValue_PR_UE_HistoryInformationFromTheUE,
+	SourceeNB_ToTargeteNB_TransparentContainer_ExtIEs__extensionValue_PR_IMSvoiceEPSfallbackfrom5G
+} SourceeNB_ToTargeteNB_TransparentContainer_ExtIEs__extensionValue_PR;
+typedef enum ServedGUMMEIsItem_ExtIEs__extensionValue_PR {
+	ServedGUMMEIsItem_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} ServedGUMMEIsItem_ExtIEs__extensionValue_PR;
+typedef enum Subscription_Based_UE_DifferentiationInfo_ExtIEs__extensionValue_PR {
+	Subscription_Based_UE_DifferentiationInfo_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} Subscription_Based_UE_DifferentiationInfo_ExtIEs__extensionValue_PR;
+typedef enum ScheduledCommunicationTime_ExtIEs__extensionValue_PR {
+	ScheduledCommunicationTime_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} ScheduledCommunicationTime_ExtIEs__extensionValue_PR;
+typedef enum SupportedTAs_Item_ExtIEs__extensionValue_PR {
+	SupportedTAs_Item_ExtIEs__extensionValue_PR_NOTHING,	/* No components present */
+	SupportedTAs_Item_ExtIEs__extensionValue_PR_RAT_Type
+} SupportedTAs_Item_ExtIEs__extensionValue_PR;
+typedef enum TimeSynchronisationInfo_ExtIEs__extensionValue_PR {
+	TimeSynchronisationInfo_ExtIEs__extensionValue_PR_NOTHING,	/* No components present */
+	TimeSynchronisationInfo_ExtIEs__extensionValue_PR_MutingAvailabilityIndication
+} TimeSynchronisationInfo_ExtIEs__extensionValue_PR;
+typedef enum S_TMSI_ExtIEs__extensionValue_PR {
+	S_TMSI_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} S_TMSI_ExtIEs__extensionValue_PR;
+typedef enum TAIBasedMDT_ExtIEs__extensionValue_PR {
+	TAIBasedMDT_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} TAIBasedMDT_ExtIEs__extensionValue_PR;
+typedef enum TAI_ExtIEs__extensionValue_PR {
+	TAI_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} TAI_ExtIEs__extensionValue_PR;
+typedef enum TAI_Broadcast_Item_ExtIEs__extensionValue_PR {
+	TAI_Broadcast_Item_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} TAI_Broadcast_Item_ExtIEs__extensionValue_PR;
+typedef enum TAI_Cancelled_Item_ExtIEs__extensionValue_PR {
+	TAI_Cancelled_Item_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} TAI_Cancelled_Item_ExtIEs__extensionValue_PR;
+typedef enum TABasedMDT_ExtIEs__extensionValue_PR {
+	TABasedMDT_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} TABasedMDT_ExtIEs__extensionValue_PR;
+typedef enum TABasedQMC_ExtIEs__extensionValue_PR {
+	TABasedQMC_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} TABasedQMC_ExtIEs__extensionValue_PR;
+typedef enum TAIBasedQMC_ExtIEs__extensionValue_PR {
+	TAIBasedQMC_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} TAIBasedQMC_ExtIEs__extensionValue_PR;
+typedef enum CompletedCellinTAI_Item_ExtIEs__extensionValue_PR {
+	CompletedCellinTAI_Item_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} CompletedCellinTAI_Item_ExtIEs__extensionValue_PR;
+typedef enum TargeteNB_ID_ExtIEs__extensionValue_PR {
+	TargeteNB_ID_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} TargeteNB_ID_ExtIEs__extensionValue_PR;
+typedef enum TargetRNC_ID_ExtIEs__extensionValue_PR {
+	TargetRNC_ID_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} TargetRNC_ID_ExtIEs__extensionValue_PR;
+typedef enum TargetNgRanNode_ID_ExtIEs__extensionValue_PR {
+	TargetNgRanNode_ID_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} TargetNgRanNode_ID_ExtIEs__extensionValue_PR;
+typedef enum GNB_ExtIEs__extensionValue_PR {
+	GNB_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} GNB_ExtIEs__extensionValue_PR;
+typedef enum Global_GNB_ID_ExtIEs__extensionValue_PR {
+	Global_GNB_ID_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} Global_GNB_ID_ExtIEs__extensionValue_PR;
+typedef enum NG_eNB_ExtIEs__extensionValue_PR {
+	NG_eNB_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} NG_eNB_ExtIEs__extensionValue_PR;
+typedef enum TargeteNB_ToSourceeNB_TransparentContainer_ExtIEs__extensionValue_PR {
+	TargeteNB_ToSourceeNB_TransparentContainer_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} TargeteNB_ToSourceeNB_TransparentContainer_ExtIEs__extensionValue_PR;
+typedef enum M1ThresholdEventA2_ExtIEs__extensionValue_PR {
+	M1ThresholdEventA2_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} M1ThresholdEventA2_ExtIEs__extensionValue_PR;
+typedef enum TraceActivation_ExtIEs__extensionValue_PR {
+	TraceActivation_ExtIEs__extensionValue_PR_NOTHING,	/* No components present */
+	TraceActivation_ExtIEs__extensionValue_PR_MDT_Configuration,
+	TraceActivation_ExtIEs__extensionValue_PR_UEAppLayerMeasConfig
+} TraceActivation_ExtIEs__extensionValue_PR;
+typedef enum Tunnel_Information_ExtIEs__extensionValue_PR {
+	Tunnel_Information_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} Tunnel_Information_ExtIEs__extensionValue_PR;
+typedef enum UEAggregate_MaximumBitrates_ExtIEs__extensionValue_PR {
+	UEAggregate_MaximumBitrates_ExtIEs__extensionValue_PR_NOTHING,	/* No components present */
+	UEAggregate_MaximumBitrates_ExtIEs__extensionValue_PR_ExtendedBitRate,
+	UEAggregate_MaximumBitrates_ExtIEs__extensionValue_PR_ExtendedBitRate_1
+} UEAggregate_MaximumBitrates_ExtIEs__extensionValue_PR;
+typedef enum UEAppLayerMeasConfig_ExtIEs__extensionValue_PR {
+	UEAppLayerMeasConfig_ExtIEs__extensionValue_PR_NOTHING,	/* No components present */
+	UEAppLayerMeasConfig_ExtIEs__extensionValue_PR_ServiceType
+} UEAppLayerMeasConfig_ExtIEs__extensionValue_PR;
+typedef enum UE_S1AP_ID_pair_ExtIEs__extensionValue_PR {
+	UE_S1AP_ID_pair_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} UE_S1AP_ID_pair_ExtIEs__extensionValue_PR;
+typedef enum UE_associatedLogicalS1_ConnectionItemExtIEs__extensionValue_PR {
+	UE_associatedLogicalS1_ConnectionItemExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} UE_associatedLogicalS1_ConnectionItemExtIEs__extensionValue_PR;
+typedef enum UESecurityCapabilities_ExtIEs__extensionValue_PR {
+	UESecurityCapabilities_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} UESecurityCapabilities_ExtIEs__extensionValue_PR;
+typedef enum UE_Sidelink_Aggregate_MaximumBitrates_ExtIEs__extensionValue_PR {
+	UE_Sidelink_Aggregate_MaximumBitrates_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} UE_Sidelink_Aggregate_MaximumBitrates_ExtIEs__extensionValue_PR;
+typedef enum UL_CP_SecurityInformation_ExtIEs__extensionValue_PR {
+	UL_CP_SecurityInformation_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} UL_CP_SecurityInformation_ExtIEs__extensionValue_PR;
+typedef enum UserLocationInformation_ExtIEs__extensionValue_PR {
+	UserLocationInformation_ExtIEs__extensionValue_PR_NOTHING,	/* No components present */
+	UserLocationInformation_ExtIEs__extensionValue_PR_PSCellInformation
+} UserLocationInformation_ExtIEs__extensionValue_PR;
+typedef enum V2XServicesAuthorized_ExtIEs__extensionValue_PR {
+	V2XServicesAuthorized_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} V2XServicesAuthorized_ExtIEs__extensionValue_PR;
+typedef enum WLANMeasurementConfiguration_ExtIEs__extensionValue_PR {
+	WLANMeasurementConfiguration_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} WLANMeasurementConfiguration_ExtIEs__extensionValue_PR;
+typedef enum X2TNLConfigurationInfo_ExtIEs__extensionValue_PR {
+	X2TNLConfigurationInfo_ExtIEs__extensionValue_PR_NOTHING,	/* No components present */
+	X2TNLConfigurationInfo_ExtIEs__extensionValue_PR_ENBX2ExtTLAs,
+	X2TNLConfigurationInfo_ExtIEs__extensionValue_PR_ENBIndirectX2TransportLayerAddresses
+} X2TNLConfigurationInfo_ExtIEs__extensionValue_PR;
+typedef enum ENBX2ExtTLA_ExtIEs__extensionValue_PR {
+	ENBX2ExtTLA_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} ENBX2ExtTLA_ExtIEs__extensionValue_PR;
+typedef enum E_RABDataForwardingItem_ExtIEs__extensionValue_PR {
+	E_RABDataForwardingItem_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} E_RABDataForwardingItem_ExtIEs__extensionValue_PR;
+typedef enum E_RABToBeSetupItemHOReq_ExtIEs__extensionValue_PR {
+	E_RABToBeSetupItemHOReq_ExtIEs__extensionValue_PR_NOTHING,	/* No components present */
+	E_RABToBeSetupItemHOReq_ExtIEs__extensionValue_PR_Data_Forwarding_Not_Possible,
+	E_RABToBeSetupItemHOReq_ExtIEs__extensionValue_PR_BearerType
+} E_RABToBeSetupItemHOReq_ExtIEs__extensionValue_PR;
+typedef enum E_RABAdmittedItem_ExtIEs__extensionValue_PR {
+	E_RABAdmittedItem_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} E_RABAdmittedItem_ExtIEs__extensionValue_PR;
+typedef enum E_RABFailedToSetupItemHOReqAckExtIEs__extensionValue_PR {
+	E_RABFailedToSetupItemHOReqAckExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} E_RABFailedToSetupItemHOReqAckExtIEs__extensionValue_PR;
+typedef enum E_RABToBeSwitchedDLItem_ExtIEs__extensionValue_PR {
+	E_RABToBeSwitchedDLItem_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} E_RABToBeSwitchedDLItem_ExtIEs__extensionValue_PR;
+typedef enum E_RABToBeSwitchedULItem_ExtIEs__extensionValue_PR {
+	E_RABToBeSwitchedULItem_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} E_RABToBeSwitchedULItem_ExtIEs__extensionValue_PR;
+typedef enum E_RABToBeSetupItemBearerSUReqExtIEs__extensionValue_PR {
+	E_RABToBeSetupItemBearerSUReqExtIEs__extensionValue_PR_NOTHING,	/* No components present */
+	E_RABToBeSetupItemBearerSUReqExtIEs__extensionValue_PR_Correlation_ID,
+	E_RABToBeSetupItemBearerSUReqExtIEs__extensionValue_PR_Correlation_ID_1,
+	E_RABToBeSetupItemBearerSUReqExtIEs__extensionValue_PR_BearerType
+} E_RABToBeSetupItemBearerSUReqExtIEs__extensionValue_PR;
+typedef enum E_RABSetupItemBearerSUResExtIEs__extensionValue_PR {
+	E_RABSetupItemBearerSUResExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} E_RABSetupItemBearerSUResExtIEs__extensionValue_PR;
+typedef enum E_RABToBeModifyItemBearerModReqExtIEs__extensionValue_PR {
+	E_RABToBeModifyItemBearerModReqExtIEs__extensionValue_PR_NOTHING,	/* No components present */
+	E_RABToBeModifyItemBearerModReqExtIEs__extensionValue_PR_TransportInformation
+} E_RABToBeModifyItemBearerModReqExtIEs__extensionValue_PR;
+typedef enum E_RABModifyItemBearerModResExtIEs__extensionValue_PR {
+	E_RABModifyItemBearerModResExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} E_RABModifyItemBearerModResExtIEs__extensionValue_PR;
+typedef enum E_RABReleaseItemBearerRelCompExtIEs__extensionValue_PR {
+	E_RABReleaseItemBearerRelCompExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} E_RABReleaseItemBearerRelCompExtIEs__extensionValue_PR;
+typedef enum E_RABToBeSetupItemCtxtSUReqExtIEs__extensionValue_PR {
+	E_RABToBeSetupItemCtxtSUReqExtIEs__extensionValue_PR_NOTHING,	/* No components present */
+	E_RABToBeSetupItemCtxtSUReqExtIEs__extensionValue_PR_Correlation_ID,
+	E_RABToBeSetupItemCtxtSUReqExtIEs__extensionValue_PR_Correlation_ID_1,
+	E_RABToBeSetupItemCtxtSUReqExtIEs__extensionValue_PR_BearerType
+} E_RABToBeSetupItemCtxtSUReqExtIEs__extensionValue_PR;
+typedef enum E_RABSetupItemCtxtSUResExtIEs__extensionValue_PR {
+	E_RABSetupItemCtxtSUResExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} E_RABSetupItemCtxtSUResExtIEs__extensionValue_PR;
+typedef enum TAIItemExtIEs__extensionValue_PR {
+	TAIItemExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} TAIItemExtIEs__extensionValue_PR;
+typedef enum E_RABToBeModifiedItemBearerModInd_ExtIEs__extensionValue_PR {
+	E_RABToBeModifiedItemBearerModInd_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} E_RABToBeModifiedItemBearerModInd_ExtIEs__extensionValue_PR;
+typedef enum E_RABNotToBeModifiedItemBearerModInd_ExtIEs__extensionValue_PR {
+	E_RABNotToBeModifiedItemBearerModInd_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} E_RABNotToBeModifiedItemBearerModInd_ExtIEs__extensionValue_PR;
+typedef enum CSGMembershipInfo_ExtIEs__extensionValue_PR {
+	CSGMembershipInfo_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} CSGMembershipInfo_ExtIEs__extensionValue_PR;
+typedef enum E_RABModifyItemBearerModConfExtIEs__extensionValue_PR {
+	E_RABModifyItemBearerModConfExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} E_RABModifyItemBearerModConfExtIEs__extensionValue_PR;
+typedef enum E_RABFailedToResumeItemResumeReq_ExtIEs__extensionValue_PR {
+	E_RABFailedToResumeItemResumeReq_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} E_RABFailedToResumeItemResumeReq_ExtIEs__extensionValue_PR;
+typedef enum E_RABFailedToResumeItemResumeRes_ExtIEs__extensionValue_PR {
+	E_RABFailedToResumeItemResumeRes_ExtIEs__extensionValue_PR_NOTHING	/* No components present */
+	
+} E_RABFailedToResumeItemResumeRes_ExtIEs__extensionValue_PR;
+
+/* ProtocolExtensionField */
+typedef struct Additional_GUTI_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct Additional_GUTI_ExtIEs__extensionValue {
+		Additional_GUTI_ExtIEs__extensionValue_PR present;
+		union Additional_GUTI_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} Additional_GUTI_ExtIEs_t;
+typedef struct AllocationAndRetentionPriority_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct AllocationAndRetentionPriority_ExtIEs__extensionValue {
+		AllocationAndRetentionPriority_ExtIEs__extensionValue_PR present;
+		union AllocationAndRetentionPriority_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} AllocationAndRetentionPriority_ExtIEs_t;
+typedef struct InformationForCECapableUEs_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct InformationForCECapableUEs_ExtIEs__extensionValue {
+		InformationForCECapableUEs_ExtIEs__extensionValue_PR present;
+		union InformationForCECapableUEs_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} InformationForCECapableUEs_ExtIEs_t;
+typedef struct AssistanceDataForPaging_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct AssistanceDataForPaging_ExtIEs__extensionValue {
+		AssistanceDataForPaging_ExtIEs__extensionValue_PR present;
+		union AssistanceDataForPaging_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} AssistanceDataForPaging_ExtIEs_t;
+typedef struct AssistanceDataForRecommendedCells_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct AssistanceDataForRecommendedCells_ExtIEs__extensionValue {
+		AssistanceDataForRecommendedCells_ExtIEs__extensionValue_PR present;
+		union AssistanceDataForRecommendedCells_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} AssistanceDataForRecommendedCells_ExtIEs_t;
+typedef struct Bearers_SubjectToStatusTransfer_ItemExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct Bearers_SubjectToStatusTransfer_ItemExtIEs__extensionValue {
+		Bearers_SubjectToStatusTransfer_ItemExtIEs__extensionValue_PR present;
+		union Bearers_SubjectToStatusTransfer_ItemExtIEs__extensionValue_u {
+			COUNTValueExtended_t	 COUNTValueExtended;
+			COUNTValueExtended_t	 COUNTValueExtended_1;
+			ReceiveStatusOfULPDCPSDUsExtended_t	 ReceiveStatusOfULPDCPSDUsExtended;
+			COUNTvaluePDCP_SNlength18_t	 COUNTvaluePDCP_SNlength18;
+			COUNTvaluePDCP_SNlength18_t	 COUNTvaluePDCP_SNlength18_1;
+			ReceiveStatusOfULPDCPSDUsPDCP_SNlength18_t	 ReceiveStatusOfULPDCPSDUsPDCP_SNlength18;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} Bearers_SubjectToStatusTransfer_ItemExtIEs_t;
+typedef struct BluetoothMeasurementConfiguration_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct BluetoothMeasurementConfiguration_ExtIEs__extensionValue {
+		BluetoothMeasurementConfiguration_ExtIEs__extensionValue_PR present;
+		union BluetoothMeasurementConfiguration_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} BluetoothMeasurementConfiguration_ExtIEs_t;
+typedef struct CancelledCellinEAI_Item_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct CancelledCellinEAI_Item_ExtIEs__extensionValue {
+		CancelledCellinEAI_Item_ExtIEs__extensionValue_PR present;
+		union CancelledCellinEAI_Item_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CancelledCellinEAI_Item_ExtIEs_t;
+typedef struct CancelledCellinTAI_Item_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct CancelledCellinTAI_Item_ExtIEs__extensionValue {
+		CancelledCellinTAI_Item_ExtIEs__extensionValue_PR present;
+		union CancelledCellinTAI_Item_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CancelledCellinTAI_Item_ExtIEs_t;
+typedef struct CellIdentifierAndCELevelForCECapableUEs_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct CellIdentifierAndCELevelForCECapableUEs_ExtIEs__extensionValue {
+		CellIdentifierAndCELevelForCECapableUEs_ExtIEs__extensionValue_PR present;
+		union CellIdentifierAndCELevelForCECapableUEs_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CellIdentifierAndCELevelForCECapableUEs_ExtIEs_t;
+typedef struct CellID_Broadcast_Item_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct CellID_Broadcast_Item_ExtIEs__extensionValue {
+		CellID_Broadcast_Item_ExtIEs__extensionValue_PR present;
+		union CellID_Broadcast_Item_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CellID_Broadcast_Item_ExtIEs_t;
+typedef struct CellID_Cancelled_Item_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct CellID_Cancelled_Item_ExtIEs__extensionValue {
+		CellID_Cancelled_Item_ExtIEs__extensionValue_PR present;
+		union CellID_Cancelled_Item_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CellID_Cancelled_Item_ExtIEs_t;
+typedef struct CellBasedMDT_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct CellBasedMDT_ExtIEs__extensionValue {
+		CellBasedMDT_ExtIEs__extensionValue_PR present;
+		union CellBasedMDT_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CellBasedMDT_ExtIEs_t;
+typedef struct CellBasedQMC_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct CellBasedQMC_ExtIEs__extensionValue {
+		CellBasedQMC_ExtIEs__extensionValue_PR present;
+		union CellBasedQMC_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CellBasedQMC_ExtIEs_t;
+typedef struct Cdma2000OneXSRVCCInfo_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct Cdma2000OneXSRVCCInfo_ExtIEs__extensionValue {
+		Cdma2000OneXSRVCCInfo_ExtIEs__extensionValue_PR present;
+		union Cdma2000OneXSRVCCInfo_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} Cdma2000OneXSRVCCInfo_ExtIEs_t;
+typedef struct CellType_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct CellType_ExtIEs__extensionValue {
+		CellType_ExtIEs__extensionValue_PR present;
+		union CellType_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CellType_ExtIEs_t;
+typedef struct CGI_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct CGI_ExtIEs__extensionValue {
+		CGI_ExtIEs__extensionValue_PR present;
+		union CGI_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CGI_ExtIEs_t;
+typedef struct CNTypeRestrictions_Item_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct CNTypeRestrictions_Item_ExtIEs__extensionValue {
+		CNTypeRestrictions_Item_ExtIEs__extensionValue_PR present;
+		union CNTypeRestrictions_Item_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CNTypeRestrictions_Item_ExtIEs_t;
+typedef struct ConnectedengNBItem_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct ConnectedengNBItem_ExtIEs__extensionValue {
+		ConnectedengNBItem_ExtIEs__extensionValue_PR present;
+		union ConnectedengNBItem_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ConnectedengNBItem_ExtIEs_t;
+typedef struct CSG_IdList_Item_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct CSG_IdList_Item_ExtIEs__extensionValue {
+		CSG_IdList_Item_ExtIEs__extensionValue_PR present;
+		union CSG_IdList_Item_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CSG_IdList_Item_ExtIEs_t;
+typedef struct COUNTvalue_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct COUNTvalue_ExtIEs__extensionValue {
+		COUNTvalue_ExtIEs__extensionValue_PR present;
+		union COUNTvalue_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} COUNTvalue_ExtIEs_t;
+typedef struct COUNTValueExtended_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct COUNTValueExtended_ExtIEs__extensionValue {
+		COUNTValueExtended_ExtIEs__extensionValue_PR present;
+		union COUNTValueExtended_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} COUNTValueExtended_ExtIEs_t;
+typedef struct COUNTvaluePDCP_SNlength18_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct COUNTvaluePDCP_SNlength18_ExtIEs__extensionValue {
+		COUNTvaluePDCP_SNlength18_ExtIEs__extensionValue_PR present;
+		union COUNTvaluePDCP_SNlength18_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} COUNTvaluePDCP_SNlength18_ExtIEs_t;
+typedef struct CriticalityDiagnostics_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct CriticalityDiagnostics_ExtIEs__extensionValue {
+		CriticalityDiagnostics_ExtIEs__extensionValue_PR present;
+		union CriticalityDiagnostics_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CriticalityDiagnostics_ExtIEs_t;
+typedef struct CriticalityDiagnostics_IE_Item_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct CriticalityDiagnostics_IE_Item_ExtIEs__extensionValue {
+		CriticalityDiagnostics_IE_Item_ExtIEs__extensionValue_PR present;
+		union CriticalityDiagnostics_IE_Item_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CriticalityDiagnostics_IE_Item_ExtIEs_t;
+typedef struct ServedDCNsItem_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct ServedDCNsItem_ExtIEs__extensionValue {
+		ServedDCNsItem_ExtIEs__extensionValue_PR present;
+		union ServedDCNsItem_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ServedDCNsItem_ExtIEs_t;
+typedef struct DL_CP_SecurityInformation_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct DL_CP_SecurityInformation_ExtIEs__extensionValue {
+		DL_CP_SecurityInformation_ExtIEs__extensionValue_PR present;
+		union DL_CP_SecurityInformation_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} DL_CP_SecurityInformation_ExtIEs_t;
+typedef struct EmergencyAreaID_Broadcast_Item_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct EmergencyAreaID_Broadcast_Item_ExtIEs__extensionValue {
+		EmergencyAreaID_Broadcast_Item_ExtIEs__extensionValue_PR present;
+		union EmergencyAreaID_Broadcast_Item_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} EmergencyAreaID_Broadcast_Item_ExtIEs_t;
+typedef struct EmergencyAreaID_Cancelled_Item_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct EmergencyAreaID_Cancelled_Item_ExtIEs__extensionValue {
+		EmergencyAreaID_Cancelled_Item_ExtIEs__extensionValue_PR present;
+		union EmergencyAreaID_Cancelled_Item_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} EmergencyAreaID_Cancelled_Item_ExtIEs_t;
+typedef struct CompletedCellinEAI_Item_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct CompletedCellinEAI_Item_ExtIEs__extensionValue {
+		CompletedCellinEAI_Item_ExtIEs__extensionValue_PR present;
+		union CompletedCellinEAI_Item_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CompletedCellinEAI_Item_ExtIEs_t;
+typedef struct GERAN_Cell_ID_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct GERAN_Cell_ID_ExtIEs__extensionValue {
+		GERAN_Cell_ID_ExtIEs__extensionValue_PR present;
+		union GERAN_Cell_ID_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} GERAN_Cell_ID_ExtIEs_t;
+typedef struct GlobalENB_ID_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct GlobalENB_ID_ExtIEs__extensionValue {
+		GlobalENB_ID_ExtIEs__extensionValue_PR present;
+		union GlobalENB_ID_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} GlobalENB_ID_ExtIEs_t;
+typedef struct Global_en_gNB_ID_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct Global_en_gNB_ID_ExtIEs__extensionValue {
+		Global_en_gNB_ID_ExtIEs__extensionValue_PR present;
+		union Global_en_gNB_ID_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} Global_en_gNB_ID_ExtIEs_t;
+typedef struct ENB_StatusTransfer_TransparentContainer_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct ENB_StatusTransfer_TransparentContainer_ExtIEs__extensionValue {
+		ENB_StatusTransfer_TransparentContainer_ExtIEs__extensionValue_PR present;
+		union ENB_StatusTransfer_TransparentContainer_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ENB_StatusTransfer_TransparentContainer_ExtIEs_t;
+typedef struct EN_DCSONConfigurationTransfer_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct EN_DCSONConfigurationTransfer_ExtIEs__extensionValue {
+		EN_DCSONConfigurationTransfer_ExtIEs__extensionValue_PR present;
+		union EN_DCSONConfigurationTransfer_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} EN_DCSONConfigurationTransfer_ExtIEs_t;
+typedef struct EN_DCTransferTypeRequest_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct EN_DCTransferTypeRequest_ExtIEs__extensionValue {
+		EN_DCTransferTypeRequest_ExtIEs__extensionValue_PR present;
+		union EN_DCTransferTypeRequest_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} EN_DCTransferTypeRequest_ExtIEs_t;
+typedef struct EN_DCTransferTypeReply_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct EN_DCTransferTypeReply_ExtIEs__extensionValue {
+		EN_DCTransferTypeReply_ExtIEs__extensionValue_PR present;
+		union EN_DCTransferTypeReply_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} EN_DCTransferTypeReply_ExtIEs_t;
+typedef struct EN_DCSONeNBIdentification_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct EN_DCSONeNBIdentification_ExtIEs__extensionValue {
+		EN_DCSONeNBIdentification_ExtIEs__extensionValue_PR present;
+		union EN_DCSONeNBIdentification_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} EN_DCSONeNBIdentification_ExtIEs_t;
+typedef struct EN_DCSONengNBIdentification_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct EN_DCSONengNBIdentification_ExtIEs__extensionValue {
+		EN_DCSONengNBIdentification_ExtIEs__extensionValue_PR present;
+		union EN_DCSONengNBIdentification_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} EN_DCSONengNBIdentification_ExtIEs_t;
+typedef struct E_RABInformationListItem_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABInformationListItem_ExtIEs__extensionValue {
+		E_RABInformationListItem_ExtIEs__extensionValue_PR present;
+		union E_RABInformationListItem_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABInformationListItem_ExtIEs_t;
+typedef struct E_RABItem_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABItem_ExtIEs__extensionValue {
+		E_RABItem_ExtIEs__extensionValue_PR present;
+		union E_RABItem_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABItem_ExtIEs_t;
+typedef struct E_RABQoSParameters_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABQoSParameters_ExtIEs__extensionValue {
+		E_RABQoSParameters_ExtIEs__extensionValue_PR present;
+		union E_RABQoSParameters_ExtIEs__extensionValue_u {
+			Packet_LossRate_t	 Packet_LossRate;
+			Packet_LossRate_t	 Packet_LossRate_1;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABQoSParameters_ExtIEs_t;
+typedef struct E_RABUsageReportItem_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABUsageReportItem_ExtIEs__extensionValue {
+		E_RABUsageReportItem_ExtIEs__extensionValue_PR present;
+		union E_RABUsageReportItem_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABUsageReportItem_ExtIEs_t;
+typedef struct EUTRAN_CGI_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct EUTRAN_CGI_ExtIEs__extensionValue {
+		EUTRAN_CGI_ExtIEs__extensionValue_PR present;
+		union EUTRAN_CGI_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} EUTRAN_CGI_ExtIEs_t;
+typedef struct ExpectedUEBehaviour_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct ExpectedUEBehaviour_ExtIEs__extensionValue {
+		ExpectedUEBehaviour_ExtIEs__extensionValue_PR present;
+		union ExpectedUEBehaviour_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ExpectedUEBehaviour_ExtIEs_t;
+typedef struct ExpectedUEActivityBehaviour_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct ExpectedUEActivityBehaviour_ExtIEs__extensionValue {
+		ExpectedUEActivityBehaviour_ExtIEs__extensionValue_PR present;
+		union ExpectedUEActivityBehaviour_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ExpectedUEActivityBehaviour_ExtIEs_t;
+typedef struct FiveGSTAI_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct FiveGSTAI_ExtIEs__extensionValue {
+		FiveGSTAI_ExtIEs__extensionValue_PR present;
+		union FiveGSTAI_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} FiveGSTAI_ExtIEs_t;
+typedef struct ForbiddenTAs_Item_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct ForbiddenTAs_Item_ExtIEs__extensionValue {
+		ForbiddenTAs_Item_ExtIEs__extensionValue_PR present;
+		union ForbiddenTAs_Item_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ForbiddenTAs_Item_ExtIEs_t;
+typedef struct ForbiddenLAs_Item_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct ForbiddenLAs_Item_ExtIEs__extensionValue {
+		ForbiddenLAs_Item_ExtIEs__extensionValue_PR present;
+		union ForbiddenLAs_Item_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ForbiddenLAs_Item_ExtIEs_t;
+typedef struct GBR_QosInformation_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct GBR_QosInformation_ExtIEs__extensionValue {
+		GBR_QosInformation_ExtIEs__extensionValue_PR present;
+		union GBR_QosInformation_ExtIEs__extensionValue_u {
+			ExtendedBitRate_t	 ExtendedBitRate;
+			ExtendedBitRate_t	 ExtendedBitRate_1;
+			ExtendedBitRate_t	 ExtendedBitRate_2;
+			ExtendedBitRate_t	 ExtendedBitRate_3;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} GBR_QosInformation_ExtIEs_t;
+typedef struct GUMMEI_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct GUMMEI_ExtIEs__extensionValue {
+		GUMMEI_ExtIEs__extensionValue_PR present;
+		union GUMMEI_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} GUMMEI_ExtIEs_t;
+typedef struct HandoverRestrictionList_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct HandoverRestrictionList_ExtIEs__extensionValue {
+		HandoverRestrictionList_ExtIEs__extensionValue_PR present;
+		union HandoverRestrictionList_ExtIEs__extensionValue_u {
+			NRrestrictioninEPSasSecondaryRAT_t	 NRrestrictioninEPSasSecondaryRAT;
+			UnlicensedSpectrumRestriction_t	 UnlicensedSpectrumRestriction;
+			CNTypeRestrictions_t	 CNTypeRestrictions;
+			NRrestrictionin5GS_t	 NRrestrictionin5GS;
+			PLMNidentity_t	 PLMNidentity;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} HandoverRestrictionList_ExtIEs_t;
+typedef struct ImmediateMDT_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct ImmediateMDT_ExtIEs__extensionValue {
+		ImmediateMDT_ExtIEs__extensionValue_PR present;
+		union ImmediateMDT_ExtIEs__extensionValue_u {
+			M3Configuration_t	 M3Configuration;
+			M4Configuration_t	 M4Configuration;
+			M5Configuration_t	 M5Configuration;
+			MDT_Location_Info_t	 MDT_Location_Info;
+			M6Configuration_t	 M6Configuration;
+			M7Configuration_t	 M7Configuration;
+			BluetoothMeasurementConfiguration_t	 BluetoothMeasurementConfiguration;
+			WLANMeasurementConfiguration_t	 WLANMeasurementConfiguration;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ImmediateMDT_ExtIEs_t;
+typedef struct InformationOnRecommendedCellsAndENBsForPaging_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct InformationOnRecommendedCellsAndENBsForPaging_ExtIEs__extensionValue {
+		InformationOnRecommendedCellsAndENBsForPaging_ExtIEs__extensionValue_PR present;
+		union InformationOnRecommendedCellsAndENBsForPaging_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} InformationOnRecommendedCellsAndENBsForPaging_ExtIEs_t;
+typedef struct LAI_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct LAI_ExtIEs__extensionValue {
+		LAI_ExtIEs__extensionValue_PR present;
+		union LAI_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} LAI_ExtIEs_t;
+typedef struct LastVisitedEUTRANCellInformation_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct LastVisitedEUTRANCellInformation_ExtIEs__extensionValue {
+		LastVisitedEUTRANCellInformation_ExtIEs__extensionValue_PR present;
+		union LastVisitedEUTRANCellInformation_ExtIEs__extensionValue_u {
+			Time_UE_StayedInCell_EnhancedGranularity_t	 Time_UE_StayedInCell_EnhancedGranularity;
+			Cause_t	 Cause;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} LastVisitedEUTRANCellInformation_ExtIEs_t;
+typedef struct ListeningSubframePattern_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct ListeningSubframePattern_ExtIEs__extensionValue {
+		ListeningSubframePattern_ExtIEs__extensionValue_PR present;
+		union ListeningSubframePattern_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ListeningSubframePattern_ExtIEs_t;
+typedef struct LoggedMDT_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct LoggedMDT_ExtIEs__extensionValue {
+		LoggedMDT_ExtIEs__extensionValue_PR present;
+		union LoggedMDT_ExtIEs__extensionValue_u {
+			BluetoothMeasurementConfiguration_t	 BluetoothMeasurementConfiguration;
+			WLANMeasurementConfiguration_t	 WLANMeasurementConfiguration;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} LoggedMDT_ExtIEs_t;
+typedef struct LoggedMBSFNMDT_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct LoggedMBSFNMDT_ExtIEs__extensionValue {
+		LoggedMBSFNMDT_ExtIEs__extensionValue_PR present;
+		union LoggedMBSFNMDT_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} LoggedMBSFNMDT_ExtIEs_t;
+typedef struct M3Configuration_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct M3Configuration_ExtIEs__extensionValue {
+		M3Configuration_ExtIEs__extensionValue_PR present;
+		union M3Configuration_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} M3Configuration_ExtIEs_t;
+typedef struct M4Configuration_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct M4Configuration_ExtIEs__extensionValue {
+		M4Configuration_ExtIEs__extensionValue_PR present;
+		union M4Configuration_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} M4Configuration_ExtIEs_t;
+typedef struct M5Configuration_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct M5Configuration_ExtIEs__extensionValue {
+		M5Configuration_ExtIEs__extensionValue_PR present;
+		union M5Configuration_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} M5Configuration_ExtIEs_t;
+typedef struct M6Configuration_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct M6Configuration_ExtIEs__extensionValue {
+		M6Configuration_ExtIEs__extensionValue_PR present;
+		union M6Configuration_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} M6Configuration_ExtIEs_t;
+typedef struct M7Configuration_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct M7Configuration_ExtIEs__extensionValue {
+		M7Configuration_ExtIEs__extensionValue_PR present;
+		union M7Configuration_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} M7Configuration_ExtIEs_t;
+typedef struct MDT_Configuration_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct MDT_Configuration_ExtIEs__extensionValue {
+		MDT_Configuration_ExtIEs__extensionValue_PR present;
+		union MDT_Configuration_ExtIEs__extensionValue_u {
+			MDTPLMNList_t	 MDTPLMNList;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} MDT_Configuration_ExtIEs_t;
+typedef struct MBSFN_ResultToLogInfo_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct MBSFN_ResultToLogInfo_ExtIEs__extensionValue {
+		MBSFN_ResultToLogInfo_ExtIEs__extensionValue_PR present;
+		union MBSFN_ResultToLogInfo_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} MBSFN_ResultToLogInfo_ExtIEs_t;
+typedef struct MutingPatternInformation_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct MutingPatternInformation_ExtIEs__extensionValue {
+		MutingPatternInformation_ExtIEs__extensionValue_PR present;
+		union MutingPatternInformation_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} MutingPatternInformation_ExtIEs_t;
+typedef struct NB_IoT_Paging_eDRXInformation_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct NB_IoT_Paging_eDRXInformation_ExtIEs__extensionValue {
+		NB_IoT_Paging_eDRXInformation_ExtIEs__extensionValue_PR present;
+		union NB_IoT_Paging_eDRXInformation_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} NB_IoT_Paging_eDRXInformation_ExtIEs_t;
+typedef struct NR_CGI_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct NR_CGI_ExtIEs__extensionValue {
+		NR_CGI_ExtIEs__extensionValue_PR present;
+		union NR_CGI_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} NR_CGI_ExtIEs_t;
+typedef struct NRUESecurityCapabilities_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct NRUESecurityCapabilities_ExtIEs__extensionValue {
+		NRUESecurityCapabilities_ExtIEs__extensionValue_PR present;
+		union NRUESecurityCapabilities_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} NRUESecurityCapabilities_ExtIEs_t;
+typedef struct PagingAttemptInformation_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct PagingAttemptInformation_ExtIEs__extensionValue {
+		PagingAttemptInformation_ExtIEs__extensionValue_PR present;
+		union PagingAttemptInformation_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} PagingAttemptInformation_ExtIEs_t;
+typedef struct Paging_eDRXInformation_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct Paging_eDRXInformation_ExtIEs__extensionValue {
+		Paging_eDRXInformation_ExtIEs__extensionValue_PR present;
+		union Paging_eDRXInformation_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} Paging_eDRXInformation_ExtIEs_t;
+typedef struct M1PeriodicReporting_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct M1PeriodicReporting_ExtIEs__extensionValue {
+		M1PeriodicReporting_ExtIEs__extensionValue_PR present;
+		union M1PeriodicReporting_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} M1PeriodicReporting_ExtIEs_t;
+typedef struct PLMNAreaBasedQMC_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct PLMNAreaBasedQMC_ExtIEs__extensionValue {
+		PLMNAreaBasedQMC_ExtIEs__extensionValue_PR present;
+		union PLMNAreaBasedQMC_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} PLMNAreaBasedQMC_ExtIEs_t;
+typedef struct ProSeAuthorized_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct ProSeAuthorized_ExtIEs__extensionValue {
+		ProSeAuthorized_ExtIEs__extensionValue_PR present;
+		union ProSeAuthorized_ExtIEs__extensionValue_u {
+			ProSeUEtoNetworkRelaying_t	 ProSeUEtoNetworkRelaying;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProSeAuthorized_ExtIEs_t;
+typedef struct PSCellInformation_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct PSCellInformation_ExtIEs__extensionValue {
+		PSCellInformation_ExtIEs__extensionValue_PR present;
+		union PSCellInformation_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} PSCellInformation_ExtIEs_t;
+typedef struct RecommendedCellsForPaging_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct RecommendedCellsForPaging_ExtIEs__extensionValue {
+		RecommendedCellsForPaging_ExtIEs__extensionValue_PR present;
+		union RecommendedCellsForPaging_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RecommendedCellsForPaging_ExtIEs_t;
+typedef struct RecommendedCellsForPagingItem_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct RecommendedCellsForPagingItem_ExtIEs__extensionValue {
+		RecommendedCellsForPagingItem_ExtIEs__extensionValue_PR present;
+		union RecommendedCellsForPagingItem_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RecommendedCellsForPagingItem_ExtIEs_t;
+typedef struct RecommendedENBsForPaging_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct RecommendedENBsForPaging_ExtIEs__extensionValue {
+		RecommendedENBsForPaging_ExtIEs__extensionValue_PR present;
+		union RecommendedENBsForPaging_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RecommendedENBsForPaging_ExtIEs_t;
+typedef struct RecommendedENBItem_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct RecommendedENBItem_ExtIEs__extensionValue {
+		RecommendedENBItem_ExtIEs__extensionValue_PR present;
+		union RecommendedENBItem_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RecommendedENBItem_ExtIEs_t;
+typedef struct RequestType_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct RequestType_ExtIEs__extensionValue {
+		RequestType_ExtIEs__extensionValue_PR present;
+		union RequestType_ExtIEs__extensionValue_u {
+			RequestTypeAdditionalInfo_t	 RequestTypeAdditionalInfo;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RequestType_ExtIEs_t;
+typedef struct RIMTransfer_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct RIMTransfer_ExtIEs__extensionValue {
+		RIMTransfer_ExtIEs__extensionValue_PR present;
+		union RIMTransfer_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RIMTransfer_ExtIEs_t;
+typedef struct RLFReportInformation_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct RLFReportInformation_ExtIEs__extensionValue {
+		RLFReportInformation_ExtIEs__extensionValue_PR present;
+		union RLFReportInformation_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RLFReportInformation_ExtIEs_t;
+typedef struct SecurityContext_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct SecurityContext_ExtIEs__extensionValue {
+		SecurityContext_ExtIEs__extensionValue_PR present;
+		union SecurityContext_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} SecurityContext_ExtIEs_t;
+typedef struct SecondaryRATDataUsageReportItem_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct SecondaryRATDataUsageReportItem_ExtIEs__extensionValue {
+		SecondaryRATDataUsageReportItem_ExtIEs__extensionValue_PR present;
+		union SecondaryRATDataUsageReportItem_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} SecondaryRATDataUsageReportItem_ExtIEs_t;
+typedef struct SONInformationReply_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct SONInformationReply_ExtIEs__extensionValue {
+		SONInformationReply_ExtIEs__extensionValue_PR present;
+		union SONInformationReply_ExtIEs__extensionValue_u {
+			TimeSynchronisationInfo_t	 TimeSynchronisationInfo;
+			MutingPatternInformation_t	 MutingPatternInformation;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} SONInformationReply_ExtIEs_t;
+typedef struct SONConfigurationTransfer_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct SONConfigurationTransfer_ExtIEs__extensionValue {
+		SONConfigurationTransfer_ExtIEs__extensionValue_PR present;
+		union SONConfigurationTransfer_ExtIEs__extensionValue_u {
+			X2TNLConfigurationInfo_t	 X2TNLConfigurationInfo;
+			SynchronisationInformation_t	 SynchronisationInformation;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} SONConfigurationTransfer_ExtIEs_t;
+typedef struct SynchronisationInformation_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct SynchronisationInformation_ExtIEs__extensionValue {
+		SynchronisationInformation_ExtIEs__extensionValue_PR present;
+		union SynchronisationInformation_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} SynchronisationInformation_ExtIEs_t;
+typedef struct SourceeNB_ID_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct SourceeNB_ID_ExtIEs__extensionValue {
+		SourceeNB_ID_ExtIEs__extensionValue_PR present;
+		union SourceeNB_ID_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} SourceeNB_ID_ExtIEs_t;
+typedef struct SourceeNB_ToTargeteNB_TransparentContainer_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct SourceeNB_ToTargeteNB_TransparentContainer_ExtIEs__extensionValue {
+		SourceeNB_ToTargeteNB_TransparentContainer_ExtIEs__extensionValue_PR present;
+		union SourceeNB_ToTargeteNB_TransparentContainer_ExtIEs__extensionValue_u {
+			MobilityInformation_t	 MobilityInformation;
+			UE_HistoryInformationFromTheUE_t	 UE_HistoryInformationFromTheUE;
+			IMSvoiceEPSfallbackfrom5G_t	 IMSvoiceEPSfallbackfrom5G;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} SourceeNB_ToTargeteNB_TransparentContainer_ExtIEs_t;
+typedef struct ServedGUMMEIsItem_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct ServedGUMMEIsItem_ExtIEs__extensionValue {
+		ServedGUMMEIsItem_ExtIEs__extensionValue_PR present;
+		union ServedGUMMEIsItem_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ServedGUMMEIsItem_ExtIEs_t;
+typedef struct Subscription_Based_UE_DifferentiationInfo_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct Subscription_Based_UE_DifferentiationInfo_ExtIEs__extensionValue {
+		Subscription_Based_UE_DifferentiationInfo_ExtIEs__extensionValue_PR present;
+		union Subscription_Based_UE_DifferentiationInfo_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} Subscription_Based_UE_DifferentiationInfo_ExtIEs_t;
+typedef struct ScheduledCommunicationTime_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct ScheduledCommunicationTime_ExtIEs__extensionValue {
+		ScheduledCommunicationTime_ExtIEs__extensionValue_PR present;
+		union ScheduledCommunicationTime_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ScheduledCommunicationTime_ExtIEs_t;
+typedef struct SupportedTAs_Item_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct SupportedTAs_Item_ExtIEs__extensionValue {
+		SupportedTAs_Item_ExtIEs__extensionValue_PR present;
+		union SupportedTAs_Item_ExtIEs__extensionValue_u {
+			RAT_Type_t	 RAT_Type;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} SupportedTAs_Item_ExtIEs_t;
+typedef struct TimeSynchronisationInfo_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct TimeSynchronisationInfo_ExtIEs__extensionValue {
+		TimeSynchronisationInfo_ExtIEs__extensionValue_PR present;
+		union TimeSynchronisationInfo_ExtIEs__extensionValue_u {
+			MutingAvailabilityIndication_t	 MutingAvailabilityIndication;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TimeSynchronisationInfo_ExtIEs_t;
+typedef struct S_TMSI_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct S_TMSI_ExtIEs__extensionValue {
+		S_TMSI_ExtIEs__extensionValue_PR present;
+		union S_TMSI_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} S_TMSI_ExtIEs_t;
+typedef struct TAIBasedMDT_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct TAIBasedMDT_ExtIEs__extensionValue {
+		TAIBasedMDT_ExtIEs__extensionValue_PR present;
+		union TAIBasedMDT_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TAIBasedMDT_ExtIEs_t;
+typedef struct TAI_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct TAI_ExtIEs__extensionValue {
+		TAI_ExtIEs__extensionValue_PR present;
+		union TAI_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TAI_ExtIEs_t;
+typedef struct TAI_Broadcast_Item_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct TAI_Broadcast_Item_ExtIEs__extensionValue {
+		TAI_Broadcast_Item_ExtIEs__extensionValue_PR present;
+		union TAI_Broadcast_Item_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TAI_Broadcast_Item_ExtIEs_t;
+typedef struct TAI_Cancelled_Item_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct TAI_Cancelled_Item_ExtIEs__extensionValue {
+		TAI_Cancelled_Item_ExtIEs__extensionValue_PR present;
+		union TAI_Cancelled_Item_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TAI_Cancelled_Item_ExtIEs_t;
+typedef struct TABasedMDT_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct TABasedMDT_ExtIEs__extensionValue {
+		TABasedMDT_ExtIEs__extensionValue_PR present;
+		union TABasedMDT_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TABasedMDT_ExtIEs_t;
+typedef struct TABasedQMC_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct TABasedQMC_ExtIEs__extensionValue {
+		TABasedQMC_ExtIEs__extensionValue_PR present;
+		union TABasedQMC_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TABasedQMC_ExtIEs_t;
+typedef struct TAIBasedQMC_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct TAIBasedQMC_ExtIEs__extensionValue {
+		TAIBasedQMC_ExtIEs__extensionValue_PR present;
+		union TAIBasedQMC_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TAIBasedQMC_ExtIEs_t;
+typedef struct CompletedCellinTAI_Item_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct CompletedCellinTAI_Item_ExtIEs__extensionValue {
+		CompletedCellinTAI_Item_ExtIEs__extensionValue_PR present;
+		union CompletedCellinTAI_Item_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CompletedCellinTAI_Item_ExtIEs_t;
+typedef struct TargeteNB_ID_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct TargeteNB_ID_ExtIEs__extensionValue {
+		TargeteNB_ID_ExtIEs__extensionValue_PR present;
+		union TargeteNB_ID_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TargeteNB_ID_ExtIEs_t;
+typedef struct TargetRNC_ID_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct TargetRNC_ID_ExtIEs__extensionValue {
+		TargetRNC_ID_ExtIEs__extensionValue_PR present;
+		union TargetRNC_ID_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TargetRNC_ID_ExtIEs_t;
+typedef struct TargetNgRanNode_ID_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct TargetNgRanNode_ID_ExtIEs__extensionValue {
+		TargetNgRanNode_ID_ExtIEs__extensionValue_PR present;
+		union TargetNgRanNode_ID_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TargetNgRanNode_ID_ExtIEs_t;
+typedef struct GNB_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct GNB_ExtIEs__extensionValue {
+		GNB_ExtIEs__extensionValue_PR present;
+		union GNB_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} GNB_ExtIEs_t;
+typedef struct Global_GNB_ID_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct Global_GNB_ID_ExtIEs__extensionValue {
+		Global_GNB_ID_ExtIEs__extensionValue_PR present;
+		union Global_GNB_ID_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} Global_GNB_ID_ExtIEs_t;
+typedef struct NG_eNB_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct NG_eNB_ExtIEs__extensionValue {
+		NG_eNB_ExtIEs__extensionValue_PR present;
+		union NG_eNB_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} NG_eNB_ExtIEs_t;
+typedef struct TargeteNB_ToSourceeNB_TransparentContainer_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct TargeteNB_ToSourceeNB_TransparentContainer_ExtIEs__extensionValue {
+		TargeteNB_ToSourceeNB_TransparentContainer_ExtIEs__extensionValue_PR present;
+		union TargeteNB_ToSourceeNB_TransparentContainer_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TargeteNB_ToSourceeNB_TransparentContainer_ExtIEs_t;
+typedef struct M1ThresholdEventA2_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct M1ThresholdEventA2_ExtIEs__extensionValue {
+		M1ThresholdEventA2_ExtIEs__extensionValue_PR present;
+		union M1ThresholdEventA2_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} M1ThresholdEventA2_ExtIEs_t;
+typedef struct TraceActivation_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct TraceActivation_ExtIEs__extensionValue {
+		TraceActivation_ExtIEs__extensionValue_PR present;
+		union TraceActivation_ExtIEs__extensionValue_u {
+			MDT_Configuration_t	 MDT_Configuration;
+			UEAppLayerMeasConfig_t	 UEAppLayerMeasConfig;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TraceActivation_ExtIEs_t;
+typedef struct Tunnel_Information_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct Tunnel_Information_ExtIEs__extensionValue {
+		Tunnel_Information_ExtIEs__extensionValue_PR present;
+		union Tunnel_Information_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} Tunnel_Information_ExtIEs_t;
+typedef struct UEAggregate_MaximumBitrates_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct UEAggregate_MaximumBitrates_ExtIEs__extensionValue {
+		UEAggregate_MaximumBitrates_ExtIEs__extensionValue_PR present;
+		union UEAggregate_MaximumBitrates_ExtIEs__extensionValue_u {
+			ExtendedBitRate_t	 ExtendedBitRate;
+			ExtendedBitRate_t	 ExtendedBitRate_1;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UEAggregate_MaximumBitrates_ExtIEs_t;
+typedef struct UEAppLayerMeasConfig_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct UEAppLayerMeasConfig_ExtIEs__extensionValue {
+		UEAppLayerMeasConfig_ExtIEs__extensionValue_PR present;
+		union UEAppLayerMeasConfig_ExtIEs__extensionValue_u {
+			ServiceType_t	 ServiceType;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UEAppLayerMeasConfig_ExtIEs_t;
+typedef struct UE_S1AP_ID_pair_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct UE_S1AP_ID_pair_ExtIEs__extensionValue {
+		UE_S1AP_ID_pair_ExtIEs__extensionValue_PR present;
+		union UE_S1AP_ID_pair_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UE_S1AP_ID_pair_ExtIEs_t;
+typedef struct UE_associatedLogicalS1_ConnectionItemExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct UE_associatedLogicalS1_ConnectionItemExtIEs__extensionValue {
+		UE_associatedLogicalS1_ConnectionItemExtIEs__extensionValue_PR present;
+		union UE_associatedLogicalS1_ConnectionItemExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UE_associatedLogicalS1_ConnectionItemExtIEs_t;
+typedef struct UESecurityCapabilities_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct UESecurityCapabilities_ExtIEs__extensionValue {
+		UESecurityCapabilities_ExtIEs__extensionValue_PR present;
+		union UESecurityCapabilities_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UESecurityCapabilities_ExtIEs_t;
+typedef struct UE_Sidelink_Aggregate_MaximumBitrates_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct UE_Sidelink_Aggregate_MaximumBitrates_ExtIEs__extensionValue {
+		UE_Sidelink_Aggregate_MaximumBitrates_ExtIEs__extensionValue_PR present;
+		union UE_Sidelink_Aggregate_MaximumBitrates_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UE_Sidelink_Aggregate_MaximumBitrates_ExtIEs_t;
+typedef struct UL_CP_SecurityInformation_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct UL_CP_SecurityInformation_ExtIEs__extensionValue {
+		UL_CP_SecurityInformation_ExtIEs__extensionValue_PR present;
+		union UL_CP_SecurityInformation_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UL_CP_SecurityInformation_ExtIEs_t;
+typedef struct UserLocationInformation_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct UserLocationInformation_ExtIEs__extensionValue {
+		UserLocationInformation_ExtIEs__extensionValue_PR present;
+		union UserLocationInformation_ExtIEs__extensionValue_u {
+			PSCellInformation_t	 PSCellInformation;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UserLocationInformation_ExtIEs_t;
+typedef struct V2XServicesAuthorized_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct V2XServicesAuthorized_ExtIEs__extensionValue {
+		V2XServicesAuthorized_ExtIEs__extensionValue_PR present;
+		union V2XServicesAuthorized_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} V2XServicesAuthorized_ExtIEs_t;
+typedef struct WLANMeasurementConfiguration_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct WLANMeasurementConfiguration_ExtIEs__extensionValue {
+		WLANMeasurementConfiguration_ExtIEs__extensionValue_PR present;
+		union WLANMeasurementConfiguration_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} WLANMeasurementConfiguration_ExtIEs_t;
+typedef struct X2TNLConfigurationInfo_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct X2TNLConfigurationInfo_ExtIEs__extensionValue {
+		X2TNLConfigurationInfo_ExtIEs__extensionValue_PR present;
+		union X2TNLConfigurationInfo_ExtIEs__extensionValue_u {
+			ENBX2ExtTLAs_t	 ENBX2ExtTLAs;
+			ENBIndirectX2TransportLayerAddresses_t	 ENBIndirectX2TransportLayerAddresses;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} X2TNLConfigurationInfo_ExtIEs_t;
+typedef struct ENBX2ExtTLA_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct ENBX2ExtTLA_ExtIEs__extensionValue {
+		ENBX2ExtTLA_ExtIEs__extensionValue_PR present;
+		union ENBX2ExtTLA_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ENBX2ExtTLA_ExtIEs_t;
+typedef struct E_RABDataForwardingItem_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABDataForwardingItem_ExtIEs__extensionValue {
+		E_RABDataForwardingItem_ExtIEs__extensionValue_PR present;
+		union E_RABDataForwardingItem_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABDataForwardingItem_ExtIEs_t;
+typedef struct E_RABToBeSetupItemHOReq_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABToBeSetupItemHOReq_ExtIEs__extensionValue {
+		E_RABToBeSetupItemHOReq_ExtIEs__extensionValue_PR present;
+		union E_RABToBeSetupItemHOReq_ExtIEs__extensionValue_u {
+			Data_Forwarding_Not_Possible_t	 Data_Forwarding_Not_Possible;
+			BearerType_t	 BearerType;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABToBeSetupItemHOReq_ExtIEs_t;
+typedef struct E_RABAdmittedItem_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABAdmittedItem_ExtIEs__extensionValue {
+		E_RABAdmittedItem_ExtIEs__extensionValue_PR present;
+		union E_RABAdmittedItem_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABAdmittedItem_ExtIEs_t;
+typedef struct E_RABFailedToSetupItemHOReqAckExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABFailedToSetupItemHOReqAckExtIEs__extensionValue {
+		E_RABFailedToSetupItemHOReqAckExtIEs__extensionValue_PR present;
+		union E_RABFailedToSetupItemHOReqAckExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABFailedToSetupItemHOReqAckExtIEs_t;
+typedef struct E_RABToBeSwitchedDLItem_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABToBeSwitchedDLItem_ExtIEs__extensionValue {
+		E_RABToBeSwitchedDLItem_ExtIEs__extensionValue_PR present;
+		union E_RABToBeSwitchedDLItem_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABToBeSwitchedDLItem_ExtIEs_t;
+typedef struct E_RABToBeSwitchedULItem_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABToBeSwitchedULItem_ExtIEs__extensionValue {
+		E_RABToBeSwitchedULItem_ExtIEs__extensionValue_PR present;
+		union E_RABToBeSwitchedULItem_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABToBeSwitchedULItem_ExtIEs_t;
+typedef struct E_RABToBeSetupItemBearerSUReqExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABToBeSetupItemBearerSUReqExtIEs__extensionValue {
+		E_RABToBeSetupItemBearerSUReqExtIEs__extensionValue_PR present;
+		union E_RABToBeSetupItemBearerSUReqExtIEs__extensionValue_u {
+			Correlation_ID_t	 Correlation_ID;
+			Correlation_ID_t	 Correlation_ID_1;
+			BearerType_t	 BearerType;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABToBeSetupItemBearerSUReqExtIEs_t;
+typedef struct E_RABSetupItemBearerSUResExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABSetupItemBearerSUResExtIEs__extensionValue {
+		E_RABSetupItemBearerSUResExtIEs__extensionValue_PR present;
+		union E_RABSetupItemBearerSUResExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABSetupItemBearerSUResExtIEs_t;
+typedef struct E_RABToBeModifyItemBearerModReqExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABToBeModifyItemBearerModReqExtIEs__extensionValue {
+		E_RABToBeModifyItemBearerModReqExtIEs__extensionValue_PR present;
+		union E_RABToBeModifyItemBearerModReqExtIEs__extensionValue_u {
+			TransportInformation_t	 TransportInformation;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABToBeModifyItemBearerModReqExtIEs_t;
+typedef struct E_RABModifyItemBearerModResExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABModifyItemBearerModResExtIEs__extensionValue {
+		E_RABModifyItemBearerModResExtIEs__extensionValue_PR present;
+		union E_RABModifyItemBearerModResExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABModifyItemBearerModResExtIEs_t;
+typedef struct E_RABReleaseItemBearerRelCompExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABReleaseItemBearerRelCompExtIEs__extensionValue {
+		E_RABReleaseItemBearerRelCompExtIEs__extensionValue_PR present;
+		union E_RABReleaseItemBearerRelCompExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABReleaseItemBearerRelCompExtIEs_t;
+typedef struct E_RABToBeSetupItemCtxtSUReqExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABToBeSetupItemCtxtSUReqExtIEs__extensionValue {
+		E_RABToBeSetupItemCtxtSUReqExtIEs__extensionValue_PR present;
+		union E_RABToBeSetupItemCtxtSUReqExtIEs__extensionValue_u {
+			Correlation_ID_t	 Correlation_ID;
+			Correlation_ID_t	 Correlation_ID_1;
+			BearerType_t	 BearerType;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABToBeSetupItemCtxtSUReqExtIEs_t;
+typedef struct E_RABSetupItemCtxtSUResExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABSetupItemCtxtSUResExtIEs__extensionValue {
+		E_RABSetupItemCtxtSUResExtIEs__extensionValue_PR present;
+		union E_RABSetupItemCtxtSUResExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABSetupItemCtxtSUResExtIEs_t;
+typedef struct TAIItemExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct TAIItemExtIEs__extensionValue {
+		TAIItemExtIEs__extensionValue_PR present;
+		union TAIItemExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TAIItemExtIEs_t;
+typedef struct E_RABToBeModifiedItemBearerModInd_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABToBeModifiedItemBearerModInd_ExtIEs__extensionValue {
+		E_RABToBeModifiedItemBearerModInd_ExtIEs__extensionValue_PR present;
+		union E_RABToBeModifiedItemBearerModInd_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABToBeModifiedItemBearerModInd_ExtIEs_t;
+typedef struct E_RABNotToBeModifiedItemBearerModInd_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABNotToBeModifiedItemBearerModInd_ExtIEs__extensionValue {
+		E_RABNotToBeModifiedItemBearerModInd_ExtIEs__extensionValue_PR present;
+		union E_RABNotToBeModifiedItemBearerModInd_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABNotToBeModifiedItemBearerModInd_ExtIEs_t;
+typedef struct CSGMembershipInfo_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct CSGMembershipInfo_ExtIEs__extensionValue {
+		CSGMembershipInfo_ExtIEs__extensionValue_PR present;
+		union CSGMembershipInfo_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CSGMembershipInfo_ExtIEs_t;
+typedef struct E_RABModifyItemBearerModConfExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABModifyItemBearerModConfExtIEs__extensionValue {
+		E_RABModifyItemBearerModConfExtIEs__extensionValue_PR present;
+		union E_RABModifyItemBearerModConfExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABModifyItemBearerModConfExtIEs_t;
+typedef struct E_RABFailedToResumeItemResumeReq_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABFailedToResumeItemResumeReq_ExtIEs__extensionValue {
+		E_RABFailedToResumeItemResumeReq_ExtIEs__extensionValue_PR present;
+		union E_RABFailedToResumeItemResumeReq_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABFailedToResumeItemResumeReq_ExtIEs_t;
+typedef struct E_RABFailedToResumeItemResumeRes_ExtIEs {
+	ProtocolExtensionID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABFailedToResumeItemResumeRes_ExtIEs__extensionValue {
+		E_RABFailedToResumeItemResumeRes_ExtIEs__extensionValue_PR present;
+		union E_RABFailedToResumeItemResumeRes_ExtIEs__extensionValue_u {
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} extensionValue;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABFailedToResumeItemResumeRes_ExtIEs_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_Additional_GUTI_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_Additional_GUTI_ExtIEs_specs_1;
+extern asn_TYPE_member_t asn_MBR_Additional_GUTI_ExtIEs_1[3];
+extern asn_TYPE_descriptor_t asn_DEF_AllocationAndRetentionPriority_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_AllocationAndRetentionPriority_ExtIEs_specs_5;
+extern asn_TYPE_member_t asn_MBR_AllocationAndRetentionPriority_ExtIEs_5[3];
+extern asn_TYPE_descriptor_t asn_DEF_InformationForCECapableUEs_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_InformationForCECapableUEs_ExtIEs_specs_9;
+extern asn_TYPE_member_t asn_MBR_InformationForCECapableUEs_ExtIEs_9[3];
+extern asn_TYPE_descriptor_t asn_DEF_AssistanceDataForPaging_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_AssistanceDataForPaging_ExtIEs_specs_13;
+extern asn_TYPE_member_t asn_MBR_AssistanceDataForPaging_ExtIEs_13[3];
+extern asn_TYPE_descriptor_t asn_DEF_AssistanceDataForRecommendedCells_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_AssistanceDataForRecommendedCells_ExtIEs_specs_17;
+extern asn_TYPE_member_t asn_MBR_AssistanceDataForRecommendedCells_ExtIEs_17[3];
+extern asn_TYPE_descriptor_t asn_DEF_Bearers_SubjectToStatusTransfer_ItemExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_Bearers_SubjectToStatusTransfer_ItemExtIEs_specs_21;
+extern asn_TYPE_member_t asn_MBR_Bearers_SubjectToStatusTransfer_ItemExtIEs_21[3];
+extern asn_TYPE_descriptor_t asn_DEF_BluetoothMeasurementConfiguration_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_BluetoothMeasurementConfiguration_ExtIEs_specs_25;
+extern asn_TYPE_member_t asn_MBR_BluetoothMeasurementConfiguration_ExtIEs_25[3];
+extern asn_TYPE_descriptor_t asn_DEF_CancelledCellinEAI_Item_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_CancelledCellinEAI_Item_ExtIEs_specs_29;
+extern asn_TYPE_member_t asn_MBR_CancelledCellinEAI_Item_ExtIEs_29[3];
+extern asn_TYPE_descriptor_t asn_DEF_CancelledCellinTAI_Item_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_CancelledCellinTAI_Item_ExtIEs_specs_33;
+extern asn_TYPE_member_t asn_MBR_CancelledCellinTAI_Item_ExtIEs_33[3];
+extern asn_TYPE_descriptor_t asn_DEF_CellIdentifierAndCELevelForCECapableUEs_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_CellIdentifierAndCELevelForCECapableUEs_ExtIEs_specs_37;
+extern asn_TYPE_member_t asn_MBR_CellIdentifierAndCELevelForCECapableUEs_ExtIEs_37[3];
+extern asn_TYPE_descriptor_t asn_DEF_CellID_Broadcast_Item_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_CellID_Broadcast_Item_ExtIEs_specs_41;
+extern asn_TYPE_member_t asn_MBR_CellID_Broadcast_Item_ExtIEs_41[3];
+extern asn_TYPE_descriptor_t asn_DEF_CellID_Cancelled_Item_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_CellID_Cancelled_Item_ExtIEs_specs_45;
+extern asn_TYPE_member_t asn_MBR_CellID_Cancelled_Item_ExtIEs_45[3];
+extern asn_TYPE_descriptor_t asn_DEF_CellBasedMDT_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_CellBasedMDT_ExtIEs_specs_49;
+extern asn_TYPE_member_t asn_MBR_CellBasedMDT_ExtIEs_49[3];
+extern asn_TYPE_descriptor_t asn_DEF_CellBasedQMC_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_CellBasedQMC_ExtIEs_specs_53;
+extern asn_TYPE_member_t asn_MBR_CellBasedQMC_ExtIEs_53[3];
+extern asn_TYPE_descriptor_t asn_DEF_Cdma2000OneXSRVCCInfo_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_Cdma2000OneXSRVCCInfo_ExtIEs_specs_57;
+extern asn_TYPE_member_t asn_MBR_Cdma2000OneXSRVCCInfo_ExtIEs_57[3];
+extern asn_TYPE_descriptor_t asn_DEF_CellType_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_CellType_ExtIEs_specs_61;
+extern asn_TYPE_member_t asn_MBR_CellType_ExtIEs_61[3];
+extern asn_TYPE_descriptor_t asn_DEF_CGI_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_CGI_ExtIEs_specs_65;
+extern asn_TYPE_member_t asn_MBR_CGI_ExtIEs_65[3];
+extern asn_TYPE_descriptor_t asn_DEF_CNTypeRestrictions_Item_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_CNTypeRestrictions_Item_ExtIEs_specs_69;
+extern asn_TYPE_member_t asn_MBR_CNTypeRestrictions_Item_ExtIEs_69[3];
+extern asn_TYPE_descriptor_t asn_DEF_ConnectedengNBItem_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_ConnectedengNBItem_ExtIEs_specs_73;
+extern asn_TYPE_member_t asn_MBR_ConnectedengNBItem_ExtIEs_73[3];
+extern asn_TYPE_descriptor_t asn_DEF_CSG_IdList_Item_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_CSG_IdList_Item_ExtIEs_specs_77;
+extern asn_TYPE_member_t asn_MBR_CSG_IdList_Item_ExtIEs_77[3];
+extern asn_TYPE_descriptor_t asn_DEF_COUNTvalue_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_COUNTvalue_ExtIEs_specs_81;
+extern asn_TYPE_member_t asn_MBR_COUNTvalue_ExtIEs_81[3];
+extern asn_TYPE_descriptor_t asn_DEF_COUNTValueExtended_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_COUNTValueExtended_ExtIEs_specs_85;
+extern asn_TYPE_member_t asn_MBR_COUNTValueExtended_ExtIEs_85[3];
+extern asn_TYPE_descriptor_t asn_DEF_COUNTvaluePDCP_SNlength18_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_COUNTvaluePDCP_SNlength18_ExtIEs_specs_89;
+extern asn_TYPE_member_t asn_MBR_COUNTvaluePDCP_SNlength18_ExtIEs_89[3];
+extern asn_TYPE_descriptor_t asn_DEF_CriticalityDiagnostics_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_CriticalityDiagnostics_ExtIEs_specs_93;
+extern asn_TYPE_member_t asn_MBR_CriticalityDiagnostics_ExtIEs_93[3];
+extern asn_TYPE_descriptor_t asn_DEF_CriticalityDiagnostics_IE_Item_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_CriticalityDiagnostics_IE_Item_ExtIEs_specs_97;
+extern asn_TYPE_member_t asn_MBR_CriticalityDiagnostics_IE_Item_ExtIEs_97[3];
+extern asn_TYPE_descriptor_t asn_DEF_ServedDCNsItem_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_ServedDCNsItem_ExtIEs_specs_101;
+extern asn_TYPE_member_t asn_MBR_ServedDCNsItem_ExtIEs_101[3];
+extern asn_TYPE_descriptor_t asn_DEF_DL_CP_SecurityInformation_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_DL_CP_SecurityInformation_ExtIEs_specs_105;
+extern asn_TYPE_member_t asn_MBR_DL_CP_SecurityInformation_ExtIEs_105[3];
+extern asn_TYPE_descriptor_t asn_DEF_EmergencyAreaID_Broadcast_Item_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_EmergencyAreaID_Broadcast_Item_ExtIEs_specs_109;
+extern asn_TYPE_member_t asn_MBR_EmergencyAreaID_Broadcast_Item_ExtIEs_109[3];
+extern asn_TYPE_descriptor_t asn_DEF_EmergencyAreaID_Cancelled_Item_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_EmergencyAreaID_Cancelled_Item_ExtIEs_specs_113;
+extern asn_TYPE_member_t asn_MBR_EmergencyAreaID_Cancelled_Item_ExtIEs_113[3];
+extern asn_TYPE_descriptor_t asn_DEF_CompletedCellinEAI_Item_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_CompletedCellinEAI_Item_ExtIEs_specs_117;
+extern asn_TYPE_member_t asn_MBR_CompletedCellinEAI_Item_ExtIEs_117[3];
+extern asn_TYPE_descriptor_t asn_DEF_GERAN_Cell_ID_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_GERAN_Cell_ID_ExtIEs_specs_121;
+extern asn_TYPE_member_t asn_MBR_GERAN_Cell_ID_ExtIEs_121[3];
+extern asn_TYPE_descriptor_t asn_DEF_GlobalENB_ID_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_GlobalENB_ID_ExtIEs_specs_125;
+extern asn_TYPE_member_t asn_MBR_GlobalENB_ID_ExtIEs_125[3];
+extern asn_TYPE_descriptor_t asn_DEF_Global_en_gNB_ID_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_Global_en_gNB_ID_ExtIEs_specs_129;
+extern asn_TYPE_member_t asn_MBR_Global_en_gNB_ID_ExtIEs_129[3];
+extern asn_TYPE_descriptor_t asn_DEF_ENB_StatusTransfer_TransparentContainer_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_ENB_StatusTransfer_TransparentContainer_ExtIEs_specs_133;
+extern asn_TYPE_member_t asn_MBR_ENB_StatusTransfer_TransparentContainer_ExtIEs_133[3];
+extern asn_TYPE_descriptor_t asn_DEF_EN_DCSONConfigurationTransfer_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_EN_DCSONConfigurationTransfer_ExtIEs_specs_137;
+extern asn_TYPE_member_t asn_MBR_EN_DCSONConfigurationTransfer_ExtIEs_137[3];
+extern asn_TYPE_descriptor_t asn_DEF_EN_DCTransferTypeRequest_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_EN_DCTransferTypeRequest_ExtIEs_specs_141;
+extern asn_TYPE_member_t asn_MBR_EN_DCTransferTypeRequest_ExtIEs_141[3];
+extern asn_TYPE_descriptor_t asn_DEF_EN_DCTransferTypeReply_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_EN_DCTransferTypeReply_ExtIEs_specs_145;
+extern asn_TYPE_member_t asn_MBR_EN_DCTransferTypeReply_ExtIEs_145[3];
+extern asn_TYPE_descriptor_t asn_DEF_EN_DCSONeNBIdentification_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_EN_DCSONeNBIdentification_ExtIEs_specs_149;
+extern asn_TYPE_member_t asn_MBR_EN_DCSONeNBIdentification_ExtIEs_149[3];
+extern asn_TYPE_descriptor_t asn_DEF_EN_DCSONengNBIdentification_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_EN_DCSONengNBIdentification_ExtIEs_specs_153;
+extern asn_TYPE_member_t asn_MBR_EN_DCSONengNBIdentification_ExtIEs_153[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABInformationListItem_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABInformationListItem_ExtIEs_specs_157;
+extern asn_TYPE_member_t asn_MBR_E_RABInformationListItem_ExtIEs_157[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABItem_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABItem_ExtIEs_specs_161;
+extern asn_TYPE_member_t asn_MBR_E_RABItem_ExtIEs_161[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABQoSParameters_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABQoSParameters_ExtIEs_specs_165;
+extern asn_TYPE_member_t asn_MBR_E_RABQoSParameters_ExtIEs_165[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABUsageReportItem_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABUsageReportItem_ExtIEs_specs_169;
+extern asn_TYPE_member_t asn_MBR_E_RABUsageReportItem_ExtIEs_169[3];
+extern asn_TYPE_descriptor_t asn_DEF_EUTRAN_CGI_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_EUTRAN_CGI_ExtIEs_specs_173;
+extern asn_TYPE_member_t asn_MBR_EUTRAN_CGI_ExtIEs_173[3];
+extern asn_TYPE_descriptor_t asn_DEF_ExpectedUEBehaviour_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_ExpectedUEBehaviour_ExtIEs_specs_177;
+extern asn_TYPE_member_t asn_MBR_ExpectedUEBehaviour_ExtIEs_177[3];
+extern asn_TYPE_descriptor_t asn_DEF_ExpectedUEActivityBehaviour_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_ExpectedUEActivityBehaviour_ExtIEs_specs_181;
+extern asn_TYPE_member_t asn_MBR_ExpectedUEActivityBehaviour_ExtIEs_181[3];
+extern asn_TYPE_descriptor_t asn_DEF_FiveGSTAI_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_FiveGSTAI_ExtIEs_specs_185;
+extern asn_TYPE_member_t asn_MBR_FiveGSTAI_ExtIEs_185[3];
+extern asn_TYPE_descriptor_t asn_DEF_ForbiddenTAs_Item_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_ForbiddenTAs_Item_ExtIEs_specs_189;
+extern asn_TYPE_member_t asn_MBR_ForbiddenTAs_Item_ExtIEs_189[3];
+extern asn_TYPE_descriptor_t asn_DEF_ForbiddenLAs_Item_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_ForbiddenLAs_Item_ExtIEs_specs_193;
+extern asn_TYPE_member_t asn_MBR_ForbiddenLAs_Item_ExtIEs_193[3];
+extern asn_TYPE_descriptor_t asn_DEF_GBR_QosInformation_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_GBR_QosInformation_ExtIEs_specs_197;
+extern asn_TYPE_member_t asn_MBR_GBR_QosInformation_ExtIEs_197[3];
+extern asn_TYPE_descriptor_t asn_DEF_GUMMEI_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_GUMMEI_ExtIEs_specs_201;
+extern asn_TYPE_member_t asn_MBR_GUMMEI_ExtIEs_201[3];
+extern asn_TYPE_descriptor_t asn_DEF_HandoverRestrictionList_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_HandoverRestrictionList_ExtIEs_specs_205;
+extern asn_TYPE_member_t asn_MBR_HandoverRestrictionList_ExtIEs_205[3];
+extern asn_TYPE_descriptor_t asn_DEF_ImmediateMDT_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_ImmediateMDT_ExtIEs_specs_209;
+extern asn_TYPE_member_t asn_MBR_ImmediateMDT_ExtIEs_209[3];
+extern asn_TYPE_descriptor_t asn_DEF_InformationOnRecommendedCellsAndENBsForPaging_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_InformationOnRecommendedCellsAndENBsForPaging_ExtIEs_specs_213;
+extern asn_TYPE_member_t asn_MBR_InformationOnRecommendedCellsAndENBsForPaging_ExtIEs_213[3];
+extern asn_TYPE_descriptor_t asn_DEF_LAI_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_LAI_ExtIEs_specs_217;
+extern asn_TYPE_member_t asn_MBR_LAI_ExtIEs_217[3];
+extern asn_TYPE_descriptor_t asn_DEF_LastVisitedEUTRANCellInformation_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_LastVisitedEUTRANCellInformation_ExtIEs_specs_221;
+extern asn_TYPE_member_t asn_MBR_LastVisitedEUTRANCellInformation_ExtIEs_221[3];
+extern asn_TYPE_descriptor_t asn_DEF_ListeningSubframePattern_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_ListeningSubframePattern_ExtIEs_specs_225;
+extern asn_TYPE_member_t asn_MBR_ListeningSubframePattern_ExtIEs_225[3];
+extern asn_TYPE_descriptor_t asn_DEF_LoggedMDT_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_LoggedMDT_ExtIEs_specs_229;
+extern asn_TYPE_member_t asn_MBR_LoggedMDT_ExtIEs_229[3];
+extern asn_TYPE_descriptor_t asn_DEF_LoggedMBSFNMDT_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_LoggedMBSFNMDT_ExtIEs_specs_233;
+extern asn_TYPE_member_t asn_MBR_LoggedMBSFNMDT_ExtIEs_233[3];
+extern asn_TYPE_descriptor_t asn_DEF_M3Configuration_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_M3Configuration_ExtIEs_specs_237;
+extern asn_TYPE_member_t asn_MBR_M3Configuration_ExtIEs_237[3];
+extern asn_TYPE_descriptor_t asn_DEF_M4Configuration_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_M4Configuration_ExtIEs_specs_241;
+extern asn_TYPE_member_t asn_MBR_M4Configuration_ExtIEs_241[3];
+extern asn_TYPE_descriptor_t asn_DEF_M5Configuration_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_M5Configuration_ExtIEs_specs_245;
+extern asn_TYPE_member_t asn_MBR_M5Configuration_ExtIEs_245[3];
+extern asn_TYPE_descriptor_t asn_DEF_M6Configuration_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_M6Configuration_ExtIEs_specs_249;
+extern asn_TYPE_member_t asn_MBR_M6Configuration_ExtIEs_249[3];
+extern asn_TYPE_descriptor_t asn_DEF_M7Configuration_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_M7Configuration_ExtIEs_specs_253;
+extern asn_TYPE_member_t asn_MBR_M7Configuration_ExtIEs_253[3];
+extern asn_TYPE_descriptor_t asn_DEF_MDT_Configuration_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_MDT_Configuration_ExtIEs_specs_257;
+extern asn_TYPE_member_t asn_MBR_MDT_Configuration_ExtIEs_257[3];
+extern asn_TYPE_descriptor_t asn_DEF_MBSFN_ResultToLogInfo_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_MBSFN_ResultToLogInfo_ExtIEs_specs_261;
+extern asn_TYPE_member_t asn_MBR_MBSFN_ResultToLogInfo_ExtIEs_261[3];
+extern asn_TYPE_descriptor_t asn_DEF_MutingPatternInformation_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_MutingPatternInformation_ExtIEs_specs_265;
+extern asn_TYPE_member_t asn_MBR_MutingPatternInformation_ExtIEs_265[3];
+extern asn_TYPE_descriptor_t asn_DEF_NB_IoT_Paging_eDRXInformation_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_NB_IoT_Paging_eDRXInformation_ExtIEs_specs_269;
+extern asn_TYPE_member_t asn_MBR_NB_IoT_Paging_eDRXInformation_ExtIEs_269[3];
+extern asn_TYPE_descriptor_t asn_DEF_NR_CGI_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_NR_CGI_ExtIEs_specs_273;
+extern asn_TYPE_member_t asn_MBR_NR_CGI_ExtIEs_273[3];
+extern asn_TYPE_descriptor_t asn_DEF_NRUESecurityCapabilities_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_NRUESecurityCapabilities_ExtIEs_specs_277;
+extern asn_TYPE_member_t asn_MBR_NRUESecurityCapabilities_ExtIEs_277[3];
+extern asn_TYPE_descriptor_t asn_DEF_PagingAttemptInformation_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_PagingAttemptInformation_ExtIEs_specs_281;
+extern asn_TYPE_member_t asn_MBR_PagingAttemptInformation_ExtIEs_281[3];
+extern asn_TYPE_descriptor_t asn_DEF_Paging_eDRXInformation_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_Paging_eDRXInformation_ExtIEs_specs_285;
+extern asn_TYPE_member_t asn_MBR_Paging_eDRXInformation_ExtIEs_285[3];
+extern asn_TYPE_descriptor_t asn_DEF_M1PeriodicReporting_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_M1PeriodicReporting_ExtIEs_specs_289;
+extern asn_TYPE_member_t asn_MBR_M1PeriodicReporting_ExtIEs_289[3];
+extern asn_TYPE_descriptor_t asn_DEF_PLMNAreaBasedQMC_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_PLMNAreaBasedQMC_ExtIEs_specs_293;
+extern asn_TYPE_member_t asn_MBR_PLMNAreaBasedQMC_ExtIEs_293[3];
+extern asn_TYPE_descriptor_t asn_DEF_ProSeAuthorized_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_ProSeAuthorized_ExtIEs_specs_297;
+extern asn_TYPE_member_t asn_MBR_ProSeAuthorized_ExtIEs_297[3];
+extern asn_TYPE_descriptor_t asn_DEF_PSCellInformation_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_PSCellInformation_ExtIEs_specs_301;
+extern asn_TYPE_member_t asn_MBR_PSCellInformation_ExtIEs_301[3];
+extern asn_TYPE_descriptor_t asn_DEF_RecommendedCellsForPaging_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_RecommendedCellsForPaging_ExtIEs_specs_305;
+extern asn_TYPE_member_t asn_MBR_RecommendedCellsForPaging_ExtIEs_305[3];
+extern asn_TYPE_descriptor_t asn_DEF_RecommendedCellsForPagingItem_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_RecommendedCellsForPagingItem_ExtIEs_specs_309;
+extern asn_TYPE_member_t asn_MBR_RecommendedCellsForPagingItem_ExtIEs_309[3];
+extern asn_TYPE_descriptor_t asn_DEF_RecommendedENBsForPaging_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_RecommendedENBsForPaging_ExtIEs_specs_313;
+extern asn_TYPE_member_t asn_MBR_RecommendedENBsForPaging_ExtIEs_313[3];
+extern asn_TYPE_descriptor_t asn_DEF_RecommendedENBItem_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_RecommendedENBItem_ExtIEs_specs_317;
+extern asn_TYPE_member_t asn_MBR_RecommendedENBItem_ExtIEs_317[3];
+extern asn_TYPE_descriptor_t asn_DEF_RequestType_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_RequestType_ExtIEs_specs_321;
+extern asn_TYPE_member_t asn_MBR_RequestType_ExtIEs_321[3];
+extern asn_TYPE_descriptor_t asn_DEF_RIMTransfer_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_RIMTransfer_ExtIEs_specs_325;
+extern asn_TYPE_member_t asn_MBR_RIMTransfer_ExtIEs_325[3];
+extern asn_TYPE_descriptor_t asn_DEF_RLFReportInformation_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_RLFReportInformation_ExtIEs_specs_329;
+extern asn_TYPE_member_t asn_MBR_RLFReportInformation_ExtIEs_329[3];
+extern asn_TYPE_descriptor_t asn_DEF_SecurityContext_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_SecurityContext_ExtIEs_specs_333;
+extern asn_TYPE_member_t asn_MBR_SecurityContext_ExtIEs_333[3];
+extern asn_TYPE_descriptor_t asn_DEF_SecondaryRATDataUsageReportItem_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_SecondaryRATDataUsageReportItem_ExtIEs_specs_337;
+extern asn_TYPE_member_t asn_MBR_SecondaryRATDataUsageReportItem_ExtIEs_337[3];
+extern asn_TYPE_descriptor_t asn_DEF_SONInformationReply_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_SONInformationReply_ExtIEs_specs_341;
+extern asn_TYPE_member_t asn_MBR_SONInformationReply_ExtIEs_341[3];
+extern asn_TYPE_descriptor_t asn_DEF_SONConfigurationTransfer_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_SONConfigurationTransfer_ExtIEs_specs_345;
+extern asn_TYPE_member_t asn_MBR_SONConfigurationTransfer_ExtIEs_345[3];
+extern asn_TYPE_descriptor_t asn_DEF_SynchronisationInformation_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_SynchronisationInformation_ExtIEs_specs_349;
+extern asn_TYPE_member_t asn_MBR_SynchronisationInformation_ExtIEs_349[3];
+extern asn_TYPE_descriptor_t asn_DEF_SourceeNB_ID_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_SourceeNB_ID_ExtIEs_specs_353;
+extern asn_TYPE_member_t asn_MBR_SourceeNB_ID_ExtIEs_353[3];
+extern asn_TYPE_descriptor_t asn_DEF_SourceeNB_ToTargeteNB_TransparentContainer_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_SourceeNB_ToTargeteNB_TransparentContainer_ExtIEs_specs_357;
+extern asn_TYPE_member_t asn_MBR_SourceeNB_ToTargeteNB_TransparentContainer_ExtIEs_357[3];
+extern asn_TYPE_descriptor_t asn_DEF_ServedGUMMEIsItem_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_ServedGUMMEIsItem_ExtIEs_specs_361;
+extern asn_TYPE_member_t asn_MBR_ServedGUMMEIsItem_ExtIEs_361[3];
+extern asn_TYPE_descriptor_t asn_DEF_Subscription_Based_UE_DifferentiationInfo_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_Subscription_Based_UE_DifferentiationInfo_ExtIEs_specs_365;
+extern asn_TYPE_member_t asn_MBR_Subscription_Based_UE_DifferentiationInfo_ExtIEs_365[3];
+extern asn_TYPE_descriptor_t asn_DEF_ScheduledCommunicationTime_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_ScheduledCommunicationTime_ExtIEs_specs_369;
+extern asn_TYPE_member_t asn_MBR_ScheduledCommunicationTime_ExtIEs_369[3];
+extern asn_TYPE_descriptor_t asn_DEF_SupportedTAs_Item_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_SupportedTAs_Item_ExtIEs_specs_373;
+extern asn_TYPE_member_t asn_MBR_SupportedTAs_Item_ExtIEs_373[3];
+extern asn_TYPE_descriptor_t asn_DEF_TimeSynchronisationInfo_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_TimeSynchronisationInfo_ExtIEs_specs_377;
+extern asn_TYPE_member_t asn_MBR_TimeSynchronisationInfo_ExtIEs_377[3];
+extern asn_TYPE_descriptor_t asn_DEF_S_TMSI_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_S_TMSI_ExtIEs_specs_381;
+extern asn_TYPE_member_t asn_MBR_S_TMSI_ExtIEs_381[3];
+extern asn_TYPE_descriptor_t asn_DEF_TAIBasedMDT_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_TAIBasedMDT_ExtIEs_specs_385;
+extern asn_TYPE_member_t asn_MBR_TAIBasedMDT_ExtIEs_385[3];
+extern asn_TYPE_descriptor_t asn_DEF_TAI_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_TAI_ExtIEs_specs_389;
+extern asn_TYPE_member_t asn_MBR_TAI_ExtIEs_389[3];
+extern asn_TYPE_descriptor_t asn_DEF_TAI_Broadcast_Item_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_TAI_Broadcast_Item_ExtIEs_specs_393;
+extern asn_TYPE_member_t asn_MBR_TAI_Broadcast_Item_ExtIEs_393[3];
+extern asn_TYPE_descriptor_t asn_DEF_TAI_Cancelled_Item_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_TAI_Cancelled_Item_ExtIEs_specs_397;
+extern asn_TYPE_member_t asn_MBR_TAI_Cancelled_Item_ExtIEs_397[3];
+extern asn_TYPE_descriptor_t asn_DEF_TABasedMDT_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_TABasedMDT_ExtIEs_specs_401;
+extern asn_TYPE_member_t asn_MBR_TABasedMDT_ExtIEs_401[3];
+extern asn_TYPE_descriptor_t asn_DEF_TABasedQMC_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_TABasedQMC_ExtIEs_specs_405;
+extern asn_TYPE_member_t asn_MBR_TABasedQMC_ExtIEs_405[3];
+extern asn_TYPE_descriptor_t asn_DEF_TAIBasedQMC_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_TAIBasedQMC_ExtIEs_specs_409;
+extern asn_TYPE_member_t asn_MBR_TAIBasedQMC_ExtIEs_409[3];
+extern asn_TYPE_descriptor_t asn_DEF_CompletedCellinTAI_Item_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_CompletedCellinTAI_Item_ExtIEs_specs_413;
+extern asn_TYPE_member_t asn_MBR_CompletedCellinTAI_Item_ExtIEs_413[3];
+extern asn_TYPE_descriptor_t asn_DEF_TargeteNB_ID_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_TargeteNB_ID_ExtIEs_specs_417;
+extern asn_TYPE_member_t asn_MBR_TargeteNB_ID_ExtIEs_417[3];
+extern asn_TYPE_descriptor_t asn_DEF_TargetRNC_ID_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_TargetRNC_ID_ExtIEs_specs_421;
+extern asn_TYPE_member_t asn_MBR_TargetRNC_ID_ExtIEs_421[3];
+extern asn_TYPE_descriptor_t asn_DEF_TargetNgRanNode_ID_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_TargetNgRanNode_ID_ExtIEs_specs_425;
+extern asn_TYPE_member_t asn_MBR_TargetNgRanNode_ID_ExtIEs_425[3];
+extern asn_TYPE_descriptor_t asn_DEF_GNB_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_GNB_ExtIEs_specs_429;
+extern asn_TYPE_member_t asn_MBR_GNB_ExtIEs_429[3];
+extern asn_TYPE_descriptor_t asn_DEF_Global_GNB_ID_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_Global_GNB_ID_ExtIEs_specs_433;
+extern asn_TYPE_member_t asn_MBR_Global_GNB_ID_ExtIEs_433[3];
+extern asn_TYPE_descriptor_t asn_DEF_NG_eNB_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_NG_eNB_ExtIEs_specs_437;
+extern asn_TYPE_member_t asn_MBR_NG_eNB_ExtIEs_437[3];
+extern asn_TYPE_descriptor_t asn_DEF_TargeteNB_ToSourceeNB_TransparentContainer_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_TargeteNB_ToSourceeNB_TransparentContainer_ExtIEs_specs_441;
+extern asn_TYPE_member_t asn_MBR_TargeteNB_ToSourceeNB_TransparentContainer_ExtIEs_441[3];
+extern asn_TYPE_descriptor_t asn_DEF_M1ThresholdEventA2_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_M1ThresholdEventA2_ExtIEs_specs_445;
+extern asn_TYPE_member_t asn_MBR_M1ThresholdEventA2_ExtIEs_445[3];
+extern asn_TYPE_descriptor_t asn_DEF_TraceActivation_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_TraceActivation_ExtIEs_specs_449;
+extern asn_TYPE_member_t asn_MBR_TraceActivation_ExtIEs_449[3];
+extern asn_TYPE_descriptor_t asn_DEF_Tunnel_Information_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_Tunnel_Information_ExtIEs_specs_453;
+extern asn_TYPE_member_t asn_MBR_Tunnel_Information_ExtIEs_453[3];
+extern asn_TYPE_descriptor_t asn_DEF_UEAggregate_MaximumBitrates_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_UEAggregate_MaximumBitrates_ExtIEs_specs_457;
+extern asn_TYPE_member_t asn_MBR_UEAggregate_MaximumBitrates_ExtIEs_457[3];
+extern asn_TYPE_descriptor_t asn_DEF_UEAppLayerMeasConfig_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_UEAppLayerMeasConfig_ExtIEs_specs_461;
+extern asn_TYPE_member_t asn_MBR_UEAppLayerMeasConfig_ExtIEs_461[3];
+extern asn_TYPE_descriptor_t asn_DEF_UE_S1AP_ID_pair_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_UE_S1AP_ID_pair_ExtIEs_specs_465;
+extern asn_TYPE_member_t asn_MBR_UE_S1AP_ID_pair_ExtIEs_465[3];
+extern asn_TYPE_descriptor_t asn_DEF_UE_associatedLogicalS1_ConnectionItemExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_UE_associatedLogicalS1_ConnectionItemExtIEs_specs_469;
+extern asn_TYPE_member_t asn_MBR_UE_associatedLogicalS1_ConnectionItemExtIEs_469[3];
+extern asn_TYPE_descriptor_t asn_DEF_UESecurityCapabilities_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_UESecurityCapabilities_ExtIEs_specs_473;
+extern asn_TYPE_member_t asn_MBR_UESecurityCapabilities_ExtIEs_473[3];
+extern asn_TYPE_descriptor_t asn_DEF_UE_Sidelink_Aggregate_MaximumBitrates_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_UE_Sidelink_Aggregate_MaximumBitrates_ExtIEs_specs_477;
+extern asn_TYPE_member_t asn_MBR_UE_Sidelink_Aggregate_MaximumBitrates_ExtIEs_477[3];
+extern asn_TYPE_descriptor_t asn_DEF_UL_CP_SecurityInformation_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_UL_CP_SecurityInformation_ExtIEs_specs_481;
+extern asn_TYPE_member_t asn_MBR_UL_CP_SecurityInformation_ExtIEs_481[3];
+extern asn_TYPE_descriptor_t asn_DEF_UserLocationInformation_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_UserLocationInformation_ExtIEs_specs_485;
+extern asn_TYPE_member_t asn_MBR_UserLocationInformation_ExtIEs_485[3];
+extern asn_TYPE_descriptor_t asn_DEF_V2XServicesAuthorized_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_V2XServicesAuthorized_ExtIEs_specs_489;
+extern asn_TYPE_member_t asn_MBR_V2XServicesAuthorized_ExtIEs_489[3];
+extern asn_TYPE_descriptor_t asn_DEF_WLANMeasurementConfiguration_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_WLANMeasurementConfiguration_ExtIEs_specs_493;
+extern asn_TYPE_member_t asn_MBR_WLANMeasurementConfiguration_ExtIEs_493[3];
+extern asn_TYPE_descriptor_t asn_DEF_X2TNLConfigurationInfo_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_X2TNLConfigurationInfo_ExtIEs_specs_497;
+extern asn_TYPE_member_t asn_MBR_X2TNLConfigurationInfo_ExtIEs_497[3];
+extern asn_TYPE_descriptor_t asn_DEF_ENBX2ExtTLA_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_ENBX2ExtTLA_ExtIEs_specs_501;
+extern asn_TYPE_member_t asn_MBR_ENBX2ExtTLA_ExtIEs_501[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABDataForwardingItem_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABDataForwardingItem_ExtIEs_specs_505;
+extern asn_TYPE_member_t asn_MBR_E_RABDataForwardingItem_ExtIEs_505[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABToBeSetupItemHOReq_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABToBeSetupItemHOReq_ExtIEs_specs_509;
+extern asn_TYPE_member_t asn_MBR_E_RABToBeSetupItemHOReq_ExtIEs_509[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABAdmittedItem_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABAdmittedItem_ExtIEs_specs_513;
+extern asn_TYPE_member_t asn_MBR_E_RABAdmittedItem_ExtIEs_513[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABFailedToSetupItemHOReqAckExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABFailedToSetupItemHOReqAckExtIEs_specs_517;
+extern asn_TYPE_member_t asn_MBR_E_RABFailedToSetupItemHOReqAckExtIEs_517[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABToBeSwitchedDLItem_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABToBeSwitchedDLItem_ExtIEs_specs_521;
+extern asn_TYPE_member_t asn_MBR_E_RABToBeSwitchedDLItem_ExtIEs_521[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABToBeSwitchedULItem_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABToBeSwitchedULItem_ExtIEs_specs_525;
+extern asn_TYPE_member_t asn_MBR_E_RABToBeSwitchedULItem_ExtIEs_525[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABToBeSetupItemBearerSUReqExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABToBeSetupItemBearerSUReqExtIEs_specs_529;
+extern asn_TYPE_member_t asn_MBR_E_RABToBeSetupItemBearerSUReqExtIEs_529[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABSetupItemBearerSUResExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABSetupItemBearerSUResExtIEs_specs_533;
+extern asn_TYPE_member_t asn_MBR_E_RABSetupItemBearerSUResExtIEs_533[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABToBeModifyItemBearerModReqExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABToBeModifyItemBearerModReqExtIEs_specs_537;
+extern asn_TYPE_member_t asn_MBR_E_RABToBeModifyItemBearerModReqExtIEs_537[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABModifyItemBearerModResExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABModifyItemBearerModResExtIEs_specs_541;
+extern asn_TYPE_member_t asn_MBR_E_RABModifyItemBearerModResExtIEs_541[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABReleaseItemBearerRelCompExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABReleaseItemBearerRelCompExtIEs_specs_545;
+extern asn_TYPE_member_t asn_MBR_E_RABReleaseItemBearerRelCompExtIEs_545[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABToBeSetupItemCtxtSUReqExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABToBeSetupItemCtxtSUReqExtIEs_specs_549;
+extern asn_TYPE_member_t asn_MBR_E_RABToBeSetupItemCtxtSUReqExtIEs_549[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABSetupItemCtxtSUResExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABSetupItemCtxtSUResExtIEs_specs_553;
+extern asn_TYPE_member_t asn_MBR_E_RABSetupItemCtxtSUResExtIEs_553[3];
+extern asn_TYPE_descriptor_t asn_DEF_TAIItemExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_TAIItemExtIEs_specs_557;
+extern asn_TYPE_member_t asn_MBR_TAIItemExtIEs_557[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABToBeModifiedItemBearerModInd_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABToBeModifiedItemBearerModInd_ExtIEs_specs_561;
+extern asn_TYPE_member_t asn_MBR_E_RABToBeModifiedItemBearerModInd_ExtIEs_561[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABNotToBeModifiedItemBearerModInd_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABNotToBeModifiedItemBearerModInd_ExtIEs_specs_565;
+extern asn_TYPE_member_t asn_MBR_E_RABNotToBeModifiedItemBearerModInd_ExtIEs_565[3];
+extern asn_TYPE_descriptor_t asn_DEF_CSGMembershipInfo_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_CSGMembershipInfo_ExtIEs_specs_569;
+extern asn_TYPE_member_t asn_MBR_CSGMembershipInfo_ExtIEs_569[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABModifyItemBearerModConfExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABModifyItemBearerModConfExtIEs_specs_573;
+extern asn_TYPE_member_t asn_MBR_E_RABModifyItemBearerModConfExtIEs_573[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABFailedToResumeItemResumeReq_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABFailedToResumeItemResumeReq_ExtIEs_specs_577;
+extern asn_TYPE_member_t asn_MBR_E_RABFailedToResumeItemResumeReq_ExtIEs_577[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABFailedToResumeItemResumeRes_ExtIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABFailedToResumeItemResumeRes_ExtIEs_specs_581;
+extern asn_TYPE_member_t asn_MBR_E_RABFailedToResumeItemResumeRes_ExtIEs_581[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ProtocolExtensionField_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ProtocolExtensionID.h b/src/s1ap/asn1c/asnGenFiles/ProtocolExtensionID.h
new file mode 100644
index 0000000..77833f1
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ProtocolExtensionID.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-CommonDataTypes"
+ * 	found in "./asn1c/S1AP-CommonDataTypes.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ProtocolExtensionID_H_
+#define	_ProtocolExtensionID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ProtocolExtensionID */
+typedef long	 ProtocolExtensionID_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_ProtocolExtensionID_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolExtensionID;
+asn_struct_free_f ProtocolExtensionID_free;
+asn_struct_print_f ProtocolExtensionID_print;
+asn_constr_check_f ProtocolExtensionID_constraint;
+ber_type_decoder_f ProtocolExtensionID_decode_ber;
+der_type_encoder_f ProtocolExtensionID_encode_der;
+xer_type_decoder_f ProtocolExtensionID_decode_xer;
+xer_type_encoder_f ProtocolExtensionID_encode_xer;
+oer_type_decoder_f ProtocolExtensionID_decode_oer;
+oer_type_encoder_f ProtocolExtensionID_encode_oer;
+per_type_decoder_f ProtocolExtensionID_decode_uper;
+per_type_encoder_f ProtocolExtensionID_encode_uper;
+per_type_decoder_f ProtocolExtensionID_decode_aper;
+per_type_encoder_f ProtocolExtensionID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ProtocolExtensionID_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ProtocolIE-Container.h b/src/s1ap/asn1c/asnGenFiles/ProtocolIE-Container.h
new file mode 100644
index 0000000..f5fabbd
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ProtocolIE-Container.h
@@ -0,0 +1,1045 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-Containers"
+ * 	found in "./asn1c/S1AP-Containers.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ProtocolIE_Container_H_
+#define	_ProtocolIE_Container_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct HandoverRequiredIEs;
+struct HandoverCommandIEs;
+struct HandoverPreparationFailureIEs;
+struct HandoverRequestIEs;
+struct HandoverRequestAcknowledgeIEs;
+struct HandoverFailureIEs;
+struct HandoverNotifyIEs;
+struct PathSwitchRequestIEs;
+struct PathSwitchRequestAcknowledgeIEs;
+struct PathSwitchRequestFailureIEs;
+struct HandoverCancelIEs;
+struct HandoverCancelAcknowledgeIEs;
+struct E_RABSetupRequestIEs;
+struct E_RABSetupResponseIEs;
+struct E_RABModifyRequestIEs;
+struct E_RABModifyResponseIEs;
+struct E_RABReleaseCommandIEs;
+struct E_RABReleaseResponseIEs;
+struct E_RABReleaseIndicationIEs;
+struct InitialContextSetupRequestIEs;
+struct InitialContextSetupResponseIEs;
+struct InitialContextSetupFailureIEs;
+struct PagingIEs;
+struct UEContextReleaseRequest_IEs;
+struct UEContextReleaseCommand_IEs;
+struct UEContextReleaseComplete_IEs;
+struct UEContextModificationRequestIEs;
+struct UEContextModificationResponseIEs;
+struct UEContextModificationFailureIEs;
+struct UERadioCapabilityMatchRequestIEs;
+struct UERadioCapabilityMatchResponseIEs;
+struct DownlinkNASTransport_IEs;
+struct InitialUEMessage_IEs;
+struct UplinkNASTransport_IEs;
+struct NASNonDeliveryIndication_IEs;
+struct RerouteNASRequest_IEs;
+struct NASDeliveryIndicationIEs;
+struct ResetIEs;
+struct ResetAcknowledgeIEs;
+struct ErrorIndicationIEs;
+struct S1SetupRequestIEs;
+struct S1SetupResponseIEs;
+struct S1SetupFailureIEs;
+struct ENBConfigurationUpdateIEs;
+struct ENBConfigurationUpdateAcknowledgeIEs;
+struct ENBConfigurationUpdateFailureIEs;
+struct MMEConfigurationUpdateIEs;
+struct MMEConfigurationUpdateAcknowledgeIEs;
+struct MMEConfigurationUpdateFailureIEs;
+struct DownlinkS1cdma2000tunnellingIEs;
+struct UplinkS1cdma2000tunnellingIEs;
+struct UECapabilityInfoIndicationIEs;
+struct ENBStatusTransferIEs;
+struct MMEStatusTransferIEs;
+struct TraceStartIEs;
+struct TraceFailureIndicationIEs;
+struct DeactivateTraceIEs;
+struct CellTrafficTraceIEs;
+struct LocationReportingControlIEs;
+struct LocationReportingFailureIndicationIEs;
+struct LocationReportIEs;
+struct OverloadStartIEs;
+struct OverloadStopIEs;
+struct WriteReplaceWarningRequestIEs;
+struct WriteReplaceWarningResponseIEs;
+struct ENBDirectInformationTransferIEs;
+struct MMEDirectInformationTransferIEs;
+struct ENBConfigurationTransferIEs;
+struct MMEConfigurationTransferIEs;
+struct KillRequestIEs;
+struct KillResponseIEs;
+struct PWSRestartIndicationIEs;
+struct PWSFailureIndicationIEs;
+struct DownlinkUEAssociatedLPPaTransport_IEs;
+struct UplinkUEAssociatedLPPaTransport_IEs;
+struct DownlinkNonUEAssociatedLPPaTransport_IEs;
+struct UplinkNonUEAssociatedLPPaTransport_IEs;
+struct E_RABModificationIndicationIEs;
+struct E_RABModificationConfirmIEs;
+struct UEContextModificationIndicationIEs;
+struct UEContextModificationConfirmIEs;
+struct UEContextSuspendRequestIEs;
+struct UEContextSuspendResponseIEs;
+struct UEContextResumeRequestIEs;
+struct UEContextResumeResponseIEs;
+struct UEContextResumeFailureIEs;
+struct ConnectionEstablishmentIndicationIEs;
+struct RetrieveUEInformationIEs;
+struct UEInformationTransferIEs;
+struct ENBCPRelocationIndicationIEs;
+struct MMECPRelocationIndicationIEs;
+struct SecondaryRATDataUsageReportIEs;
+
+/* ProtocolIE-Container */
+typedef struct ProtocolIE_Container_129P0 {
+	A_SEQUENCE_OF(struct HandoverRequiredIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P0_t;
+typedef struct ProtocolIE_Container_129P1 {
+	A_SEQUENCE_OF(struct HandoverCommandIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P1_t;
+typedef struct ProtocolIE_Container_129P2 {
+	A_SEQUENCE_OF(struct HandoverPreparationFailureIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P2_t;
+typedef struct ProtocolIE_Container_129P3 {
+	A_SEQUENCE_OF(struct HandoverRequestIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P3_t;
+typedef struct ProtocolIE_Container_129P4 {
+	A_SEQUENCE_OF(struct HandoverRequestAcknowledgeIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P4_t;
+typedef struct ProtocolIE_Container_129P5 {
+	A_SEQUENCE_OF(struct HandoverFailureIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P5_t;
+typedef struct ProtocolIE_Container_129P6 {
+	A_SEQUENCE_OF(struct HandoverNotifyIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P6_t;
+typedef struct ProtocolIE_Container_129P7 {
+	A_SEQUENCE_OF(struct PathSwitchRequestIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P7_t;
+typedef struct ProtocolIE_Container_129P8 {
+	A_SEQUENCE_OF(struct PathSwitchRequestAcknowledgeIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P8_t;
+typedef struct ProtocolIE_Container_129P9 {
+	A_SEQUENCE_OF(struct PathSwitchRequestFailureIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P9_t;
+typedef struct ProtocolIE_Container_129P10 {
+	A_SEQUENCE_OF(struct HandoverCancelIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P10_t;
+typedef struct ProtocolIE_Container_129P11 {
+	A_SEQUENCE_OF(struct HandoverCancelAcknowledgeIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P11_t;
+typedef struct ProtocolIE_Container_129P12 {
+	A_SEQUENCE_OF(struct E_RABSetupRequestIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P12_t;
+typedef struct ProtocolIE_Container_129P13 {
+	A_SEQUENCE_OF(struct E_RABSetupResponseIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P13_t;
+typedef struct ProtocolIE_Container_129P14 {
+	A_SEQUENCE_OF(struct E_RABModifyRequestIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P14_t;
+typedef struct ProtocolIE_Container_129P15 {
+	A_SEQUENCE_OF(struct E_RABModifyResponseIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P15_t;
+typedef struct ProtocolIE_Container_129P16 {
+	A_SEQUENCE_OF(struct E_RABReleaseCommandIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P16_t;
+typedef struct ProtocolIE_Container_129P17 {
+	A_SEQUENCE_OF(struct E_RABReleaseResponseIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P17_t;
+typedef struct ProtocolIE_Container_129P18 {
+	A_SEQUENCE_OF(struct E_RABReleaseIndicationIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P18_t;
+typedef struct ProtocolIE_Container_129P19 {
+	A_SEQUENCE_OF(struct InitialContextSetupRequestIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P19_t;
+typedef struct ProtocolIE_Container_129P20 {
+	A_SEQUENCE_OF(struct InitialContextSetupResponseIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P20_t;
+typedef struct ProtocolIE_Container_129P21 {
+	A_SEQUENCE_OF(struct InitialContextSetupFailureIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P21_t;
+typedef struct ProtocolIE_Container_129P22 {
+	A_SEQUENCE_OF(struct PagingIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P22_t;
+typedef struct ProtocolIE_Container_129P23 {
+	A_SEQUENCE_OF(struct UEContextReleaseRequest_IEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P23_t;
+typedef struct ProtocolIE_Container_129P24 {
+	A_SEQUENCE_OF(struct UEContextReleaseCommand_IEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P24_t;
+typedef struct ProtocolIE_Container_129P25 {
+	A_SEQUENCE_OF(struct UEContextReleaseComplete_IEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P25_t;
+typedef struct ProtocolIE_Container_129P26 {
+	A_SEQUENCE_OF(struct UEContextModificationRequestIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P26_t;
+typedef struct ProtocolIE_Container_129P27 {
+	A_SEQUENCE_OF(struct UEContextModificationResponseIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P27_t;
+typedef struct ProtocolIE_Container_129P28 {
+	A_SEQUENCE_OF(struct UEContextModificationFailureIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P28_t;
+typedef struct ProtocolIE_Container_129P29 {
+	A_SEQUENCE_OF(struct UERadioCapabilityMatchRequestIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P29_t;
+typedef struct ProtocolIE_Container_129P30 {
+	A_SEQUENCE_OF(struct UERadioCapabilityMatchResponseIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P30_t;
+typedef struct ProtocolIE_Container_129P31 {
+	A_SEQUENCE_OF(struct DownlinkNASTransport_IEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P31_t;
+typedef struct ProtocolIE_Container_129P32 {
+	A_SEQUENCE_OF(struct InitialUEMessage_IEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P32_t;
+typedef struct ProtocolIE_Container_129P33 {
+	A_SEQUENCE_OF(struct UplinkNASTransport_IEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P33_t;
+typedef struct ProtocolIE_Container_129P34 {
+	A_SEQUENCE_OF(struct NASNonDeliveryIndication_IEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P34_t;
+typedef struct ProtocolIE_Container_129P35 {
+	A_SEQUENCE_OF(struct RerouteNASRequest_IEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P35_t;
+typedef struct ProtocolIE_Container_129P36 {
+	A_SEQUENCE_OF(struct NASDeliveryIndicationIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P36_t;
+typedef struct ProtocolIE_Container_129P37 {
+	A_SEQUENCE_OF(struct ResetIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P37_t;
+typedef struct ProtocolIE_Container_129P38 {
+	A_SEQUENCE_OF(struct ResetAcknowledgeIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P38_t;
+typedef struct ProtocolIE_Container_129P39 {
+	A_SEQUENCE_OF(struct ErrorIndicationIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P39_t;
+typedef struct ProtocolIE_Container_129P40 {
+	A_SEQUENCE_OF(struct S1SetupRequestIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P40_t;
+typedef struct ProtocolIE_Container_129P41 {
+	A_SEQUENCE_OF(struct S1SetupResponseIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P41_t;
+typedef struct ProtocolIE_Container_129P42 {
+	A_SEQUENCE_OF(struct S1SetupFailureIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P42_t;
+typedef struct ProtocolIE_Container_129P43 {
+	A_SEQUENCE_OF(struct ENBConfigurationUpdateIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P43_t;
+typedef struct ProtocolIE_Container_129P44 {
+	A_SEQUENCE_OF(struct ENBConfigurationUpdateAcknowledgeIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P44_t;
+typedef struct ProtocolIE_Container_129P45 {
+	A_SEQUENCE_OF(struct ENBConfigurationUpdateFailureIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P45_t;
+typedef struct ProtocolIE_Container_129P46 {
+	A_SEQUENCE_OF(struct MMEConfigurationUpdateIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P46_t;
+typedef struct ProtocolIE_Container_129P47 {
+	A_SEQUENCE_OF(struct MMEConfigurationUpdateAcknowledgeIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P47_t;
+typedef struct ProtocolIE_Container_129P48 {
+	A_SEQUENCE_OF(struct MMEConfigurationUpdateFailureIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P48_t;
+typedef struct ProtocolIE_Container_129P49 {
+	A_SEQUENCE_OF(struct DownlinkS1cdma2000tunnellingIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P49_t;
+typedef struct ProtocolIE_Container_129P50 {
+	A_SEQUENCE_OF(struct UplinkS1cdma2000tunnellingIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P50_t;
+typedef struct ProtocolIE_Container_129P51 {
+	A_SEQUENCE_OF(struct UECapabilityInfoIndicationIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P51_t;
+typedef struct ProtocolIE_Container_129P52 {
+	A_SEQUENCE_OF(struct ENBStatusTransferIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P52_t;
+typedef struct ProtocolIE_Container_129P53 {
+	A_SEQUENCE_OF(struct MMEStatusTransferIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P53_t;
+typedef struct ProtocolIE_Container_129P54 {
+	A_SEQUENCE_OF(struct TraceStartIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P54_t;
+typedef struct ProtocolIE_Container_129P55 {
+	A_SEQUENCE_OF(struct TraceFailureIndicationIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P55_t;
+typedef struct ProtocolIE_Container_129P56 {
+	A_SEQUENCE_OF(struct DeactivateTraceIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P56_t;
+typedef struct ProtocolIE_Container_129P57 {
+	A_SEQUENCE_OF(struct CellTrafficTraceIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P57_t;
+typedef struct ProtocolIE_Container_129P58 {
+	A_SEQUENCE_OF(struct LocationReportingControlIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P58_t;
+typedef struct ProtocolIE_Container_129P59 {
+	A_SEQUENCE_OF(struct LocationReportingFailureIndicationIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P59_t;
+typedef struct ProtocolIE_Container_129P60 {
+	A_SEQUENCE_OF(struct LocationReportIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P60_t;
+typedef struct ProtocolIE_Container_129P61 {
+	A_SEQUENCE_OF(struct OverloadStartIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P61_t;
+typedef struct ProtocolIE_Container_129P62 {
+	A_SEQUENCE_OF(struct OverloadStopIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P62_t;
+typedef struct ProtocolIE_Container_129P63 {
+	A_SEQUENCE_OF(struct WriteReplaceWarningRequestIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P63_t;
+typedef struct ProtocolIE_Container_129P64 {
+	A_SEQUENCE_OF(struct WriteReplaceWarningResponseIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P64_t;
+typedef struct ProtocolIE_Container_129P65 {
+	A_SEQUENCE_OF(struct ENBDirectInformationTransferIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P65_t;
+typedef struct ProtocolIE_Container_129P66 {
+	A_SEQUENCE_OF(struct MMEDirectInformationTransferIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P66_t;
+typedef struct ProtocolIE_Container_129P67 {
+	A_SEQUENCE_OF(struct ENBConfigurationTransferIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P67_t;
+typedef struct ProtocolIE_Container_129P68 {
+	A_SEQUENCE_OF(struct MMEConfigurationTransferIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P68_t;
+typedef struct ProtocolIE_Container_129P69 {
+	A_SEQUENCE_OF(struct KillRequestIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P69_t;
+typedef struct ProtocolIE_Container_129P70 {
+	A_SEQUENCE_OF(struct KillResponseIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P70_t;
+typedef struct ProtocolIE_Container_129P71 {
+	A_SEQUENCE_OF(struct PWSRestartIndicationIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P71_t;
+typedef struct ProtocolIE_Container_129P72 {
+	A_SEQUENCE_OF(struct PWSFailureIndicationIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P72_t;
+typedef struct ProtocolIE_Container_129P73 {
+	A_SEQUENCE_OF(struct DownlinkUEAssociatedLPPaTransport_IEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P73_t;
+typedef struct ProtocolIE_Container_129P74 {
+	A_SEQUENCE_OF(struct UplinkUEAssociatedLPPaTransport_IEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P74_t;
+typedef struct ProtocolIE_Container_129P75 {
+	A_SEQUENCE_OF(struct DownlinkNonUEAssociatedLPPaTransport_IEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P75_t;
+typedef struct ProtocolIE_Container_129P76 {
+	A_SEQUENCE_OF(struct UplinkNonUEAssociatedLPPaTransport_IEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P76_t;
+typedef struct ProtocolIE_Container_129P77 {
+	A_SEQUENCE_OF(struct E_RABModificationIndicationIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P77_t;
+typedef struct ProtocolIE_Container_129P78 {
+	A_SEQUENCE_OF(struct E_RABModificationConfirmIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P78_t;
+typedef struct ProtocolIE_Container_129P79 {
+	A_SEQUENCE_OF(struct UEContextModificationIndicationIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P79_t;
+typedef struct ProtocolIE_Container_129P80 {
+	A_SEQUENCE_OF(struct UEContextModificationConfirmIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P80_t;
+typedef struct ProtocolIE_Container_129P81 {
+	A_SEQUENCE_OF(struct UEContextSuspendRequestIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P81_t;
+typedef struct ProtocolIE_Container_129P82 {
+	A_SEQUENCE_OF(struct UEContextSuspendResponseIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P82_t;
+typedef struct ProtocolIE_Container_129P83 {
+	A_SEQUENCE_OF(struct UEContextResumeRequestIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P83_t;
+typedef struct ProtocolIE_Container_129P84 {
+	A_SEQUENCE_OF(struct UEContextResumeResponseIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P84_t;
+typedef struct ProtocolIE_Container_129P85 {
+	A_SEQUENCE_OF(struct UEContextResumeFailureIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P85_t;
+typedef struct ProtocolIE_Container_129P86 {
+	A_SEQUENCE_OF(struct ConnectionEstablishmentIndicationIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P86_t;
+typedef struct ProtocolIE_Container_129P87 {
+	A_SEQUENCE_OF(struct RetrieveUEInformationIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P87_t;
+typedef struct ProtocolIE_Container_129P88 {
+	A_SEQUENCE_OF(struct UEInformationTransferIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P88_t;
+typedef struct ProtocolIE_Container_129P89 {
+	A_SEQUENCE_OF(struct ENBCPRelocationIndicationIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P89_t;
+typedef struct ProtocolIE_Container_129P90 {
+	A_SEQUENCE_OF(struct MMECPRelocationIndicationIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P90_t;
+typedef struct ProtocolIE_Container_129P91 {
+	A_SEQUENCE_OF(struct SecondaryRATDataUsageReportIEs) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_Container_129P91_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P0;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P0_specs_1;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P0_1[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P0_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P1;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P1_specs_3;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P1_3[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P1_constr_3;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P2;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P2_specs_5;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P2_5[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P2_constr_5;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P3;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P3_specs_7;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P3_7[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P3_constr_7;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P4;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P4_specs_9;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P4_9[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P4_constr_9;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P5;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P5_specs_11;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P5_11[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P5_constr_11;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P6;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P6_specs_13;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P6_13[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P6_constr_13;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P7;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P7_specs_15;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P7_15[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P7_constr_15;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P8;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P8_specs_17;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P8_17[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P8_constr_17;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P9;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P9_specs_19;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P9_19[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P9_constr_19;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P10;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P10_specs_21;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P10_21[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P10_constr_21;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P11;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P11_specs_23;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P11_23[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P11_constr_23;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P12;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P12_specs_25;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P12_25[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P12_constr_25;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P13;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P13_specs_27;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P13_27[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P13_constr_27;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P14;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P14_specs_29;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P14_29[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P14_constr_29;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P15;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P15_specs_31;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P15_31[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P15_constr_31;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P16;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P16_specs_33;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P16_33[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P16_constr_33;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P17;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P17_specs_35;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P17_35[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P17_constr_35;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P18;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P18_specs_37;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P18_37[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P18_constr_37;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P19;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P19_specs_39;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P19_39[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P19_constr_39;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P20;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P20_specs_41;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P20_41[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P20_constr_41;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P21;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P21_specs_43;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P21_43[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P21_constr_43;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P22;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P22_specs_45;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P22_45[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P22_constr_45;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P23;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P23_specs_47;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P23_47[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P23_constr_47;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P24;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P24_specs_49;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P24_49[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P24_constr_49;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P25;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P25_specs_51;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P25_51[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P25_constr_51;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P26;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P26_specs_53;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P26_53[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P26_constr_53;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P27;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P27_specs_55;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P27_55[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P27_constr_55;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P28;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P28_specs_57;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P28_57[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P28_constr_57;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P29;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P29_specs_59;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P29_59[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P29_constr_59;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P30;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P30_specs_61;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P30_61[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P30_constr_61;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P31;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P31_specs_63;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P31_63[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P31_constr_63;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P32;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P32_specs_65;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P32_65[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P32_constr_65;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P33;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P33_specs_67;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P33_67[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P33_constr_67;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P34;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P34_specs_69;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P34_69[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P34_constr_69;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P35;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P35_specs_71;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P35_71[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P35_constr_71;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P36;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P36_specs_73;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P36_73[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P36_constr_73;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P37;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P37_specs_75;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P37_75[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P37_constr_75;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P38;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P38_specs_77;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P38_77[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P38_constr_77;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P39;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P39_specs_79;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P39_79[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P39_constr_79;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P40;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P40_specs_81;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P40_81[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P40_constr_81;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P41;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P41_specs_83;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P41_83[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P41_constr_83;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P42;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P42_specs_85;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P42_85[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P42_constr_85;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P43;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P43_specs_87;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P43_87[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P43_constr_87;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P44;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P44_specs_89;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P44_89[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P44_constr_89;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P45;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P45_specs_91;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P45_91[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P45_constr_91;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P46;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P46_specs_93;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P46_93[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P46_constr_93;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P47;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P47_specs_95;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P47_95[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P47_constr_95;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P48;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P48_specs_97;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P48_97[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P48_constr_97;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P49;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P49_specs_99;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P49_99[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P49_constr_99;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P50;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P50_specs_101;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P50_101[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P50_constr_101;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P51;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P51_specs_103;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P51_103[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P51_constr_103;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P52;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P52_specs_105;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P52_105[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P52_constr_105;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P53;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P53_specs_107;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P53_107[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P53_constr_107;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P54;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P54_specs_109;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P54_109[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P54_constr_109;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P55;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P55_specs_111;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P55_111[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P55_constr_111;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P56;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P56_specs_113;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P56_113[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P56_constr_113;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P57;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P57_specs_115;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P57_115[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P57_constr_115;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P58;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P58_specs_117;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P58_117[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P58_constr_117;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P59;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P59_specs_119;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P59_119[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P59_constr_119;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P60;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P60_specs_121;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P60_121[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P60_constr_121;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P61;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P61_specs_123;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P61_123[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P61_constr_123;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P62;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P62_specs_125;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P62_125[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P62_constr_125;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P63;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P63_specs_127;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P63_127[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P63_constr_127;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P64;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P64_specs_129;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P64_129[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P64_constr_129;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P65;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P65_specs_131;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P65_131[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P65_constr_131;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P66;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P66_specs_133;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P66_133[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P66_constr_133;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P67;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P67_specs_135;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P67_135[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P67_constr_135;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P68;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P68_specs_137;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P68_137[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P68_constr_137;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P69;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P69_specs_139;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P69_139[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P69_constr_139;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P70;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P70_specs_141;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P70_141[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P70_constr_141;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P71;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P71_specs_143;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P71_143[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P71_constr_143;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P72;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P72_specs_145;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P72_145[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P72_constr_145;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P73;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P73_specs_147;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P73_147[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P73_constr_147;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P74;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P74_specs_149;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P74_149[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P74_constr_149;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P75;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P75_specs_151;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P75_151[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P75_constr_151;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P76;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P76_specs_153;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P76_153[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P76_constr_153;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P77;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P77_specs_155;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P77_155[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P77_constr_155;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P78;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P78_specs_157;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P78_157[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P78_constr_157;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P79;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P79_specs_159;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P79_159[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P79_constr_159;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P80;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P80_specs_161;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P80_161[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P80_constr_161;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P81;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P81_specs_163;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P81_163[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P81_constr_163;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P82;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P82_specs_165;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P82_165[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P82_constr_165;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P83;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P83_specs_167;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P83_167[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P83_constr_167;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P84;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P84_specs_169;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P84_169[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P84_constr_169;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P85;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P85_specs_171;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P85_171[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P85_constr_171;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P86;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P86_specs_173;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P86_173[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P86_constr_173;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P87;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P87_specs_175;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P87_175[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P87_constr_175;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P88;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P88_specs_177;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P88_177[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P88_constr_177;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P89;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P89_specs_179;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P89_179[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P89_constr_179;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P90;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P90_specs_181;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P90_181[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P90_constr_181;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_Container_129P91;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_Container_129P91_specs_183;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_Container_129P91_183[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_Container_129P91_constr_183;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ProtocolIE_Container_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ProtocolIE-ContainerList.h b/src/s1ap/asn1c/asnGenFiles/ProtocolIE-ContainerList.h
new file mode 100644
index 0000000..e5341b2
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ProtocolIE-ContainerList.h
@@ -0,0 +1,134 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-Containers"
+ * 	found in "./asn1c/S1AP-Containers.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ProtocolIE_ContainerList_H_
+#define	_ProtocolIE_ContainerList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolIE_SingleContainer;
+
+/* ProtocolIE-ContainerList */
+typedef struct ProtocolIE_ContainerList_166P0 {
+	A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_ContainerList_166P0_t;
+typedef struct ProtocolIE_ContainerList_166P1 {
+	A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_ContainerList_166P1_t;
+typedef struct ProtocolIE_ContainerList_166P2 {
+	A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_ContainerList_166P2_t;
+typedef struct ProtocolIE_ContainerList_166P3 {
+	A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_ContainerList_166P3_t;
+typedef struct ProtocolIE_ContainerList_166P4 {
+	A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_ContainerList_166P4_t;
+typedef struct ProtocolIE_ContainerList_166P5 {
+	A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_ContainerList_166P5_t;
+typedef struct ProtocolIE_ContainerList_166P6 {
+	A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_ContainerList_166P6_t;
+typedef struct ProtocolIE_ContainerList_166P7 {
+	A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_ContainerList_166P7_t;
+typedef struct ProtocolIE_ContainerList_166P8 {
+	A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_ContainerList_166P8_t;
+typedef struct ProtocolIE_ContainerList_166P9 {
+	A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ProtocolIE_ContainerList_166P9_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerList_166P0;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerList_166P0_specs_1;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerList_166P0_1[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerList_166P0_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerList_166P1;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerList_166P1_specs_3;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerList_166P1_3[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerList_166P1_constr_3;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerList_166P2;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerList_166P2_specs_5;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerList_166P2_5[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerList_166P2_constr_5;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerList_166P3;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerList_166P3_specs_7;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerList_166P3_7[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerList_166P3_constr_7;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerList_166P4;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerList_166P4_specs_9;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerList_166P4_9[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerList_166P4_constr_9;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerList_166P5;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerList_166P5_specs_11;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerList_166P5_11[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerList_166P5_constr_11;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerList_166P6;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerList_166P6_specs_13;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerList_166P6_13[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerList_166P6_constr_13;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerList_166P7;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerList_166P7_specs_15;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerList_166P7_15[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerList_166P7_constr_15;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerList_166P8;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerList_166P8_specs_17;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerList_166P8_17[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerList_166P8_constr_17;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerList_166P9;
+extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerList_166P9_specs_19;
+extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerList_166P9_19[1];
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerList_166P9_constr_19;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ProtocolIE_ContainerList_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ProtocolIE-ContainerPair.h b/src/s1ap/asn1c/asnGenFiles/ProtocolIE-ContainerPair.h
new file mode 100644
index 0000000..2ac7db9
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ProtocolIE-ContainerPair.h
@@ -0,0 +1,23 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-Containers"
+ * 	found in "./asn1c/S1AP-Containers.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ProtocolIE_ContainerPair_H_
+#define	_ProtocolIE_ContainerPair_H_
+
+
+#include <asn_application.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ProtocolIE_ContainerPair_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ProtocolIE-ContainerPairList.h b/src/s1ap/asn1c/asnGenFiles/ProtocolIE-ContainerPairList.h
new file mode 100644
index 0000000..ba4354e
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ProtocolIE-ContainerPairList.h
@@ -0,0 +1,23 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-Containers"
+ * 	found in "./asn1c/S1AP-Containers.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ProtocolIE_ContainerPairList_H_
+#define	_ProtocolIE_ContainerPairList_H_
+
+
+#include <asn_application.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ProtocolIE_ContainerPairList_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ProtocolIE-Field.h b/src/s1ap/asn1c/asnGenFiles/ProtocolIE-Field.h
new file mode 100644
index 0000000..a77e4da
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ProtocolIE-Field.h
@@ -0,0 +1,3943 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-Containers"
+ * 	found in "./asn1c/S1AP-Containers.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice`
+ */
+
+#ifndef	_ProtocolIE_Field_H_
+#define	_ProtocolIE_Field_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-ID.h"
+#include "Criticality.h"
+#include <ANY.h>
+#include <asn_ioc.h>
+#include "Bearers-SubjectToStatusTransfer-Item.h"
+#include "Presence.h"
+#include <OPEN_TYPE.h>
+#include <constr_CHOICE.h>
+#include <constr_SEQUENCE.h>
+#include "E-RABInformationListItem.h"
+#include "E-RABItem.h"
+#include "E-RABUsageReportItem.h"
+#include "LoggedMBSFNMDT.h"
+#include "RecommendedCellItem.h"
+#include "RecommendedENBItem.h"
+#include "SecondaryRATDataUsageReportItem.h"
+#include "SONInformationReport.h"
+#include "E-RABToBeSetupItemBearerSUReq.h"
+#include "E-RABSetupItemBearerSURes.h"
+#include "E-RABToBeModifiedItemBearerModReq.h"
+#include "E-RABModifyItemBearerModRes.h"
+#include "E-RABReleaseItemBearerRelComp.h"
+#include "E-RABToBeSetupItemCtxtSUReq.h"
+#include "E-RABSetupItemCtxtSURes.h"
+#include "TAIItem.h"
+#include "UE-associatedLogicalS1-ConnectionItem.h"
+#include "E-RABModifyItemBearerModConf.h"
+#include "MME-UE-S1AP-ID.h"
+#include "ENB-UE-S1AP-ID.h"
+#include "HandoverType.h"
+#include "Cause.h"
+#include "TargetID.h"
+#include "Direct-Forwarding-Path-Availability.h"
+#include "SRVCCHOIndication.h"
+#include "Source-ToTarget-TransparentContainer.h"
+#include "MSClassmark2.h"
+#include "MSClassmark3.h"
+#include "CSG-Id.h"
+#include "CellAccessMode.h"
+#include "PS-ServiceNotAvailable.h"
+#include "NASSecurityParametersfromE-UTRAN.h"
+#include "E-RABSubjecttoDataForwardingList.h"
+#include "E-RABList.h"
+#include "Target-ToSource-TransparentContainer.h"
+#include "CriticalityDiagnostics.h"
+#include "UEAggregateMaximumBitrate.h"
+#include "E-RABToBeSetupListHOReq.h"
+#include "UESecurityCapabilities.h"
+#include "HandoverRestrictionList.h"
+#include "TraceActivation.h"
+#include "RequestType.h"
+#include "SRVCCOperationPossible.h"
+#include "SecurityContext.h"
+#include "NASSecurityParameterstoE-UTRAN.h"
+#include "CSGMembershipStatus.h"
+#include "GUMMEI.h"
+#include "ManagementBasedMDTAllowed.h"
+#include "MDTPLMNList.h"
+#include "Masked-IMEISV.h"
+#include "ExpectedUEBehaviour.h"
+#include "ProSeAuthorized.h"
+#include "UEUserPlaneCIoTSupportIndicator.h"
+#include "V2XServicesAuthorized.h"
+#include "UESidelinkAggregateMaximumBitrate.h"
+#include "EnhancedCoverageRestricted.h"
+#include "NRUESecurityCapabilities.h"
+#include "CE-ModeBRestricted.h"
+#include "AerialUEsubscriptionInformation.h"
+#include "PendingDataIndication.h"
+#include "Subscription-Based-UE-DifferentiationInfo.h"
+#include "E-RABAdmittedList.h"
+#include "E-RABFailedtoSetupListHOReqAck.h"
+#include "CE-mode-B-SupportIndicator.h"
+#include "EUTRAN-CGI.h"
+#include "TAI.h"
+#include "TunnelInformation.h"
+#include "LHN-ID.h"
+#include "PSCellInformation.h"
+#include "E-RABToBeSwitchedDLList.h"
+#include "RRC-Establishment-Cause.h"
+#include "E-RABToBeSwitchedULList.h"
+#include "E-RABToBeSetupListBearerSUReq.h"
+#include "E-RABSetupListBearerSURes.h"
+#include "E-RABToBeModifiedListBearerModReq.h"
+#include "SecondaryRATDataUsageRequest.h"
+#include "E-RABModifyListBearerModRes.h"
+#include "SecondaryRATDataUsageReportList.h"
+#include "NAS-PDU.h"
+#include "E-RABReleaseListBearerRelComp.h"
+#include "UserLocationInformation.h"
+#include "E-RABToBeSetupListCtxtSUReq.h"
+#include "SecurityKey.h"
+#include "UERadioCapability.h"
+#include "SubscriberProfileIDforRFP.h"
+#include "CSFallbackIndicator.h"
+#include "LAI.h"
+#include "AdditionalCSFallbackIndicator.h"
+#include "E-RABSetupListCtxtSURes.h"
+#include "UEIdentityIndexValue.h"
+#include "UEPagingID.h"
+#include "PagingDRX.h"
+#include "CNDomain.h"
+#include "TAIList.h"
+#include "CSG-IdList.h"
+#include "PagingPriority.h"
+#include "UERadioCapabilityForPaging.h"
+#include "AssistanceDataForPaging.h"
+#include "Paging-eDRXInformation.h"
+#include "Extended-UEIdentityIndexValue.h"
+#include "NB-IoT-Paging-eDRXInformation.h"
+#include "NB-IoT-UEIdentityIndexValue.h"
+#include "GWContextReleaseIndication.h"
+#include "UE-S1AP-IDs.h"
+#include "InformationOnRecommendedCellsAndENBsForPaging.h"
+#include "CellIdentifierAndCELevelForCECapableUEs.h"
+#include "TimeSinceSecondaryNodeRelease.h"
+#include "SRVCCOperationNotPossible.h"
+#include "VoiceSupportMatchIndicator.h"
+#include "DLNASPDUDeliveryAckRequest.h"
+#include "UECapabilityInfoRequest.h"
+#include "EndIndication.h"
+#include "S-TMSI.h"
+#include "TransportLayerAddress.h"
+#include "RelayNode-Indicator.h"
+#include "GUMMEIType.h"
+#include "MME-Group-ID.h"
+#include "UE-Usage-Type.h"
+#include "DCN-ID.h"
+#include "Coverage-Level.h"
+#include "UE-Application-Layer-Measurement-Capability.h"
+#include "EDT-Session.h"
+#include <OCTET_STRING.h>
+#include "Additional-GUTI.h"
+#include "ResetType.h"
+#include "UE-associatedLogicalS1-ConnectionListResAck.h"
+#include "Global-ENB-ID.h"
+#include "ENBname.h"
+#include "SupportedTAs.h"
+#include "UE-RetentionInformation.h"
+#include "NB-IoT-DefaultPagingDRX.h"
+#include "ConnectedengNBList.h"
+#include "MMEname.h"
+#include "ServedGUMMEIs.h"
+#include "RelativeMMECapacity.h"
+#include "MMERelaySupportIndicator.h"
+#include "ServedDCNs.h"
+#include "TimeToWait.h"
+#include "Cdma2000HOStatus.h"
+#include "Cdma2000RATType.h"
+#include "Cdma2000PDU.h"
+#include "Cdma2000SectorID.h"
+#include "Cdma2000HORequiredIndication.h"
+#include "Cdma2000OneXSRVCCInfo.h"
+#include "Cdma2000OneXRAND.h"
+#include "EUTRANRoundTripDelayEstimationInfo.h"
+#include "LTE-M-Indication.h"
+#include "ENB-StatusTransfer-TransparentContainer.h"
+#include "E-UTRAN-Trace-ID.h"
+#include "PrivacyIndicator.h"
+#include "OverloadResponse.h"
+#include "GUMMEIList.h"
+#include "TrafficLoadReductionIndication.h"
+#include "MessageIdentifier.h"
+#include "SerialNumber.h"
+#include "WarningAreaList.h"
+#include "RepetitionPeriod.h"
+#include "ExtendedRepetitionPeriod.h"
+#include "NumberofBroadcastRequest.h"
+#include "WarningType.h"
+#include "WarningSecurityInfo.h"
+#include "DataCodingScheme.h"
+#include "WarningMessageContents.h"
+#include "ConcurrentWarningMessageIndicator.h"
+#include "WarningAreaCoordinates.h"
+#include "BroadcastCompletedAreaList.h"
+#include "Inter-SystemInformationTransferType.h"
+#include "SONConfigurationTransfer.h"
+#include "EN-DCSONConfigurationTransfer.h"
+#include "KillAllWarningMessages.h"
+#include "BroadcastCancelledAreaList.h"
+#include "ECGIListForRestart.h"
+#include "TAIListForRestart.h"
+#include "EmergencyAreaIDListForRestart.h"
+#include "PWSfailedECGIList.h"
+#include "Routing-ID.h"
+#include "LPPa-PDU.h"
+#include "E-RABToBeModifiedListBearerModInd.h"
+#include "E-RABNotToBeModifiedListBearerModInd.h"
+#include "CSGMembershipInfo.h"
+#include "E-RABModifyListBearerModConf.h"
+#include "E-RABFailedToResumeListResumeReq.h"
+#include "E-RABFailedToResumeListResumeRes.h"
+#include "DL-CP-SecurityInformation.h"
+#include "E-RABLevelQoSParameters.h"
+#include "UL-CP-SecurityInformation.h"
+#include "HandoverFlag.h"
+#include "E-RABDataForwardingItem.h"
+#include "E-RABToBeSetupItemHOReq.h"
+#include "E-RABAdmittedItem.h"
+#include "E-RABFailedToSetupItemHOReqAck.h"
+#include "E-RABToBeSwitchedDLItem.h"
+#include "E-RABToBeSwitchedULItem.h"
+#include "E-RABToBeModifiedItemBearerModInd.h"
+#include "E-RABNotToBeModifiedItemBearerModInd.h"
+#include "E-RABFailedToResumeItemResumeReq.h"
+#include "E-RABFailedToResumeItemResumeRes.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum Bearers_SubjectToStatusTransfer_ItemIEs__value_PR {
+	Bearers_SubjectToStatusTransfer_ItemIEs__value_PR_NOTHING,	/* No components present */
+	Bearers_SubjectToStatusTransfer_ItemIEs__value_PR_Bearers_SubjectToStatusTransfer_Item
+} Bearers_SubjectToStatusTransfer_ItemIEs__value_PR;
+typedef enum E_RABInformationListIEs__value_PR {
+	E_RABInformationListIEs__value_PR_NOTHING,	/* No components present */
+	E_RABInformationListIEs__value_PR_E_RABInformationListItem
+} E_RABInformationListIEs__value_PR;
+typedef enum E_RABItemIEs__value_PR {
+	E_RABItemIEs__value_PR_NOTHING,	/* No components present */
+	E_RABItemIEs__value_PR_E_RABItem
+} E_RABItemIEs__value_PR;
+typedef enum E_RABUsageReportItemIEs__value_PR {
+	E_RABUsageReportItemIEs__value_PR_NOTHING,	/* No components present */
+	E_RABUsageReportItemIEs__value_PR_E_RABUsageReportItem
+} E_RABUsageReportItemIEs__value_PR;
+typedef enum MDTMode_ExtensionIE__value_PR {
+	MDTMode_ExtensionIE__value_PR_NOTHING,	/* No components present */
+	MDTMode_ExtensionIE__value_PR_LoggedMBSFNMDT
+} MDTMode_ExtensionIE__value_PR;
+typedef enum RecommendedCellItemIEs__value_PR {
+	RecommendedCellItemIEs__value_PR_NOTHING,	/* No components present */
+	RecommendedCellItemIEs__value_PR_RecommendedCellItem
+} RecommendedCellItemIEs__value_PR;
+typedef enum RecommendedENBItemIEs__value_PR {
+	RecommendedENBItemIEs__value_PR_NOTHING,	/* No components present */
+	RecommendedENBItemIEs__value_PR_RecommendedENBItem
+} RecommendedENBItemIEs__value_PR;
+typedef enum SecondaryRATDataUsageReportItemIEs__value_PR {
+	SecondaryRATDataUsageReportItemIEs__value_PR_NOTHING,	/* No components present */
+	SecondaryRATDataUsageReportItemIEs__value_PR_SecondaryRATDataUsageReportItem
+} SecondaryRATDataUsageReportItemIEs__value_PR;
+typedef enum SONInformation_ExtensionIE__value_PR {
+	SONInformation_ExtensionIE__value_PR_NOTHING,	/* No components present */
+	SONInformation_ExtensionIE__value_PR_SONInformationReport
+} SONInformation_ExtensionIE__value_PR;
+typedef enum E_RABToBeSetupItemBearerSUReqIEs__value_PR {
+	E_RABToBeSetupItemBearerSUReqIEs__value_PR_NOTHING,	/* No components present */
+	E_RABToBeSetupItemBearerSUReqIEs__value_PR_E_RABToBeSetupItemBearerSUReq
+} E_RABToBeSetupItemBearerSUReqIEs__value_PR;
+typedef enum E_RABSetupItemBearerSUResIEs__value_PR {
+	E_RABSetupItemBearerSUResIEs__value_PR_NOTHING,	/* No components present */
+	E_RABSetupItemBearerSUResIEs__value_PR_E_RABSetupItemBearerSURes
+} E_RABSetupItemBearerSUResIEs__value_PR;
+typedef enum E_RABToBeModifiedItemBearerModReqIEs__value_PR {
+	E_RABToBeModifiedItemBearerModReqIEs__value_PR_NOTHING,	/* No components present */
+	E_RABToBeModifiedItemBearerModReqIEs__value_PR_E_RABToBeModifiedItemBearerModReq
+} E_RABToBeModifiedItemBearerModReqIEs__value_PR;
+typedef enum E_RABModifyItemBearerModResIEs__value_PR {
+	E_RABModifyItemBearerModResIEs__value_PR_NOTHING,	/* No components present */
+	E_RABModifyItemBearerModResIEs__value_PR_E_RABModifyItemBearerModRes
+} E_RABModifyItemBearerModResIEs__value_PR;
+typedef enum E_RABReleaseItemBearerRelCompIEs__value_PR {
+	E_RABReleaseItemBearerRelCompIEs__value_PR_NOTHING,	/* No components present */
+	E_RABReleaseItemBearerRelCompIEs__value_PR_E_RABReleaseItemBearerRelComp
+} E_RABReleaseItemBearerRelCompIEs__value_PR;
+typedef enum E_RABToBeSetupItemCtxtSUReqIEs__value_PR {
+	E_RABToBeSetupItemCtxtSUReqIEs__value_PR_NOTHING,	/* No components present */
+	E_RABToBeSetupItemCtxtSUReqIEs__value_PR_E_RABToBeSetupItemCtxtSUReq
+} E_RABToBeSetupItemCtxtSUReqIEs__value_PR;
+typedef enum E_RABSetupItemCtxtSUResIEs__value_PR {
+	E_RABSetupItemCtxtSUResIEs__value_PR_NOTHING,	/* No components present */
+	E_RABSetupItemCtxtSUResIEs__value_PR_E_RABSetupItemCtxtSURes
+} E_RABSetupItemCtxtSUResIEs__value_PR;
+typedef enum TAIItemIEs__value_PR {
+	TAIItemIEs__value_PR_NOTHING,	/* No components present */
+	TAIItemIEs__value_PR_TAIItem
+} TAIItemIEs__value_PR;
+typedef enum UE_associatedLogicalS1_ConnectionItemRes__value_PR {
+	UE_associatedLogicalS1_ConnectionItemRes__value_PR_NOTHING,	/* No components present */
+	UE_associatedLogicalS1_ConnectionItemRes__value_PR_UE_associatedLogicalS1_ConnectionItem
+} UE_associatedLogicalS1_ConnectionItemRes__value_PR;
+typedef enum UE_associatedLogicalS1_ConnectionItemResAck__value_PR {
+	UE_associatedLogicalS1_ConnectionItemResAck__value_PR_NOTHING,	/* No components present */
+	UE_associatedLogicalS1_ConnectionItemResAck__value_PR_UE_associatedLogicalS1_ConnectionItem
+} UE_associatedLogicalS1_ConnectionItemResAck__value_PR;
+typedef enum E_RABModifyItemBearerModConfIEs__value_PR {
+	E_RABModifyItemBearerModConfIEs__value_PR_NOTHING,	/* No components present */
+	E_RABModifyItemBearerModConfIEs__value_PR_E_RABModifyItemBearerModConf
+} E_RABModifyItemBearerModConfIEs__value_PR;
+typedef enum HandoverRequiredIEs__value_PR {
+	HandoverRequiredIEs__value_PR_NOTHING,	/* No components present */
+	HandoverRequiredIEs__value_PR_MME_UE_S1AP_ID,
+	HandoverRequiredIEs__value_PR_ENB_UE_S1AP_ID,
+	HandoverRequiredIEs__value_PR_HandoverType,
+	HandoverRequiredIEs__value_PR_Cause,
+	HandoverRequiredIEs__value_PR_TargetID,
+	HandoverRequiredIEs__value_PR_Direct_Forwarding_Path_Availability,
+	HandoverRequiredIEs__value_PR_SRVCCHOIndication,
+	HandoverRequiredIEs__value_PR_Source_ToTarget_TransparentContainer,
+	HandoverRequiredIEs__value_PR_Source_ToTarget_TransparentContainer_1,
+	HandoverRequiredIEs__value_PR_MSClassmark2,
+	HandoverRequiredIEs__value_PR_MSClassmark3,
+	HandoverRequiredIEs__value_PR_CSG_Id,
+	HandoverRequiredIEs__value_PR_CellAccessMode,
+	HandoverRequiredIEs__value_PR_PS_ServiceNotAvailable
+} HandoverRequiredIEs__value_PR;
+typedef enum HandoverCommandIEs__value_PR {
+	HandoverCommandIEs__value_PR_NOTHING,	/* No components present */
+	HandoverCommandIEs__value_PR_MME_UE_S1AP_ID,
+	HandoverCommandIEs__value_PR_ENB_UE_S1AP_ID,
+	HandoverCommandIEs__value_PR_HandoverType,
+	HandoverCommandIEs__value_PR_NASSecurityParametersfromE_UTRAN,
+	HandoverCommandIEs__value_PR_E_RABSubjecttoDataForwardingList,
+	HandoverCommandIEs__value_PR_E_RABList,
+	HandoverCommandIEs__value_PR_Target_ToSource_TransparentContainer,
+	HandoverCommandIEs__value_PR_Target_ToSource_TransparentContainer_1,
+	HandoverCommandIEs__value_PR_CriticalityDiagnostics
+} HandoverCommandIEs__value_PR;
+typedef enum HandoverPreparationFailureIEs__value_PR {
+	HandoverPreparationFailureIEs__value_PR_NOTHING,	/* No components present */
+	HandoverPreparationFailureIEs__value_PR_MME_UE_S1AP_ID,
+	HandoverPreparationFailureIEs__value_PR_ENB_UE_S1AP_ID,
+	HandoverPreparationFailureIEs__value_PR_Cause,
+	HandoverPreparationFailureIEs__value_PR_CriticalityDiagnostics
+} HandoverPreparationFailureIEs__value_PR;
+typedef enum HandoverRequestIEs__value_PR {
+	HandoverRequestIEs__value_PR_NOTHING,	/* No components present */
+	HandoverRequestIEs__value_PR_MME_UE_S1AP_ID,
+	HandoverRequestIEs__value_PR_HandoverType,
+	HandoverRequestIEs__value_PR_Cause,
+	HandoverRequestIEs__value_PR_UEAggregateMaximumBitrate,
+	HandoverRequestIEs__value_PR_E_RABToBeSetupListHOReq,
+	HandoverRequestIEs__value_PR_Source_ToTarget_TransparentContainer,
+	HandoverRequestIEs__value_PR_UESecurityCapabilities,
+	HandoverRequestIEs__value_PR_HandoverRestrictionList,
+	HandoverRequestIEs__value_PR_TraceActivation,
+	HandoverRequestIEs__value_PR_RequestType,
+	HandoverRequestIEs__value_PR_SRVCCOperationPossible,
+	HandoverRequestIEs__value_PR_SecurityContext,
+	HandoverRequestIEs__value_PR_NASSecurityParameterstoE_UTRAN,
+	HandoverRequestIEs__value_PR_CSG_Id,
+	HandoverRequestIEs__value_PR_CSGMembershipStatus,
+	HandoverRequestIEs__value_PR_GUMMEI,
+	HandoverRequestIEs__value_PR_MME_UE_S1AP_ID_1,
+	HandoverRequestIEs__value_PR_ManagementBasedMDTAllowed,
+	HandoverRequestIEs__value_PR_MDTPLMNList,
+	HandoverRequestIEs__value_PR_Masked_IMEISV,
+	HandoverRequestIEs__value_PR_ExpectedUEBehaviour,
+	HandoverRequestIEs__value_PR_ProSeAuthorized,
+	HandoverRequestIEs__value_PR_UEUserPlaneCIoTSupportIndicator,
+	HandoverRequestIEs__value_PR_V2XServicesAuthorized,
+	HandoverRequestIEs__value_PR_UESidelinkAggregateMaximumBitrate,
+	HandoverRequestIEs__value_PR_EnhancedCoverageRestricted,
+	HandoverRequestIEs__value_PR_NRUESecurityCapabilities,
+	HandoverRequestIEs__value_PR_CE_ModeBRestricted,
+	HandoverRequestIEs__value_PR_AerialUEsubscriptionInformation,
+	HandoverRequestIEs__value_PR_PendingDataIndication,
+	HandoverRequestIEs__value_PR_Subscription_Based_UE_DifferentiationInfo
+} HandoverRequestIEs__value_PR;
+typedef enum HandoverRequestAcknowledgeIEs__value_PR {
+	HandoverRequestAcknowledgeIEs__value_PR_NOTHING,	/* No components present */
+	HandoverRequestAcknowledgeIEs__value_PR_MME_UE_S1AP_ID,
+	HandoverRequestAcknowledgeIEs__value_PR_ENB_UE_S1AP_ID,
+	HandoverRequestAcknowledgeIEs__value_PR_E_RABAdmittedList,
+	HandoverRequestAcknowledgeIEs__value_PR_E_RABFailedtoSetupListHOReqAck,
+	HandoverRequestAcknowledgeIEs__value_PR_Target_ToSource_TransparentContainer,
+	HandoverRequestAcknowledgeIEs__value_PR_CSG_Id,
+	HandoverRequestAcknowledgeIEs__value_PR_CriticalityDiagnostics,
+	HandoverRequestAcknowledgeIEs__value_PR_CellAccessMode,
+	HandoverRequestAcknowledgeIEs__value_PR_CE_mode_B_SupportIndicator
+} HandoverRequestAcknowledgeIEs__value_PR;
+typedef enum HandoverFailureIEs__value_PR {
+	HandoverFailureIEs__value_PR_NOTHING,	/* No components present */
+	HandoverFailureIEs__value_PR_MME_UE_S1AP_ID,
+	HandoverFailureIEs__value_PR_Cause,
+	HandoverFailureIEs__value_PR_CriticalityDiagnostics
+} HandoverFailureIEs__value_PR;
+typedef enum HandoverNotifyIEs__value_PR {
+	HandoverNotifyIEs__value_PR_NOTHING,	/* No components present */
+	HandoverNotifyIEs__value_PR_MME_UE_S1AP_ID,
+	HandoverNotifyIEs__value_PR_ENB_UE_S1AP_ID,
+	HandoverNotifyIEs__value_PR_EUTRAN_CGI,
+	HandoverNotifyIEs__value_PR_TAI,
+	HandoverNotifyIEs__value_PR_TunnelInformation,
+	HandoverNotifyIEs__value_PR_LHN_ID,
+	HandoverNotifyIEs__value_PR_PSCellInformation
+} HandoverNotifyIEs__value_PR;
+typedef enum PathSwitchRequestIEs__value_PR {
+	PathSwitchRequestIEs__value_PR_NOTHING,	/* No components present */
+	PathSwitchRequestIEs__value_PR_ENB_UE_S1AP_ID,
+	PathSwitchRequestIEs__value_PR_E_RABToBeSwitchedDLList,
+	PathSwitchRequestIEs__value_PR_MME_UE_S1AP_ID,
+	PathSwitchRequestIEs__value_PR_EUTRAN_CGI,
+	PathSwitchRequestIEs__value_PR_TAI,
+	PathSwitchRequestIEs__value_PR_UESecurityCapabilities,
+	PathSwitchRequestIEs__value_PR_CSG_Id,
+	PathSwitchRequestIEs__value_PR_CellAccessMode,
+	PathSwitchRequestIEs__value_PR_GUMMEI,
+	PathSwitchRequestIEs__value_PR_CSGMembershipStatus,
+	PathSwitchRequestIEs__value_PR_TunnelInformation,
+	PathSwitchRequestIEs__value_PR_LHN_ID,
+	PathSwitchRequestIEs__value_PR_RRC_Establishment_Cause,
+	PathSwitchRequestIEs__value_PR_NRUESecurityCapabilities,
+	PathSwitchRequestIEs__value_PR_PSCellInformation
+} PathSwitchRequestIEs__value_PR;
+typedef enum PathSwitchRequestAcknowledgeIEs__value_PR {
+	PathSwitchRequestAcknowledgeIEs__value_PR_NOTHING,	/* No components present */
+	PathSwitchRequestAcknowledgeIEs__value_PR_MME_UE_S1AP_ID,
+	PathSwitchRequestAcknowledgeIEs__value_PR_ENB_UE_S1AP_ID,
+	PathSwitchRequestAcknowledgeIEs__value_PR_UEAggregateMaximumBitrate,
+	PathSwitchRequestAcknowledgeIEs__value_PR_E_RABToBeSwitchedULList,
+	PathSwitchRequestAcknowledgeIEs__value_PR_E_RABList,
+	PathSwitchRequestAcknowledgeIEs__value_PR_SecurityContext,
+	PathSwitchRequestAcknowledgeIEs__value_PR_CriticalityDiagnostics,
+	PathSwitchRequestAcknowledgeIEs__value_PR_MME_UE_S1AP_ID_1,
+	PathSwitchRequestAcknowledgeIEs__value_PR_CSGMembershipStatus,
+	PathSwitchRequestAcknowledgeIEs__value_PR_ProSeAuthorized,
+	PathSwitchRequestAcknowledgeIEs__value_PR_UEUserPlaneCIoTSupportIndicator,
+	PathSwitchRequestAcknowledgeIEs__value_PR_V2XServicesAuthorized,
+	PathSwitchRequestAcknowledgeIEs__value_PR_UESidelinkAggregateMaximumBitrate,
+	PathSwitchRequestAcknowledgeIEs__value_PR_EnhancedCoverageRestricted,
+	PathSwitchRequestAcknowledgeIEs__value_PR_NRUESecurityCapabilities,
+	PathSwitchRequestAcknowledgeIEs__value_PR_CE_ModeBRestricted,
+	PathSwitchRequestAcknowledgeIEs__value_PR_AerialUEsubscriptionInformation,
+	PathSwitchRequestAcknowledgeIEs__value_PR_PendingDataIndication,
+	PathSwitchRequestAcknowledgeIEs__value_PR_Subscription_Based_UE_DifferentiationInfo
+} PathSwitchRequestAcknowledgeIEs__value_PR;
+typedef enum PathSwitchRequestFailureIEs__value_PR {
+	PathSwitchRequestFailureIEs__value_PR_NOTHING,	/* No components present */
+	PathSwitchRequestFailureIEs__value_PR_MME_UE_S1AP_ID,
+	PathSwitchRequestFailureIEs__value_PR_ENB_UE_S1AP_ID,
+	PathSwitchRequestFailureIEs__value_PR_Cause,
+	PathSwitchRequestFailureIEs__value_PR_CriticalityDiagnostics
+} PathSwitchRequestFailureIEs__value_PR;
+typedef enum HandoverCancelIEs__value_PR {
+	HandoverCancelIEs__value_PR_NOTHING,	/* No components present */
+	HandoverCancelIEs__value_PR_MME_UE_S1AP_ID,
+	HandoverCancelIEs__value_PR_ENB_UE_S1AP_ID,
+	HandoverCancelIEs__value_PR_Cause
+} HandoverCancelIEs__value_PR;
+typedef enum HandoverCancelAcknowledgeIEs__value_PR {
+	HandoverCancelAcknowledgeIEs__value_PR_NOTHING,	/* No components present */
+	HandoverCancelAcknowledgeIEs__value_PR_MME_UE_S1AP_ID,
+	HandoverCancelAcknowledgeIEs__value_PR_ENB_UE_S1AP_ID,
+	HandoverCancelAcknowledgeIEs__value_PR_CriticalityDiagnostics
+} HandoverCancelAcknowledgeIEs__value_PR;
+typedef enum E_RABSetupRequestIEs__value_PR {
+	E_RABSetupRequestIEs__value_PR_NOTHING,	/* No components present */
+	E_RABSetupRequestIEs__value_PR_MME_UE_S1AP_ID,
+	E_RABSetupRequestIEs__value_PR_ENB_UE_S1AP_ID,
+	E_RABSetupRequestIEs__value_PR_UEAggregateMaximumBitrate,
+	E_RABSetupRequestIEs__value_PR_E_RABToBeSetupListBearerSUReq
+} E_RABSetupRequestIEs__value_PR;
+typedef enum E_RABSetupResponseIEs__value_PR {
+	E_RABSetupResponseIEs__value_PR_NOTHING,	/* No components present */
+	E_RABSetupResponseIEs__value_PR_MME_UE_S1AP_ID,
+	E_RABSetupResponseIEs__value_PR_ENB_UE_S1AP_ID,
+	E_RABSetupResponseIEs__value_PR_E_RABSetupListBearerSURes,
+	E_RABSetupResponseIEs__value_PR_E_RABList,
+	E_RABSetupResponseIEs__value_PR_CriticalityDiagnostics
+} E_RABSetupResponseIEs__value_PR;
+typedef enum E_RABModifyRequestIEs__value_PR {
+	E_RABModifyRequestIEs__value_PR_NOTHING,	/* No components present */
+	E_RABModifyRequestIEs__value_PR_MME_UE_S1AP_ID,
+	E_RABModifyRequestIEs__value_PR_ENB_UE_S1AP_ID,
+	E_RABModifyRequestIEs__value_PR_UEAggregateMaximumBitrate,
+	E_RABModifyRequestIEs__value_PR_E_RABToBeModifiedListBearerModReq,
+	E_RABModifyRequestIEs__value_PR_SecondaryRATDataUsageRequest
+} E_RABModifyRequestIEs__value_PR;
+typedef enum E_RABModifyResponseIEs__value_PR {
+	E_RABModifyResponseIEs__value_PR_NOTHING,	/* No components present */
+	E_RABModifyResponseIEs__value_PR_MME_UE_S1AP_ID,
+	E_RABModifyResponseIEs__value_PR_ENB_UE_S1AP_ID,
+	E_RABModifyResponseIEs__value_PR_E_RABModifyListBearerModRes,
+	E_RABModifyResponseIEs__value_PR_E_RABList,
+	E_RABModifyResponseIEs__value_PR_CriticalityDiagnostics,
+	E_RABModifyResponseIEs__value_PR_SecondaryRATDataUsageReportList
+} E_RABModifyResponseIEs__value_PR;
+typedef enum E_RABReleaseCommandIEs__value_PR {
+	E_RABReleaseCommandIEs__value_PR_NOTHING,	/* No components present */
+	E_RABReleaseCommandIEs__value_PR_MME_UE_S1AP_ID,
+	E_RABReleaseCommandIEs__value_PR_ENB_UE_S1AP_ID,
+	E_RABReleaseCommandIEs__value_PR_UEAggregateMaximumBitrate,
+	E_RABReleaseCommandIEs__value_PR_E_RABList,
+	E_RABReleaseCommandIEs__value_PR_NAS_PDU
+} E_RABReleaseCommandIEs__value_PR;
+typedef enum E_RABReleaseResponseIEs__value_PR {
+	E_RABReleaseResponseIEs__value_PR_NOTHING,	/* No components present */
+	E_RABReleaseResponseIEs__value_PR_MME_UE_S1AP_ID,
+	E_RABReleaseResponseIEs__value_PR_ENB_UE_S1AP_ID,
+	E_RABReleaseResponseIEs__value_PR_E_RABReleaseListBearerRelComp,
+	E_RABReleaseResponseIEs__value_PR_E_RABList,
+	E_RABReleaseResponseIEs__value_PR_CriticalityDiagnostics,
+	E_RABReleaseResponseIEs__value_PR_UserLocationInformation,
+	E_RABReleaseResponseIEs__value_PR_SecondaryRATDataUsageReportList
+} E_RABReleaseResponseIEs__value_PR;
+typedef enum E_RABReleaseIndicationIEs__value_PR {
+	E_RABReleaseIndicationIEs__value_PR_NOTHING,	/* No components present */
+	E_RABReleaseIndicationIEs__value_PR_MME_UE_S1AP_ID,
+	E_RABReleaseIndicationIEs__value_PR_ENB_UE_S1AP_ID,
+	E_RABReleaseIndicationIEs__value_PR_E_RABList,
+	E_RABReleaseIndicationIEs__value_PR_UserLocationInformation,
+	E_RABReleaseIndicationIEs__value_PR_SecondaryRATDataUsageReportList
+} E_RABReleaseIndicationIEs__value_PR;
+typedef enum InitialContextSetupRequestIEs__value_PR {
+	InitialContextSetupRequestIEs__value_PR_NOTHING,	/* No components present */
+	InitialContextSetupRequestIEs__value_PR_MME_UE_S1AP_ID,
+	InitialContextSetupRequestIEs__value_PR_ENB_UE_S1AP_ID,
+	InitialContextSetupRequestIEs__value_PR_UEAggregateMaximumBitrate,
+	InitialContextSetupRequestIEs__value_PR_E_RABToBeSetupListCtxtSUReq,
+	InitialContextSetupRequestIEs__value_PR_UESecurityCapabilities,
+	InitialContextSetupRequestIEs__value_PR_SecurityKey,
+	InitialContextSetupRequestIEs__value_PR_TraceActivation,
+	InitialContextSetupRequestIEs__value_PR_HandoverRestrictionList,
+	InitialContextSetupRequestIEs__value_PR_UERadioCapability,
+	InitialContextSetupRequestIEs__value_PR_SubscriberProfileIDforRFP,
+	InitialContextSetupRequestIEs__value_PR_CSFallbackIndicator,
+	InitialContextSetupRequestIEs__value_PR_SRVCCOperationPossible,
+	InitialContextSetupRequestIEs__value_PR_CSGMembershipStatus,
+	InitialContextSetupRequestIEs__value_PR_LAI,
+	InitialContextSetupRequestIEs__value_PR_GUMMEI,
+	InitialContextSetupRequestIEs__value_PR_MME_UE_S1AP_ID_1,
+	InitialContextSetupRequestIEs__value_PR_ManagementBasedMDTAllowed,
+	InitialContextSetupRequestIEs__value_PR_MDTPLMNList,
+	InitialContextSetupRequestIEs__value_PR_AdditionalCSFallbackIndicator,
+	InitialContextSetupRequestIEs__value_PR_Masked_IMEISV,
+	InitialContextSetupRequestIEs__value_PR_ExpectedUEBehaviour,
+	InitialContextSetupRequestIEs__value_PR_ProSeAuthorized,
+	InitialContextSetupRequestIEs__value_PR_UEUserPlaneCIoTSupportIndicator,
+	InitialContextSetupRequestIEs__value_PR_V2XServicesAuthorized,
+	InitialContextSetupRequestIEs__value_PR_UESidelinkAggregateMaximumBitrate,
+	InitialContextSetupRequestIEs__value_PR_EnhancedCoverageRestricted,
+	InitialContextSetupRequestIEs__value_PR_NRUESecurityCapabilities,
+	InitialContextSetupRequestIEs__value_PR_CE_ModeBRestricted,
+	InitialContextSetupRequestIEs__value_PR_AerialUEsubscriptionInformation,
+	InitialContextSetupRequestIEs__value_PR_PendingDataIndication,
+	InitialContextSetupRequestIEs__value_PR_Subscription_Based_UE_DifferentiationInfo
+} InitialContextSetupRequestIEs__value_PR;
+typedef enum InitialContextSetupResponseIEs__value_PR {
+	InitialContextSetupResponseIEs__value_PR_NOTHING,	/* No components present */
+	InitialContextSetupResponseIEs__value_PR_MME_UE_S1AP_ID,
+	InitialContextSetupResponseIEs__value_PR_ENB_UE_S1AP_ID,
+	InitialContextSetupResponseIEs__value_PR_E_RABSetupListCtxtSURes,
+	InitialContextSetupResponseIEs__value_PR_E_RABList,
+	InitialContextSetupResponseIEs__value_PR_CriticalityDiagnostics
+} InitialContextSetupResponseIEs__value_PR;
+typedef enum InitialContextSetupFailureIEs__value_PR {
+	InitialContextSetupFailureIEs__value_PR_NOTHING,	/* No components present */
+	InitialContextSetupFailureIEs__value_PR_MME_UE_S1AP_ID,
+	InitialContextSetupFailureIEs__value_PR_ENB_UE_S1AP_ID,
+	InitialContextSetupFailureIEs__value_PR_Cause,
+	InitialContextSetupFailureIEs__value_PR_CriticalityDiagnostics
+} InitialContextSetupFailureIEs__value_PR;
+typedef enum PagingIEs__value_PR {
+	PagingIEs__value_PR_NOTHING,	/* No components present */
+	PagingIEs__value_PR_UEIdentityIndexValue,
+	PagingIEs__value_PR_UEPagingID,
+	PagingIEs__value_PR_PagingDRX,
+	PagingIEs__value_PR_CNDomain,
+	PagingIEs__value_PR_TAIList,
+	PagingIEs__value_PR_CSG_IdList,
+	PagingIEs__value_PR_PagingPriority,
+	PagingIEs__value_PR_UERadioCapabilityForPaging,
+	PagingIEs__value_PR_AssistanceDataForPaging,
+	PagingIEs__value_PR_Paging_eDRXInformation,
+	PagingIEs__value_PR_Extended_UEIdentityIndexValue,
+	PagingIEs__value_PR_NB_IoT_Paging_eDRXInformation,
+	PagingIEs__value_PR_NB_IoT_UEIdentityIndexValue,
+	PagingIEs__value_PR_EnhancedCoverageRestricted,
+	PagingIEs__value_PR_CE_ModeBRestricted
+} PagingIEs__value_PR;
+typedef enum UEContextReleaseRequest_IEs__value_PR {
+	UEContextReleaseRequest_IEs__value_PR_NOTHING,	/* No components present */
+	UEContextReleaseRequest_IEs__value_PR_MME_UE_S1AP_ID,
+	UEContextReleaseRequest_IEs__value_PR_ENB_UE_S1AP_ID,
+	UEContextReleaseRequest_IEs__value_PR_Cause,
+	UEContextReleaseRequest_IEs__value_PR_GWContextReleaseIndication,
+	UEContextReleaseRequest_IEs__value_PR_SecondaryRATDataUsageReportList
+} UEContextReleaseRequest_IEs__value_PR;
+typedef enum UEContextReleaseCommand_IEs__value_PR {
+	UEContextReleaseCommand_IEs__value_PR_NOTHING,	/* No components present */
+	UEContextReleaseCommand_IEs__value_PR_UE_S1AP_IDs,
+	UEContextReleaseCommand_IEs__value_PR_Cause
+} UEContextReleaseCommand_IEs__value_PR;
+typedef enum UEContextReleaseComplete_IEs__value_PR {
+	UEContextReleaseComplete_IEs__value_PR_NOTHING,	/* No components present */
+	UEContextReleaseComplete_IEs__value_PR_MME_UE_S1AP_ID,
+	UEContextReleaseComplete_IEs__value_PR_ENB_UE_S1AP_ID,
+	UEContextReleaseComplete_IEs__value_PR_CriticalityDiagnostics,
+	UEContextReleaseComplete_IEs__value_PR_UserLocationInformation,
+	UEContextReleaseComplete_IEs__value_PR_InformationOnRecommendedCellsAndENBsForPaging,
+	UEContextReleaseComplete_IEs__value_PR_CellIdentifierAndCELevelForCECapableUEs,
+	UEContextReleaseComplete_IEs__value_PR_SecondaryRATDataUsageReportList,
+	UEContextReleaseComplete_IEs__value_PR_TimeSinceSecondaryNodeRelease
+} UEContextReleaseComplete_IEs__value_PR;
+typedef enum UEContextModificationRequestIEs__value_PR {
+	UEContextModificationRequestIEs__value_PR_NOTHING,	/* No components present */
+	UEContextModificationRequestIEs__value_PR_MME_UE_S1AP_ID,
+	UEContextModificationRequestIEs__value_PR_ENB_UE_S1AP_ID,
+	UEContextModificationRequestIEs__value_PR_SecurityKey,
+	UEContextModificationRequestIEs__value_PR_SubscriberProfileIDforRFP,
+	UEContextModificationRequestIEs__value_PR_UEAggregateMaximumBitrate,
+	UEContextModificationRequestIEs__value_PR_CSFallbackIndicator,
+	UEContextModificationRequestIEs__value_PR_UESecurityCapabilities,
+	UEContextModificationRequestIEs__value_PR_CSGMembershipStatus,
+	UEContextModificationRequestIEs__value_PR_LAI,
+	UEContextModificationRequestIEs__value_PR_AdditionalCSFallbackIndicator,
+	UEContextModificationRequestIEs__value_PR_ProSeAuthorized,
+	UEContextModificationRequestIEs__value_PR_SRVCCOperationPossible,
+	UEContextModificationRequestIEs__value_PR_SRVCCOperationNotPossible,
+	UEContextModificationRequestIEs__value_PR_V2XServicesAuthorized,
+	UEContextModificationRequestIEs__value_PR_UESidelinkAggregateMaximumBitrate,
+	UEContextModificationRequestIEs__value_PR_NRUESecurityCapabilities,
+	UEContextModificationRequestIEs__value_PR_AerialUEsubscriptionInformation
+} UEContextModificationRequestIEs__value_PR;
+typedef enum UEContextModificationResponseIEs__value_PR {
+	UEContextModificationResponseIEs__value_PR_NOTHING,	/* No components present */
+	UEContextModificationResponseIEs__value_PR_MME_UE_S1AP_ID,
+	UEContextModificationResponseIEs__value_PR_ENB_UE_S1AP_ID,
+	UEContextModificationResponseIEs__value_PR_CriticalityDiagnostics
+} UEContextModificationResponseIEs__value_PR;
+typedef enum UEContextModificationFailureIEs__value_PR {
+	UEContextModificationFailureIEs__value_PR_NOTHING,	/* No components present */
+	UEContextModificationFailureIEs__value_PR_MME_UE_S1AP_ID,
+	UEContextModificationFailureIEs__value_PR_ENB_UE_S1AP_ID,
+	UEContextModificationFailureIEs__value_PR_Cause,
+	UEContextModificationFailureIEs__value_PR_CriticalityDiagnostics
+} UEContextModificationFailureIEs__value_PR;
+typedef enum UERadioCapabilityMatchRequestIEs__value_PR {
+	UERadioCapabilityMatchRequestIEs__value_PR_NOTHING,	/* No components present */
+	UERadioCapabilityMatchRequestIEs__value_PR_MME_UE_S1AP_ID,
+	UERadioCapabilityMatchRequestIEs__value_PR_ENB_UE_S1AP_ID,
+	UERadioCapabilityMatchRequestIEs__value_PR_UERadioCapability
+} UERadioCapabilityMatchRequestIEs__value_PR;
+typedef enum UERadioCapabilityMatchResponseIEs__value_PR {
+	UERadioCapabilityMatchResponseIEs__value_PR_NOTHING,	/* No components present */
+	UERadioCapabilityMatchResponseIEs__value_PR_MME_UE_S1AP_ID,
+	UERadioCapabilityMatchResponseIEs__value_PR_ENB_UE_S1AP_ID,
+	UERadioCapabilityMatchResponseIEs__value_PR_VoiceSupportMatchIndicator,
+	UERadioCapabilityMatchResponseIEs__value_PR_CriticalityDiagnostics
+} UERadioCapabilityMatchResponseIEs__value_PR;
+typedef enum DownlinkNASTransport_IEs__value_PR {
+	DownlinkNASTransport_IEs__value_PR_NOTHING,	/* No components present */
+	DownlinkNASTransport_IEs__value_PR_MME_UE_S1AP_ID,
+	DownlinkNASTransport_IEs__value_PR_ENB_UE_S1AP_ID,
+	DownlinkNASTransport_IEs__value_PR_NAS_PDU,
+	DownlinkNASTransport_IEs__value_PR_HandoverRestrictionList,
+	DownlinkNASTransport_IEs__value_PR_SubscriberProfileIDforRFP,
+	DownlinkNASTransport_IEs__value_PR_SRVCCOperationPossible,
+	DownlinkNASTransport_IEs__value_PR_UERadioCapability,
+	DownlinkNASTransport_IEs__value_PR_DLNASPDUDeliveryAckRequest,
+	DownlinkNASTransport_IEs__value_PR_EnhancedCoverageRestricted,
+	DownlinkNASTransport_IEs__value_PR_NRUESecurityCapabilities,
+	DownlinkNASTransport_IEs__value_PR_CE_ModeBRestricted,
+	DownlinkNASTransport_IEs__value_PR_UECapabilityInfoRequest,
+	DownlinkNASTransport_IEs__value_PR_EndIndication,
+	DownlinkNASTransport_IEs__value_PR_PendingDataIndication,
+	DownlinkNASTransport_IEs__value_PR_Subscription_Based_UE_DifferentiationInfo
+} DownlinkNASTransport_IEs__value_PR;
+typedef enum InitialUEMessage_IEs__value_PR {
+	InitialUEMessage_IEs__value_PR_NOTHING,	/* No components present */
+	InitialUEMessage_IEs__value_PR_ENB_UE_S1AP_ID,
+	InitialUEMessage_IEs__value_PR_NAS_PDU,
+	InitialUEMessage_IEs__value_PR_TAI,
+	InitialUEMessage_IEs__value_PR_EUTRAN_CGI,
+	InitialUEMessage_IEs__value_PR_RRC_Establishment_Cause,
+	InitialUEMessage_IEs__value_PR_S_TMSI,
+	InitialUEMessage_IEs__value_PR_CSG_Id,
+	InitialUEMessage_IEs__value_PR_GUMMEI,
+	InitialUEMessage_IEs__value_PR_CellAccessMode,
+	InitialUEMessage_IEs__value_PR_TransportLayerAddress,
+	InitialUEMessage_IEs__value_PR_RelayNode_Indicator,
+	InitialUEMessage_IEs__value_PR_GUMMEIType,
+	InitialUEMessage_IEs__value_PR_TunnelInformation,
+	InitialUEMessage_IEs__value_PR_TransportLayerAddress_1,
+	InitialUEMessage_IEs__value_PR_LHN_ID,
+	InitialUEMessage_IEs__value_PR_MME_Group_ID,
+	InitialUEMessage_IEs__value_PR_UE_Usage_Type,
+	InitialUEMessage_IEs__value_PR_CE_mode_B_SupportIndicator,
+	InitialUEMessage_IEs__value_PR_DCN_ID,
+	InitialUEMessage_IEs__value_PR_Coverage_Level,
+	InitialUEMessage_IEs__value_PR_UE_Application_Layer_Measurement_Capability,
+	InitialUEMessage_IEs__value_PR_EDT_Session
+} InitialUEMessage_IEs__value_PR;
+typedef enum UplinkNASTransport_IEs__value_PR {
+	UplinkNASTransport_IEs__value_PR_NOTHING,	/* No components present */
+	UplinkNASTransport_IEs__value_PR_MME_UE_S1AP_ID,
+	UplinkNASTransport_IEs__value_PR_ENB_UE_S1AP_ID,
+	UplinkNASTransport_IEs__value_PR_NAS_PDU,
+	UplinkNASTransport_IEs__value_PR_EUTRAN_CGI,
+	UplinkNASTransport_IEs__value_PR_TAI,
+	UplinkNASTransport_IEs__value_PR_TransportLayerAddress,
+	UplinkNASTransport_IEs__value_PR_TransportLayerAddress_1,
+	UplinkNASTransport_IEs__value_PR_LHN_ID,
+	UplinkNASTransport_IEs__value_PR_PSCellInformation
+} UplinkNASTransport_IEs__value_PR;
+typedef enum NASNonDeliveryIndication_IEs__value_PR {
+	NASNonDeliveryIndication_IEs__value_PR_NOTHING,	/* No components present */
+	NASNonDeliveryIndication_IEs__value_PR_MME_UE_S1AP_ID,
+	NASNonDeliveryIndication_IEs__value_PR_ENB_UE_S1AP_ID,
+	NASNonDeliveryIndication_IEs__value_PR_NAS_PDU,
+	NASNonDeliveryIndication_IEs__value_PR_Cause
+} NASNonDeliveryIndication_IEs__value_PR;
+typedef enum RerouteNASRequest_IEs__value_PR {
+	RerouteNASRequest_IEs__value_PR_NOTHING,	/* No components present */
+	RerouteNASRequest_IEs__value_PR_ENB_UE_S1AP_ID,
+	RerouteNASRequest_IEs__value_PR_MME_UE_S1AP_ID,
+	RerouteNASRequest_IEs__value_PR_OCTET_STRING,
+	RerouteNASRequest_IEs__value_PR_MME_Group_ID,
+	RerouteNASRequest_IEs__value_PR_Additional_GUTI,
+	RerouteNASRequest_IEs__value_PR_UE_Usage_Type
+} RerouteNASRequest_IEs__value_PR;
+typedef enum NASDeliveryIndicationIEs__value_PR {
+	NASDeliveryIndicationIEs__value_PR_NOTHING,	/* No components present */
+	NASDeliveryIndicationIEs__value_PR_MME_UE_S1AP_ID,
+	NASDeliveryIndicationIEs__value_PR_ENB_UE_S1AP_ID
+} NASDeliveryIndicationIEs__value_PR;
+typedef enum ResetIEs__value_PR {
+	ResetIEs__value_PR_NOTHING,	/* No components present */
+	ResetIEs__value_PR_Cause,
+	ResetIEs__value_PR_ResetType
+} ResetIEs__value_PR;
+typedef enum ResetAcknowledgeIEs__value_PR {
+	ResetAcknowledgeIEs__value_PR_NOTHING,	/* No components present */
+	ResetAcknowledgeIEs__value_PR_UE_associatedLogicalS1_ConnectionListResAck,
+	ResetAcknowledgeIEs__value_PR_CriticalityDiagnostics
+} ResetAcknowledgeIEs__value_PR;
+typedef enum ErrorIndicationIEs__value_PR {
+	ErrorIndicationIEs__value_PR_NOTHING,	/* No components present */
+	ErrorIndicationIEs__value_PR_MME_UE_S1AP_ID,
+	ErrorIndicationIEs__value_PR_ENB_UE_S1AP_ID,
+	ErrorIndicationIEs__value_PR_Cause,
+	ErrorIndicationIEs__value_PR_CriticalityDiagnostics
+} ErrorIndicationIEs__value_PR;
+typedef enum S1SetupRequestIEs__value_PR {
+	S1SetupRequestIEs__value_PR_NOTHING,	/* No components present */
+	S1SetupRequestIEs__value_PR_Global_ENB_ID,
+	S1SetupRequestIEs__value_PR_ENBname,
+	S1SetupRequestIEs__value_PR_SupportedTAs,
+	S1SetupRequestIEs__value_PR_PagingDRX,
+	S1SetupRequestIEs__value_PR_CSG_IdList,
+	S1SetupRequestIEs__value_PR_UE_RetentionInformation,
+	S1SetupRequestIEs__value_PR_NB_IoT_DefaultPagingDRX,
+	S1SetupRequestIEs__value_PR_ConnectedengNBList
+} S1SetupRequestIEs__value_PR;
+typedef enum S1SetupResponseIEs__value_PR {
+	S1SetupResponseIEs__value_PR_NOTHING,	/* No components present */
+	S1SetupResponseIEs__value_PR_MMEname,
+	S1SetupResponseIEs__value_PR_ServedGUMMEIs,
+	S1SetupResponseIEs__value_PR_RelativeMMECapacity,
+	S1SetupResponseIEs__value_PR_MMERelaySupportIndicator,
+	S1SetupResponseIEs__value_PR_CriticalityDiagnostics,
+	S1SetupResponseIEs__value_PR_UE_RetentionInformation,
+	S1SetupResponseIEs__value_PR_ServedDCNs
+} S1SetupResponseIEs__value_PR;
+typedef enum S1SetupFailureIEs__value_PR {
+	S1SetupFailureIEs__value_PR_NOTHING,	/* No components present */
+	S1SetupFailureIEs__value_PR_Cause,
+	S1SetupFailureIEs__value_PR_TimeToWait,
+	S1SetupFailureIEs__value_PR_CriticalityDiagnostics
+} S1SetupFailureIEs__value_PR;
+typedef enum ENBConfigurationUpdateIEs__value_PR {
+	ENBConfigurationUpdateIEs__value_PR_NOTHING,	/* No components present */
+	ENBConfigurationUpdateIEs__value_PR_ENBname,
+	ENBConfigurationUpdateIEs__value_PR_SupportedTAs,
+	ENBConfigurationUpdateIEs__value_PR_CSG_IdList,
+	ENBConfigurationUpdateIEs__value_PR_PagingDRX,
+	ENBConfigurationUpdateIEs__value_PR_NB_IoT_DefaultPagingDRX,
+	ENBConfigurationUpdateIEs__value_PR_ConnectedengNBList,
+	ENBConfigurationUpdateIEs__value_PR_ConnectedengNBList_1
+} ENBConfigurationUpdateIEs__value_PR;
+typedef enum ENBConfigurationUpdateAcknowledgeIEs__value_PR {
+	ENBConfigurationUpdateAcknowledgeIEs__value_PR_NOTHING,	/* No components present */
+	ENBConfigurationUpdateAcknowledgeIEs__value_PR_CriticalityDiagnostics
+} ENBConfigurationUpdateAcknowledgeIEs__value_PR;
+typedef enum ENBConfigurationUpdateFailureIEs__value_PR {
+	ENBConfigurationUpdateFailureIEs__value_PR_NOTHING,	/* No components present */
+	ENBConfigurationUpdateFailureIEs__value_PR_Cause,
+	ENBConfigurationUpdateFailureIEs__value_PR_TimeToWait,
+	ENBConfigurationUpdateFailureIEs__value_PR_CriticalityDiagnostics
+} ENBConfigurationUpdateFailureIEs__value_PR;
+typedef enum MMEConfigurationUpdateIEs__value_PR {
+	MMEConfigurationUpdateIEs__value_PR_NOTHING,	/* No components present */
+	MMEConfigurationUpdateIEs__value_PR_MMEname,
+	MMEConfigurationUpdateIEs__value_PR_ServedGUMMEIs,
+	MMEConfigurationUpdateIEs__value_PR_RelativeMMECapacity,
+	MMEConfigurationUpdateIEs__value_PR_ServedDCNs
+} MMEConfigurationUpdateIEs__value_PR;
+typedef enum MMEConfigurationUpdateAcknowledgeIEs__value_PR {
+	MMEConfigurationUpdateAcknowledgeIEs__value_PR_NOTHING,	/* No components present */
+	MMEConfigurationUpdateAcknowledgeIEs__value_PR_CriticalityDiagnostics
+} MMEConfigurationUpdateAcknowledgeIEs__value_PR;
+typedef enum MMEConfigurationUpdateFailureIEs__value_PR {
+	MMEConfigurationUpdateFailureIEs__value_PR_NOTHING,	/* No components present */
+	MMEConfigurationUpdateFailureIEs__value_PR_Cause,
+	MMEConfigurationUpdateFailureIEs__value_PR_TimeToWait,
+	MMEConfigurationUpdateFailureIEs__value_PR_CriticalityDiagnostics
+} MMEConfigurationUpdateFailureIEs__value_PR;
+typedef enum DownlinkS1cdma2000tunnellingIEs__value_PR {
+	DownlinkS1cdma2000tunnellingIEs__value_PR_NOTHING,	/* No components present */
+	DownlinkS1cdma2000tunnellingIEs__value_PR_MME_UE_S1AP_ID,
+	DownlinkS1cdma2000tunnellingIEs__value_PR_ENB_UE_S1AP_ID,
+	DownlinkS1cdma2000tunnellingIEs__value_PR_E_RABSubjecttoDataForwardingList,
+	DownlinkS1cdma2000tunnellingIEs__value_PR_Cdma2000HOStatus,
+	DownlinkS1cdma2000tunnellingIEs__value_PR_Cdma2000RATType,
+	DownlinkS1cdma2000tunnellingIEs__value_PR_Cdma2000PDU
+} DownlinkS1cdma2000tunnellingIEs__value_PR;
+typedef enum UplinkS1cdma2000tunnellingIEs__value_PR {
+	UplinkS1cdma2000tunnellingIEs__value_PR_NOTHING,	/* No components present */
+	UplinkS1cdma2000tunnellingIEs__value_PR_MME_UE_S1AP_ID,
+	UplinkS1cdma2000tunnellingIEs__value_PR_ENB_UE_S1AP_ID,
+	UplinkS1cdma2000tunnellingIEs__value_PR_Cdma2000RATType,
+	UplinkS1cdma2000tunnellingIEs__value_PR_Cdma2000SectorID,
+	UplinkS1cdma2000tunnellingIEs__value_PR_Cdma2000HORequiredIndication,
+	UplinkS1cdma2000tunnellingIEs__value_PR_Cdma2000OneXSRVCCInfo,
+	UplinkS1cdma2000tunnellingIEs__value_PR_Cdma2000OneXRAND,
+	UplinkS1cdma2000tunnellingIEs__value_PR_Cdma2000PDU,
+	UplinkS1cdma2000tunnellingIEs__value_PR_EUTRANRoundTripDelayEstimationInfo
+} UplinkS1cdma2000tunnellingIEs__value_PR;
+typedef enum UECapabilityInfoIndicationIEs__value_PR {
+	UECapabilityInfoIndicationIEs__value_PR_NOTHING,	/* No components present */
+	UECapabilityInfoIndicationIEs__value_PR_MME_UE_S1AP_ID,
+	UECapabilityInfoIndicationIEs__value_PR_ENB_UE_S1AP_ID,
+	UECapabilityInfoIndicationIEs__value_PR_UERadioCapability,
+	UECapabilityInfoIndicationIEs__value_PR_UERadioCapabilityForPaging,
+	UECapabilityInfoIndicationIEs__value_PR_UE_Application_Layer_Measurement_Capability,
+	UECapabilityInfoIndicationIEs__value_PR_LTE_M_Indication
+} UECapabilityInfoIndicationIEs__value_PR;
+typedef enum ENBStatusTransferIEs__value_PR {
+	ENBStatusTransferIEs__value_PR_NOTHING,	/* No components present */
+	ENBStatusTransferIEs__value_PR_MME_UE_S1AP_ID,
+	ENBStatusTransferIEs__value_PR_ENB_UE_S1AP_ID,
+	ENBStatusTransferIEs__value_PR_ENB_StatusTransfer_TransparentContainer
+} ENBStatusTransferIEs__value_PR;
+typedef enum MMEStatusTransferIEs__value_PR {
+	MMEStatusTransferIEs__value_PR_NOTHING,	/* No components present */
+	MMEStatusTransferIEs__value_PR_MME_UE_S1AP_ID,
+	MMEStatusTransferIEs__value_PR_ENB_UE_S1AP_ID,
+	MMEStatusTransferIEs__value_PR_ENB_StatusTransfer_TransparentContainer
+} MMEStatusTransferIEs__value_PR;
+typedef enum TraceStartIEs__value_PR {
+	TraceStartIEs__value_PR_NOTHING,	/* No components present */
+	TraceStartIEs__value_PR_MME_UE_S1AP_ID,
+	TraceStartIEs__value_PR_ENB_UE_S1AP_ID,
+	TraceStartIEs__value_PR_TraceActivation
+} TraceStartIEs__value_PR;
+typedef enum TraceFailureIndicationIEs__value_PR {
+	TraceFailureIndicationIEs__value_PR_NOTHING,	/* No components present */
+	TraceFailureIndicationIEs__value_PR_MME_UE_S1AP_ID,
+	TraceFailureIndicationIEs__value_PR_ENB_UE_S1AP_ID,
+	TraceFailureIndicationIEs__value_PR_E_UTRAN_Trace_ID,
+	TraceFailureIndicationIEs__value_PR_Cause
+} TraceFailureIndicationIEs__value_PR;
+typedef enum DeactivateTraceIEs__value_PR {
+	DeactivateTraceIEs__value_PR_NOTHING,	/* No components present */
+	DeactivateTraceIEs__value_PR_MME_UE_S1AP_ID,
+	DeactivateTraceIEs__value_PR_ENB_UE_S1AP_ID,
+	DeactivateTraceIEs__value_PR_E_UTRAN_Trace_ID
+} DeactivateTraceIEs__value_PR;
+typedef enum CellTrafficTraceIEs__value_PR {
+	CellTrafficTraceIEs__value_PR_NOTHING,	/* No components present */
+	CellTrafficTraceIEs__value_PR_MME_UE_S1AP_ID,
+	CellTrafficTraceIEs__value_PR_ENB_UE_S1AP_ID,
+	CellTrafficTraceIEs__value_PR_E_UTRAN_Trace_ID,
+	CellTrafficTraceIEs__value_PR_EUTRAN_CGI,
+	CellTrafficTraceIEs__value_PR_TransportLayerAddress,
+	CellTrafficTraceIEs__value_PR_PrivacyIndicator
+} CellTrafficTraceIEs__value_PR;
+typedef enum LocationReportingControlIEs__value_PR {
+	LocationReportingControlIEs__value_PR_NOTHING,	/* No components present */
+	LocationReportingControlIEs__value_PR_MME_UE_S1AP_ID,
+	LocationReportingControlIEs__value_PR_ENB_UE_S1AP_ID,
+	LocationReportingControlIEs__value_PR_RequestType
+} LocationReportingControlIEs__value_PR;
+typedef enum LocationReportingFailureIndicationIEs__value_PR {
+	LocationReportingFailureIndicationIEs__value_PR_NOTHING,	/* No components present */
+	LocationReportingFailureIndicationIEs__value_PR_MME_UE_S1AP_ID,
+	LocationReportingFailureIndicationIEs__value_PR_ENB_UE_S1AP_ID,
+	LocationReportingFailureIndicationIEs__value_PR_Cause
+} LocationReportingFailureIndicationIEs__value_PR;
+typedef enum LocationReportIEs__value_PR {
+	LocationReportIEs__value_PR_NOTHING,	/* No components present */
+	LocationReportIEs__value_PR_MME_UE_S1AP_ID,
+	LocationReportIEs__value_PR_ENB_UE_S1AP_ID,
+	LocationReportIEs__value_PR_EUTRAN_CGI,
+	LocationReportIEs__value_PR_TAI,
+	LocationReportIEs__value_PR_RequestType,
+	LocationReportIEs__value_PR_PSCellInformation
+} LocationReportIEs__value_PR;
+typedef enum OverloadStartIEs__value_PR {
+	OverloadStartIEs__value_PR_NOTHING,	/* No components present */
+	OverloadStartIEs__value_PR_OverloadResponse,
+	OverloadStartIEs__value_PR_GUMMEIList,
+	OverloadStartIEs__value_PR_TrafficLoadReductionIndication
+} OverloadStartIEs__value_PR;
+typedef enum OverloadStopIEs__value_PR {
+	OverloadStopIEs__value_PR_NOTHING,	/* No components present */
+	OverloadStopIEs__value_PR_GUMMEIList
+} OverloadStopIEs__value_PR;
+typedef enum WriteReplaceWarningRequestIEs__value_PR {
+	WriteReplaceWarningRequestIEs__value_PR_NOTHING,	/* No components present */
+	WriteReplaceWarningRequestIEs__value_PR_MessageIdentifier,
+	WriteReplaceWarningRequestIEs__value_PR_SerialNumber,
+	WriteReplaceWarningRequestIEs__value_PR_WarningAreaList,
+	WriteReplaceWarningRequestIEs__value_PR_RepetitionPeriod,
+	WriteReplaceWarningRequestIEs__value_PR_ExtendedRepetitionPeriod,
+	WriteReplaceWarningRequestIEs__value_PR_NumberofBroadcastRequest,
+	WriteReplaceWarningRequestIEs__value_PR_WarningType,
+	WriteReplaceWarningRequestIEs__value_PR_WarningSecurityInfo,
+	WriteReplaceWarningRequestIEs__value_PR_DataCodingScheme,
+	WriteReplaceWarningRequestIEs__value_PR_WarningMessageContents,
+	WriteReplaceWarningRequestIEs__value_PR_ConcurrentWarningMessageIndicator,
+	WriteReplaceWarningRequestIEs__value_PR_WarningAreaCoordinates
+} WriteReplaceWarningRequestIEs__value_PR;
+typedef enum WriteReplaceWarningResponseIEs__value_PR {
+	WriteReplaceWarningResponseIEs__value_PR_NOTHING,	/* No components present */
+	WriteReplaceWarningResponseIEs__value_PR_MessageIdentifier,
+	WriteReplaceWarningResponseIEs__value_PR_SerialNumber,
+	WriteReplaceWarningResponseIEs__value_PR_BroadcastCompletedAreaList,
+	WriteReplaceWarningResponseIEs__value_PR_CriticalityDiagnostics
+} WriteReplaceWarningResponseIEs__value_PR;
+typedef enum ENBDirectInformationTransferIEs__value_PR {
+	ENBDirectInformationTransferIEs__value_PR_NOTHING,	/* No components present */
+	ENBDirectInformationTransferIEs__value_PR_Inter_SystemInformationTransferType
+} ENBDirectInformationTransferIEs__value_PR;
+typedef enum MMEDirectInformationTransferIEs__value_PR {
+	MMEDirectInformationTransferIEs__value_PR_NOTHING,	/* No components present */
+	MMEDirectInformationTransferIEs__value_PR_Inter_SystemInformationTransferType
+} MMEDirectInformationTransferIEs__value_PR;
+typedef enum ENBConfigurationTransferIEs__value_PR {
+	ENBConfigurationTransferIEs__value_PR_NOTHING,	/* No components present */
+	ENBConfigurationTransferIEs__value_PR_SONConfigurationTransfer,
+	ENBConfigurationTransferIEs__value_PR_EN_DCSONConfigurationTransfer
+} ENBConfigurationTransferIEs__value_PR;
+typedef enum MMEConfigurationTransferIEs__value_PR {
+	MMEConfigurationTransferIEs__value_PR_NOTHING,	/* No components present */
+	MMEConfigurationTransferIEs__value_PR_SONConfigurationTransfer,
+	MMEConfigurationTransferIEs__value_PR_EN_DCSONConfigurationTransfer
+} MMEConfigurationTransferIEs__value_PR;
+typedef enum KillRequestIEs__value_PR {
+	KillRequestIEs__value_PR_NOTHING,	/* No components present */
+	KillRequestIEs__value_PR_MessageIdentifier,
+	KillRequestIEs__value_PR_SerialNumber,
+	KillRequestIEs__value_PR_WarningAreaList,
+	KillRequestIEs__value_PR_KillAllWarningMessages
+} KillRequestIEs__value_PR;
+typedef enum KillResponseIEs__value_PR {
+	KillResponseIEs__value_PR_NOTHING,	/* No components present */
+	KillResponseIEs__value_PR_MessageIdentifier,
+	KillResponseIEs__value_PR_SerialNumber,
+	KillResponseIEs__value_PR_BroadcastCancelledAreaList,
+	KillResponseIEs__value_PR_CriticalityDiagnostics
+} KillResponseIEs__value_PR;
+typedef enum PWSRestartIndicationIEs__value_PR {
+	PWSRestartIndicationIEs__value_PR_NOTHING,	/* No components present */
+	PWSRestartIndicationIEs__value_PR_ECGIListForRestart,
+	PWSRestartIndicationIEs__value_PR_Global_ENB_ID,
+	PWSRestartIndicationIEs__value_PR_TAIListForRestart,
+	PWSRestartIndicationIEs__value_PR_EmergencyAreaIDListForRestart
+} PWSRestartIndicationIEs__value_PR;
+typedef enum PWSFailureIndicationIEs__value_PR {
+	PWSFailureIndicationIEs__value_PR_NOTHING,	/* No components present */
+	PWSFailureIndicationIEs__value_PR_PWSfailedECGIList,
+	PWSFailureIndicationIEs__value_PR_Global_ENB_ID
+} PWSFailureIndicationIEs__value_PR;
+typedef enum DownlinkUEAssociatedLPPaTransport_IEs__value_PR {
+	DownlinkUEAssociatedLPPaTransport_IEs__value_PR_NOTHING,	/* No components present */
+	DownlinkUEAssociatedLPPaTransport_IEs__value_PR_MME_UE_S1AP_ID,
+	DownlinkUEAssociatedLPPaTransport_IEs__value_PR_ENB_UE_S1AP_ID,
+	DownlinkUEAssociatedLPPaTransport_IEs__value_PR_Routing_ID,
+	DownlinkUEAssociatedLPPaTransport_IEs__value_PR_LPPa_PDU
+} DownlinkUEAssociatedLPPaTransport_IEs__value_PR;
+typedef enum UplinkUEAssociatedLPPaTransport_IEs__value_PR {
+	UplinkUEAssociatedLPPaTransport_IEs__value_PR_NOTHING,	/* No components present */
+	UplinkUEAssociatedLPPaTransport_IEs__value_PR_MME_UE_S1AP_ID,
+	UplinkUEAssociatedLPPaTransport_IEs__value_PR_ENB_UE_S1AP_ID,
+	UplinkUEAssociatedLPPaTransport_IEs__value_PR_Routing_ID,
+	UplinkUEAssociatedLPPaTransport_IEs__value_PR_LPPa_PDU
+} UplinkUEAssociatedLPPaTransport_IEs__value_PR;
+typedef enum DownlinkNonUEAssociatedLPPaTransport_IEs__value_PR {
+	DownlinkNonUEAssociatedLPPaTransport_IEs__value_PR_NOTHING,	/* No components present */
+	DownlinkNonUEAssociatedLPPaTransport_IEs__value_PR_Routing_ID,
+	DownlinkNonUEAssociatedLPPaTransport_IEs__value_PR_LPPa_PDU
+} DownlinkNonUEAssociatedLPPaTransport_IEs__value_PR;
+typedef enum UplinkNonUEAssociatedLPPaTransport_IEs__value_PR {
+	UplinkNonUEAssociatedLPPaTransport_IEs__value_PR_NOTHING,	/* No components present */
+	UplinkNonUEAssociatedLPPaTransport_IEs__value_PR_Routing_ID,
+	UplinkNonUEAssociatedLPPaTransport_IEs__value_PR_LPPa_PDU
+} UplinkNonUEAssociatedLPPaTransport_IEs__value_PR;
+typedef enum E_RABModificationIndicationIEs__value_PR {
+	E_RABModificationIndicationIEs__value_PR_NOTHING,	/* No components present */
+	E_RABModificationIndicationIEs__value_PR_MME_UE_S1AP_ID,
+	E_RABModificationIndicationIEs__value_PR_ENB_UE_S1AP_ID,
+	E_RABModificationIndicationIEs__value_PR_E_RABToBeModifiedListBearerModInd,
+	E_RABModificationIndicationIEs__value_PR_E_RABNotToBeModifiedListBearerModInd,
+	E_RABModificationIndicationIEs__value_PR_CSGMembershipInfo,
+	E_RABModificationIndicationIEs__value_PR_TunnelInformation,
+	E_RABModificationIndicationIEs__value_PR_SecondaryRATDataUsageReportList
+} E_RABModificationIndicationIEs__value_PR;
+typedef enum E_RABModificationConfirmIEs__value_PR {
+	E_RABModificationConfirmIEs__value_PR_NOTHING,	/* No components present */
+	E_RABModificationConfirmIEs__value_PR_MME_UE_S1AP_ID,
+	E_RABModificationConfirmIEs__value_PR_ENB_UE_S1AP_ID,
+	E_RABModificationConfirmIEs__value_PR_E_RABModifyListBearerModConf,
+	E_RABModificationConfirmIEs__value_PR_E_RABList,
+	E_RABModificationConfirmIEs__value_PR_E_RABList_1,
+	E_RABModificationConfirmIEs__value_PR_CriticalityDiagnostics,
+	E_RABModificationConfirmIEs__value_PR_CSGMembershipStatus
+} E_RABModificationConfirmIEs__value_PR;
+typedef enum UEContextModificationIndicationIEs__value_PR {
+	UEContextModificationIndicationIEs__value_PR_NOTHING,	/* No components present */
+	UEContextModificationIndicationIEs__value_PR_MME_UE_S1AP_ID,
+	UEContextModificationIndicationIEs__value_PR_ENB_UE_S1AP_ID,
+	UEContextModificationIndicationIEs__value_PR_CSGMembershipInfo
+} UEContextModificationIndicationIEs__value_PR;
+typedef enum UEContextModificationConfirmIEs__value_PR {
+	UEContextModificationConfirmIEs__value_PR_NOTHING,	/* No components present */
+	UEContextModificationConfirmIEs__value_PR_MME_UE_S1AP_ID,
+	UEContextModificationConfirmIEs__value_PR_ENB_UE_S1AP_ID,
+	UEContextModificationConfirmIEs__value_PR_CSGMembershipStatus,
+	UEContextModificationConfirmIEs__value_PR_CriticalityDiagnostics
+} UEContextModificationConfirmIEs__value_PR;
+typedef enum UEContextSuspendRequestIEs__value_PR {
+	UEContextSuspendRequestIEs__value_PR_NOTHING,	/* No components present */
+	UEContextSuspendRequestIEs__value_PR_MME_UE_S1AP_ID,
+	UEContextSuspendRequestIEs__value_PR_ENB_UE_S1AP_ID,
+	UEContextSuspendRequestIEs__value_PR_InformationOnRecommendedCellsAndENBsForPaging,
+	UEContextSuspendRequestIEs__value_PR_CellIdentifierAndCELevelForCECapableUEs,
+	UEContextSuspendRequestIEs__value_PR_SecondaryRATDataUsageReportList,
+	UEContextSuspendRequestIEs__value_PR_UserLocationInformation,
+	UEContextSuspendRequestIEs__value_PR_TimeSinceSecondaryNodeRelease
+} UEContextSuspendRequestIEs__value_PR;
+typedef enum UEContextSuspendResponseIEs__value_PR {
+	UEContextSuspendResponseIEs__value_PR_NOTHING,	/* No components present */
+	UEContextSuspendResponseIEs__value_PR_MME_UE_S1AP_ID,
+	UEContextSuspendResponseIEs__value_PR_ENB_UE_S1AP_ID,
+	UEContextSuspendResponseIEs__value_PR_CriticalityDiagnostics,
+	UEContextSuspendResponseIEs__value_PR_SecurityContext
+} UEContextSuspendResponseIEs__value_PR;
+typedef enum UEContextResumeRequestIEs__value_PR {
+	UEContextResumeRequestIEs__value_PR_NOTHING,	/* No components present */
+	UEContextResumeRequestIEs__value_PR_MME_UE_S1AP_ID,
+	UEContextResumeRequestIEs__value_PR_ENB_UE_S1AP_ID,
+	UEContextResumeRequestIEs__value_PR_E_RABFailedToResumeListResumeReq,
+	UEContextResumeRequestIEs__value_PR_RRC_Establishment_Cause
+} UEContextResumeRequestIEs__value_PR;
+typedef enum UEContextResumeResponseIEs__value_PR {
+	UEContextResumeResponseIEs__value_PR_NOTHING,	/* No components present */
+	UEContextResumeResponseIEs__value_PR_MME_UE_S1AP_ID,
+	UEContextResumeResponseIEs__value_PR_ENB_UE_S1AP_ID,
+	UEContextResumeResponseIEs__value_PR_E_RABFailedToResumeListResumeRes,
+	UEContextResumeResponseIEs__value_PR_CriticalityDiagnostics,
+	UEContextResumeResponseIEs__value_PR_SecurityContext,
+	UEContextResumeResponseIEs__value_PR_PendingDataIndication
+} UEContextResumeResponseIEs__value_PR;
+typedef enum UEContextResumeFailureIEs__value_PR {
+	UEContextResumeFailureIEs__value_PR_NOTHING,	/* No components present */
+	UEContextResumeFailureIEs__value_PR_MME_UE_S1AP_ID,
+	UEContextResumeFailureIEs__value_PR_ENB_UE_S1AP_ID,
+	UEContextResumeFailureIEs__value_PR_Cause,
+	UEContextResumeFailureIEs__value_PR_CriticalityDiagnostics
+} UEContextResumeFailureIEs__value_PR;
+typedef enum ConnectionEstablishmentIndicationIEs__value_PR {
+	ConnectionEstablishmentIndicationIEs__value_PR_NOTHING,	/* No components present */
+	ConnectionEstablishmentIndicationIEs__value_PR_MME_UE_S1AP_ID,
+	ConnectionEstablishmentIndicationIEs__value_PR_ENB_UE_S1AP_ID,
+	ConnectionEstablishmentIndicationIEs__value_PR_UERadioCapability,
+	ConnectionEstablishmentIndicationIEs__value_PR_EnhancedCoverageRestricted,
+	ConnectionEstablishmentIndicationIEs__value_PR_DL_CP_SecurityInformation,
+	ConnectionEstablishmentIndicationIEs__value_PR_CE_ModeBRestricted,
+	ConnectionEstablishmentIndicationIEs__value_PR_EndIndication,
+	ConnectionEstablishmentIndicationIEs__value_PR_Subscription_Based_UE_DifferentiationInfo
+} ConnectionEstablishmentIndicationIEs__value_PR;
+typedef enum RetrieveUEInformationIEs__value_PR {
+	RetrieveUEInformationIEs__value_PR_NOTHING,	/* No components present */
+	RetrieveUEInformationIEs__value_PR_S_TMSI
+} RetrieveUEInformationIEs__value_PR;
+typedef enum UEInformationTransferIEs__value_PR {
+	UEInformationTransferIEs__value_PR_NOTHING,	/* No components present */
+	UEInformationTransferIEs__value_PR_S_TMSI,
+	UEInformationTransferIEs__value_PR_E_RABLevelQoSParameters,
+	UEInformationTransferIEs__value_PR_UERadioCapability,
+	UEInformationTransferIEs__value_PR_Subscription_Based_UE_DifferentiationInfo,
+	UEInformationTransferIEs__value_PR_PendingDataIndication
+} UEInformationTransferIEs__value_PR;
+typedef enum ENBCPRelocationIndicationIEs__value_PR {
+	ENBCPRelocationIndicationIEs__value_PR_NOTHING,	/* No components present */
+	ENBCPRelocationIndicationIEs__value_PR_ENB_UE_S1AP_ID,
+	ENBCPRelocationIndicationIEs__value_PR_S_TMSI,
+	ENBCPRelocationIndicationIEs__value_PR_EUTRAN_CGI,
+	ENBCPRelocationIndicationIEs__value_PR_TAI,
+	ENBCPRelocationIndicationIEs__value_PR_UL_CP_SecurityInformation
+} ENBCPRelocationIndicationIEs__value_PR;
+typedef enum MMECPRelocationIndicationIEs__value_PR {
+	MMECPRelocationIndicationIEs__value_PR_NOTHING,	/* No components present */
+	MMECPRelocationIndicationIEs__value_PR_MME_UE_S1AP_ID,
+	MMECPRelocationIndicationIEs__value_PR_ENB_UE_S1AP_ID
+} MMECPRelocationIndicationIEs__value_PR;
+typedef enum SecondaryRATDataUsageReportIEs__value_PR {
+	SecondaryRATDataUsageReportIEs__value_PR_NOTHING,	/* No components present */
+	SecondaryRATDataUsageReportIEs__value_PR_MME_UE_S1AP_ID,
+	SecondaryRATDataUsageReportIEs__value_PR_ENB_UE_S1AP_ID,
+	SecondaryRATDataUsageReportIEs__value_PR_SecondaryRATDataUsageReportList,
+	SecondaryRATDataUsageReportIEs__value_PR_HandoverFlag,
+	SecondaryRATDataUsageReportIEs__value_PR_UserLocationInformation,
+	SecondaryRATDataUsageReportIEs__value_PR_TimeSinceSecondaryNodeRelease
+} SecondaryRATDataUsageReportIEs__value_PR;
+typedef enum E_RABDataForwardingItemIEs__value_PR {
+	E_RABDataForwardingItemIEs__value_PR_NOTHING,	/* No components present */
+	E_RABDataForwardingItemIEs__value_PR_E_RABDataForwardingItem
+} E_RABDataForwardingItemIEs__value_PR;
+typedef enum E_RABToBeSetupItemHOReqIEs__value_PR {
+	E_RABToBeSetupItemHOReqIEs__value_PR_NOTHING,	/* No components present */
+	E_RABToBeSetupItemHOReqIEs__value_PR_E_RABToBeSetupItemHOReq
+} E_RABToBeSetupItemHOReqIEs__value_PR;
+typedef enum E_RABAdmittedItemIEs__value_PR {
+	E_RABAdmittedItemIEs__value_PR_NOTHING,	/* No components present */
+	E_RABAdmittedItemIEs__value_PR_E_RABAdmittedItem
+} E_RABAdmittedItemIEs__value_PR;
+typedef enum E_RABFailedtoSetupItemHOReqAckIEs__value_PR {
+	E_RABFailedtoSetupItemHOReqAckIEs__value_PR_NOTHING,	/* No components present */
+	E_RABFailedtoSetupItemHOReqAckIEs__value_PR_E_RABFailedToSetupItemHOReqAck
+} E_RABFailedtoSetupItemHOReqAckIEs__value_PR;
+typedef enum E_RABToBeSwitchedDLItemIEs__value_PR {
+	E_RABToBeSwitchedDLItemIEs__value_PR_NOTHING,	/* No components present */
+	E_RABToBeSwitchedDLItemIEs__value_PR_E_RABToBeSwitchedDLItem
+} E_RABToBeSwitchedDLItemIEs__value_PR;
+typedef enum E_RABToBeSwitchedULItemIEs__value_PR {
+	E_RABToBeSwitchedULItemIEs__value_PR_NOTHING,	/* No components present */
+	E_RABToBeSwitchedULItemIEs__value_PR_E_RABToBeSwitchedULItem
+} E_RABToBeSwitchedULItemIEs__value_PR;
+typedef enum E_RABToBeModifiedItemBearerModIndIEs__value_PR {
+	E_RABToBeModifiedItemBearerModIndIEs__value_PR_NOTHING,	/* No components present */
+	E_RABToBeModifiedItemBearerModIndIEs__value_PR_E_RABToBeModifiedItemBearerModInd
+} E_RABToBeModifiedItemBearerModIndIEs__value_PR;
+typedef enum E_RABNotToBeModifiedItemBearerModIndIEs__value_PR {
+	E_RABNotToBeModifiedItemBearerModIndIEs__value_PR_NOTHING,	/* No components present */
+	E_RABNotToBeModifiedItemBearerModIndIEs__value_PR_E_RABNotToBeModifiedItemBearerModInd
+} E_RABNotToBeModifiedItemBearerModIndIEs__value_PR;
+typedef enum E_RABFailedToResumeItemResumeReqIEs__value_PR {
+	E_RABFailedToResumeItemResumeReqIEs__value_PR_NOTHING,	/* No components present */
+	E_RABFailedToResumeItemResumeReqIEs__value_PR_E_RABFailedToResumeItemResumeReq
+} E_RABFailedToResumeItemResumeReqIEs__value_PR;
+typedef enum E_RABFailedToResumeItemResumeResIEs__value_PR {
+	E_RABFailedToResumeItemResumeResIEs__value_PR_NOTHING,	/* No components present */
+	E_RABFailedToResumeItemResumeResIEs__value_PR_E_RABFailedToResumeItemResumeRes
+} E_RABFailedToResumeItemResumeResIEs__value_PR;
+
+/* ProtocolIE-Field */
+typedef struct Bearers_SubjectToStatusTransfer_ItemIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct Bearers_SubjectToStatusTransfer_ItemIEs__value {
+		Bearers_SubjectToStatusTransfer_ItemIEs__value_PR present;
+		union Bearers_SubjectToStatusTransfer_ItemIEs__value_u {
+			Bearers_SubjectToStatusTransfer_Item_t	 Bearers_SubjectToStatusTransfer_Item;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} Bearers_SubjectToStatusTransfer_ItemIEs_t;
+typedef struct E_RABInformationListIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABInformationListIEs__value {
+		E_RABInformationListIEs__value_PR present;
+		union E_RABInformationListIEs__value_u {
+			E_RABInformationListItem_t	 E_RABInformationListItem;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABInformationListIEs_t;
+typedef struct E_RABItemIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABItemIEs__value {
+		E_RABItemIEs__value_PR present;
+		union E_RABItemIEs__value_u {
+			E_RABItem_t	 E_RABItem;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABItemIEs_t;
+typedef struct E_RABUsageReportItemIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABUsageReportItemIEs__value {
+		E_RABUsageReportItemIEs__value_PR present;
+		union E_RABUsageReportItemIEs__value_u {
+			E_RABUsageReportItem_t	 E_RABUsageReportItem;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABUsageReportItemIEs_t;
+typedef struct MDTMode_ExtensionIE {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct MDTMode_ExtensionIE__value {
+		MDTMode_ExtensionIE__value_PR present;
+		union MDTMode_ExtensionIE__value_u {
+			LoggedMBSFNMDT_t	 LoggedMBSFNMDT;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} MDTMode_ExtensionIE_t;
+typedef struct RecommendedCellItemIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct RecommendedCellItemIEs__value {
+		RecommendedCellItemIEs__value_PR present;
+		union RecommendedCellItemIEs__value_u {
+			RecommendedCellItem_t	 RecommendedCellItem;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RecommendedCellItemIEs_t;
+typedef struct RecommendedENBItemIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct RecommendedENBItemIEs__value {
+		RecommendedENBItemIEs__value_PR present;
+		union RecommendedENBItemIEs__value_u {
+			RecommendedENBItem_t	 RecommendedENBItem;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RecommendedENBItemIEs_t;
+typedef struct SecondaryRATDataUsageReportItemIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct SecondaryRATDataUsageReportItemIEs__value {
+		SecondaryRATDataUsageReportItemIEs__value_PR present;
+		union SecondaryRATDataUsageReportItemIEs__value_u {
+			SecondaryRATDataUsageReportItem_t	 SecondaryRATDataUsageReportItem;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} SecondaryRATDataUsageReportItemIEs_t;
+typedef struct SONInformation_ExtensionIE {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct SONInformation_ExtensionIE__value {
+		SONInformation_ExtensionIE__value_PR present;
+		union SONInformation_ExtensionIE__value_u {
+			SONInformationReport_t	 SONInformationReport;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} SONInformation_ExtensionIE_t;
+typedef struct E_RABToBeSetupItemBearerSUReqIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABToBeSetupItemBearerSUReqIEs__value {
+		E_RABToBeSetupItemBearerSUReqIEs__value_PR present;
+		union E_RABToBeSetupItemBearerSUReqIEs__value_u {
+			E_RABToBeSetupItemBearerSUReq_t	 E_RABToBeSetupItemBearerSUReq;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABToBeSetupItemBearerSUReqIEs_t;
+typedef struct E_RABSetupItemBearerSUResIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABSetupItemBearerSUResIEs__value {
+		E_RABSetupItemBearerSUResIEs__value_PR present;
+		union E_RABSetupItemBearerSUResIEs__value_u {
+			E_RABSetupItemBearerSURes_t	 E_RABSetupItemBearerSURes;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABSetupItemBearerSUResIEs_t;
+typedef struct E_RABToBeModifiedItemBearerModReqIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABToBeModifiedItemBearerModReqIEs__value {
+		E_RABToBeModifiedItemBearerModReqIEs__value_PR present;
+		union E_RABToBeModifiedItemBearerModReqIEs__value_u {
+			E_RABToBeModifiedItemBearerModReq_t	 E_RABToBeModifiedItemBearerModReq;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABToBeModifiedItemBearerModReqIEs_t;
+typedef struct E_RABModifyItemBearerModResIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABModifyItemBearerModResIEs__value {
+		E_RABModifyItemBearerModResIEs__value_PR present;
+		union E_RABModifyItemBearerModResIEs__value_u {
+			E_RABModifyItemBearerModRes_t	 E_RABModifyItemBearerModRes;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABModifyItemBearerModResIEs_t;
+typedef struct E_RABReleaseItemBearerRelCompIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABReleaseItemBearerRelCompIEs__value {
+		E_RABReleaseItemBearerRelCompIEs__value_PR present;
+		union E_RABReleaseItemBearerRelCompIEs__value_u {
+			E_RABReleaseItemBearerRelComp_t	 E_RABReleaseItemBearerRelComp;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABReleaseItemBearerRelCompIEs_t;
+typedef struct E_RABToBeSetupItemCtxtSUReqIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABToBeSetupItemCtxtSUReqIEs__value {
+		E_RABToBeSetupItemCtxtSUReqIEs__value_PR present;
+		union E_RABToBeSetupItemCtxtSUReqIEs__value_u {
+			E_RABToBeSetupItemCtxtSUReq_t	 E_RABToBeSetupItemCtxtSUReq;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABToBeSetupItemCtxtSUReqIEs_t;
+typedef struct E_RABSetupItemCtxtSUResIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABSetupItemCtxtSUResIEs__value {
+		E_RABSetupItemCtxtSUResIEs__value_PR present;
+		union E_RABSetupItemCtxtSUResIEs__value_u {
+			E_RABSetupItemCtxtSURes_t	 E_RABSetupItemCtxtSURes;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABSetupItemCtxtSUResIEs_t;
+typedef struct TAIItemIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct TAIItemIEs__value {
+		TAIItemIEs__value_PR present;
+		union TAIItemIEs__value_u {
+			TAIItem_t	 TAIItem;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TAIItemIEs_t;
+typedef struct UE_associatedLogicalS1_ConnectionItemRes {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct UE_associatedLogicalS1_ConnectionItemRes__value {
+		UE_associatedLogicalS1_ConnectionItemRes__value_PR present;
+		union UE_associatedLogicalS1_ConnectionItemRes__value_u {
+			UE_associatedLogicalS1_ConnectionItem_t	 UE_associatedLogicalS1_ConnectionItem;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UE_associatedLogicalS1_ConnectionItemRes_t;
+typedef struct UE_associatedLogicalS1_ConnectionItemResAck {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct UE_associatedLogicalS1_ConnectionItemResAck__value {
+		UE_associatedLogicalS1_ConnectionItemResAck__value_PR present;
+		union UE_associatedLogicalS1_ConnectionItemResAck__value_u {
+			UE_associatedLogicalS1_ConnectionItem_t	 UE_associatedLogicalS1_ConnectionItem;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UE_associatedLogicalS1_ConnectionItemResAck_t;
+typedef struct E_RABModifyItemBearerModConfIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABModifyItemBearerModConfIEs__value {
+		E_RABModifyItemBearerModConfIEs__value_PR present;
+		union E_RABModifyItemBearerModConfIEs__value_u {
+			E_RABModifyItemBearerModConf_t	 E_RABModifyItemBearerModConf;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABModifyItemBearerModConfIEs_t;
+typedef struct HandoverRequiredIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct HandoverRequiredIEs__value {
+		HandoverRequiredIEs__value_PR present;
+		union HandoverRequiredIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			HandoverType_t	 HandoverType;
+			Cause_t	 Cause;
+			TargetID_t	 TargetID;
+			Direct_Forwarding_Path_Availability_t	 Direct_Forwarding_Path_Availability;
+			SRVCCHOIndication_t	 SRVCCHOIndication;
+			Source_ToTarget_TransparentContainer_t	 Source_ToTarget_TransparentContainer;
+			Source_ToTarget_TransparentContainer_t	 Source_ToTarget_TransparentContainer_1;
+			MSClassmark2_t	 MSClassmark2;
+			MSClassmark3_t	 MSClassmark3;
+			CSG_Id_t	 CSG_Id;
+			CellAccessMode_t	 CellAccessMode;
+			PS_ServiceNotAvailable_t	 PS_ServiceNotAvailable;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} HandoverRequiredIEs_t;
+typedef struct HandoverCommandIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct HandoverCommandIEs__value {
+		HandoverCommandIEs__value_PR present;
+		union HandoverCommandIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			HandoverType_t	 HandoverType;
+			NASSecurityParametersfromE_UTRAN_t	 NASSecurityParametersfromE_UTRAN;
+			E_RABSubjecttoDataForwardingList_t	 E_RABSubjecttoDataForwardingList;
+			E_RABList_t	 E_RABList;
+			Target_ToSource_TransparentContainer_t	 Target_ToSource_TransparentContainer;
+			Target_ToSource_TransparentContainer_t	 Target_ToSource_TransparentContainer_1;
+			CriticalityDiagnostics_t	 CriticalityDiagnostics;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} HandoverCommandIEs_t;
+typedef struct HandoverPreparationFailureIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct HandoverPreparationFailureIEs__value {
+		HandoverPreparationFailureIEs__value_PR present;
+		union HandoverPreparationFailureIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			Cause_t	 Cause;
+			CriticalityDiagnostics_t	 CriticalityDiagnostics;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} HandoverPreparationFailureIEs_t;
+typedef struct HandoverRequestIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct HandoverRequestIEs__value {
+		HandoverRequestIEs__value_PR present;
+		union HandoverRequestIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			HandoverType_t	 HandoverType;
+			Cause_t	 Cause;
+			UEAggregateMaximumBitrate_t	 UEAggregateMaximumBitrate;
+			E_RABToBeSetupListHOReq_t	 E_RABToBeSetupListHOReq;
+			Source_ToTarget_TransparentContainer_t	 Source_ToTarget_TransparentContainer;
+			UESecurityCapabilities_t	 UESecurityCapabilities;
+			HandoverRestrictionList_t	 HandoverRestrictionList;
+			TraceActivation_t	 TraceActivation;
+			RequestType_t	 RequestType;
+			SRVCCOperationPossible_t	 SRVCCOperationPossible;
+			SecurityContext_t	 SecurityContext;
+			NASSecurityParameterstoE_UTRAN_t	 NASSecurityParameterstoE_UTRAN;
+			CSG_Id_t	 CSG_Id;
+			CSGMembershipStatus_t	 CSGMembershipStatus;
+			GUMMEI_t	 GUMMEI;
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID_1;
+			ManagementBasedMDTAllowed_t	 ManagementBasedMDTAllowed;
+			MDTPLMNList_t	 MDTPLMNList;
+			Masked_IMEISV_t	 Masked_IMEISV;
+			ExpectedUEBehaviour_t	 ExpectedUEBehaviour;
+			ProSeAuthorized_t	 ProSeAuthorized;
+			UEUserPlaneCIoTSupportIndicator_t	 UEUserPlaneCIoTSupportIndicator;
+			V2XServicesAuthorized_t	 V2XServicesAuthorized;
+			UESidelinkAggregateMaximumBitrate_t	 UESidelinkAggregateMaximumBitrate;
+			EnhancedCoverageRestricted_t	 EnhancedCoverageRestricted;
+			NRUESecurityCapabilities_t	 NRUESecurityCapabilities;
+			CE_ModeBRestricted_t	 CE_ModeBRestricted;
+			AerialUEsubscriptionInformation_t	 AerialUEsubscriptionInformation;
+			PendingDataIndication_t	 PendingDataIndication;
+			Subscription_Based_UE_DifferentiationInfo_t	 Subscription_Based_UE_DifferentiationInfo;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} HandoverRequestIEs_t;
+typedef struct HandoverRequestAcknowledgeIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct HandoverRequestAcknowledgeIEs__value {
+		HandoverRequestAcknowledgeIEs__value_PR present;
+		union HandoverRequestAcknowledgeIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			E_RABAdmittedList_t	 E_RABAdmittedList;
+			E_RABFailedtoSetupListHOReqAck_t	 E_RABFailedtoSetupListHOReqAck;
+			Target_ToSource_TransparentContainer_t	 Target_ToSource_TransparentContainer;
+			CSG_Id_t	 CSG_Id;
+			CriticalityDiagnostics_t	 CriticalityDiagnostics;
+			CellAccessMode_t	 CellAccessMode;
+			CE_mode_B_SupportIndicator_t	 CE_mode_B_SupportIndicator;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} HandoverRequestAcknowledgeIEs_t;
+typedef struct HandoverFailureIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct HandoverFailureIEs__value {
+		HandoverFailureIEs__value_PR present;
+		union HandoverFailureIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			Cause_t	 Cause;
+			CriticalityDiagnostics_t	 CriticalityDiagnostics;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} HandoverFailureIEs_t;
+typedef struct HandoverNotifyIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct HandoverNotifyIEs__value {
+		HandoverNotifyIEs__value_PR present;
+		union HandoverNotifyIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			EUTRAN_CGI_t	 EUTRAN_CGI;
+			TAI_t	 TAI;
+			TunnelInformation_t	 TunnelInformation;
+			LHN_ID_t	 LHN_ID;
+			PSCellInformation_t	 PSCellInformation;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} HandoverNotifyIEs_t;
+typedef struct PathSwitchRequestIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct PathSwitchRequestIEs__value {
+		PathSwitchRequestIEs__value_PR present;
+		union PathSwitchRequestIEs__value_u {
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			E_RABToBeSwitchedDLList_t	 E_RABToBeSwitchedDLList;
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			EUTRAN_CGI_t	 EUTRAN_CGI;
+			TAI_t	 TAI;
+			UESecurityCapabilities_t	 UESecurityCapabilities;
+			CSG_Id_t	 CSG_Id;
+			CellAccessMode_t	 CellAccessMode;
+			GUMMEI_t	 GUMMEI;
+			CSGMembershipStatus_t	 CSGMembershipStatus;
+			TunnelInformation_t	 TunnelInformation;
+			LHN_ID_t	 LHN_ID;
+			RRC_Establishment_Cause_t	 RRC_Establishment_Cause;
+			NRUESecurityCapabilities_t	 NRUESecurityCapabilities;
+			PSCellInformation_t	 PSCellInformation;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} PathSwitchRequestIEs_t;
+typedef struct PathSwitchRequestAcknowledgeIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct PathSwitchRequestAcknowledgeIEs__value {
+		PathSwitchRequestAcknowledgeIEs__value_PR present;
+		union PathSwitchRequestAcknowledgeIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			UEAggregateMaximumBitrate_t	 UEAggregateMaximumBitrate;
+			E_RABToBeSwitchedULList_t	 E_RABToBeSwitchedULList;
+			E_RABList_t	 E_RABList;
+			SecurityContext_t	 SecurityContext;
+			CriticalityDiagnostics_t	 CriticalityDiagnostics;
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID_1;
+			CSGMembershipStatus_t	 CSGMembershipStatus;
+			ProSeAuthorized_t	 ProSeAuthorized;
+			UEUserPlaneCIoTSupportIndicator_t	 UEUserPlaneCIoTSupportIndicator;
+			V2XServicesAuthorized_t	 V2XServicesAuthorized;
+			UESidelinkAggregateMaximumBitrate_t	 UESidelinkAggregateMaximumBitrate;
+			EnhancedCoverageRestricted_t	 EnhancedCoverageRestricted;
+			NRUESecurityCapabilities_t	 NRUESecurityCapabilities;
+			CE_ModeBRestricted_t	 CE_ModeBRestricted;
+			AerialUEsubscriptionInformation_t	 AerialUEsubscriptionInformation;
+			PendingDataIndication_t	 PendingDataIndication;
+			Subscription_Based_UE_DifferentiationInfo_t	 Subscription_Based_UE_DifferentiationInfo;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} PathSwitchRequestAcknowledgeIEs_t;
+typedef struct PathSwitchRequestFailureIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct PathSwitchRequestFailureIEs__value {
+		PathSwitchRequestFailureIEs__value_PR present;
+		union PathSwitchRequestFailureIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			Cause_t	 Cause;
+			CriticalityDiagnostics_t	 CriticalityDiagnostics;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} PathSwitchRequestFailureIEs_t;
+typedef struct HandoverCancelIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct HandoverCancelIEs__value {
+		HandoverCancelIEs__value_PR present;
+		union HandoverCancelIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			Cause_t	 Cause;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} HandoverCancelIEs_t;
+typedef struct HandoverCancelAcknowledgeIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct HandoverCancelAcknowledgeIEs__value {
+		HandoverCancelAcknowledgeIEs__value_PR present;
+		union HandoverCancelAcknowledgeIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			CriticalityDiagnostics_t	 CriticalityDiagnostics;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} HandoverCancelAcknowledgeIEs_t;
+typedef struct E_RABSetupRequestIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABSetupRequestIEs__value {
+		E_RABSetupRequestIEs__value_PR present;
+		union E_RABSetupRequestIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			UEAggregateMaximumBitrate_t	 UEAggregateMaximumBitrate;
+			E_RABToBeSetupListBearerSUReq_t	 E_RABToBeSetupListBearerSUReq;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABSetupRequestIEs_t;
+typedef struct E_RABSetupResponseIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABSetupResponseIEs__value {
+		E_RABSetupResponseIEs__value_PR present;
+		union E_RABSetupResponseIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			E_RABSetupListBearerSURes_t	 E_RABSetupListBearerSURes;
+			E_RABList_t	 E_RABList;
+			CriticalityDiagnostics_t	 CriticalityDiagnostics;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABSetupResponseIEs_t;
+typedef struct E_RABModifyRequestIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABModifyRequestIEs__value {
+		E_RABModifyRequestIEs__value_PR present;
+		union E_RABModifyRequestIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			UEAggregateMaximumBitrate_t	 UEAggregateMaximumBitrate;
+			E_RABToBeModifiedListBearerModReq_t	 E_RABToBeModifiedListBearerModReq;
+			SecondaryRATDataUsageRequest_t	 SecondaryRATDataUsageRequest;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABModifyRequestIEs_t;
+typedef struct E_RABModifyResponseIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABModifyResponseIEs__value {
+		E_RABModifyResponseIEs__value_PR present;
+		union E_RABModifyResponseIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			E_RABModifyListBearerModRes_t	 E_RABModifyListBearerModRes;
+			E_RABList_t	 E_RABList;
+			CriticalityDiagnostics_t	 CriticalityDiagnostics;
+			SecondaryRATDataUsageReportList_t	 SecondaryRATDataUsageReportList;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABModifyResponseIEs_t;
+typedef struct E_RABReleaseCommandIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABReleaseCommandIEs__value {
+		E_RABReleaseCommandIEs__value_PR present;
+		union E_RABReleaseCommandIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			UEAggregateMaximumBitrate_t	 UEAggregateMaximumBitrate;
+			E_RABList_t	 E_RABList;
+			NAS_PDU_t	 NAS_PDU;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABReleaseCommandIEs_t;
+typedef struct E_RABReleaseResponseIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABReleaseResponseIEs__value {
+		E_RABReleaseResponseIEs__value_PR present;
+		union E_RABReleaseResponseIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			E_RABReleaseListBearerRelComp_t	 E_RABReleaseListBearerRelComp;
+			E_RABList_t	 E_RABList;
+			CriticalityDiagnostics_t	 CriticalityDiagnostics;
+			UserLocationInformation_t	 UserLocationInformation;
+			SecondaryRATDataUsageReportList_t	 SecondaryRATDataUsageReportList;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABReleaseResponseIEs_t;
+typedef struct E_RABReleaseIndicationIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABReleaseIndicationIEs__value {
+		E_RABReleaseIndicationIEs__value_PR present;
+		union E_RABReleaseIndicationIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			E_RABList_t	 E_RABList;
+			UserLocationInformation_t	 UserLocationInformation;
+			SecondaryRATDataUsageReportList_t	 SecondaryRATDataUsageReportList;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABReleaseIndicationIEs_t;
+typedef struct InitialContextSetupRequestIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct InitialContextSetupRequestIEs__value {
+		InitialContextSetupRequestIEs__value_PR present;
+		union InitialContextSetupRequestIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			UEAggregateMaximumBitrate_t	 UEAggregateMaximumBitrate;
+			E_RABToBeSetupListCtxtSUReq_t	 E_RABToBeSetupListCtxtSUReq;
+			UESecurityCapabilities_t	 UESecurityCapabilities;
+			SecurityKey_t	 SecurityKey;
+			TraceActivation_t	 TraceActivation;
+			HandoverRestrictionList_t	 HandoverRestrictionList;
+			UERadioCapability_t	 UERadioCapability;
+			SubscriberProfileIDforRFP_t	 SubscriberProfileIDforRFP;
+			CSFallbackIndicator_t	 CSFallbackIndicator;
+			SRVCCOperationPossible_t	 SRVCCOperationPossible;
+			CSGMembershipStatus_t	 CSGMembershipStatus;
+			LAI_t	 LAI;
+			GUMMEI_t	 GUMMEI;
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID_1;
+			ManagementBasedMDTAllowed_t	 ManagementBasedMDTAllowed;
+			MDTPLMNList_t	 MDTPLMNList;
+			AdditionalCSFallbackIndicator_t	 AdditionalCSFallbackIndicator;
+			Masked_IMEISV_t	 Masked_IMEISV;
+			ExpectedUEBehaviour_t	 ExpectedUEBehaviour;
+			ProSeAuthorized_t	 ProSeAuthorized;
+			UEUserPlaneCIoTSupportIndicator_t	 UEUserPlaneCIoTSupportIndicator;
+			V2XServicesAuthorized_t	 V2XServicesAuthorized;
+			UESidelinkAggregateMaximumBitrate_t	 UESidelinkAggregateMaximumBitrate;
+			EnhancedCoverageRestricted_t	 EnhancedCoverageRestricted;
+			NRUESecurityCapabilities_t	 NRUESecurityCapabilities;
+			CE_ModeBRestricted_t	 CE_ModeBRestricted;
+			AerialUEsubscriptionInformation_t	 AerialUEsubscriptionInformation;
+			PendingDataIndication_t	 PendingDataIndication;
+			Subscription_Based_UE_DifferentiationInfo_t	 Subscription_Based_UE_DifferentiationInfo;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} InitialContextSetupRequestIEs_t;
+typedef struct InitialContextSetupResponseIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct InitialContextSetupResponseIEs__value {
+		InitialContextSetupResponseIEs__value_PR present;
+		union InitialContextSetupResponseIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			E_RABSetupListCtxtSURes_t	 E_RABSetupListCtxtSURes;
+			E_RABList_t	 E_RABList;
+			CriticalityDiagnostics_t	 CriticalityDiagnostics;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} InitialContextSetupResponseIEs_t;
+typedef struct InitialContextSetupFailureIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct InitialContextSetupFailureIEs__value {
+		InitialContextSetupFailureIEs__value_PR present;
+		union InitialContextSetupFailureIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			Cause_t	 Cause;
+			CriticalityDiagnostics_t	 CriticalityDiagnostics;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} InitialContextSetupFailureIEs_t;
+typedef struct PagingIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct PagingIEs__value {
+		PagingIEs__value_PR present;
+		union PagingIEs__value_u {
+			UEIdentityIndexValue_t	 UEIdentityIndexValue;
+			UEPagingID_t	 UEPagingID;
+			PagingDRX_t	 PagingDRX;
+			CNDomain_t	 CNDomain;
+			TAIList_t	 TAIList;
+			CSG_IdList_t	 CSG_IdList;
+			PagingPriority_t	 PagingPriority;
+			UERadioCapabilityForPaging_t	 UERadioCapabilityForPaging;
+			AssistanceDataForPaging_t	 AssistanceDataForPaging;
+			Paging_eDRXInformation_t	 Paging_eDRXInformation;
+			Extended_UEIdentityIndexValue_t	 Extended_UEIdentityIndexValue;
+			NB_IoT_Paging_eDRXInformation_t	 NB_IoT_Paging_eDRXInformation;
+			NB_IoT_UEIdentityIndexValue_t	 NB_IoT_UEIdentityIndexValue;
+			EnhancedCoverageRestricted_t	 EnhancedCoverageRestricted;
+			CE_ModeBRestricted_t	 CE_ModeBRestricted;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} PagingIEs_t;
+typedef struct UEContextReleaseRequest_IEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct UEContextReleaseRequest_IEs__value {
+		UEContextReleaseRequest_IEs__value_PR present;
+		union UEContextReleaseRequest_IEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			Cause_t	 Cause;
+			GWContextReleaseIndication_t	 GWContextReleaseIndication;
+			SecondaryRATDataUsageReportList_t	 SecondaryRATDataUsageReportList;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UEContextReleaseRequest_IEs_t;
+typedef struct UEContextReleaseCommand_IEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct UEContextReleaseCommand_IEs__value {
+		UEContextReleaseCommand_IEs__value_PR present;
+		union UEContextReleaseCommand_IEs__value_u {
+			UE_S1AP_IDs_t	 UE_S1AP_IDs;
+			Cause_t	 Cause;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UEContextReleaseCommand_IEs_t;
+typedef struct UEContextReleaseComplete_IEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct UEContextReleaseComplete_IEs__value {
+		UEContextReleaseComplete_IEs__value_PR present;
+		union UEContextReleaseComplete_IEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			CriticalityDiagnostics_t	 CriticalityDiagnostics;
+			UserLocationInformation_t	 UserLocationInformation;
+			InformationOnRecommendedCellsAndENBsForPaging_t	 InformationOnRecommendedCellsAndENBsForPaging;
+			CellIdentifierAndCELevelForCECapableUEs_t	 CellIdentifierAndCELevelForCECapableUEs;
+			SecondaryRATDataUsageReportList_t	 SecondaryRATDataUsageReportList;
+			TimeSinceSecondaryNodeRelease_t	 TimeSinceSecondaryNodeRelease;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UEContextReleaseComplete_IEs_t;
+typedef struct UEContextModificationRequestIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct UEContextModificationRequestIEs__value {
+		UEContextModificationRequestIEs__value_PR present;
+		union UEContextModificationRequestIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			SecurityKey_t	 SecurityKey;
+			SubscriberProfileIDforRFP_t	 SubscriberProfileIDforRFP;
+			UEAggregateMaximumBitrate_t	 UEAggregateMaximumBitrate;
+			CSFallbackIndicator_t	 CSFallbackIndicator;
+			UESecurityCapabilities_t	 UESecurityCapabilities;
+			CSGMembershipStatus_t	 CSGMembershipStatus;
+			LAI_t	 LAI;
+			AdditionalCSFallbackIndicator_t	 AdditionalCSFallbackIndicator;
+			ProSeAuthorized_t	 ProSeAuthorized;
+			SRVCCOperationPossible_t	 SRVCCOperationPossible;
+			SRVCCOperationNotPossible_t	 SRVCCOperationNotPossible;
+			V2XServicesAuthorized_t	 V2XServicesAuthorized;
+			UESidelinkAggregateMaximumBitrate_t	 UESidelinkAggregateMaximumBitrate;
+			NRUESecurityCapabilities_t	 NRUESecurityCapabilities;
+			AerialUEsubscriptionInformation_t	 AerialUEsubscriptionInformation;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UEContextModificationRequestIEs_t;
+typedef struct UEContextModificationResponseIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct UEContextModificationResponseIEs__value {
+		UEContextModificationResponseIEs__value_PR present;
+		union UEContextModificationResponseIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			CriticalityDiagnostics_t	 CriticalityDiagnostics;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UEContextModificationResponseIEs_t;
+typedef struct UEContextModificationFailureIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct UEContextModificationFailureIEs__value {
+		UEContextModificationFailureIEs__value_PR present;
+		union UEContextModificationFailureIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			Cause_t	 Cause;
+			CriticalityDiagnostics_t	 CriticalityDiagnostics;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UEContextModificationFailureIEs_t;
+typedef struct UERadioCapabilityMatchRequestIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct UERadioCapabilityMatchRequestIEs__value {
+		UERadioCapabilityMatchRequestIEs__value_PR present;
+		union UERadioCapabilityMatchRequestIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			UERadioCapability_t	 UERadioCapability;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UERadioCapabilityMatchRequestIEs_t;
+typedef struct UERadioCapabilityMatchResponseIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct UERadioCapabilityMatchResponseIEs__value {
+		UERadioCapabilityMatchResponseIEs__value_PR present;
+		union UERadioCapabilityMatchResponseIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			VoiceSupportMatchIndicator_t	 VoiceSupportMatchIndicator;
+			CriticalityDiagnostics_t	 CriticalityDiagnostics;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UERadioCapabilityMatchResponseIEs_t;
+typedef struct DownlinkNASTransport_IEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct DownlinkNASTransport_IEs__value {
+		DownlinkNASTransport_IEs__value_PR present;
+		union DownlinkNASTransport_IEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			NAS_PDU_t	 NAS_PDU;
+			HandoverRestrictionList_t	 HandoverRestrictionList;
+			SubscriberProfileIDforRFP_t	 SubscriberProfileIDforRFP;
+			SRVCCOperationPossible_t	 SRVCCOperationPossible;
+			UERadioCapability_t	 UERadioCapability;
+			DLNASPDUDeliveryAckRequest_t	 DLNASPDUDeliveryAckRequest;
+			EnhancedCoverageRestricted_t	 EnhancedCoverageRestricted;
+			NRUESecurityCapabilities_t	 NRUESecurityCapabilities;
+			CE_ModeBRestricted_t	 CE_ModeBRestricted;
+			UECapabilityInfoRequest_t	 UECapabilityInfoRequest;
+			EndIndication_t	 EndIndication;
+			PendingDataIndication_t	 PendingDataIndication;
+			Subscription_Based_UE_DifferentiationInfo_t	 Subscription_Based_UE_DifferentiationInfo;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} DownlinkNASTransport_IEs_t;
+typedef struct InitialUEMessage_IEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct InitialUEMessage_IEs__value {
+		InitialUEMessage_IEs__value_PR present;
+		union InitialUEMessage_IEs__value_u {
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			NAS_PDU_t	 NAS_PDU;
+			TAI_t	 TAI;
+			EUTRAN_CGI_t	 EUTRAN_CGI;
+			RRC_Establishment_Cause_t	 RRC_Establishment_Cause;
+			S_TMSI_t	 S_TMSI;
+			CSG_Id_t	 CSG_Id;
+			GUMMEI_t	 GUMMEI;
+			CellAccessMode_t	 CellAccessMode;
+			TransportLayerAddress_t	 TransportLayerAddress;
+			RelayNode_Indicator_t	 RelayNode_Indicator;
+			GUMMEIType_t	 GUMMEIType;
+			TunnelInformation_t	 TunnelInformation;
+			TransportLayerAddress_t	 TransportLayerAddress_1;
+			LHN_ID_t	 LHN_ID;
+			MME_Group_ID_t	 MME_Group_ID;
+			UE_Usage_Type_t	 UE_Usage_Type;
+			CE_mode_B_SupportIndicator_t	 CE_mode_B_SupportIndicator;
+			DCN_ID_t	 DCN_ID;
+			Coverage_Level_t	 Coverage_Level;
+			UE_Application_Layer_Measurement_Capability_t	 UE_Application_Layer_Measurement_Capability;
+			EDT_Session_t	 EDT_Session;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} InitialUEMessage_IEs_t;
+typedef struct UplinkNASTransport_IEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct UplinkNASTransport_IEs__value {
+		UplinkNASTransport_IEs__value_PR present;
+		union UplinkNASTransport_IEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			NAS_PDU_t	 NAS_PDU;
+			EUTRAN_CGI_t	 EUTRAN_CGI;
+			TAI_t	 TAI;
+			TransportLayerAddress_t	 TransportLayerAddress;
+			TransportLayerAddress_t	 TransportLayerAddress_1;
+			LHN_ID_t	 LHN_ID;
+			PSCellInformation_t	 PSCellInformation;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UplinkNASTransport_IEs_t;
+typedef struct NASNonDeliveryIndication_IEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct NASNonDeliveryIndication_IEs__value {
+		NASNonDeliveryIndication_IEs__value_PR present;
+		union NASNonDeliveryIndication_IEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			NAS_PDU_t	 NAS_PDU;
+			Cause_t	 Cause;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} NASNonDeliveryIndication_IEs_t;
+typedef struct RerouteNASRequest_IEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct RerouteNASRequest_IEs__value {
+		RerouteNASRequest_IEs__value_PR present;
+		union RerouteNASRequest_IEs__value_u {
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			OCTET_STRING_t	 OCTET_STRING;
+			MME_Group_ID_t	 MME_Group_ID;
+			Additional_GUTI_t	 Additional_GUTI;
+			UE_Usage_Type_t	 UE_Usage_Type;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RerouteNASRequest_IEs_t;
+typedef struct NASDeliveryIndicationIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct NASDeliveryIndicationIEs__value {
+		NASDeliveryIndicationIEs__value_PR present;
+		union NASDeliveryIndicationIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} NASDeliveryIndicationIEs_t;
+typedef struct ResetIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct ResetIEs__value {
+		ResetIEs__value_PR present;
+		union ResetIEs__value_u {
+			Cause_t	 Cause;
+			ResetType_t	 ResetType;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ResetIEs_t;
+typedef struct ResetAcknowledgeIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct ResetAcknowledgeIEs__value {
+		ResetAcknowledgeIEs__value_PR present;
+		union ResetAcknowledgeIEs__value_u {
+			UE_associatedLogicalS1_ConnectionListResAck_t	 UE_associatedLogicalS1_ConnectionListResAck;
+			CriticalityDiagnostics_t	 CriticalityDiagnostics;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ResetAcknowledgeIEs_t;
+typedef struct ErrorIndicationIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct ErrorIndicationIEs__value {
+		ErrorIndicationIEs__value_PR present;
+		union ErrorIndicationIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			Cause_t	 Cause;
+			CriticalityDiagnostics_t	 CriticalityDiagnostics;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ErrorIndicationIEs_t;
+typedef struct S1SetupRequestIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct S1SetupRequestIEs__value {
+		S1SetupRequestIEs__value_PR present;
+		union S1SetupRequestIEs__value_u {
+			Global_ENB_ID_t	 Global_ENB_ID;
+			ENBname_t	 ENBname;
+			SupportedTAs_t	 SupportedTAs;
+			PagingDRX_t	 PagingDRX;
+			CSG_IdList_t	 CSG_IdList;
+			UE_RetentionInformation_t	 UE_RetentionInformation;
+			NB_IoT_DefaultPagingDRX_t	 NB_IoT_DefaultPagingDRX;
+			ConnectedengNBList_t	 ConnectedengNBList;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} S1SetupRequestIEs_t;
+typedef struct S1SetupResponseIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct S1SetupResponseIEs__value {
+		S1SetupResponseIEs__value_PR present;
+		union S1SetupResponseIEs__value_u {
+			MMEname_t	 MMEname;
+			ServedGUMMEIs_t	 ServedGUMMEIs;
+			RelativeMMECapacity_t	 RelativeMMECapacity;
+			MMERelaySupportIndicator_t	 MMERelaySupportIndicator;
+			CriticalityDiagnostics_t	 CriticalityDiagnostics;
+			UE_RetentionInformation_t	 UE_RetentionInformation;
+			ServedDCNs_t	 ServedDCNs;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} S1SetupResponseIEs_t;
+typedef struct S1SetupFailureIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct S1SetupFailureIEs__value {
+		S1SetupFailureIEs__value_PR present;
+		union S1SetupFailureIEs__value_u {
+			Cause_t	 Cause;
+			TimeToWait_t	 TimeToWait;
+			CriticalityDiagnostics_t	 CriticalityDiagnostics;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} S1SetupFailureIEs_t;
+typedef struct ENBConfigurationUpdateIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct ENBConfigurationUpdateIEs__value {
+		ENBConfigurationUpdateIEs__value_PR present;
+		union ENBConfigurationUpdateIEs__value_u {
+			ENBname_t	 ENBname;
+			SupportedTAs_t	 SupportedTAs;
+			CSG_IdList_t	 CSG_IdList;
+			PagingDRX_t	 PagingDRX;
+			NB_IoT_DefaultPagingDRX_t	 NB_IoT_DefaultPagingDRX;
+			ConnectedengNBList_t	 ConnectedengNBList;
+			ConnectedengNBList_t	 ConnectedengNBList_1;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ENBConfigurationUpdateIEs_t;
+typedef struct ENBConfigurationUpdateAcknowledgeIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct ENBConfigurationUpdateAcknowledgeIEs__value {
+		ENBConfigurationUpdateAcknowledgeIEs__value_PR present;
+		union ENBConfigurationUpdateAcknowledgeIEs__value_u {
+			CriticalityDiagnostics_t	 CriticalityDiagnostics;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ENBConfigurationUpdateAcknowledgeIEs_t;
+typedef struct ENBConfigurationUpdateFailureIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct ENBConfigurationUpdateFailureIEs__value {
+		ENBConfigurationUpdateFailureIEs__value_PR present;
+		union ENBConfigurationUpdateFailureIEs__value_u {
+			Cause_t	 Cause;
+			TimeToWait_t	 TimeToWait;
+			CriticalityDiagnostics_t	 CriticalityDiagnostics;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ENBConfigurationUpdateFailureIEs_t;
+typedef struct MMEConfigurationUpdateIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct MMEConfigurationUpdateIEs__value {
+		MMEConfigurationUpdateIEs__value_PR present;
+		union MMEConfigurationUpdateIEs__value_u {
+			MMEname_t	 MMEname;
+			ServedGUMMEIs_t	 ServedGUMMEIs;
+			RelativeMMECapacity_t	 RelativeMMECapacity;
+			ServedDCNs_t	 ServedDCNs;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} MMEConfigurationUpdateIEs_t;
+typedef struct MMEConfigurationUpdateAcknowledgeIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct MMEConfigurationUpdateAcknowledgeIEs__value {
+		MMEConfigurationUpdateAcknowledgeIEs__value_PR present;
+		union MMEConfigurationUpdateAcknowledgeIEs__value_u {
+			CriticalityDiagnostics_t	 CriticalityDiagnostics;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} MMEConfigurationUpdateAcknowledgeIEs_t;
+typedef struct MMEConfigurationUpdateFailureIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct MMEConfigurationUpdateFailureIEs__value {
+		MMEConfigurationUpdateFailureIEs__value_PR present;
+		union MMEConfigurationUpdateFailureIEs__value_u {
+			Cause_t	 Cause;
+			TimeToWait_t	 TimeToWait;
+			CriticalityDiagnostics_t	 CriticalityDiagnostics;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} MMEConfigurationUpdateFailureIEs_t;
+typedef struct DownlinkS1cdma2000tunnellingIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct DownlinkS1cdma2000tunnellingIEs__value {
+		DownlinkS1cdma2000tunnellingIEs__value_PR present;
+		union DownlinkS1cdma2000tunnellingIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			E_RABSubjecttoDataForwardingList_t	 E_RABSubjecttoDataForwardingList;
+			Cdma2000HOStatus_t	 Cdma2000HOStatus;
+			Cdma2000RATType_t	 Cdma2000RATType;
+			Cdma2000PDU_t	 Cdma2000PDU;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} DownlinkS1cdma2000tunnellingIEs_t;
+typedef struct UplinkS1cdma2000tunnellingIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct UplinkS1cdma2000tunnellingIEs__value {
+		UplinkS1cdma2000tunnellingIEs__value_PR present;
+		union UplinkS1cdma2000tunnellingIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			Cdma2000RATType_t	 Cdma2000RATType;
+			Cdma2000SectorID_t	 Cdma2000SectorID;
+			Cdma2000HORequiredIndication_t	 Cdma2000HORequiredIndication;
+			Cdma2000OneXSRVCCInfo_t	 Cdma2000OneXSRVCCInfo;
+			Cdma2000OneXRAND_t	 Cdma2000OneXRAND;
+			Cdma2000PDU_t	 Cdma2000PDU;
+			EUTRANRoundTripDelayEstimationInfo_t	 EUTRANRoundTripDelayEstimationInfo;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UplinkS1cdma2000tunnellingIEs_t;
+typedef struct UECapabilityInfoIndicationIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct UECapabilityInfoIndicationIEs__value {
+		UECapabilityInfoIndicationIEs__value_PR present;
+		union UECapabilityInfoIndicationIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			UERadioCapability_t	 UERadioCapability;
+			UERadioCapabilityForPaging_t	 UERadioCapabilityForPaging;
+			UE_Application_Layer_Measurement_Capability_t	 UE_Application_Layer_Measurement_Capability;
+			LTE_M_Indication_t	 LTE_M_Indication;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UECapabilityInfoIndicationIEs_t;
+typedef struct ENBStatusTransferIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct ENBStatusTransferIEs__value {
+		ENBStatusTransferIEs__value_PR present;
+		union ENBStatusTransferIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			ENB_StatusTransfer_TransparentContainer_t	 ENB_StatusTransfer_TransparentContainer;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ENBStatusTransferIEs_t;
+typedef struct MMEStatusTransferIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct MMEStatusTransferIEs__value {
+		MMEStatusTransferIEs__value_PR present;
+		union MMEStatusTransferIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			ENB_StatusTransfer_TransparentContainer_t	 ENB_StatusTransfer_TransparentContainer;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} MMEStatusTransferIEs_t;
+typedef struct TraceStartIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct TraceStartIEs__value {
+		TraceStartIEs__value_PR present;
+		union TraceStartIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			TraceActivation_t	 TraceActivation;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TraceStartIEs_t;
+typedef struct TraceFailureIndicationIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct TraceFailureIndicationIEs__value {
+		TraceFailureIndicationIEs__value_PR present;
+		union TraceFailureIndicationIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			E_UTRAN_Trace_ID_t	 E_UTRAN_Trace_ID;
+			Cause_t	 Cause;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TraceFailureIndicationIEs_t;
+typedef struct DeactivateTraceIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct DeactivateTraceIEs__value {
+		DeactivateTraceIEs__value_PR present;
+		union DeactivateTraceIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			E_UTRAN_Trace_ID_t	 E_UTRAN_Trace_ID;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} DeactivateTraceIEs_t;
+typedef struct CellTrafficTraceIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct CellTrafficTraceIEs__value {
+		CellTrafficTraceIEs__value_PR present;
+		union CellTrafficTraceIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			E_UTRAN_Trace_ID_t	 E_UTRAN_Trace_ID;
+			EUTRAN_CGI_t	 EUTRAN_CGI;
+			TransportLayerAddress_t	 TransportLayerAddress;
+			PrivacyIndicator_t	 PrivacyIndicator;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} CellTrafficTraceIEs_t;
+typedef struct LocationReportingControlIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct LocationReportingControlIEs__value {
+		LocationReportingControlIEs__value_PR present;
+		union LocationReportingControlIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			RequestType_t	 RequestType;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} LocationReportingControlIEs_t;
+typedef struct LocationReportingFailureIndicationIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct LocationReportingFailureIndicationIEs__value {
+		LocationReportingFailureIndicationIEs__value_PR present;
+		union LocationReportingFailureIndicationIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			Cause_t	 Cause;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} LocationReportingFailureIndicationIEs_t;
+typedef struct LocationReportIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct LocationReportIEs__value {
+		LocationReportIEs__value_PR present;
+		union LocationReportIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			EUTRAN_CGI_t	 EUTRAN_CGI;
+			TAI_t	 TAI;
+			RequestType_t	 RequestType;
+			PSCellInformation_t	 PSCellInformation;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} LocationReportIEs_t;
+typedef struct OverloadStartIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct OverloadStartIEs__value {
+		OverloadStartIEs__value_PR present;
+		union OverloadStartIEs__value_u {
+			OverloadResponse_t	 OverloadResponse;
+			GUMMEIList_t	 GUMMEIList;
+			TrafficLoadReductionIndication_t	 TrafficLoadReductionIndication;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} OverloadStartIEs_t;
+typedef struct OverloadStopIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct OverloadStopIEs__value {
+		OverloadStopIEs__value_PR present;
+		union OverloadStopIEs__value_u {
+			GUMMEIList_t	 GUMMEIList;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} OverloadStopIEs_t;
+typedef struct WriteReplaceWarningRequestIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct WriteReplaceWarningRequestIEs__value {
+		WriteReplaceWarningRequestIEs__value_PR present;
+		union WriteReplaceWarningRequestIEs__value_u {
+			MessageIdentifier_t	 MessageIdentifier;
+			SerialNumber_t	 SerialNumber;
+			WarningAreaList_t	 WarningAreaList;
+			RepetitionPeriod_t	 RepetitionPeriod;
+			ExtendedRepetitionPeriod_t	 ExtendedRepetitionPeriod;
+			NumberofBroadcastRequest_t	 NumberofBroadcastRequest;
+			WarningType_t	 WarningType;
+			WarningSecurityInfo_t	 WarningSecurityInfo;
+			DataCodingScheme_t	 DataCodingScheme;
+			WarningMessageContents_t	 WarningMessageContents;
+			ConcurrentWarningMessageIndicator_t	 ConcurrentWarningMessageIndicator;
+			WarningAreaCoordinates_t	 WarningAreaCoordinates;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} WriteReplaceWarningRequestIEs_t;
+typedef struct WriteReplaceWarningResponseIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct WriteReplaceWarningResponseIEs__value {
+		WriteReplaceWarningResponseIEs__value_PR present;
+		union WriteReplaceWarningResponseIEs__value_u {
+			MessageIdentifier_t	 MessageIdentifier;
+			SerialNumber_t	 SerialNumber;
+			BroadcastCompletedAreaList_t	 BroadcastCompletedAreaList;
+			CriticalityDiagnostics_t	 CriticalityDiagnostics;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} WriteReplaceWarningResponseIEs_t;
+typedef struct ENBDirectInformationTransferIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct ENBDirectInformationTransferIEs__value {
+		ENBDirectInformationTransferIEs__value_PR present;
+		union ENBDirectInformationTransferIEs__value_u {
+			Inter_SystemInformationTransferType_t	 Inter_SystemInformationTransferType;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ENBDirectInformationTransferIEs_t;
+typedef struct MMEDirectInformationTransferIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct MMEDirectInformationTransferIEs__value {
+		MMEDirectInformationTransferIEs__value_PR present;
+		union MMEDirectInformationTransferIEs__value_u {
+			Inter_SystemInformationTransferType_t	 Inter_SystemInformationTransferType;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} MMEDirectInformationTransferIEs_t;
+typedef struct ENBConfigurationTransferIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct ENBConfigurationTransferIEs__value {
+		ENBConfigurationTransferIEs__value_PR present;
+		union ENBConfigurationTransferIEs__value_u {
+			SONConfigurationTransfer_t	 SONConfigurationTransfer;
+			EN_DCSONConfigurationTransfer_t	 EN_DCSONConfigurationTransfer;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ENBConfigurationTransferIEs_t;
+typedef struct MMEConfigurationTransferIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct MMEConfigurationTransferIEs__value {
+		MMEConfigurationTransferIEs__value_PR present;
+		union MMEConfigurationTransferIEs__value_u {
+			SONConfigurationTransfer_t	 SONConfigurationTransfer;
+			EN_DCSONConfigurationTransfer_t	 EN_DCSONConfigurationTransfer;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} MMEConfigurationTransferIEs_t;
+typedef struct KillRequestIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct KillRequestIEs__value {
+		KillRequestIEs__value_PR present;
+		union KillRequestIEs__value_u {
+			MessageIdentifier_t	 MessageIdentifier;
+			SerialNumber_t	 SerialNumber;
+			WarningAreaList_t	 WarningAreaList;
+			KillAllWarningMessages_t	 KillAllWarningMessages;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} KillRequestIEs_t;
+typedef struct KillResponseIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct KillResponseIEs__value {
+		KillResponseIEs__value_PR present;
+		union KillResponseIEs__value_u {
+			MessageIdentifier_t	 MessageIdentifier;
+			SerialNumber_t	 SerialNumber;
+			BroadcastCancelledAreaList_t	 BroadcastCancelledAreaList;
+			CriticalityDiagnostics_t	 CriticalityDiagnostics;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} KillResponseIEs_t;
+typedef struct PWSRestartIndicationIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct PWSRestartIndicationIEs__value {
+		PWSRestartIndicationIEs__value_PR present;
+		union PWSRestartIndicationIEs__value_u {
+			ECGIListForRestart_t	 ECGIListForRestart;
+			Global_ENB_ID_t	 Global_ENB_ID;
+			TAIListForRestart_t	 TAIListForRestart;
+			EmergencyAreaIDListForRestart_t	 EmergencyAreaIDListForRestart;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} PWSRestartIndicationIEs_t;
+typedef struct PWSFailureIndicationIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct PWSFailureIndicationIEs__value {
+		PWSFailureIndicationIEs__value_PR present;
+		union PWSFailureIndicationIEs__value_u {
+			PWSfailedECGIList_t	 PWSfailedECGIList;
+			Global_ENB_ID_t	 Global_ENB_ID;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} PWSFailureIndicationIEs_t;
+typedef struct DownlinkUEAssociatedLPPaTransport_IEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct DownlinkUEAssociatedLPPaTransport_IEs__value {
+		DownlinkUEAssociatedLPPaTransport_IEs__value_PR present;
+		union DownlinkUEAssociatedLPPaTransport_IEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			Routing_ID_t	 Routing_ID;
+			LPPa_PDU_t	 LPPa_PDU;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} DownlinkUEAssociatedLPPaTransport_IEs_t;
+typedef struct UplinkUEAssociatedLPPaTransport_IEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct UplinkUEAssociatedLPPaTransport_IEs__value {
+		UplinkUEAssociatedLPPaTransport_IEs__value_PR present;
+		union UplinkUEAssociatedLPPaTransport_IEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			Routing_ID_t	 Routing_ID;
+			LPPa_PDU_t	 LPPa_PDU;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UplinkUEAssociatedLPPaTransport_IEs_t;
+typedef struct DownlinkNonUEAssociatedLPPaTransport_IEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct DownlinkNonUEAssociatedLPPaTransport_IEs__value {
+		DownlinkNonUEAssociatedLPPaTransport_IEs__value_PR present;
+		union DownlinkNonUEAssociatedLPPaTransport_IEs__value_u {
+			Routing_ID_t	 Routing_ID;
+			LPPa_PDU_t	 LPPa_PDU;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} DownlinkNonUEAssociatedLPPaTransport_IEs_t;
+typedef struct UplinkNonUEAssociatedLPPaTransport_IEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct UplinkNonUEAssociatedLPPaTransport_IEs__value {
+		UplinkNonUEAssociatedLPPaTransport_IEs__value_PR present;
+		union UplinkNonUEAssociatedLPPaTransport_IEs__value_u {
+			Routing_ID_t	 Routing_ID;
+			LPPa_PDU_t	 LPPa_PDU;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UplinkNonUEAssociatedLPPaTransport_IEs_t;
+typedef struct E_RABModificationIndicationIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABModificationIndicationIEs__value {
+		E_RABModificationIndicationIEs__value_PR present;
+		union E_RABModificationIndicationIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			E_RABToBeModifiedListBearerModInd_t	 E_RABToBeModifiedListBearerModInd;
+			E_RABNotToBeModifiedListBearerModInd_t	 E_RABNotToBeModifiedListBearerModInd;
+			CSGMembershipInfo_t	 CSGMembershipInfo;
+			TunnelInformation_t	 TunnelInformation;
+			SecondaryRATDataUsageReportList_t	 SecondaryRATDataUsageReportList;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABModificationIndicationIEs_t;
+typedef struct E_RABModificationConfirmIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABModificationConfirmIEs__value {
+		E_RABModificationConfirmIEs__value_PR present;
+		union E_RABModificationConfirmIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			E_RABModifyListBearerModConf_t	 E_RABModifyListBearerModConf;
+			E_RABList_t	 E_RABList;
+			E_RABList_t	 E_RABList_1;
+			CriticalityDiagnostics_t	 CriticalityDiagnostics;
+			CSGMembershipStatus_t	 CSGMembershipStatus;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABModificationConfirmIEs_t;
+typedef struct UEContextModificationIndicationIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct UEContextModificationIndicationIEs__value {
+		UEContextModificationIndicationIEs__value_PR present;
+		union UEContextModificationIndicationIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			CSGMembershipInfo_t	 CSGMembershipInfo;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UEContextModificationIndicationIEs_t;
+typedef struct UEContextModificationConfirmIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct UEContextModificationConfirmIEs__value {
+		UEContextModificationConfirmIEs__value_PR present;
+		union UEContextModificationConfirmIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			CSGMembershipStatus_t	 CSGMembershipStatus;
+			CriticalityDiagnostics_t	 CriticalityDiagnostics;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UEContextModificationConfirmIEs_t;
+typedef struct UEContextSuspendRequestIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct UEContextSuspendRequestIEs__value {
+		UEContextSuspendRequestIEs__value_PR present;
+		union UEContextSuspendRequestIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			InformationOnRecommendedCellsAndENBsForPaging_t	 InformationOnRecommendedCellsAndENBsForPaging;
+			CellIdentifierAndCELevelForCECapableUEs_t	 CellIdentifierAndCELevelForCECapableUEs;
+			SecondaryRATDataUsageReportList_t	 SecondaryRATDataUsageReportList;
+			UserLocationInformation_t	 UserLocationInformation;
+			TimeSinceSecondaryNodeRelease_t	 TimeSinceSecondaryNodeRelease;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UEContextSuspendRequestIEs_t;
+typedef struct UEContextSuspendResponseIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct UEContextSuspendResponseIEs__value {
+		UEContextSuspendResponseIEs__value_PR present;
+		union UEContextSuspendResponseIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			CriticalityDiagnostics_t	 CriticalityDiagnostics;
+			SecurityContext_t	 SecurityContext;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UEContextSuspendResponseIEs_t;
+typedef struct UEContextResumeRequestIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct UEContextResumeRequestIEs__value {
+		UEContextResumeRequestIEs__value_PR present;
+		union UEContextResumeRequestIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			E_RABFailedToResumeListResumeReq_t	 E_RABFailedToResumeListResumeReq;
+			RRC_Establishment_Cause_t	 RRC_Establishment_Cause;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UEContextResumeRequestIEs_t;
+typedef struct UEContextResumeResponseIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct UEContextResumeResponseIEs__value {
+		UEContextResumeResponseIEs__value_PR present;
+		union UEContextResumeResponseIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			E_RABFailedToResumeListResumeRes_t	 E_RABFailedToResumeListResumeRes;
+			CriticalityDiagnostics_t	 CriticalityDiagnostics;
+			SecurityContext_t	 SecurityContext;
+			PendingDataIndication_t	 PendingDataIndication;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UEContextResumeResponseIEs_t;
+typedef struct UEContextResumeFailureIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct UEContextResumeFailureIEs__value {
+		UEContextResumeFailureIEs__value_PR present;
+		union UEContextResumeFailureIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			Cause_t	 Cause;
+			CriticalityDiagnostics_t	 CriticalityDiagnostics;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UEContextResumeFailureIEs_t;
+typedef struct ConnectionEstablishmentIndicationIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct ConnectionEstablishmentIndicationIEs__value {
+		ConnectionEstablishmentIndicationIEs__value_PR present;
+		union ConnectionEstablishmentIndicationIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			UERadioCapability_t	 UERadioCapability;
+			EnhancedCoverageRestricted_t	 EnhancedCoverageRestricted;
+			DL_CP_SecurityInformation_t	 DL_CP_SecurityInformation;
+			CE_ModeBRestricted_t	 CE_ModeBRestricted;
+			EndIndication_t	 EndIndication;
+			Subscription_Based_UE_DifferentiationInfo_t	 Subscription_Based_UE_DifferentiationInfo;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ConnectionEstablishmentIndicationIEs_t;
+typedef struct RetrieveUEInformationIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct RetrieveUEInformationIEs__value {
+		RetrieveUEInformationIEs__value_PR present;
+		union RetrieveUEInformationIEs__value_u {
+			S_TMSI_t	 S_TMSI;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RetrieveUEInformationIEs_t;
+typedef struct UEInformationTransferIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct UEInformationTransferIEs__value {
+		UEInformationTransferIEs__value_PR present;
+		union UEInformationTransferIEs__value_u {
+			S_TMSI_t	 S_TMSI;
+			E_RABLevelQoSParameters_t	 E_RABLevelQoSParameters;
+			UERadioCapability_t	 UERadioCapability;
+			Subscription_Based_UE_DifferentiationInfo_t	 Subscription_Based_UE_DifferentiationInfo;
+			PendingDataIndication_t	 PendingDataIndication;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UEInformationTransferIEs_t;
+typedef struct ENBCPRelocationIndicationIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct ENBCPRelocationIndicationIEs__value {
+		ENBCPRelocationIndicationIEs__value_PR present;
+		union ENBCPRelocationIndicationIEs__value_u {
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			S_TMSI_t	 S_TMSI;
+			EUTRAN_CGI_t	 EUTRAN_CGI;
+			TAI_t	 TAI;
+			UL_CP_SecurityInformation_t	 UL_CP_SecurityInformation;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ENBCPRelocationIndicationIEs_t;
+typedef struct MMECPRelocationIndicationIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct MMECPRelocationIndicationIEs__value {
+		MMECPRelocationIndicationIEs__value_PR present;
+		union MMECPRelocationIndicationIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} MMECPRelocationIndicationIEs_t;
+typedef struct SecondaryRATDataUsageReportIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct SecondaryRATDataUsageReportIEs__value {
+		SecondaryRATDataUsageReportIEs__value_PR present;
+		union SecondaryRATDataUsageReportIEs__value_u {
+			MME_UE_S1AP_ID_t	 MME_UE_S1AP_ID;
+			ENB_UE_S1AP_ID_t	 ENB_UE_S1AP_ID;
+			SecondaryRATDataUsageReportList_t	 SecondaryRATDataUsageReportList;
+			HandoverFlag_t	 HandoverFlag;
+			UserLocationInformation_t	 UserLocationInformation;
+			TimeSinceSecondaryNodeRelease_t	 TimeSinceSecondaryNodeRelease;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} SecondaryRATDataUsageReportIEs_t;
+typedef struct E_RABDataForwardingItemIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABDataForwardingItemIEs__value {
+		E_RABDataForwardingItemIEs__value_PR present;
+		union E_RABDataForwardingItemIEs__value_u {
+			E_RABDataForwardingItem_t	 E_RABDataForwardingItem;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABDataForwardingItemIEs_t;
+typedef struct E_RABToBeSetupItemHOReqIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABToBeSetupItemHOReqIEs__value {
+		E_RABToBeSetupItemHOReqIEs__value_PR present;
+		union E_RABToBeSetupItemHOReqIEs__value_u {
+			E_RABToBeSetupItemHOReq_t	 E_RABToBeSetupItemHOReq;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABToBeSetupItemHOReqIEs_t;
+typedef struct E_RABAdmittedItemIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABAdmittedItemIEs__value {
+		E_RABAdmittedItemIEs__value_PR present;
+		union E_RABAdmittedItemIEs__value_u {
+			E_RABAdmittedItem_t	 E_RABAdmittedItem;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABAdmittedItemIEs_t;
+typedef struct E_RABFailedtoSetupItemHOReqAckIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABFailedtoSetupItemHOReqAckIEs__value {
+		E_RABFailedtoSetupItemHOReqAckIEs__value_PR present;
+		union E_RABFailedtoSetupItemHOReqAckIEs__value_u {
+			E_RABFailedToSetupItemHOReqAck_t	 E_RABFailedToSetupItemHOReqAck;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABFailedtoSetupItemHOReqAckIEs_t;
+typedef struct E_RABToBeSwitchedDLItemIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABToBeSwitchedDLItemIEs__value {
+		E_RABToBeSwitchedDLItemIEs__value_PR present;
+		union E_RABToBeSwitchedDLItemIEs__value_u {
+			E_RABToBeSwitchedDLItem_t	 E_RABToBeSwitchedDLItem;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABToBeSwitchedDLItemIEs_t;
+typedef struct E_RABToBeSwitchedULItemIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABToBeSwitchedULItemIEs__value {
+		E_RABToBeSwitchedULItemIEs__value_PR present;
+		union E_RABToBeSwitchedULItemIEs__value_u {
+			E_RABToBeSwitchedULItem_t	 E_RABToBeSwitchedULItem;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABToBeSwitchedULItemIEs_t;
+typedef struct E_RABToBeModifiedItemBearerModIndIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABToBeModifiedItemBearerModIndIEs__value {
+		E_RABToBeModifiedItemBearerModIndIEs__value_PR present;
+		union E_RABToBeModifiedItemBearerModIndIEs__value_u {
+			E_RABToBeModifiedItemBearerModInd_t	 E_RABToBeModifiedItemBearerModInd;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABToBeModifiedItemBearerModIndIEs_t;
+typedef struct E_RABNotToBeModifiedItemBearerModIndIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABNotToBeModifiedItemBearerModIndIEs__value {
+		E_RABNotToBeModifiedItemBearerModIndIEs__value_PR present;
+		union E_RABNotToBeModifiedItemBearerModIndIEs__value_u {
+			E_RABNotToBeModifiedItemBearerModInd_t	 E_RABNotToBeModifiedItemBearerModInd;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABNotToBeModifiedItemBearerModIndIEs_t;
+typedef struct E_RABFailedToResumeItemResumeReqIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABFailedToResumeItemResumeReqIEs__value {
+		E_RABFailedToResumeItemResumeReqIEs__value_PR present;
+		union E_RABFailedToResumeItemResumeReqIEs__value_u {
+			E_RABFailedToResumeItemResumeReq_t	 E_RABFailedToResumeItemResumeReq;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABFailedToResumeItemResumeReqIEs_t;
+typedef struct E_RABFailedToResumeItemResumeResIEs {
+	ProtocolIE_ID_t	 id;
+	Criticality_t	 criticality;
+	struct E_RABFailedToResumeItemResumeResIEs__value {
+		E_RABFailedToResumeItemResumeResIEs__value_PR present;
+		union E_RABFailedToResumeItemResumeResIEs__value_u {
+			E_RABFailedToResumeItemResumeRes_t	 E_RABFailedToResumeItemResumeRes;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} E_RABFailedToResumeItemResumeResIEs_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_Bearers_SubjectToStatusTransfer_ItemIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_Bearers_SubjectToStatusTransfer_ItemIEs_specs_1;
+extern asn_TYPE_member_t asn_MBR_Bearers_SubjectToStatusTransfer_ItemIEs_1[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABInformationListIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABInformationListIEs_specs_5;
+extern asn_TYPE_member_t asn_MBR_E_RABInformationListIEs_5[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABItemIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABItemIEs_specs_9;
+extern asn_TYPE_member_t asn_MBR_E_RABItemIEs_9[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABUsageReportItemIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABUsageReportItemIEs_specs_13;
+extern asn_TYPE_member_t asn_MBR_E_RABUsageReportItemIEs_13[3];
+extern asn_TYPE_descriptor_t asn_DEF_MDTMode_ExtensionIE;
+extern asn_SEQUENCE_specifics_t asn_SPC_MDTMode_ExtensionIE_specs_17;
+extern asn_TYPE_member_t asn_MBR_MDTMode_ExtensionIE_17[3];
+extern asn_TYPE_descriptor_t asn_DEF_RecommendedCellItemIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_RecommendedCellItemIEs_specs_21;
+extern asn_TYPE_member_t asn_MBR_RecommendedCellItemIEs_21[3];
+extern asn_TYPE_descriptor_t asn_DEF_RecommendedENBItemIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_RecommendedENBItemIEs_specs_25;
+extern asn_TYPE_member_t asn_MBR_RecommendedENBItemIEs_25[3];
+extern asn_TYPE_descriptor_t asn_DEF_SecondaryRATDataUsageReportItemIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_SecondaryRATDataUsageReportItemIEs_specs_29;
+extern asn_TYPE_member_t asn_MBR_SecondaryRATDataUsageReportItemIEs_29[3];
+extern asn_TYPE_descriptor_t asn_DEF_SONInformation_ExtensionIE;
+extern asn_SEQUENCE_specifics_t asn_SPC_SONInformation_ExtensionIE_specs_33;
+extern asn_TYPE_member_t asn_MBR_SONInformation_ExtensionIE_33[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABToBeSetupItemBearerSUReqIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABToBeSetupItemBearerSUReqIEs_specs_37;
+extern asn_TYPE_member_t asn_MBR_E_RABToBeSetupItemBearerSUReqIEs_37[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABSetupItemBearerSUResIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABSetupItemBearerSUResIEs_specs_41;
+extern asn_TYPE_member_t asn_MBR_E_RABSetupItemBearerSUResIEs_41[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABToBeModifiedItemBearerModReqIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABToBeModifiedItemBearerModReqIEs_specs_45;
+extern asn_TYPE_member_t asn_MBR_E_RABToBeModifiedItemBearerModReqIEs_45[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABModifyItemBearerModResIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABModifyItemBearerModResIEs_specs_49;
+extern asn_TYPE_member_t asn_MBR_E_RABModifyItemBearerModResIEs_49[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABReleaseItemBearerRelCompIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABReleaseItemBearerRelCompIEs_specs_53;
+extern asn_TYPE_member_t asn_MBR_E_RABReleaseItemBearerRelCompIEs_53[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABToBeSetupItemCtxtSUReqIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABToBeSetupItemCtxtSUReqIEs_specs_57;
+extern asn_TYPE_member_t asn_MBR_E_RABToBeSetupItemCtxtSUReqIEs_57[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABSetupItemCtxtSUResIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABSetupItemCtxtSUResIEs_specs_61;
+extern asn_TYPE_member_t asn_MBR_E_RABSetupItemCtxtSUResIEs_61[3];
+extern asn_TYPE_descriptor_t asn_DEF_TAIItemIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_TAIItemIEs_specs_65;
+extern asn_TYPE_member_t asn_MBR_TAIItemIEs_65[3];
+extern asn_TYPE_descriptor_t asn_DEF_UE_associatedLogicalS1_ConnectionItemRes;
+extern asn_SEQUENCE_specifics_t asn_SPC_UE_associatedLogicalS1_ConnectionItemRes_specs_69;
+extern asn_TYPE_member_t asn_MBR_UE_associatedLogicalS1_ConnectionItemRes_69[3];
+extern asn_TYPE_descriptor_t asn_DEF_UE_associatedLogicalS1_ConnectionItemResAck;
+extern asn_SEQUENCE_specifics_t asn_SPC_UE_associatedLogicalS1_ConnectionItemResAck_specs_73;
+extern asn_TYPE_member_t asn_MBR_UE_associatedLogicalS1_ConnectionItemResAck_73[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABModifyItemBearerModConfIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABModifyItemBearerModConfIEs_specs_77;
+extern asn_TYPE_member_t asn_MBR_E_RABModifyItemBearerModConfIEs_77[3];
+extern asn_TYPE_descriptor_t asn_DEF_HandoverRequiredIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_HandoverRequiredIEs_specs_81;
+extern asn_TYPE_member_t asn_MBR_HandoverRequiredIEs_81[3];
+extern asn_TYPE_descriptor_t asn_DEF_HandoverCommandIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_HandoverCommandIEs_specs_85;
+extern asn_TYPE_member_t asn_MBR_HandoverCommandIEs_85[3];
+extern asn_TYPE_descriptor_t asn_DEF_HandoverPreparationFailureIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_HandoverPreparationFailureIEs_specs_89;
+extern asn_TYPE_member_t asn_MBR_HandoverPreparationFailureIEs_89[3];
+extern asn_TYPE_descriptor_t asn_DEF_HandoverRequestIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_HandoverRequestIEs_specs_93;
+extern asn_TYPE_member_t asn_MBR_HandoverRequestIEs_93[3];
+extern asn_TYPE_descriptor_t asn_DEF_HandoverRequestAcknowledgeIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_HandoverRequestAcknowledgeIEs_specs_97;
+extern asn_TYPE_member_t asn_MBR_HandoverRequestAcknowledgeIEs_97[3];
+extern asn_TYPE_descriptor_t asn_DEF_HandoverFailureIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_HandoverFailureIEs_specs_101;
+extern asn_TYPE_member_t asn_MBR_HandoverFailureIEs_101[3];
+extern asn_TYPE_descriptor_t asn_DEF_HandoverNotifyIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_HandoverNotifyIEs_specs_105;
+extern asn_TYPE_member_t asn_MBR_HandoverNotifyIEs_105[3];
+extern asn_TYPE_descriptor_t asn_DEF_PathSwitchRequestIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_PathSwitchRequestIEs_specs_109;
+extern asn_TYPE_member_t asn_MBR_PathSwitchRequestIEs_109[3];
+extern asn_TYPE_descriptor_t asn_DEF_PathSwitchRequestAcknowledgeIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_PathSwitchRequestAcknowledgeIEs_specs_113;
+extern asn_TYPE_member_t asn_MBR_PathSwitchRequestAcknowledgeIEs_113[3];
+extern asn_TYPE_descriptor_t asn_DEF_PathSwitchRequestFailureIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_PathSwitchRequestFailureIEs_specs_117;
+extern asn_TYPE_member_t asn_MBR_PathSwitchRequestFailureIEs_117[3];
+extern asn_TYPE_descriptor_t asn_DEF_HandoverCancelIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_HandoverCancelIEs_specs_121;
+extern asn_TYPE_member_t asn_MBR_HandoverCancelIEs_121[3];
+extern asn_TYPE_descriptor_t asn_DEF_HandoverCancelAcknowledgeIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_HandoverCancelAcknowledgeIEs_specs_125;
+extern asn_TYPE_member_t asn_MBR_HandoverCancelAcknowledgeIEs_125[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABSetupRequestIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABSetupRequestIEs_specs_129;
+extern asn_TYPE_member_t asn_MBR_E_RABSetupRequestIEs_129[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABSetupResponseIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABSetupResponseIEs_specs_133;
+extern asn_TYPE_member_t asn_MBR_E_RABSetupResponseIEs_133[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABModifyRequestIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABModifyRequestIEs_specs_137;
+extern asn_TYPE_member_t asn_MBR_E_RABModifyRequestIEs_137[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABModifyResponseIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABModifyResponseIEs_specs_141;
+extern asn_TYPE_member_t asn_MBR_E_RABModifyResponseIEs_141[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABReleaseCommandIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABReleaseCommandIEs_specs_145;
+extern asn_TYPE_member_t asn_MBR_E_RABReleaseCommandIEs_145[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABReleaseResponseIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABReleaseResponseIEs_specs_149;
+extern asn_TYPE_member_t asn_MBR_E_RABReleaseResponseIEs_149[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABReleaseIndicationIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABReleaseIndicationIEs_specs_153;
+extern asn_TYPE_member_t asn_MBR_E_RABReleaseIndicationIEs_153[3];
+extern asn_TYPE_descriptor_t asn_DEF_InitialContextSetupRequestIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_InitialContextSetupRequestIEs_specs_157;
+extern asn_TYPE_member_t asn_MBR_InitialContextSetupRequestIEs_157[3];
+extern asn_TYPE_descriptor_t asn_DEF_InitialContextSetupResponseIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_InitialContextSetupResponseIEs_specs_161;
+extern asn_TYPE_member_t asn_MBR_InitialContextSetupResponseIEs_161[3];
+extern asn_TYPE_descriptor_t asn_DEF_InitialContextSetupFailureIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_InitialContextSetupFailureIEs_specs_165;
+extern asn_TYPE_member_t asn_MBR_InitialContextSetupFailureIEs_165[3];
+extern asn_TYPE_descriptor_t asn_DEF_PagingIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_PagingIEs_specs_169;
+extern asn_TYPE_member_t asn_MBR_PagingIEs_169[3];
+extern asn_TYPE_descriptor_t asn_DEF_UEContextReleaseRequest_IEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_UEContextReleaseRequest_IEs_specs_173;
+extern asn_TYPE_member_t asn_MBR_UEContextReleaseRequest_IEs_173[3];
+extern asn_TYPE_descriptor_t asn_DEF_UEContextReleaseCommand_IEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_UEContextReleaseCommand_IEs_specs_177;
+extern asn_TYPE_member_t asn_MBR_UEContextReleaseCommand_IEs_177[3];
+extern asn_TYPE_descriptor_t asn_DEF_UEContextReleaseComplete_IEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_UEContextReleaseComplete_IEs_specs_181;
+extern asn_TYPE_member_t asn_MBR_UEContextReleaseComplete_IEs_181[3];
+extern asn_TYPE_descriptor_t asn_DEF_UEContextModificationRequestIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_UEContextModificationRequestIEs_specs_185;
+extern asn_TYPE_member_t asn_MBR_UEContextModificationRequestIEs_185[3];
+extern asn_TYPE_descriptor_t asn_DEF_UEContextModificationResponseIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_UEContextModificationResponseIEs_specs_189;
+extern asn_TYPE_member_t asn_MBR_UEContextModificationResponseIEs_189[3];
+extern asn_TYPE_descriptor_t asn_DEF_UEContextModificationFailureIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_UEContextModificationFailureIEs_specs_193;
+extern asn_TYPE_member_t asn_MBR_UEContextModificationFailureIEs_193[3];
+extern asn_TYPE_descriptor_t asn_DEF_UERadioCapabilityMatchRequestIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_UERadioCapabilityMatchRequestIEs_specs_197;
+extern asn_TYPE_member_t asn_MBR_UERadioCapabilityMatchRequestIEs_197[3];
+extern asn_TYPE_descriptor_t asn_DEF_UERadioCapabilityMatchResponseIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_UERadioCapabilityMatchResponseIEs_specs_201;
+extern asn_TYPE_member_t asn_MBR_UERadioCapabilityMatchResponseIEs_201[3];
+extern asn_TYPE_descriptor_t asn_DEF_DownlinkNASTransport_IEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_DownlinkNASTransport_IEs_specs_205;
+extern asn_TYPE_member_t asn_MBR_DownlinkNASTransport_IEs_205[3];
+extern asn_TYPE_descriptor_t asn_DEF_InitialUEMessage_IEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_InitialUEMessage_IEs_specs_209;
+extern asn_TYPE_member_t asn_MBR_InitialUEMessage_IEs_209[3];
+extern asn_TYPE_descriptor_t asn_DEF_UplinkNASTransport_IEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_UplinkNASTransport_IEs_specs_213;
+extern asn_TYPE_member_t asn_MBR_UplinkNASTransport_IEs_213[3];
+extern asn_TYPE_descriptor_t asn_DEF_NASNonDeliveryIndication_IEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_NASNonDeliveryIndication_IEs_specs_217;
+extern asn_TYPE_member_t asn_MBR_NASNonDeliveryIndication_IEs_217[3];
+extern asn_TYPE_descriptor_t asn_DEF_RerouteNASRequest_IEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_RerouteNASRequest_IEs_specs_221;
+extern asn_TYPE_member_t asn_MBR_RerouteNASRequest_IEs_221[3];
+extern asn_TYPE_descriptor_t asn_DEF_NASDeliveryIndicationIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_NASDeliveryIndicationIEs_specs_225;
+extern asn_TYPE_member_t asn_MBR_NASDeliveryIndicationIEs_225[3];
+extern asn_TYPE_descriptor_t asn_DEF_ResetIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_ResetIEs_specs_229;
+extern asn_TYPE_member_t asn_MBR_ResetIEs_229[3];
+extern asn_TYPE_descriptor_t asn_DEF_ResetAcknowledgeIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_ResetAcknowledgeIEs_specs_233;
+extern asn_TYPE_member_t asn_MBR_ResetAcknowledgeIEs_233[3];
+extern asn_TYPE_descriptor_t asn_DEF_ErrorIndicationIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_ErrorIndicationIEs_specs_237;
+extern asn_TYPE_member_t asn_MBR_ErrorIndicationIEs_237[3];
+extern asn_TYPE_descriptor_t asn_DEF_S1SetupRequestIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_S1SetupRequestIEs_specs_241;
+extern asn_TYPE_member_t asn_MBR_S1SetupRequestIEs_241[3];
+extern asn_TYPE_descriptor_t asn_DEF_S1SetupResponseIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_S1SetupResponseIEs_specs_245;
+extern asn_TYPE_member_t asn_MBR_S1SetupResponseIEs_245[3];
+extern asn_TYPE_descriptor_t asn_DEF_S1SetupFailureIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_S1SetupFailureIEs_specs_249;
+extern asn_TYPE_member_t asn_MBR_S1SetupFailureIEs_249[3];
+extern asn_TYPE_descriptor_t asn_DEF_ENBConfigurationUpdateIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_ENBConfigurationUpdateIEs_specs_253;
+extern asn_TYPE_member_t asn_MBR_ENBConfigurationUpdateIEs_253[3];
+extern asn_TYPE_descriptor_t asn_DEF_ENBConfigurationUpdateAcknowledgeIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_ENBConfigurationUpdateAcknowledgeIEs_specs_257;
+extern asn_TYPE_member_t asn_MBR_ENBConfigurationUpdateAcknowledgeIEs_257[3];
+extern asn_TYPE_descriptor_t asn_DEF_ENBConfigurationUpdateFailureIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_ENBConfigurationUpdateFailureIEs_specs_261;
+extern asn_TYPE_member_t asn_MBR_ENBConfigurationUpdateFailureIEs_261[3];
+extern asn_TYPE_descriptor_t asn_DEF_MMEConfigurationUpdateIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_MMEConfigurationUpdateIEs_specs_265;
+extern asn_TYPE_member_t asn_MBR_MMEConfigurationUpdateIEs_265[3];
+extern asn_TYPE_descriptor_t asn_DEF_MMEConfigurationUpdateAcknowledgeIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_MMEConfigurationUpdateAcknowledgeIEs_specs_269;
+extern asn_TYPE_member_t asn_MBR_MMEConfigurationUpdateAcknowledgeIEs_269[3];
+extern asn_TYPE_descriptor_t asn_DEF_MMEConfigurationUpdateFailureIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_MMEConfigurationUpdateFailureIEs_specs_273;
+extern asn_TYPE_member_t asn_MBR_MMEConfigurationUpdateFailureIEs_273[3];
+extern asn_TYPE_descriptor_t asn_DEF_DownlinkS1cdma2000tunnellingIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_DownlinkS1cdma2000tunnellingIEs_specs_277;
+extern asn_TYPE_member_t asn_MBR_DownlinkS1cdma2000tunnellingIEs_277[3];
+extern asn_TYPE_descriptor_t asn_DEF_UplinkS1cdma2000tunnellingIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_UplinkS1cdma2000tunnellingIEs_specs_281;
+extern asn_TYPE_member_t asn_MBR_UplinkS1cdma2000tunnellingIEs_281[3];
+extern asn_TYPE_descriptor_t asn_DEF_UECapabilityInfoIndicationIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_UECapabilityInfoIndicationIEs_specs_285;
+extern asn_TYPE_member_t asn_MBR_UECapabilityInfoIndicationIEs_285[3];
+extern asn_TYPE_descriptor_t asn_DEF_ENBStatusTransferIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_ENBStatusTransferIEs_specs_289;
+extern asn_TYPE_member_t asn_MBR_ENBStatusTransferIEs_289[3];
+extern asn_TYPE_descriptor_t asn_DEF_MMEStatusTransferIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_MMEStatusTransferIEs_specs_293;
+extern asn_TYPE_member_t asn_MBR_MMEStatusTransferIEs_293[3];
+extern asn_TYPE_descriptor_t asn_DEF_TraceStartIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_TraceStartIEs_specs_297;
+extern asn_TYPE_member_t asn_MBR_TraceStartIEs_297[3];
+extern asn_TYPE_descriptor_t asn_DEF_TraceFailureIndicationIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_TraceFailureIndicationIEs_specs_301;
+extern asn_TYPE_member_t asn_MBR_TraceFailureIndicationIEs_301[3];
+extern asn_TYPE_descriptor_t asn_DEF_DeactivateTraceIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_DeactivateTraceIEs_specs_305;
+extern asn_TYPE_member_t asn_MBR_DeactivateTraceIEs_305[3];
+extern asn_TYPE_descriptor_t asn_DEF_CellTrafficTraceIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_CellTrafficTraceIEs_specs_309;
+extern asn_TYPE_member_t asn_MBR_CellTrafficTraceIEs_309[3];
+extern asn_TYPE_descriptor_t asn_DEF_LocationReportingControlIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_LocationReportingControlIEs_specs_313;
+extern asn_TYPE_member_t asn_MBR_LocationReportingControlIEs_313[3];
+extern asn_TYPE_descriptor_t asn_DEF_LocationReportingFailureIndicationIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_LocationReportingFailureIndicationIEs_specs_317;
+extern asn_TYPE_member_t asn_MBR_LocationReportingFailureIndicationIEs_317[3];
+extern asn_TYPE_descriptor_t asn_DEF_LocationReportIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_LocationReportIEs_specs_321;
+extern asn_TYPE_member_t asn_MBR_LocationReportIEs_321[3];
+extern asn_TYPE_descriptor_t asn_DEF_OverloadStartIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_OverloadStartIEs_specs_325;
+extern asn_TYPE_member_t asn_MBR_OverloadStartIEs_325[3];
+extern asn_TYPE_descriptor_t asn_DEF_OverloadStopIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_OverloadStopIEs_specs_329;
+extern asn_TYPE_member_t asn_MBR_OverloadStopIEs_329[3];
+extern asn_TYPE_descriptor_t asn_DEF_WriteReplaceWarningRequestIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_WriteReplaceWarningRequestIEs_specs_333;
+extern asn_TYPE_member_t asn_MBR_WriteReplaceWarningRequestIEs_333[3];
+extern asn_TYPE_descriptor_t asn_DEF_WriteReplaceWarningResponseIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_WriteReplaceWarningResponseIEs_specs_337;
+extern asn_TYPE_member_t asn_MBR_WriteReplaceWarningResponseIEs_337[3];
+extern asn_TYPE_descriptor_t asn_DEF_ENBDirectInformationTransferIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_ENBDirectInformationTransferIEs_specs_341;
+extern asn_TYPE_member_t asn_MBR_ENBDirectInformationTransferIEs_341[3];
+extern asn_TYPE_descriptor_t asn_DEF_MMEDirectInformationTransferIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_MMEDirectInformationTransferIEs_specs_345;
+extern asn_TYPE_member_t asn_MBR_MMEDirectInformationTransferIEs_345[3];
+extern asn_TYPE_descriptor_t asn_DEF_ENBConfigurationTransferIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_ENBConfigurationTransferIEs_specs_349;
+extern asn_TYPE_member_t asn_MBR_ENBConfigurationTransferIEs_349[3];
+extern asn_TYPE_descriptor_t asn_DEF_MMEConfigurationTransferIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_MMEConfigurationTransferIEs_specs_353;
+extern asn_TYPE_member_t asn_MBR_MMEConfigurationTransferIEs_353[3];
+extern asn_TYPE_descriptor_t asn_DEF_KillRequestIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_KillRequestIEs_specs_357;
+extern asn_TYPE_member_t asn_MBR_KillRequestIEs_357[3];
+extern asn_TYPE_descriptor_t asn_DEF_KillResponseIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_KillResponseIEs_specs_361;
+extern asn_TYPE_member_t asn_MBR_KillResponseIEs_361[3];
+extern asn_TYPE_descriptor_t asn_DEF_PWSRestartIndicationIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_PWSRestartIndicationIEs_specs_365;
+extern asn_TYPE_member_t asn_MBR_PWSRestartIndicationIEs_365[3];
+extern asn_TYPE_descriptor_t asn_DEF_PWSFailureIndicationIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_PWSFailureIndicationIEs_specs_369;
+extern asn_TYPE_member_t asn_MBR_PWSFailureIndicationIEs_369[3];
+extern asn_TYPE_descriptor_t asn_DEF_DownlinkUEAssociatedLPPaTransport_IEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_DownlinkUEAssociatedLPPaTransport_IEs_specs_373;
+extern asn_TYPE_member_t asn_MBR_DownlinkUEAssociatedLPPaTransport_IEs_373[3];
+extern asn_TYPE_descriptor_t asn_DEF_UplinkUEAssociatedLPPaTransport_IEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_UplinkUEAssociatedLPPaTransport_IEs_specs_377;
+extern asn_TYPE_member_t asn_MBR_UplinkUEAssociatedLPPaTransport_IEs_377[3];
+extern asn_TYPE_descriptor_t asn_DEF_DownlinkNonUEAssociatedLPPaTransport_IEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_DownlinkNonUEAssociatedLPPaTransport_IEs_specs_381;
+extern asn_TYPE_member_t asn_MBR_DownlinkNonUEAssociatedLPPaTransport_IEs_381[3];
+extern asn_TYPE_descriptor_t asn_DEF_UplinkNonUEAssociatedLPPaTransport_IEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_UplinkNonUEAssociatedLPPaTransport_IEs_specs_385;
+extern asn_TYPE_member_t asn_MBR_UplinkNonUEAssociatedLPPaTransport_IEs_385[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABModificationIndicationIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABModificationIndicationIEs_specs_389;
+extern asn_TYPE_member_t asn_MBR_E_RABModificationIndicationIEs_389[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABModificationConfirmIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABModificationConfirmIEs_specs_393;
+extern asn_TYPE_member_t asn_MBR_E_RABModificationConfirmIEs_393[3];
+extern asn_TYPE_descriptor_t asn_DEF_UEContextModificationIndicationIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_UEContextModificationIndicationIEs_specs_397;
+extern asn_TYPE_member_t asn_MBR_UEContextModificationIndicationIEs_397[3];
+extern asn_TYPE_descriptor_t asn_DEF_UEContextModificationConfirmIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_UEContextModificationConfirmIEs_specs_401;
+extern asn_TYPE_member_t asn_MBR_UEContextModificationConfirmIEs_401[3];
+extern asn_TYPE_descriptor_t asn_DEF_UEContextSuspendRequestIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_UEContextSuspendRequestIEs_specs_405;
+extern asn_TYPE_member_t asn_MBR_UEContextSuspendRequestIEs_405[3];
+extern asn_TYPE_descriptor_t asn_DEF_UEContextSuspendResponseIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_UEContextSuspendResponseIEs_specs_409;
+extern asn_TYPE_member_t asn_MBR_UEContextSuspendResponseIEs_409[3];
+extern asn_TYPE_descriptor_t asn_DEF_UEContextResumeRequestIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_UEContextResumeRequestIEs_specs_413;
+extern asn_TYPE_member_t asn_MBR_UEContextResumeRequestIEs_413[3];
+extern asn_TYPE_descriptor_t asn_DEF_UEContextResumeResponseIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_UEContextResumeResponseIEs_specs_417;
+extern asn_TYPE_member_t asn_MBR_UEContextResumeResponseIEs_417[3];
+extern asn_TYPE_descriptor_t asn_DEF_UEContextResumeFailureIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_UEContextResumeFailureIEs_specs_421;
+extern asn_TYPE_member_t asn_MBR_UEContextResumeFailureIEs_421[3];
+extern asn_TYPE_descriptor_t asn_DEF_ConnectionEstablishmentIndicationIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_ConnectionEstablishmentIndicationIEs_specs_425;
+extern asn_TYPE_member_t asn_MBR_ConnectionEstablishmentIndicationIEs_425[3];
+extern asn_TYPE_descriptor_t asn_DEF_RetrieveUEInformationIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_RetrieveUEInformationIEs_specs_429;
+extern asn_TYPE_member_t asn_MBR_RetrieveUEInformationIEs_429[3];
+extern asn_TYPE_descriptor_t asn_DEF_UEInformationTransferIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_UEInformationTransferIEs_specs_433;
+extern asn_TYPE_member_t asn_MBR_UEInformationTransferIEs_433[3];
+extern asn_TYPE_descriptor_t asn_DEF_ENBCPRelocationIndicationIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_ENBCPRelocationIndicationIEs_specs_437;
+extern asn_TYPE_member_t asn_MBR_ENBCPRelocationIndicationIEs_437[3];
+extern asn_TYPE_descriptor_t asn_DEF_MMECPRelocationIndicationIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_MMECPRelocationIndicationIEs_specs_441;
+extern asn_TYPE_member_t asn_MBR_MMECPRelocationIndicationIEs_441[3];
+extern asn_TYPE_descriptor_t asn_DEF_SecondaryRATDataUsageReportIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_SecondaryRATDataUsageReportIEs_specs_445;
+extern asn_TYPE_member_t asn_MBR_SecondaryRATDataUsageReportIEs_445[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABDataForwardingItemIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABDataForwardingItemIEs_specs_449;
+extern asn_TYPE_member_t asn_MBR_E_RABDataForwardingItemIEs_449[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABToBeSetupItemHOReqIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABToBeSetupItemHOReqIEs_specs_453;
+extern asn_TYPE_member_t asn_MBR_E_RABToBeSetupItemHOReqIEs_453[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABAdmittedItemIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABAdmittedItemIEs_specs_457;
+extern asn_TYPE_member_t asn_MBR_E_RABAdmittedItemIEs_457[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABFailedtoSetupItemHOReqAckIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABFailedtoSetupItemHOReqAckIEs_specs_461;
+extern asn_TYPE_member_t asn_MBR_E_RABFailedtoSetupItemHOReqAckIEs_461[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABToBeSwitchedDLItemIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABToBeSwitchedDLItemIEs_specs_465;
+extern asn_TYPE_member_t asn_MBR_E_RABToBeSwitchedDLItemIEs_465[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABToBeSwitchedULItemIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABToBeSwitchedULItemIEs_specs_469;
+extern asn_TYPE_member_t asn_MBR_E_RABToBeSwitchedULItemIEs_469[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABToBeModifiedItemBearerModIndIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABToBeModifiedItemBearerModIndIEs_specs_473;
+extern asn_TYPE_member_t asn_MBR_E_RABToBeModifiedItemBearerModIndIEs_473[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABNotToBeModifiedItemBearerModIndIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABNotToBeModifiedItemBearerModIndIEs_specs_477;
+extern asn_TYPE_member_t asn_MBR_E_RABNotToBeModifiedItemBearerModIndIEs_477[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABFailedToResumeItemResumeReqIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABFailedToResumeItemResumeReqIEs_specs_481;
+extern asn_TYPE_member_t asn_MBR_E_RABFailedToResumeItemResumeReqIEs_481[3];
+extern asn_TYPE_descriptor_t asn_DEF_E_RABFailedToResumeItemResumeResIEs;
+extern asn_SEQUENCE_specifics_t asn_SPC_E_RABFailedToResumeItemResumeResIEs_specs_485;
+extern asn_TYPE_member_t asn_MBR_E_RABFailedToResumeItemResumeResIEs_485[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ProtocolIE_Field_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ProtocolIE-FieldPair.h b/src/s1ap/asn1c/asnGenFiles/ProtocolIE-FieldPair.h
new file mode 100644
index 0000000..4fb1c6a
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ProtocolIE-FieldPair.h
@@ -0,0 +1,23 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-Containers"
+ * 	found in "./asn1c/S1AP-Containers.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ProtocolIE_FieldPair_H_
+#define	_ProtocolIE_FieldPair_H_
+
+
+#include <asn_application.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ProtocolIE_FieldPair_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ProtocolIE-ID.h b/src/s1ap/asn1c/asnGenFiles/ProtocolIE-ID.h
new file mode 100644
index 0000000..d74696d
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ProtocolIE-ID.h
@@ -0,0 +1,325 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-CommonDataTypes"
+ * 	found in "./asn1c/S1AP-CommonDataTypes.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ProtocolIE_ID_H_
+#define	_ProtocolIE_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ProtocolIE-ID */
+typedef long	 ProtocolIE_ID_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_ProtocolIE_ID_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ID;
+asn_struct_free_f ProtocolIE_ID_free;
+asn_struct_print_f ProtocolIE_ID_print;
+asn_constr_check_f ProtocolIE_ID_constraint;
+ber_type_decoder_f ProtocolIE_ID_decode_ber;
+der_type_encoder_f ProtocolIE_ID_encode_der;
+xer_type_decoder_f ProtocolIE_ID_decode_xer;
+xer_type_encoder_f ProtocolIE_ID_encode_xer;
+oer_type_decoder_f ProtocolIE_ID_decode_oer;
+oer_type_encoder_f ProtocolIE_ID_encode_oer;
+per_type_decoder_f ProtocolIE_ID_decode_uper;
+per_type_encoder_f ProtocolIE_ID_encode_uper;
+per_type_decoder_f ProtocolIE_ID_decode_aper;
+per_type_encoder_f ProtocolIE_ID_encode_aper;
+#define ProtocolIE_ID_id_MME_UE_S1AP_ID	((ProtocolIE_ID_t)0)
+#define ProtocolIE_ID_id_HandoverType	((ProtocolIE_ID_t)1)
+#define ProtocolIE_ID_id_Cause	((ProtocolIE_ID_t)2)
+#define ProtocolIE_ID_id_SourceID	((ProtocolIE_ID_t)3)
+#define ProtocolIE_ID_id_TargetID	((ProtocolIE_ID_t)4)
+#define ProtocolIE_ID_id_eNB_UE_S1AP_ID	((ProtocolIE_ID_t)8)
+#define ProtocolIE_ID_id_E_RABSubjecttoDataForwardingList	((ProtocolIE_ID_t)12)
+#define ProtocolIE_ID_id_E_RABtoReleaseListHOCmd	((ProtocolIE_ID_t)13)
+#define ProtocolIE_ID_id_E_RABDataForwardingItem	((ProtocolIE_ID_t)14)
+#define ProtocolIE_ID_id_E_RABReleaseItemBearerRelComp	((ProtocolIE_ID_t)15)
+#define ProtocolIE_ID_id_E_RABToBeSetupListBearerSUReq	((ProtocolIE_ID_t)16)
+#define ProtocolIE_ID_id_E_RABToBeSetupItemBearerSUReq	((ProtocolIE_ID_t)17)
+#define ProtocolIE_ID_id_E_RABAdmittedList	((ProtocolIE_ID_t)18)
+#define ProtocolIE_ID_id_E_RABFailedToSetupListHOReqAck	((ProtocolIE_ID_t)19)
+#define ProtocolIE_ID_id_E_RABAdmittedItem	((ProtocolIE_ID_t)20)
+#define ProtocolIE_ID_id_E_RABFailedtoSetupItemHOReqAck	((ProtocolIE_ID_t)21)
+#define ProtocolIE_ID_id_E_RABToBeSwitchedDLList	((ProtocolIE_ID_t)22)
+#define ProtocolIE_ID_id_E_RABToBeSwitchedDLItem	((ProtocolIE_ID_t)23)
+#define ProtocolIE_ID_id_E_RABToBeSetupListCtxtSUReq	((ProtocolIE_ID_t)24)
+#define ProtocolIE_ID_id_TraceActivation	((ProtocolIE_ID_t)25)
+#define ProtocolIE_ID_id_NAS_PDU	((ProtocolIE_ID_t)26)
+#define ProtocolIE_ID_id_E_RABToBeSetupItemHOReq	((ProtocolIE_ID_t)27)
+#define ProtocolIE_ID_id_E_RABSetupListBearerSURes	((ProtocolIE_ID_t)28)
+#define ProtocolIE_ID_id_E_RABFailedToSetupListBearerSURes	((ProtocolIE_ID_t)29)
+#define ProtocolIE_ID_id_E_RABToBeModifiedListBearerModReq	((ProtocolIE_ID_t)30)
+#define ProtocolIE_ID_id_E_RABModifyListBearerModRes	((ProtocolIE_ID_t)31)
+#define ProtocolIE_ID_id_E_RABFailedToModifyList	((ProtocolIE_ID_t)32)
+#define ProtocolIE_ID_id_E_RABToBeReleasedList	((ProtocolIE_ID_t)33)
+#define ProtocolIE_ID_id_E_RABFailedToReleaseList	((ProtocolIE_ID_t)34)
+#define ProtocolIE_ID_id_E_RABItem	((ProtocolIE_ID_t)35)
+#define ProtocolIE_ID_id_E_RABToBeModifiedItemBearerModReq	((ProtocolIE_ID_t)36)
+#define ProtocolIE_ID_id_E_RABModifyItemBearerModRes	((ProtocolIE_ID_t)37)
+#define ProtocolIE_ID_id_E_RABReleaseItem	((ProtocolIE_ID_t)38)
+#define ProtocolIE_ID_id_E_RABSetupItemBearerSURes	((ProtocolIE_ID_t)39)
+#define ProtocolIE_ID_id_SecurityContext	((ProtocolIE_ID_t)40)
+#define ProtocolIE_ID_id_HandoverRestrictionList	((ProtocolIE_ID_t)41)
+#define ProtocolIE_ID_id_UEPagingID	((ProtocolIE_ID_t)43)
+#define ProtocolIE_ID_id_pagingDRX	((ProtocolIE_ID_t)44)
+#define ProtocolIE_ID_id_TAIList	((ProtocolIE_ID_t)46)
+#define ProtocolIE_ID_id_TAIItem	((ProtocolIE_ID_t)47)
+#define ProtocolIE_ID_id_E_RABFailedToSetupListCtxtSURes	((ProtocolIE_ID_t)48)
+#define ProtocolIE_ID_id_E_RABReleaseItemHOCmd	((ProtocolIE_ID_t)49)
+#define ProtocolIE_ID_id_E_RABSetupItemCtxtSURes	((ProtocolIE_ID_t)50)
+#define ProtocolIE_ID_id_E_RABSetupListCtxtSURes	((ProtocolIE_ID_t)51)
+#define ProtocolIE_ID_id_E_RABToBeSetupItemCtxtSUReq	((ProtocolIE_ID_t)52)
+#define ProtocolIE_ID_id_E_RABToBeSetupListHOReq	((ProtocolIE_ID_t)53)
+#define ProtocolIE_ID_id_GERANtoLTEHOInformationRes	((ProtocolIE_ID_t)55)
+#define ProtocolIE_ID_id_UTRANtoLTEHOInformationRes	((ProtocolIE_ID_t)57)
+#define ProtocolIE_ID_id_CriticalityDiagnostics	((ProtocolIE_ID_t)58)
+#define ProtocolIE_ID_id_Global_ENB_ID	((ProtocolIE_ID_t)59)
+#define ProtocolIE_ID_id_eNBname	((ProtocolIE_ID_t)60)
+#define ProtocolIE_ID_id_MMEname	((ProtocolIE_ID_t)61)
+#define ProtocolIE_ID_id_ServedPLMNs	((ProtocolIE_ID_t)63)
+#define ProtocolIE_ID_id_SupportedTAs	((ProtocolIE_ID_t)64)
+#define ProtocolIE_ID_id_TimeToWait	((ProtocolIE_ID_t)65)
+#define ProtocolIE_ID_id_uEaggregateMaximumBitrate	((ProtocolIE_ID_t)66)
+#define ProtocolIE_ID_id_TAI	((ProtocolIE_ID_t)67)
+#define ProtocolIE_ID_id_E_RABReleaseListBearerRelComp	((ProtocolIE_ID_t)69)
+#define ProtocolIE_ID_id_cdma2000PDU	((ProtocolIE_ID_t)70)
+#define ProtocolIE_ID_id_cdma2000RATType	((ProtocolIE_ID_t)71)
+#define ProtocolIE_ID_id_cdma2000SectorID	((ProtocolIE_ID_t)72)
+#define ProtocolIE_ID_id_SecurityKey	((ProtocolIE_ID_t)73)
+#define ProtocolIE_ID_id_UERadioCapability	((ProtocolIE_ID_t)74)
+#define ProtocolIE_ID_id_GUMMEI_ID	((ProtocolIE_ID_t)75)
+#define ProtocolIE_ID_id_E_RABInformationListItem	((ProtocolIE_ID_t)78)
+#define ProtocolIE_ID_id_Direct_Forwarding_Path_Availability	((ProtocolIE_ID_t)79)
+#define ProtocolIE_ID_id_UEIdentityIndexValue	((ProtocolIE_ID_t)80)
+#define ProtocolIE_ID_id_cdma2000HOStatus	((ProtocolIE_ID_t)83)
+#define ProtocolIE_ID_id_cdma2000HORequiredIndication	((ProtocolIE_ID_t)84)
+#define ProtocolIE_ID_id_E_UTRAN_Trace_ID	((ProtocolIE_ID_t)86)
+#define ProtocolIE_ID_id_RelativeMMECapacity	((ProtocolIE_ID_t)87)
+#define ProtocolIE_ID_id_SourceMME_UE_S1AP_ID	((ProtocolIE_ID_t)88)
+#define ProtocolIE_ID_id_Bearers_SubjectToStatusTransfer_Item	((ProtocolIE_ID_t)89)
+#define ProtocolIE_ID_id_eNB_StatusTransfer_TransparentContainer	((ProtocolIE_ID_t)90)
+#define ProtocolIE_ID_id_UE_associatedLogicalS1_ConnectionItem	((ProtocolIE_ID_t)91)
+#define ProtocolIE_ID_id_ResetType	((ProtocolIE_ID_t)92)
+#define ProtocolIE_ID_id_UE_associatedLogicalS1_ConnectionListResAck	((ProtocolIE_ID_t)93)
+#define ProtocolIE_ID_id_E_RABToBeSwitchedULItem	((ProtocolIE_ID_t)94)
+#define ProtocolIE_ID_id_E_RABToBeSwitchedULList	((ProtocolIE_ID_t)95)
+#define ProtocolIE_ID_id_S_TMSI	((ProtocolIE_ID_t)96)
+#define ProtocolIE_ID_id_cdma2000OneXRAND	((ProtocolIE_ID_t)97)
+#define ProtocolIE_ID_id_RequestType	((ProtocolIE_ID_t)98)
+#define ProtocolIE_ID_id_UE_S1AP_IDs	((ProtocolIE_ID_t)99)
+#define ProtocolIE_ID_id_EUTRAN_CGI	((ProtocolIE_ID_t)100)
+#define ProtocolIE_ID_id_OverloadResponse	((ProtocolIE_ID_t)101)
+#define ProtocolIE_ID_id_cdma2000OneXSRVCCInfo	((ProtocolIE_ID_t)102)
+#define ProtocolIE_ID_id_E_RABFailedToBeReleasedList	((ProtocolIE_ID_t)103)
+#define ProtocolIE_ID_id_Source_ToTarget_TransparentContainer	((ProtocolIE_ID_t)104)
+#define ProtocolIE_ID_id_ServedGUMMEIs	((ProtocolIE_ID_t)105)
+#define ProtocolIE_ID_id_SubscriberProfileIDforRFP	((ProtocolIE_ID_t)106)
+#define ProtocolIE_ID_id_UESecurityCapabilities	((ProtocolIE_ID_t)107)
+#define ProtocolIE_ID_id_CSFallbackIndicator	((ProtocolIE_ID_t)108)
+#define ProtocolIE_ID_id_CNDomain	((ProtocolIE_ID_t)109)
+#define ProtocolIE_ID_id_E_RABReleasedList	((ProtocolIE_ID_t)110)
+#define ProtocolIE_ID_id_MessageIdentifier	((ProtocolIE_ID_t)111)
+#define ProtocolIE_ID_id_SerialNumber	((ProtocolIE_ID_t)112)
+#define ProtocolIE_ID_id_WarningAreaList	((ProtocolIE_ID_t)113)
+#define ProtocolIE_ID_id_RepetitionPeriod	((ProtocolIE_ID_t)114)
+#define ProtocolIE_ID_id_NumberofBroadcastRequest	((ProtocolIE_ID_t)115)
+#define ProtocolIE_ID_id_WarningType	((ProtocolIE_ID_t)116)
+#define ProtocolIE_ID_id_WarningSecurityInfo	((ProtocolIE_ID_t)117)
+#define ProtocolIE_ID_id_DataCodingScheme	((ProtocolIE_ID_t)118)
+#define ProtocolIE_ID_id_WarningMessageContents	((ProtocolIE_ID_t)119)
+#define ProtocolIE_ID_id_BroadcastCompletedAreaList	((ProtocolIE_ID_t)120)
+#define ProtocolIE_ID_id_Inter_SystemInformationTransferTypeEDT	((ProtocolIE_ID_t)121)
+#define ProtocolIE_ID_id_Inter_SystemInformationTransferTypeMDT	((ProtocolIE_ID_t)122)
+#define ProtocolIE_ID_id_Target_ToSource_TransparentContainer	((ProtocolIE_ID_t)123)
+#define ProtocolIE_ID_id_SRVCCOperationPossible	((ProtocolIE_ID_t)124)
+#define ProtocolIE_ID_id_SRVCCHOIndication	((ProtocolIE_ID_t)125)
+#define ProtocolIE_ID_id_NAS_DownlinkCount	((ProtocolIE_ID_t)126)
+#define ProtocolIE_ID_id_CSG_Id	((ProtocolIE_ID_t)127)
+#define ProtocolIE_ID_id_CSG_IdList	((ProtocolIE_ID_t)128)
+#define ProtocolIE_ID_id_SONConfigurationTransferECT	((ProtocolIE_ID_t)129)
+#define ProtocolIE_ID_id_SONConfigurationTransferMCT	((ProtocolIE_ID_t)130)
+#define ProtocolIE_ID_id_TraceCollectionEntityIPAddress	((ProtocolIE_ID_t)131)
+#define ProtocolIE_ID_id_MSClassmark2	((ProtocolIE_ID_t)132)
+#define ProtocolIE_ID_id_MSClassmark3	((ProtocolIE_ID_t)133)
+#define ProtocolIE_ID_id_RRC_Establishment_Cause	((ProtocolIE_ID_t)134)
+#define ProtocolIE_ID_id_NASSecurityParametersfromE_UTRAN	((ProtocolIE_ID_t)135)
+#define ProtocolIE_ID_id_NASSecurityParameterstoE_UTRAN	((ProtocolIE_ID_t)136)
+#define ProtocolIE_ID_id_DefaultPagingDRX	((ProtocolIE_ID_t)137)
+#define ProtocolIE_ID_id_Source_ToTarget_TransparentContainer_Secondary	((ProtocolIE_ID_t)138)
+#define ProtocolIE_ID_id_Target_ToSource_TransparentContainer_Secondary	((ProtocolIE_ID_t)139)
+#define ProtocolIE_ID_id_EUTRANRoundTripDelayEstimationInfo	((ProtocolIE_ID_t)140)
+#define ProtocolIE_ID_id_BroadcastCancelledAreaList	((ProtocolIE_ID_t)141)
+#define ProtocolIE_ID_id_ConcurrentWarningMessageIndicator	((ProtocolIE_ID_t)142)
+#define ProtocolIE_ID_id_Data_Forwarding_Not_Possible	((ProtocolIE_ID_t)143)
+#define ProtocolIE_ID_id_ExtendedRepetitionPeriod	((ProtocolIE_ID_t)144)
+#define ProtocolIE_ID_id_CellAccessMode	((ProtocolIE_ID_t)145)
+#define ProtocolIE_ID_id_CSGMembershipStatus	((ProtocolIE_ID_t)146)
+#define ProtocolIE_ID_id_LPPa_PDU	((ProtocolIE_ID_t)147)
+#define ProtocolIE_ID_id_Routing_ID	((ProtocolIE_ID_t)148)
+#define ProtocolIE_ID_id_Time_Synchronisation_Info	((ProtocolIE_ID_t)149)
+#define ProtocolIE_ID_id_PS_ServiceNotAvailable	((ProtocolIE_ID_t)150)
+#define ProtocolIE_ID_id_PagingPriority	((ProtocolIE_ID_t)151)
+#define ProtocolIE_ID_id_x2TNLConfigurationInfo	((ProtocolIE_ID_t)152)
+#define ProtocolIE_ID_id_eNBX2ExtendedTransportLayerAddresses	((ProtocolIE_ID_t)153)
+#define ProtocolIE_ID_id_GUMMEIList	((ProtocolIE_ID_t)154)
+#define ProtocolIE_ID_id_GW_TransportLayerAddress	((ProtocolIE_ID_t)155)
+#define ProtocolIE_ID_id_Correlation_ID	((ProtocolIE_ID_t)156)
+#define ProtocolIE_ID_id_SourceMME_GUMMEI	((ProtocolIE_ID_t)157)
+#define ProtocolIE_ID_id_MME_UE_S1AP_ID_2	((ProtocolIE_ID_t)158)
+#define ProtocolIE_ID_id_RegisteredLAI	((ProtocolIE_ID_t)159)
+#define ProtocolIE_ID_id_RelayNode_Indicator	((ProtocolIE_ID_t)160)
+#define ProtocolIE_ID_id_TrafficLoadReductionIndication	((ProtocolIE_ID_t)161)
+#define ProtocolIE_ID_id_MDTConfiguration	((ProtocolIE_ID_t)162)
+#define ProtocolIE_ID_id_MMERelaySupportIndicator	((ProtocolIE_ID_t)163)
+#define ProtocolIE_ID_id_GWContextReleaseIndication	((ProtocolIE_ID_t)164)
+#define ProtocolIE_ID_id_ManagementBasedMDTAllowed	((ProtocolIE_ID_t)165)
+#define ProtocolIE_ID_id_PrivacyIndicator	((ProtocolIE_ID_t)166)
+#define ProtocolIE_ID_id_Time_UE_StayedInCell_EnhancedGranularity	((ProtocolIE_ID_t)167)
+#define ProtocolIE_ID_id_HO_Cause	((ProtocolIE_ID_t)168)
+#define ProtocolIE_ID_id_VoiceSupportMatchIndicator	((ProtocolIE_ID_t)169)
+#define ProtocolIE_ID_id_GUMMEIType	((ProtocolIE_ID_t)170)
+#define ProtocolIE_ID_id_M3Configuration	((ProtocolIE_ID_t)171)
+#define ProtocolIE_ID_id_M4Configuration	((ProtocolIE_ID_t)172)
+#define ProtocolIE_ID_id_M5Configuration	((ProtocolIE_ID_t)173)
+#define ProtocolIE_ID_id_MDT_Location_Info	((ProtocolIE_ID_t)174)
+#define ProtocolIE_ID_id_MobilityInformation	((ProtocolIE_ID_t)175)
+#define ProtocolIE_ID_id_Tunnel_Information_for_BBF	((ProtocolIE_ID_t)176)
+#define ProtocolIE_ID_id_ManagementBasedMDTPLMNList	((ProtocolIE_ID_t)177)
+#define ProtocolIE_ID_id_SignallingBasedMDTPLMNList	((ProtocolIE_ID_t)178)
+#define ProtocolIE_ID_id_ULCOUNTValueExtended	((ProtocolIE_ID_t)179)
+#define ProtocolIE_ID_id_DLCOUNTValueExtended	((ProtocolIE_ID_t)180)
+#define ProtocolIE_ID_id_ReceiveStatusOfULPDCPSDUsExtended	((ProtocolIE_ID_t)181)
+#define ProtocolIE_ID_id_ECGIListForRestart	((ProtocolIE_ID_t)182)
+#define ProtocolIE_ID_id_SIPTO_Correlation_ID	((ProtocolIE_ID_t)183)
+#define ProtocolIE_ID_id_SIPTO_L_GW_TransportLayerAddress	((ProtocolIE_ID_t)184)
+#define ProtocolIE_ID_id_TransportInformation	((ProtocolIE_ID_t)185)
+#define ProtocolIE_ID_id_LHN_ID	((ProtocolIE_ID_t)186)
+#define ProtocolIE_ID_id_AdditionalCSFallbackIndicator	((ProtocolIE_ID_t)187)
+#define ProtocolIE_ID_id_TAIListForRestart	((ProtocolIE_ID_t)188)
+#define ProtocolIE_ID_id_UserLocationInformation	((ProtocolIE_ID_t)189)
+#define ProtocolIE_ID_id_EmergencyAreaIDListForRestart	((ProtocolIE_ID_t)190)
+#define ProtocolIE_ID_id_KillAllWarningMessages	((ProtocolIE_ID_t)191)
+#define ProtocolIE_ID_id_Masked_IMEISV	((ProtocolIE_ID_t)192)
+#define ProtocolIE_ID_id_eNBIndirectX2TransportLayerAddresses	((ProtocolIE_ID_t)193)
+#define ProtocolIE_ID_id_uE_HistoryInformationFromTheUE	((ProtocolIE_ID_t)194)
+#define ProtocolIE_ID_id_ProSeAuthorized	((ProtocolIE_ID_t)195)
+#define ProtocolIE_ID_id_ExpectedUEBehaviour	((ProtocolIE_ID_t)196)
+#define ProtocolIE_ID_id_LoggedMBSFNMDT	((ProtocolIE_ID_t)197)
+#define ProtocolIE_ID_id_UERadioCapabilityForPaging	((ProtocolIE_ID_t)198)
+#define ProtocolIE_ID_id_E_RABToBeModifiedListBearerModInd	((ProtocolIE_ID_t)199)
+#define ProtocolIE_ID_id_E_RABToBeModifiedItemBearerModInd	((ProtocolIE_ID_t)200)
+#define ProtocolIE_ID_id_E_RABNotToBeModifiedListBearerModInd	((ProtocolIE_ID_t)201)
+#define ProtocolIE_ID_id_E_RABNotToBeModifiedItemBearerModInd	((ProtocolIE_ID_t)202)
+#define ProtocolIE_ID_id_E_RABModifyListBearerModConf	((ProtocolIE_ID_t)203)
+#define ProtocolIE_ID_id_E_RABModifyItemBearerModConf	((ProtocolIE_ID_t)204)
+#define ProtocolIE_ID_id_E_RABFailedToModifyListBearerModConf	((ProtocolIE_ID_t)205)
+#define ProtocolIE_ID_id_SON_Information_Report	((ProtocolIE_ID_t)206)
+#define ProtocolIE_ID_id_Muting_Availability_Indication	((ProtocolIE_ID_t)207)
+#define ProtocolIE_ID_id_Muting_Pattern_Information	((ProtocolIE_ID_t)208)
+#define ProtocolIE_ID_id_Synchronisation_Information	((ProtocolIE_ID_t)209)
+#define ProtocolIE_ID_id_E_RABToBeReleasedListBearerModConf	((ProtocolIE_ID_t)210)
+#define ProtocolIE_ID_id_AssistanceDataForPaging	((ProtocolIE_ID_t)211)
+#define ProtocolIE_ID_id_CellIdentifierAndCELevelForCECapableUEs	((ProtocolIE_ID_t)212)
+#define ProtocolIE_ID_id_InformationOnRecommendedCellsAndENBsForPaging	((ProtocolIE_ID_t)213)
+#define ProtocolIE_ID_id_RecommendedCellItem	((ProtocolIE_ID_t)214)
+#define ProtocolIE_ID_id_RecommendedENBItem	((ProtocolIE_ID_t)215)
+#define ProtocolIE_ID_id_ProSeUEtoNetworkRelaying	((ProtocolIE_ID_t)216)
+#define ProtocolIE_ID_id_ULCOUNTValuePDCP_SNlength18	((ProtocolIE_ID_t)217)
+#define ProtocolIE_ID_id_DLCOUNTValuePDCP_SNlength18	((ProtocolIE_ID_t)218)
+#define ProtocolIE_ID_id_ReceiveStatusOfULPDCPSDUsPDCP_SNlength18	((ProtocolIE_ID_t)219)
+#define ProtocolIE_ID_id_M6Configuration	((ProtocolIE_ID_t)220)
+#define ProtocolIE_ID_id_M7Configuration	((ProtocolIE_ID_t)221)
+#define ProtocolIE_ID_id_PWSfailedECGIList	((ProtocolIE_ID_t)222)
+#define ProtocolIE_ID_id_MME_Group_ID	((ProtocolIE_ID_t)223)
+#define ProtocolIE_ID_id_Additional_GUTI	((ProtocolIE_ID_t)224)
+#define ProtocolIE_ID_id_S1_Message	((ProtocolIE_ID_t)225)
+#define ProtocolIE_ID_id_CSGMembershipInfo	((ProtocolIE_ID_t)226)
+#define ProtocolIE_ID_id_Paging_eDRXInformation	((ProtocolIE_ID_t)227)
+#define ProtocolIE_ID_id_UE_RetentionInformation	((ProtocolIE_ID_t)228)
+#define ProtocolIE_ID_id_UE_Usage_Type	((ProtocolIE_ID_t)230)
+#define ProtocolIE_ID_id_extended_UEIdentityIndexValue	((ProtocolIE_ID_t)231)
+#define ProtocolIE_ID_id_RAT_Type	((ProtocolIE_ID_t)232)
+#define ProtocolIE_ID_id_BearerType	((ProtocolIE_ID_t)233)
+#define ProtocolIE_ID_id_NB_IoT_DefaultPagingDRX	((ProtocolIE_ID_t)234)
+#define ProtocolIE_ID_id_E_RABFailedToResumeListResumeReq	((ProtocolIE_ID_t)235)
+#define ProtocolIE_ID_id_E_RABFailedToResumeItemResumeReq	((ProtocolIE_ID_t)236)
+#define ProtocolIE_ID_id_E_RABFailedToResumeListResumeRes	((ProtocolIE_ID_t)237)
+#define ProtocolIE_ID_id_E_RABFailedToResumeItemResumeRes	((ProtocolIE_ID_t)238)
+#define ProtocolIE_ID_id_NB_IoT_Paging_eDRXInformation	((ProtocolIE_ID_t)239)
+#define ProtocolIE_ID_id_V2XServicesAuthorized	((ProtocolIE_ID_t)240)
+#define ProtocolIE_ID_id_UEUserPlaneCIoTSupportIndicator	((ProtocolIE_ID_t)241)
+#define ProtocolIE_ID_id_CE_mode_B_SupportIndicator	((ProtocolIE_ID_t)242)
+#define ProtocolIE_ID_id_SRVCCOperationNotPossible	((ProtocolIE_ID_t)243)
+#define ProtocolIE_ID_id_NB_IoT_UEIdentityIndexValue	((ProtocolIE_ID_t)244)
+#define ProtocolIE_ID_id_RRC_Resume_Cause	((ProtocolIE_ID_t)245)
+#define ProtocolIE_ID_id_DCN_ID	((ProtocolIE_ID_t)246)
+#define ProtocolIE_ID_id_ServedDCNs	((ProtocolIE_ID_t)247)
+#define ProtocolIE_ID_id_UESidelinkAggregateMaximumBitrate	((ProtocolIE_ID_t)248)
+#define ProtocolIE_ID_id_DLNASPDUDeliveryAckRequest	((ProtocolIE_ID_t)249)
+#define ProtocolIE_ID_id_Coverage_Level	((ProtocolIE_ID_t)250)
+#define ProtocolIE_ID_id_EnhancedCoverageRestricted	((ProtocolIE_ID_t)251)
+#define ProtocolIE_ID_id_UE_Level_QoS_Parameters	((ProtocolIE_ID_t)252)
+#define ProtocolIE_ID_id_DL_CP_SecurityInformation	((ProtocolIE_ID_t)253)
+#define ProtocolIE_ID_id_UL_CP_SecurityInformation	((ProtocolIE_ID_t)254)
+#define ProtocolIE_ID_id_extended_e_RAB_MaximumBitrateDL	((ProtocolIE_ID_t)255)
+#define ProtocolIE_ID_id_extended_e_RAB_MaximumBitrateUL	((ProtocolIE_ID_t)256)
+#define ProtocolIE_ID_id_extended_e_RAB_GuaranteedBitrateDL	((ProtocolIE_ID_t)257)
+#define ProtocolIE_ID_id_extended_e_RAB_GuaranteedBitrateUL	((ProtocolIE_ID_t)258)
+#define ProtocolIE_ID_id_extended_uEaggregateMaximumBitRateDL	((ProtocolIE_ID_t)259)
+#define ProtocolIE_ID_id_extended_uEaggregateMaximumBitRateUL	((ProtocolIE_ID_t)260)
+#define ProtocolIE_ID_id_NRrestrictioninEPSasSecondaryRAT	((ProtocolIE_ID_t)261)
+#define ProtocolIE_ID_id_UEAppLayerMeasConfig	((ProtocolIE_ID_t)262)
+#define ProtocolIE_ID_id_UE_Application_Layer_Measurement_Capability	((ProtocolIE_ID_t)263)
+#define ProtocolIE_ID_id_SecondaryRATDataUsageReportList	((ProtocolIE_ID_t)264)
+#define ProtocolIE_ID_id_SecondaryRATDataUsageReportItem	((ProtocolIE_ID_t)265)
+#define ProtocolIE_ID_id_HandoverFlag	((ProtocolIE_ID_t)266)
+#define ProtocolIE_ID_id_E_RABUsageReportItem	((ProtocolIE_ID_t)267)
+#define ProtocolIE_ID_id_SecondaryRATDataUsageRequest	((ProtocolIE_ID_t)268)
+#define ProtocolIE_ID_id_NRUESecurityCapabilities	((ProtocolIE_ID_t)269)
+#define ProtocolIE_ID_id_UnlicensedSpectrumRestriction	((ProtocolIE_ID_t)270)
+#define ProtocolIE_ID_id_CE_ModeBRestricted	((ProtocolIE_ID_t)271)
+#define ProtocolIE_ID_id_LTE_M_Indication	((ProtocolIE_ID_t)272)
+#define ProtocolIE_ID_id_DownlinkPacketLossRate	((ProtocolIE_ID_t)273)
+#define ProtocolIE_ID_id_UplinkPacketLossRate	((ProtocolIE_ID_t)274)
+#define ProtocolIE_ID_id_UECapabilityInfoRequest	((ProtocolIE_ID_t)275)
+#define ProtocolIE_ID_id_serviceType	((ProtocolIE_ID_t)276)
+#define ProtocolIE_ID_id_AerialUEsubscriptionInformation	((ProtocolIE_ID_t)277)
+#define ProtocolIE_ID_id_Subscription_Based_UE_DifferentiationInfo	((ProtocolIE_ID_t)278)
+#define ProtocolIE_ID_id_EndIndication	((ProtocolIE_ID_t)280)
+#define ProtocolIE_ID_id_EDT_Session	((ProtocolIE_ID_t)281)
+#define ProtocolIE_ID_id_CNTypeRestrictions	((ProtocolIE_ID_t)282)
+#define ProtocolIE_ID_id_PendingDataIndication	((ProtocolIE_ID_t)283)
+#define ProtocolIE_ID_id_BluetoothMeasurementConfiguration	((ProtocolIE_ID_t)284)
+#define ProtocolIE_ID_id_WLANMeasurementConfiguration	((ProtocolIE_ID_t)285)
+#define ProtocolIE_ID_id_WarningAreaCoordinates	((ProtocolIE_ID_t)286)
+#define ProtocolIE_ID_id_NRrestrictionin5GS	((ProtocolIE_ID_t)287)
+#define ProtocolIE_ID_id_PSCellInformation	((ProtocolIE_ID_t)288)
+#define ProtocolIE_ID_id_LastNG_RANPLMNIdentity	((ProtocolIE_ID_t)290)
+#define ProtocolIE_ID_id_ConnectedengNBList	((ProtocolIE_ID_t)291)
+#define ProtocolIE_ID_id_ConnectedengNBToAddList	((ProtocolIE_ID_t)292)
+#define ProtocolIE_ID_id_ConnectedengNBToRemoveList	((ProtocolIE_ID_t)293)
+#define ProtocolIE_ID_id_EN_DCSONConfigurationTransfer_ECT	((ProtocolIE_ID_t)294)
+#define ProtocolIE_ID_id_EN_DCSONConfigurationTransfer_MCT	((ProtocolIE_ID_t)295)
+#define ProtocolIE_ID_id_IMSvoiceEPSfallbackfrom5G	((ProtocolIE_ID_t)296)
+#define ProtocolIE_ID_id_TimeSinceSecondaryNodeRelease	((ProtocolIE_ID_t)297)
+#define ProtocolIE_ID_id_RequestTypeAdditionalInfo	((ProtocolIE_ID_t)298)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ProtocolIE_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ProtocolIE-SingleContainer.h b/src/s1ap/asn1c/asnGenFiles/ProtocolIE-SingleContainer.h
new file mode 100644
index 0000000..0e081dc
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ProtocolIE-SingleContainer.h
@@ -0,0 +1,480 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-Containers"
+ * 	found in "./asn1c/S1AP-Containers.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ProtocolIE_SingleContainer_H_
+#define	_ProtocolIE_SingleContainer_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Field.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ProtocolIE-SingleContainer */
+typedef Bearers_SubjectToStatusTransfer_ItemIEs_t	 ProtocolIE_SingleContainer_132P0_t;
+typedef E_RABInformationListIEs_t	 ProtocolIE_SingleContainer_132P1_t;
+typedef E_RABItemIEs_t	 ProtocolIE_SingleContainer_132P2_t;
+typedef E_RABUsageReportItemIEs_t	 ProtocolIE_SingleContainer_132P3_t;
+typedef MDTMode_ExtensionIE_t	 ProtocolIE_SingleContainer_132P4_t;
+typedef RecommendedCellItemIEs_t	 ProtocolIE_SingleContainer_132P5_t;
+typedef RecommendedENBItemIEs_t	 ProtocolIE_SingleContainer_132P6_t;
+typedef SecondaryRATDataUsageReportItemIEs_t	 ProtocolIE_SingleContainer_132P7_t;
+typedef SONInformation_ExtensionIE_t	 ProtocolIE_SingleContainer_132P8_t;
+typedef E_RABToBeSetupItemBearerSUReqIEs_t	 ProtocolIE_SingleContainer_132P9_t;
+typedef E_RABSetupItemBearerSUResIEs_t	 ProtocolIE_SingleContainer_132P10_t;
+typedef E_RABToBeModifiedItemBearerModReqIEs_t	 ProtocolIE_SingleContainer_132P11_t;
+typedef E_RABModifyItemBearerModResIEs_t	 ProtocolIE_SingleContainer_132P12_t;
+typedef E_RABReleaseItemBearerRelCompIEs_t	 ProtocolIE_SingleContainer_132P13_t;
+typedef E_RABToBeSetupItemCtxtSUReqIEs_t	 ProtocolIE_SingleContainer_132P14_t;
+typedef E_RABSetupItemCtxtSUResIEs_t	 ProtocolIE_SingleContainer_132P15_t;
+typedef TAIItemIEs_t	 ProtocolIE_SingleContainer_132P16_t;
+typedef UE_associatedLogicalS1_ConnectionItemRes_t	 ProtocolIE_SingleContainer_132P17_t;
+typedef UE_associatedLogicalS1_ConnectionItemResAck_t	 ProtocolIE_SingleContainer_132P18_t;
+typedef E_RABModifyItemBearerModConfIEs_t	 ProtocolIE_SingleContainer_132P19_t;
+typedef E_RABDataForwardingItemIEs_t	 ProtocolIE_SingleContainer_132P20_t;
+typedef E_RABToBeSetupItemHOReqIEs_t	 ProtocolIE_SingleContainer_132P21_t;
+typedef E_RABAdmittedItemIEs_t	 ProtocolIE_SingleContainer_132P22_t;
+typedef E_RABFailedtoSetupItemHOReqAckIEs_t	 ProtocolIE_SingleContainer_132P23_t;
+typedef E_RABToBeSwitchedDLItemIEs_t	 ProtocolIE_SingleContainer_132P24_t;
+typedef E_RABToBeSwitchedULItemIEs_t	 ProtocolIE_SingleContainer_132P25_t;
+typedef E_RABToBeModifiedItemBearerModIndIEs_t	 ProtocolIE_SingleContainer_132P26_t;
+typedef E_RABNotToBeModifiedItemBearerModIndIEs_t	 ProtocolIE_SingleContainer_132P27_t;
+typedef E_RABFailedToResumeItemResumeReqIEs_t	 ProtocolIE_SingleContainer_132P28_t;
+typedef E_RABFailedToResumeItemResumeResIEs_t	 ProtocolIE_SingleContainer_132P29_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_132P0;
+asn_struct_free_f ProtocolIE_SingleContainer_132P0_free;
+asn_struct_print_f ProtocolIE_SingleContainer_132P0_print;
+asn_constr_check_f ProtocolIE_SingleContainer_132P0_constraint;
+ber_type_decoder_f ProtocolIE_SingleContainer_132P0_decode_ber;
+der_type_encoder_f ProtocolIE_SingleContainer_132P0_encode_der;
+xer_type_decoder_f ProtocolIE_SingleContainer_132P0_decode_xer;
+xer_type_encoder_f ProtocolIE_SingleContainer_132P0_encode_xer;
+oer_type_decoder_f ProtocolIE_SingleContainer_132P0_decode_oer;
+oer_type_encoder_f ProtocolIE_SingleContainer_132P0_encode_oer;
+per_type_decoder_f ProtocolIE_SingleContainer_132P0_decode_uper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P0_encode_uper;
+per_type_decoder_f ProtocolIE_SingleContainer_132P0_decode_aper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P0_encode_aper;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_132P1;
+asn_struct_free_f ProtocolIE_SingleContainer_132P1_free;
+asn_struct_print_f ProtocolIE_SingleContainer_132P1_print;
+asn_constr_check_f ProtocolIE_SingleContainer_132P1_constraint;
+ber_type_decoder_f ProtocolIE_SingleContainer_132P1_decode_ber;
+der_type_encoder_f ProtocolIE_SingleContainer_132P1_encode_der;
+xer_type_decoder_f ProtocolIE_SingleContainer_132P1_decode_xer;
+xer_type_encoder_f ProtocolIE_SingleContainer_132P1_encode_xer;
+oer_type_decoder_f ProtocolIE_SingleContainer_132P1_decode_oer;
+oer_type_encoder_f ProtocolIE_SingleContainer_132P1_encode_oer;
+per_type_decoder_f ProtocolIE_SingleContainer_132P1_decode_uper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P1_encode_uper;
+per_type_decoder_f ProtocolIE_SingleContainer_132P1_decode_aper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P1_encode_aper;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_132P2;
+asn_struct_free_f ProtocolIE_SingleContainer_132P2_free;
+asn_struct_print_f ProtocolIE_SingleContainer_132P2_print;
+asn_constr_check_f ProtocolIE_SingleContainer_132P2_constraint;
+ber_type_decoder_f ProtocolIE_SingleContainer_132P2_decode_ber;
+der_type_encoder_f ProtocolIE_SingleContainer_132P2_encode_der;
+xer_type_decoder_f ProtocolIE_SingleContainer_132P2_decode_xer;
+xer_type_encoder_f ProtocolIE_SingleContainer_132P2_encode_xer;
+oer_type_decoder_f ProtocolIE_SingleContainer_132P2_decode_oer;
+oer_type_encoder_f ProtocolIE_SingleContainer_132P2_encode_oer;
+per_type_decoder_f ProtocolIE_SingleContainer_132P2_decode_uper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P2_encode_uper;
+per_type_decoder_f ProtocolIE_SingleContainer_132P2_decode_aper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P2_encode_aper;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_132P3;
+asn_struct_free_f ProtocolIE_SingleContainer_132P3_free;
+asn_struct_print_f ProtocolIE_SingleContainer_132P3_print;
+asn_constr_check_f ProtocolIE_SingleContainer_132P3_constraint;
+ber_type_decoder_f ProtocolIE_SingleContainer_132P3_decode_ber;
+der_type_encoder_f ProtocolIE_SingleContainer_132P3_encode_der;
+xer_type_decoder_f ProtocolIE_SingleContainer_132P3_decode_xer;
+xer_type_encoder_f ProtocolIE_SingleContainer_132P3_encode_xer;
+oer_type_decoder_f ProtocolIE_SingleContainer_132P3_decode_oer;
+oer_type_encoder_f ProtocolIE_SingleContainer_132P3_encode_oer;
+per_type_decoder_f ProtocolIE_SingleContainer_132P3_decode_uper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P3_encode_uper;
+per_type_decoder_f ProtocolIE_SingleContainer_132P3_decode_aper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P3_encode_aper;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_132P4;
+asn_struct_free_f ProtocolIE_SingleContainer_132P4_free;
+asn_struct_print_f ProtocolIE_SingleContainer_132P4_print;
+asn_constr_check_f ProtocolIE_SingleContainer_132P4_constraint;
+ber_type_decoder_f ProtocolIE_SingleContainer_132P4_decode_ber;
+der_type_encoder_f ProtocolIE_SingleContainer_132P4_encode_der;
+xer_type_decoder_f ProtocolIE_SingleContainer_132P4_decode_xer;
+xer_type_encoder_f ProtocolIE_SingleContainer_132P4_encode_xer;
+oer_type_decoder_f ProtocolIE_SingleContainer_132P4_decode_oer;
+oer_type_encoder_f ProtocolIE_SingleContainer_132P4_encode_oer;
+per_type_decoder_f ProtocolIE_SingleContainer_132P4_decode_uper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P4_encode_uper;
+per_type_decoder_f ProtocolIE_SingleContainer_132P4_decode_aper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P4_encode_aper;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_132P5;
+asn_struct_free_f ProtocolIE_SingleContainer_132P5_free;
+asn_struct_print_f ProtocolIE_SingleContainer_132P5_print;
+asn_constr_check_f ProtocolIE_SingleContainer_132P5_constraint;
+ber_type_decoder_f ProtocolIE_SingleContainer_132P5_decode_ber;
+der_type_encoder_f ProtocolIE_SingleContainer_132P5_encode_der;
+xer_type_decoder_f ProtocolIE_SingleContainer_132P5_decode_xer;
+xer_type_encoder_f ProtocolIE_SingleContainer_132P5_encode_xer;
+oer_type_decoder_f ProtocolIE_SingleContainer_132P5_decode_oer;
+oer_type_encoder_f ProtocolIE_SingleContainer_132P5_encode_oer;
+per_type_decoder_f ProtocolIE_SingleContainer_132P5_decode_uper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P5_encode_uper;
+per_type_decoder_f ProtocolIE_SingleContainer_132P5_decode_aper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P5_encode_aper;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_132P6;
+asn_struct_free_f ProtocolIE_SingleContainer_132P6_free;
+asn_struct_print_f ProtocolIE_SingleContainer_132P6_print;
+asn_constr_check_f ProtocolIE_SingleContainer_132P6_constraint;
+ber_type_decoder_f ProtocolIE_SingleContainer_132P6_decode_ber;
+der_type_encoder_f ProtocolIE_SingleContainer_132P6_encode_der;
+xer_type_decoder_f ProtocolIE_SingleContainer_132P6_decode_xer;
+xer_type_encoder_f ProtocolIE_SingleContainer_132P6_encode_xer;
+oer_type_decoder_f ProtocolIE_SingleContainer_132P6_decode_oer;
+oer_type_encoder_f ProtocolIE_SingleContainer_132P6_encode_oer;
+per_type_decoder_f ProtocolIE_SingleContainer_132P6_decode_uper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P6_encode_uper;
+per_type_decoder_f ProtocolIE_SingleContainer_132P6_decode_aper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P6_encode_aper;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_132P7;
+asn_struct_free_f ProtocolIE_SingleContainer_132P7_free;
+asn_struct_print_f ProtocolIE_SingleContainer_132P7_print;
+asn_constr_check_f ProtocolIE_SingleContainer_132P7_constraint;
+ber_type_decoder_f ProtocolIE_SingleContainer_132P7_decode_ber;
+der_type_encoder_f ProtocolIE_SingleContainer_132P7_encode_der;
+xer_type_decoder_f ProtocolIE_SingleContainer_132P7_decode_xer;
+xer_type_encoder_f ProtocolIE_SingleContainer_132P7_encode_xer;
+oer_type_decoder_f ProtocolIE_SingleContainer_132P7_decode_oer;
+oer_type_encoder_f ProtocolIE_SingleContainer_132P7_encode_oer;
+per_type_decoder_f ProtocolIE_SingleContainer_132P7_decode_uper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P7_encode_uper;
+per_type_decoder_f ProtocolIE_SingleContainer_132P7_decode_aper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P7_encode_aper;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_132P8;
+asn_struct_free_f ProtocolIE_SingleContainer_132P8_free;
+asn_struct_print_f ProtocolIE_SingleContainer_132P8_print;
+asn_constr_check_f ProtocolIE_SingleContainer_132P8_constraint;
+ber_type_decoder_f ProtocolIE_SingleContainer_132P8_decode_ber;
+der_type_encoder_f ProtocolIE_SingleContainer_132P8_encode_der;
+xer_type_decoder_f ProtocolIE_SingleContainer_132P8_decode_xer;
+xer_type_encoder_f ProtocolIE_SingleContainer_132P8_encode_xer;
+oer_type_decoder_f ProtocolIE_SingleContainer_132P8_decode_oer;
+oer_type_encoder_f ProtocolIE_SingleContainer_132P8_encode_oer;
+per_type_decoder_f ProtocolIE_SingleContainer_132P8_decode_uper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P8_encode_uper;
+per_type_decoder_f ProtocolIE_SingleContainer_132P8_decode_aper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P8_encode_aper;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_132P9;
+asn_struct_free_f ProtocolIE_SingleContainer_132P9_free;
+asn_struct_print_f ProtocolIE_SingleContainer_132P9_print;
+asn_constr_check_f ProtocolIE_SingleContainer_132P9_constraint;
+ber_type_decoder_f ProtocolIE_SingleContainer_132P9_decode_ber;
+der_type_encoder_f ProtocolIE_SingleContainer_132P9_encode_der;
+xer_type_decoder_f ProtocolIE_SingleContainer_132P9_decode_xer;
+xer_type_encoder_f ProtocolIE_SingleContainer_132P9_encode_xer;
+oer_type_decoder_f ProtocolIE_SingleContainer_132P9_decode_oer;
+oer_type_encoder_f ProtocolIE_SingleContainer_132P9_encode_oer;
+per_type_decoder_f ProtocolIE_SingleContainer_132P9_decode_uper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P9_encode_uper;
+per_type_decoder_f ProtocolIE_SingleContainer_132P9_decode_aper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P9_encode_aper;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_132P10;
+asn_struct_free_f ProtocolIE_SingleContainer_132P10_free;
+asn_struct_print_f ProtocolIE_SingleContainer_132P10_print;
+asn_constr_check_f ProtocolIE_SingleContainer_132P10_constraint;
+ber_type_decoder_f ProtocolIE_SingleContainer_132P10_decode_ber;
+der_type_encoder_f ProtocolIE_SingleContainer_132P10_encode_der;
+xer_type_decoder_f ProtocolIE_SingleContainer_132P10_decode_xer;
+xer_type_encoder_f ProtocolIE_SingleContainer_132P10_encode_xer;
+oer_type_decoder_f ProtocolIE_SingleContainer_132P10_decode_oer;
+oer_type_encoder_f ProtocolIE_SingleContainer_132P10_encode_oer;
+per_type_decoder_f ProtocolIE_SingleContainer_132P10_decode_uper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P10_encode_uper;
+per_type_decoder_f ProtocolIE_SingleContainer_132P10_decode_aper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P10_encode_aper;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_132P11;
+asn_struct_free_f ProtocolIE_SingleContainer_132P11_free;
+asn_struct_print_f ProtocolIE_SingleContainer_132P11_print;
+asn_constr_check_f ProtocolIE_SingleContainer_132P11_constraint;
+ber_type_decoder_f ProtocolIE_SingleContainer_132P11_decode_ber;
+der_type_encoder_f ProtocolIE_SingleContainer_132P11_encode_der;
+xer_type_decoder_f ProtocolIE_SingleContainer_132P11_decode_xer;
+xer_type_encoder_f ProtocolIE_SingleContainer_132P11_encode_xer;
+oer_type_decoder_f ProtocolIE_SingleContainer_132P11_decode_oer;
+oer_type_encoder_f ProtocolIE_SingleContainer_132P11_encode_oer;
+per_type_decoder_f ProtocolIE_SingleContainer_132P11_decode_uper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P11_encode_uper;
+per_type_decoder_f ProtocolIE_SingleContainer_132P11_decode_aper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P11_encode_aper;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_132P12;
+asn_struct_free_f ProtocolIE_SingleContainer_132P12_free;
+asn_struct_print_f ProtocolIE_SingleContainer_132P12_print;
+asn_constr_check_f ProtocolIE_SingleContainer_132P12_constraint;
+ber_type_decoder_f ProtocolIE_SingleContainer_132P12_decode_ber;
+der_type_encoder_f ProtocolIE_SingleContainer_132P12_encode_der;
+xer_type_decoder_f ProtocolIE_SingleContainer_132P12_decode_xer;
+xer_type_encoder_f ProtocolIE_SingleContainer_132P12_encode_xer;
+oer_type_decoder_f ProtocolIE_SingleContainer_132P12_decode_oer;
+oer_type_encoder_f ProtocolIE_SingleContainer_132P12_encode_oer;
+per_type_decoder_f ProtocolIE_SingleContainer_132P12_decode_uper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P12_encode_uper;
+per_type_decoder_f ProtocolIE_SingleContainer_132P12_decode_aper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P12_encode_aper;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_132P13;
+asn_struct_free_f ProtocolIE_SingleContainer_132P13_free;
+asn_struct_print_f ProtocolIE_SingleContainer_132P13_print;
+asn_constr_check_f ProtocolIE_SingleContainer_132P13_constraint;
+ber_type_decoder_f ProtocolIE_SingleContainer_132P13_decode_ber;
+der_type_encoder_f ProtocolIE_SingleContainer_132P13_encode_der;
+xer_type_decoder_f ProtocolIE_SingleContainer_132P13_decode_xer;
+xer_type_encoder_f ProtocolIE_SingleContainer_132P13_encode_xer;
+oer_type_decoder_f ProtocolIE_SingleContainer_132P13_decode_oer;
+oer_type_encoder_f ProtocolIE_SingleContainer_132P13_encode_oer;
+per_type_decoder_f ProtocolIE_SingleContainer_132P13_decode_uper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P13_encode_uper;
+per_type_decoder_f ProtocolIE_SingleContainer_132P13_decode_aper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P13_encode_aper;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_132P14;
+asn_struct_free_f ProtocolIE_SingleContainer_132P14_free;
+asn_struct_print_f ProtocolIE_SingleContainer_132P14_print;
+asn_constr_check_f ProtocolIE_SingleContainer_132P14_constraint;
+ber_type_decoder_f ProtocolIE_SingleContainer_132P14_decode_ber;
+der_type_encoder_f ProtocolIE_SingleContainer_132P14_encode_der;
+xer_type_decoder_f ProtocolIE_SingleContainer_132P14_decode_xer;
+xer_type_encoder_f ProtocolIE_SingleContainer_132P14_encode_xer;
+oer_type_decoder_f ProtocolIE_SingleContainer_132P14_decode_oer;
+oer_type_encoder_f ProtocolIE_SingleContainer_132P14_encode_oer;
+per_type_decoder_f ProtocolIE_SingleContainer_132P14_decode_uper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P14_encode_uper;
+per_type_decoder_f ProtocolIE_SingleContainer_132P14_decode_aper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P14_encode_aper;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_132P15;
+asn_struct_free_f ProtocolIE_SingleContainer_132P15_free;
+asn_struct_print_f ProtocolIE_SingleContainer_132P15_print;
+asn_constr_check_f ProtocolIE_SingleContainer_132P15_constraint;
+ber_type_decoder_f ProtocolIE_SingleContainer_132P15_decode_ber;
+der_type_encoder_f ProtocolIE_SingleContainer_132P15_encode_der;
+xer_type_decoder_f ProtocolIE_SingleContainer_132P15_decode_xer;
+xer_type_encoder_f ProtocolIE_SingleContainer_132P15_encode_xer;
+oer_type_decoder_f ProtocolIE_SingleContainer_132P15_decode_oer;
+oer_type_encoder_f ProtocolIE_SingleContainer_132P15_encode_oer;
+per_type_decoder_f ProtocolIE_SingleContainer_132P15_decode_uper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P15_encode_uper;
+per_type_decoder_f ProtocolIE_SingleContainer_132P15_decode_aper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P15_encode_aper;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_132P16;
+asn_struct_free_f ProtocolIE_SingleContainer_132P16_free;
+asn_struct_print_f ProtocolIE_SingleContainer_132P16_print;
+asn_constr_check_f ProtocolIE_SingleContainer_132P16_constraint;
+ber_type_decoder_f ProtocolIE_SingleContainer_132P16_decode_ber;
+der_type_encoder_f ProtocolIE_SingleContainer_132P16_encode_der;
+xer_type_decoder_f ProtocolIE_SingleContainer_132P16_decode_xer;
+xer_type_encoder_f ProtocolIE_SingleContainer_132P16_encode_xer;
+oer_type_decoder_f ProtocolIE_SingleContainer_132P16_decode_oer;
+oer_type_encoder_f ProtocolIE_SingleContainer_132P16_encode_oer;
+per_type_decoder_f ProtocolIE_SingleContainer_132P16_decode_uper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P16_encode_uper;
+per_type_decoder_f ProtocolIE_SingleContainer_132P16_decode_aper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P16_encode_aper;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_132P17;
+asn_struct_free_f ProtocolIE_SingleContainer_132P17_free;
+asn_struct_print_f ProtocolIE_SingleContainer_132P17_print;
+asn_constr_check_f ProtocolIE_SingleContainer_132P17_constraint;
+ber_type_decoder_f ProtocolIE_SingleContainer_132P17_decode_ber;
+der_type_encoder_f ProtocolIE_SingleContainer_132P17_encode_der;
+xer_type_decoder_f ProtocolIE_SingleContainer_132P17_decode_xer;
+xer_type_encoder_f ProtocolIE_SingleContainer_132P17_encode_xer;
+oer_type_decoder_f ProtocolIE_SingleContainer_132P17_decode_oer;
+oer_type_encoder_f ProtocolIE_SingleContainer_132P17_encode_oer;
+per_type_decoder_f ProtocolIE_SingleContainer_132P17_decode_uper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P17_encode_uper;
+per_type_decoder_f ProtocolIE_SingleContainer_132P17_decode_aper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P17_encode_aper;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_132P18;
+asn_struct_free_f ProtocolIE_SingleContainer_132P18_free;
+asn_struct_print_f ProtocolIE_SingleContainer_132P18_print;
+asn_constr_check_f ProtocolIE_SingleContainer_132P18_constraint;
+ber_type_decoder_f ProtocolIE_SingleContainer_132P18_decode_ber;
+der_type_encoder_f ProtocolIE_SingleContainer_132P18_encode_der;
+xer_type_decoder_f ProtocolIE_SingleContainer_132P18_decode_xer;
+xer_type_encoder_f ProtocolIE_SingleContainer_132P18_encode_xer;
+oer_type_decoder_f ProtocolIE_SingleContainer_132P18_decode_oer;
+oer_type_encoder_f ProtocolIE_SingleContainer_132P18_encode_oer;
+per_type_decoder_f ProtocolIE_SingleContainer_132P18_decode_uper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P18_encode_uper;
+per_type_decoder_f ProtocolIE_SingleContainer_132P18_decode_aper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P18_encode_aper;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_132P19;
+asn_struct_free_f ProtocolIE_SingleContainer_132P19_free;
+asn_struct_print_f ProtocolIE_SingleContainer_132P19_print;
+asn_constr_check_f ProtocolIE_SingleContainer_132P19_constraint;
+ber_type_decoder_f ProtocolIE_SingleContainer_132P19_decode_ber;
+der_type_encoder_f ProtocolIE_SingleContainer_132P19_encode_der;
+xer_type_decoder_f ProtocolIE_SingleContainer_132P19_decode_xer;
+xer_type_encoder_f ProtocolIE_SingleContainer_132P19_encode_xer;
+oer_type_decoder_f ProtocolIE_SingleContainer_132P19_decode_oer;
+oer_type_encoder_f ProtocolIE_SingleContainer_132P19_encode_oer;
+per_type_decoder_f ProtocolIE_SingleContainer_132P19_decode_uper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P19_encode_uper;
+per_type_decoder_f ProtocolIE_SingleContainer_132P19_decode_aper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P19_encode_aper;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_132P20;
+asn_struct_free_f ProtocolIE_SingleContainer_132P20_free;
+asn_struct_print_f ProtocolIE_SingleContainer_132P20_print;
+asn_constr_check_f ProtocolIE_SingleContainer_132P20_constraint;
+ber_type_decoder_f ProtocolIE_SingleContainer_132P20_decode_ber;
+der_type_encoder_f ProtocolIE_SingleContainer_132P20_encode_der;
+xer_type_decoder_f ProtocolIE_SingleContainer_132P20_decode_xer;
+xer_type_encoder_f ProtocolIE_SingleContainer_132P20_encode_xer;
+oer_type_decoder_f ProtocolIE_SingleContainer_132P20_decode_oer;
+oer_type_encoder_f ProtocolIE_SingleContainer_132P20_encode_oer;
+per_type_decoder_f ProtocolIE_SingleContainer_132P20_decode_uper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P20_encode_uper;
+per_type_decoder_f ProtocolIE_SingleContainer_132P20_decode_aper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P20_encode_aper;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_132P21;
+asn_struct_free_f ProtocolIE_SingleContainer_132P21_free;
+asn_struct_print_f ProtocolIE_SingleContainer_132P21_print;
+asn_constr_check_f ProtocolIE_SingleContainer_132P21_constraint;
+ber_type_decoder_f ProtocolIE_SingleContainer_132P21_decode_ber;
+der_type_encoder_f ProtocolIE_SingleContainer_132P21_encode_der;
+xer_type_decoder_f ProtocolIE_SingleContainer_132P21_decode_xer;
+xer_type_encoder_f ProtocolIE_SingleContainer_132P21_encode_xer;
+oer_type_decoder_f ProtocolIE_SingleContainer_132P21_decode_oer;
+oer_type_encoder_f ProtocolIE_SingleContainer_132P21_encode_oer;
+per_type_decoder_f ProtocolIE_SingleContainer_132P21_decode_uper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P21_encode_uper;
+per_type_decoder_f ProtocolIE_SingleContainer_132P21_decode_aper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P21_encode_aper;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_132P22;
+asn_struct_free_f ProtocolIE_SingleContainer_132P22_free;
+asn_struct_print_f ProtocolIE_SingleContainer_132P22_print;
+asn_constr_check_f ProtocolIE_SingleContainer_132P22_constraint;
+ber_type_decoder_f ProtocolIE_SingleContainer_132P22_decode_ber;
+der_type_encoder_f ProtocolIE_SingleContainer_132P22_encode_der;
+xer_type_decoder_f ProtocolIE_SingleContainer_132P22_decode_xer;
+xer_type_encoder_f ProtocolIE_SingleContainer_132P22_encode_xer;
+oer_type_decoder_f ProtocolIE_SingleContainer_132P22_decode_oer;
+oer_type_encoder_f ProtocolIE_SingleContainer_132P22_encode_oer;
+per_type_decoder_f ProtocolIE_SingleContainer_132P22_decode_uper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P22_encode_uper;
+per_type_decoder_f ProtocolIE_SingleContainer_132P22_decode_aper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P22_encode_aper;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_132P23;
+asn_struct_free_f ProtocolIE_SingleContainer_132P23_free;
+asn_struct_print_f ProtocolIE_SingleContainer_132P23_print;
+asn_constr_check_f ProtocolIE_SingleContainer_132P23_constraint;
+ber_type_decoder_f ProtocolIE_SingleContainer_132P23_decode_ber;
+der_type_encoder_f ProtocolIE_SingleContainer_132P23_encode_der;
+xer_type_decoder_f ProtocolIE_SingleContainer_132P23_decode_xer;
+xer_type_encoder_f ProtocolIE_SingleContainer_132P23_encode_xer;
+oer_type_decoder_f ProtocolIE_SingleContainer_132P23_decode_oer;
+oer_type_encoder_f ProtocolIE_SingleContainer_132P23_encode_oer;
+per_type_decoder_f ProtocolIE_SingleContainer_132P23_decode_uper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P23_encode_uper;
+per_type_decoder_f ProtocolIE_SingleContainer_132P23_decode_aper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P23_encode_aper;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_132P24;
+asn_struct_free_f ProtocolIE_SingleContainer_132P24_free;
+asn_struct_print_f ProtocolIE_SingleContainer_132P24_print;
+asn_constr_check_f ProtocolIE_SingleContainer_132P24_constraint;
+ber_type_decoder_f ProtocolIE_SingleContainer_132P24_decode_ber;
+der_type_encoder_f ProtocolIE_SingleContainer_132P24_encode_der;
+xer_type_decoder_f ProtocolIE_SingleContainer_132P24_decode_xer;
+xer_type_encoder_f ProtocolIE_SingleContainer_132P24_encode_xer;
+oer_type_decoder_f ProtocolIE_SingleContainer_132P24_decode_oer;
+oer_type_encoder_f ProtocolIE_SingleContainer_132P24_encode_oer;
+per_type_decoder_f ProtocolIE_SingleContainer_132P24_decode_uper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P24_encode_uper;
+per_type_decoder_f ProtocolIE_SingleContainer_132P24_decode_aper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P24_encode_aper;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_132P25;
+asn_struct_free_f ProtocolIE_SingleContainer_132P25_free;
+asn_struct_print_f ProtocolIE_SingleContainer_132P25_print;
+asn_constr_check_f ProtocolIE_SingleContainer_132P25_constraint;
+ber_type_decoder_f ProtocolIE_SingleContainer_132P25_decode_ber;
+der_type_encoder_f ProtocolIE_SingleContainer_132P25_encode_der;
+xer_type_decoder_f ProtocolIE_SingleContainer_132P25_decode_xer;
+xer_type_encoder_f ProtocolIE_SingleContainer_132P25_encode_xer;
+oer_type_decoder_f ProtocolIE_SingleContainer_132P25_decode_oer;
+oer_type_encoder_f ProtocolIE_SingleContainer_132P25_encode_oer;
+per_type_decoder_f ProtocolIE_SingleContainer_132P25_decode_uper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P25_encode_uper;
+per_type_decoder_f ProtocolIE_SingleContainer_132P25_decode_aper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P25_encode_aper;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_132P26;
+asn_struct_free_f ProtocolIE_SingleContainer_132P26_free;
+asn_struct_print_f ProtocolIE_SingleContainer_132P26_print;
+asn_constr_check_f ProtocolIE_SingleContainer_132P26_constraint;
+ber_type_decoder_f ProtocolIE_SingleContainer_132P26_decode_ber;
+der_type_encoder_f ProtocolIE_SingleContainer_132P26_encode_der;
+xer_type_decoder_f ProtocolIE_SingleContainer_132P26_decode_xer;
+xer_type_encoder_f ProtocolIE_SingleContainer_132P26_encode_xer;
+oer_type_decoder_f ProtocolIE_SingleContainer_132P26_decode_oer;
+oer_type_encoder_f ProtocolIE_SingleContainer_132P26_encode_oer;
+per_type_decoder_f ProtocolIE_SingleContainer_132P26_decode_uper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P26_encode_uper;
+per_type_decoder_f ProtocolIE_SingleContainer_132P26_decode_aper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P26_encode_aper;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_132P27;
+asn_struct_free_f ProtocolIE_SingleContainer_132P27_free;
+asn_struct_print_f ProtocolIE_SingleContainer_132P27_print;
+asn_constr_check_f ProtocolIE_SingleContainer_132P27_constraint;
+ber_type_decoder_f ProtocolIE_SingleContainer_132P27_decode_ber;
+der_type_encoder_f ProtocolIE_SingleContainer_132P27_encode_der;
+xer_type_decoder_f ProtocolIE_SingleContainer_132P27_decode_xer;
+xer_type_encoder_f ProtocolIE_SingleContainer_132P27_encode_xer;
+oer_type_decoder_f ProtocolIE_SingleContainer_132P27_decode_oer;
+oer_type_encoder_f ProtocolIE_SingleContainer_132P27_encode_oer;
+per_type_decoder_f ProtocolIE_SingleContainer_132P27_decode_uper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P27_encode_uper;
+per_type_decoder_f ProtocolIE_SingleContainer_132P27_decode_aper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P27_encode_aper;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_132P28;
+asn_struct_free_f ProtocolIE_SingleContainer_132P28_free;
+asn_struct_print_f ProtocolIE_SingleContainer_132P28_print;
+asn_constr_check_f ProtocolIE_SingleContainer_132P28_constraint;
+ber_type_decoder_f ProtocolIE_SingleContainer_132P28_decode_ber;
+der_type_encoder_f ProtocolIE_SingleContainer_132P28_encode_der;
+xer_type_decoder_f ProtocolIE_SingleContainer_132P28_decode_xer;
+xer_type_encoder_f ProtocolIE_SingleContainer_132P28_encode_xer;
+oer_type_decoder_f ProtocolIE_SingleContainer_132P28_decode_oer;
+oer_type_encoder_f ProtocolIE_SingleContainer_132P28_encode_oer;
+per_type_decoder_f ProtocolIE_SingleContainer_132P28_decode_uper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P28_encode_uper;
+per_type_decoder_f ProtocolIE_SingleContainer_132P28_decode_aper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P28_encode_aper;
+extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainer_132P29;
+asn_struct_free_f ProtocolIE_SingleContainer_132P29_free;
+asn_struct_print_f ProtocolIE_SingleContainer_132P29_print;
+asn_constr_check_f ProtocolIE_SingleContainer_132P29_constraint;
+ber_type_decoder_f ProtocolIE_SingleContainer_132P29_decode_ber;
+der_type_encoder_f ProtocolIE_SingleContainer_132P29_encode_der;
+xer_type_decoder_f ProtocolIE_SingleContainer_132P29_decode_xer;
+xer_type_encoder_f ProtocolIE_SingleContainer_132P29_encode_xer;
+oer_type_decoder_f ProtocolIE_SingleContainer_132P29_decode_oer;
+oer_type_encoder_f ProtocolIE_SingleContainer_132P29_encode_oer;
+per_type_decoder_f ProtocolIE_SingleContainer_132P29_decode_uper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P29_encode_uper;
+per_type_decoder_f ProtocolIE_SingleContainer_132P29_decode_aper;
+per_type_encoder_f ProtocolIE_SingleContainer_132P29_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ProtocolIE_SingleContainer_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/QCI.h b/src/s1ap/asn1c/asnGenFiles/QCI.h
new file mode 100644
index 0000000..f68fad8
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/QCI.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_QCI_H_
+#define	_QCI_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* QCI */
+typedef long	 QCI_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_QCI_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_QCI;
+asn_struct_free_f QCI_free;
+asn_struct_print_f QCI_print;
+asn_constr_check_f QCI_constraint;
+ber_type_decoder_f QCI_decode_ber;
+der_type_encoder_f QCI_encode_der;
+xer_type_decoder_f QCI_decode_xer;
+xer_type_encoder_f QCI_encode_xer;
+oer_type_decoder_f QCI_decode_oer;
+oer_type_encoder_f QCI_encode_oer;
+per_type_decoder_f QCI_decode_uper;
+per_type_encoder_f QCI_encode_uper;
+per_type_decoder_f QCI_decode_aper;
+per_type_encoder_f QCI_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _QCI_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/RAC.h b/src/s1ap/asn1c/asnGenFiles/RAC.h
new file mode 100644
index 0000000..de75f7b
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/RAC.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_RAC_H_
+#define	_RAC_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RAC */
+typedef OCTET_STRING_t	 RAC_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_RAC_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_RAC;
+asn_struct_free_f RAC_free;
+asn_struct_print_f RAC_print;
+asn_constr_check_f RAC_constraint;
+ber_type_decoder_f RAC_decode_ber;
+der_type_encoder_f RAC_encode_der;
+xer_type_decoder_f RAC_decode_xer;
+xer_type_encoder_f RAC_encode_xer;
+oer_type_decoder_f RAC_decode_oer;
+oer_type_encoder_f RAC_encode_oer;
+per_type_decoder_f RAC_decode_uper;
+per_type_encoder_f RAC_encode_uper;
+per_type_decoder_f RAC_decode_aper;
+per_type_encoder_f RAC_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RAC_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/RAT-Type.h b/src/s1ap/asn1c/asnGenFiles/RAT-Type.h
new file mode 100644
index 0000000..7695423
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/RAT-Type.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_RAT_Type_H_
+#define	_RAT_Type_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RAT_Type {
+	RAT_Type_nbiot	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RAT_Type;
+
+/* RAT-Type */
+typedef long	 RAT_Type_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_RAT_Type_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_RAT_Type;
+extern const asn_INTEGER_specifics_t asn_SPC_RAT_Type_specs_1;
+asn_struct_free_f RAT_Type_free;
+asn_struct_print_f RAT_Type_print;
+asn_constr_check_f RAT_Type_constraint;
+ber_type_decoder_f RAT_Type_decode_ber;
+der_type_encoder_f RAT_Type_encode_der;
+xer_type_decoder_f RAT_Type_decode_xer;
+xer_type_encoder_f RAT_Type_encode_xer;
+oer_type_decoder_f RAT_Type_decode_oer;
+oer_type_encoder_f RAT_Type_encode_oer;
+per_type_decoder_f RAT_Type_decode_uper;
+per_type_encoder_f RAT_Type_encode_uper;
+per_type_decoder_f RAT_Type_decode_aper;
+per_type_encoder_f RAT_Type_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RAT_Type_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/RIMInformation.h b/src/s1ap/asn1c/asnGenFiles/RIMInformation.h
new file mode 100644
index 0000000..9b83c43
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/RIMInformation.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_RIMInformation_H_
+#define	_RIMInformation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RIMInformation */
+typedef OCTET_STRING_t	 RIMInformation_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RIMInformation;
+asn_struct_free_f RIMInformation_free;
+asn_struct_print_f RIMInformation_print;
+asn_constr_check_f RIMInformation_constraint;
+ber_type_decoder_f RIMInformation_decode_ber;
+der_type_encoder_f RIMInformation_encode_der;
+xer_type_decoder_f RIMInformation_decode_xer;
+xer_type_encoder_f RIMInformation_encode_xer;
+oer_type_decoder_f RIMInformation_decode_oer;
+oer_type_encoder_f RIMInformation_encode_oer;
+per_type_decoder_f RIMInformation_decode_uper;
+per_type_encoder_f RIMInformation_encode_uper;
+per_type_decoder_f RIMInformation_decode_aper;
+per_type_encoder_f RIMInformation_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RIMInformation_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/RIMRoutingAddress.h b/src/s1ap/asn1c/asnGenFiles/RIMRoutingAddress.h
new file mode 100644
index 0000000..ca09ee3
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/RIMRoutingAddress.h
@@ -0,0 +1,63 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_RIMRoutingAddress_H_
+#define	_RIMRoutingAddress_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RIMRoutingAddress_PR {
+	RIMRoutingAddress_PR_NOTHING,	/* No components present */
+	RIMRoutingAddress_PR_gERAN_Cell_ID,
+	/* Extensions may appear below */
+	RIMRoutingAddress_PR_targetRNC_ID,
+	RIMRoutingAddress_PR_eHRPD_Sector_ID
+} RIMRoutingAddress_PR;
+
+/* Forward declarations */
+struct GERAN_Cell_ID;
+struct TargetRNC_ID;
+
+/* RIMRoutingAddress */
+typedef struct RIMRoutingAddress {
+	RIMRoutingAddress_PR present;
+	union RIMRoutingAddress_u {
+		struct GERAN_Cell_ID	*gERAN_Cell_ID;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+		struct TargetRNC_ID	*targetRNC_ID;
+		OCTET_STRING_t	 eHRPD_Sector_ID;
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RIMRoutingAddress_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RIMRoutingAddress;
+extern asn_CHOICE_specifics_t asn_SPC_RIMRoutingAddress_specs_1;
+extern asn_TYPE_member_t asn_MBR_RIMRoutingAddress_1[3];
+extern asn_per_constraints_t asn_PER_type_RIMRoutingAddress_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RIMRoutingAddress_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/RIMTransfer.h b/src/s1ap/asn1c/asnGenFiles/RIMTransfer.h
new file mode 100644
index 0000000..c0689b1
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/RIMTransfer.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_RIMTransfer_H_
+#define	_RIMTransfer_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RIMInformation.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct RIMRoutingAddress;
+struct ProtocolExtensionContainer;
+
+/* RIMTransfer */
+typedef struct RIMTransfer {
+	RIMInformation_t	 rIMInformation;
+	struct RIMRoutingAddress	*rIMRoutingAddress;	/* OPTIONAL */
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RIMTransfer_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RIMTransfer;
+extern asn_SEQUENCE_specifics_t asn_SPC_RIMTransfer_specs_1;
+extern asn_TYPE_member_t asn_MBR_RIMTransfer_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RIMTransfer_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/RLFReportInformation.h b/src/s1ap/asn1c/asnGenFiles/RLFReportInformation.h
new file mode 100644
index 0000000..140423b
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/RLFReportInformation.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_RLFReportInformation_H_
+#define	_RLFReportInformation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "UE-RLF-Report-Container.h"
+#include "UE-RLF-Report-Container-for-extended-bands.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* RLFReportInformation */
+typedef struct RLFReportInformation {
+	UE_RLF_Report_Container_t	 uE_RLF_Report_Container;
+	UE_RLF_Report_Container_for_extended_bands_t	*uE_RLF_Report_Container_for_extended_bands;	/* OPTIONAL */
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RLFReportInformation_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RLFReportInformation;
+extern asn_SEQUENCE_specifics_t asn_SPC_RLFReportInformation_specs_1;
+extern asn_TYPE_member_t asn_MBR_RLFReportInformation_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RLFReportInformation_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/RNC-ID.h b/src/s1ap/asn1c/asnGenFiles/RNC-ID.h
new file mode 100644
index 0000000..2b9c814
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/RNC-ID.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_RNC_ID_H_
+#define	_RNC_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RNC-ID */
+typedef long	 RNC_ID_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_RNC_ID_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_RNC_ID;
+asn_struct_free_f RNC_ID_free;
+asn_struct_print_f RNC_ID_print;
+asn_constr_check_f RNC_ID_constraint;
+ber_type_decoder_f RNC_ID_decode_ber;
+der_type_encoder_f RNC_ID_encode_der;
+xer_type_decoder_f RNC_ID_decode_xer;
+xer_type_encoder_f RNC_ID_encode_xer;
+oer_type_decoder_f RNC_ID_decode_oer;
+oer_type_encoder_f RNC_ID_encode_oer;
+per_type_decoder_f RNC_ID_decode_uper;
+per_type_encoder_f RNC_ID_encode_uper;
+per_type_decoder_f RNC_ID_decode_aper;
+per_type_encoder_f RNC_ID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RNC_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/RRC-Container.h b/src/s1ap/asn1c/asnGenFiles/RRC-Container.h
new file mode 100644
index 0000000..8c69421
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/RRC-Container.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_RRC_Container_H_
+#define	_RRC_Container_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RRC-Container */
+typedef OCTET_STRING_t	 RRC_Container_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RRC_Container;
+asn_struct_free_f RRC_Container_free;
+asn_struct_print_f RRC_Container_print;
+asn_constr_check_f RRC_Container_constraint;
+ber_type_decoder_f RRC_Container_decode_ber;
+der_type_encoder_f RRC_Container_encode_der;
+xer_type_decoder_f RRC_Container_decode_xer;
+xer_type_encoder_f RRC_Container_encode_xer;
+oer_type_decoder_f RRC_Container_decode_oer;
+oer_type_encoder_f RRC_Container_encode_oer;
+per_type_decoder_f RRC_Container_decode_uper;
+per_type_encoder_f RRC_Container_encode_uper;
+per_type_decoder_f RRC_Container_decode_aper;
+per_type_encoder_f RRC_Container_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RRC_Container_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/RRC-Establishment-Cause.h b/src/s1ap/asn1c/asnGenFiles/RRC-Establishment-Cause.h
new file mode 100644
index 0000000..b687ebe
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/RRC-Establishment-Cause.h
@@ -0,0 +1,62 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_RRC_Establishment_Cause_H_
+#define	_RRC_Establishment_Cause_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RRC_Establishment_Cause {
+	RRC_Establishment_Cause_emergency	= 0,
+	RRC_Establishment_Cause_highPriorityAccess	= 1,
+	RRC_Establishment_Cause_mt_Access	= 2,
+	RRC_Establishment_Cause_mo_Signalling	= 3,
+	RRC_Establishment_Cause_mo_Data	= 4,
+	/*
+	 * Enumeration is extensible
+	 */
+	RRC_Establishment_Cause_delay_TolerantAccess	= 5,
+	RRC_Establishment_Cause_mo_VoiceCall	= 6,
+	RRC_Establishment_Cause_mo_ExceptionData	= 7
+} e_RRC_Establishment_Cause;
+
+/* RRC-Establishment-Cause */
+typedef long	 RRC_Establishment_Cause_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_RRC_Establishment_Cause_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_RRC_Establishment_Cause;
+extern const asn_INTEGER_specifics_t asn_SPC_RRC_Establishment_Cause_specs_1;
+asn_struct_free_f RRC_Establishment_Cause_free;
+asn_struct_print_f RRC_Establishment_Cause_print;
+asn_constr_check_f RRC_Establishment_Cause_constraint;
+ber_type_decoder_f RRC_Establishment_Cause_decode_ber;
+der_type_encoder_f RRC_Establishment_Cause_encode_der;
+xer_type_decoder_f RRC_Establishment_Cause_decode_xer;
+xer_type_encoder_f RRC_Establishment_Cause_encode_xer;
+oer_type_decoder_f RRC_Establishment_Cause_decode_oer;
+oer_type_encoder_f RRC_Establishment_Cause_encode_oer;
+per_type_decoder_f RRC_Establishment_Cause_decode_uper;
+per_type_encoder_f RRC_Establishment_Cause_encode_uper;
+per_type_decoder_f RRC_Establishment_Cause_decode_aper;
+per_type_encoder_f RRC_Establishment_Cause_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RRC_Establishment_Cause_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ReceiveStatusOfULPDCPSDUsExtended.h b/src/s1ap/asn1c/asnGenFiles/ReceiveStatusOfULPDCPSDUsExtended.h
new file mode 100644
index 0000000..498c7ee
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ReceiveStatusOfULPDCPSDUsExtended.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ReceiveStatusOfULPDCPSDUsExtended_H_
+#define	_ReceiveStatusOfULPDCPSDUsExtended_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ReceiveStatusOfULPDCPSDUsExtended */
+typedef BIT_STRING_t	 ReceiveStatusOfULPDCPSDUsExtended_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_ReceiveStatusOfULPDCPSDUsExtended_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_ReceiveStatusOfULPDCPSDUsExtended;
+asn_struct_free_f ReceiveStatusOfULPDCPSDUsExtended_free;
+asn_struct_print_f ReceiveStatusOfULPDCPSDUsExtended_print;
+asn_constr_check_f ReceiveStatusOfULPDCPSDUsExtended_constraint;
+ber_type_decoder_f ReceiveStatusOfULPDCPSDUsExtended_decode_ber;
+der_type_encoder_f ReceiveStatusOfULPDCPSDUsExtended_encode_der;
+xer_type_decoder_f ReceiveStatusOfULPDCPSDUsExtended_decode_xer;
+xer_type_encoder_f ReceiveStatusOfULPDCPSDUsExtended_encode_xer;
+oer_type_decoder_f ReceiveStatusOfULPDCPSDUsExtended_decode_oer;
+oer_type_encoder_f ReceiveStatusOfULPDCPSDUsExtended_encode_oer;
+per_type_decoder_f ReceiveStatusOfULPDCPSDUsExtended_decode_uper;
+per_type_encoder_f ReceiveStatusOfULPDCPSDUsExtended_encode_uper;
+per_type_decoder_f ReceiveStatusOfULPDCPSDUsExtended_decode_aper;
+per_type_encoder_f ReceiveStatusOfULPDCPSDUsExtended_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ReceiveStatusOfULPDCPSDUsExtended_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ReceiveStatusOfULPDCPSDUsPDCP-SNlength18.h b/src/s1ap/asn1c/asnGenFiles/ReceiveStatusOfULPDCPSDUsPDCP-SNlength18.h
new file mode 100644
index 0000000..ddd731f
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ReceiveStatusOfULPDCPSDUsPDCP-SNlength18.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ReceiveStatusOfULPDCPSDUsPDCP_SNlength18_H_
+#define	_ReceiveStatusOfULPDCPSDUsPDCP_SNlength18_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ReceiveStatusOfULPDCPSDUsPDCP-SNlength18 */
+typedef BIT_STRING_t	 ReceiveStatusOfULPDCPSDUsPDCP_SNlength18_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_ReceiveStatusOfULPDCPSDUsPDCP_SNlength18_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_ReceiveStatusOfULPDCPSDUsPDCP_SNlength18;
+asn_struct_free_f ReceiveStatusOfULPDCPSDUsPDCP_SNlength18_free;
+asn_struct_print_f ReceiveStatusOfULPDCPSDUsPDCP_SNlength18_print;
+asn_constr_check_f ReceiveStatusOfULPDCPSDUsPDCP_SNlength18_constraint;
+ber_type_decoder_f ReceiveStatusOfULPDCPSDUsPDCP_SNlength18_decode_ber;
+der_type_encoder_f ReceiveStatusOfULPDCPSDUsPDCP_SNlength18_encode_der;
+xer_type_decoder_f ReceiveStatusOfULPDCPSDUsPDCP_SNlength18_decode_xer;
+xer_type_encoder_f ReceiveStatusOfULPDCPSDUsPDCP_SNlength18_encode_xer;
+oer_type_decoder_f ReceiveStatusOfULPDCPSDUsPDCP_SNlength18_decode_oer;
+oer_type_encoder_f ReceiveStatusOfULPDCPSDUsPDCP_SNlength18_encode_oer;
+per_type_decoder_f ReceiveStatusOfULPDCPSDUsPDCP_SNlength18_decode_uper;
+per_type_encoder_f ReceiveStatusOfULPDCPSDUsPDCP_SNlength18_encode_uper;
+per_type_decoder_f ReceiveStatusOfULPDCPSDUsPDCP_SNlength18_decode_aper;
+per_type_encoder_f ReceiveStatusOfULPDCPSDUsPDCP_SNlength18_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ReceiveStatusOfULPDCPSDUsPDCP_SNlength18_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ReceiveStatusofULPDCPSDUs.h b/src/s1ap/asn1c/asnGenFiles/ReceiveStatusofULPDCPSDUs.h
new file mode 100644
index 0000000..5e4893f
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ReceiveStatusofULPDCPSDUs.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ReceiveStatusofULPDCPSDUs_H_
+#define	_ReceiveStatusofULPDCPSDUs_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ReceiveStatusofULPDCPSDUs */
+typedef BIT_STRING_t	 ReceiveStatusofULPDCPSDUs_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_ReceiveStatusofULPDCPSDUs_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_ReceiveStatusofULPDCPSDUs;
+asn_struct_free_f ReceiveStatusofULPDCPSDUs_free;
+asn_struct_print_f ReceiveStatusofULPDCPSDUs_print;
+asn_constr_check_f ReceiveStatusofULPDCPSDUs_constraint;
+ber_type_decoder_f ReceiveStatusofULPDCPSDUs_decode_ber;
+der_type_encoder_f ReceiveStatusofULPDCPSDUs_encode_der;
+xer_type_decoder_f ReceiveStatusofULPDCPSDUs_decode_xer;
+xer_type_encoder_f ReceiveStatusofULPDCPSDUs_encode_xer;
+oer_type_decoder_f ReceiveStatusofULPDCPSDUs_decode_oer;
+oer_type_encoder_f ReceiveStatusofULPDCPSDUs_encode_oer;
+per_type_decoder_f ReceiveStatusofULPDCPSDUs_decode_uper;
+per_type_encoder_f ReceiveStatusofULPDCPSDUs_encode_uper;
+per_type_decoder_f ReceiveStatusofULPDCPSDUs_decode_aper;
+per_type_encoder_f ReceiveStatusofULPDCPSDUs_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ReceiveStatusofULPDCPSDUs_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/RecommendedCellItem.h b/src/s1ap/asn1c/asnGenFiles/RecommendedCellItem.h
new file mode 100644
index 0000000..8577390
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/RecommendedCellItem.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_RecommendedCellItem_H_
+#define	_RecommendedCellItem_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "EUTRAN-CGI.h"
+#include <NativeInteger.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* RecommendedCellItem */
+typedef struct RecommendedCellItem {
+	EUTRAN_CGI_t	 eUTRAN_CGI;
+	long	*timeStayedInCell;	/* OPTIONAL */
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RecommendedCellItem_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RecommendedCellItem;
+extern asn_SEQUENCE_specifics_t asn_SPC_RecommendedCellItem_specs_1;
+extern asn_TYPE_member_t asn_MBR_RecommendedCellItem_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RecommendedCellItem_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/RecommendedCellList.h b/src/s1ap/asn1c/asnGenFiles/RecommendedCellList.h
new file mode 100644
index 0000000..a6d7bb7
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/RecommendedCellList.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_RecommendedCellList_H_
+#define	_RecommendedCellList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolIE_SingleContainer;
+
+/* RecommendedCellList */
+typedef struct RecommendedCellList {
+	A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RecommendedCellList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RecommendedCellList;
+extern asn_SET_OF_specifics_t asn_SPC_RecommendedCellList_specs_1;
+extern asn_TYPE_member_t asn_MBR_RecommendedCellList_1[1];
+extern asn_per_constraints_t asn_PER_type_RecommendedCellList_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RecommendedCellList_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/RecommendedCellsForPaging.h b/src/s1ap/asn1c/asnGenFiles/RecommendedCellsForPaging.h
new file mode 100644
index 0000000..fc3f024
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/RecommendedCellsForPaging.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_RecommendedCellsForPaging_H_
+#define	_RecommendedCellsForPaging_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RecommendedCellList.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* RecommendedCellsForPaging */
+typedef struct RecommendedCellsForPaging {
+	RecommendedCellList_t	 recommendedCellList;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RecommendedCellsForPaging_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RecommendedCellsForPaging;
+extern asn_SEQUENCE_specifics_t asn_SPC_RecommendedCellsForPaging_specs_1;
+extern asn_TYPE_member_t asn_MBR_RecommendedCellsForPaging_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RecommendedCellsForPaging_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/RecommendedENBItem.h b/src/s1ap/asn1c/asnGenFiles/RecommendedENBItem.h
new file mode 100644
index 0000000..03e6105
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/RecommendedENBItem.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_RecommendedENBItem_H_
+#define	_RecommendedENBItem_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "MMEPagingTarget.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* RecommendedENBItem */
+typedef struct RecommendedENBItem {
+	MMEPagingTarget_t	 mMEPagingTarget;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RecommendedENBItem_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RecommendedENBItem;
+extern asn_SEQUENCE_specifics_t asn_SPC_RecommendedENBItem_specs_1;
+extern asn_TYPE_member_t asn_MBR_RecommendedENBItem_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RecommendedENBItem_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/RecommendedENBList.h b/src/s1ap/asn1c/asnGenFiles/RecommendedENBList.h
new file mode 100644
index 0000000..4b3da06
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/RecommendedENBList.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_RecommendedENBList_H_
+#define	_RecommendedENBList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolIE_SingleContainer;
+
+/* RecommendedENBList */
+typedef struct RecommendedENBList {
+	A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RecommendedENBList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RecommendedENBList;
+extern asn_SET_OF_specifics_t asn_SPC_RecommendedENBList_specs_1;
+extern asn_TYPE_member_t asn_MBR_RecommendedENBList_1[1];
+extern asn_per_constraints_t asn_PER_type_RecommendedENBList_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RecommendedENBList_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/RecommendedENBsForPaging.h b/src/s1ap/asn1c/asnGenFiles/RecommendedENBsForPaging.h
new file mode 100644
index 0000000..e41664e
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/RecommendedENBsForPaging.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_RecommendedENBsForPaging_H_
+#define	_RecommendedENBsForPaging_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RecommendedENBList.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* RecommendedENBsForPaging */
+typedef struct RecommendedENBsForPaging {
+	RecommendedENBList_t	 recommendedENBList;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RecommendedENBsForPaging_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RecommendedENBsForPaging;
+extern asn_SEQUENCE_specifics_t asn_SPC_RecommendedENBsForPaging_specs_1;
+extern asn_TYPE_member_t asn_MBR_RecommendedENBsForPaging_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RecommendedENBsForPaging_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/RelativeMMECapacity.h b/src/s1ap/asn1c/asnGenFiles/RelativeMMECapacity.h
new file mode 100644
index 0000000..ec49230
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/RelativeMMECapacity.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_RelativeMMECapacity_H_
+#define	_RelativeMMECapacity_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RelativeMMECapacity */
+typedef long	 RelativeMMECapacity_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_RelativeMMECapacity_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_RelativeMMECapacity;
+asn_struct_free_f RelativeMMECapacity_free;
+asn_struct_print_f RelativeMMECapacity_print;
+asn_constr_check_f RelativeMMECapacity_constraint;
+ber_type_decoder_f RelativeMMECapacity_decode_ber;
+der_type_encoder_f RelativeMMECapacity_encode_der;
+xer_type_decoder_f RelativeMMECapacity_decode_xer;
+xer_type_encoder_f RelativeMMECapacity_encode_xer;
+oer_type_decoder_f RelativeMMECapacity_decode_oer;
+oer_type_encoder_f RelativeMMECapacity_encode_oer;
+per_type_decoder_f RelativeMMECapacity_decode_uper;
+per_type_encoder_f RelativeMMECapacity_encode_uper;
+per_type_decoder_f RelativeMMECapacity_decode_aper;
+per_type_encoder_f RelativeMMECapacity_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RelativeMMECapacity_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/RelayNode-Indicator.h b/src/s1ap/asn1c/asnGenFiles/RelayNode-Indicator.h
new file mode 100644
index 0000000..35e27aa
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/RelayNode-Indicator.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_RelayNode_Indicator_H_
+#define	_RelayNode_Indicator_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RelayNode_Indicator {
+	RelayNode_Indicator_true	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RelayNode_Indicator;
+
+/* RelayNode-Indicator */
+typedef long	 RelayNode_Indicator_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_RelayNode_Indicator_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_RelayNode_Indicator;
+extern const asn_INTEGER_specifics_t asn_SPC_RelayNode_Indicator_specs_1;
+asn_struct_free_f RelayNode_Indicator_free;
+asn_struct_print_f RelayNode_Indicator_print;
+asn_constr_check_f RelayNode_Indicator_constraint;
+ber_type_decoder_f RelayNode_Indicator_decode_ber;
+der_type_encoder_f RelayNode_Indicator_encode_der;
+xer_type_decoder_f RelayNode_Indicator_decode_xer;
+xer_type_encoder_f RelayNode_Indicator_encode_xer;
+oer_type_decoder_f RelayNode_Indicator_decode_oer;
+oer_type_encoder_f RelayNode_Indicator_encode_oer;
+per_type_decoder_f RelayNode_Indicator_decode_uper;
+per_type_encoder_f RelayNode_Indicator_encode_uper;
+per_type_decoder_f RelayNode_Indicator_decode_aper;
+per_type_encoder_f RelayNode_Indicator_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RelayNode_Indicator_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/RepetitionPeriod.h b/src/s1ap/asn1c/asnGenFiles/RepetitionPeriod.h
new file mode 100644
index 0000000..e10caf8
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/RepetitionPeriod.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_RepetitionPeriod_H_
+#define	_RepetitionPeriod_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RepetitionPeriod */
+typedef long	 RepetitionPeriod_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_RepetitionPeriod_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_RepetitionPeriod;
+asn_struct_free_f RepetitionPeriod_free;
+asn_struct_print_f RepetitionPeriod_print;
+asn_constr_check_f RepetitionPeriod_constraint;
+ber_type_decoder_f RepetitionPeriod_decode_ber;
+der_type_encoder_f RepetitionPeriod_encode_der;
+xer_type_decoder_f RepetitionPeriod_decode_xer;
+xer_type_encoder_f RepetitionPeriod_encode_xer;
+oer_type_decoder_f RepetitionPeriod_decode_oer;
+oer_type_encoder_f RepetitionPeriod_encode_oer;
+per_type_decoder_f RepetitionPeriod_decode_uper;
+per_type_encoder_f RepetitionPeriod_encode_uper;
+per_type_decoder_f RepetitionPeriod_decode_aper;
+per_type_encoder_f RepetitionPeriod_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RepetitionPeriod_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ReportAmountMDT.h b/src/s1ap/asn1c/asnGenFiles/ReportAmountMDT.h
new file mode 100644
index 0000000..0a80434
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ReportAmountMDT.h
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ReportAmountMDT_H_
+#define	_ReportAmountMDT_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum ReportAmountMDT {
+	ReportAmountMDT_r1	= 0,
+	ReportAmountMDT_r2	= 1,
+	ReportAmountMDT_r4	= 2,
+	ReportAmountMDT_r8	= 3,
+	ReportAmountMDT_r16	= 4,
+	ReportAmountMDT_r32	= 5,
+	ReportAmountMDT_r64	= 6,
+	ReportAmountMDT_rinfinity	= 7
+} e_ReportAmountMDT;
+
+/* ReportAmountMDT */
+typedef long	 ReportAmountMDT_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_ReportAmountMDT_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_ReportAmountMDT;
+extern const asn_INTEGER_specifics_t asn_SPC_ReportAmountMDT_specs_1;
+asn_struct_free_f ReportAmountMDT_free;
+asn_struct_print_f ReportAmountMDT_print;
+asn_constr_check_f ReportAmountMDT_constraint;
+ber_type_decoder_f ReportAmountMDT_decode_ber;
+der_type_encoder_f ReportAmountMDT_encode_der;
+xer_type_decoder_f ReportAmountMDT_decode_xer;
+xer_type_encoder_f ReportAmountMDT_encode_xer;
+oer_type_decoder_f ReportAmountMDT_decode_oer;
+oer_type_encoder_f ReportAmountMDT_encode_oer;
+per_type_decoder_f ReportAmountMDT_decode_uper;
+per_type_encoder_f ReportAmountMDT_encode_uper;
+per_type_decoder_f ReportAmountMDT_decode_aper;
+per_type_encoder_f ReportAmountMDT_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ReportAmountMDT_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ReportArea.h b/src/s1ap/asn1c/asnGenFiles/ReportArea.h
new file mode 100644
index 0000000..febf80d
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ReportArea.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ReportArea_H_
+#define	_ReportArea_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum ReportArea {
+	ReportArea_ecgi	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_ReportArea;
+
+/* ReportArea */
+typedef long	 ReportArea_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_ReportArea_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_ReportArea;
+extern const asn_INTEGER_specifics_t asn_SPC_ReportArea_specs_1;
+asn_struct_free_f ReportArea_free;
+asn_struct_print_f ReportArea_print;
+asn_constr_check_f ReportArea_constraint;
+ber_type_decoder_f ReportArea_decode_ber;
+der_type_encoder_f ReportArea_encode_der;
+xer_type_decoder_f ReportArea_decode_xer;
+xer_type_encoder_f ReportArea_encode_xer;
+oer_type_decoder_f ReportArea_decode_oer;
+oer_type_encoder_f ReportArea_encode_oer;
+per_type_decoder_f ReportArea_decode_uper;
+per_type_encoder_f ReportArea_encode_uper;
+per_type_decoder_f ReportArea_decode_aper;
+per_type_encoder_f ReportArea_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ReportArea_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ReportIntervalMDT.h b/src/s1ap/asn1c/asnGenFiles/ReportIntervalMDT.h
new file mode 100644
index 0000000..b402695
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ReportIntervalMDT.h
@@ -0,0 +1,64 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ReportIntervalMDT_H_
+#define	_ReportIntervalMDT_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum ReportIntervalMDT {
+	ReportIntervalMDT_ms120	= 0,
+	ReportIntervalMDT_ms240	= 1,
+	ReportIntervalMDT_ms480	= 2,
+	ReportIntervalMDT_ms640	= 3,
+	ReportIntervalMDT_ms1024	= 4,
+	ReportIntervalMDT_ms2048	= 5,
+	ReportIntervalMDT_ms5120	= 6,
+	ReportIntervalMDT_ms10240	= 7,
+	ReportIntervalMDT_min1	= 8,
+	ReportIntervalMDT_min6	= 9,
+	ReportIntervalMDT_min12	= 10,
+	ReportIntervalMDT_min30	= 11,
+	ReportIntervalMDT_min60	= 12
+} e_ReportIntervalMDT;
+
+/* ReportIntervalMDT */
+typedef long	 ReportIntervalMDT_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_ReportIntervalMDT_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_ReportIntervalMDT;
+extern const asn_INTEGER_specifics_t asn_SPC_ReportIntervalMDT_specs_1;
+asn_struct_free_f ReportIntervalMDT_free;
+asn_struct_print_f ReportIntervalMDT_print;
+asn_constr_check_f ReportIntervalMDT_constraint;
+ber_type_decoder_f ReportIntervalMDT_decode_ber;
+der_type_encoder_f ReportIntervalMDT_encode_der;
+xer_type_decoder_f ReportIntervalMDT_decode_xer;
+xer_type_encoder_f ReportIntervalMDT_encode_xer;
+oer_type_decoder_f ReportIntervalMDT_decode_oer;
+oer_type_encoder_f ReportIntervalMDT_encode_oer;
+per_type_decoder_f ReportIntervalMDT_decode_uper;
+per_type_encoder_f ReportIntervalMDT_encode_uper;
+per_type_decoder_f ReportIntervalMDT_decode_aper;
+per_type_encoder_f ReportIntervalMDT_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ReportIntervalMDT_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/RequestType.h b/src/s1ap/asn1c/asnGenFiles/RequestType.h
new file mode 100644
index 0000000..5e3b557
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/RequestType.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_RequestType_H_
+#define	_RequestType_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "EventType.h"
+#include "ReportArea.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* RequestType */
+typedef struct RequestType {
+	EventType_t	 eventType;
+	ReportArea_t	 reportArea;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RequestType_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RequestType;
+extern asn_SEQUENCE_specifics_t asn_SPC_RequestType_specs_1;
+extern asn_TYPE_member_t asn_MBR_RequestType_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RequestType_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/RequestTypeAdditionalInfo.h b/src/s1ap/asn1c/asnGenFiles/RequestTypeAdditionalInfo.h
new file mode 100644
index 0000000..9172679
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/RequestTypeAdditionalInfo.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_RequestTypeAdditionalInfo_H_
+#define	_RequestTypeAdditionalInfo_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RequestTypeAdditionalInfo {
+	RequestTypeAdditionalInfo_includePSCell	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RequestTypeAdditionalInfo;
+
+/* RequestTypeAdditionalInfo */
+typedef long	 RequestTypeAdditionalInfo_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_RequestTypeAdditionalInfo_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_RequestTypeAdditionalInfo;
+extern const asn_INTEGER_specifics_t asn_SPC_RequestTypeAdditionalInfo_specs_1;
+asn_struct_free_f RequestTypeAdditionalInfo_free;
+asn_struct_print_f RequestTypeAdditionalInfo_print;
+asn_constr_check_f RequestTypeAdditionalInfo_constraint;
+ber_type_decoder_f RequestTypeAdditionalInfo_decode_ber;
+der_type_encoder_f RequestTypeAdditionalInfo_encode_der;
+xer_type_decoder_f RequestTypeAdditionalInfo_decode_xer;
+xer_type_encoder_f RequestTypeAdditionalInfo_encode_xer;
+oer_type_decoder_f RequestTypeAdditionalInfo_decode_oer;
+oer_type_encoder_f RequestTypeAdditionalInfo_encode_oer;
+per_type_decoder_f RequestTypeAdditionalInfo_decode_uper;
+per_type_encoder_f RequestTypeAdditionalInfo_encode_uper;
+per_type_decoder_f RequestTypeAdditionalInfo_decode_aper;
+per_type_encoder_f RequestTypeAdditionalInfo_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RequestTypeAdditionalInfo_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/RerouteNASRequest.h b/src/s1ap/asn1c/asnGenFiles/RerouteNASRequest.h
new file mode 100644
index 0000000..c281a14
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/RerouteNASRequest.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_RerouteNASRequest_H_
+#define	_RerouteNASRequest_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RerouteNASRequest */
+typedef struct RerouteNASRequest {
+	ProtocolIE_Container_129P35_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RerouteNASRequest_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RerouteNASRequest;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RerouteNASRequest_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Reset.h b/src/s1ap/asn1c/asnGenFiles/Reset.h
new file mode 100644
index 0000000..ea283e4
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Reset.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Reset_H_
+#define	_Reset_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Reset */
+typedef struct Reset {
+	ProtocolIE_Container_129P37_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} Reset_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_Reset;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Reset_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ResetAcknowledge.h b/src/s1ap/asn1c/asnGenFiles/ResetAcknowledge.h
new file mode 100644
index 0000000..34652a3
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ResetAcknowledge.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ResetAcknowledge_H_
+#define	_ResetAcknowledge_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ResetAcknowledge */
+typedef struct ResetAcknowledge {
+	ProtocolIE_Container_129P38_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ResetAcknowledge_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ResetAcknowledge;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ResetAcknowledge_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ResetAll.h b/src/s1ap/asn1c/asnGenFiles/ResetAll.h
new file mode 100644
index 0000000..1e50ef4
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ResetAll.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ResetAll_H_
+#define	_ResetAll_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum ResetAll {
+	ResetAll_reset_all	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_ResetAll;
+
+/* ResetAll */
+typedef long	 ResetAll_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_ResetAll_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_ResetAll;
+extern const asn_INTEGER_specifics_t asn_SPC_ResetAll_specs_1;
+asn_struct_free_f ResetAll_free;
+asn_struct_print_f ResetAll_print;
+asn_constr_check_f ResetAll_constraint;
+ber_type_decoder_f ResetAll_decode_ber;
+der_type_encoder_f ResetAll_encode_der;
+xer_type_decoder_f ResetAll_decode_xer;
+xer_type_encoder_f ResetAll_encode_xer;
+oer_type_decoder_f ResetAll_decode_oer;
+oer_type_encoder_f ResetAll_encode_oer;
+per_type_decoder_f ResetAll_decode_uper;
+per_type_encoder_f ResetAll_encode_uper;
+per_type_decoder_f ResetAll_decode_aper;
+per_type_encoder_f ResetAll_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ResetAll_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ResetType.h b/src/s1ap/asn1c/asnGenFiles/ResetType.h
new file mode 100644
index 0000000..1fe2136
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ResetType.h
@@ -0,0 +1,61 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ResetType_H_
+#define	_ResetType_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ResetAll.h"
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum ResetType_PR {
+	ResetType_PR_NOTHING,	/* No components present */
+	ResetType_PR_s1_Interface,
+	ResetType_PR_partOfS1_Interface
+	/* Extensions may appear below */
+	
+} ResetType_PR;
+
+/* Forward declarations */
+struct UE_associatedLogicalS1_ConnectionListRes;
+
+/* ResetType */
+typedef struct ResetType {
+	ResetType_PR present;
+	union ResetType_u {
+		ResetAll_t	 s1_Interface;
+		struct UE_associatedLogicalS1_ConnectionListRes	*partOfS1_Interface;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ResetType_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ResetType;
+extern asn_CHOICE_specifics_t asn_SPC_ResetType_specs_1;
+extern asn_TYPE_member_t asn_MBR_ResetType_1[2];
+extern asn_per_constraints_t asn_PER_type_ResetType_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ResetType_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/RetrieveUEInformation.h b/src/s1ap/asn1c/asnGenFiles/RetrieveUEInformation.h
new file mode 100644
index 0000000..03f619a
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/RetrieveUEInformation.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_RetrieveUEInformation_H_
+#define	_RetrieveUEInformation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RetrieveUEInformation */
+typedef struct RetrieveUEInformation {
+	ProtocolIE_Container_129P87_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RetrieveUEInformation_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RetrieveUEInformation;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RetrieveUEInformation_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Routing-ID.h b/src/s1ap/asn1c/asnGenFiles/Routing-ID.h
new file mode 100644
index 0000000..34ccd12
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Routing-ID.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Routing_ID_H_
+#define	_Routing_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Routing-ID */
+typedef long	 Routing_ID_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_Routing_ID_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_Routing_ID;
+asn_struct_free_f Routing_ID_free;
+asn_struct_print_f Routing_ID_print;
+asn_constr_check_f Routing_ID_constraint;
+ber_type_decoder_f Routing_ID_decode_ber;
+der_type_encoder_f Routing_ID_encode_der;
+xer_type_decoder_f Routing_ID_decode_xer;
+xer_type_encoder_f Routing_ID_encode_xer;
+oer_type_decoder_f Routing_ID_decode_oer;
+oer_type_encoder_f Routing_ID_encode_oer;
+per_type_decoder_f Routing_ID_decode_uper;
+per_type_encoder_f Routing_ID_encode_uper;
+per_type_decoder_f Routing_ID_decode_aper;
+per_type_encoder_f Routing_ID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Routing_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/S-TMSI.h b/src/s1ap/asn1c/asnGenFiles/S-TMSI.h
new file mode 100644
index 0000000..32692e8
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/S-TMSI.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_S_TMSI_H_
+#define	_S_TMSI_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "MME-Code.h"
+#include "M-TMSI.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* S-TMSI */
+typedef struct S_TMSI {
+	MME_Code_t	 mMEC;
+	M_TMSI_t	 m_TMSI;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} S_TMSI_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_S_TMSI;
+extern asn_SEQUENCE_specifics_t asn_SPC_S_TMSI_specs_1;
+extern asn_TYPE_member_t asn_MBR_S_TMSI_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _S_TMSI_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/S1AP-PDU.h b/src/s1ap/asn1c/asnGenFiles/S1AP-PDU.h
new file mode 100644
index 0000000..2d05681
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/S1AP-PDU.h
@@ -0,0 +1,61 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Descriptions"
+ * 	found in "./asn1c/S1AP-PDU-Descriptions.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_S1AP_PDU_H_
+#define	_S1AP_PDU_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum S1AP_PDU_PR {
+	S1AP_PDU_PR_NOTHING,	/* No components present */
+	S1AP_PDU_PR_initiatingMessage,
+	S1AP_PDU_PR_successfulOutcome,
+	S1AP_PDU_PR_unsuccessfulOutcome
+	/* Extensions may appear below */
+	
+} S1AP_PDU_PR;
+
+/* Forward declarations */
+struct InitiatingMessage;
+struct SuccessfulOutcome;
+struct UnsuccessfulOutcome;
+
+/* S1AP-PDU */
+typedef struct S1AP_PDU {
+	S1AP_PDU_PR present;
+	union S1AP_PDU_u {
+		struct InitiatingMessage	*initiatingMessage;
+		struct SuccessfulOutcome	*successfulOutcome;
+		struct UnsuccessfulOutcome	*unsuccessfulOutcome;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} S1AP_PDU_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_S1AP_PDU;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _S1AP_PDU_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/S1SetupFailure.h b/src/s1ap/asn1c/asnGenFiles/S1SetupFailure.h
new file mode 100644
index 0000000..1cbe2e6
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/S1SetupFailure.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_S1SetupFailure_H_
+#define	_S1SetupFailure_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* S1SetupFailure */
+typedef struct S1SetupFailure {
+	ProtocolIE_Container_129P42_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} S1SetupFailure_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_S1SetupFailure;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _S1SetupFailure_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/S1SetupRequest.h b/src/s1ap/asn1c/asnGenFiles/S1SetupRequest.h
new file mode 100644
index 0000000..1d3e084
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/S1SetupRequest.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_S1SetupRequest_H_
+#define	_S1SetupRequest_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* S1SetupRequest */
+typedef struct S1SetupRequest {
+	ProtocolIE_Container_129P40_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} S1SetupRequest_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_S1SetupRequest;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _S1SetupRequest_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/S1SetupResponse.h b/src/s1ap/asn1c/asnGenFiles/S1SetupResponse.h
new file mode 100644
index 0000000..d5c98bf
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/S1SetupResponse.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_S1SetupResponse_H_
+#define	_S1SetupResponse_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* S1SetupResponse */
+typedef struct S1SetupResponse {
+	ProtocolIE_Container_129P41_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} S1SetupResponse_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_S1SetupResponse;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _S1SetupResponse_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/SONConfigurationTransfer.h b/src/s1ap/asn1c/asnGenFiles/SONConfigurationTransfer.h
new file mode 100644
index 0000000..9373487
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/SONConfigurationTransfer.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_SONConfigurationTransfer_H_
+#define	_SONConfigurationTransfer_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "TargeteNB-ID.h"
+#include "SourceeNB-ID.h"
+#include "SONInformation.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* SONConfigurationTransfer */
+typedef struct SONConfigurationTransfer {
+	TargeteNB_ID_t	 targeteNB_ID;
+	SourceeNB_ID_t	 sourceeNB_ID;
+	SONInformation_t	 sONInformation;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} SONConfigurationTransfer_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_SONConfigurationTransfer;
+extern asn_SEQUENCE_specifics_t asn_SPC_SONConfigurationTransfer_specs_1;
+extern asn_TYPE_member_t asn_MBR_SONConfigurationTransfer_1[4];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _SONConfigurationTransfer_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/SONInformation-Extension.h b/src/s1ap/asn1c/asnGenFiles/SONInformation-Extension.h
new file mode 100644
index 0000000..aea4e7e
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/SONInformation-Extension.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_SONInformation_Extension_H_
+#define	_SONInformation_Extension_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-SingleContainer.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* SONInformation-Extension */
+typedef ProtocolIE_SingleContainer_132P8_t	 SONInformation_Extension_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_SONInformation_Extension;
+asn_struct_free_f SONInformation_Extension_free;
+asn_struct_print_f SONInformation_Extension_print;
+asn_constr_check_f SONInformation_Extension_constraint;
+ber_type_decoder_f SONInformation_Extension_decode_ber;
+der_type_encoder_f SONInformation_Extension_encode_der;
+xer_type_decoder_f SONInformation_Extension_decode_xer;
+xer_type_encoder_f SONInformation_Extension_encode_xer;
+oer_type_decoder_f SONInformation_Extension_decode_oer;
+oer_type_encoder_f SONInformation_Extension_encode_oer;
+per_type_decoder_f SONInformation_Extension_decode_uper;
+per_type_encoder_f SONInformation_Extension_encode_uper;
+per_type_decoder_f SONInformation_Extension_decode_aper;
+per_type_encoder_f SONInformation_Extension_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _SONInformation_Extension_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/SONInformation.h b/src/s1ap/asn1c/asnGenFiles/SONInformation.h
new file mode 100644
index 0000000..718771d
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/SONInformation.h
@@ -0,0 +1,63 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_SONInformation_H_
+#define	_SONInformation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "SONInformationRequest.h"
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum SONInformation_PR {
+	SONInformation_PR_NOTHING,	/* No components present */
+	SONInformation_PR_sONInformationRequest,
+	SONInformation_PR_sONInformationReply,
+	/* Extensions may appear below */
+	SONInformation_PR_sONInformation_Extension
+} SONInformation_PR;
+
+/* Forward declarations */
+struct SONInformationReply;
+struct SONInformation_Extension;
+
+/* SONInformation */
+typedef struct SONInformation {
+	SONInformation_PR present;
+	union SONInformation_u {
+		SONInformationRequest_t	 sONInformationRequest;
+		struct SONInformationReply	*sONInformationReply;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+		struct SONInformation_Extension	*sONInformation_Extension;
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} SONInformation_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_SONInformation;
+extern asn_CHOICE_specifics_t asn_SPC_SONInformation_specs_1;
+extern asn_TYPE_member_t asn_MBR_SONInformation_1[3];
+extern asn_per_constraints_t asn_PER_type_SONInformation_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _SONInformation_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/SONInformationReply.h b/src/s1ap/asn1c/asnGenFiles/SONInformationReply.h
new file mode 100644
index 0000000..ff0f18d
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/SONInformationReply.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_SONInformationReply_H_
+#define	_SONInformationReply_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct X2TNLConfigurationInfo;
+struct ProtocolExtensionContainer;
+
+/* SONInformationReply */
+typedef struct SONInformationReply {
+	struct X2TNLConfigurationInfo	*x2TNLConfigurationInfo;	/* OPTIONAL */
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} SONInformationReply_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_SONInformationReply;
+extern asn_SEQUENCE_specifics_t asn_SPC_SONInformationReply_specs_1;
+extern asn_TYPE_member_t asn_MBR_SONInformationReply_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _SONInformationReply_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/SONInformationReport.h b/src/s1ap/asn1c/asnGenFiles/SONInformationReport.h
new file mode 100644
index 0000000..8e834ac
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/SONInformationReport.h
@@ -0,0 +1,58 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_SONInformationReport_H_
+#define	_SONInformationReport_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum SONInformationReport_PR {
+	SONInformationReport_PR_NOTHING,	/* No components present */
+	SONInformationReport_PR_rLFReportInformation
+	/* Extensions may appear below */
+	
+} SONInformationReport_PR;
+
+/* Forward declarations */
+struct RLFReportInformation;
+
+/* SONInformationReport */
+typedef struct SONInformationReport {
+	SONInformationReport_PR present;
+	union SONInformationReport_u {
+		struct RLFReportInformation	*rLFReportInformation;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} SONInformationReport_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_SONInformationReport;
+extern asn_CHOICE_specifics_t asn_SPC_SONInformationReport_specs_1;
+extern asn_TYPE_member_t asn_MBR_SONInformationReport_1[1];
+extern asn_per_constraints_t asn_PER_type_SONInformationReport_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _SONInformationReport_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/SONInformationRequest.h b/src/s1ap/asn1c/asnGenFiles/SONInformationRequest.h
new file mode 100644
index 0000000..19277f3
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/SONInformationRequest.h
@@ -0,0 +1,58 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_SONInformationRequest_H_
+#define	_SONInformationRequest_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum SONInformationRequest {
+	SONInformationRequest_x2TNL_Configuration_Info	= 0,
+	/*
+	 * Enumeration is extensible
+	 */
+	SONInformationRequest_time_Synchronisation_Info	= 1,
+	SONInformationRequest_activate_Muting	= 2,
+	SONInformationRequest_deactivate_Muting	= 3
+} e_SONInformationRequest;
+
+/* SONInformationRequest */
+typedef long	 SONInformationRequest_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_SONInformationRequest_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_SONInformationRequest;
+extern const asn_INTEGER_specifics_t asn_SPC_SONInformationRequest_specs_1;
+asn_struct_free_f SONInformationRequest_free;
+asn_struct_print_f SONInformationRequest_print;
+asn_constr_check_f SONInformationRequest_constraint;
+ber_type_decoder_f SONInformationRequest_decode_ber;
+der_type_encoder_f SONInformationRequest_encode_der;
+xer_type_decoder_f SONInformationRequest_decode_xer;
+xer_type_encoder_f SONInformationRequest_encode_xer;
+oer_type_decoder_f SONInformationRequest_decode_oer;
+oer_type_encoder_f SONInformationRequest_encode_oer;
+per_type_decoder_f SONInformationRequest_decode_uper;
+per_type_encoder_f SONInformationRequest_encode_uper;
+per_type_decoder_f SONInformationRequest_decode_aper;
+per_type_encoder_f SONInformationRequest_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _SONInformationRequest_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/SRVCCHOIndication.h b/src/s1ap/asn1c/asnGenFiles/SRVCCHOIndication.h
new file mode 100644
index 0000000..5974ebe
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/SRVCCHOIndication.h
@@ -0,0 +1,56 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_SRVCCHOIndication_H_
+#define	_SRVCCHOIndication_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum SRVCCHOIndication {
+	SRVCCHOIndication_pSandCS	= 0,
+	SRVCCHOIndication_cSonly	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_SRVCCHOIndication;
+
+/* SRVCCHOIndication */
+typedef long	 SRVCCHOIndication_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_SRVCCHOIndication_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_SRVCCHOIndication;
+extern const asn_INTEGER_specifics_t asn_SPC_SRVCCHOIndication_specs_1;
+asn_struct_free_f SRVCCHOIndication_free;
+asn_struct_print_f SRVCCHOIndication_print;
+asn_constr_check_f SRVCCHOIndication_constraint;
+ber_type_decoder_f SRVCCHOIndication_decode_ber;
+der_type_encoder_f SRVCCHOIndication_encode_der;
+xer_type_decoder_f SRVCCHOIndication_decode_xer;
+xer_type_encoder_f SRVCCHOIndication_encode_xer;
+oer_type_decoder_f SRVCCHOIndication_decode_oer;
+oer_type_encoder_f SRVCCHOIndication_encode_oer;
+per_type_decoder_f SRVCCHOIndication_decode_uper;
+per_type_encoder_f SRVCCHOIndication_encode_uper;
+per_type_decoder_f SRVCCHOIndication_decode_aper;
+per_type_encoder_f SRVCCHOIndication_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _SRVCCHOIndication_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/SRVCCOperationNotPossible.h b/src/s1ap/asn1c/asnGenFiles/SRVCCOperationNotPossible.h
new file mode 100644
index 0000000..33e231a
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/SRVCCOperationNotPossible.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_SRVCCOperationNotPossible_H_
+#define	_SRVCCOperationNotPossible_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum SRVCCOperationNotPossible {
+	SRVCCOperationNotPossible_notPossible	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_SRVCCOperationNotPossible;
+
+/* SRVCCOperationNotPossible */
+typedef long	 SRVCCOperationNotPossible_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_SRVCCOperationNotPossible_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_SRVCCOperationNotPossible;
+extern const asn_INTEGER_specifics_t asn_SPC_SRVCCOperationNotPossible_specs_1;
+asn_struct_free_f SRVCCOperationNotPossible_free;
+asn_struct_print_f SRVCCOperationNotPossible_print;
+asn_constr_check_f SRVCCOperationNotPossible_constraint;
+ber_type_decoder_f SRVCCOperationNotPossible_decode_ber;
+der_type_encoder_f SRVCCOperationNotPossible_encode_der;
+xer_type_decoder_f SRVCCOperationNotPossible_decode_xer;
+xer_type_encoder_f SRVCCOperationNotPossible_encode_xer;
+oer_type_decoder_f SRVCCOperationNotPossible_decode_oer;
+oer_type_encoder_f SRVCCOperationNotPossible_encode_oer;
+per_type_decoder_f SRVCCOperationNotPossible_decode_uper;
+per_type_encoder_f SRVCCOperationNotPossible_encode_uper;
+per_type_decoder_f SRVCCOperationNotPossible_decode_aper;
+per_type_encoder_f SRVCCOperationNotPossible_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _SRVCCOperationNotPossible_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/SRVCCOperationPossible.h b/src/s1ap/asn1c/asnGenFiles/SRVCCOperationPossible.h
new file mode 100644
index 0000000..d22751a
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/SRVCCOperationPossible.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_SRVCCOperationPossible_H_
+#define	_SRVCCOperationPossible_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum SRVCCOperationPossible {
+	SRVCCOperationPossible_possible	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_SRVCCOperationPossible;
+
+/* SRVCCOperationPossible */
+typedef long	 SRVCCOperationPossible_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_SRVCCOperationPossible_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_SRVCCOperationPossible;
+extern const asn_INTEGER_specifics_t asn_SPC_SRVCCOperationPossible_specs_1;
+asn_struct_free_f SRVCCOperationPossible_free;
+asn_struct_print_f SRVCCOperationPossible_print;
+asn_constr_check_f SRVCCOperationPossible_constraint;
+ber_type_decoder_f SRVCCOperationPossible_decode_ber;
+der_type_encoder_f SRVCCOperationPossible_encode_der;
+xer_type_decoder_f SRVCCOperationPossible_decode_xer;
+xer_type_encoder_f SRVCCOperationPossible_encode_xer;
+oer_type_decoder_f SRVCCOperationPossible_decode_oer;
+oer_type_encoder_f SRVCCOperationPossible_encode_oer;
+per_type_decoder_f SRVCCOperationPossible_decode_uper;
+per_type_encoder_f SRVCCOperationPossible_encode_uper;
+per_type_decoder_f SRVCCOperationPossible_decode_aper;
+per_type_encoder_f SRVCCOperationPossible_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _SRVCCOperationPossible_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ScheduledCommunicationTime.h b/src/s1ap/asn1c/asnGenFiles/ScheduledCommunicationTime.h
new file mode 100644
index 0000000..ddaf156
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ScheduledCommunicationTime.h
@@ -0,0 +1,51 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ScheduledCommunicationTime_H_
+#define	_ScheduledCommunicationTime_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+#include <NativeInteger.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* ScheduledCommunicationTime */
+typedef struct ScheduledCommunicationTime {
+	BIT_STRING_t	*dayofWeek;	/* OPTIONAL */
+	long	*timeofDayStart;	/* OPTIONAL */
+	long	*timeofDayEnd;	/* OPTIONAL */
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ScheduledCommunicationTime_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ScheduledCommunicationTime;
+extern asn_SEQUENCE_specifics_t asn_SPC_ScheduledCommunicationTime_specs_1;
+extern asn_TYPE_member_t asn_MBR_ScheduledCommunicationTime_1[4];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ScheduledCommunicationTime_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/SecondaryRATDataUsageReport.h b/src/s1ap/asn1c/asnGenFiles/SecondaryRATDataUsageReport.h
new file mode 100644
index 0000000..692dab0
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/SecondaryRATDataUsageReport.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_SecondaryRATDataUsageReport_H_
+#define	_SecondaryRATDataUsageReport_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* SecondaryRATDataUsageReport */
+typedef struct SecondaryRATDataUsageReport {
+	ProtocolIE_Container_129P91_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} SecondaryRATDataUsageReport_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_SecondaryRATDataUsageReport;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _SecondaryRATDataUsageReport_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/SecondaryRATDataUsageReportItem.h b/src/s1ap/asn1c/asnGenFiles/SecondaryRATDataUsageReportItem.h
new file mode 100644
index 0000000..2ec4a3a
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/SecondaryRATDataUsageReportItem.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_SecondaryRATDataUsageReportItem_H_
+#define	_SecondaryRATDataUsageReportItem_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "E-RAB-ID.h"
+#include "SecondaryRATType.h"
+#include "E-RABUsageReportList.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* SecondaryRATDataUsageReportItem */
+typedef struct SecondaryRATDataUsageReportItem {
+	E_RAB_ID_t	 e_RAB_ID;
+	SecondaryRATType_t	 secondaryRATType;
+	E_RABUsageReportList_t	 e_RABUsageReportList;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} SecondaryRATDataUsageReportItem_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_SecondaryRATDataUsageReportItem;
+extern asn_SEQUENCE_specifics_t asn_SPC_SecondaryRATDataUsageReportItem_specs_1;
+extern asn_TYPE_member_t asn_MBR_SecondaryRATDataUsageReportItem_1[4];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _SecondaryRATDataUsageReportItem_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/SecondaryRATDataUsageReportList.h b/src/s1ap/asn1c/asnGenFiles/SecondaryRATDataUsageReportList.h
new file mode 100644
index 0000000..caefb64
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/SecondaryRATDataUsageReportList.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_SecondaryRATDataUsageReportList_H_
+#define	_SecondaryRATDataUsageReportList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolIE_SingleContainer;
+
+/* SecondaryRATDataUsageReportList */
+typedef struct SecondaryRATDataUsageReportList {
+	A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} SecondaryRATDataUsageReportList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_SecondaryRATDataUsageReportList;
+extern asn_SET_OF_specifics_t asn_SPC_SecondaryRATDataUsageReportList_specs_1;
+extern asn_TYPE_member_t asn_MBR_SecondaryRATDataUsageReportList_1[1];
+extern asn_per_constraints_t asn_PER_type_SecondaryRATDataUsageReportList_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _SecondaryRATDataUsageReportList_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/SecondaryRATDataUsageRequest.h b/src/s1ap/asn1c/asnGenFiles/SecondaryRATDataUsageRequest.h
new file mode 100644
index 0000000..bf5830d
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/SecondaryRATDataUsageRequest.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_SecondaryRATDataUsageRequest_H_
+#define	_SecondaryRATDataUsageRequest_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum SecondaryRATDataUsageRequest {
+	SecondaryRATDataUsageRequest_requested	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_SecondaryRATDataUsageRequest;
+
+/* SecondaryRATDataUsageRequest */
+typedef long	 SecondaryRATDataUsageRequest_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_SecondaryRATDataUsageRequest_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_SecondaryRATDataUsageRequest;
+extern const asn_INTEGER_specifics_t asn_SPC_SecondaryRATDataUsageRequest_specs_1;
+asn_struct_free_f SecondaryRATDataUsageRequest_free;
+asn_struct_print_f SecondaryRATDataUsageRequest_print;
+asn_constr_check_f SecondaryRATDataUsageRequest_constraint;
+ber_type_decoder_f SecondaryRATDataUsageRequest_decode_ber;
+der_type_encoder_f SecondaryRATDataUsageRequest_encode_der;
+xer_type_decoder_f SecondaryRATDataUsageRequest_decode_xer;
+xer_type_encoder_f SecondaryRATDataUsageRequest_encode_xer;
+oer_type_decoder_f SecondaryRATDataUsageRequest_decode_oer;
+oer_type_encoder_f SecondaryRATDataUsageRequest_encode_oer;
+per_type_decoder_f SecondaryRATDataUsageRequest_decode_uper;
+per_type_encoder_f SecondaryRATDataUsageRequest_encode_uper;
+per_type_decoder_f SecondaryRATDataUsageRequest_decode_aper;
+per_type_encoder_f SecondaryRATDataUsageRequest_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _SecondaryRATDataUsageRequest_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/SecondaryRATType.h b/src/s1ap/asn1c/asnGenFiles/SecondaryRATType.h
new file mode 100644
index 0000000..30d5ebe
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/SecondaryRATType.h
@@ -0,0 +1,56 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_SecondaryRATType_H_
+#define	_SecondaryRATType_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum SecondaryRATType {
+	SecondaryRATType_nR	= 0,
+	/*
+	 * Enumeration is extensible
+	 */
+	SecondaryRATType_unlicensed	= 1
+} e_SecondaryRATType;
+
+/* SecondaryRATType */
+typedef long	 SecondaryRATType_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_SecondaryRATType_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_SecondaryRATType;
+extern const asn_INTEGER_specifics_t asn_SPC_SecondaryRATType_specs_1;
+asn_struct_free_f SecondaryRATType_free;
+asn_struct_print_f SecondaryRATType_print;
+asn_constr_check_f SecondaryRATType_constraint;
+ber_type_decoder_f SecondaryRATType_decode_ber;
+der_type_encoder_f SecondaryRATType_encode_der;
+xer_type_decoder_f SecondaryRATType_decode_xer;
+xer_type_encoder_f SecondaryRATType_encode_xer;
+oer_type_decoder_f SecondaryRATType_decode_oer;
+oer_type_encoder_f SecondaryRATType_encode_oer;
+per_type_decoder_f SecondaryRATType_decode_uper;
+per_type_encoder_f SecondaryRATType_encode_uper;
+per_type_decoder_f SecondaryRATType_decode_aper;
+per_type_encoder_f SecondaryRATType_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _SecondaryRATType_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/SecurityContext.h b/src/s1ap/asn1c/asnGenFiles/SecurityContext.h
new file mode 100644
index 0000000..37b759b
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/SecurityContext.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_SecurityContext_H_
+#define	_SecurityContext_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+#include "SecurityKey.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* SecurityContext */
+typedef struct SecurityContext {
+	long	 nextHopChainingCount;
+	SecurityKey_t	 nextHopParameter;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} SecurityContext_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_SecurityContext;
+extern asn_SEQUENCE_specifics_t asn_SPC_SecurityContext_specs_1;
+extern asn_TYPE_member_t asn_MBR_SecurityContext_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _SecurityContext_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/SecurityKey.h b/src/s1ap/asn1c/asnGenFiles/SecurityKey.h
new file mode 100644
index 0000000..cec9491
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/SecurityKey.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_SecurityKey_H_
+#define	_SecurityKey_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* SecurityKey */
+typedef BIT_STRING_t	 SecurityKey_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_SecurityKey_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_SecurityKey;
+asn_struct_free_f SecurityKey_free;
+asn_struct_print_f SecurityKey_print;
+asn_constr_check_f SecurityKey_constraint;
+ber_type_decoder_f SecurityKey_decode_ber;
+der_type_encoder_f SecurityKey_encode_der;
+xer_type_decoder_f SecurityKey_decode_xer;
+xer_type_encoder_f SecurityKey_encode_xer;
+oer_type_decoder_f SecurityKey_decode_oer;
+oer_type_encoder_f SecurityKey_encode_oer;
+per_type_decoder_f SecurityKey_decode_uper;
+per_type_encoder_f SecurityKey_encode_uper;
+per_type_decoder_f SecurityKey_decode_aper;
+per_type_encoder_f SecurityKey_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _SecurityKey_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/SerialNumber.h b/src/s1ap/asn1c/asnGenFiles/SerialNumber.h
new file mode 100644
index 0000000..11260c4
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/SerialNumber.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_SerialNumber_H_
+#define	_SerialNumber_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* SerialNumber */
+typedef BIT_STRING_t	 SerialNumber_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_SerialNumber_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_SerialNumber;
+asn_struct_free_f SerialNumber_free;
+asn_struct_print_f SerialNumber_print;
+asn_constr_check_f SerialNumber_constraint;
+ber_type_decoder_f SerialNumber_decode_ber;
+der_type_encoder_f SerialNumber_encode_der;
+xer_type_decoder_f SerialNumber_decode_xer;
+xer_type_encoder_f SerialNumber_encode_xer;
+oer_type_decoder_f SerialNumber_decode_oer;
+oer_type_encoder_f SerialNumber_encode_oer;
+per_type_decoder_f SerialNumber_decode_uper;
+per_type_encoder_f SerialNumber_encode_uper;
+per_type_decoder_f SerialNumber_decode_aper;
+per_type_encoder_f SerialNumber_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _SerialNumber_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ServedDCNs.h b/src/s1ap/asn1c/asnGenFiles/ServedDCNs.h
new file mode 100644
index 0000000..27c539e
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ServedDCNs.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ServedDCNs_H_
+#define	_ServedDCNs_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ServedDCNsItem;
+
+/* ServedDCNs */
+typedef struct ServedDCNs {
+	A_SEQUENCE_OF(struct ServedDCNsItem) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ServedDCNs_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ServedDCNs;
+extern asn_SET_OF_specifics_t asn_SPC_ServedDCNs_specs_1;
+extern asn_TYPE_member_t asn_MBR_ServedDCNs_1[1];
+extern asn_per_constraints_t asn_PER_type_ServedDCNs_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ServedDCNs_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ServedDCNsItem.h b/src/s1ap/asn1c/asnGenFiles/ServedDCNsItem.h
new file mode 100644
index 0000000..cbead31
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ServedDCNsItem.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ServedDCNsItem_H_
+#define	_ServedDCNsItem_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "DCN-ID.h"
+#include "RelativeMMECapacity.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* ServedDCNsItem */
+typedef struct ServedDCNsItem {
+	DCN_ID_t	 dCN_ID;
+	RelativeMMECapacity_t	 relativeDCNCapacity;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ServedDCNsItem_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ServedDCNsItem;
+extern asn_SEQUENCE_specifics_t asn_SPC_ServedDCNsItem_specs_1;
+extern asn_TYPE_member_t asn_MBR_ServedDCNsItem_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ServedDCNsItem_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ServedGUMMEIs.h b/src/s1ap/asn1c/asnGenFiles/ServedGUMMEIs.h
new file mode 100644
index 0000000..6b1551a
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ServedGUMMEIs.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ServedGUMMEIs_H_
+#define	_ServedGUMMEIs_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ServedGUMMEIsItem;
+
+/* ServedGUMMEIs */
+typedef struct ServedGUMMEIs {
+	A_SEQUENCE_OF(struct ServedGUMMEIsItem) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ServedGUMMEIs_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ServedGUMMEIs;
+extern asn_SET_OF_specifics_t asn_SPC_ServedGUMMEIs_specs_1;
+extern asn_TYPE_member_t asn_MBR_ServedGUMMEIs_1[1];
+extern asn_per_constraints_t asn_PER_type_ServedGUMMEIs_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ServedGUMMEIs_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ServedGUMMEIsItem.h b/src/s1ap/asn1c/asnGenFiles/ServedGUMMEIsItem.h
new file mode 100644
index 0000000..dece863
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ServedGUMMEIsItem.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ServedGUMMEIsItem_H_
+#define	_ServedGUMMEIsItem_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ServedPLMNs.h"
+#include "ServedGroupIDs.h"
+#include "ServedMMECs.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* ServedGUMMEIsItem */
+typedef struct ServedGUMMEIsItem {
+	ServedPLMNs_t	 servedPLMNs;
+	ServedGroupIDs_t	 servedGroupIDs;
+	ServedMMECs_t	 servedMMECs;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ServedGUMMEIsItem_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ServedGUMMEIsItem;
+extern asn_SEQUENCE_specifics_t asn_SPC_ServedGUMMEIsItem_specs_1;
+extern asn_TYPE_member_t asn_MBR_ServedGUMMEIsItem_1[4];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ServedGUMMEIsItem_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ServedGroupIDs.h b/src/s1ap/asn1c/asnGenFiles/ServedGroupIDs.h
new file mode 100644
index 0000000..5b5cfdc
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ServedGroupIDs.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ServedGroupIDs_H_
+#define	_ServedGroupIDs_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "MME-Group-ID.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ServedGroupIDs */
+typedef struct ServedGroupIDs {
+	A_SEQUENCE_OF(MME_Group_ID_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ServedGroupIDs_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ServedGroupIDs;
+extern asn_SET_OF_specifics_t asn_SPC_ServedGroupIDs_specs_1;
+extern asn_TYPE_member_t asn_MBR_ServedGroupIDs_1[1];
+extern asn_per_constraints_t asn_PER_type_ServedGroupIDs_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ServedGroupIDs_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ServedMMECs.h b/src/s1ap/asn1c/asnGenFiles/ServedMMECs.h
new file mode 100644
index 0000000..17b8f0b
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ServedMMECs.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ServedMMECs_H_
+#define	_ServedMMECs_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "MME-Code.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ServedMMECs */
+typedef struct ServedMMECs {
+	A_SEQUENCE_OF(MME_Code_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ServedMMECs_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ServedMMECs;
+extern asn_SET_OF_specifics_t asn_SPC_ServedMMECs_specs_1;
+extern asn_TYPE_member_t asn_MBR_ServedMMECs_1[1];
+extern asn_per_constraints_t asn_PER_type_ServedMMECs_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ServedMMECs_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ServedPLMNs.h b/src/s1ap/asn1c/asnGenFiles/ServedPLMNs.h
new file mode 100644
index 0000000..1b9f890
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ServedPLMNs.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ServedPLMNs_H_
+#define	_ServedPLMNs_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "PLMNidentity.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ServedPLMNs */
+typedef struct ServedPLMNs {
+	A_SEQUENCE_OF(PLMNidentity_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} ServedPLMNs_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_ServedPLMNs;
+extern asn_SET_OF_specifics_t asn_SPC_ServedPLMNs_specs_1;
+extern asn_TYPE_member_t asn_MBR_ServedPLMNs_1[1];
+extern asn_per_constraints_t asn_PER_type_ServedPLMNs_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ServedPLMNs_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/ServiceType.h b/src/s1ap/asn1c/asnGenFiles/ServiceType.h
new file mode 100644
index 0000000..f1a2210
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ServiceType.h
@@ -0,0 +1,56 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_ServiceType_H_
+#define	_ServiceType_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum ServiceType {
+	ServiceType_qMC_for_streaming_service	= 0,
+	ServiceType_qMC_for_MTSI_service	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_ServiceType;
+
+/* ServiceType */
+typedef long	 ServiceType_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_ServiceType_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_ServiceType;
+extern const asn_INTEGER_specifics_t asn_SPC_ServiceType_specs_1;
+asn_struct_free_f ServiceType_free;
+asn_struct_print_f ServiceType_print;
+asn_constr_check_f ServiceType_constraint;
+ber_type_decoder_f ServiceType_decode_ber;
+der_type_encoder_f ServiceType_encode_der;
+xer_type_decoder_f ServiceType_decode_xer;
+xer_type_encoder_f ServiceType_encode_xer;
+oer_type_decoder_f ServiceType_decode_oer;
+oer_type_encoder_f ServiceType_encode_oer;
+per_type_decoder_f ServiceType_decode_uper;
+per_type_encoder_f ServiceType_encode_uper;
+per_type_decoder_f ServiceType_decode_aper;
+per_type_encoder_f ServiceType_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _ServiceType_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Source-ToTarget-TransparentContainer.h b/src/s1ap/asn1c/asnGenFiles/Source-ToTarget-TransparentContainer.h
new file mode 100644
index 0000000..1822e67
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Source-ToTarget-TransparentContainer.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Source_ToTarget_TransparentContainer_H_
+#define	_Source_ToTarget_TransparentContainer_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Source-ToTarget-TransparentContainer */
+typedef OCTET_STRING_t	 Source_ToTarget_TransparentContainer_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_Source_ToTarget_TransparentContainer;
+asn_struct_free_f Source_ToTarget_TransparentContainer_free;
+asn_struct_print_f Source_ToTarget_TransparentContainer_print;
+asn_constr_check_f Source_ToTarget_TransparentContainer_constraint;
+ber_type_decoder_f Source_ToTarget_TransparentContainer_decode_ber;
+der_type_encoder_f Source_ToTarget_TransparentContainer_encode_der;
+xer_type_decoder_f Source_ToTarget_TransparentContainer_decode_xer;
+xer_type_encoder_f Source_ToTarget_TransparentContainer_encode_xer;
+oer_type_decoder_f Source_ToTarget_TransparentContainer_decode_oer;
+oer_type_encoder_f Source_ToTarget_TransparentContainer_encode_oer;
+per_type_decoder_f Source_ToTarget_TransparentContainer_decode_uper;
+per_type_encoder_f Source_ToTarget_TransparentContainer_encode_uper;
+per_type_decoder_f Source_ToTarget_TransparentContainer_decode_aper;
+per_type_encoder_f Source_ToTarget_TransparentContainer_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Source_ToTarget_TransparentContainer_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/SourceBSS-ToTargetBSS-TransparentContainer.h b/src/s1ap/asn1c/asnGenFiles/SourceBSS-ToTargetBSS-TransparentContainer.h
new file mode 100644
index 0000000..17cbebd
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/SourceBSS-ToTargetBSS-TransparentContainer.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_SourceBSS_ToTargetBSS_TransparentContainer_H_
+#define	_SourceBSS_ToTargetBSS_TransparentContainer_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* SourceBSS-ToTargetBSS-TransparentContainer */
+typedef OCTET_STRING_t	 SourceBSS_ToTargetBSS_TransparentContainer_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_SourceBSS_ToTargetBSS_TransparentContainer;
+asn_struct_free_f SourceBSS_ToTargetBSS_TransparentContainer_free;
+asn_struct_print_f SourceBSS_ToTargetBSS_TransparentContainer_print;
+asn_constr_check_f SourceBSS_ToTargetBSS_TransparentContainer_constraint;
+ber_type_decoder_f SourceBSS_ToTargetBSS_TransparentContainer_decode_ber;
+der_type_encoder_f SourceBSS_ToTargetBSS_TransparentContainer_encode_der;
+xer_type_decoder_f SourceBSS_ToTargetBSS_TransparentContainer_decode_xer;
+xer_type_encoder_f SourceBSS_ToTargetBSS_TransparentContainer_encode_xer;
+oer_type_decoder_f SourceBSS_ToTargetBSS_TransparentContainer_decode_oer;
+oer_type_encoder_f SourceBSS_ToTargetBSS_TransparentContainer_encode_oer;
+per_type_decoder_f SourceBSS_ToTargetBSS_TransparentContainer_decode_uper;
+per_type_encoder_f SourceBSS_ToTargetBSS_TransparentContainer_encode_uper;
+per_type_decoder_f SourceBSS_ToTargetBSS_TransparentContainer_decode_aper;
+per_type_encoder_f SourceBSS_ToTargetBSS_TransparentContainer_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _SourceBSS_ToTargetBSS_TransparentContainer_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/SourceNgRanNode-ToTargetNgRanNode-TransparentContainer.h b/src/s1ap/asn1c/asnGenFiles/SourceNgRanNode-ToTargetNgRanNode-TransparentContainer.h
new file mode 100644
index 0000000..ce132bf
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/SourceNgRanNode-ToTargetNgRanNode-TransparentContainer.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_SourceNgRanNode_ToTargetNgRanNode_TransparentContainer_H_
+#define	_SourceNgRanNode_ToTargetNgRanNode_TransparentContainer_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* SourceNgRanNode-ToTargetNgRanNode-TransparentContainer */
+typedef OCTET_STRING_t	 SourceNgRanNode_ToTargetNgRanNode_TransparentContainer_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_SourceNgRanNode_ToTargetNgRanNode_TransparentContainer;
+asn_struct_free_f SourceNgRanNode_ToTargetNgRanNode_TransparentContainer_free;
+asn_struct_print_f SourceNgRanNode_ToTargetNgRanNode_TransparentContainer_print;
+asn_constr_check_f SourceNgRanNode_ToTargetNgRanNode_TransparentContainer_constraint;
+ber_type_decoder_f SourceNgRanNode_ToTargetNgRanNode_TransparentContainer_decode_ber;
+der_type_encoder_f SourceNgRanNode_ToTargetNgRanNode_TransparentContainer_encode_der;
+xer_type_decoder_f SourceNgRanNode_ToTargetNgRanNode_TransparentContainer_decode_xer;
+xer_type_encoder_f SourceNgRanNode_ToTargetNgRanNode_TransparentContainer_encode_xer;
+oer_type_decoder_f SourceNgRanNode_ToTargetNgRanNode_TransparentContainer_decode_oer;
+oer_type_encoder_f SourceNgRanNode_ToTargetNgRanNode_TransparentContainer_encode_oer;
+per_type_decoder_f SourceNgRanNode_ToTargetNgRanNode_TransparentContainer_decode_uper;
+per_type_encoder_f SourceNgRanNode_ToTargetNgRanNode_TransparentContainer_encode_uper;
+per_type_decoder_f SourceNgRanNode_ToTargetNgRanNode_TransparentContainer_decode_aper;
+per_type_encoder_f SourceNgRanNode_ToTargetNgRanNode_TransparentContainer_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _SourceNgRanNode_ToTargetNgRanNode_TransparentContainer_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/SourceOfUEActivityBehaviourInformation.h b/src/s1ap/asn1c/asnGenFiles/SourceOfUEActivityBehaviourInformation.h
new file mode 100644
index 0000000..9f5ef9e
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/SourceOfUEActivityBehaviourInformation.h
@@ -0,0 +1,56 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_SourceOfUEActivityBehaviourInformation_H_
+#define	_SourceOfUEActivityBehaviourInformation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum SourceOfUEActivityBehaviourInformation {
+	SourceOfUEActivityBehaviourInformation_subscription_information	= 0,
+	SourceOfUEActivityBehaviourInformation_statistics	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_SourceOfUEActivityBehaviourInformation;
+
+/* SourceOfUEActivityBehaviourInformation */
+typedef long	 SourceOfUEActivityBehaviourInformation_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_SourceOfUEActivityBehaviourInformation_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_SourceOfUEActivityBehaviourInformation;
+extern const asn_INTEGER_specifics_t asn_SPC_SourceOfUEActivityBehaviourInformation_specs_1;
+asn_struct_free_f SourceOfUEActivityBehaviourInformation_free;
+asn_struct_print_f SourceOfUEActivityBehaviourInformation_print;
+asn_constr_check_f SourceOfUEActivityBehaviourInformation_constraint;
+ber_type_decoder_f SourceOfUEActivityBehaviourInformation_decode_ber;
+der_type_encoder_f SourceOfUEActivityBehaviourInformation_encode_der;
+xer_type_decoder_f SourceOfUEActivityBehaviourInformation_decode_xer;
+xer_type_encoder_f SourceOfUEActivityBehaviourInformation_encode_xer;
+oer_type_decoder_f SourceOfUEActivityBehaviourInformation_decode_oer;
+oer_type_encoder_f SourceOfUEActivityBehaviourInformation_encode_oer;
+per_type_decoder_f SourceOfUEActivityBehaviourInformation_decode_uper;
+per_type_encoder_f SourceOfUEActivityBehaviourInformation_encode_uper;
+per_type_decoder_f SourceOfUEActivityBehaviourInformation_decode_aper;
+per_type_encoder_f SourceOfUEActivityBehaviourInformation_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _SourceOfUEActivityBehaviourInformation_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/SourceRNC-ToTargetRNC-TransparentContainer.h b/src/s1ap/asn1c/asnGenFiles/SourceRNC-ToTargetRNC-TransparentContainer.h
new file mode 100644
index 0000000..090636f
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/SourceRNC-ToTargetRNC-TransparentContainer.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_SourceRNC_ToTargetRNC_TransparentContainer_H_
+#define	_SourceRNC_ToTargetRNC_TransparentContainer_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* SourceRNC-ToTargetRNC-TransparentContainer */
+typedef OCTET_STRING_t	 SourceRNC_ToTargetRNC_TransparentContainer_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_SourceRNC_ToTargetRNC_TransparentContainer;
+asn_struct_free_f SourceRNC_ToTargetRNC_TransparentContainer_free;
+asn_struct_print_f SourceRNC_ToTargetRNC_TransparentContainer_print;
+asn_constr_check_f SourceRNC_ToTargetRNC_TransparentContainer_constraint;
+ber_type_decoder_f SourceRNC_ToTargetRNC_TransparentContainer_decode_ber;
+der_type_encoder_f SourceRNC_ToTargetRNC_TransparentContainer_encode_der;
+xer_type_decoder_f SourceRNC_ToTargetRNC_TransparentContainer_decode_xer;
+xer_type_encoder_f SourceRNC_ToTargetRNC_TransparentContainer_encode_xer;
+oer_type_decoder_f SourceRNC_ToTargetRNC_TransparentContainer_decode_oer;
+oer_type_encoder_f SourceRNC_ToTargetRNC_TransparentContainer_encode_oer;
+per_type_decoder_f SourceRNC_ToTargetRNC_TransparentContainer_decode_uper;
+per_type_encoder_f SourceRNC_ToTargetRNC_TransparentContainer_encode_uper;
+per_type_decoder_f SourceRNC_ToTargetRNC_TransparentContainer_decode_aper;
+per_type_encoder_f SourceRNC_ToTargetRNC_TransparentContainer_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _SourceRNC_ToTargetRNC_TransparentContainer_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/SourceeNB-ID.h b/src/s1ap/asn1c/asnGenFiles/SourceeNB-ID.h
new file mode 100644
index 0000000..6508fe4
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/SourceeNB-ID.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_SourceeNB_ID_H_
+#define	_SourceeNB_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "Global-ENB-ID.h"
+#include "TAI.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* SourceeNB-ID */
+typedef struct SourceeNB_ID {
+	Global_ENB_ID_t	 global_ENB_ID;
+	TAI_t	 selected_TAI;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} SourceeNB_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_SourceeNB_ID;
+extern asn_SEQUENCE_specifics_t asn_SPC_SourceeNB_ID_specs_1;
+extern asn_TYPE_member_t asn_MBR_SourceeNB_ID_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _SourceeNB_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/SourceeNB-ToTargeteNB-TransparentContainer.h b/src/s1ap/asn1c/asnGenFiles/SourceeNB-ToTargeteNB-TransparentContainer.h
new file mode 100644
index 0000000..b445ff4
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/SourceeNB-ToTargeteNB-TransparentContainer.h
@@ -0,0 +1,54 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_SourceeNB_ToTargeteNB_TransparentContainer_H_
+#define	_SourceeNB_ToTargeteNB_TransparentContainer_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RRC-Container.h"
+#include "EUTRAN-CGI.h"
+#include "SubscriberProfileIDforRFP.h"
+#include "UE-HistoryInformation.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct E_RABInformationList;
+struct ProtocolExtensionContainer;
+
+/* SourceeNB-ToTargeteNB-TransparentContainer */
+typedef struct SourceeNB_ToTargeteNB_TransparentContainer {
+	RRC_Container_t	 rRC_Container;
+	struct E_RABInformationList	*e_RABInformationList;	/* OPTIONAL */
+	EUTRAN_CGI_t	 targetCell_ID;
+	SubscriberProfileIDforRFP_t	*subscriberProfileIDforRFP;	/* OPTIONAL */
+	UE_HistoryInformation_t	 uE_HistoryInformation;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} SourceeNB_ToTargeteNB_TransparentContainer_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_SourceeNB_ToTargeteNB_TransparentContainer;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _SourceeNB_ToTargeteNB_TransparentContainer_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/StratumLevel.h b/src/s1ap/asn1c/asnGenFiles/StratumLevel.h
new file mode 100644
index 0000000..dfa38f2
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/StratumLevel.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_StratumLevel_H_
+#define	_StratumLevel_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* StratumLevel */
+typedef long	 StratumLevel_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_StratumLevel_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_StratumLevel;
+asn_struct_free_f StratumLevel_free;
+asn_struct_print_f StratumLevel_print;
+asn_constr_check_f StratumLevel_constraint;
+ber_type_decoder_f StratumLevel_decode_ber;
+der_type_encoder_f StratumLevel_encode_der;
+xer_type_decoder_f StratumLevel_decode_xer;
+xer_type_encoder_f StratumLevel_encode_xer;
+oer_type_decoder_f StratumLevel_decode_oer;
+oer_type_encoder_f StratumLevel_encode_oer;
+per_type_decoder_f StratumLevel_decode_uper;
+per_type_encoder_f StratumLevel_encode_uper;
+per_type_decoder_f StratumLevel_decode_aper;
+per_type_encoder_f StratumLevel_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _StratumLevel_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/SubscriberProfileIDforRFP.h b/src/s1ap/asn1c/asnGenFiles/SubscriberProfileIDforRFP.h
new file mode 100644
index 0000000..78b5e02
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/SubscriberProfileIDforRFP.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_SubscriberProfileIDforRFP_H_
+#define	_SubscriberProfileIDforRFP_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* SubscriberProfileIDforRFP */
+typedef long	 SubscriberProfileIDforRFP_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_SubscriberProfileIDforRFP_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_SubscriberProfileIDforRFP;
+asn_struct_free_f SubscriberProfileIDforRFP_free;
+asn_struct_print_f SubscriberProfileIDforRFP_print;
+asn_constr_check_f SubscriberProfileIDforRFP_constraint;
+ber_type_decoder_f SubscriberProfileIDforRFP_decode_ber;
+der_type_encoder_f SubscriberProfileIDforRFP_encode_der;
+xer_type_decoder_f SubscriberProfileIDforRFP_decode_xer;
+xer_type_encoder_f SubscriberProfileIDforRFP_encode_xer;
+oer_type_decoder_f SubscriberProfileIDforRFP_decode_oer;
+oer_type_encoder_f SubscriberProfileIDforRFP_encode_oer;
+per_type_decoder_f SubscriberProfileIDforRFP_decode_uper;
+per_type_encoder_f SubscriberProfileIDforRFP_encode_uper;
+per_type_decoder_f SubscriberProfileIDforRFP_decode_aper;
+per_type_encoder_f SubscriberProfileIDforRFP_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _SubscriberProfileIDforRFP_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Subscription-Based-UE-DifferentiationInfo.h b/src/s1ap/asn1c/asnGenFiles/Subscription-Based-UE-DifferentiationInfo.h
new file mode 100644
index 0000000..c2bd2c8
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Subscription-Based-UE-DifferentiationInfo.h
@@ -0,0 +1,91 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Subscription_Based_UE_DifferentiationInfo_H_
+#define	_Subscription_Based_UE_DifferentiationInfo_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+#include <NativeInteger.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum Subscription_Based_UE_DifferentiationInfo__periodicCommunicationIndicator {
+	Subscription_Based_UE_DifferentiationInfo__periodicCommunicationIndicator_periodically	= 0,
+	Subscription_Based_UE_DifferentiationInfo__periodicCommunicationIndicator_ondemand	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_Subscription_Based_UE_DifferentiationInfo__periodicCommunicationIndicator;
+typedef enum Subscription_Based_UE_DifferentiationInfo__stationaryIndication {
+	Subscription_Based_UE_DifferentiationInfo__stationaryIndication_stationary	= 0,
+	Subscription_Based_UE_DifferentiationInfo__stationaryIndication_mobile	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_Subscription_Based_UE_DifferentiationInfo__stationaryIndication;
+typedef enum Subscription_Based_UE_DifferentiationInfo__trafficProfile {
+	Subscription_Based_UE_DifferentiationInfo__trafficProfile_single_packet	= 0,
+	Subscription_Based_UE_DifferentiationInfo__trafficProfile_dual_packets	= 1,
+	Subscription_Based_UE_DifferentiationInfo__trafficProfile_multiple_packets	= 2
+	/*
+	 * Enumeration is extensible
+	 */
+} e_Subscription_Based_UE_DifferentiationInfo__trafficProfile;
+typedef enum Subscription_Based_UE_DifferentiationInfo__batteryIndication {
+	Subscription_Based_UE_DifferentiationInfo__batteryIndication_battery_powered	= 0,
+	Subscription_Based_UE_DifferentiationInfo__batteryIndication_battery_powered_not_rechargeable_or_replaceable	= 1,
+	Subscription_Based_UE_DifferentiationInfo__batteryIndication_not_battery_powered	= 2
+	/*
+	 * Enumeration is extensible
+	 */
+} e_Subscription_Based_UE_DifferentiationInfo__batteryIndication;
+
+/* Forward declarations */
+struct ScheduledCommunicationTime;
+struct ProtocolExtensionContainer;
+
+/* Subscription-Based-UE-DifferentiationInfo */
+typedef struct Subscription_Based_UE_DifferentiationInfo {
+	long	*periodicCommunicationIndicator;	/* OPTIONAL */
+	long	*periodicTime;	/* OPTIONAL */
+	struct ScheduledCommunicationTime	*scheduledCommunicationTime;	/* OPTIONAL */
+	long	*stationaryIndication;	/* OPTIONAL */
+	long	*trafficProfile;	/* OPTIONAL */
+	long	*batteryIndication;	/* OPTIONAL */
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} Subscription_Based_UE_DifferentiationInfo_t;
+
+/* Implementation */
+/* extern asn_TYPE_descriptor_t asn_DEF_periodicCommunicationIndicator_2;	// (Use -fall-defs-global to expose) */
+/* extern asn_TYPE_descriptor_t asn_DEF_stationaryIndication_8;	// (Use -fall-defs-global to expose) */
+/* extern asn_TYPE_descriptor_t asn_DEF_trafficProfile_12;	// (Use -fall-defs-global to expose) */
+/* extern asn_TYPE_descriptor_t asn_DEF_batteryIndication_17;	// (Use -fall-defs-global to expose) */
+extern asn_TYPE_descriptor_t asn_DEF_Subscription_Based_UE_DifferentiationInfo;
+extern asn_SEQUENCE_specifics_t asn_SPC_Subscription_Based_UE_DifferentiationInfo_specs_1;
+extern asn_TYPE_member_t asn_MBR_Subscription_Based_UE_DifferentiationInfo_1[7];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Subscription_Based_UE_DifferentiationInfo_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/SuccessfulOutcome.h b/src/s1ap/asn1c/asnGenFiles/SuccessfulOutcome.h
new file mode 100644
index 0000000..08a069d
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/SuccessfulOutcome.h
@@ -0,0 +1,194 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Descriptions"
+ * 	found in "./asn1c/S1AP-PDU-Descriptions.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_SuccessfulOutcome_H_
+#define	_SuccessfulOutcome_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProcedureCode.h"
+#include "Criticality.h"
+#include <ANY.h>
+#include <asn_ioc.h>
+#include "HandoverRequired.h"
+#include "HandoverCommand.h"
+#include "HandoverPreparationFailure.h"
+#include "HandoverRequest.h"
+#include "HandoverRequestAcknowledge.h"
+#include "HandoverFailure.h"
+#include "PathSwitchRequest.h"
+#include "PathSwitchRequestAcknowledge.h"
+#include "PathSwitchRequestFailure.h"
+#include "E-RABSetupRequest.h"
+#include "E-RABSetupResponse.h"
+#include "E-RABModifyRequest.h"
+#include "E-RABModifyResponse.h"
+#include "E-RABReleaseCommand.h"
+#include "E-RABReleaseResponse.h"
+#include "InitialContextSetupRequest.h"
+#include "InitialContextSetupResponse.h"
+#include "InitialContextSetupFailure.h"
+#include "HandoverCancel.h"
+#include "HandoverCancelAcknowledge.h"
+#include "KillRequest.h"
+#include "KillResponse.h"
+#include "Reset.h"
+#include "ResetAcknowledge.h"
+#include "S1SetupRequest.h"
+#include "S1SetupResponse.h"
+#include "S1SetupFailure.h"
+#include "UEContextModificationRequest.h"
+#include "UEContextModificationResponse.h"
+#include "UEContextModificationFailure.h"
+#include "UEContextReleaseCommand.h"
+#include "UEContextReleaseComplete.h"
+#include "ENBConfigurationUpdate.h"
+#include "ENBConfigurationUpdateAcknowledge.h"
+#include "ENBConfigurationUpdateFailure.h"
+#include "MMEConfigurationUpdate.h"
+#include "MMEConfigurationUpdateAcknowledge.h"
+#include "MMEConfigurationUpdateFailure.h"
+#include "WriteReplaceWarningRequest.h"
+#include "WriteReplaceWarningResponse.h"
+#include "UERadioCapabilityMatchRequest.h"
+#include "UERadioCapabilityMatchResponse.h"
+#include "E-RABModificationIndication.h"
+#include "E-RABModificationConfirm.h"
+#include "UEContextModificationIndication.h"
+#include "UEContextModificationConfirm.h"
+#include "UEContextSuspendRequest.h"
+#include "UEContextSuspendResponse.h"
+#include "UEContextResumeRequest.h"
+#include "UEContextResumeResponse.h"
+#include "UEContextResumeFailure.h"
+#include "HandoverNotify.h"
+#include "E-RABReleaseIndication.h"
+#include "Paging.h"
+#include "DownlinkNASTransport.h"
+#include "InitialUEMessage.h"
+#include "UplinkNASTransport.h"
+#include "ErrorIndication.h"
+#include "NASNonDeliveryIndication.h"
+#include "UEContextReleaseRequest.h"
+#include "DownlinkS1cdma2000tunnelling.h"
+#include "UplinkS1cdma2000tunnelling.h"
+#include "UECapabilityInfoIndication.h"
+#include "ENBStatusTransfer.h"
+#include "MMEStatusTransfer.h"
+#include "DeactivateTrace.h"
+#include "TraceStart.h"
+#include "TraceFailureIndication.h"
+#include "CellTrafficTrace.h"
+#include "LocationReportingControl.h"
+#include "LocationReportingFailureIndication.h"
+#include "LocationReport.h"
+#include "OverloadStart.h"
+#include "OverloadStop.h"
+#include "ENBDirectInformationTransfer.h"
+#include "MMEDirectInformationTransfer.h"
+#include "ENBConfigurationTransfer.h"
+#include "MMEConfigurationTransfer.h"
+#include "PrivateMessage.h"
+#include "DownlinkUEAssociatedLPPaTransport.h"
+#include "UplinkUEAssociatedLPPaTransport.h"
+#include "DownlinkNonUEAssociatedLPPaTransport.h"
+#include "UplinkNonUEAssociatedLPPaTransport.h"
+#include "PWSRestartIndication.h"
+#include "RerouteNASRequest.h"
+#include "PWSFailureIndication.h"
+#include "ConnectionEstablishmentIndication.h"
+#include "NASDeliveryIndication.h"
+#include "RetrieveUEInformation.h"
+#include "UEInformationTransfer.h"
+#include "ENBCPRelocationIndication.h"
+#include "MMECPRelocationIndication.h"
+#include "SecondaryRATDataUsageReport.h"
+#include <OPEN_TYPE.h>
+#include <constr_CHOICE.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum SuccessfulOutcome__value_PR {
+	SuccessfulOutcome__value_PR_NOTHING,	/* No components present */
+	SuccessfulOutcome__value_PR_HandoverCommand,
+	SuccessfulOutcome__value_PR_HandoverRequestAcknowledge,
+	SuccessfulOutcome__value_PR_PathSwitchRequestAcknowledge,
+	SuccessfulOutcome__value_PR_E_RABSetupResponse,
+	SuccessfulOutcome__value_PR_E_RABModifyResponse,
+	SuccessfulOutcome__value_PR_E_RABReleaseResponse,
+	SuccessfulOutcome__value_PR_InitialContextSetupResponse,
+	SuccessfulOutcome__value_PR_HandoverCancelAcknowledge,
+	SuccessfulOutcome__value_PR_KillResponse,
+	SuccessfulOutcome__value_PR_ResetAcknowledge,
+	SuccessfulOutcome__value_PR_S1SetupResponse,
+	SuccessfulOutcome__value_PR_UEContextModificationResponse,
+	SuccessfulOutcome__value_PR_UEContextReleaseComplete,
+	SuccessfulOutcome__value_PR_ENBConfigurationUpdateAcknowledge,
+	SuccessfulOutcome__value_PR_MMEConfigurationUpdateAcknowledge,
+	SuccessfulOutcome__value_PR_WriteReplaceWarningResponse,
+	SuccessfulOutcome__value_PR_UERadioCapabilityMatchResponse,
+	SuccessfulOutcome__value_PR_E_RABModificationConfirm,
+	SuccessfulOutcome__value_PR_UEContextModificationConfirm,
+	SuccessfulOutcome__value_PR_UEContextSuspendResponse,
+	SuccessfulOutcome__value_PR_UEContextResumeResponse
+} SuccessfulOutcome__value_PR;
+
+/* SuccessfulOutcome */
+typedef struct SuccessfulOutcome {
+	ProcedureCode_t	 procedureCode;
+	Criticality_t	 criticality;
+	struct SuccessfulOutcome__value {
+		SuccessfulOutcome__value_PR present;
+		union SuccessfulOutcome__value_u {
+			HandoverCommand_t	 HandoverCommand;
+			HandoverRequestAcknowledge_t	 HandoverRequestAcknowledge;
+			PathSwitchRequestAcknowledge_t	 PathSwitchRequestAcknowledge;
+			E_RABSetupResponse_t	 E_RABSetupResponse;
+			E_RABModifyResponse_t	 E_RABModifyResponse;
+			E_RABReleaseResponse_t	 E_RABReleaseResponse;
+			InitialContextSetupResponse_t	 InitialContextSetupResponse;
+			HandoverCancelAcknowledge_t	 HandoverCancelAcknowledge;
+			KillResponse_t	 KillResponse;
+			ResetAcknowledge_t	 ResetAcknowledge;
+			S1SetupResponse_t	 S1SetupResponse;
+			UEContextModificationResponse_t	 UEContextModificationResponse;
+			UEContextReleaseComplete_t	 UEContextReleaseComplete;
+			ENBConfigurationUpdateAcknowledge_t	 ENBConfigurationUpdateAcknowledge;
+			MMEConfigurationUpdateAcknowledge_t	 MMEConfigurationUpdateAcknowledge;
+			WriteReplaceWarningResponse_t	 WriteReplaceWarningResponse;
+			UERadioCapabilityMatchResponse_t	 UERadioCapabilityMatchResponse;
+			E_RABModificationConfirm_t	 E_RABModificationConfirm;
+			UEContextModificationConfirm_t	 UEContextModificationConfirm;
+			UEContextSuspendResponse_t	 UEContextSuspendResponse;
+			UEContextResumeResponse_t	 UEContextResumeResponse;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} SuccessfulOutcome_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_SuccessfulOutcome;
+extern asn_SEQUENCE_specifics_t asn_SPC_SuccessfulOutcome_specs_1;
+extern asn_TYPE_member_t asn_MBR_SuccessfulOutcome_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _SuccessfulOutcome_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/SupportedTAs-Item.h b/src/s1ap/asn1c/asnGenFiles/SupportedTAs-Item.h
new file mode 100644
index 0000000..c38a723
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/SupportedTAs-Item.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_SupportedTAs_Item_H_
+#define	_SupportedTAs_Item_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "TAC.h"
+#include "BPLMNs.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* SupportedTAs-Item */
+typedef struct SupportedTAs_Item {
+	TAC_t	 tAC;
+	BPLMNs_t	 broadcastPLMNs;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} SupportedTAs_Item_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_SupportedTAs_Item;
+extern asn_SEQUENCE_specifics_t asn_SPC_SupportedTAs_Item_specs_1;
+extern asn_TYPE_member_t asn_MBR_SupportedTAs_Item_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _SupportedTAs_Item_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/SupportedTAs.h b/src/s1ap/asn1c/asnGenFiles/SupportedTAs.h
new file mode 100644
index 0000000..6138b99
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/SupportedTAs.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_SupportedTAs_H_
+#define	_SupportedTAs_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct SupportedTAs_Item;
+
+/* SupportedTAs */
+typedef struct SupportedTAs {
+	A_SEQUENCE_OF(struct SupportedTAs_Item) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} SupportedTAs_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_SupportedTAs;
+extern asn_SET_OF_specifics_t asn_SPC_SupportedTAs_specs_1;
+extern asn_TYPE_member_t asn_MBR_SupportedTAs_1[1];
+extern asn_per_constraints_t asn_PER_type_SupportedTAs_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _SupportedTAs_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/SynchronisationInformation.h b/src/s1ap/asn1c/asnGenFiles/SynchronisationInformation.h
new file mode 100644
index 0000000..b6cbd51
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/SynchronisationInformation.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_SynchronisationInformation_H_
+#define	_SynchronisationInformation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "StratumLevel.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ListeningSubframePattern;
+struct ECGI_List;
+struct ProtocolExtensionContainer;
+
+/* SynchronisationInformation */
+typedef struct SynchronisationInformation {
+	StratumLevel_t	*sourceStratumLevel;	/* OPTIONAL */
+	struct ListeningSubframePattern	*listeningSubframePattern;	/* OPTIONAL */
+	struct ECGI_List	*aggressoreCGI_List;	/* OPTIONAL */
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} SynchronisationInformation_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_SynchronisationInformation;
+extern asn_SEQUENCE_specifics_t asn_SPC_SynchronisationInformation_specs_1;
+extern asn_TYPE_member_t asn_MBR_SynchronisationInformation_1[4];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _SynchronisationInformation_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/SynchronisationStatus.h b/src/s1ap/asn1c/asnGenFiles/SynchronisationStatus.h
new file mode 100644
index 0000000..1b3751a
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/SynchronisationStatus.h
@@ -0,0 +1,56 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_SynchronisationStatus_H_
+#define	_SynchronisationStatus_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum SynchronisationStatus {
+	SynchronisationStatus_synchronous	= 0,
+	SynchronisationStatus_asynchronous	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_SynchronisationStatus;
+
+/* SynchronisationStatus */
+typedef long	 SynchronisationStatus_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_SynchronisationStatus_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_SynchronisationStatus;
+extern const asn_INTEGER_specifics_t asn_SPC_SynchronisationStatus_specs_1;
+asn_struct_free_f SynchronisationStatus_free;
+asn_struct_print_f SynchronisationStatus_print;
+asn_constr_check_f SynchronisationStatus_constraint;
+ber_type_decoder_f SynchronisationStatus_decode_ber;
+der_type_encoder_f SynchronisationStatus_encode_der;
+xer_type_decoder_f SynchronisationStatus_decode_xer;
+xer_type_encoder_f SynchronisationStatus_encode_xer;
+oer_type_decoder_f SynchronisationStatus_decode_oer;
+oer_type_encoder_f SynchronisationStatus_encode_oer;
+per_type_decoder_f SynchronisationStatus_decode_uper;
+per_type_encoder_f SynchronisationStatus_encode_uper;
+per_type_decoder_f SynchronisationStatus_decode_aper;
+per_type_encoder_f SynchronisationStatus_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _SynchronisationStatus_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/TABasedMDT.h b/src/s1ap/asn1c/asnGenFiles/TABasedMDT.h
new file mode 100644
index 0000000..b181a25
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/TABasedMDT.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_TABasedMDT_H_
+#define	_TABasedMDT_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "TAListforMDT.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* TABasedMDT */
+typedef struct TABasedMDT {
+	TAListforMDT_t	 tAListforMDT;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TABasedMDT_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_TABasedMDT;
+extern asn_SEQUENCE_specifics_t asn_SPC_TABasedMDT_specs_1;
+extern asn_TYPE_member_t asn_MBR_TABasedMDT_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _TABasedMDT_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/TABasedQMC.h b/src/s1ap/asn1c/asnGenFiles/TABasedQMC.h
new file mode 100644
index 0000000..db85df7
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/TABasedQMC.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_TABasedQMC_H_
+#define	_TABasedQMC_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "TAListforQMC.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* TABasedQMC */
+typedef struct TABasedQMC {
+	TAListforQMC_t	 tAListforQMC;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TABasedQMC_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_TABasedQMC;
+extern asn_SEQUENCE_specifics_t asn_SPC_TABasedQMC_specs_1;
+extern asn_TYPE_member_t asn_MBR_TABasedQMC_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _TABasedQMC_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/TAC.h b/src/s1ap/asn1c/asnGenFiles/TAC.h
new file mode 100644
index 0000000..492e9ba
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/TAC.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_TAC_H_
+#define	_TAC_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* TAC */
+typedef OCTET_STRING_t	 TAC_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_TAC_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_TAC;
+asn_struct_free_f TAC_free;
+asn_struct_print_f TAC_print;
+asn_constr_check_f TAC_constraint;
+ber_type_decoder_f TAC_decode_ber;
+der_type_encoder_f TAC_encode_der;
+xer_type_decoder_f TAC_decode_xer;
+xer_type_encoder_f TAC_encode_xer;
+oer_type_decoder_f TAC_decode_oer;
+oer_type_encoder_f TAC_encode_oer;
+per_type_decoder_f TAC_decode_uper;
+per_type_encoder_f TAC_encode_uper;
+per_type_decoder_f TAC_decode_aper;
+per_type_encoder_f TAC_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _TAC_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/TAI-Broadcast-Item.h b/src/s1ap/asn1c/asnGenFiles/TAI-Broadcast-Item.h
new file mode 100644
index 0000000..57c5c1d
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/TAI-Broadcast-Item.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_TAI_Broadcast_Item_H_
+#define	_TAI_Broadcast_Item_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "TAI.h"
+#include "CompletedCellinTAI.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* TAI-Broadcast-Item */
+typedef struct TAI_Broadcast_Item {
+	TAI_t	 tAI;
+	CompletedCellinTAI_t	 completedCellinTAI;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TAI_Broadcast_Item_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_TAI_Broadcast_Item;
+extern asn_SEQUENCE_specifics_t asn_SPC_TAI_Broadcast_Item_specs_1;
+extern asn_TYPE_member_t asn_MBR_TAI_Broadcast_Item_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _TAI_Broadcast_Item_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/TAI-Broadcast.h b/src/s1ap/asn1c/asnGenFiles/TAI-Broadcast.h
new file mode 100644
index 0000000..9627c80
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/TAI-Broadcast.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_TAI_Broadcast_H_
+#define	_TAI_Broadcast_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct TAI_Broadcast_Item;
+
+/* TAI-Broadcast */
+typedef struct TAI_Broadcast {
+	A_SEQUENCE_OF(struct TAI_Broadcast_Item) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TAI_Broadcast_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_TAI_Broadcast;
+extern asn_SET_OF_specifics_t asn_SPC_TAI_Broadcast_specs_1;
+extern asn_TYPE_member_t asn_MBR_TAI_Broadcast_1[1];
+extern asn_per_constraints_t asn_PER_type_TAI_Broadcast_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _TAI_Broadcast_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/TAI-Cancelled-Item.h b/src/s1ap/asn1c/asnGenFiles/TAI-Cancelled-Item.h
new file mode 100644
index 0000000..eca57ea
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/TAI-Cancelled-Item.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_TAI_Cancelled_Item_H_
+#define	_TAI_Cancelled_Item_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "TAI.h"
+#include "CancelledCellinTAI.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* TAI-Cancelled-Item */
+typedef struct TAI_Cancelled_Item {
+	TAI_t	 tAI;
+	CancelledCellinTAI_t	 cancelledCellinTAI;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TAI_Cancelled_Item_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_TAI_Cancelled_Item;
+extern asn_SEQUENCE_specifics_t asn_SPC_TAI_Cancelled_Item_specs_1;
+extern asn_TYPE_member_t asn_MBR_TAI_Cancelled_Item_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _TAI_Cancelled_Item_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/TAI-Cancelled.h b/src/s1ap/asn1c/asnGenFiles/TAI-Cancelled.h
new file mode 100644
index 0000000..d3b42b0
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/TAI-Cancelled.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_TAI_Cancelled_H_
+#define	_TAI_Cancelled_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct TAI_Cancelled_Item;
+
+/* TAI-Cancelled */
+typedef struct TAI_Cancelled {
+	A_SEQUENCE_OF(struct TAI_Cancelled_Item) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TAI_Cancelled_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_TAI_Cancelled;
+extern asn_SET_OF_specifics_t asn_SPC_TAI_Cancelled_specs_1;
+extern asn_TYPE_member_t asn_MBR_TAI_Cancelled_1[1];
+extern asn_per_constraints_t asn_PER_type_TAI_Cancelled_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _TAI_Cancelled_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/TAI.h b/src/s1ap/asn1c/asnGenFiles/TAI.h
new file mode 100644
index 0000000..e251ec9
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/TAI.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_TAI_H_
+#define	_TAI_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "PLMNidentity.h"
+#include "TAC.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* TAI */
+typedef struct S_TAI {
+	PLMNidentity_t	 pLMNidentity;
+	TAC_t	 tAC;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TAI_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_TAI;
+extern asn_SEQUENCE_specifics_t asn_SPC_TAI_specs_1;
+extern asn_TYPE_member_t asn_MBR_TAI_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _TAI_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/TAIBasedMDT.h b/src/s1ap/asn1c/asnGenFiles/TAIBasedMDT.h
new file mode 100644
index 0000000..b8afbeb
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/TAIBasedMDT.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_TAIBasedMDT_H_
+#define	_TAIBasedMDT_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "TAIListforMDT.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* TAIBasedMDT */
+typedef struct TAIBasedMDT {
+	TAIListforMDT_t	 tAIListforMDT;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TAIBasedMDT_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_TAIBasedMDT;
+extern asn_SEQUENCE_specifics_t asn_SPC_TAIBasedMDT_specs_1;
+extern asn_TYPE_member_t asn_MBR_TAIBasedMDT_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _TAIBasedMDT_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/TAIBasedQMC.h b/src/s1ap/asn1c/asnGenFiles/TAIBasedQMC.h
new file mode 100644
index 0000000..5a84fe2
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/TAIBasedQMC.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_TAIBasedQMC_H_
+#define	_TAIBasedQMC_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "TAIListforQMC.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* TAIBasedQMC */
+typedef struct TAIBasedQMC {
+	TAIListforQMC_t	 tAIListforQMC;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TAIBasedQMC_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_TAIBasedQMC;
+extern asn_SEQUENCE_specifics_t asn_SPC_TAIBasedQMC_specs_1;
+extern asn_TYPE_member_t asn_MBR_TAIBasedQMC_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _TAIBasedQMC_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/TAIItem.h b/src/s1ap/asn1c/asnGenFiles/TAIItem.h
new file mode 100644
index 0000000..84f19ce
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/TAIItem.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_TAIItem_H_
+#define	_TAIItem_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "TAI.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* TAIItem */
+typedef struct TAIItem {
+	TAI_t	 tAI;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TAIItem_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_TAIItem;
+extern asn_SEQUENCE_specifics_t asn_SPC_TAIItem_specs_1;
+extern asn_TYPE_member_t asn_MBR_TAIItem_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _TAIItem_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/TAIList.h b/src/s1ap/asn1c/asnGenFiles/TAIList.h
new file mode 100644
index 0000000..85482cb
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/TAIList.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_TAIList_H_
+#define	_TAIList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolIE_SingleContainer;
+
+/* TAIList */
+typedef struct TAIList {
+	A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TAIList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_TAIList;
+extern asn_SET_OF_specifics_t asn_SPC_TAIList_specs_1;
+extern asn_TYPE_member_t asn_MBR_TAIList_1[1];
+extern asn_per_constraints_t asn_PER_type_TAIList_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _TAIList_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/TAIListForRestart.h b/src/s1ap/asn1c/asnGenFiles/TAIListForRestart.h
new file mode 100644
index 0000000..9a3696d
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/TAIListForRestart.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_TAIListForRestart_H_
+#define	_TAIListForRestart_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct S_TAI;
+
+/* TAIListForRestart */
+typedef struct TAIListForRestart {
+	A_SEQUENCE_OF(struct S_TAI) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TAIListForRestart_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_TAIListForRestart;
+extern asn_SET_OF_specifics_t asn_SPC_TAIListForRestart_specs_1;
+extern asn_TYPE_member_t asn_MBR_TAIListForRestart_1[1];
+extern asn_per_constraints_t asn_PER_type_TAIListForRestart_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _TAIListForRestart_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/TAIListforMDT.h b/src/s1ap/asn1c/asnGenFiles/TAIListforMDT.h
new file mode 100644
index 0000000..0af4b80
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/TAIListforMDT.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_TAIListforMDT_H_
+#define	_TAIListforMDT_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct S_TAI;
+
+/* TAIListforMDT */
+typedef struct TAIListforMDT {
+	A_SEQUENCE_OF(struct S_TAI) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TAIListforMDT_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_TAIListforMDT;
+extern asn_SET_OF_specifics_t asn_SPC_TAIListforMDT_specs_1;
+extern asn_TYPE_member_t asn_MBR_TAIListforMDT_1[1];
+extern asn_per_constraints_t asn_PER_type_TAIListforMDT_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _TAIListforMDT_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/TAIListforQMC.h b/src/s1ap/asn1c/asnGenFiles/TAIListforQMC.h
new file mode 100644
index 0000000..173d9f6
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/TAIListforQMC.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_TAIListforQMC_H_
+#define	_TAIListforQMC_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct S_TAI;
+
+/* TAIListforQMC */
+typedef struct TAIListforQMC {
+	A_SEQUENCE_OF(struct S_TAI) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TAIListforQMC_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_TAIListforQMC;
+extern asn_SET_OF_specifics_t asn_SPC_TAIListforQMC_specs_1;
+extern asn_TYPE_member_t asn_MBR_TAIListforQMC_1[1];
+extern asn_per_constraints_t asn_PER_type_TAIListforQMC_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _TAIListforQMC_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/TAIListforWarning.h b/src/s1ap/asn1c/asnGenFiles/TAIListforWarning.h
new file mode 100644
index 0000000..9f896a8
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/TAIListforWarning.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_TAIListforWarning_H_
+#define	_TAIListforWarning_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct S_TAI;
+
+/* TAIListforWarning */
+typedef struct TAIListforWarning {
+	A_SEQUENCE_OF(struct S_TAI) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TAIListforWarning_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_TAIListforWarning;
+extern asn_SET_OF_specifics_t asn_SPC_TAIListforWarning_specs_1;
+extern asn_TYPE_member_t asn_MBR_TAIListforWarning_1[1];
+extern asn_per_constraints_t asn_PER_type_TAIListforWarning_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _TAIListforWarning_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/TAListforMDT.h b/src/s1ap/asn1c/asnGenFiles/TAListforMDT.h
new file mode 100644
index 0000000..7702043
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/TAListforMDT.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_TAListforMDT_H_
+#define	_TAListforMDT_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "TAC.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* TAListforMDT */
+typedef struct TAListforMDT {
+	A_SEQUENCE_OF(TAC_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TAListforMDT_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_TAListforMDT;
+extern asn_SET_OF_specifics_t asn_SPC_TAListforMDT_specs_1;
+extern asn_TYPE_member_t asn_MBR_TAListforMDT_1[1];
+extern asn_per_constraints_t asn_PER_type_TAListforMDT_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _TAListforMDT_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/TAListforQMC.h b/src/s1ap/asn1c/asnGenFiles/TAListforQMC.h
new file mode 100644
index 0000000..e654901
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/TAListforQMC.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_TAListforQMC_H_
+#define	_TAListforQMC_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "TAC.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* TAListforQMC */
+typedef struct TAListforQMC {
+	A_SEQUENCE_OF(TAC_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TAListforQMC_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_TAListforQMC;
+extern asn_SET_OF_specifics_t asn_SPC_TAListforQMC_specs_1;
+extern asn_TYPE_member_t asn_MBR_TAListforQMC_1[1];
+extern asn_per_constraints_t asn_PER_type_TAListforQMC_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _TAListforQMC_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/TBCD-STRING.h b/src/s1ap/asn1c/asnGenFiles/TBCD-STRING.h
new file mode 100644
index 0000000..4e207cf
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/TBCD-STRING.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_TBCD_STRING_H_
+#define	_TBCD_STRING_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* TBCD-STRING */
+typedef OCTET_STRING_t	 TBCD_STRING_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_TBCD_STRING_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_TBCD_STRING;
+asn_struct_free_f TBCD_STRING_free;
+asn_struct_print_f TBCD_STRING_print;
+asn_constr_check_f TBCD_STRING_constraint;
+ber_type_decoder_f TBCD_STRING_decode_ber;
+der_type_encoder_f TBCD_STRING_encode_der;
+xer_type_decoder_f TBCD_STRING_decode_xer;
+xer_type_encoder_f TBCD_STRING_encode_xer;
+oer_type_decoder_f TBCD_STRING_decode_oer;
+oer_type_encoder_f TBCD_STRING_encode_oer;
+per_type_decoder_f TBCD_STRING_decode_uper;
+per_type_encoder_f TBCD_STRING_encode_uper;
+per_type_decoder_f TBCD_STRING_decode_aper;
+per_type_encoder_f TBCD_STRING_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _TBCD_STRING_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Target-ToSource-TransparentContainer.h b/src/s1ap/asn1c/asnGenFiles/Target-ToSource-TransparentContainer.h
new file mode 100644
index 0000000..4ccc5f3
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Target-ToSource-TransparentContainer.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Target_ToSource_TransparentContainer_H_
+#define	_Target_ToSource_TransparentContainer_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Target-ToSource-TransparentContainer */
+typedef OCTET_STRING_t	 Target_ToSource_TransparentContainer_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_Target_ToSource_TransparentContainer;
+asn_struct_free_f Target_ToSource_TransparentContainer_free;
+asn_struct_print_f Target_ToSource_TransparentContainer_print;
+asn_constr_check_f Target_ToSource_TransparentContainer_constraint;
+ber_type_decoder_f Target_ToSource_TransparentContainer_decode_ber;
+der_type_encoder_f Target_ToSource_TransparentContainer_encode_der;
+xer_type_decoder_f Target_ToSource_TransparentContainer_decode_xer;
+xer_type_encoder_f Target_ToSource_TransparentContainer_encode_xer;
+oer_type_decoder_f Target_ToSource_TransparentContainer_decode_oer;
+oer_type_encoder_f Target_ToSource_TransparentContainer_encode_oer;
+per_type_decoder_f Target_ToSource_TransparentContainer_decode_uper;
+per_type_encoder_f Target_ToSource_TransparentContainer_encode_uper;
+per_type_decoder_f Target_ToSource_TransparentContainer_decode_aper;
+per_type_encoder_f Target_ToSource_TransparentContainer_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Target_ToSource_TransparentContainer_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/TargetBSS-ToSourceBSS-TransparentContainer.h b/src/s1ap/asn1c/asnGenFiles/TargetBSS-ToSourceBSS-TransparentContainer.h
new file mode 100644
index 0000000..727fee9
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/TargetBSS-ToSourceBSS-TransparentContainer.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_TargetBSS_ToSourceBSS_TransparentContainer_H_
+#define	_TargetBSS_ToSourceBSS_TransparentContainer_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* TargetBSS-ToSourceBSS-TransparentContainer */
+typedef OCTET_STRING_t	 TargetBSS_ToSourceBSS_TransparentContainer_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_TargetBSS_ToSourceBSS_TransparentContainer;
+asn_struct_free_f TargetBSS_ToSourceBSS_TransparentContainer_free;
+asn_struct_print_f TargetBSS_ToSourceBSS_TransparentContainer_print;
+asn_constr_check_f TargetBSS_ToSourceBSS_TransparentContainer_constraint;
+ber_type_decoder_f TargetBSS_ToSourceBSS_TransparentContainer_decode_ber;
+der_type_encoder_f TargetBSS_ToSourceBSS_TransparentContainer_encode_der;
+xer_type_decoder_f TargetBSS_ToSourceBSS_TransparentContainer_decode_xer;
+xer_type_encoder_f TargetBSS_ToSourceBSS_TransparentContainer_encode_xer;
+oer_type_decoder_f TargetBSS_ToSourceBSS_TransparentContainer_decode_oer;
+oer_type_encoder_f TargetBSS_ToSourceBSS_TransparentContainer_encode_oer;
+per_type_decoder_f TargetBSS_ToSourceBSS_TransparentContainer_decode_uper;
+per_type_encoder_f TargetBSS_ToSourceBSS_TransparentContainer_encode_uper;
+per_type_decoder_f TargetBSS_ToSourceBSS_TransparentContainer_decode_aper;
+per_type_encoder_f TargetBSS_ToSourceBSS_TransparentContainer_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _TargetBSS_ToSourceBSS_TransparentContainer_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/TargetID.h b/src/s1ap/asn1c/asnGenFiles/TargetID.h
new file mode 100644
index 0000000..7ea1e16
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/TargetID.h
@@ -0,0 +1,66 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_TargetID_H_
+#define	_TargetID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum TargetID_PR {
+	TargetID_PR_NOTHING,	/* No components present */
+	TargetID_PR_targeteNB_ID,
+	TargetID_PR_targetRNC_ID,
+	TargetID_PR_cGI,
+	/* Extensions may appear below */
+	TargetID_PR_targetgNgRanNode_ID
+} TargetID_PR;
+
+/* Forward declarations */
+struct TargeteNB_ID;
+struct TargetRNC_ID;
+struct CGI;
+struct TargetNgRanNode_ID;
+
+/* TargetID */
+typedef struct TargetID {
+	TargetID_PR present;
+	union TargetID_u {
+		struct TargeteNB_ID	*targeteNB_ID;
+		struct TargetRNC_ID	*targetRNC_ID;
+		struct CGI	*cGI;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+		struct TargetNgRanNode_ID	*targetgNgRanNode_ID;
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TargetID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_TargetID;
+extern asn_CHOICE_specifics_t asn_SPC_TargetID_specs_1;
+extern asn_TYPE_member_t asn_MBR_TargetID_1[4];
+extern asn_per_constraints_t asn_PER_type_TargetID_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _TargetID_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/TargetNgRanNode-ID.h b/src/s1ap/asn1c/asnGenFiles/TargetNgRanNode-ID.h
new file mode 100644
index 0000000..015fc63
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/TargetNgRanNode-ID.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_TargetNgRanNode_ID_H_
+#define	_TargetNgRanNode_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "Global-RAN-NODE-ID.h"
+#include "FiveGSTAI.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* TargetNgRanNode-ID */
+typedef struct TargetNgRanNode_ID {
+	Global_RAN_NODE_ID_t	 global_RAN_NODE_ID;
+	FiveGSTAI_t	 selected_TAI;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TargetNgRanNode_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_TargetNgRanNode_ID;
+extern asn_SEQUENCE_specifics_t asn_SPC_TargetNgRanNode_ID_specs_1;
+extern asn_TYPE_member_t asn_MBR_TargetNgRanNode_ID_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _TargetNgRanNode_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/TargetNgRanNode-ToSourceNgRanNode-TransparentContainer.h b/src/s1ap/asn1c/asnGenFiles/TargetNgRanNode-ToSourceNgRanNode-TransparentContainer.h
new file mode 100644
index 0000000..e203b9e
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/TargetNgRanNode-ToSourceNgRanNode-TransparentContainer.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_TargetNgRanNode_ToSourceNgRanNode_TransparentContainer_H_
+#define	_TargetNgRanNode_ToSourceNgRanNode_TransparentContainer_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* TargetNgRanNode-ToSourceNgRanNode-TransparentContainer */
+typedef OCTET_STRING_t	 TargetNgRanNode_ToSourceNgRanNode_TransparentContainer_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_TargetNgRanNode_ToSourceNgRanNode_TransparentContainer;
+asn_struct_free_f TargetNgRanNode_ToSourceNgRanNode_TransparentContainer_free;
+asn_struct_print_f TargetNgRanNode_ToSourceNgRanNode_TransparentContainer_print;
+asn_constr_check_f TargetNgRanNode_ToSourceNgRanNode_TransparentContainer_constraint;
+ber_type_decoder_f TargetNgRanNode_ToSourceNgRanNode_TransparentContainer_decode_ber;
+der_type_encoder_f TargetNgRanNode_ToSourceNgRanNode_TransparentContainer_encode_der;
+xer_type_decoder_f TargetNgRanNode_ToSourceNgRanNode_TransparentContainer_decode_xer;
+xer_type_encoder_f TargetNgRanNode_ToSourceNgRanNode_TransparentContainer_encode_xer;
+oer_type_decoder_f TargetNgRanNode_ToSourceNgRanNode_TransparentContainer_decode_oer;
+oer_type_encoder_f TargetNgRanNode_ToSourceNgRanNode_TransparentContainer_encode_oer;
+per_type_decoder_f TargetNgRanNode_ToSourceNgRanNode_TransparentContainer_decode_uper;
+per_type_encoder_f TargetNgRanNode_ToSourceNgRanNode_TransparentContainer_encode_uper;
+per_type_decoder_f TargetNgRanNode_ToSourceNgRanNode_TransparentContainer_decode_aper;
+per_type_encoder_f TargetNgRanNode_ToSourceNgRanNode_TransparentContainer_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _TargetNgRanNode_ToSourceNgRanNode_TransparentContainer_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/TargetRNC-ID.h b/src/s1ap/asn1c/asnGenFiles/TargetRNC-ID.h
new file mode 100644
index 0000000..e6d0b1e
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/TargetRNC-ID.h
@@ -0,0 +1,54 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_TargetRNC_ID_H_
+#define	_TargetRNC_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "LAI.h"
+#include "RAC.h"
+#include "RNC-ID.h"
+#include "ExtendedRNC-ID.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* TargetRNC-ID */
+typedef struct TargetRNC_ID {
+	LAI_t	 lAI;
+	RAC_t	*rAC;	/* OPTIONAL */
+	RNC_ID_t	 rNC_ID;
+	ExtendedRNC_ID_t	*extendedRNC_ID;	/* OPTIONAL */
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TargetRNC_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_TargetRNC_ID;
+extern asn_SEQUENCE_specifics_t asn_SPC_TargetRNC_ID_specs_1;
+extern asn_TYPE_member_t asn_MBR_TargetRNC_ID_1[5];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _TargetRNC_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/TargetRNC-ToSourceRNC-TransparentContainer.h b/src/s1ap/asn1c/asnGenFiles/TargetRNC-ToSourceRNC-TransparentContainer.h
new file mode 100644
index 0000000..387fb2f
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/TargetRNC-ToSourceRNC-TransparentContainer.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_TargetRNC_ToSourceRNC_TransparentContainer_H_
+#define	_TargetRNC_ToSourceRNC_TransparentContainer_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* TargetRNC-ToSourceRNC-TransparentContainer */
+typedef OCTET_STRING_t	 TargetRNC_ToSourceRNC_TransparentContainer_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_TargetRNC_ToSourceRNC_TransparentContainer;
+asn_struct_free_f TargetRNC_ToSourceRNC_TransparentContainer_free;
+asn_struct_print_f TargetRNC_ToSourceRNC_TransparentContainer_print;
+asn_constr_check_f TargetRNC_ToSourceRNC_TransparentContainer_constraint;
+ber_type_decoder_f TargetRNC_ToSourceRNC_TransparentContainer_decode_ber;
+der_type_encoder_f TargetRNC_ToSourceRNC_TransparentContainer_encode_der;
+xer_type_decoder_f TargetRNC_ToSourceRNC_TransparentContainer_decode_xer;
+xer_type_encoder_f TargetRNC_ToSourceRNC_TransparentContainer_encode_xer;
+oer_type_decoder_f TargetRNC_ToSourceRNC_TransparentContainer_decode_oer;
+oer_type_encoder_f TargetRNC_ToSourceRNC_TransparentContainer_encode_oer;
+per_type_decoder_f TargetRNC_ToSourceRNC_TransparentContainer_decode_uper;
+per_type_encoder_f TargetRNC_ToSourceRNC_TransparentContainer_encode_uper;
+per_type_decoder_f TargetRNC_ToSourceRNC_TransparentContainer_decode_aper;
+per_type_encoder_f TargetRNC_ToSourceRNC_TransparentContainer_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _TargetRNC_ToSourceRNC_TransparentContainer_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/TargeteNB-ID.h b/src/s1ap/asn1c/asnGenFiles/TargeteNB-ID.h
new file mode 100644
index 0000000..7bcd748
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/TargeteNB-ID.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_TargeteNB_ID_H_
+#define	_TargeteNB_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "Global-ENB-ID.h"
+#include "TAI.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* TargeteNB-ID */
+typedef struct TargeteNB_ID {
+	Global_ENB_ID_t	 global_ENB_ID;
+	TAI_t	 selected_TAI;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TargeteNB_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_TargeteNB_ID;
+extern asn_SEQUENCE_specifics_t asn_SPC_TargeteNB_ID_specs_1;
+extern asn_TYPE_member_t asn_MBR_TargeteNB_ID_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _TargeteNB_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/TargeteNB-ToSourceeNB-TransparentContainer.h b/src/s1ap/asn1c/asnGenFiles/TargeteNB-ToSourceeNB-TransparentContainer.h
new file mode 100644
index 0000000..f1049fd
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/TargeteNB-ToSourceeNB-TransparentContainer.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_TargeteNB_ToSourceeNB_TransparentContainer_H_
+#define	_TargeteNB_ToSourceeNB_TransparentContainer_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RRC-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* TargeteNB-ToSourceeNB-TransparentContainer */
+typedef struct TargeteNB_ToSourceeNB_TransparentContainer {
+	RRC_Container_t	 rRC_Container;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TargeteNB_ToSourceeNB_TransparentContainer_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_TargeteNB_ToSourceeNB_TransparentContainer;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _TargeteNB_ToSourceeNB_TransparentContainer_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Threshold-RSRP.h b/src/s1ap/asn1c/asnGenFiles/Threshold-RSRP.h
new file mode 100644
index 0000000..1778e1f
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Threshold-RSRP.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Threshold_RSRP_H_
+#define	_Threshold_RSRP_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Threshold-RSRP */
+typedef long	 Threshold_RSRP_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_Threshold_RSRP_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_Threshold_RSRP;
+asn_struct_free_f Threshold_RSRP_free;
+asn_struct_print_f Threshold_RSRP_print;
+asn_constr_check_f Threshold_RSRP_constraint;
+ber_type_decoder_f Threshold_RSRP_decode_ber;
+der_type_encoder_f Threshold_RSRP_encode_der;
+xer_type_decoder_f Threshold_RSRP_decode_xer;
+xer_type_encoder_f Threshold_RSRP_encode_xer;
+oer_type_decoder_f Threshold_RSRP_decode_oer;
+oer_type_encoder_f Threshold_RSRP_encode_oer;
+per_type_decoder_f Threshold_RSRP_decode_uper;
+per_type_encoder_f Threshold_RSRP_encode_uper;
+per_type_decoder_f Threshold_RSRP_decode_aper;
+per_type_encoder_f Threshold_RSRP_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Threshold_RSRP_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Threshold-RSRQ.h b/src/s1ap/asn1c/asnGenFiles/Threshold-RSRQ.h
new file mode 100644
index 0000000..98aa8a4
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Threshold-RSRQ.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Threshold_RSRQ_H_
+#define	_Threshold_RSRQ_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Threshold-RSRQ */
+typedef long	 Threshold_RSRQ_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_Threshold_RSRQ_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_Threshold_RSRQ;
+asn_struct_free_f Threshold_RSRQ_free;
+asn_struct_print_f Threshold_RSRQ_print;
+asn_constr_check_f Threshold_RSRQ_constraint;
+ber_type_decoder_f Threshold_RSRQ_decode_ber;
+der_type_encoder_f Threshold_RSRQ_encode_der;
+xer_type_decoder_f Threshold_RSRQ_decode_xer;
+xer_type_encoder_f Threshold_RSRQ_encode_xer;
+oer_type_decoder_f Threshold_RSRQ_decode_oer;
+oer_type_encoder_f Threshold_RSRQ_encode_oer;
+per_type_decoder_f Threshold_RSRQ_decode_uper;
+per_type_encoder_f Threshold_RSRQ_encode_uper;
+per_type_decoder_f Threshold_RSRQ_decode_aper;
+per_type_encoder_f Threshold_RSRQ_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Threshold_RSRQ_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Time-UE-StayedInCell-EnhancedGranularity.h b/src/s1ap/asn1c/asnGenFiles/Time-UE-StayedInCell-EnhancedGranularity.h
new file mode 100644
index 0000000..cff7569
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Time-UE-StayedInCell-EnhancedGranularity.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Time_UE_StayedInCell_EnhancedGranularity_H_
+#define	_Time_UE_StayedInCell_EnhancedGranularity_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Time-UE-StayedInCell-EnhancedGranularity */
+typedef long	 Time_UE_StayedInCell_EnhancedGranularity_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_Time_UE_StayedInCell_EnhancedGranularity_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_Time_UE_StayedInCell_EnhancedGranularity;
+asn_struct_free_f Time_UE_StayedInCell_EnhancedGranularity_free;
+asn_struct_print_f Time_UE_StayedInCell_EnhancedGranularity_print;
+asn_constr_check_f Time_UE_StayedInCell_EnhancedGranularity_constraint;
+ber_type_decoder_f Time_UE_StayedInCell_EnhancedGranularity_decode_ber;
+der_type_encoder_f Time_UE_StayedInCell_EnhancedGranularity_encode_der;
+xer_type_decoder_f Time_UE_StayedInCell_EnhancedGranularity_decode_xer;
+xer_type_encoder_f Time_UE_StayedInCell_EnhancedGranularity_encode_xer;
+oer_type_decoder_f Time_UE_StayedInCell_EnhancedGranularity_decode_oer;
+oer_type_encoder_f Time_UE_StayedInCell_EnhancedGranularity_encode_oer;
+per_type_decoder_f Time_UE_StayedInCell_EnhancedGranularity_decode_uper;
+per_type_encoder_f Time_UE_StayedInCell_EnhancedGranularity_encode_uper;
+per_type_decoder_f Time_UE_StayedInCell_EnhancedGranularity_decode_aper;
+per_type_encoder_f Time_UE_StayedInCell_EnhancedGranularity_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Time_UE_StayedInCell_EnhancedGranularity_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/Time-UE-StayedInCell.h b/src/s1ap/asn1c/asnGenFiles/Time-UE-StayedInCell.h
new file mode 100644
index 0000000..490b11c
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/Time-UE-StayedInCell.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_Time_UE_StayedInCell_H_
+#define	_Time_UE_StayedInCell_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Time-UE-StayedInCell */
+typedef long	 Time_UE_StayedInCell_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_Time_UE_StayedInCell_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_Time_UE_StayedInCell;
+asn_struct_free_f Time_UE_StayedInCell_free;
+asn_struct_print_f Time_UE_StayedInCell_print;
+asn_constr_check_f Time_UE_StayedInCell_constraint;
+ber_type_decoder_f Time_UE_StayedInCell_decode_ber;
+der_type_encoder_f Time_UE_StayedInCell_encode_der;
+xer_type_decoder_f Time_UE_StayedInCell_decode_xer;
+xer_type_encoder_f Time_UE_StayedInCell_encode_xer;
+oer_type_decoder_f Time_UE_StayedInCell_decode_oer;
+oer_type_encoder_f Time_UE_StayedInCell_encode_oer;
+per_type_decoder_f Time_UE_StayedInCell_decode_uper;
+per_type_encoder_f Time_UE_StayedInCell_encode_uper;
+per_type_decoder_f Time_UE_StayedInCell_decode_aper;
+per_type_encoder_f Time_UE_StayedInCell_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _Time_UE_StayedInCell_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/TimeSinceSecondaryNodeRelease.h b/src/s1ap/asn1c/asnGenFiles/TimeSinceSecondaryNodeRelease.h
new file mode 100644
index 0000000..32be652
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/TimeSinceSecondaryNodeRelease.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_TimeSinceSecondaryNodeRelease_H_
+#define	_TimeSinceSecondaryNodeRelease_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* TimeSinceSecondaryNodeRelease */
+typedef OCTET_STRING_t	 TimeSinceSecondaryNodeRelease_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_TimeSinceSecondaryNodeRelease_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_TimeSinceSecondaryNodeRelease;
+asn_struct_free_f TimeSinceSecondaryNodeRelease_free;
+asn_struct_print_f TimeSinceSecondaryNodeRelease_print;
+asn_constr_check_f TimeSinceSecondaryNodeRelease_constraint;
+ber_type_decoder_f TimeSinceSecondaryNodeRelease_decode_ber;
+der_type_encoder_f TimeSinceSecondaryNodeRelease_encode_der;
+xer_type_decoder_f TimeSinceSecondaryNodeRelease_decode_xer;
+xer_type_encoder_f TimeSinceSecondaryNodeRelease_encode_xer;
+oer_type_decoder_f TimeSinceSecondaryNodeRelease_decode_oer;
+oer_type_encoder_f TimeSinceSecondaryNodeRelease_encode_oer;
+per_type_decoder_f TimeSinceSecondaryNodeRelease_decode_uper;
+per_type_encoder_f TimeSinceSecondaryNodeRelease_encode_uper;
+per_type_decoder_f TimeSinceSecondaryNodeRelease_decode_aper;
+per_type_encoder_f TimeSinceSecondaryNodeRelease_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _TimeSinceSecondaryNodeRelease_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/TimeSynchronisationInfo.h b/src/s1ap/asn1c/asnGenFiles/TimeSynchronisationInfo.h
new file mode 100644
index 0000000..69e2c86
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/TimeSynchronisationInfo.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_TimeSynchronisationInfo_H_
+#define	_TimeSynchronisationInfo_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "StratumLevel.h"
+#include "SynchronisationStatus.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* TimeSynchronisationInfo */
+typedef struct TimeSynchronisationInfo {
+	StratumLevel_t	 stratumLevel;
+	SynchronisationStatus_t	 synchronisationStatus;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TimeSynchronisationInfo_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_TimeSynchronisationInfo;
+extern asn_SEQUENCE_specifics_t asn_SPC_TimeSynchronisationInfo_specs_1;
+extern asn_TYPE_member_t asn_MBR_TimeSynchronisationInfo_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _TimeSynchronisationInfo_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/TimeToWait.h b/src/s1ap/asn1c/asnGenFiles/TimeToWait.h
new file mode 100644
index 0000000..393cd73
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/TimeToWait.h
@@ -0,0 +1,60 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_TimeToWait_H_
+#define	_TimeToWait_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum TimeToWait {
+	TimeToWait_v1s	= 0,
+	TimeToWait_v2s	= 1,
+	TimeToWait_v5s	= 2,
+	TimeToWait_v10s	= 3,
+	TimeToWait_v20s	= 4,
+	TimeToWait_v60s	= 5
+	/*
+	 * Enumeration is extensible
+	 */
+} e_TimeToWait;
+
+/* TimeToWait */
+typedef long	 TimeToWait_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_TimeToWait_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_TimeToWait;
+extern const asn_INTEGER_specifics_t asn_SPC_TimeToWait_specs_1;
+asn_struct_free_f TimeToWait_free;
+asn_struct_print_f TimeToWait_print;
+asn_constr_check_f TimeToWait_constraint;
+ber_type_decoder_f TimeToWait_decode_ber;
+der_type_encoder_f TimeToWait_encode_der;
+xer_type_decoder_f TimeToWait_decode_xer;
+xer_type_encoder_f TimeToWait_encode_xer;
+oer_type_decoder_f TimeToWait_decode_oer;
+oer_type_encoder_f TimeToWait_encode_oer;
+per_type_decoder_f TimeToWait_decode_uper;
+per_type_encoder_f TimeToWait_encode_uper;
+per_type_decoder_f TimeToWait_decode_aper;
+per_type_encoder_f TimeToWait_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _TimeToWait_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/TraceActivation.h b/src/s1ap/asn1c/asnGenFiles/TraceActivation.h
new file mode 100644
index 0000000..f0587bb
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/TraceActivation.h
@@ -0,0 +1,54 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_TraceActivation_H_
+#define	_TraceActivation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "E-UTRAN-Trace-ID.h"
+#include "InterfacesToTrace.h"
+#include "TraceDepth.h"
+#include "TransportLayerAddress.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* TraceActivation */
+typedef struct TraceActivation {
+	E_UTRAN_Trace_ID_t	 e_UTRAN_Trace_ID;
+	InterfacesToTrace_t	 interfacesToTrace;
+	TraceDepth_t	 traceDepth;
+	TransportLayerAddress_t	 traceCollectionEntityIPAddress;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TraceActivation_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_TraceActivation;
+extern asn_SEQUENCE_specifics_t asn_SPC_TraceActivation_specs_1;
+extern asn_TYPE_member_t asn_MBR_TraceActivation_1[5];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _TraceActivation_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/TraceDepth.h b/src/s1ap/asn1c/asnGenFiles/TraceDepth.h
new file mode 100644
index 0000000..1405cb6
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/TraceDepth.h
@@ -0,0 +1,60 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_TraceDepth_H_
+#define	_TraceDepth_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum TraceDepth {
+	TraceDepth_minimum	= 0,
+	TraceDepth_medium	= 1,
+	TraceDepth_maximum	= 2,
+	TraceDepth_minimumWithoutVendorSpecificExtension	= 3,
+	TraceDepth_mediumWithoutVendorSpecificExtension	= 4,
+	TraceDepth_maximumWithoutVendorSpecificExtension	= 5
+	/*
+	 * Enumeration is extensible
+	 */
+} e_TraceDepth;
+
+/* TraceDepth */
+typedef long	 TraceDepth_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_TraceDepth_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_TraceDepth;
+extern const asn_INTEGER_specifics_t asn_SPC_TraceDepth_specs_1;
+asn_struct_free_f TraceDepth_free;
+asn_struct_print_f TraceDepth_print;
+asn_constr_check_f TraceDepth_constraint;
+ber_type_decoder_f TraceDepth_decode_ber;
+der_type_encoder_f TraceDepth_encode_der;
+xer_type_decoder_f TraceDepth_decode_xer;
+xer_type_encoder_f TraceDepth_encode_xer;
+oer_type_decoder_f TraceDepth_decode_oer;
+oer_type_encoder_f TraceDepth_encode_oer;
+per_type_decoder_f TraceDepth_decode_uper;
+per_type_encoder_f TraceDepth_encode_uper;
+per_type_decoder_f TraceDepth_decode_aper;
+per_type_encoder_f TraceDepth_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _TraceDepth_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/TraceFailureIndication.h b/src/s1ap/asn1c/asnGenFiles/TraceFailureIndication.h
new file mode 100644
index 0000000..094069e
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/TraceFailureIndication.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_TraceFailureIndication_H_
+#define	_TraceFailureIndication_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* TraceFailureIndication */
+typedef struct TraceFailureIndication {
+	ProtocolIE_Container_129P55_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TraceFailureIndication_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_TraceFailureIndication;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _TraceFailureIndication_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/TraceStart.h b/src/s1ap/asn1c/asnGenFiles/TraceStart.h
new file mode 100644
index 0000000..cf8cdc1
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/TraceStart.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_TraceStart_H_
+#define	_TraceStart_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* TraceStart */
+typedef struct TraceStart {
+	ProtocolIE_Container_129P54_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TraceStart_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_TraceStart;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _TraceStart_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/TrafficLoadReductionIndication.h b/src/s1ap/asn1c/asnGenFiles/TrafficLoadReductionIndication.h
new file mode 100644
index 0000000..2ecfc0c
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/TrafficLoadReductionIndication.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_TrafficLoadReductionIndication_H_
+#define	_TrafficLoadReductionIndication_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* TrafficLoadReductionIndication */
+typedef long	 TrafficLoadReductionIndication_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_TrafficLoadReductionIndication_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_TrafficLoadReductionIndication;
+asn_struct_free_f TrafficLoadReductionIndication_free;
+asn_struct_print_f TrafficLoadReductionIndication_print;
+asn_constr_check_f TrafficLoadReductionIndication_constraint;
+ber_type_decoder_f TrafficLoadReductionIndication_decode_ber;
+der_type_encoder_f TrafficLoadReductionIndication_encode_der;
+xer_type_decoder_f TrafficLoadReductionIndication_decode_xer;
+xer_type_encoder_f TrafficLoadReductionIndication_encode_xer;
+oer_type_decoder_f TrafficLoadReductionIndication_decode_oer;
+oer_type_encoder_f TrafficLoadReductionIndication_encode_oer;
+per_type_decoder_f TrafficLoadReductionIndication_decode_uper;
+per_type_encoder_f TrafficLoadReductionIndication_encode_uper;
+per_type_decoder_f TrafficLoadReductionIndication_decode_aper;
+per_type_encoder_f TrafficLoadReductionIndication_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _TrafficLoadReductionIndication_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/TransportInformation.h b/src/s1ap/asn1c/asnGenFiles/TransportInformation.h
new file mode 100644
index 0000000..d2e27aa
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/TransportInformation.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_TransportInformation_H_
+#define	_TransportInformation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "TransportLayerAddress.h"
+#include "GTP-TEID.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* TransportInformation */
+typedef struct TransportInformation {
+	TransportLayerAddress_t	 transportLayerAddress;
+	GTP_TEID_t	 uL_GTP_TEID;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TransportInformation_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_TransportInformation;
+extern asn_SEQUENCE_specifics_t asn_SPC_TransportInformation_specs_1;
+extern asn_TYPE_member_t asn_MBR_TransportInformation_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _TransportInformation_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/TransportLayerAddress.h b/src/s1ap/asn1c/asnGenFiles/TransportLayerAddress.h
new file mode 100644
index 0000000..07a3a18
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/TransportLayerAddress.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_TransportLayerAddress_H_
+#define	_TransportLayerAddress_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* TransportLayerAddress */
+typedef BIT_STRING_t	 TransportLayerAddress_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_TransportLayerAddress_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_TransportLayerAddress;
+asn_struct_free_f TransportLayerAddress_free;
+asn_struct_print_f TransportLayerAddress_print;
+asn_constr_check_f TransportLayerAddress_constraint;
+ber_type_decoder_f TransportLayerAddress_decode_ber;
+der_type_encoder_f TransportLayerAddress_encode_der;
+xer_type_decoder_f TransportLayerAddress_decode_xer;
+xer_type_encoder_f TransportLayerAddress_encode_xer;
+oer_type_decoder_f TransportLayerAddress_decode_oer;
+oer_type_encoder_f TransportLayerAddress_encode_oer;
+per_type_decoder_f TransportLayerAddress_decode_uper;
+per_type_encoder_f TransportLayerAddress_encode_uper;
+per_type_decoder_f TransportLayerAddress_decode_aper;
+per_type_encoder_f TransportLayerAddress_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _TransportLayerAddress_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/TriggeringMessage.h b/src/s1ap/asn1c/asnGenFiles/TriggeringMessage.h
new file mode 100644
index 0000000..e12b9b8
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/TriggeringMessage.h
@@ -0,0 +1,54 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-CommonDataTypes"
+ * 	found in "./asn1c/S1AP-CommonDataTypes.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_TriggeringMessage_H_
+#define	_TriggeringMessage_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum TriggeringMessage {
+	TriggeringMessage_initiating_message	= 0,
+	TriggeringMessage_successful_outcome	= 1,
+	TriggeringMessage_unsuccessfull_outcome	= 2
+} e_TriggeringMessage;
+
+/* TriggeringMessage */
+typedef long	 TriggeringMessage_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_TriggeringMessage_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_TriggeringMessage;
+extern const asn_INTEGER_specifics_t asn_SPC_TriggeringMessage_specs_1;
+asn_struct_free_f TriggeringMessage_free;
+asn_struct_print_f TriggeringMessage_print;
+asn_constr_check_f TriggeringMessage_constraint;
+ber_type_decoder_f TriggeringMessage_decode_ber;
+der_type_encoder_f TriggeringMessage_encode_der;
+xer_type_decoder_f TriggeringMessage_decode_xer;
+xer_type_encoder_f TriggeringMessage_encode_xer;
+oer_type_decoder_f TriggeringMessage_decode_oer;
+oer_type_encoder_f TriggeringMessage_encode_oer;
+per_type_decoder_f TriggeringMessage_decode_uper;
+per_type_encoder_f TriggeringMessage_encode_uper;
+per_type_decoder_f TriggeringMessage_decode_aper;
+per_type_encoder_f TriggeringMessage_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _TriggeringMessage_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/TunnelInformation.h b/src/s1ap/asn1c/asnGenFiles/TunnelInformation.h
new file mode 100644
index 0000000..8a30551
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/TunnelInformation.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_TunnelInformation_H_
+#define	_TunnelInformation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "TransportLayerAddress.h"
+#include "Port-Number.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* TunnelInformation */
+typedef struct TunnelInformation {
+	TransportLayerAddress_t	 transportLayerAddress;
+	Port_Number_t	*uDP_Port_Number;	/* OPTIONAL */
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} TunnelInformation_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_TunnelInformation;
+extern asn_SEQUENCE_specifics_t asn_SPC_TunnelInformation_specs_1;
+extern asn_TYPE_member_t asn_MBR_TunnelInformation_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _TunnelInformation_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/TypeOfError.h b/src/s1ap/asn1c/asnGenFiles/TypeOfError.h
new file mode 100644
index 0000000..5da1c7b
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/TypeOfError.h
@@ -0,0 +1,56 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_TypeOfError_H_
+#define	_TypeOfError_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum TypeOfError {
+	TypeOfError_not_understood	= 0,
+	TypeOfError_missing	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_TypeOfError;
+
+/* TypeOfError */
+typedef long	 TypeOfError_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_TypeOfError_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_TypeOfError;
+extern const asn_INTEGER_specifics_t asn_SPC_TypeOfError_specs_1;
+asn_struct_free_f TypeOfError_free;
+asn_struct_print_f TypeOfError_print;
+asn_constr_check_f TypeOfError_constraint;
+ber_type_decoder_f TypeOfError_decode_ber;
+der_type_encoder_f TypeOfError_encode_der;
+xer_type_decoder_f TypeOfError_decode_xer;
+xer_type_encoder_f TypeOfError_encode_xer;
+oer_type_decoder_f TypeOfError_decode_oer;
+oer_type_encoder_f TypeOfError_encode_oer;
+per_type_decoder_f TypeOfError_decode_uper;
+per_type_encoder_f TypeOfError_encode_uper;
+per_type_decoder_f TypeOfError_decode_aper;
+per_type_encoder_f TypeOfError_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _TypeOfError_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UE-Application-Layer-Measurement-Capability.h b/src/s1ap/asn1c/asnGenFiles/UE-Application-Layer-Measurement-Capability.h
new file mode 100644
index 0000000..f4fe719
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UE-Application-Layer-Measurement-Capability.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UE_Application_Layer_Measurement_Capability_H_
+#define	_UE_Application_Layer_Measurement_Capability_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* UE-Application-Layer-Measurement-Capability */
+typedef BIT_STRING_t	 UE_Application_Layer_Measurement_Capability_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_UE_Application_Layer_Measurement_Capability_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_UE_Application_Layer_Measurement_Capability;
+asn_struct_free_f UE_Application_Layer_Measurement_Capability_free;
+asn_struct_print_f UE_Application_Layer_Measurement_Capability_print;
+asn_constr_check_f UE_Application_Layer_Measurement_Capability_constraint;
+ber_type_decoder_f UE_Application_Layer_Measurement_Capability_decode_ber;
+der_type_encoder_f UE_Application_Layer_Measurement_Capability_encode_der;
+xer_type_decoder_f UE_Application_Layer_Measurement_Capability_decode_xer;
+xer_type_encoder_f UE_Application_Layer_Measurement_Capability_encode_xer;
+oer_type_decoder_f UE_Application_Layer_Measurement_Capability_decode_oer;
+oer_type_encoder_f UE_Application_Layer_Measurement_Capability_encode_oer;
+per_type_decoder_f UE_Application_Layer_Measurement_Capability_decode_uper;
+per_type_encoder_f UE_Application_Layer_Measurement_Capability_encode_uper;
+per_type_decoder_f UE_Application_Layer_Measurement_Capability_decode_aper;
+per_type_encoder_f UE_Application_Layer_Measurement_Capability_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UE_Application_Layer_Measurement_Capability_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UE-HistoryInformation.h b/src/s1ap/asn1c/asnGenFiles/UE-HistoryInformation.h
new file mode 100644
index 0000000..ef8877d
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UE-HistoryInformation.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UE_HistoryInformation_H_
+#define	_UE_HistoryInformation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct LastVisitedCell_Item;
+
+/* UE-HistoryInformation */
+typedef struct UE_HistoryInformation {
+	A_SEQUENCE_OF(struct LastVisitedCell_Item) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UE_HistoryInformation_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_UE_HistoryInformation;
+extern asn_SET_OF_specifics_t asn_SPC_UE_HistoryInformation_specs_1;
+extern asn_TYPE_member_t asn_MBR_UE_HistoryInformation_1[1];
+extern asn_per_constraints_t asn_PER_type_UE_HistoryInformation_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UE_HistoryInformation_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UE-HistoryInformationFromTheUE.h b/src/s1ap/asn1c/asnGenFiles/UE-HistoryInformationFromTheUE.h
new file mode 100644
index 0000000..5b2700f
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UE-HistoryInformationFromTheUE.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UE_HistoryInformationFromTheUE_H_
+#define	_UE_HistoryInformationFromTheUE_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* UE-HistoryInformationFromTheUE */
+typedef OCTET_STRING_t	 UE_HistoryInformationFromTheUE_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_UE_HistoryInformationFromTheUE;
+asn_struct_free_f UE_HistoryInformationFromTheUE_free;
+asn_struct_print_f UE_HistoryInformationFromTheUE_print;
+asn_constr_check_f UE_HistoryInformationFromTheUE_constraint;
+ber_type_decoder_f UE_HistoryInformationFromTheUE_decode_ber;
+der_type_encoder_f UE_HistoryInformationFromTheUE_encode_der;
+xer_type_decoder_f UE_HistoryInformationFromTheUE_decode_xer;
+xer_type_encoder_f UE_HistoryInformationFromTheUE_encode_xer;
+oer_type_decoder_f UE_HistoryInformationFromTheUE_decode_oer;
+oer_type_encoder_f UE_HistoryInformationFromTheUE_encode_oer;
+per_type_decoder_f UE_HistoryInformationFromTheUE_decode_uper;
+per_type_encoder_f UE_HistoryInformationFromTheUE_encode_uper;
+per_type_decoder_f UE_HistoryInformationFromTheUE_decode_aper;
+per_type_encoder_f UE_HistoryInformationFromTheUE_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UE_HistoryInformationFromTheUE_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UE-RLF-Report-Container-for-extended-bands.h b/src/s1ap/asn1c/asnGenFiles/UE-RLF-Report-Container-for-extended-bands.h
new file mode 100644
index 0000000..45aeb54
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UE-RLF-Report-Container-for-extended-bands.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UE_RLF_Report_Container_for_extended_bands_H_
+#define	_UE_RLF_Report_Container_for_extended_bands_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* UE-RLF-Report-Container-for-extended-bands */
+typedef OCTET_STRING_t	 UE_RLF_Report_Container_for_extended_bands_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_UE_RLF_Report_Container_for_extended_bands;
+asn_struct_free_f UE_RLF_Report_Container_for_extended_bands_free;
+asn_struct_print_f UE_RLF_Report_Container_for_extended_bands_print;
+asn_constr_check_f UE_RLF_Report_Container_for_extended_bands_constraint;
+ber_type_decoder_f UE_RLF_Report_Container_for_extended_bands_decode_ber;
+der_type_encoder_f UE_RLF_Report_Container_for_extended_bands_encode_der;
+xer_type_decoder_f UE_RLF_Report_Container_for_extended_bands_decode_xer;
+xer_type_encoder_f UE_RLF_Report_Container_for_extended_bands_encode_xer;
+oer_type_decoder_f UE_RLF_Report_Container_for_extended_bands_decode_oer;
+oer_type_encoder_f UE_RLF_Report_Container_for_extended_bands_encode_oer;
+per_type_decoder_f UE_RLF_Report_Container_for_extended_bands_decode_uper;
+per_type_encoder_f UE_RLF_Report_Container_for_extended_bands_encode_uper;
+per_type_decoder_f UE_RLF_Report_Container_for_extended_bands_decode_aper;
+per_type_encoder_f UE_RLF_Report_Container_for_extended_bands_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UE_RLF_Report_Container_for_extended_bands_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UE-RLF-Report-Container.h b/src/s1ap/asn1c/asnGenFiles/UE-RLF-Report-Container.h
new file mode 100644
index 0000000..20b0ae4
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UE-RLF-Report-Container.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UE_RLF_Report_Container_H_
+#define	_UE_RLF_Report_Container_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* UE-RLF-Report-Container */
+typedef OCTET_STRING_t	 UE_RLF_Report_Container_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_UE_RLF_Report_Container;
+asn_struct_free_f UE_RLF_Report_Container_free;
+asn_struct_print_f UE_RLF_Report_Container_print;
+asn_constr_check_f UE_RLF_Report_Container_constraint;
+ber_type_decoder_f UE_RLF_Report_Container_decode_ber;
+der_type_encoder_f UE_RLF_Report_Container_encode_der;
+xer_type_decoder_f UE_RLF_Report_Container_decode_xer;
+xer_type_encoder_f UE_RLF_Report_Container_encode_xer;
+oer_type_decoder_f UE_RLF_Report_Container_decode_oer;
+oer_type_encoder_f UE_RLF_Report_Container_encode_oer;
+per_type_decoder_f UE_RLF_Report_Container_decode_uper;
+per_type_encoder_f UE_RLF_Report_Container_encode_uper;
+per_type_decoder_f UE_RLF_Report_Container_decode_aper;
+per_type_encoder_f UE_RLF_Report_Container_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UE_RLF_Report_Container_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UE-RetentionInformation.h b/src/s1ap/asn1c/asnGenFiles/UE-RetentionInformation.h
new file mode 100644
index 0000000..0ec9fb7
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UE-RetentionInformation.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UE_RetentionInformation_H_
+#define	_UE_RetentionInformation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum UE_RetentionInformation {
+	UE_RetentionInformation_ues_retained	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_UE_RetentionInformation;
+
+/* UE-RetentionInformation */
+typedef long	 UE_RetentionInformation_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_UE_RetentionInformation_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_UE_RetentionInformation;
+extern const asn_INTEGER_specifics_t asn_SPC_UE_RetentionInformation_specs_1;
+asn_struct_free_f UE_RetentionInformation_free;
+asn_struct_print_f UE_RetentionInformation_print;
+asn_constr_check_f UE_RetentionInformation_constraint;
+ber_type_decoder_f UE_RetentionInformation_decode_ber;
+der_type_encoder_f UE_RetentionInformation_encode_der;
+xer_type_decoder_f UE_RetentionInformation_decode_xer;
+xer_type_encoder_f UE_RetentionInformation_encode_xer;
+oer_type_decoder_f UE_RetentionInformation_decode_oer;
+oer_type_encoder_f UE_RetentionInformation_encode_oer;
+per_type_decoder_f UE_RetentionInformation_decode_uper;
+per_type_encoder_f UE_RetentionInformation_encode_uper;
+per_type_decoder_f UE_RetentionInformation_decode_aper;
+per_type_encoder_f UE_RetentionInformation_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UE_RetentionInformation_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UE-S1AP-ID-pair.h b/src/s1ap/asn1c/asnGenFiles/UE-S1AP-ID-pair.h
new file mode 100644
index 0000000..191d8ba
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UE-S1AP-ID-pair.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UE_S1AP_ID_pair_H_
+#define	_UE_S1AP_ID_pair_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "MME-UE-S1AP-ID.h"
+#include "ENB-UE-S1AP-ID.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* UE-S1AP-ID-pair */
+typedef struct UE_S1AP_ID_pair {
+	MME_UE_S1AP_ID_t	 mME_UE_S1AP_ID;
+	ENB_UE_S1AP_ID_t	 eNB_UE_S1AP_ID;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UE_S1AP_ID_pair_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_UE_S1AP_ID_pair;
+extern asn_SEQUENCE_specifics_t asn_SPC_UE_S1AP_ID_pair_specs_1;
+extern asn_TYPE_member_t asn_MBR_UE_S1AP_ID_pair_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UE_S1AP_ID_pair_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UE-S1AP-IDs.h b/src/s1ap/asn1c/asnGenFiles/UE-S1AP-IDs.h
new file mode 100644
index 0000000..adc68a8
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UE-S1AP-IDs.h
@@ -0,0 +1,61 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UE_S1AP_IDs_H_
+#define	_UE_S1AP_IDs_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "MME-UE-S1AP-ID.h"
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum UE_S1AP_IDs_PR {
+	UE_S1AP_IDs_PR_NOTHING,	/* No components present */
+	UE_S1AP_IDs_PR_uE_S1AP_ID_pair,
+	UE_S1AP_IDs_PR_mME_UE_S1AP_ID
+	/* Extensions may appear below */
+	
+} UE_S1AP_IDs_PR;
+
+/* Forward declarations */
+struct UE_S1AP_ID_pair;
+
+/* UE-S1AP-IDs */
+typedef struct UE_S1AP_IDs {
+	UE_S1AP_IDs_PR present;
+	union UE_S1AP_IDs_u {
+		struct UE_S1AP_ID_pair	*uE_S1AP_ID_pair;
+		MME_UE_S1AP_ID_t	 mME_UE_S1AP_ID;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UE_S1AP_IDs_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_UE_S1AP_IDs;
+extern asn_CHOICE_specifics_t asn_SPC_UE_S1AP_IDs_specs_1;
+extern asn_TYPE_member_t asn_MBR_UE_S1AP_IDs_1[2];
+extern asn_per_constraints_t asn_PER_type_UE_S1AP_IDs_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UE_S1AP_IDs_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UE-Usage-Type.h b/src/s1ap/asn1c/asnGenFiles/UE-Usage-Type.h
new file mode 100644
index 0000000..562d435
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UE-Usage-Type.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UE_Usage_Type_H_
+#define	_UE_Usage_Type_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* UE-Usage-Type */
+typedef long	 UE_Usage_Type_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_UE_Usage_Type_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_UE_Usage_Type;
+asn_struct_free_f UE_Usage_Type_free;
+asn_struct_print_f UE_Usage_Type_print;
+asn_constr_check_f UE_Usage_Type_constraint;
+ber_type_decoder_f UE_Usage_Type_decode_ber;
+der_type_encoder_f UE_Usage_Type_encode_der;
+xer_type_decoder_f UE_Usage_Type_decode_xer;
+xer_type_encoder_f UE_Usage_Type_encode_xer;
+oer_type_decoder_f UE_Usage_Type_decode_oer;
+oer_type_encoder_f UE_Usage_Type_encode_oer;
+per_type_decoder_f UE_Usage_Type_decode_uper;
+per_type_encoder_f UE_Usage_Type_encode_uper;
+per_type_decoder_f UE_Usage_Type_decode_aper;
+per_type_encoder_f UE_Usage_Type_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UE_Usage_Type_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UE-associatedLogicalS1-ConnectionItem.h b/src/s1ap/asn1c/asnGenFiles/UE-associatedLogicalS1-ConnectionItem.h
new file mode 100644
index 0000000..1676c62
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UE-associatedLogicalS1-ConnectionItem.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UE_associatedLogicalS1_ConnectionItem_H_
+#define	_UE_associatedLogicalS1_ConnectionItem_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "MME-UE-S1AP-ID.h"
+#include "ENB-UE-S1AP-ID.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* UE-associatedLogicalS1-ConnectionItem */
+typedef struct UE_associatedLogicalS1_ConnectionItem {
+	MME_UE_S1AP_ID_t	*mME_UE_S1AP_ID;	/* OPTIONAL */
+	ENB_UE_S1AP_ID_t	*eNB_UE_S1AP_ID;	/* OPTIONAL */
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UE_associatedLogicalS1_ConnectionItem_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_UE_associatedLogicalS1_ConnectionItem;
+extern asn_SEQUENCE_specifics_t asn_SPC_UE_associatedLogicalS1_ConnectionItem_specs_1;
+extern asn_TYPE_member_t asn_MBR_UE_associatedLogicalS1_ConnectionItem_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UE_associatedLogicalS1_ConnectionItem_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UE-associatedLogicalS1-ConnectionListRes.h b/src/s1ap/asn1c/asnGenFiles/UE-associatedLogicalS1-ConnectionListRes.h
new file mode 100644
index 0000000..9fdb818
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UE-associatedLogicalS1-ConnectionListRes.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UE_associatedLogicalS1_ConnectionListRes_H_
+#define	_UE_associatedLogicalS1_ConnectionListRes_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolIE_SingleContainer;
+
+/* UE-associatedLogicalS1-ConnectionListRes */
+typedef struct UE_associatedLogicalS1_ConnectionListRes {
+	A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UE_associatedLogicalS1_ConnectionListRes_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_UE_associatedLogicalS1_ConnectionListRes;
+extern asn_SET_OF_specifics_t asn_SPC_UE_associatedLogicalS1_ConnectionListRes_specs_1;
+extern asn_TYPE_member_t asn_MBR_UE_associatedLogicalS1_ConnectionListRes_1[1];
+extern asn_per_constraints_t asn_PER_type_UE_associatedLogicalS1_ConnectionListRes_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UE_associatedLogicalS1_ConnectionListRes_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UE-associatedLogicalS1-ConnectionListResAck.h b/src/s1ap/asn1c/asnGenFiles/UE-associatedLogicalS1-ConnectionListResAck.h
new file mode 100644
index 0000000..ddeb17b
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UE-associatedLogicalS1-ConnectionListResAck.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UE_associatedLogicalS1_ConnectionListResAck_H_
+#define	_UE_associatedLogicalS1_ConnectionListResAck_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolIE_SingleContainer;
+
+/* UE-associatedLogicalS1-ConnectionListResAck */
+typedef struct UE_associatedLogicalS1_ConnectionListResAck {
+	A_SEQUENCE_OF(struct ProtocolIE_SingleContainer) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UE_associatedLogicalS1_ConnectionListResAck_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_UE_associatedLogicalS1_ConnectionListResAck;
+extern asn_SET_OF_specifics_t asn_SPC_UE_associatedLogicalS1_ConnectionListResAck_specs_1;
+extern asn_TYPE_member_t asn_MBR_UE_associatedLogicalS1_ConnectionListResAck_1[1];
+extern asn_per_constraints_t asn_PER_type_UE_associatedLogicalS1_ConnectionListResAck_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UE_associatedLogicalS1_ConnectionListResAck_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UEAggregateMaximumBitrate.h b/src/s1ap/asn1c/asnGenFiles/UEAggregateMaximumBitrate.h
new file mode 100644
index 0000000..694992c
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UEAggregateMaximumBitrate.h
@@ -0,0 +1,49 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UEAggregateMaximumBitrate_H_
+#define	_UEAggregateMaximumBitrate_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "BitRate.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* UEAggregateMaximumBitrate */
+typedef struct UEAggregateMaximumBitrate {
+	BitRate_t	 uEaggregateMaximumBitRateDL;
+	BitRate_t	 uEaggregateMaximumBitRateUL;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UEAggregateMaximumBitrate_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_UEAggregateMaximumBitrate;
+extern asn_SEQUENCE_specifics_t asn_SPC_UEAggregateMaximumBitrate_specs_1;
+extern asn_TYPE_member_t asn_MBR_UEAggregateMaximumBitrate_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UEAggregateMaximumBitrate_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UEAppLayerMeasConfig.h b/src/s1ap/asn1c/asnGenFiles/UEAppLayerMeasConfig.h
new file mode 100644
index 0000000..29fbc16
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UEAppLayerMeasConfig.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UEAppLayerMeasConfig_H_
+#define	_UEAppLayerMeasConfig_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+#include "AreaScopeOfQMC.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* UEAppLayerMeasConfig */
+typedef struct UEAppLayerMeasConfig {
+	OCTET_STRING_t	 containerForAppLayerMeasConfig;
+	AreaScopeOfQMC_t	 areaScopeOfQMC;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UEAppLayerMeasConfig_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_UEAppLayerMeasConfig;
+extern asn_SEQUENCE_specifics_t asn_SPC_UEAppLayerMeasConfig_specs_1;
+extern asn_TYPE_member_t asn_MBR_UEAppLayerMeasConfig_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UEAppLayerMeasConfig_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UECapabilityInfoIndication.h b/src/s1ap/asn1c/asnGenFiles/UECapabilityInfoIndication.h
new file mode 100644
index 0000000..e85c76e
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UECapabilityInfoIndication.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UECapabilityInfoIndication_H_
+#define	_UECapabilityInfoIndication_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* UECapabilityInfoIndication */
+typedef struct UECapabilityInfoIndication {
+	ProtocolIE_Container_129P51_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UECapabilityInfoIndication_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_UECapabilityInfoIndication;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UECapabilityInfoIndication_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UECapabilityInfoRequest.h b/src/s1ap/asn1c/asnGenFiles/UECapabilityInfoRequest.h
new file mode 100644
index 0000000..beccd22
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UECapabilityInfoRequest.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UECapabilityInfoRequest_H_
+#define	_UECapabilityInfoRequest_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum UECapabilityInfoRequest {
+	UECapabilityInfoRequest_requested	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_UECapabilityInfoRequest;
+
+/* UECapabilityInfoRequest */
+typedef long	 UECapabilityInfoRequest_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_UECapabilityInfoRequest_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_UECapabilityInfoRequest;
+extern const asn_INTEGER_specifics_t asn_SPC_UECapabilityInfoRequest_specs_1;
+asn_struct_free_f UECapabilityInfoRequest_free;
+asn_struct_print_f UECapabilityInfoRequest_print;
+asn_constr_check_f UECapabilityInfoRequest_constraint;
+ber_type_decoder_f UECapabilityInfoRequest_decode_ber;
+der_type_encoder_f UECapabilityInfoRequest_encode_der;
+xer_type_decoder_f UECapabilityInfoRequest_decode_xer;
+xer_type_encoder_f UECapabilityInfoRequest_encode_xer;
+oer_type_decoder_f UECapabilityInfoRequest_decode_oer;
+oer_type_encoder_f UECapabilityInfoRequest_encode_oer;
+per_type_decoder_f UECapabilityInfoRequest_decode_uper;
+per_type_encoder_f UECapabilityInfoRequest_encode_uper;
+per_type_decoder_f UECapabilityInfoRequest_decode_aper;
+per_type_encoder_f UECapabilityInfoRequest_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UECapabilityInfoRequest_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UEContextModificationConfirm.h b/src/s1ap/asn1c/asnGenFiles/UEContextModificationConfirm.h
new file mode 100644
index 0000000..4b4b5e3
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UEContextModificationConfirm.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UEContextModificationConfirm_H_
+#define	_UEContextModificationConfirm_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* UEContextModificationConfirm */
+typedef struct UEContextModificationConfirm {
+	ProtocolIE_Container_129P80_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UEContextModificationConfirm_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_UEContextModificationConfirm;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UEContextModificationConfirm_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UEContextModificationFailure.h b/src/s1ap/asn1c/asnGenFiles/UEContextModificationFailure.h
new file mode 100644
index 0000000..d42373e
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UEContextModificationFailure.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UEContextModificationFailure_H_
+#define	_UEContextModificationFailure_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* UEContextModificationFailure */
+typedef struct UEContextModificationFailure {
+	ProtocolIE_Container_129P28_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UEContextModificationFailure_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_UEContextModificationFailure;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UEContextModificationFailure_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UEContextModificationIndication.h b/src/s1ap/asn1c/asnGenFiles/UEContextModificationIndication.h
new file mode 100644
index 0000000..0f5e115
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UEContextModificationIndication.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UEContextModificationIndication_H_
+#define	_UEContextModificationIndication_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* UEContextModificationIndication */
+typedef struct UEContextModificationIndication {
+	ProtocolIE_Container_129P79_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UEContextModificationIndication_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_UEContextModificationIndication;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UEContextModificationIndication_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UEContextModificationRequest.h b/src/s1ap/asn1c/asnGenFiles/UEContextModificationRequest.h
new file mode 100644
index 0000000..368d0b3
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UEContextModificationRequest.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UEContextModificationRequest_H_
+#define	_UEContextModificationRequest_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* UEContextModificationRequest */
+typedef struct UEContextModificationRequest {
+	ProtocolIE_Container_129P26_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UEContextModificationRequest_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_UEContextModificationRequest;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UEContextModificationRequest_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UEContextModificationResponse.h b/src/s1ap/asn1c/asnGenFiles/UEContextModificationResponse.h
new file mode 100644
index 0000000..59fd258
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UEContextModificationResponse.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UEContextModificationResponse_H_
+#define	_UEContextModificationResponse_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* UEContextModificationResponse */
+typedef struct UEContextModificationResponse {
+	ProtocolIE_Container_129P27_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UEContextModificationResponse_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_UEContextModificationResponse;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UEContextModificationResponse_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UEContextReleaseCommand.h b/src/s1ap/asn1c/asnGenFiles/UEContextReleaseCommand.h
new file mode 100644
index 0000000..251adc8
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UEContextReleaseCommand.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UEContextReleaseCommand_H_
+#define	_UEContextReleaseCommand_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* UEContextReleaseCommand */
+typedef struct UEContextReleaseCommand {
+	ProtocolIE_Container_129P24_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UEContextReleaseCommand_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_UEContextReleaseCommand;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UEContextReleaseCommand_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UEContextReleaseComplete.h b/src/s1ap/asn1c/asnGenFiles/UEContextReleaseComplete.h
new file mode 100644
index 0000000..6ec706c
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UEContextReleaseComplete.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UEContextReleaseComplete_H_
+#define	_UEContextReleaseComplete_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* UEContextReleaseComplete */
+typedef struct UEContextReleaseComplete {
+	ProtocolIE_Container_129P25_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UEContextReleaseComplete_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_UEContextReleaseComplete;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UEContextReleaseComplete_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UEContextReleaseRequest.h b/src/s1ap/asn1c/asnGenFiles/UEContextReleaseRequest.h
new file mode 100644
index 0000000..39bc1a8
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UEContextReleaseRequest.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UEContextReleaseRequest_H_
+#define	_UEContextReleaseRequest_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* UEContextReleaseRequest */
+typedef struct UEContextReleaseRequest {
+	ProtocolIE_Container_129P23_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UEContextReleaseRequest_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_UEContextReleaseRequest;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UEContextReleaseRequest_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UEContextResumeFailure.h b/src/s1ap/asn1c/asnGenFiles/UEContextResumeFailure.h
new file mode 100644
index 0000000..cade135
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UEContextResumeFailure.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UEContextResumeFailure_H_
+#define	_UEContextResumeFailure_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* UEContextResumeFailure */
+typedef struct UEContextResumeFailure {
+	ProtocolIE_Container_129P85_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UEContextResumeFailure_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_UEContextResumeFailure;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UEContextResumeFailure_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UEContextResumeRequest.h b/src/s1ap/asn1c/asnGenFiles/UEContextResumeRequest.h
new file mode 100644
index 0000000..1f50596
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UEContextResumeRequest.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UEContextResumeRequest_H_
+#define	_UEContextResumeRequest_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* UEContextResumeRequest */
+typedef struct UEContextResumeRequest {
+	ProtocolIE_Container_129P83_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UEContextResumeRequest_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_UEContextResumeRequest;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UEContextResumeRequest_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UEContextResumeResponse.h b/src/s1ap/asn1c/asnGenFiles/UEContextResumeResponse.h
new file mode 100644
index 0000000..000d1c2
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UEContextResumeResponse.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UEContextResumeResponse_H_
+#define	_UEContextResumeResponse_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* UEContextResumeResponse */
+typedef struct UEContextResumeResponse {
+	ProtocolIE_Container_129P84_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UEContextResumeResponse_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_UEContextResumeResponse;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UEContextResumeResponse_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UEContextSuspendRequest.h b/src/s1ap/asn1c/asnGenFiles/UEContextSuspendRequest.h
new file mode 100644
index 0000000..f6bd7ad
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UEContextSuspendRequest.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UEContextSuspendRequest_H_
+#define	_UEContextSuspendRequest_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* UEContextSuspendRequest */
+typedef struct UEContextSuspendRequest {
+	ProtocolIE_Container_129P81_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UEContextSuspendRequest_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_UEContextSuspendRequest;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UEContextSuspendRequest_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UEContextSuspendResponse.h b/src/s1ap/asn1c/asnGenFiles/UEContextSuspendResponse.h
new file mode 100644
index 0000000..cb12344
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UEContextSuspendResponse.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UEContextSuspendResponse_H_
+#define	_UEContextSuspendResponse_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* UEContextSuspendResponse */
+typedef struct UEContextSuspendResponse {
+	ProtocolIE_Container_129P82_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UEContextSuspendResponse_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_UEContextSuspendResponse;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UEContextSuspendResponse_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UEIdentityIndexValue.h b/src/s1ap/asn1c/asnGenFiles/UEIdentityIndexValue.h
new file mode 100644
index 0000000..a38565f
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UEIdentityIndexValue.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UEIdentityIndexValue_H_
+#define	_UEIdentityIndexValue_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* UEIdentityIndexValue */
+typedef BIT_STRING_t	 UEIdentityIndexValue_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_UEIdentityIndexValue_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_UEIdentityIndexValue;
+asn_struct_free_f UEIdentityIndexValue_free;
+asn_struct_print_f UEIdentityIndexValue_print;
+asn_constr_check_f UEIdentityIndexValue_constraint;
+ber_type_decoder_f UEIdentityIndexValue_decode_ber;
+der_type_encoder_f UEIdentityIndexValue_encode_der;
+xer_type_decoder_f UEIdentityIndexValue_decode_xer;
+xer_type_encoder_f UEIdentityIndexValue_encode_xer;
+oer_type_decoder_f UEIdentityIndexValue_decode_oer;
+oer_type_encoder_f UEIdentityIndexValue_encode_oer;
+per_type_decoder_f UEIdentityIndexValue_decode_uper;
+per_type_encoder_f UEIdentityIndexValue_encode_uper;
+per_type_decoder_f UEIdentityIndexValue_decode_aper;
+per_type_encoder_f UEIdentityIndexValue_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UEIdentityIndexValue_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UEInformationTransfer.h b/src/s1ap/asn1c/asnGenFiles/UEInformationTransfer.h
new file mode 100644
index 0000000..4850cc4
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UEInformationTransfer.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UEInformationTransfer_H_
+#define	_UEInformationTransfer_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* UEInformationTransfer */
+typedef struct UEInformationTransfer {
+	ProtocolIE_Container_129P88_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UEInformationTransfer_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_UEInformationTransfer;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UEInformationTransfer_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UEPagingID.h b/src/s1ap/asn1c/asnGenFiles/UEPagingID.h
new file mode 100644
index 0000000..59d40a4
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UEPagingID.h
@@ -0,0 +1,61 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UEPagingID_H_
+#define	_UEPagingID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "IMSI.h"
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum UEPagingID_PR {
+	UEPagingID_PR_NOTHING,	/* No components present */
+	UEPagingID_PR_s_TMSI,
+	UEPagingID_PR_iMSI
+	/* Extensions may appear below */
+	
+} UEPagingID_PR;
+
+/* Forward declarations */
+struct S_TMSI;
+
+/* UEPagingID */
+typedef struct UEPagingID {
+	UEPagingID_PR present;
+	union UEPagingID_u {
+		struct S_TMSI	*s_TMSI;
+		IMSI_t	 iMSI;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UEPagingID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_UEPagingID;
+extern asn_CHOICE_specifics_t asn_SPC_UEPagingID_specs_1;
+extern asn_TYPE_member_t asn_MBR_UEPagingID_1[2];
+extern asn_per_constraints_t asn_PER_type_UEPagingID_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UEPagingID_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UERadioCapability.h b/src/s1ap/asn1c/asnGenFiles/UERadioCapability.h
new file mode 100644
index 0000000..92a8c4e
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UERadioCapability.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UERadioCapability_H_
+#define	_UERadioCapability_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* UERadioCapability */
+typedef OCTET_STRING_t	 UERadioCapability_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_UERadioCapability;
+asn_struct_free_f UERadioCapability_free;
+asn_struct_print_f UERadioCapability_print;
+asn_constr_check_f UERadioCapability_constraint;
+ber_type_decoder_f UERadioCapability_decode_ber;
+der_type_encoder_f UERadioCapability_encode_der;
+xer_type_decoder_f UERadioCapability_decode_xer;
+xer_type_encoder_f UERadioCapability_encode_xer;
+oer_type_decoder_f UERadioCapability_decode_oer;
+oer_type_encoder_f UERadioCapability_encode_oer;
+per_type_decoder_f UERadioCapability_decode_uper;
+per_type_encoder_f UERadioCapability_encode_uper;
+per_type_decoder_f UERadioCapability_decode_aper;
+per_type_encoder_f UERadioCapability_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UERadioCapability_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UERadioCapabilityForPaging.h b/src/s1ap/asn1c/asnGenFiles/UERadioCapabilityForPaging.h
new file mode 100644
index 0000000..22668d8
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UERadioCapabilityForPaging.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UERadioCapabilityForPaging_H_
+#define	_UERadioCapabilityForPaging_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* UERadioCapabilityForPaging */
+typedef OCTET_STRING_t	 UERadioCapabilityForPaging_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_UERadioCapabilityForPaging;
+asn_struct_free_f UERadioCapabilityForPaging_free;
+asn_struct_print_f UERadioCapabilityForPaging_print;
+asn_constr_check_f UERadioCapabilityForPaging_constraint;
+ber_type_decoder_f UERadioCapabilityForPaging_decode_ber;
+der_type_encoder_f UERadioCapabilityForPaging_encode_der;
+xer_type_decoder_f UERadioCapabilityForPaging_decode_xer;
+xer_type_encoder_f UERadioCapabilityForPaging_encode_xer;
+oer_type_decoder_f UERadioCapabilityForPaging_decode_oer;
+oer_type_encoder_f UERadioCapabilityForPaging_encode_oer;
+per_type_decoder_f UERadioCapabilityForPaging_decode_uper;
+per_type_encoder_f UERadioCapabilityForPaging_encode_uper;
+per_type_decoder_f UERadioCapabilityForPaging_decode_aper;
+per_type_encoder_f UERadioCapabilityForPaging_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UERadioCapabilityForPaging_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UERadioCapabilityMatchRequest.h b/src/s1ap/asn1c/asnGenFiles/UERadioCapabilityMatchRequest.h
new file mode 100644
index 0000000..47f7af3
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UERadioCapabilityMatchRequest.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UERadioCapabilityMatchRequest_H_
+#define	_UERadioCapabilityMatchRequest_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* UERadioCapabilityMatchRequest */
+typedef struct UERadioCapabilityMatchRequest {
+	ProtocolIE_Container_129P29_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UERadioCapabilityMatchRequest_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_UERadioCapabilityMatchRequest;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UERadioCapabilityMatchRequest_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UERadioCapabilityMatchResponse.h b/src/s1ap/asn1c/asnGenFiles/UERadioCapabilityMatchResponse.h
new file mode 100644
index 0000000..a902253
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UERadioCapabilityMatchResponse.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UERadioCapabilityMatchResponse_H_
+#define	_UERadioCapabilityMatchResponse_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* UERadioCapabilityMatchResponse */
+typedef struct UERadioCapabilityMatchResponse {
+	ProtocolIE_Container_129P30_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UERadioCapabilityMatchResponse_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_UERadioCapabilityMatchResponse;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UERadioCapabilityMatchResponse_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UESecurityCapabilities.h b/src/s1ap/asn1c/asnGenFiles/UESecurityCapabilities.h
new file mode 100644
index 0000000..94b7465
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UESecurityCapabilities.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UESecurityCapabilities_H_
+#define	_UESecurityCapabilities_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "EncryptionAlgorithms.h"
+#include "IntegrityProtectionAlgorithms.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* UESecurityCapabilities */
+typedef struct UESecurityCapabilities {
+	EncryptionAlgorithms_t	 encryptionAlgorithms;
+	IntegrityProtectionAlgorithms_t	 integrityProtectionAlgorithms;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UESecurityCapabilities_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_UESecurityCapabilities;
+extern asn_SEQUENCE_specifics_t asn_SPC_UESecurityCapabilities_specs_1;
+extern asn_TYPE_member_t asn_MBR_UESecurityCapabilities_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UESecurityCapabilities_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UESidelinkAggregateMaximumBitrate.h b/src/s1ap/asn1c/asnGenFiles/UESidelinkAggregateMaximumBitrate.h
new file mode 100644
index 0000000..07121d3
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UESidelinkAggregateMaximumBitrate.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UESidelinkAggregateMaximumBitrate_H_
+#define	_UESidelinkAggregateMaximumBitrate_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "BitRate.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* UESidelinkAggregateMaximumBitrate */
+typedef struct UESidelinkAggregateMaximumBitrate {
+	BitRate_t	 uESidelinkAggregateMaximumBitRate;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UESidelinkAggregateMaximumBitrate_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_UESidelinkAggregateMaximumBitrate;
+extern asn_SEQUENCE_specifics_t asn_SPC_UESidelinkAggregateMaximumBitrate_specs_1;
+extern asn_TYPE_member_t asn_MBR_UESidelinkAggregateMaximumBitrate_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UESidelinkAggregateMaximumBitrate_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UEUserPlaneCIoTSupportIndicator.h b/src/s1ap/asn1c/asnGenFiles/UEUserPlaneCIoTSupportIndicator.h
new file mode 100644
index 0000000..d088554
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UEUserPlaneCIoTSupportIndicator.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UEUserPlaneCIoTSupportIndicator_H_
+#define	_UEUserPlaneCIoTSupportIndicator_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum UEUserPlaneCIoTSupportIndicator {
+	UEUserPlaneCIoTSupportIndicator_supported	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_UEUserPlaneCIoTSupportIndicator;
+
+/* UEUserPlaneCIoTSupportIndicator */
+typedef long	 UEUserPlaneCIoTSupportIndicator_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_UEUserPlaneCIoTSupportIndicator_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_UEUserPlaneCIoTSupportIndicator;
+extern const asn_INTEGER_specifics_t asn_SPC_UEUserPlaneCIoTSupportIndicator_specs_1;
+asn_struct_free_f UEUserPlaneCIoTSupportIndicator_free;
+asn_struct_print_f UEUserPlaneCIoTSupportIndicator_print;
+asn_constr_check_f UEUserPlaneCIoTSupportIndicator_constraint;
+ber_type_decoder_f UEUserPlaneCIoTSupportIndicator_decode_ber;
+der_type_encoder_f UEUserPlaneCIoTSupportIndicator_encode_der;
+xer_type_decoder_f UEUserPlaneCIoTSupportIndicator_decode_xer;
+xer_type_encoder_f UEUserPlaneCIoTSupportIndicator_encode_xer;
+oer_type_decoder_f UEUserPlaneCIoTSupportIndicator_decode_oer;
+oer_type_encoder_f UEUserPlaneCIoTSupportIndicator_encode_oer;
+per_type_decoder_f UEUserPlaneCIoTSupportIndicator_decode_uper;
+per_type_encoder_f UEUserPlaneCIoTSupportIndicator_encode_uper;
+per_type_decoder_f UEUserPlaneCIoTSupportIndicator_decode_aper;
+per_type_encoder_f UEUserPlaneCIoTSupportIndicator_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UEUserPlaneCIoTSupportIndicator_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UL-CP-SecurityInformation.h b/src/s1ap/asn1c/asnGenFiles/UL-CP-SecurityInformation.h
new file mode 100644
index 0000000..83e6ca5
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UL-CP-SecurityInformation.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UL_CP_SecurityInformation_H_
+#define	_UL_CP_SecurityInformation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "UL-NAS-MAC.h"
+#include "UL-NAS-Count.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* UL-CP-SecurityInformation */
+typedef struct UL_CP_SecurityInformation {
+	UL_NAS_MAC_t	 ul_NAS_MAC;
+	UL_NAS_Count_t	 ul_NAS_Count;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UL_CP_SecurityInformation_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_UL_CP_SecurityInformation;
+extern asn_SEQUENCE_specifics_t asn_SPC_UL_CP_SecurityInformation_specs_1;
+extern asn_TYPE_member_t asn_MBR_UL_CP_SecurityInformation_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UL_CP_SecurityInformation_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UL-NAS-Count.h b/src/s1ap/asn1c/asnGenFiles/UL-NAS-Count.h
new file mode 100644
index 0000000..34af7ab
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UL-NAS-Count.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UL_NAS_Count_H_
+#define	_UL_NAS_Count_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* UL-NAS-Count */
+typedef BIT_STRING_t	 UL_NAS_Count_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_UL_NAS_Count_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_UL_NAS_Count;
+asn_struct_free_f UL_NAS_Count_free;
+asn_struct_print_f UL_NAS_Count_print;
+asn_constr_check_f UL_NAS_Count_constraint;
+ber_type_decoder_f UL_NAS_Count_decode_ber;
+der_type_encoder_f UL_NAS_Count_encode_der;
+xer_type_decoder_f UL_NAS_Count_decode_xer;
+xer_type_encoder_f UL_NAS_Count_encode_xer;
+oer_type_decoder_f UL_NAS_Count_decode_oer;
+oer_type_encoder_f UL_NAS_Count_encode_oer;
+per_type_decoder_f UL_NAS_Count_decode_uper;
+per_type_encoder_f UL_NAS_Count_encode_uper;
+per_type_decoder_f UL_NAS_Count_decode_aper;
+per_type_encoder_f UL_NAS_Count_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UL_NAS_Count_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UL-NAS-MAC.h b/src/s1ap/asn1c/asnGenFiles/UL-NAS-MAC.h
new file mode 100644
index 0000000..80b61c3
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UL-NAS-MAC.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UL_NAS_MAC_H_
+#define	_UL_NAS_MAC_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* UL-NAS-MAC */
+typedef BIT_STRING_t	 UL_NAS_MAC_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_UL_NAS_MAC_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_UL_NAS_MAC;
+asn_struct_free_f UL_NAS_MAC_free;
+asn_struct_print_f UL_NAS_MAC_print;
+asn_constr_check_f UL_NAS_MAC_constraint;
+ber_type_decoder_f UL_NAS_MAC_decode_ber;
+der_type_encoder_f UL_NAS_MAC_encode_der;
+xer_type_decoder_f UL_NAS_MAC_decode_xer;
+xer_type_encoder_f UL_NAS_MAC_encode_xer;
+oer_type_decoder_f UL_NAS_MAC_decode_oer;
+oer_type_encoder_f UL_NAS_MAC_encode_oer;
+per_type_decoder_f UL_NAS_MAC_decode_uper;
+per_type_encoder_f UL_NAS_MAC_encode_uper;
+per_type_decoder_f UL_NAS_MAC_decode_aper;
+per_type_encoder_f UL_NAS_MAC_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UL_NAS_MAC_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UnlicensedSpectrumRestriction.h b/src/s1ap/asn1c/asnGenFiles/UnlicensedSpectrumRestriction.h
new file mode 100644
index 0000000..d1b593c
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UnlicensedSpectrumRestriction.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UnlicensedSpectrumRestriction_H_
+#define	_UnlicensedSpectrumRestriction_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum UnlicensedSpectrumRestriction {
+	UnlicensedSpectrumRestriction_unlicensed_restricted	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_UnlicensedSpectrumRestriction;
+
+/* UnlicensedSpectrumRestriction */
+typedef long	 UnlicensedSpectrumRestriction_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_UnlicensedSpectrumRestriction_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_UnlicensedSpectrumRestriction;
+extern const asn_INTEGER_specifics_t asn_SPC_UnlicensedSpectrumRestriction_specs_1;
+asn_struct_free_f UnlicensedSpectrumRestriction_free;
+asn_struct_print_f UnlicensedSpectrumRestriction_print;
+asn_constr_check_f UnlicensedSpectrumRestriction_constraint;
+ber_type_decoder_f UnlicensedSpectrumRestriction_decode_ber;
+der_type_encoder_f UnlicensedSpectrumRestriction_encode_der;
+xer_type_decoder_f UnlicensedSpectrumRestriction_decode_xer;
+xer_type_encoder_f UnlicensedSpectrumRestriction_encode_xer;
+oer_type_decoder_f UnlicensedSpectrumRestriction_decode_oer;
+oer_type_encoder_f UnlicensedSpectrumRestriction_encode_oer;
+per_type_decoder_f UnlicensedSpectrumRestriction_decode_uper;
+per_type_encoder_f UnlicensedSpectrumRestriction_encode_uper;
+per_type_decoder_f UnlicensedSpectrumRestriction_decode_aper;
+per_type_encoder_f UnlicensedSpectrumRestriction_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UnlicensedSpectrumRestriction_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UnsuccessfulOutcome.h b/src/s1ap/asn1c/asnGenFiles/UnsuccessfulOutcome.h
new file mode 100644
index 0000000..374f723
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UnsuccessfulOutcome.h
@@ -0,0 +1,170 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Descriptions"
+ * 	found in "./asn1c/S1AP-PDU-Descriptions.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UnsuccessfulOutcome_H_
+#define	_UnsuccessfulOutcome_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProcedureCode.h"
+#include "Criticality.h"
+#include <ANY.h>
+#include <asn_ioc.h>
+#include "HandoverRequired.h"
+#include "HandoverCommand.h"
+#include "HandoverPreparationFailure.h"
+#include "HandoverRequest.h"
+#include "HandoverRequestAcknowledge.h"
+#include "HandoverFailure.h"
+#include "PathSwitchRequest.h"
+#include "PathSwitchRequestAcknowledge.h"
+#include "PathSwitchRequestFailure.h"
+#include "E-RABSetupRequest.h"
+#include "E-RABSetupResponse.h"
+#include "E-RABModifyRequest.h"
+#include "E-RABModifyResponse.h"
+#include "E-RABReleaseCommand.h"
+#include "E-RABReleaseResponse.h"
+#include "InitialContextSetupRequest.h"
+#include "InitialContextSetupResponse.h"
+#include "InitialContextSetupFailure.h"
+#include "HandoverCancel.h"
+#include "HandoverCancelAcknowledge.h"
+#include "KillRequest.h"
+#include "KillResponse.h"
+#include "Reset.h"
+#include "ResetAcknowledge.h"
+#include "S1SetupRequest.h"
+#include "S1SetupResponse.h"
+#include "S1SetupFailure.h"
+#include "UEContextModificationRequest.h"
+#include "UEContextModificationResponse.h"
+#include "UEContextModificationFailure.h"
+#include "UEContextReleaseCommand.h"
+#include "UEContextReleaseComplete.h"
+#include "ENBConfigurationUpdate.h"
+#include "ENBConfigurationUpdateAcknowledge.h"
+#include "ENBConfigurationUpdateFailure.h"
+#include "MMEConfigurationUpdate.h"
+#include "MMEConfigurationUpdateAcknowledge.h"
+#include "MMEConfigurationUpdateFailure.h"
+#include "WriteReplaceWarningRequest.h"
+#include "WriteReplaceWarningResponse.h"
+#include "UERadioCapabilityMatchRequest.h"
+#include "UERadioCapabilityMatchResponse.h"
+#include "E-RABModificationIndication.h"
+#include "E-RABModificationConfirm.h"
+#include "UEContextModificationIndication.h"
+#include "UEContextModificationConfirm.h"
+#include "UEContextSuspendRequest.h"
+#include "UEContextSuspendResponse.h"
+#include "UEContextResumeRequest.h"
+#include "UEContextResumeResponse.h"
+#include "UEContextResumeFailure.h"
+#include "HandoverNotify.h"
+#include "E-RABReleaseIndication.h"
+#include "Paging.h"
+#include "DownlinkNASTransport.h"
+#include "InitialUEMessage.h"
+#include "UplinkNASTransport.h"
+#include "ErrorIndication.h"
+#include "NASNonDeliveryIndication.h"
+#include "UEContextReleaseRequest.h"
+#include "DownlinkS1cdma2000tunnelling.h"
+#include "UplinkS1cdma2000tunnelling.h"
+#include "UECapabilityInfoIndication.h"
+#include "ENBStatusTransfer.h"
+#include "MMEStatusTransfer.h"
+#include "DeactivateTrace.h"
+#include "TraceStart.h"
+#include "TraceFailureIndication.h"
+#include "CellTrafficTrace.h"
+#include "LocationReportingControl.h"
+#include "LocationReportingFailureIndication.h"
+#include "LocationReport.h"
+#include "OverloadStart.h"
+#include "OverloadStop.h"
+#include "ENBDirectInformationTransfer.h"
+#include "MMEDirectInformationTransfer.h"
+#include "ENBConfigurationTransfer.h"
+#include "MMEConfigurationTransfer.h"
+#include "PrivateMessage.h"
+#include "DownlinkUEAssociatedLPPaTransport.h"
+#include "UplinkUEAssociatedLPPaTransport.h"
+#include "DownlinkNonUEAssociatedLPPaTransport.h"
+#include "UplinkNonUEAssociatedLPPaTransport.h"
+#include "PWSRestartIndication.h"
+#include "RerouteNASRequest.h"
+#include "PWSFailureIndication.h"
+#include "ConnectionEstablishmentIndication.h"
+#include "NASDeliveryIndication.h"
+#include "RetrieveUEInformation.h"
+#include "UEInformationTransfer.h"
+#include "ENBCPRelocationIndication.h"
+#include "MMECPRelocationIndication.h"
+#include "SecondaryRATDataUsageReport.h"
+#include <OPEN_TYPE.h>
+#include <constr_CHOICE.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum UnsuccessfulOutcome__value_PR {
+	UnsuccessfulOutcome__value_PR_NOTHING,	/* No components present */
+	UnsuccessfulOutcome__value_PR_HandoverPreparationFailure,
+	UnsuccessfulOutcome__value_PR_HandoverFailure,
+	UnsuccessfulOutcome__value_PR_PathSwitchRequestFailure,
+	UnsuccessfulOutcome__value_PR_InitialContextSetupFailure,
+	UnsuccessfulOutcome__value_PR_S1SetupFailure,
+	UnsuccessfulOutcome__value_PR_UEContextModificationFailure,
+	UnsuccessfulOutcome__value_PR_ENBConfigurationUpdateFailure,
+	UnsuccessfulOutcome__value_PR_MMEConfigurationUpdateFailure,
+	UnsuccessfulOutcome__value_PR_UEContextResumeFailure
+} UnsuccessfulOutcome__value_PR;
+
+/* UnsuccessfulOutcome */
+typedef struct UnsuccessfulOutcome {
+	ProcedureCode_t	 procedureCode;
+	Criticality_t	 criticality;
+	struct UnsuccessfulOutcome__value {
+		UnsuccessfulOutcome__value_PR present;
+		union UnsuccessfulOutcome__value_u {
+			HandoverPreparationFailure_t	 HandoverPreparationFailure;
+			HandoverFailure_t	 HandoverFailure;
+			PathSwitchRequestFailure_t	 PathSwitchRequestFailure;
+			InitialContextSetupFailure_t	 InitialContextSetupFailure;
+			S1SetupFailure_t	 S1SetupFailure;
+			UEContextModificationFailure_t	 UEContextModificationFailure;
+			ENBConfigurationUpdateFailure_t	 ENBConfigurationUpdateFailure;
+			MMEConfigurationUpdateFailure_t	 MMEConfigurationUpdateFailure;
+			UEContextResumeFailure_t	 UEContextResumeFailure;
+		} choice;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UnsuccessfulOutcome_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_UnsuccessfulOutcome;
+extern asn_SEQUENCE_specifics_t asn_SPC_UnsuccessfulOutcome_specs_1;
+extern asn_TYPE_member_t asn_MBR_UnsuccessfulOutcome_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UnsuccessfulOutcome_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UplinkNASTransport.h b/src/s1ap/asn1c/asnGenFiles/UplinkNASTransport.h
new file mode 100644
index 0000000..6a18a16
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UplinkNASTransport.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UplinkNASTransport_H_
+#define	_UplinkNASTransport_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* UplinkNASTransport */
+typedef struct UplinkNASTransport {
+	ProtocolIE_Container_129P33_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UplinkNASTransport_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_UplinkNASTransport;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UplinkNASTransport_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UplinkNonUEAssociatedLPPaTransport.h b/src/s1ap/asn1c/asnGenFiles/UplinkNonUEAssociatedLPPaTransport.h
new file mode 100644
index 0000000..2137e4e
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UplinkNonUEAssociatedLPPaTransport.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UplinkNonUEAssociatedLPPaTransport_H_
+#define	_UplinkNonUEAssociatedLPPaTransport_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* UplinkNonUEAssociatedLPPaTransport */
+typedef struct UplinkNonUEAssociatedLPPaTransport {
+	ProtocolIE_Container_129P76_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UplinkNonUEAssociatedLPPaTransport_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_UplinkNonUEAssociatedLPPaTransport;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UplinkNonUEAssociatedLPPaTransport_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UplinkS1cdma2000tunnelling.h b/src/s1ap/asn1c/asnGenFiles/UplinkS1cdma2000tunnelling.h
new file mode 100644
index 0000000..0155ad8
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UplinkS1cdma2000tunnelling.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UplinkS1cdma2000tunnelling_H_
+#define	_UplinkS1cdma2000tunnelling_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* UplinkS1cdma2000tunnelling */
+typedef struct UplinkS1cdma2000tunnelling {
+	ProtocolIE_Container_129P50_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UplinkS1cdma2000tunnelling_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_UplinkS1cdma2000tunnelling;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UplinkS1cdma2000tunnelling_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UplinkUEAssociatedLPPaTransport.h b/src/s1ap/asn1c/asnGenFiles/UplinkUEAssociatedLPPaTransport.h
new file mode 100644
index 0000000..1ad3d28
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UplinkUEAssociatedLPPaTransport.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UplinkUEAssociatedLPPaTransport_H_
+#define	_UplinkUEAssociatedLPPaTransport_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* UplinkUEAssociatedLPPaTransport */
+typedef struct UplinkUEAssociatedLPPaTransport {
+	ProtocolIE_Container_129P74_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UplinkUEAssociatedLPPaTransport_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_UplinkUEAssociatedLPPaTransport;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UplinkUEAssociatedLPPaTransport_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/UserLocationInformation.h b/src/s1ap/asn1c/asnGenFiles/UserLocationInformation.h
new file mode 100644
index 0000000..81ff149
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/UserLocationInformation.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_UserLocationInformation_H_
+#define	_UserLocationInformation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "EUTRAN-CGI.h"
+#include "TAI.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* UserLocationInformation */
+typedef struct UserLocationInformation {
+	EUTRAN_CGI_t	 eutran_cgi;
+	TAI_t	 tai;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} UserLocationInformation_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_UserLocationInformation;
+extern asn_SEQUENCE_specifics_t asn_SPC_UserLocationInformation_specs_1;
+extern asn_TYPE_member_t asn_MBR_UserLocationInformation_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _UserLocationInformation_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/V2XServicesAuthorized.h b/src/s1ap/asn1c/asnGenFiles/V2XServicesAuthorized.h
new file mode 100644
index 0000000..875b384
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/V2XServicesAuthorized.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_V2XServicesAuthorized_H_
+#define	_V2XServicesAuthorized_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "VehicleUE.h"
+#include "PedestrianUE.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* V2XServicesAuthorized */
+typedef struct V2XServicesAuthorized {
+	VehicleUE_t	*vehicleUE;	/* OPTIONAL */
+	PedestrianUE_t	*pedestrianUE;	/* OPTIONAL */
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} V2XServicesAuthorized_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_V2XServicesAuthorized;
+extern asn_SEQUENCE_specifics_t asn_SPC_V2XServicesAuthorized_specs_1;
+extern asn_TYPE_member_t asn_MBR_V2XServicesAuthorized_1[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _V2XServicesAuthorized_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/VehicleUE.h b/src/s1ap/asn1c/asnGenFiles/VehicleUE.h
new file mode 100644
index 0000000..bfe3da0
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/VehicleUE.h
@@ -0,0 +1,56 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_VehicleUE_H_
+#define	_VehicleUE_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum VehicleUE {
+	VehicleUE_authorized	= 0,
+	VehicleUE_not_authorized	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_VehicleUE;
+
+/* VehicleUE */
+typedef long	 VehicleUE_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_VehicleUE_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_VehicleUE;
+extern const asn_INTEGER_specifics_t asn_SPC_VehicleUE_specs_1;
+asn_struct_free_f VehicleUE_free;
+asn_struct_print_f VehicleUE_print;
+asn_constr_check_f VehicleUE_constraint;
+ber_type_decoder_f VehicleUE_decode_ber;
+der_type_encoder_f VehicleUE_encode_der;
+xer_type_decoder_f VehicleUE_decode_xer;
+xer_type_encoder_f VehicleUE_encode_xer;
+oer_type_decoder_f VehicleUE_decode_oer;
+oer_type_encoder_f VehicleUE_encode_oer;
+per_type_decoder_f VehicleUE_decode_uper;
+per_type_encoder_f VehicleUE_encode_uper;
+per_type_decoder_f VehicleUE_decode_aper;
+per_type_encoder_f VehicleUE_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _VehicleUE_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/VoiceSupportMatchIndicator.h b/src/s1ap/asn1c/asnGenFiles/VoiceSupportMatchIndicator.h
new file mode 100644
index 0000000..495c4b5
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/VoiceSupportMatchIndicator.h
@@ -0,0 +1,56 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_VoiceSupportMatchIndicator_H_
+#define	_VoiceSupportMatchIndicator_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum VoiceSupportMatchIndicator {
+	VoiceSupportMatchIndicator_supported	= 0,
+	VoiceSupportMatchIndicator_not_supported	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_VoiceSupportMatchIndicator;
+
+/* VoiceSupportMatchIndicator */
+typedef long	 VoiceSupportMatchIndicator_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_VoiceSupportMatchIndicator_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_VoiceSupportMatchIndicator;
+extern const asn_INTEGER_specifics_t asn_SPC_VoiceSupportMatchIndicator_specs_1;
+asn_struct_free_f VoiceSupportMatchIndicator_free;
+asn_struct_print_f VoiceSupportMatchIndicator_print;
+asn_constr_check_f VoiceSupportMatchIndicator_constraint;
+ber_type_decoder_f VoiceSupportMatchIndicator_decode_ber;
+der_type_encoder_f VoiceSupportMatchIndicator_encode_der;
+xer_type_decoder_f VoiceSupportMatchIndicator_decode_xer;
+xer_type_encoder_f VoiceSupportMatchIndicator_encode_xer;
+oer_type_decoder_f VoiceSupportMatchIndicator_decode_oer;
+oer_type_encoder_f VoiceSupportMatchIndicator_encode_oer;
+per_type_decoder_f VoiceSupportMatchIndicator_decode_uper;
+per_type_encoder_f VoiceSupportMatchIndicator_encode_uper;
+per_type_decoder_f VoiceSupportMatchIndicator_decode_aper;
+per_type_encoder_f VoiceSupportMatchIndicator_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _VoiceSupportMatchIndicator_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/WLANMeasConfig.h b/src/s1ap/asn1c/asnGenFiles/WLANMeasConfig.h
new file mode 100644
index 0000000..3bbd352
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/WLANMeasConfig.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_WLANMeasConfig_H_
+#define	_WLANMeasConfig_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum WLANMeasConfig {
+	WLANMeasConfig_setup	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_WLANMeasConfig;
+
+/* WLANMeasConfig */
+typedef long	 WLANMeasConfig_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_WLANMeasConfig_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_WLANMeasConfig;
+extern const asn_INTEGER_specifics_t asn_SPC_WLANMeasConfig_specs_1;
+asn_struct_free_f WLANMeasConfig_free;
+asn_struct_print_f WLANMeasConfig_print;
+asn_constr_check_f WLANMeasConfig_constraint;
+ber_type_decoder_f WLANMeasConfig_decode_ber;
+der_type_encoder_f WLANMeasConfig_encode_der;
+xer_type_decoder_f WLANMeasConfig_decode_xer;
+xer_type_encoder_f WLANMeasConfig_encode_xer;
+oer_type_decoder_f WLANMeasConfig_decode_oer;
+oer_type_encoder_f WLANMeasConfig_encode_oer;
+per_type_decoder_f WLANMeasConfig_decode_uper;
+per_type_encoder_f WLANMeasConfig_encode_uper;
+per_type_decoder_f WLANMeasConfig_decode_aper;
+per_type_encoder_f WLANMeasConfig_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _WLANMeasConfig_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/WLANMeasConfigNameList.h b/src/s1ap/asn1c/asnGenFiles/WLANMeasConfigNameList.h
new file mode 100644
index 0000000..69bf76b
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/WLANMeasConfigNameList.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_WLANMeasConfigNameList_H_
+#define	_WLANMeasConfigNameList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "WLANName.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* WLANMeasConfigNameList */
+typedef struct WLANMeasConfigNameList {
+	A_SEQUENCE_OF(WLANName_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} WLANMeasConfigNameList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_WLANMeasConfigNameList;
+extern asn_SET_OF_specifics_t asn_SPC_WLANMeasConfigNameList_specs_1;
+extern asn_TYPE_member_t asn_MBR_WLANMeasConfigNameList_1[1];
+extern asn_per_constraints_t asn_PER_type_WLANMeasConfigNameList_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _WLANMeasConfigNameList_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/WLANMeasurementConfiguration.h b/src/s1ap/asn1c/asnGenFiles/WLANMeasurementConfiguration.h
new file mode 100644
index 0000000..e0d9406
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/WLANMeasurementConfiguration.h
@@ -0,0 +1,69 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_WLANMeasurementConfiguration_H_
+#define	_WLANMeasurementConfiguration_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "WLANMeasConfig.h"
+#include <NativeEnumerated.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum WLANMeasurementConfiguration__wlan_rssi {
+	WLANMeasurementConfiguration__wlan_rssi_true	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_WLANMeasurementConfiguration__wlan_rssi;
+typedef enum WLANMeasurementConfiguration__wlan_rtt {
+	WLANMeasurementConfiguration__wlan_rtt_true	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_WLANMeasurementConfiguration__wlan_rtt;
+
+/* Forward declarations */
+struct WLANMeasConfigNameList;
+struct ProtocolExtensionContainer;
+
+/* WLANMeasurementConfiguration */
+typedef struct WLANMeasurementConfiguration {
+	WLANMeasConfig_t	 wlanMeasConfig;
+	struct WLANMeasConfigNameList	*wlanMeasConfigNameList;	/* OPTIONAL */
+	long	*wlan_rssi;	/* OPTIONAL */
+	long	*wlan_rtt;	/* OPTIONAL */
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} WLANMeasurementConfiguration_t;
+
+/* Implementation */
+/* extern asn_TYPE_descriptor_t asn_DEF_wlan_rssi_4;	// (Use -fall-defs-global to expose) */
+/* extern asn_TYPE_descriptor_t asn_DEF_wlan_rtt_7;	// (Use -fall-defs-global to expose) */
+extern asn_TYPE_descriptor_t asn_DEF_WLANMeasurementConfiguration;
+extern asn_SEQUENCE_specifics_t asn_SPC_WLANMeasurementConfiguration_specs_1;
+extern asn_TYPE_member_t asn_MBR_WLANMeasurementConfiguration_1[5];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _WLANMeasurementConfiguration_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/WLANName.h b/src/s1ap/asn1c/asnGenFiles/WLANName.h
new file mode 100644
index 0000000..d0d7d29
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/WLANName.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_WLANName_H_
+#define	_WLANName_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* WLANName */
+typedef OCTET_STRING_t	 WLANName_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_WLANName_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_WLANName;
+asn_struct_free_f WLANName_free;
+asn_struct_print_f WLANName_print;
+asn_constr_check_f WLANName_constraint;
+ber_type_decoder_f WLANName_decode_ber;
+der_type_encoder_f WLANName_encode_der;
+xer_type_decoder_f WLANName_decode_xer;
+xer_type_encoder_f WLANName_encode_xer;
+oer_type_decoder_f WLANName_decode_oer;
+oer_type_encoder_f WLANName_encode_oer;
+per_type_decoder_f WLANName_decode_uper;
+per_type_encoder_f WLANName_encode_uper;
+per_type_decoder_f WLANName_decode_aper;
+per_type_encoder_f WLANName_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _WLANName_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/WarningAreaCoordinates.h b/src/s1ap/asn1c/asnGenFiles/WarningAreaCoordinates.h
new file mode 100644
index 0000000..5af624a
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/WarningAreaCoordinates.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_WarningAreaCoordinates_H_
+#define	_WarningAreaCoordinates_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* WarningAreaCoordinates */
+typedef OCTET_STRING_t	 WarningAreaCoordinates_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_WarningAreaCoordinates_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_WarningAreaCoordinates;
+asn_struct_free_f WarningAreaCoordinates_free;
+asn_struct_print_f WarningAreaCoordinates_print;
+asn_constr_check_f WarningAreaCoordinates_constraint;
+ber_type_decoder_f WarningAreaCoordinates_decode_ber;
+der_type_encoder_f WarningAreaCoordinates_encode_der;
+xer_type_decoder_f WarningAreaCoordinates_decode_xer;
+xer_type_encoder_f WarningAreaCoordinates_encode_xer;
+oer_type_decoder_f WarningAreaCoordinates_decode_oer;
+oer_type_encoder_f WarningAreaCoordinates_encode_oer;
+per_type_decoder_f WarningAreaCoordinates_decode_uper;
+per_type_encoder_f WarningAreaCoordinates_encode_uper;
+per_type_decoder_f WarningAreaCoordinates_decode_aper;
+per_type_encoder_f WarningAreaCoordinates_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _WarningAreaCoordinates_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/WarningAreaList.h b/src/s1ap/asn1c/asnGenFiles/WarningAreaList.h
new file mode 100644
index 0000000..276a89c
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/WarningAreaList.h
@@ -0,0 +1,64 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_WarningAreaList_H_
+#define	_WarningAreaList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum WarningAreaList_PR {
+	WarningAreaList_PR_NOTHING,	/* No components present */
+	WarningAreaList_PR_cellIDList,
+	WarningAreaList_PR_trackingAreaListforWarning,
+	WarningAreaList_PR_emergencyAreaIDList
+	/* Extensions may appear below */
+	
+} WarningAreaList_PR;
+
+/* Forward declarations */
+struct ECGIList;
+struct TAIListforWarning;
+struct EmergencyAreaIDList;
+
+/* WarningAreaList */
+typedef struct WarningAreaList {
+	WarningAreaList_PR present;
+	union WarningAreaList_u {
+		struct ECGIList	*cellIDList;
+		struct TAIListforWarning	*trackingAreaListforWarning;
+		struct EmergencyAreaIDList	*emergencyAreaIDList;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} WarningAreaList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_WarningAreaList;
+extern asn_CHOICE_specifics_t asn_SPC_WarningAreaList_specs_1;
+extern asn_TYPE_member_t asn_MBR_WarningAreaList_1[3];
+extern asn_per_constraints_t asn_PER_type_WarningAreaList_constr_1;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _WarningAreaList_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/WarningMessageContents.h b/src/s1ap/asn1c/asnGenFiles/WarningMessageContents.h
new file mode 100644
index 0000000..2a6c3e4
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/WarningMessageContents.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_WarningMessageContents_H_
+#define	_WarningMessageContents_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* WarningMessageContents */
+typedef OCTET_STRING_t	 WarningMessageContents_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_WarningMessageContents_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_WarningMessageContents;
+asn_struct_free_f WarningMessageContents_free;
+asn_struct_print_f WarningMessageContents_print;
+asn_constr_check_f WarningMessageContents_constraint;
+ber_type_decoder_f WarningMessageContents_decode_ber;
+der_type_encoder_f WarningMessageContents_encode_der;
+xer_type_decoder_f WarningMessageContents_decode_xer;
+xer_type_encoder_f WarningMessageContents_encode_xer;
+oer_type_decoder_f WarningMessageContents_decode_oer;
+oer_type_encoder_f WarningMessageContents_encode_oer;
+per_type_decoder_f WarningMessageContents_decode_uper;
+per_type_encoder_f WarningMessageContents_encode_uper;
+per_type_decoder_f WarningMessageContents_decode_aper;
+per_type_encoder_f WarningMessageContents_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _WarningMessageContents_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/WarningSecurityInfo.h b/src/s1ap/asn1c/asnGenFiles/WarningSecurityInfo.h
new file mode 100644
index 0000000..ec42845
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/WarningSecurityInfo.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_WarningSecurityInfo_H_
+#define	_WarningSecurityInfo_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* WarningSecurityInfo */
+typedef OCTET_STRING_t	 WarningSecurityInfo_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_WarningSecurityInfo_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_WarningSecurityInfo;
+asn_struct_free_f WarningSecurityInfo_free;
+asn_struct_print_f WarningSecurityInfo_print;
+asn_constr_check_f WarningSecurityInfo_constraint;
+ber_type_decoder_f WarningSecurityInfo_decode_ber;
+der_type_encoder_f WarningSecurityInfo_encode_der;
+xer_type_decoder_f WarningSecurityInfo_decode_xer;
+xer_type_encoder_f WarningSecurityInfo_encode_xer;
+oer_type_decoder_f WarningSecurityInfo_decode_oer;
+oer_type_encoder_f WarningSecurityInfo_encode_oer;
+per_type_decoder_f WarningSecurityInfo_decode_uper;
+per_type_encoder_f WarningSecurityInfo_encode_uper;
+per_type_decoder_f WarningSecurityInfo_decode_aper;
+per_type_encoder_f WarningSecurityInfo_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _WarningSecurityInfo_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/WarningType.h b/src/s1ap/asn1c/asnGenFiles/WarningType.h
new file mode 100644
index 0000000..4fe2292
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/WarningType.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_WarningType_H_
+#define	_WarningType_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* WarningType */
+typedef OCTET_STRING_t	 WarningType_t;
+
+/* Implementation */
+extern asn_per_constraints_t asn_PER_type_WarningType_constr_1;
+extern asn_TYPE_descriptor_t asn_DEF_WarningType;
+asn_struct_free_f WarningType_free;
+asn_struct_print_f WarningType_print;
+asn_constr_check_f WarningType_constraint;
+ber_type_decoder_f WarningType_decode_ber;
+der_type_encoder_f WarningType_encode_der;
+xer_type_decoder_f WarningType_decode_xer;
+xer_type_encoder_f WarningType_encode_xer;
+oer_type_decoder_f WarningType_decode_oer;
+oer_type_encoder_f WarningType_encode_oer;
+per_type_decoder_f WarningType_decode_uper;
+per_type_encoder_f WarningType_encode_uper;
+per_type_decoder_f WarningType_decode_aper;
+per_type_encoder_f WarningType_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _WarningType_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/WriteReplaceWarningRequest.h b/src/s1ap/asn1c/asnGenFiles/WriteReplaceWarningRequest.h
new file mode 100644
index 0000000..fc454df
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/WriteReplaceWarningRequest.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_WriteReplaceWarningRequest_H_
+#define	_WriteReplaceWarningRequest_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* WriteReplaceWarningRequest */
+typedef struct WriteReplaceWarningRequest {
+	ProtocolIE_Container_129P63_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} WriteReplaceWarningRequest_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_WriteReplaceWarningRequest;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _WriteReplaceWarningRequest_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/WriteReplaceWarningResponse.h b/src/s1ap/asn1c/asnGenFiles/WriteReplaceWarningResponse.h
new file mode 100644
index 0000000..5816b20
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/WriteReplaceWarningResponse.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-PDU-Contents"
+ * 	found in "./asn1c/S1AP-PDU-Contents.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_WriteReplaceWarningResponse_H_
+#define	_WriteReplaceWarningResponse_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ProtocolIE-Container.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* WriteReplaceWarningResponse */
+typedef struct WriteReplaceWarningResponse {
+	ProtocolIE_Container_129P64_t	 protocolIEs;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} WriteReplaceWarningResponse_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_WriteReplaceWarningResponse;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _WriteReplaceWarningResponse_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/X2TNLConfigurationInfo.h b/src/s1ap/asn1c/asnGenFiles/X2TNLConfigurationInfo.h
new file mode 100644
index 0000000..0c6cc80
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/X2TNLConfigurationInfo.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ * From ASN.1 module "S1AP-IEs"
+ * 	found in "./asn1c/S1AP-IEs.asn"
+ * 	`asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU`
+ */
+
+#ifndef	_X2TNLConfigurationInfo_H_
+#define	_X2TNLConfigurationInfo_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "ENBX2TLAs.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Forward declarations */
+struct ProtocolExtensionContainer;
+
+/* X2TNLConfigurationInfo */
+typedef struct X2TNLConfigurationInfo {
+	ENBX2TLAs_t	 eNBX2TransportLayerAddresses;
+	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} X2TNLConfigurationInfo_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_X2TNLConfigurationInfo;
+extern asn_SEQUENCE_specifics_t asn_SPC_X2TNLConfigurationInfo_specs_1;
+extern asn_TYPE_member_t asn_MBR_X2TNLConfigurationInfo_1[2];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _X2TNLConfigurationInfo_H_ */
+#include <asn_internal.h>
diff --git a/src/s1ap/asn1c/asnGenFiles/asn1c/S1AP-CommonDataTypes.asn b/src/s1ap/asn1c/asnGenFiles/asn1c/S1AP-CommonDataTypes.asn
new file mode 100644
index 0000000..bd44dff
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/asn1c/S1AP-CommonDataTypes.asn
@@ -0,0 +1,32 @@
+-- **************************************************************
+--
+-- Coommon definitions
+--
+-- **************************************************************
+
+S1AP-CommonDataTypes {
+itu-t (0) identified-organization (4) etsi (0) mobileDomain (0) 
+eps-Access (21) modules (3) s1ap (1) version1 (1) s1ap-CommonDataTypes (3) }
+
+DEFINITIONS AUTOMATIC TAGS ::= 
+
+BEGIN
+
+Criticality        ::= ENUMERATED { reject, ignore, notify }
+
+Presence        ::= ENUMERATED { optional, conditional, mandatory }
+
+PrivateIE-ID    ::= CHOICE {
+    local                INTEGER (0..65535),
+    global                OBJECT IDENTIFIER
+}
+
+ProcedureCode        ::= INTEGER (0..255)
+
+ProtocolExtensionID    ::= INTEGER (0..65535)
+
+ProtocolIE-ID        ::= INTEGER (0..65535)
+
+TriggeringMessage    ::= ENUMERATED { initiating-message, successful-outcome, unsuccessfull-outcome }
+
+END
diff --git a/src/s1ap/asn1c/asnGenFiles/asn1c/S1AP-Constants.asn b/src/s1ap/asn1c/asnGenFiles/asn1c/S1AP-Constants.asn
new file mode 100644
index 0000000..89a60ec
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/asn1c/S1AP-Constants.asn
@@ -0,0 +1,445 @@
+-- **************************************************************
+--
+-- Constant definitions
+--
+-- **************************************************************
+
+S1AP-Constants { 
+itu-t (0) identified-organization (4) etsi (0) mobileDomain (0) 
+eps-Access (21) modules (3) s1ap (1) version1 (1) s1ap-Constants (4) } 
+
+DEFINITIONS AUTOMATIC TAGS ::= 
+
+BEGIN
+
+-- **************************************************************
+--
+-- IE parameter types from other modules.
+--
+-- **************************************************************
+
+IMPORTS
+    ProcedureCode,
+    ProtocolIE-ID
+
+FROM S1AP-CommonDataTypes;
+
+
+-- **************************************************************
+--
+-- Elementary Procedures
+--
+-- **************************************************************
+
+id-HandoverPreparation                        ProcedureCode ::= 0
+id-HandoverResourceAllocation                ProcedureCode ::= 1
+id-HandoverNotification                        ProcedureCode ::= 2
+id-PathSwitchRequest                        ProcedureCode ::= 3
+id-HandoverCancel                            ProcedureCode ::= 4
+id-E-RABSetup                                ProcedureCode ::= 5
+id-E-RABModify                                ProcedureCode ::= 6
+id-E-RABRelease                                ProcedureCode ::= 7
+id-E-RABReleaseIndication                    ProcedureCode ::= 8
+id-InitialContextSetup                        ProcedureCode ::= 9
+id-Paging                                    ProcedureCode ::= 10
+id-downlinkNASTransport                        ProcedureCode ::= 11
+id-initialUEMessage                            ProcedureCode ::= 12
+id-uplinkNASTransport                        ProcedureCode ::= 13
+id-Reset                                    ProcedureCode ::= 14
+id-ErrorIndication                            ProcedureCode ::= 15
+id-NASNonDeliveryIndication                    ProcedureCode ::= 16
+id-S1Setup                                    ProcedureCode ::= 17
+id-UEContextReleaseRequest                    ProcedureCode ::= 18
+id-DownlinkS1cdma2000tunnelling                ProcedureCode ::= 19
+id-UplinkS1cdma2000tunnelling                ProcedureCode ::= 20
+id-UEContextModification                    ProcedureCode ::= 21
+id-UECapabilityInfoIndication                ProcedureCode ::= 22
+id-UEContextRelease                            ProcedureCode ::= 23
+id-eNBStatusTransfer                        ProcedureCode ::= 24
+id-MMEStatusTransfer                        ProcedureCode ::= 25
+id-DeactivateTrace                            ProcedureCode ::= 26
+id-TraceStart                                ProcedureCode ::= 27
+id-TraceFailureIndication                    ProcedureCode ::= 28
+id-ENBConfigurationUpdate                    ProcedureCode ::= 29
+id-MMEConfigurationUpdate                    ProcedureCode ::= 30
+id-LocationReportingControl                    ProcedureCode ::= 31
+id-LocationReportingFailureIndication        ProcedureCode ::= 32
+id-LocationReport                            ProcedureCode ::= 33
+id-OverloadStart                            ProcedureCode ::= 34
+id-OverloadStop                                ProcedureCode ::= 35
+id-WriteReplaceWarning                        ProcedureCode ::= 36
+id-eNBDirectInformationTransfer                ProcedureCode ::= 37
+id-MMEDirectInformationTransfer                ProcedureCode ::= 38
+id-PrivateMessage                            ProcedureCode ::= 39
+id-eNBConfigurationTransfer                    ProcedureCode ::= 40
+id-MMEConfigurationTransfer                    ProcedureCode ::= 41
+id-CellTrafficTrace                            ProcedureCode ::= 42
+id-Kill                                        ProcedureCode ::= 43
+id-downlinkUEAssociatedLPPaTransport        ProcedureCode ::= 44
+id-uplinkUEAssociatedLPPaTransport            ProcedureCode ::= 45
+id-downlinkNonUEAssociatedLPPaTransport        ProcedureCode ::= 46
+id-uplinkNonUEAssociatedLPPaTransport        ProcedureCode ::= 47
+id-UERadioCapabilityMatch                    ProcedureCode ::= 48
+id-PWSRestartIndication                        ProcedureCode ::= 49
+id-E-RABModificationIndication                ProcedureCode ::= 50
+id-PWSFailureIndication                        ProcedureCode ::= 51
+id-RerouteNASRequest                        ProcedureCode ::= 52
+id-UEContextModificationIndication            ProcedureCode ::= 53
+id-ConnectionEstablishmentIndication        ProcedureCode ::= 54
+id-UEContextSuspend                            ProcedureCode ::= 55
+id-UEContextResume                            ProcedureCode ::= 56
+id-NASDeliveryIndication                    ProcedureCode ::= 57
+id-RetrieveUEInformation                    ProcedureCode ::= 58
+id-UEInformationTransfer                    ProcedureCode ::= 59
+id-eNBCPRelocationIndication                ProcedureCode ::= 60
+id-MMECPRelocationIndication                ProcedureCode ::= 61
+id-SecondaryRATDataUsageReport                ProcedureCode ::= 62
+
+-- **************************************************************
+--
+-- Extension constants
+--
+-- **************************************************************
+
+maxPrivateIEs                            INTEGER ::= 65535
+maxProtocolExtensions                    INTEGER ::= 65535
+maxProtocolIEs                            INTEGER ::= 65535
+-- **************************************************************
+--
+-- Lists
+--
+-- **************************************************************
+
+maxnoofCSGs                                INTEGER ::= 256
+maxnoofE-RABs                            INTEGER ::= 256
+maxnoofTAIs                                INTEGER ::= 256
+maxnoofTACs                                INTEGER ::= 256
+maxnoofErrors                            INTEGER ::= 256
+maxnoofBPLMNs                            INTEGER ::= 6
+maxnoofPLMNsPerMME                        INTEGER ::= 32
+maxnoofEPLMNs                            INTEGER ::= 15
+maxnoofEPLMNsPlusOne                    INTEGER ::= 16
+maxnoofForbLACs                            INTEGER ::= 4096
+maxnoofForbTACs                            INTEGER ::= 4096
+maxnoofIndividualS1ConnectionsToReset    INTEGER ::= 256
+maxnoofCellsinUEHistoryInfo                INTEGER ::= 16
+maxnoofCellsineNB                        INTEGER ::= 256
+maxnoofTAIforWarning                    INTEGER ::= 65535 
+maxnoofCellID                            INTEGER ::= 65535 
+maxnoofDCNs                                INTEGER ::= 32 
+maxnoofEmergencyAreaID                    INTEGER ::= 65535 
+maxnoofCellinTAI                        INTEGER ::= 65535 
+maxnoofCellinEAI                        INTEGER ::= 65535 
+maxnoofeNBX2TLAs                        INTEGER ::= 2
+maxnoofeNBX2ExtTLAs                        INTEGER ::= 16
+maxnoofeNBX2GTPTLAs                        INTEGER ::= 16
+maxnoofRATs                                INTEGER ::= 8
+maxnoofGroupIDs                            INTEGER ::= 65535
+maxnoofMMECs                            INTEGER ::= 256
+maxnoofCellIDforMDT                        INTEGER ::= 32
+maxnoofTAforMDT                            INTEGER ::= 8
+maxnoofMDTPLMNs                            INTEGER ::= 16
+maxnoofCellsforRestart                    INTEGER ::= 256
+maxnoofRestartTAIs                        INTEGER ::= 2048
+maxnoofRestartEmergencyAreaIDs            INTEGER ::= 256
+maxEARFCN                                INTEGER ::= 262143
+maxnoofMBSFNAreaMDT                        INTEGER ::= 8
+maxnoofRecommendedCells                    INTEGER ::= 16
+maxnoofRecommendedENBs                    INTEGER ::= 16
+maxnooftimeperiods                        INTEGER ::= 2 
+maxnoofCellIDforQMC                        INTEGER ::= 32
+maxnoofTAforQMC                            INTEGER ::= 8
+maxnoofPLMNforQMC                        INTEGER ::= 16
+maxnoofBluetoothName                    INTEGER ::= 4
+maxnoofWLANName                            INTEGER ::= 4
+maxnoofConnectedengNBs                    INTEGER ::= 256
+
+
+
+-- **************************************************************
+--
+-- IEs
+--
+-- **************************************************************
+
+id-MME-UE-S1AP-ID                                    ProtocolIE-ID ::= 0
+id-HandoverType                                        ProtocolIE-ID ::= 1
+id-Cause                                            ProtocolIE-ID ::= 2
+id-SourceID                                            ProtocolIE-ID ::= 3
+id-TargetID                                            ProtocolIE-ID ::= 4
+id-eNB-UE-S1AP-ID                                    ProtocolIE-ID ::= 8
+id-E-RABSubjecttoDataForwardingList                    ProtocolIE-ID ::= 12
+id-E-RABtoReleaseListHOCmd                            ProtocolIE-ID ::= 13
+id-E-RABDataForwardingItem                            ProtocolIE-ID ::= 14
+id-E-RABReleaseItemBearerRelComp                    ProtocolIE-ID ::= 15
+id-E-RABToBeSetupListBearerSUReq                    ProtocolIE-ID ::= 16
+id-E-RABToBeSetupItemBearerSUReq                    ProtocolIE-ID ::= 17
+id-E-RABAdmittedList                                ProtocolIE-ID ::= 18
+id-E-RABFailedToSetupListHOReqAck                    ProtocolIE-ID ::= 19
+id-E-RABAdmittedItem                                ProtocolIE-ID ::= 20
+id-E-RABFailedtoSetupItemHOReqAck                    ProtocolIE-ID ::= 21
+id-E-RABToBeSwitchedDLList                            ProtocolIE-ID ::= 22
+id-E-RABToBeSwitchedDLItem                            ProtocolIE-ID ::= 23
+id-E-RABToBeSetupListCtxtSUReq                        ProtocolIE-ID ::= 24
+id-TraceActivation                                    ProtocolIE-ID ::= 25
+id-NAS-PDU                                            ProtocolIE-ID ::= 26
+id-E-RABToBeSetupItemHOReq                            ProtocolIE-ID ::= 27
+id-E-RABSetupListBearerSURes                        ProtocolIE-ID ::= 28
+id-E-RABFailedToSetupListBearerSURes                ProtocolIE-ID ::= 29
+id-E-RABToBeModifiedListBearerModReq                ProtocolIE-ID ::= 30
+id-E-RABModifyListBearerModRes                        ProtocolIE-ID ::= 31
+id-E-RABFailedToModifyList                            ProtocolIE-ID ::= 32
+id-E-RABToBeReleasedList                            ProtocolIE-ID ::= 33
+id-E-RABFailedToReleaseList                            ProtocolIE-ID ::= 34
+id-E-RABItem                                        ProtocolIE-ID ::= 35
+id-E-RABToBeModifiedItemBearerModReq                ProtocolIE-ID ::= 36
+id-E-RABModifyItemBearerModRes                        ProtocolIE-ID ::= 37
+id-E-RABReleaseItem                                    ProtocolIE-ID ::= 38
+id-E-RABSetupItemBearerSURes                        ProtocolIE-ID ::= 39
+id-SecurityContext                                    ProtocolIE-ID ::= 40
+id-HandoverRestrictionList                            ProtocolIE-ID ::= 41
+id-UEPagingID                                        ProtocolIE-ID ::= 43
+id-pagingDRX                                        ProtocolIE-ID ::= 44
+id-TAIList                                            ProtocolIE-ID ::= 46
+id-TAIItem                                            ProtocolIE-ID ::= 47
+id-E-RABFailedToSetupListCtxtSURes                    ProtocolIE-ID ::= 48
+id-E-RABReleaseItemHOCmd                            ProtocolIE-ID ::= 49
+id-E-RABSetupItemCtxtSURes                            ProtocolIE-ID ::= 50
+id-E-RABSetupListCtxtSURes                            ProtocolIE-ID ::= 51
+id-E-RABToBeSetupItemCtxtSUReq                        ProtocolIE-ID ::= 52
+id-E-RABToBeSetupListHOReq                            ProtocolIE-ID ::= 53
+id-GERANtoLTEHOInformationRes                        ProtocolIE-ID ::= 55
+id-UTRANtoLTEHOInformationRes                        ProtocolIE-ID ::= 57
+id-CriticalityDiagnostics                             ProtocolIE-ID ::= 58
+id-Global-ENB-ID                                    ProtocolIE-ID ::= 59
+id-eNBname                                            ProtocolIE-ID ::= 60
+id-MMEname                                            ProtocolIE-ID ::= 61
+id-ServedPLMNs                                        ProtocolIE-ID ::= 63
+id-SupportedTAs                                        ProtocolIE-ID ::= 64
+id-TimeToWait                                        ProtocolIE-ID ::= 65
+id-uEaggregateMaximumBitrate                        ProtocolIE-ID ::= 66
+id-TAI                                                ProtocolIE-ID ::= 67
+id-E-RABReleaseListBearerRelComp                    ProtocolIE-ID ::= 69
+id-cdma2000PDU                                        ProtocolIE-ID ::= 70
+id-cdma2000RATType                                    ProtocolIE-ID ::= 71
+id-cdma2000SectorID                                    ProtocolIE-ID ::= 72
+id-SecurityKey                                        ProtocolIE-ID ::= 73
+id-UERadioCapability                                ProtocolIE-ID ::= 74
+id-GUMMEI-ID                                        ProtocolIE-ID ::= 75
+id-E-RABInformationListItem                            ProtocolIE-ID ::= 78
+id-Direct-Forwarding-Path-Availability                ProtocolIE-ID ::= 79
+id-UEIdentityIndexValue                                ProtocolIE-ID ::= 80
+id-cdma2000HOStatus                                    ProtocolIE-ID ::= 83
+id-cdma2000HORequiredIndication                        ProtocolIE-ID ::= 84
+id-E-UTRAN-Trace-ID                                    ProtocolIE-ID ::= 86
+id-RelativeMMECapacity                                ProtocolIE-ID ::= 87
+id-SourceMME-UE-S1AP-ID                                ProtocolIE-ID ::= 88
+id-Bearers-SubjectToStatusTransfer-Item                ProtocolIE-ID ::= 89
+id-eNB-StatusTransfer-TransparentContainer            ProtocolIE-ID ::= 90
+id-UE-associatedLogicalS1-ConnectionItem            ProtocolIE-ID ::= 91
+id-ResetType                                        ProtocolIE-ID ::= 92
+id-UE-associatedLogicalS1-ConnectionListResAck        ProtocolIE-ID ::= 93
+id-E-RABToBeSwitchedULItem                            ProtocolIE-ID ::= 94
+id-E-RABToBeSwitchedULList                            ProtocolIE-ID ::= 95
+id-S-TMSI                                            ProtocolIE-ID ::= 96
+id-cdma2000OneXRAND                                    ProtocolIE-ID ::= 97
+id-RequestType                                        ProtocolIE-ID ::= 98
+id-UE-S1AP-IDs                                        ProtocolIE-ID ::= 99
+id-EUTRAN-CGI                                        ProtocolIE-ID ::= 100
+id-OverloadResponse                                    ProtocolIE-ID ::= 101
+id-cdma2000OneXSRVCCInfo                            ProtocolIE-ID ::= 102
+id-E-RABFailedToBeReleasedList                        ProtocolIE-ID ::= 103
+id-Source-ToTarget-TransparentContainer                ProtocolIE-ID ::= 104
+id-ServedGUMMEIs                                    ProtocolIE-ID ::= 105
+id-SubscriberProfileIDforRFP                        ProtocolIE-ID ::= 106
+id-UESecurityCapabilities                            ProtocolIE-ID ::= 107
+id-CSFallbackIndicator                                ProtocolIE-ID ::= 108
+id-CNDomain                                            ProtocolIE-ID ::= 109
+id-E-RABReleasedList                                ProtocolIE-ID ::= 110
+id-MessageIdentifier                                ProtocolIE-ID ::= 111
+id-SerialNumber                                        ProtocolIE-ID ::= 112
+id-WarningAreaList                                    ProtocolIE-ID ::= 113
+id-RepetitionPeriod                                    ProtocolIE-ID ::= 114
+id-NumberofBroadcastRequest                            ProtocolIE-ID ::= 115
+id-WarningType                                        ProtocolIE-ID ::= 116
+id-WarningSecurityInfo                                ProtocolIE-ID ::= 117
+id-DataCodingScheme                                    ProtocolIE-ID ::= 118
+id-WarningMessageContents                            ProtocolIE-ID ::= 119
+id-BroadcastCompletedAreaList                        ProtocolIE-ID ::= 120
+id-Inter-SystemInformationTransferTypeEDT            ProtocolIE-ID ::= 121
+id-Inter-SystemInformationTransferTypeMDT            ProtocolIE-ID ::= 122
+id-Target-ToSource-TransparentContainer                ProtocolIE-ID ::= 123
+id-SRVCCOperationPossible                            ProtocolIE-ID ::= 124
+id-SRVCCHOIndication                                ProtocolIE-ID ::= 125
+id-NAS-DownlinkCount                                ProtocolIE-ID ::= 126
+id-CSG-Id                                            ProtocolIE-ID ::= 127
+id-CSG-IdList                                        ProtocolIE-ID ::= 128
+id-SONConfigurationTransferECT                        ProtocolIE-ID ::= 129
+id-SONConfigurationTransferMCT                        ProtocolIE-ID ::= 130
+id-TraceCollectionEntityIPAddress                    ProtocolIE-ID ::= 131
+id-MSClassmark2                                        ProtocolIE-ID ::= 132
+id-MSClassmark3                                        ProtocolIE-ID ::= 133
+id-RRC-Establishment-Cause                            ProtocolIE-ID ::= 134
+id-NASSecurityParametersfromE-UTRAN                    ProtocolIE-ID ::= 135
+id-NASSecurityParameterstoE-UTRAN                    ProtocolIE-ID ::= 136
+id-DefaultPagingDRX                                    ProtocolIE-ID ::= 137
+id-Source-ToTarget-TransparentContainer-Secondary    ProtocolIE-ID ::= 138
+id-Target-ToSource-TransparentContainer-Secondary    ProtocolIE-ID ::= 139
+id-EUTRANRoundTripDelayEstimationInfo                ProtocolIE-ID ::= 140
+id-BroadcastCancelledAreaList                        ProtocolIE-ID ::= 141
+id-ConcurrentWarningMessageIndicator                ProtocolIE-ID ::= 142
+id-Data-Forwarding-Not-Possible                        ProtocolIE-ID ::= 143
+id-ExtendedRepetitionPeriod                            ProtocolIE-ID ::= 144
+id-CellAccessMode                                    ProtocolIE-ID ::= 145
+id-CSGMembershipStatus                                 ProtocolIE-ID ::= 146
+id-LPPa-PDU                                            ProtocolIE-ID ::= 147
+id-Routing-ID                                        ProtocolIE-ID ::= 148
+id-Time-Synchronisation-Info                            ProtocolIE-ID ::= 149
+id-PS-ServiceNotAvailable                            ProtocolIE-ID ::= 150
+id-PagingPriority                                    ProtocolIE-ID ::= 151
+id-x2TNLConfigurationInfo                            ProtocolIE-ID ::= 152
+id-eNBX2ExtendedTransportLayerAddresses                ProtocolIE-ID ::= 153
+id-GUMMEIList                                        ProtocolIE-ID ::= 154
+id-GW-TransportLayerAddress                            ProtocolIE-ID ::= 155
+id-Correlation-ID                                    ProtocolIE-ID ::= 156
+id-SourceMME-GUMMEI                                    ProtocolIE-ID ::= 157
+id-MME-UE-S1AP-ID-2                                    ProtocolIE-ID ::= 158
+id-RegisteredLAI                                    ProtocolIE-ID ::= 159
+id-RelayNode-Indicator                                ProtocolIE-ID ::= 160
+id-TrafficLoadReductionIndication                    ProtocolIE-ID ::= 161
+id-MDTConfiguration                                    ProtocolIE-ID ::= 162
+id-MMERelaySupportIndicator                            ProtocolIE-ID ::= 163
+id-GWContextReleaseIndication                        ProtocolIE-ID ::= 164
+id-ManagementBasedMDTAllowed                        ProtocolIE-ID ::= 165
+id-PrivacyIndicator                                    ProtocolIE-ID ::= 166
+id-Time-UE-StayedInCell-EnhancedGranularity            ProtocolIE-ID ::= 167
+id-HO-Cause                                            ProtocolIE-ID ::= 168
+id-VoiceSupportMatchIndicator                        ProtocolIE-ID ::= 169
+id-GUMMEIType                                        ProtocolIE-ID ::= 170
+id-M3Configuration                                    ProtocolIE-ID ::= 171
+id-M4Configuration                                    ProtocolIE-ID ::= 172
+id-M5Configuration                                    ProtocolIE-ID ::= 173
+id-MDT-Location-Info                                ProtocolIE-ID ::= 174
+id-MobilityInformation                                ProtocolIE-ID ::= 175
+id-Tunnel-Information-for-BBF                        ProtocolIE-ID ::= 176
+id-ManagementBasedMDTPLMNList                        ProtocolIE-ID ::= 177
+id-SignallingBasedMDTPLMNList                        ProtocolIE-ID ::= 178
+id-ULCOUNTValueExtended                                ProtocolIE-ID ::= 179
+id-DLCOUNTValueExtended                                ProtocolIE-ID ::= 180
+id-ReceiveStatusOfULPDCPSDUsExtended                ProtocolIE-ID ::= 181
+id-ECGIListForRestart                                ProtocolIE-ID ::= 182
+id-SIPTO-Correlation-ID                                ProtocolIE-ID ::= 183
+id-SIPTO-L-GW-TransportLayerAddress                    ProtocolIE-ID ::= 184
+id-TransportInformation                                ProtocolIE-ID ::= 185
+id-LHN-ID                                            ProtocolIE-ID ::= 186
+id-AdditionalCSFallbackIndicator                    ProtocolIE-ID ::= 187
+id-TAIListForRestart                                ProtocolIE-ID ::= 188
+id-UserLocationInformation                            ProtocolIE-ID ::= 189
+id-EmergencyAreaIDListForRestart                    ProtocolIE-ID ::= 190
+id-KillAllWarningMessages                            ProtocolIE-ID ::= 191
+id-Masked-IMEISV                                    ProtocolIE-ID ::= 192
+id-eNBIndirectX2TransportLayerAddresses                ProtocolIE-ID ::= 193
+id-uE-HistoryInformationFromTheUE                    ProtocolIE-ID ::= 194
+id-ProSeAuthorized                                    ProtocolIE-ID ::= 195
+id-ExpectedUEBehaviour                                ProtocolIE-ID ::= 196
+id-LoggedMBSFNMDT                                    ProtocolIE-ID ::= 197
+id-UERadioCapabilityForPaging                        ProtocolIE-ID ::= 198
+id-E-RABToBeModifiedListBearerModInd                ProtocolIE-ID ::= 199
+id-E-RABToBeModifiedItemBearerModInd                ProtocolIE-ID ::= 200
+id-E-RABNotToBeModifiedListBearerModInd                ProtocolIE-ID ::= 201
+id-E-RABNotToBeModifiedItemBearerModInd                ProtocolIE-ID ::= 202
+id-E-RABModifyListBearerModConf                        ProtocolIE-ID ::= 203
+id-E-RABModifyItemBearerModConf                        ProtocolIE-ID ::= 204
+id-E-RABFailedToModifyListBearerModConf                ProtocolIE-ID ::= 205
+id-SON-Information-Report                            ProtocolIE-ID ::= 206
+id-Muting-Availability-Indication                    ProtocolIE-ID ::= 207
+id-Muting-Pattern-Information                        ProtocolIE-ID ::= 208
+id-Synchronisation-Information                        ProtocolIE-ID ::= 209
+id-E-RABToBeReleasedListBearerModConf                ProtocolIE-ID ::= 210
+id-AssistanceDataForPaging                            ProtocolIE-ID ::= 211
+id-CellIdentifierAndCELevelForCECapableUEs            ProtocolIE-ID ::= 212
+id-InformationOnRecommendedCellsAndENBsForPaging    ProtocolIE-ID ::= 213
+id-RecommendedCellItem                                ProtocolIE-ID ::= 214
+id-RecommendedENBItem                                ProtocolIE-ID ::= 215
+id-ProSeUEtoNetworkRelaying                            ProtocolIE-ID ::= 216
+id-ULCOUNTValuePDCP-SNlength18                        ProtocolIE-ID ::= 217
+id-DLCOUNTValuePDCP-SNlength18                        ProtocolIE-ID ::= 218
+id-ReceiveStatusOfULPDCPSDUsPDCP-SNlength18            ProtocolIE-ID ::= 219
+id-M6Configuration                                    ProtocolIE-ID ::= 220
+id-M7Configuration                                    ProtocolIE-ID ::= 221
+id-PWSfailedECGIList                                ProtocolIE-ID ::= 222
+id-MME-Group-ID                                        ProtocolIE-ID ::= 223
+id-Additional-GUTI                                    ProtocolIE-ID ::= 224
+id-S1-Message                                        ProtocolIE-ID ::= 225
+id-CSGMembershipInfo                                ProtocolIE-ID ::= 226
+id-Paging-eDRXInformation                            ProtocolIE-ID ::= 227
+id-UE-RetentionInformation                            ProtocolIE-ID ::= 228
+id-UE-Usage-Type                                    ProtocolIE-ID ::= 230
+id-extended-UEIdentityIndexValue                    ProtocolIE-ID ::= 231
+id-RAT-Type                                            ProtocolIE-ID ::= 232
+id-BearerType                                        ProtocolIE-ID ::= 233
+id-NB-IoT-DefaultPagingDRX                            ProtocolIE-ID ::= 234
+id-E-RABFailedToResumeListResumeReq                    ProtocolIE-ID ::= 235
+id-E-RABFailedToResumeItemResumeReq                    ProtocolIE-ID ::= 236
+id-E-RABFailedToResumeListResumeRes                    ProtocolIE-ID ::= 237
+id-E-RABFailedToResumeItemResumeRes                    ProtocolIE-ID ::= 238
+id-NB-IoT-Paging-eDRXInformation                    ProtocolIE-ID ::= 239
+id-V2XServicesAuthorized                            ProtocolIE-ID ::= 240
+id-UEUserPlaneCIoTSupportIndicator                     ProtocolIE-ID ::= 241
+id-CE-mode-B-SupportIndicator                         ProtocolIE-ID ::= 242
+id-SRVCCOperationNotPossible                        ProtocolIE-ID ::= 243
+id-NB-IoT-UEIdentityIndexValue                         ProtocolIE-ID ::= 244
+id-RRC-Resume-Cause                                    ProtocolIE-ID ::= 245
+id-DCN-ID                                            ProtocolIE-ID ::= 246
+id-ServedDCNs                                         ProtocolIE-ID ::= 247
+id-UESidelinkAggregateMaximumBitrate                 ProtocolIE-ID ::= 248
+id-DLNASPDUDeliveryAckRequest                        ProtocolIE-ID ::= 249
+id-Coverage-Level                                     ProtocolIE-ID ::= 250
+id-EnhancedCoverageRestricted                        ProtocolIE-ID ::= 251
+id-UE-Level-QoS-Parameters                            ProtocolIE-ID ::= 252
+id-DL-CP-SecurityInformation                        ProtocolIE-ID ::= 253
+id-UL-CP-SecurityInformation                        ProtocolIE-ID ::= 254
+id-extended-e-RAB-MaximumBitrateDL                    ProtocolIE-ID ::= 255
+id-extended-e-RAB-MaximumBitrateUL                    ProtocolIE-ID ::= 256
+id-extended-e-RAB-GuaranteedBitrateDL                ProtocolIE-ID ::= 257
+id-extended-e-RAB-GuaranteedBitrateUL                ProtocolIE-ID ::= 258
+id-extended-uEaggregateMaximumBitRateDL                ProtocolIE-ID ::= 259
+id-extended-uEaggregateMaximumBitRateUL                ProtocolIE-ID ::= 260
+id-NRrestrictioninEPSasSecondaryRAT                    ProtocolIE-ID ::= 261
+id-UEAppLayerMeasConfig                                ProtocolIE-ID ::= 262
+id-UE-Application-Layer-Measurement-Capability        ProtocolIE-ID ::= 263
+id-SecondaryRATDataUsageReportList                    ProtocolIE-ID ::= 264
+id-SecondaryRATDataUsageReportItem                    ProtocolIE-ID ::= 265
+id-HandoverFlag                                        ProtocolIE-ID ::= 266
+id-E-RABUsageReportItem                                ProtocolIE-ID ::= 267
+id-SecondaryRATDataUsageRequest                        ProtocolIE-ID ::= 268
+id-NRUESecurityCapabilities                            ProtocolIE-ID ::= 269
+id-UnlicensedSpectrumRestriction                    ProtocolIE-ID ::= 270
+id-CE-ModeBRestricted                                ProtocolIE-ID ::= 271
+id-LTE-M-Indication                                    ProtocolIE-ID ::= 272
+id-DownlinkPacketLossRate                            ProtocolIE-ID ::= 273
+id-UplinkPacketLossRate                                ProtocolIE-ID ::= 274
+id-UECapabilityInfoRequest                            ProtocolIE-ID ::= 275
+id-serviceType                                        ProtocolIE-ID ::= 276
+id-AerialUEsubscriptionInformation                    ProtocolIE-ID ::= 277
+id-Subscription-Based-UE-DifferentiationInfo        ProtocolIE-ID ::= 278
+id-EndIndication                                    ProtocolIE-ID ::= 280
+id-EDT-Session                                        ProtocolIE-ID ::= 281
+id-CNTypeRestrictions                                ProtocolIE-ID ::= 282
+id-PendingDataIndication                            ProtocolIE-ID ::= 283
+id-BluetoothMeasurementConfiguration                ProtocolIE-ID ::= 284
+id-WLANMeasurementConfiguration                        ProtocolIE-ID ::= 285
+id-WarningAreaCoordinates                            ProtocolIE-ID ::= 286
+id-NRrestrictionin5GS                                ProtocolIE-ID ::= 287
+id-PSCellInformation                                ProtocolIE-ID ::= 288
+id-LastNG-RANPLMNIdentity                            ProtocolIE-ID ::= 290
+id-ConnectedengNBList                                ProtocolIE-ID ::= 291
+id-ConnectedengNBToAddList                            ProtocolIE-ID ::= 292
+id-ConnectedengNBToRemoveList                        ProtocolIE-ID ::= 293
+id-EN-DCSONConfigurationTransfer-ECT                ProtocolIE-ID ::= 294
+id-EN-DCSONConfigurationTransfer-MCT                ProtocolIE-ID ::= 295
+id-IMSvoiceEPSfallbackfrom5G                        ProtocolIE-ID ::= 296
+id-TimeSinceSecondaryNodeRelease                    ProtocolIE-ID ::= 297
+id-RequestTypeAdditionalInfo                        ProtocolIE-ID ::= 298
+
+END
diff --git a/src/s1ap/asn1c/asnGenFiles/asn1c/S1AP-Containers.asn b/src/s1ap/asn1c/asnGenFiles/asn1c/S1AP-Containers.asn
new file mode 100644
index 0000000..23f48e5
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/asn1c/S1AP-Containers.asn
@@ -0,0 +1,204 @@
+-- **************************************************************
+--
+-- Container definitions
+--
+-- **************************************************************
+
+S1AP-Containers {
+itu-t (0) identified-organization (4) etsi (0) mobileDomain (0) 
+eps-Access (21) modules (3) s1ap (1) version1 (1) s1ap-Containers (5) }
+
+DEFINITIONS AUTOMATIC TAGS ::= 
+
+BEGIN
+
+-- **************************************************************
+--
+-- IE parameter types from other modules.
+--
+-- **************************************************************
+
+IMPORTS
+    Criticality,
+    Presence,
+    PrivateIE-ID,
+    ProtocolExtensionID,
+    ProtocolIE-ID
+FROM S1AP-CommonDataTypes
+
+    maxPrivateIEs,
+    maxProtocolExtensions,
+    maxProtocolIEs
+
+FROM S1AP-Constants
+    
+    Criticality,
+    maxnoofE-RABs
+
+FROM S1AP-IEs;
+
+
+-- **************************************************************
+--
+-- Class Definition for Protocol IEs
+--
+-- **************************************************************
+
+S1AP-PROTOCOL-IES ::= CLASS {
+    &id                ProtocolIE-ID                     UNIQUE,
+    &criticality    Criticality,
+    &Value,
+    &presence        Presence
+}
+WITH SYNTAX {
+    ID                &id
+    CRITICALITY        &criticality
+    TYPE            &Value
+    PRESENCE        &presence
+}
+
+-- **************************************************************
+--
+-- Class Definition for Protocol IEs
+--
+-- **************************************************************
+
+S1AP-PROTOCOL-IES-PAIR ::= CLASS {
+    &id                    ProtocolIE-ID                 UNIQUE,
+    &firstCriticality    Criticality,
+    &FirstValue,
+    &secondCriticality    Criticality,
+    &SecondValue,
+    &presence            Presence
+}
+WITH SYNTAX {
+    ID                &id
+    FIRST CRITICALITY        &firstCriticality
+    FIRST TYPE                &FirstValue
+    SECOND CRITICALITY        &secondCriticality
+    SECOND TYPE                &SecondValue
+    PRESENCE                &presence
+}
+
+-- **************************************************************
+--
+-- Class Definition for Protocol Extensions
+--
+-- **************************************************************
+
+S1AP-PROTOCOL-EXTENSION ::= CLASS {
+    &id                ProtocolExtensionID            UNIQUE,
+    &criticality    Criticality,
+    &Extension,
+    &presence        Presence
+}
+WITH SYNTAX {
+    ID                &id
+    CRITICALITY        &criticality
+    EXTENSION        &Extension
+    PRESENCE        &presence
+}
+
+-- **************************************************************
+--
+-- Class Definition for Private IEs
+--
+-- **************************************************************
+
+S1AP-PRIVATE-IES ::= CLASS {
+    &id                PrivateIE-ID,
+    &criticality    Criticality,
+    &Value,
+    &presence        Presence
+}
+WITH SYNTAX {
+    ID                &id
+    CRITICALITY        &criticality
+    TYPE            &Value
+    PRESENCE        &presence
+}
+
+-- **************************************************************
+--
+-- Container for Protocol IEs
+--
+-- **************************************************************
+
+ProtocolIE-Container {S1AP-PROTOCOL-IES : IEsSetParam} ::= 
+    SEQUENCE (SIZE (0..maxProtocolIEs)) OF
+    ProtocolIE-Field {{IEsSetParam}}
+
+ProtocolIE-SingleContainer {S1AP-PROTOCOL-IES : IEsSetParam} ::= 
+    ProtocolIE-Field {{IEsSetParam}}
+
+ProtocolIE-Field {S1AP-PROTOCOL-IES : IEsSetParam} ::= SEQUENCE {
+    id                S1AP-PROTOCOL-IES.&id                ({IEsSetParam}),
+    criticality        S1AP-PROTOCOL-IES.&criticality        ({IEsSetParam}{@id}),
+    value            S1AP-PROTOCOL-IES.&Value            ({IEsSetParam}{@id})
+}
+
+-- **************************************************************
+--
+-- Container for Protocol IE Pairs
+--
+-- **************************************************************
+
+ProtocolIE-ContainerPair {S1AP-PROTOCOL-IES-PAIR : IEsSetParam} ::= 
+    SEQUENCE (SIZE (0..maxProtocolIEs)) OF
+    ProtocolIE-FieldPair {{IEsSetParam}}
+
+ProtocolIE-FieldPair {S1AP-PROTOCOL-IES-PAIR : IEsSetParam} ::= SEQUENCE {
+    id                    S1AP-PROTOCOL-IES-PAIR.&id                    ({IEsSetParam}),
+    firstCriticality    S1AP-PROTOCOL-IES-PAIR.&firstCriticality    ({IEsSetParam}{@id}),
+    firstValue            S1AP-PROTOCOL-IES-PAIR.&FirstValue            ({IEsSetParam}{@id}),
+    secondCriticality    S1AP-PROTOCOL-IES-PAIR.&secondCriticality    ({IEsSetParam}{@id}),
+    secondValue            S1AP-PROTOCOL-IES-PAIR.&SecondValue        ({IEsSetParam}{@id})
+}
+
+-- **************************************************************
+--
+-- Container Lists for Protocol IE Containers
+--
+-- **************************************************************
+
+ProtocolIE-ContainerList {INTEGER : lowerBound, INTEGER : upperBound, S1AP-PROTOCOL-IES : IEsSetParam} ::=
+    SEQUENCE (SIZE (lowerBound..upperBound)) OF
+    ProtocolIE-SingleContainer {{IEsSetParam}}
+
+ProtocolIE-ContainerPairList {INTEGER : lowerBound, INTEGER : upperBound, S1AP-PROTOCOL-IES-PAIR : IEsSetParam} ::=
+    SEQUENCE (SIZE (lowerBound..upperBound)) OF
+    ProtocolIE-ContainerPair {{IEsSetParam}}
+
+-- **************************************************************
+--
+-- Container for Protocol Extensions
+--
+-- **************************************************************
+
+ProtocolExtensionContainer {S1AP-PROTOCOL-EXTENSION : ExtensionSetParam} ::= 
+    SEQUENCE (SIZE (1..maxProtocolExtensions)) OF
+    ProtocolExtensionField {{ExtensionSetParam}}
+
+ProtocolExtensionField {S1AP-PROTOCOL-EXTENSION : ExtensionSetParam} ::= SEQUENCE {
+    id                    S1AP-PROTOCOL-EXTENSION.&id                ({ExtensionSetParam}),
+    criticality            S1AP-PROTOCOL-EXTENSION.&criticality    ({ExtensionSetParam}{@id}),
+    extensionValue        S1AP-PROTOCOL-EXTENSION.&Extension        ({ExtensionSetParam}{@id})
+}
+
+-- **************************************************************
+--
+-- Container for Private IEs
+--
+-- **************************************************************
+
+PrivateIE-Container {S1AP-PRIVATE-IES : IEsSetParam } ::= 
+    SEQUENCE (SIZE (1.. maxPrivateIEs)) OF
+    PrivateIE-Field {{IEsSetParam}}
+
+PrivateIE-Field {S1AP-PRIVATE-IES : IEsSetParam} ::= SEQUENCE {
+    id                    S1AP-PRIVATE-IES.&id                ({IEsSetParam}),
+    criticality            S1AP-PRIVATE-IES.&criticality        ({IEsSetParam}{@id}),
+    value                S1AP-PRIVATE-IES.&Value                ({IEsSetParam}{@id})
+}
+
+END
diff --git a/src/s1ap/asn1c/asnGenFiles/asn1c/S1AP-IEs.asn b/src/s1ap/asn1c/asnGenFiles/asn1c/S1AP-IEs.asn
new file mode 100644
index 0000000..f46e195
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/asn1c/S1AP-IEs.asn
@@ -0,0 +1,2817 @@
+-- **************************************************************
+--
+-- Information Element Definitions
+--
+-- **************************************************************
+
+S1AP-IEs {
+itu-t (0) identified-organization (4) etsi (0) mobileDomain (0) 
+eps-Access (21) modules (3) s1ap (1) version1 (1) s1ap-IEs (2) }
+
+DEFINITIONS AUTOMATIC TAGS ::= 
+
+BEGIN
+
+IMPORTS
+    id-E-RABInformationListItem,
+    id-E-RABItem,
+    id-Bearers-SubjectToStatusTransfer-Item,
+    id-Time-Synchronisation-Info,
+    id-x2TNLConfigurationInfo,
+    id-eNBX2ExtendedTransportLayerAddresses,
+    id-MDTConfiguration,
+    id-Time-UE-StayedInCell-EnhancedGranularity,
+    id-HO-Cause,
+    id-M3Configuration,
+    id-M4Configuration,
+    id-M5Configuration,
+    id-MDT-Location-Info,
+    id-SignallingBasedMDTPLMNList,
+    id-MobilityInformation,
+    id-ULCOUNTValueExtended,
+    id-DLCOUNTValueExtended,
+    id-ReceiveStatusOfULPDCPSDUsExtended,
+    id-eNBIndirectX2TransportLayerAddresses,
+    id-Muting-Availability-Indication,
+    id-Muting-Pattern-Information,
+    id-NRrestrictioninEPSasSecondaryRAT,
+    id-NRrestrictionin5GS,
+    id-Synchronisation-Information,
+    id-uE-HistoryInformationFromTheUE,
+    id-LoggedMBSFNMDT,
+    id-SON-Information-Report,
+    id-RecommendedCellItem,
+    id-RecommendedENBItem,
+    id-ProSeUEtoNetworkRelaying,
+    id-ULCOUNTValuePDCP-SNlength18,
+    id-DLCOUNTValuePDCP-SNlength18,
+    id-ReceiveStatusOfULPDCPSDUsPDCP-SNlength18,
+    id-M6Configuration,
+    id-M7Configuration,
+    id-RAT-Type,
+    id-extended-e-RAB-MaximumBitrateDL,
+    id-extended-e-RAB-MaximumBitrateUL,
+    id-extended-e-RAB-GuaranteedBitrateDL,
+    id-extended-e-RAB-GuaranteedBitrateUL,
+    id-extended-uEaggregateMaximumBitRateDL,
+    id-extended-uEaggregateMaximumBitRateUL,
+    id-SecondaryRATDataUsageReportItem,
+    id-E-RABUsageReportItem,
+    id-UEAppLayerMeasConfig,
+    id-serviceType,
+    id-UnlicensedSpectrumRestriction, 
+    id-CNTypeRestrictions,
+    id-DownlinkPacketLossRate,
+    id-UplinkPacketLossRate,
+    id-BluetoothMeasurementConfiguration,
+    id-WLANMeasurementConfiguration,
+    id-LastNG-RANPLMNIdentity,
+    id-PSCellInformation,
+    id-IMSvoiceEPSfallbackfrom5G,
+    id-RequestTypeAdditionalInfo,
+    maxnoofE-RABs,
+    maxnoofCSGs,
+    maxnoofErrors,
+    maxnoofBPLMNs,
+    maxnoofPLMNsPerMME,
+    maxnoofTACs,
+    maxnoofEPLMNs,
+    maxnoofEPLMNsPlusOne,
+    maxnoofForbLACs,
+    maxnoofForbTACs,
+    maxnoofCellsinUEHistoryInfo,
+    maxnoofCellID,
+    maxnoofDCNs,
+    maxnoofEmergencyAreaID,
+    maxnoofTAIforWarning,
+    maxnoofCellinTAI,
+    maxnoofCellinEAI,
+    maxnoofeNBX2TLAs,
+    maxnoofeNBX2ExtTLAs,
+    maxnoofeNBX2GTPTLAs,
+    maxnoofRATs,
+    maxnoofGroupIDs,
+    maxnoofMMECs,
+    maxnoofTAforMDT,
+    maxnoofCellIDforMDT,
+    maxnoofMDTPLMNs,
+    maxnoofCellsforRestart,
+    maxnoofRestartTAIs,
+    maxnoofRestartEmergencyAreaIDs,
+    maxnoofMBSFNAreaMDT,
+    maxEARFCN,
+    maxnoofCellsineNB,
+    maxnoofRecommendedCells,
+    maxnoofRecommendedENBs,
+    maxnooftimeperiods,
+    maxnoofCellIDforQMC,
+    maxnoofTAforQMC,
+    maxnoofPLMNforQMC,
+    maxnoofBluetoothName,
+    maxnoofWLANName,
+    maxnoofConnectedengNBs
+
+
+
+
+FROM S1AP-Constants
+    
+    Criticality,
+    ProcedureCode,
+    ProtocolIE-ID,
+    TriggeringMessage
+FROM S1AP-CommonDataTypes
+
+    ProtocolExtensionContainer{},
+    S1AP-PROTOCOL-EXTENSION,
+    ProtocolIE-SingleContainer{},
+    S1AP-PROTOCOL-IES
+
+FROM S1AP-Containers;    
+
+-- A
+
+Additional-GUTI::= SEQUENCE {
+    gUMMEI                    GUMMEI,
+    m-TMSI                    M-TMSI,
+    iE-Extensions            ProtocolExtensionContainer { {Additional-GUTI-ExtIEs} } OPTIONAL,
+    ...
+}
+
+Additional-GUTI-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+AerialUEsubscriptionInformation ::= ENUMERATED { 
+    allowed,
+    not-allowed,
+    ...
+}
+
+AreaScopeOfMDT ::= CHOICE {    
+    cellBased                    CellBasedMDT,
+    tABased                        TABasedMDT,
+    pLMNWide                    NULL,
+    ...,
+    tAIBased                    TAIBasedMDT
+}
+
+
+AreaScopeOfQMC ::= CHOICE {    
+    cellBased                    CellBasedQMC,
+    tABased                        TABasedQMC,
+    tAIBased                        TAIBasedQMC,
+    pLMNAreaBased                PLMNAreaBasedQMC,
+    ...
+}
+
+AllocationAndRetentionPriority ::= SEQUENCE {
+    priorityLevel                PriorityLevel,
+    pre-emptionCapability        Pre-emptionCapability,
+    pre-emptionVulnerability    Pre-emptionVulnerability,
+    iE-Extensions                ProtocolExtensionContainer { {AllocationAndRetentionPriority-ExtIEs} } OPTIONAL,
+    ...
+}
+
+AllocationAndRetentionPriority-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+AssistanceDataForCECapableUEs ::= SEQUENCE {
+    cellIdentifierAndCELevelForCECapableUEs        CellIdentifierAndCELevelForCECapableUEs,
+    iE-Extensions                                ProtocolExtensionContainer { { InformationForCECapableUEs-ExtIEs} } OPTIONAL,
+    ...
+}
+
+InformationForCECapableUEs-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+AssistanceDataForPaging ::= SEQUENCE {
+    assistanceDataForRecommendedCells    AssistanceDataForRecommendedCells        OPTIONAL,
+    assistanceDataForCECapableUEs        AssistanceDataForCECapableUEs            OPTIONAL,
+    pagingAttemptInformation            PagingAttemptInformation                OPTIONAL,
+    iE-Extensions                        ProtocolExtensionContainer { { AssistanceDataForPaging-ExtIEs} }    OPTIONAL,
+    ...
+}
+
+AssistanceDataForPaging-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+AssistanceDataForRecommendedCells ::= SEQUENCE {
+    recommendedCellsForPaging    RecommendedCellsForPaging, 
+    iE-Extensions                ProtocolExtensionContainer { { AssistanceDataForRecommendedCells-ExtIEs} }    OPTIONAL,
+    ...
+}
+
+AssistanceDataForRecommendedCells-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+-- B
+
+Bearers-SubjectToStatusTransferList ::= SEQUENCE (SIZE(1.. maxnoofE-RABs)) OF ProtocolIE-SingleContainer { { Bearers-SubjectToStatusTransfer-ItemIEs } }
+
+Bearers-SubjectToStatusTransfer-ItemIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-Bearers-SubjectToStatusTransfer-Item    CRITICALITY ignore    TYPE Bearers-SubjectToStatusTransfer-Item     PRESENCE mandatory    },
+    ...
+}
+
+Bearers-SubjectToStatusTransfer-Item ::= SEQUENCE {
+    e-RAB-ID                                E-RAB-ID,
+    uL-COUNTvalue                            COUNTvalue,
+    dL-COUNTvalue                            COUNTvalue,
+    receiveStatusofULPDCPSDUs                ReceiveStatusofULPDCPSDUs            OPTIONAL,
+    iE-Extensions                            ProtocolExtensionContainer { {Bearers-SubjectToStatusTransfer-ItemExtIEs} } OPTIONAL,
+    ...
+}
+
+Bearers-SubjectToStatusTransfer-ItemExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    { ID id-ULCOUNTValueExtended                        CRITICALITY ignore    EXTENSION COUNTValueExtended                PRESENCE optional}|
+    { ID id-DLCOUNTValueExtended                        CRITICALITY ignore    EXTENSION COUNTValueExtended                PRESENCE optional}|
+    { ID id-ReceiveStatusOfULPDCPSDUsExtended            CRITICALITY ignore    EXTENSION ReceiveStatusOfULPDCPSDUsExtended        PRESENCE optional}|
+    { ID id-ULCOUNTValuePDCP-SNlength18                    CRITICALITY ignore    EXTENSION COUNTvaluePDCP-SNlength18            PRESENCE optional}|
+    { ID id-DLCOUNTValuePDCP-SNlength18                    CRITICALITY ignore    EXTENSION COUNTvaluePDCP-SNlength18            PRESENCE optional}|
+    { ID id-ReceiveStatusOfULPDCPSDUsPDCP-SNlength18    CRITICALITY ignore    EXTENSION ReceiveStatusOfULPDCPSDUsPDCP-SNlength18    PRESENCE optional},
+    ...
+}
+
+BearerType ::= ENUMERATED {
+    non-IP,
+    ...
+}
+
+BitRate    ::= INTEGER (0..10000000000) 
+
+BluetoothMeasurementConfiguration ::= SEQUENCE {
+    bluetoothMeasConfig             BluetoothMeasConfig,
+    bluetoothMeasConfigNameList        BluetoothMeasConfigNameList     OPTIONAL,
+    bt-rssi                         ENUMERATED {true, ...}          OPTIONAL,
+    iE-Extensions        ProtocolExtensionContainer { { BluetoothMeasurementConfiguration-ExtIEs } } OPTIONAL,
+    ...
+}
+
+BluetoothMeasurementConfiguration-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+BluetoothMeasConfigNameList ::= SEQUENCE (SIZE(1..maxnoofBluetoothName)) OF BluetoothName
+
+BluetoothMeasConfig::= ENUMERATED {setup,...}
+
+BluetoothName ::= OCTET STRING (SIZE (1..248))
+
+BPLMNs ::= SEQUENCE (SIZE(1.. maxnoofBPLMNs)) OF PLMNidentity
+
+BroadcastCancelledAreaList ::= CHOICE {
+    cellID-Cancelled                CellID-Cancelled,
+    tAI-Cancelled                    TAI-Cancelled,
+    emergencyAreaID-Cancelled        EmergencyAreaID-Cancelled,
+    ...
+}
+
+BroadcastCompletedAreaList ::= CHOICE {
+    cellID-Broadcast                CellID-Broadcast,
+    tAI-Broadcast                    TAI-Broadcast,
+    emergencyAreaID-Broadcast        EmergencyAreaID-Broadcast,
+    ...
+}
+
+
+-- C
+
+CancelledCellinEAI ::= SEQUENCE (SIZE(1..maxnoofCellinEAI)) OF CancelledCellinEAI-Item
+
+CancelledCellinEAI-Item ::= SEQUENCE {
+    eCGI                    EUTRAN-CGI,
+    numberOfBroadcasts        NumberOfBroadcasts,
+    iE-Extensions            ProtocolExtensionContainer { {CancelledCellinEAI-Item-ExtIEs} } OPTIONAL,
+    ...
+}
+
+CancelledCellinEAI-Item-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+CancelledCellinTAI ::= SEQUENCE (SIZE(1..maxnoofCellinTAI)) OF CancelledCellinTAI-Item
+
+CancelledCellinTAI-Item ::= SEQUENCE{
+    eCGI                EUTRAN-CGI,
+    numberOfBroadcasts    NumberOfBroadcasts,
+    iE-Extensions        ProtocolExtensionContainer { {CancelledCellinTAI-Item-ExtIEs} } OPTIONAL,
+    ...
+}
+
+CancelledCellinTAI-Item-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+Cause ::= CHOICE {
+    radioNetwork        CauseRadioNetwork,
+    transport            CauseTransport,
+    nas                    CauseNas,
+    protocol            CauseProtocol,
+    misc                CauseMisc,
+    ...
+}
+
+CauseMisc ::= ENUMERATED {
+    control-processing-overload,
+    not-enough-user-plane-processing-resources,
+    hardware-failure,
+    om-intervention,
+    unspecified,
+    unknown-PLMN,
+...
+}
+
+CauseProtocol ::= ENUMERATED {
+    transfer-syntax-error,
+    abstract-syntax-error-reject,
+    abstract-syntax-error-ignore-and-notify,
+    message-not-compatible-with-receiver-state,
+    semantic-error,
+    abstract-syntax-error-falsely-constructed-message,
+    unspecified,
+    ...
+}
+
+CauseRadioNetwork ::= ENUMERATED {
+    unspecified,
+    tx2relocoverall-expiry,
+    successful-handover,
+    release-due-to-eutran-generated-reason,
+    handover-cancelled,    
+    partial-handover,    
+    ho-failure-in-target-EPC-eNB-or-target-system,
+    ho-target-not-allowed,
+    tS1relocoverall-expiry,
+    tS1relocprep-expiry,
+    cell-not-available,
+    unknown-targetID,
+    no-radio-resources-available-in-target-cell,
+    unknown-mme-ue-s1ap-id,
+    unknown-enb-ue-s1ap-id,
+    unknown-pair-ue-s1ap-id,
+    handover-desirable-for-radio-reason,
+    time-critical-handover,
+    resource-optimisation-handover,
+    reduce-load-in-serving-cell,
+    user-inactivity,
+    radio-connection-with-ue-lost,
+    load-balancing-tau-required,
+    cs-fallback-triggered,
+    ue-not-available-for-ps-service,
+    radio-resources-not-available,
+    failure-in-radio-interface-procedure,
+    invalid-qos-combination,
+    interrat-redirection,
+    interaction-with-other-procedure,
+    unknown-E-RAB-ID,
+    multiple-E-RAB-ID-instances,
+    encryption-and-or-integrity-protection-algorithms-not-supported,
+    s1-intra-system-handover-triggered,
+    s1-inter-system-handover-triggered,
+    x2-handover-triggered,
+    ...,
+    redirection-towards-1xRTT,
+    not-supported-QCI-value,
+    invalid-CSG-Id,
+    release-due-to-pre-emption
+
+}
+
+CauseTransport ::= ENUMERATED {
+    transport-resource-unavailable,
+    unspecified,
+    ...
+}
+
+CauseNas ::= ENUMERATED {
+    normal-release,
+    authentication-failure,
+    detach,
+    unspecified,
+    ...,
+    csg-subscription-expiry
+}
+
+CellAccessMode ::= ENUMERATED {
+    hybrid, 
+    ...
+}
+
+CellIdentifierAndCELevelForCECapableUEs ::= SEQUENCE {
+    global-Cell-ID        EUTRAN-CGI,
+    cELevel                CELevel,
+    iE-Extensions        ProtocolExtensionContainer { { CellIdentifierAndCELevelForCECapableUEs-ExtIEs} } OPTIONAL,
+    ...
+}
+
+CellIdentifierAndCELevelForCECapableUEs-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+-- Coverage Enhancement level encoded according to TS 36.331 [16] --
+CELevel ::= OCTET STRING
+
+CE-mode-B-SupportIndicator ::= ENUMERATED {
+    supported,
+    ...
+}
+
+CellIdentity ::= BIT STRING (SIZE (28))
+
+CellID-Broadcast ::= SEQUENCE (SIZE(1..maxnoofCellID)) OF CellID-Broadcast-Item
+
+CellID-Broadcast-Item ::= SEQUENCE {
+    eCGI                EUTRAN-CGI,
+    iE-Extensions        ProtocolExtensionContainer { {CellID-Broadcast-Item-ExtIEs} } OPTIONAL,
+    ...
+}
+
+CellID-Broadcast-Item-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+CellID-Cancelled::= SEQUENCE (SIZE(1..maxnoofCellID)) OF CellID-Cancelled-Item
+
+CellID-Cancelled-Item ::= SEQUENCE {
+    eCGI                EUTRAN-CGI,
+    numberOfBroadcasts    NumberOfBroadcasts,
+    iE-Extensions        ProtocolExtensionContainer { {CellID-Cancelled-Item-ExtIEs} } OPTIONAL,
+    ...
+}
+
+CellID-Cancelled-Item-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+CellBasedMDT::= SEQUENCE {
+    cellIdListforMDT    CellIdListforMDT,
+    iE-Extensions        ProtocolExtensionContainer { {CellBasedMDT-ExtIEs} } OPTIONAL,
+    ...
+}
+
+CellBasedMDT-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+CellIdListforMDT ::= SEQUENCE (SIZE(1..maxnoofCellIDforMDT)) OF EUTRAN-CGI
+
+CellBasedQMC::= SEQUENCE {
+    cellIdListforQMC        CellIdListforQMC,
+    iE-Extensions        ProtocolExtensionContainer { {CellBasedQMC-ExtIEs} } OPTIONAL,
+    ...
+}
+
+CellBasedQMC-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+CellIdListforQMC ::= SEQUENCE (SIZE(1..maxnoofCellIDforQMC)) OF EUTRAN-CGI
+
+Cdma2000PDU    ::= OCTET STRING
+
+Cdma2000RATType ::= ENUMERATED {
+    hRPD,
+    onexRTT,
+    ...
+}
+
+Cdma2000SectorID ::= OCTET STRING
+
+Cdma2000HOStatus ::= ENUMERATED {
+    hOSuccess,
+    hOFailure,
+    ...
+}
+
+Cdma2000HORequiredIndication ::= ENUMERATED {
+    true,
+    ...
+}
+
+Cdma2000OneXSRVCCInfo ::= SEQUENCE {
+    cdma2000OneXMEID            Cdma2000OneXMEID,
+    cdma2000OneXMSI                Cdma2000OneXMSI,
+    cdma2000OneXPilot            Cdma2000OneXPilot,
+    iE-Extensions                ProtocolExtensionContainer { {Cdma2000OneXSRVCCInfo-ExtIEs} } OPTIONAL,
+    ...
+}
+
+Cdma2000OneXSRVCCInfo-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+Cdma2000OneXMEID ::= OCTET STRING
+
+Cdma2000OneXMSI ::= OCTET STRING
+
+Cdma2000OneXPilot ::= OCTET STRING
+
+Cdma2000OneXRAND ::= OCTET STRING
+
+
+Cell-Size ::= ENUMERATED {verysmall, small, medium, large, ...}
+
+CellType ::= SEQUENCE {
+    cell-Size                Cell-Size,
+    iE-Extensions            ProtocolExtensionContainer { { CellType-ExtIEs}}    OPTIONAL,
+    ...
+}
+
+CellType-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+CGI ::= SEQUENCE {
+    pLMNidentity    PLMNidentity,
+    lAC                LAC,
+    cI                CI,
+    rAC                RAC                                                OPTIONAL,
+    iE-Extensions    ProtocolExtensionContainer { {CGI-ExtIEs} }        OPTIONAL,
+    ...
+    }
+
+CGI-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+CI                    ::= OCTET STRING (SIZE (2))
+
+CNDomain ::= ENUMERATED {
+    ps, 
+    cs 
+}
+
+CNTypeRestrictions::= SEQUENCE (SIZE(1.. maxnoofEPLMNsPlusOne)) OF CNTypeRestrictions-Item
+
+CNTypeRestrictions-Item ::= SEQUENCE {
+    pLMN-Identity        PLMNidentity,
+    cNType                CNType,
+    iE-Extensions        ProtocolExtensionContainer { { CNTypeRestrictions-Item-ExtIEs} } OPTIONAL,
+    ...
+}
+
+CNTypeRestrictions-Item-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+CNType ::= ENUMERATED {
+    fiveGCForbidden,
+    ...,
+    epc-Forbiddden
+}
+
+ConcurrentWarningMessageIndicator ::= ENUMERATED {
+    true
+}
+
+ConnectedengNBList ::= SEQUENCE (SIZE(1..maxnoofConnectedengNBs)) OF ConnectedengNBItem
+
+ConnectedengNBItem ::= SEQUENCE {
+    en-gNB-ID        En-gNB-ID,
+    supportedTAs    SupportedTAs,
+    iE-Extensions    ProtocolExtensionContainer { {ConnectedengNBItem-ExtIEs} }    OPTIONAL,
+    ...
+}
+
+ConnectedengNBItem-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+Correlation-ID        ::= OCTET STRING (SIZE (4))
+
+CSFallbackIndicator ::= ENUMERATED { 
+    cs-fallback-required,
+    ...,
+    cs-fallback-high-priority 
+}
+
+AdditionalCSFallbackIndicator ::= ENUMERATED { 
+    no-restriction,
+    restriction,
+    ...
+}
+
+CSG-Id        ::= BIT STRING (SIZE (27))
+
+
+CSG-IdList ::= SEQUENCE (SIZE (1.. maxnoofCSGs)) OF CSG-IdList-Item
+
+CSG-IdList-Item ::= SEQUENCE {
+    cSG-Id            CSG-Id,
+    iE-Extensions    ProtocolExtensionContainer { {CSG-IdList-Item-ExtIEs} }    OPTIONAL,
+    ...
+}
+
+CSG-IdList-Item-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+CSGMembershipStatus ::= ENUMERATED { 
+    member, 
+    not-member
+}
+
+
+COUNTvalue ::= SEQUENCE {
+    pDCP-SN            PDCP-SN,
+    hFN                HFN,
+    iE-Extensions    ProtocolExtensionContainer { {COUNTvalue-ExtIEs} } OPTIONAL,
+    ...
+}
+COUNTvalue-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+COUNTValueExtended  ::= SEQUENCE {
+    pDCP-SNExtended        PDCP-SNExtended,
+    hFNModified            HFNModified,
+    iE-Extensions        ProtocolExtensionContainer { {COUNTValueExtended-ExtIEs} } OPTIONAL,
+    ...
+}
+
+COUNTValueExtended-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+COUNTvaluePDCP-SNlength18 ::= SEQUENCE {
+    pDCP-SNlength18                PDCP-SNlength18,
+    hFNforPDCP-SNlength18        HFNforPDCP-SNlength18,
+    iE-Extensions                ProtocolExtensionContainer { {COUNTvaluePDCP-SNlength18-ExtIEs} } OPTIONAL,
+    ...
+}
+
+COUNTvaluePDCP-SNlength18-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+Coverage-Level ::= ENUMERATED {
+    extendedcoverage,
+    ...
+}
+
+CriticalityDiagnostics ::= SEQUENCE {
+    procedureCode                    ProcedureCode                                                        OPTIONAL,
+    triggeringMessage                TriggeringMessage                                                    OPTIONAL,
+    procedureCriticality            Criticality                                                            OPTIONAL,
+    iEsCriticalityDiagnostics        CriticalityDiagnostics-IE-List                                        OPTIONAL,
+    iE-Extensions                    ProtocolExtensionContainer {{CriticalityDiagnostics-ExtIEs}}        OPTIONAL,
+    ...
+}
+
+CriticalityDiagnostics-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+CriticalityDiagnostics-IE-List ::= SEQUENCE (SIZE (1.. maxnoofErrors)) OF CriticalityDiagnostics-IE-Item
+
+CriticalityDiagnostics-IE-Item ::= SEQUENCE {
+    iECriticality            Criticality,
+    iE-ID                    ProtocolIE-ID,
+    typeOfError             TypeOfError,
+    iE-Extensions            ProtocolExtensionContainer {{CriticalityDiagnostics-IE-Item-ExtIEs}}    OPTIONAL,
+    ...
+}
+
+CriticalityDiagnostics-IE-Item-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+
+-- D
+
+DataCodingScheme ::= BIT STRING (SIZE (8))
+
+DCN-ID ::= INTEGER (0..65535)
+
+ServedDCNs ::= SEQUENCE (SIZE(0..maxnoofDCNs)) OF ServedDCNsItem
+
+ServedDCNsItem ::= SEQUENCE {
+    dCN-ID                        DCN-ID,
+    relativeDCNCapacity            RelativeMMECapacity,
+    iE-Extensions            ProtocolExtensionContainer { {ServedDCNsItem-ExtIEs} }    OPTIONAL,
+    ...
+}
+
+ServedDCNsItem-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+DL-CP-SecurityInformation ::= SEQUENCE {
+    dl-NAS-MAC                DL-NAS-MAC,
+    iE-Extensions            ProtocolExtensionContainer { { DL-CP-SecurityInformation-ExtIEs} }    OPTIONAL,
+    ...
+}
+
+DL-CP-SecurityInformation-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+DL-Forwarding ::= ENUMERATED {
+    dL-Forwarding-proposed,
+    ...
+}
+
+DL-NAS-MAC ::= BIT STRING (SIZE (16))
+
+Direct-Forwarding-Path-Availability ::= ENUMERATED {
+    directPathAvailable,
+    ...
+}
+
+Data-Forwarding-Not-Possible ::= ENUMERATED {
+    data-Forwarding-not-Possible,
+    ...
+}
+
+DLNASPDUDeliveryAckRequest ::= ENUMERATED {
+    requested,
+    ...
+}
+
+-- E
+
+EARFCN ::= INTEGER(0..maxEARFCN, ...)
+
+ECGIList ::= SEQUENCE (SIZE(1..maxnoofCellID)) OF EUTRAN-CGI
+
+PWSfailedECGIList ::= SEQUENCE (SIZE(1..maxnoofCellsineNB)) OF EUTRAN-CGI
+
+EDT-Session ::= ENUMERATED {
+    true,
+    ...
+}
+
+EmergencyAreaIDList ::= SEQUENCE (SIZE(1..maxnoofEmergencyAreaID)) OF EmergencyAreaID
+
+EmergencyAreaID ::= OCTET STRING (SIZE (3))
+
+EmergencyAreaID-Broadcast ::= SEQUENCE (SIZE(1..maxnoofEmergencyAreaID)) OF EmergencyAreaID-Broadcast-Item
+
+EmergencyAreaID-Broadcast-Item ::= SEQUENCE {
+    emergencyAreaID            EmergencyAreaID,
+    completedCellinEAI        CompletedCellinEAI,
+    iE-Extensions            ProtocolExtensionContainer { {EmergencyAreaID-Broadcast-Item-ExtIEs} }    OPTIONAL,
+    ...
+}
+
+EmergencyAreaID-Broadcast-Item-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+EmergencyAreaID-Cancelled ::= SEQUENCE (SIZE(1..maxnoofEmergencyAreaID)) OF EmergencyAreaID-Cancelled-Item
+
+EmergencyAreaID-Cancelled-Item ::= SEQUENCE {
+    emergencyAreaID            EmergencyAreaID,
+    cancelledCellinEAI        CancelledCellinEAI,
+    iE-Extensions            ProtocolExtensionContainer { {EmergencyAreaID-Cancelled-Item-ExtIEs} }    OPTIONAL,
+    ...
+}
+
+EmergencyAreaID-Cancelled-Item-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+CompletedCellinEAI ::= SEQUENCE (SIZE(1..maxnoofCellinEAI)) OF CompletedCellinEAI-Item
+
+CompletedCellinEAI-Item ::= SEQUENCE {
+    eCGI                    EUTRAN-CGI,
+    iE-Extensions            ProtocolExtensionContainer { {CompletedCellinEAI-Item-ExtIEs} }    OPTIONAL,
+    ...
+}
+
+CompletedCellinEAI-Item-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+ECGI-List ::= SEQUENCE (SIZE(1..maxnoofCellsineNB)) OF EUTRAN-CGI
+
+EmergencyAreaIDListForRestart    ::= SEQUENCE (SIZE(1..maxnoofRestartEmergencyAreaIDs)) OF EmergencyAreaID
+
+ENB-ID ::= CHOICE {
+    macroENB-ID            BIT STRING (SIZE(20)),
+    homeENB-ID            BIT STRING (SIZE(28)),
+    ... ,
+    short-macroENB-ID     BIT STRING (SIZE(18)),
+    long-macroENB-ID        BIT STRING (SIZE(21))
+}
+
+En-gNB-ID ::= BIT STRING (SIZE(22..32, ...))
+
+GERAN-Cell-ID ::= SEQUENCE {
+    lAI                LAI,
+    rAC                RAC, 
+    cI                CI,
+    iE-Extensions            ProtocolExtensionContainer { { GERAN-Cell-ID-ExtIEs} }    OPTIONAL,
+    ...
+}
+
+GERAN-Cell-ID-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+Global-ENB-ID ::= SEQUENCE {
+    pLMNidentity            PLMNidentity,
+    eNB-ID                    ENB-ID,
+    iE-Extensions            ProtocolExtensionContainer { {GlobalENB-ID-ExtIEs} }        OPTIONAL,
+    ...
+}
+
+GlobalENB-ID-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+Global-en-gNB-ID ::= SEQUENCE {
+    pLMNidentity            PLMNidentity,
+    en-gNB-ID                En-gNB-ID,
+    iE-Extensions            ProtocolExtensionContainer { {Global-en-gNB-ID-ExtIEs} }        OPTIONAL,
+    ...
+}
+
+Global-en-gNB-ID-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+GUMMEIList::= SEQUENCE (SIZE (1.. maxnoofMMECs)) OF GUMMEI
+
+ENB-StatusTransfer-TransparentContainer        ::= SEQUENCE {
+    bearers-SubjectToStatusTransferList        Bearers-SubjectToStatusTransferList,
+    iE-Extensions            ProtocolExtensionContainer { {ENB-StatusTransfer-TransparentContainer-ExtIEs} }    OPTIONAL,
+    ...
+}
+
+ENB-StatusTransfer-TransparentContainer-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+ENB-UE-S1AP-ID                ::= INTEGER (0..16777215)
+
+ENBname ::= PrintableString (SIZE (1..150,...))
+
+ENBX2TLAs ::= SEQUENCE (SIZE(1.. maxnoofeNBX2TLAs)) OF TransportLayerAddress
+
+EncryptionAlgorithms ::= BIT STRING (SIZE (16,...)) 
+
+EN-DCSONConfigurationTransfer ::= SEQUENCE {
+    transfertype                EN-DCSONTransferType,
+    sONInformation                    SONInformation,
+    x2TNLConfigInfo                    X2TNLConfigurationInfo     OPTIONAL,
+    -- This IE shall be present if the SON Information IE contains the SON Information Request IE and the SON Information Request IE is set to “X2TNL Configuration Info” --
+    iE-Extensions            ProtocolExtensionContainer { {EN-DCSONConfigurationTransfer-ExtIEs} }            OPTIONAL,
+...
+}
+
+EN-DCSONConfigurationTransfer-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+EN-DCSONTransferType ::= CHOICE {
+    request                EN-DCTransferTypeRequest,
+    reply                EN-DCTransferTypeReply,
+    ...
+}
+
+EN-DCTransferTypeRequest ::= SEQUENCE {
+    sourceeNB                 EN-DCSONeNBIdentification,
+    targetengNB                EN-DCSONengNBIdentification,
+    targeteNB                EN-DCSONeNBIdentification                                                    OPTIONAL,
+    associatedTAI            TAI                                                                            OPTIONAL,
+    broadcast5GSTAI            FiveGSTAI                                                                    OPTIONAL,
+    iE-Extensions            ProtocolExtensionContainer { {EN-DCTransferTypeRequest-ExtIEs} }            OPTIONAL,
+...
+}
+
+EN-DCTransferTypeRequest-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+EN-DCTransferTypeReply ::= SEQUENCE {
+    sourceengNB                EN-DCSONengNBIdentification,
+    targeteNB                 EN-DCSONeNBIdentification,
+    iE-Extensions            ProtocolExtensionContainer { {EN-DCTransferTypeReply-ExtIEs} }            OPTIONAL,
+...
+}
+
+EN-DCTransferTypeReply-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+EN-DCSONeNBIdentification ::= SEQUENCE {
+    globaleNBID                Global-ENB-ID,
+    selectedTAI                TAI,
+    iE-Extensions            ProtocolExtensionContainer { {EN-DCSONeNBIdentification-ExtIEs} }            OPTIONAL,
+...
+}
+
+EN-DCSONeNBIdentification-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+EN-DCSONengNBIdentification ::= SEQUENCE {
+    globalengNBID            Global-en-gNB-ID,
+    selectedTAI                TAI,
+    iE-Extensions            ProtocolExtensionContainer { {EN-DCSONengNBIdentification-ExtIEs} }            OPTIONAL,
+...
+}
+
+EN-DCSONengNBIdentification-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+EndIndication ::= ENUMERATED {
+    no-further-data,
+    further-data-exists,
+    ...
+}
+
+EnhancedCoverageRestricted ::= ENUMERATED {
+    restricted,
+    ...
+}
+
+CE-ModeBRestricted ::= ENUMERATED {
+    restricted,
+    not-restricted,
+    ...
+}
+
+EPLMNs ::= SEQUENCE (SIZE(1..maxnoofEPLMNs)) OF PLMNidentity
+EventType    ::= ENUMERATED {
+    direct,
+    change-of-serve-cell,
+    stop-change-of-serve-cell,
+    ...
+}
+
+E-RAB-ID        ::= INTEGER (0..15, ...)
+
+E-RABInformationList    ::= SEQUENCE (SIZE (1.. maxnoofE-RABs)) OF ProtocolIE-SingleContainer { { E-RABInformationListIEs } }
+
+E-RABInformationListIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-E-RABInformationListItem            CRITICALITY ignore    TYPE E-RABInformationListItem            PRESENCE mandatory    },
+    ...
+}
+
+E-RABInformationListItem ::= SEQUENCE {
+    e-RAB-ID                        E-RAB-ID,
+    dL-Forwarding                    DL-Forwarding        OPTIONAL,
+    iE-Extensions                    ProtocolExtensionContainer { {E-RABInformationListItem-ExtIEs} }            OPTIONAL,
+    ...
+}
+
+E-RABInformationListItem-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+E-RABList ::= SEQUENCE (SIZE(1.. maxnoofE-RABs)) OF ProtocolIE-SingleContainer { {E-RABItemIEs} }
+
+E-RABItemIEs     S1AP-PROTOCOL-IES ::= {
+    { ID id-E-RABItem     CRITICALITY ignore     TYPE E-RABItem     PRESENCE mandatory },
+    ...
+}
+
+E-RABItem ::= SEQUENCE {
+    e-RAB-ID                    E-RAB-ID,
+    cause                        Cause,
+    iE-Extensions                ProtocolExtensionContainer { {E-RABItem-ExtIEs} } OPTIONAL,
+    ...
+}
+
+E-RABItem-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+
+E-RABLevelQoSParameters ::= SEQUENCE {
+    qCI            QCI,
+    allocationRetentionPriority        AllocationAndRetentionPriority,
+    gbrQosInformation                    GBR-QosInformation                                                OPTIONAL,
+    iE-Extensions                        ProtocolExtensionContainer { {E-RABQoSParameters-ExtIEs} }    OPTIONAL,
+    ...
+}
+
+E-RABUsageReportList ::= SEQUENCE (SIZE(1..maxnooftimeperiods)) OF ProtocolIE-SingleContainer { {E-RABUsageReportItemIEs} }
+
+E-RABUsageReportItemIEs     S1AP-PROTOCOL-IES ::= {
+    { ID id-E-RABUsageReportItem     CRITICALITY ignore     TYPE E-RABUsageReportItem     PRESENCE mandatory },
+    ...
+}
+
+E-RABUsageReportItem ::= SEQUENCE {
+    startTimestamp                    OCTET STRING (SIZE(4)),
+    endTimestamp                    OCTET STRING (SIZE(4)),
+    usageCountUL                    INTEGER,
+    usageCountDL                    INTEGER,
+    iE-Extensions                ProtocolExtensionContainer { { E-RABUsageReportItem-ExtIEs} } OPTIONAL,
+    ...
+}
+
+E-RABUsageReportItem-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+E-RABQoSParameters-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+-- Extended for introduction of downlink and uplink packet loss rate for enhanced Voice performance –-
+    { ID id-DownlinkPacketLossRate        CRITICALITY ignore    EXTENSION Packet-LossRate        PRESENCE optional}|
+    { ID id-UplinkPacketLossRate            CRITICALITY ignore    EXTENSION Packet-LossRate        PRESENCE optional},
+    ...
+}
+
+
+EUTRAN-CGI ::= SEQUENCE {
+    pLMNidentity            PLMNidentity,
+    cell-ID                    CellIdentity,
+    iE-Extensions            ProtocolExtensionContainer { {EUTRAN-CGI-ExtIEs} } OPTIONAL,
+    ...
+}
+
+EUTRAN-CGI-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+EUTRANRoundTripDelayEstimationInfo ::= INTEGER (0..2047)
+
+ExpectedUEBehaviour ::= SEQUENCE {
+    expectedActivity        ExpectedUEActivityBehaviour OPTIONAL,
+    expectedHOInterval        ExpectedHOInterval             OPTIONAL,
+    iE-Extensions        ProtocolExtensionContainer { { ExpectedUEBehaviour-ExtIEs} } OPTIONAL,
+    ...
+}
+
+ExpectedUEBehaviour-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+ExpectedUEActivityBehaviour ::= SEQUENCE {
+    expectedActivityPeriod                    ExpectedActivityPeriod                    OPTIONAL,
+    expectedIdlePeriod                        ExpectedIdlePeriod                        OPTIONAL,
+    sourceofUEActivityBehaviourInformation    SourceOfUEActivityBehaviourInformation    OPTIONAL,
+    iE-Extensions        ProtocolExtensionContainer { { ExpectedUEActivityBehaviour-ExtIEs} } OPTIONAL,
+    ...
+}
+
+ExpectedUEActivityBehaviour-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+ExpectedActivityPeriod ::= INTEGER (1..30|40|50|60|80|100|120|150|180|181,...)
+
+ExpectedIdlePeriod ::= INTEGER (1..30|40|50|60|80|100|120|150|180|181,...)
+
+SourceOfUEActivityBehaviourInformation ::= ENUMERATED {
+    subscription-information,
+    statistics,
+    ...
+}
+
+ExpectedHOInterval ::= ENUMERATED {
+    sec15, sec30, sec60, sec90, sec120, sec180, long-time,
+    ...
+}
+
+ExtendedBitRate    ::= INTEGER (10000000001..4000000000000, ...) 
+
+ExtendedRNC-ID                    ::= INTEGER (4096..65535)
+
+ExtendedRepetitionPeriod ::= INTEGER (4096..131071) 
+
+Extended-UEIdentityIndexValue ::= BIT STRING (SIZE (14))
+
+-- F
+
+FiveGSTAC ::= OCTET STRING (SIZE (3))
+
+FiveGSTAI ::= SEQUENCE {
+    pLMNidentity            PLMNidentity,
+    fiveGSTAC                FiveGSTAC,
+    iE-Extensions            ProtocolExtensionContainer { {FiveGSTAI-ExtIEs} } OPTIONAL,
+    ...
+}
+
+FiveGSTAI-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+ForbiddenInterRATs ::= ENUMERATED {
+    all,
+    geran,
+    utran,
+    cdma2000,
+    ...,
+    geranandutran,
+    cdma2000andutran
+
+}
+
+ForbiddenTAs ::= SEQUENCE (SIZE(1.. maxnoofEPLMNsPlusOne)) OF ForbiddenTAs-Item
+
+ForbiddenTAs-Item ::= SEQUENCE {
+    pLMN-Identity        PLMNidentity,
+    forbiddenTACs        ForbiddenTACs,
+    iE-Extensions        ProtocolExtensionContainer { {ForbiddenTAs-Item-ExtIEs} } OPTIONAL,
+    ...
+}
+
+ForbiddenTAs-Item-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+ForbiddenTACs ::= SEQUENCE (SIZE(1..maxnoofForbTACs)) OF TAC
+
+ForbiddenLAs ::= SEQUENCE (SIZE(1..maxnoofEPLMNsPlusOne)) OF ForbiddenLAs-Item
+
+ForbiddenLAs-Item ::= SEQUENCE {
+    pLMN-Identity        PLMNidentity,
+    forbiddenLACs        ForbiddenLACs,
+    iE-Extensions        ProtocolExtensionContainer { {ForbiddenLAs-Item-ExtIEs} } OPTIONAL,
+    ...
+}
+
+ForbiddenLAs-Item-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+ForbiddenLACs ::= SEQUENCE (SIZE(1..maxnoofForbLACs)) OF LAC
+
+-- G
+
+GBR-QosInformation ::= SEQUENCE {
+    e-RAB-MaximumBitrateDL            BitRate,
+    e-RAB-MaximumBitrateUL            BitRate,
+    e-RAB-GuaranteedBitrateDL        BitRate,
+    e-RAB-GuaranteedBitrateUL        BitRate,
+    iE-Extensions                    ProtocolExtensionContainer { { GBR-QosInformation-ExtIEs} } OPTIONAL,
+    ...
+}
+
+GBR-QosInformation-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+-- Extension for maximum bitrate > 10G bps --    
+    { ID id-extended-e-RAB-MaximumBitrateDL    CRITICALITY ignore    EXTENSION ExtendedBitRate    PRESENCE optional}|
+    { ID id-extended-e-RAB-MaximumBitrateUL    CRITICALITY ignore    EXTENSION ExtendedBitRate    PRESENCE optional}|
+    { ID id-extended-e-RAB-GuaranteedBitrateDL    CRITICALITY ignore    EXTENSION ExtendedBitRate    PRESENCE optional}|
+    { ID id-extended-e-RAB-GuaranteedBitrateUL    CRITICALITY ignore    EXTENSION ExtendedBitRate    PRESENCE optional},
+    ...}
+
+
+GTP-TEID                    ::= OCTET STRING (SIZE (4))
+
+GUMMEI            ::= SEQUENCE {
+    pLMN-Identity        PLMNidentity,
+    mME-Group-ID        MME-Group-ID,
+    mME-Code            MME-Code,
+    iE-Extensions        ProtocolExtensionContainer { {GUMMEI-ExtIEs} } OPTIONAL,
+    ...
+}
+
+GUMMEI-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+GUMMEIType ::= ENUMERATED {
+    native,
+    mapped,
+    ...,
+    mappedFrom5G
+}
+
+GWContextReleaseIndication ::= ENUMERATED {
+    true,
+    ...
+}
+
+-- H
+
+HandoverFlag ::= ENUMERATED {
+    handoverPreparation,
+    ...
+}
+
+
+HandoverRestrictionList ::= SEQUENCE {
+    servingPLMN                    PLMNidentity,
+    equivalentPLMNs                EPLMNs                    OPTIONAL,
+    forbiddenTAs                ForbiddenTAs            OPTIONAL,
+    forbiddenLAs                ForbiddenLAs            OPTIONAL,
+    forbiddenInterRATs            ForbiddenInterRATs        OPTIONAL, 
+    iE-Extensions                ProtocolExtensionContainer { {HandoverRestrictionList-ExtIEs} }    OPTIONAL,
+    ...
+}
+
+HandoverRestrictionList-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    { ID id-NRrestrictioninEPSasSecondaryRAT        CRITICALITY ignore    EXTENSION NRrestrictioninEPSasSecondaryRAT        PRESENCE optional}|
+    { ID id-UnlicensedSpectrumRestriction        CRITICALITY ignore    EXTENSION UnlicensedSpectrumRestriction    PRESENCE optional}|
+    { ID id-CNTypeRestrictions        CRITICALITY ignore    EXTENSION CNTypeRestrictions    PRESENCE optional}|
+    { ID id-NRrestrictionin5GS        CRITICALITY ignore    EXTENSION NRrestrictionin5GS     PRESENCE optional}|
+    { ID id-LastNG-RANPLMNIdentity        CRITICALITY ignore    EXTENSION PLMNidentity            PRESENCE optional},
+    ...
+}
+
+HandoverType ::= ENUMERATED {
+    intralte,
+    ltetoutran,
+    ltetogeran,
+    utrantolte,
+    gerantolte,
+    ...,
+    eps-to-5gs,
+    fivegs-to-eps
+}
+
+HFN ::= INTEGER (0..1048575)
+
+HFNModified ::= INTEGER (0..131071)
+
+HFNforPDCP-SNlength18 ::= INTEGER (0..16383)
+
+-- I
+
+Masked-IMEISV ::= BIT STRING (SIZE (64))
+
+ImmediateMDT ::= SEQUENCE { 
+    measurementsToActivate        MeasurementsToActivate,
+    m1reportingTrigger            M1ReportingTrigger,
+    m1thresholdeventA2            M1ThresholdEventA2                OPTIONAL,
+-- Included in case of event-triggered, or event-triggered periodic reporting for measurement M1
+    m1periodicReporting            M1PeriodicReporting                OPTIONAL,
+-- Included in case of periodic or event-triggered periodic reporting
+    iE-Extensions                ProtocolExtensionContainer { { ImmediateMDT-ExtIEs} } OPTIONAL,
+    ...
+}
+
+ImmediateMDT-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    { ID id-M3Configuration        CRITICALITY ignore    EXTENSION M3Configuration        PRESENCE conditional}|
+    { ID id-M4Configuration        CRITICALITY ignore    EXTENSION M4Configuration        PRESENCE conditional}|
+    { ID id-M5Configuration        CRITICALITY ignore    EXTENSION M5Configuration        PRESENCE conditional}|
+    { ID id-MDT-Location-Info    CRITICALITY ignore    EXTENSION MDT-Location-Info        PRESENCE optional}|
+    { ID id-M6Configuration        CRITICALITY ignore    EXTENSION M6Configuration        PRESENCE conditional}|
+    { ID id-M7Configuration        CRITICALITY ignore    EXTENSION M7Configuration        PRESENCE conditional}|
+    { ID id-BluetoothMeasurementConfiguration        CRITICALITY ignore    EXTENSION BluetoothMeasurementConfiguration        PRESENCE optional}|
+    { ID id-WLANMeasurementConfiguration        CRITICALITY ignore    EXTENSION WLANMeasurementConfiguration        PRESENCE optional},
+    ...
+}
+
+IMSI    ::=    OCTET STRING (SIZE (3..8))
+
+InformationOnRecommendedCellsAndENBsForPaging ::= SEQUENCE {
+    recommendedCellsForPaging    RecommendedCellsForPaging,
+    recommendENBsForPaging        RecommendedENBsForPaging,
+    iE-Extensions                ProtocolExtensionContainer { { InformationOnRecommendedCellsAndENBsForPaging-ExtIEs} }    OPTIONAL,
+    ...
+}
+
+InformationOnRecommendedCellsAndENBsForPaging-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+IntegrityProtectionAlgorithms ::= BIT STRING (SIZE (16,...))
+
+IntendedNumberOfPagingAttempts ::= INTEGER (1..16, ...)
+
+InterfacesToTrace ::= BIT STRING (SIZE (8))
+
+IMSvoiceEPSfallbackfrom5G ::= ENUMERATED {
+    true,
+    ...
+}
+
+
+-- J
+-- K
+
+KillAllWarningMessages ::= ENUMERATED {true}
+
+-- L
+
+
+LAC    ::= OCTET STRING (SIZE (2))
+
+LAI ::= SEQUENCE {
+    pLMNidentity                PLMNidentity,
+    lAC                LAC,
+    iE-Extensions            ProtocolExtensionContainer { {LAI-ExtIEs} } OPTIONAL,
+    ...
+}
+
+LAI-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+LastVisitedCell-Item ::= CHOICE {
+    e-UTRAN-Cell                    LastVisitedEUTRANCellInformation,
+    uTRAN-Cell                        LastVisitedUTRANCellInformation,
+    gERAN-Cell                        LastVisitedGERANCellInformation,
+    ...,
+    nG-RAN-Cell                        LastVisitedNGRANCellInformation
+}
+LastVisitedEUTRANCellInformation ::= SEQUENCE {
+    global-Cell-ID                    EUTRAN-CGI,
+    cellType                        CellType,
+    time-UE-StayedInCell            Time-UE-StayedInCell,
+    iE-Extensions                    ProtocolExtensionContainer { { LastVisitedEUTRANCellInformation-ExtIEs} } OPTIONAL,
+    ...
+}
+LastVisitedEUTRANCellInformation-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+-- Extension for Rel-11 to support enhanced granularity for time UE stayed in cell --
+    { ID id-Time-UE-StayedInCell-EnhancedGranularity    CRITICALITY ignore    EXTENSION Time-UE-StayedInCell-EnhancedGranularity    PRESENCE optional}|
+    { ID id-HO-Cause                                    CRITICALITY ignore    EXTENSION Cause                            PRESENCE optional},
+    ...
+}
+
+LastVisitedNGRANCellInformation    ::= OCTET STRING
+
+LastVisitedUTRANCellInformation    ::= OCTET STRING
+
+LastVisitedGERANCellInformation ::= CHOICE {
+    undefined                        NULL,
+    ...
+}
+
+L3-Information                ::= OCTET STRING
+-- This is a dummy IE used only as a reference to the actual definition in relevant specification.
+
+LPPa-PDU ::=  OCTET STRING
+
+LHN-ID ::=  OCTET STRING(SIZE (32..256))
+
+Links-to-log ::= ENUMERATED {uplink, downlink, both-uplink-and-downlink, ...} 
+
+ListeningSubframePattern ::= SEQUENCE {
+    pattern-period                ENUMERATED {ms1280, ms2560, ms5120, ms10240, ...},
+    pattern-offset                INTEGER (0..10239, ...),
+    iE-Extensions                ProtocolExtensionContainer { { ListeningSubframePattern-ExtIEs} } OPTIONAL,
+    ...
+}
+
+ListeningSubframePattern-ExtIEs    S1AP-PROTOCOL-EXTENSION ::= {
+...
+}
+
+LoggedMDT ::= SEQUENCE {
+    loggingInterval                LoggingInterval,
+    loggingDuration                LoggingDuration,
+    iE-Extensions                ProtocolExtensionContainer { {LoggedMDT-ExtIEs} } OPTIONAL,
+    ...
+}
+
+LoggedMDT-ExtIEs    S1AP-PROTOCOL-EXTENSION ::= {
+    { ID id-BluetoothMeasurementConfiguration        CRITICALITY ignore    EXTENSION BluetoothMeasurementConfiguration        PRESENCE optional}|
+    { ID id-WLANMeasurementConfiguration            CRITICALITY ignore    EXTENSION WLANMeasurementConfiguration                PRESENCE optional},
+...
+}
+
+LoggingInterval ::= ENUMERATED {ms128, ms256, ms512, ms1024, ms2048, ms3072, ms4096, ms6144}
+
+LoggingDuration ::= ENUMERATED {m10, m20, m40, m60, m90, m120}
+
+LoggedMBSFNMDT ::= SEQUENCE {
+    loggingInterval                LoggingInterval,
+    loggingDuration                LoggingDuration,
+    mBSFN-ResultToLog            MBSFN-ResultToLog        OPTIONAL,
+    iE-Extensions                ProtocolExtensionContainer { { LoggedMBSFNMDT-ExtIEs } } OPTIONAL,
+    ...
+}
+
+LoggedMBSFNMDT-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+LTE-M-Indication ::= ENUMERATED {lte-m, ... }
+
+-- M
+
+M3Configuration ::= SEQUENCE {
+    m3period            M3period,
+    iE-Extensions        ProtocolExtensionContainer { { M3Configuration-ExtIEs} } OPTIONAL,
+    ...
+}
+
+M3Configuration-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+M3period ::= ENUMERATED {ms100, ms1000, ms10000, ...,ms1024, ms1280, ms2048, ms2560, ms5120, ms10240, min1 } 
+
+M4Configuration ::= SEQUENCE {
+    m4period            M4period,
+    m4-links-to-log        Links-to-log,
+    iE-Extensions        ProtocolExtensionContainer { { M4Configuration-ExtIEs} } OPTIONAL,
+    ...
+}
+
+M4Configuration-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+M4period ::= ENUMERATED {ms1024, ms2048, ms5120, ms10240, min1, ... } 
+
+M5Configuration ::= SEQUENCE {
+    m5period            M5period,
+    m5-links-to-log        Links-to-log,
+    iE-Extensions        ProtocolExtensionContainer { { M5Configuration-ExtIEs} } OPTIONAL,
+    ...
+}
+
+M5Configuration-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+M5period ::= ENUMERATED {ms1024, ms2048, ms5120, ms10240, min1, ... } 
+
+M6Configuration ::= SEQUENCE {
+    m6report-Interval    M6report-Interval,
+    m6delay-threshold    M6delay-threshold        OPTIONAL,
+-- This IE shall be present if the M6 Links to log IE is set to “uplink” or to “both-uplink-and-downlink” --
+    m6-links-to-log        Links-to-log,
+    iE-Extensions        ProtocolExtensionContainer { { M6Configuration-ExtIEs} } OPTIONAL,
+    ...
+}
+
+M6Configuration-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+M6report-Interval ::= ENUMERATED { ms1024, ms2048, ms5120, ms10240, ... }
+
+M6delay-threshold ::= ENUMERATED { ms30, ms40, ms50, ms60, ms70, ms80, ms90, ms100, ms150, ms300, ms500, ms750, ... }
+
+M7Configuration ::= SEQUENCE {
+    m7period            M7period,
+    m7-links-to-log        Links-to-log,
+    iE-Extensions        ProtocolExtensionContainer { { M7Configuration-ExtIEs} } OPTIONAL,
+    ...
+}
+
+M7Configuration-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+M7period ::= INTEGER(1..60, ...)
+
+MDT-Activation     ::= ENUMERATED { 
+    immediate-MDT-only,
+    immediate-MDT-and-Trace,
+    logged-MDT-only,
+    ...,
+    logged-MBSFN-MDT
+}
+
+MDT-Location-Info ::= BIT STRING (SIZE (8))
+
+MDT-Configuration ::= SEQUENCE {
+    mdt-Activation        MDT-Activation,
+    areaScopeOfMDT        AreaScopeOfMDT,
+    mDTMode                MDTMode,
+    iE-Extensions        ProtocolExtensionContainer { { MDT-Configuration-ExtIEs} } OPTIONAL,
+    ...
+}
+MDT-Configuration-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    { ID id-SignallingBasedMDTPLMNList            CRITICALITY ignore    EXTENSION MDTPLMNList    PRESENCE optional    },
+    ...
+}
+
+ManagementBasedMDTAllowed ::= ENUMERATED {allowed, ...}
+
+MBSFN-ResultToLog ::= SEQUENCE (SIZE(1..maxnoofMBSFNAreaMDT)) OF MBSFN-ResultToLogInfo
+
+MBSFN-ResultToLogInfo ::= SEQUENCE {
+    mBSFN-AreaId        INTEGER (0..255)        OPTIONAL,
+    carrierFreq            EARFCN,    
+    iE-Extensions        ProtocolExtensionContainer { { MBSFN-ResultToLogInfo-ExtIEs} } OPTIONAL,
+    ...
+}
+
+MBSFN-ResultToLogInfo-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+MDTPLMNList ::= SEQUENCE (SIZE(1..maxnoofMDTPLMNs)) OF PLMNidentity
+
+PrivacyIndicator ::= ENUMERATED {
+    immediate-MDT,
+    logged-MDT,
+    ...
+}
+
+MDTMode ::= CHOICE {
+    immediateMDT                ImmediateMDT,
+    loggedMDT                    LoggedMDT,
+    ...,
+    mDTMode-Extension            MDTMode-Extension
+}
+
+MDTMode-Extension ::= ProtocolIE-SingleContainer {{ MDTMode-ExtensionIE }}
+
+MDTMode-ExtensionIE S1AP-PROTOCOL-IES ::= {
+    { ID id-LoggedMBSFNMDT        CRITICALITY ignore    TYPE LoggedMBSFNMDT        PRESENCE mandatory}
+}
+
+MeasurementsToActivate ::= BIT STRING (SIZE (8))
+
+MeasurementThresholdA2 ::= CHOICE { 
+    threshold-RSRP                Threshold-RSRP,
+    threshold-RSRQ                Threshold-RSRQ,
+    ...
+}
+
+MessageIdentifier    ::= BIT STRING (SIZE (16))
+
+MobilityInformation ::= BIT STRING (SIZE(32))
+
+MMEname ::= PrintableString (SIZE (1..150,...))
+
+MMEPagingTarget ::= CHOICE {
+    global-ENB-ID        Global-ENB-ID,
+    tAI                    TAI,
+    ...
+}
+
+MMERelaySupportIndicator ::= ENUMERATED {true, ...}
+
+MME-Group-ID    ::= OCTET STRING (SIZE (2))
+
+MME-Code        ::= OCTET STRING (SIZE (1))
+
+MME-UE-S1AP-ID    ::= INTEGER (0..4294967295)
+M-TMSI            ::= OCTET STRING (SIZE (4))
+
+MSClassmark2    ::= OCTET STRING
+MSClassmark3    ::= OCTET STRING
+
+MutingAvailabilityIndication ::= ENUMERATED {
+    available,
+    unavailable,
+    ...
+}
+
+
+MutingPatternInformation ::= SEQUENCE {
+    muting-pattern-period                ENUMERATED {ms0, ms1280, ms2560, ms5120, ms10240, ...},
+    muting-pattern-offset                INTEGER (0..10239, ...)        OPTIONAL,
+    iE-Extensions                        ProtocolExtensionContainer { {MutingPatternInformation-ExtIEs} } OPTIONAL,
+    ...
+}
+
+MutingPatternInformation-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+-- N
+
+NAS-PDU ::=  OCTET STRING
+
+NASSecurityParametersfromE-UTRAN ::= OCTET STRING
+
+NASSecurityParameterstoE-UTRAN ::= OCTET STRING
+
+NB-IoT-DefaultPagingDRX ::= ENUMERATED {
+    v128,
+    v256,
+    v512,
+    v1024,
+    ...
+    }
+
+NB-IoT-Paging-eDRXInformation ::= SEQUENCE { 
+    nB-IoT-paging-eDRX-Cycle        NB-IoT-Paging-eDRX-Cycle,
+    nB-IoT-pagingTimeWindow            NB-IoT-PagingTimeWindow            OPTIONAL,
+    iE-Extensions                    ProtocolExtensionContainer { { NB-IoT-Paging-eDRXInformation-ExtIEs} } OPTIONAL,
+    ...
+}
+
+NB-IoT-Paging-eDRXInformation-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+NB-IoT-Paging-eDRX-Cycle ::= ENUMERATED{hf2, hf4, hf6, hf8, hf10, hf12, hf14, hf16, hf32, hf64, hf128, hf256, hf512, hf1024, ...}
+
+NB-IoT-PagingTimeWindow ::= ENUMERATED{s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, ...}
+
+NB-IoT-UEIdentityIndexValue ::= BIT STRING (SIZE (12))
+
+NextPagingAreaScope ::= ENUMERATED {
+    same,
+    changed,
+    ...
+}
+
+
+NRCellIdentity ::= BIT STRING (SIZE(36))
+
+NR-CGI ::= SEQUENCE {
+    pLMNIdentity        PLMNidentity,
+    nRCellIdentity        NRCellIdentity,
+    iE-Extensions        ProtocolExtensionContainer { {NR-CGI-ExtIEs} } OPTIONAL,
+    ...
+}
+
+NR-CGI-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+
+NRencryptionAlgorithms ::= BIT STRING (SIZE (16,...))
+NRintegrityProtectionAlgorithms ::= BIT STRING (SIZE (16,...))
+
+NRrestrictioninEPSasSecondaryRAT ::= ENUMERATED {
+    nRrestrictedinEPSasSecondaryRAT,
+    ...
+}
+
+NRrestrictionin5GS ::= ENUMERATED {
+    nRrestrictedin5GS,
+    ...
+}
+
+NRUESecurityCapabilities ::= SEQUENCE {
+    nRencryptionAlgorithms                NRencryptionAlgorithms,
+    nRintegrityProtectionAlgorithms        NRintegrityProtectionAlgorithms,
+    iE-Extensions                        ProtocolExtensionContainer { { NRUESecurityCapabilities-ExtIEs} }    OPTIONAL,
+...
+}
+
+NRUESecurityCapabilities-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+NumberofBroadcastRequest ::= INTEGER (0..65535)
+
+NumberOfBroadcasts ::= INTEGER (0..65535)
+
+-- O
+OldBSS-ToNewBSS-Information        ::= OCTET STRING
+-- This is a dummy IE used only as a reference to the actual definition in relevant specification.
+
+OverloadAction ::= ENUMERATED {
+    reject-non-emergency-mo-dt,
+    reject-rrc-cr-signalling,
+    permit-emergency-sessions-and-mobile-terminated-services-only,
+    ...,
+    permit-high-priority-sessions-and-mobile-terminated-services-only,
+    reject-delay-tolerant-access,
+    permit-high-priority-sessions-and-exception-reporting-and-mobile-terminated-services-only,
+    not-accept-mo-data-or-delay-tolerant-access-from-CP-CIoT
+
+}
+
+OverloadResponse ::= CHOICE {
+    overloadAction                    OverloadAction,
+    ...
+}
+
+
+-- P
+
+Packet-LossRate    ::= INTEGER(0..1000)
+
+PagingAttemptInformation ::= SEQUENCE {
+    pagingAttemptCount                    PagingAttemptCount,
+    intendedNumberOfPagingAttempts        IntendedNumberOfPagingAttempts,
+    nextPagingAreaScope                    NextPagingAreaScope        OPTIONAL,
+    iE-Extensions                        ProtocolExtensionContainer { { PagingAttemptInformation-ExtIEs} } OPTIONAL,
+    ...
+}
+
+PagingAttemptInformation-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+PagingAttemptCount ::= INTEGER (1..16, ...)
+
+Paging-eDRXInformation ::= SEQUENCE { 
+    paging-eDRX-Cycle            Paging-eDRX-Cycle,
+    pagingTimeWindow            PagingTimeWindow            OPTIONAL,
+    iE-Extensions                ProtocolExtensionContainer { { Paging-eDRXInformation-ExtIEs} } OPTIONAL,
+    ...
+}
+
+Paging-eDRXInformation-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+Paging-eDRX-Cycle ::= ENUMERATED{hfhalf, hf1, hf2, hf4, hf6, hf8, hf10, hf12, hf14, hf16, hf32, hf64, hf128, hf256, ...}
+
+PagingTimeWindow ::= ENUMERATED{s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, ...}
+
+PagingDRX ::= ENUMERATED {
+    v32,
+    v64,
+    v128,
+    v256,
+    ...
+    }
+
+PagingPriority ::= ENUMERATED {
+    priolevel1,
+    priolevel2,
+    priolevel3,
+    priolevel4,
+    priolevel5,
+    priolevel6,
+    priolevel7,
+    priolevel8,
+    ...
+}
+
+PDCP-SN ::= INTEGER (0..4095)
+
+PDCP-SNExtended ::= INTEGER (0..32767)
+
+PDCP-SNlength18 ::= INTEGER (0..262143)
+
+PendingDataIndication ::= ENUMERATED {
+    true,
+    ...
+}
+
+M1PeriodicReporting ::= SEQUENCE { 
+    reportInterval                ReportIntervalMDT,
+    reportAmount                ReportAmountMDT,
+    iE-Extensions                ProtocolExtensionContainer { { M1PeriodicReporting-ExtIEs} } OPTIONAL,
+    ...
+}
+
+M1PeriodicReporting-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+PLMNidentity                 ::= TBCD-STRING 
+
+PLMNAreaBasedQMC ::= SEQUENCE {
+    plmnListforQMC        PLMNListforQMC,
+    iE-Extensions        ProtocolExtensionContainer { {PLMNAreaBasedQMC-ExtIEs} } OPTIONAL,
+    ...
+}
+
+PLMNAreaBasedQMC-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+PLMNListforQMC ::= SEQUENCE (SIZE(1..maxnoofPLMNforQMC)) OF PLMNidentity
+
+Port-Number        ::= OCTET STRING (SIZE (2))
+
+Pre-emptionCapability ::= ENUMERATED {
+    shall-not-trigger-pre-emption,
+    may-trigger-pre-emption
+}
+
+Pre-emptionVulnerability ::= ENUMERATED {
+    not-pre-emptable,
+    pre-emptable
+}
+
+PriorityLevel                ::= INTEGER { spare (0), highest (1), lowest (14), no-priority (15) } (0..15)
+
+ProSeAuthorized ::= SEQUENCE {
+    proSeDirectDiscovery        ProSeDirectDiscovery                                    OPTIONAL,
+    proSeDirectCommunication    ProSeDirectCommunication                                OPTIONAL,
+    iE-Extensions                ProtocolExtensionContainer { {ProSeAuthorized-ExtIEs} }    OPTIONAL,
+    ...
+}
+
+ProSeAuthorized-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    { ID id-ProSeUEtoNetworkRelaying    CRITICALITY ignore    EXTENSION ProSeUEtoNetworkRelaying        PRESENCE optional},
+    ...
+}
+
+ProSeDirectDiscovery ::= ENUMERATED { 
+    authorized,
+    not-authorized,
+    ...
+}
+
+ProSeUEtoNetworkRelaying ::= ENUMERATED {
+    authorized,
+    not-authorized,
+    ...
+}
+
+ProSeDirectCommunication ::= ENUMERATED { 
+    authorized,
+    not-authorized,
+    ...
+}
+
+PS-ServiceNotAvailable ::= ENUMERATED {
+    ps-service-not-available,
+    ...
+}
+
+PSCellInformation ::= SEQUENCE {
+    nCGI                        NR-CGI,
+    iE-Extensions                ProtocolExtensionContainer { { PSCellInformation-ExtIEs} }    OPTIONAL,
+    ...
+}
+
+PSCellInformation-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+-- Q
+
+QCI                        ::= INTEGER (0..255)
+
+-- R
+
+ReceiveStatusofULPDCPSDUs ::= BIT STRING (SIZE(4096))
+
+ReceiveStatusOfULPDCPSDUsExtended ::= BIT STRING (SIZE(1..16384))
+
+ReceiveStatusOfULPDCPSDUsPDCP-SNlength18 ::= BIT STRING (SIZE(1..131072))
+
+RecommendedCellsForPaging ::= SEQUENCE {
+    recommendedCellList            RecommendedCellList,
+    iE-Extensions                ProtocolExtensionContainer { { RecommendedCellsForPaging-ExtIEs} }    OPTIONAL,
+    ...
+}
+
+RecommendedCellsForPaging-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+RecommendedCellList ::= SEQUENCE (SIZE(1.. maxnoofRecommendedCells)) OF ProtocolIE-SingleContainer { { RecommendedCellItemIEs } }
+
+RecommendedCellItemIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-RecommendedCellItem    CRITICALITY ignore     TYPE RecommendedCellItem        PRESENCE mandatory },
+    ...
+}
+
+RecommendedCellItem::= SEQUENCE {
+    eUTRAN-CGI                EUTRAN-CGI,
+    timeStayedInCell        INTEGER (0..4095)        OPTIONAL,
+    iE-Extensions            ProtocolExtensionContainer { { RecommendedCellsForPagingItem-ExtIEs} }    OPTIONAL,
+    ...
+}
+
+RecommendedCellsForPagingItem-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+RecommendedENBsForPaging ::= SEQUENCE {
+    recommendedENBList        RecommendedENBList,
+    iE-Extensions            ProtocolExtensionContainer { { RecommendedENBsForPaging-ExtIEs} }    OPTIONAL,
+    ...
+}
+
+RecommendedENBsForPaging-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+RecommendedENBList::= SEQUENCE (SIZE(1.. maxnoofRecommendedENBs)) OF ProtocolIE-SingleContainer { { RecommendedENBItemIEs } }
+
+RecommendedENBItemIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-RecommendedENBItem    CRITICALITY ignore    TYPE RecommendedENBItem        PRESENCE mandatory },
+    ...
+}
+
+RecommendedENBItem ::= SEQUENCE {
+    mMEPagingTarget            MMEPagingTarget,
+    iE-Extensions            ProtocolExtensionContainer { { RecommendedENBItem-ExtIEs} }    OPTIONAL,
+    ...
+}
+
+RecommendedENBItem-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+RelativeMMECapacity                ::= INTEGER (0..255)
+
+RelayNode-Indicator ::= ENUMERATED {
+    true,
+    ...
+}
+
+RAC                    ::= OCTET STRING (SIZE (1))
+
+RAT-Type ::= ENUMERATED {
+    nbiot,
+    ...
+}
+
+ReportAmountMDT ::= ENUMERATED{r1, r2, r4, r8, r16, r32, r64, rinfinity}
+
+ReportIntervalMDT ::= ENUMERATED {ms120, ms240, ms480, ms640, ms1024, ms2048, ms5120, ms10240, min1, min6, min12, min30, min60} 
+
+M1ReportingTrigger ::= ENUMERATED{
+    periodic,
+    a2eventtriggered,
+    ...,
+    a2eventtriggered-periodic
+}
+
+RequestType    ::= SEQUENCE {
+    eventType                 EventType,
+    reportArea                 ReportArea,
+    iE-Extensions            ProtocolExtensionContainer { { RequestType-ExtIEs} }    OPTIONAL,
+    ...
+}
+
+
+RequestType-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    { ID id-RequestTypeAdditionalInfo    CRITICALITY ignore    EXTENSION RequestTypeAdditionalInfo        PRESENCE optional },
+    ...
+}
+
+RequestTypeAdditionalInfo ::= ENUMERATED {
+    includePSCell,
+    ...
+}
+
+RIMTransfer ::= SEQUENCE {
+    rIMInformation            RIMInformation,
+    rIMRoutingAddress        RIMRoutingAddress        OPTIONAL,
+    iE-Extensions            ProtocolExtensionContainer { { RIMTransfer-ExtIEs} }    OPTIONAL,
+    ...
+}
+
+RIMTransfer-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+RIMInformation ::= OCTET STRING
+
+RIMRoutingAddress ::= CHOICE {
+    gERAN-Cell-ID            GERAN-Cell-ID,
+    ...,
+    targetRNC-ID            TargetRNC-ID,
+    eHRPD-Sector-ID            OCTET STRING (SIZE(16))
+}
+
+ReportArea ::= ENUMERATED {
+    ecgi,
+    ...
+}
+
+RepetitionPeriod ::= INTEGER (0..4095)
+
+RLFReportInformation ::= SEQUENCE {
+    uE-RLF-Report-Container                            UE-RLF-Report-Container,
+    uE-RLF-Report-Container-for-extended-bands        UE-RLF-Report-Container-for-extended-bands        OPTIONAL,
+    iE-Extensions                                    ProtocolExtensionContainer {{ RLFReportInformation-ExtIEs}} OPTIONAL,
+    ...
+}
+
+RLFReportInformation-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+RNC-ID ::= INTEGER (0..4095)
+
+RRC-Container ::= OCTET STRING
+
+RRC-Establishment-Cause ::= ENUMERATED {
+    emergency,
+    highPriorityAccess,
+    mt-Access,
+    mo-Signalling,
+    mo-Data,
+    ...,
+    delay-TolerantAccess,
+    mo-VoiceCall,
+    mo-ExceptionData
+}
+
+ECGIListForRestart ::= SEQUENCE (SIZE(1..maxnoofCellsforRestart)) OF EUTRAN-CGI
+
+Routing-ID ::= INTEGER (0..255)
+
+-- S
+
+
+SecurityKey    ::= BIT STRING (SIZE(256))
+
+
+
+SecurityContext ::= SEQUENCE {
+    nextHopChainingCount        INTEGER (0..7),
+    nextHopParameter            SecurityKey,
+    iE-Extensions                ProtocolExtensionContainer { { SecurityContext-ExtIEs} }    OPTIONAL,
+    ...
+}
+
+
+SecurityContext-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+SecondaryRATType ::= ENUMERATED {
+    nR,
+    ...,
+    unlicensed
+}
+
+
+SecondaryRATDataUsageRequest ::= ENUMERATED {
+    requested,
+    ...
+}
+
+SecondaryRATDataUsageReportList ::= SEQUENCE (SIZE(1.. maxnoofE-RABs)) OF ProtocolIE-SingleContainer { {SecondaryRATDataUsageReportItemIEs} }
+
+SecondaryRATDataUsageReportItemIEs     S1AP-PROTOCOL-IES ::= {
+    { ID id-SecondaryRATDataUsageReportItem     CRITICALITY ignore     TYPE SecondaryRATDataUsageReportItem     PRESENCE mandatory },
+    ...
+}
+
+SecondaryRATDataUsageReportItem ::= SEQUENCE {
+    e-RAB-ID                    E-RAB-ID,
+    secondaryRATType            SecondaryRATType,
+    e-RABUsageReportList        E-RABUsageReportList,
+    iE-Extensions                ProtocolExtensionContainer { { SecondaryRATDataUsageReportItem-ExtIEs} } OPTIONAL,
+    ...
+}
+
+SecondaryRATDataUsageReportItem-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+SerialNumber ::= BIT STRING (SIZE (16))
+
+ServiceType ::= ENUMERATED{
+    qMC-for-streaming-service,
+    qMC-for-MTSI-service,
+    ...
+}
+
+SONInformation ::= CHOICE{
+    sONInformationRequest        SONInformationRequest,
+    sONInformationReply            SONInformationReply,
+    ...,
+    sONInformation-Extension    SONInformation-Extension
+}
+
+SONInformation-Extension ::= ProtocolIE-SingleContainer {{ SONInformation-ExtensionIE }}
+
+SONInformation-ExtensionIE S1AP-PROTOCOL-IES ::= {
+    { ID id-SON-Information-Report    CRITICALITY ignore    TYPE SONInformationReport    PRESENCE mandatory}
+}
+
+SONInformationRequest ::= ENUMERATED { 
+    x2TNL-Configuration-Info,
+    ...,
+    time-Synchronisation-Info,
+    activate-Muting,
+    deactivate-Muting}
+
+SONInformationReply ::= SEQUENCE {
+    x2TNLConfigurationInfo            X2TNLConfigurationInfo            OPTIONAL,
+    iE-Extensions                    ProtocolExtensionContainer {{SONInformationReply-ExtIEs}} OPTIONAL,
+    ...
+}
+
+SONInformationReply-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+-- Extension for Release 9 to transfer Time synchronisation information --
+    {ID id-Time-Synchronisation-Info        CRITICALITY ignore    EXTENSION TimeSynchronisationInfo        PRESENCE optional},
+    ...,
+    {ID id-Muting-Pattern-Information        CRITICALITY ignore    EXTENSION MutingPatternInformation    PRESENCE optional}
+}
+
+SONInformationReport ::= CHOICE{
+    rLFReportInformation        RLFReportInformation,
+    ...
+}
+
+SONConfigurationTransfer ::= SEQUENCE {
+    targeteNB-ID                    TargeteNB-ID,
+    sourceeNB-ID                    SourceeNB-ID,
+    sONInformation                    SONInformation,
+    iE-Extensions            ProtocolExtensionContainer { { SONConfigurationTransfer-ExtIEs} }            OPTIONAL,
+...
+}
+
+SONConfigurationTransfer-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+-- Extension for Release 10 to transfer the IP addresses of the eNB initiating the ANR action --
+    {ID id-x2TNLConfigurationInfo        CRITICALITY ignore    EXTENSION X2TNLConfigurationInfo                PRESENCE conditional
+    -- This IE shall be present if the SON Information IE contains the SON Information Request IE and the SON Information Request IE is set to “X2TNL Configuration Info” --}|
+-- Extension for Release 12 to transfer information concerning the source cell of synchronisation and the aggressor cell --
+    {ID id-Synchronisation-Information    CRITICALITY ignore    EXTENSION SynchronisationInformation            PRESENCE conditional
+    -- This IE shall be present if the SON Information IE contains the SON Information Request IE set to “ Activate Muting ” --},
+    ...
+}
+
+
+SynchronisationInformation ::= SEQUENCE {
+    sourceStratumLevel                StratumLevel                OPTIONAL,
+    listeningSubframePattern        ListeningSubframePattern    OPTIONAL,
+    aggressoreCGI-List                ECGI-List                    OPTIONAL,
+    iE-Extensions                    ProtocolExtensionContainer { {SynchronisationInformation-ExtIEs} } OPTIONAL,
+    ...
+}
+
+SynchronisationInformation-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+
+Source-ToTarget-TransparentContainer ::= OCTET STRING
+-- This IE includes a transparent container from the source RAN node to the target RAN node. 
+-- The octets of the OCTET STRING are encoded according to the specifications of the target system.
+
+SourceBSS-ToTargetBSS-TransparentContainer        ::= OCTET STRING
+-- This is a dummy IE used only as a reference to the actual definition in relevant specification.
+
+SourceeNB-ID ::= SEQUENCE {
+    global-ENB-ID    Global-ENB-ID,
+    selected-TAI    TAI,
+    iE-Extensions    ProtocolExtensionContainer { {SourceeNB-ID-ExtIEs} } OPTIONAL
+}
+
+SourceeNB-ID-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+SRVCCOperationNotPossible ::= ENUMERATED {
+    notPossible,
+    ...
+}
+
+SRVCCOperationPossible ::= ENUMERATED {
+    possible,
+    ...
+}
+
+SRVCCHOIndication ::= ENUMERATED {
+    pSandCS,
+    cSonly,
+    ...
+}
+
+SourceeNB-ToTargeteNB-TransparentContainer        ::= SEQUENCE {
+    rRC-Container                RRC-Container,
+    e-RABInformationList        E-RABInformationList            OPTIONAL,
+    targetCell-ID                EUTRAN-CGI,
+    subscriberProfileIDforRFP    SubscriberProfileIDforRFP        OPTIONAL,
+    uE-HistoryInformation        UE-HistoryInformation,
+    iE-Extensions                ProtocolExtensionContainer { {SourceeNB-ToTargeteNB-TransparentContainer-ExtIEs} } OPTIONAL,
+    ...
+}
+
+SourceeNB-ToTargeteNB-TransparentContainer-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    {ID id-MobilityInformation                CRITICALITY ignore    EXTENSION MobilityInformation                    PRESENCE optional}|
+    {ID id-uE-HistoryInformationFromTheUE    CRITICALITY ignore    EXTENSION UE-HistoryInformationFromTheUE        PRESENCE optional}|
+    {ID id-IMSvoiceEPSfallbackfrom5G            CRITICALITY ignore    EXTENSION IMSvoiceEPSfallbackfrom5G            PRESENCE optional},
+    ...
+}
+
+
+SourceRNC-ToTargetRNC-TransparentContainer        ::= OCTET STRING
+-- This is a dummy IE used only as a reference to the actual definition in relevant specification.
+
+SourceNgRanNode-ToTargetNgRanNode-TransparentContainer        ::= OCTET STRING
+-- This is a dummy IE used only as a reference to the actual definition in relevant specification.
+
+ServedGUMMEIs ::= SEQUENCE (SIZE (1.. maxnoofRATs)) OF ServedGUMMEIsItem
+
+ServedGUMMEIsItem ::= SEQUENCE {
+    servedPLMNs                ServedPLMNs,
+    servedGroupIDs            ServedGroupIDs,
+    servedMMECs                ServedMMECs,
+    iE-Extensions            ProtocolExtensionContainer { {ServedGUMMEIsItem-ExtIEs} }    OPTIONAL,
+    ...
+}
+
+ServedGUMMEIsItem-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+ServedGroupIDs ::= SEQUENCE (SIZE(1.. maxnoofGroupIDs)) OF MME-Group-ID
+ServedMMECs ::= SEQUENCE (SIZE(1.. maxnoofMMECs)) OF MME-Code
+
+ServedPLMNs ::= SEQUENCE (SIZE(1.. maxnoofPLMNsPerMME)) OF PLMNidentity
+
+SubscriberProfileIDforRFP ::= INTEGER (1..256) 
+
+Subscription-Based-UE-DifferentiationInfo ::= SEQUENCE {
+    periodicCommunicationIndicator    ENUMERATED {periodically, ondemand, ...}     OPTIONAL,
+    periodicTime                        INTEGER (1..3600, ...)                         OPTIONAL,
+    scheduledCommunicationTime        ScheduledCommunicationTime                     OPTIONAL,
+    stationaryIndication                ENUMERATED {stationary, mobile, ...}            OPTIONAL,
+    trafficProfile                     ENUMERATED {single-packet, dual-packets, multiple-packets, ...}             OPTIONAL,
+    batteryIndication                ENUMERATED {battery-powered, battery-powered-not-rechargeable-or-replaceable, not-battery-powered, ...}        OPTIONAL,
+    iE-Extensions                    ProtocolExtensionContainer { { Subscription-Based-UE-DifferentiationInfo-ExtIEs} } OPTIONAL,
+    ...
+}
+
+Subscription-Based-UE-DifferentiationInfo-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+ScheduledCommunicationTime ::= SEQUENCE {
+    dayofWeek                BIT STRING (SIZE(7))                                    OPTIONAL,
+    timeofDayStart            INTEGER (0..86399, ...)                                 OPTIONAL,
+    timeofDayEnd                INTEGER (0..86399, ...)                                 OPTIONAL,
+    iE-Extensions            ProtocolExtensionContainer { { ScheduledCommunicationTime-ExtIEs}}    OPTIONAL,
+    ...
+}
+
+ScheduledCommunicationTime-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+SupportedTAs ::= SEQUENCE (SIZE(1.. maxnoofTACs)) OF SupportedTAs-Item
+
+SupportedTAs-Item ::=    SEQUENCE  {
+    tAC                    TAC,
+    broadcastPLMNs        BPLMNs,
+    iE-Extensions        ProtocolExtensionContainer { {SupportedTAs-Item-ExtIEs} } OPTIONAL,
+    ...
+}
+
+SupportedTAs-Item-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    -- Extension for Release 13 to transfer RAT-Type per TAC --
+    {ID id-RAT-Type        CRITICALITY reject    EXTENSION RAT-Type        PRESENCE optional},
+    ...
+}
+
+StratumLevel ::= INTEGER (0..3, ...)
+
+SynchronisationStatus ::= ENUMERATED { synchronous, asynchronous, ... }
+
+TimeSynchronisationInfo ::= SEQUENCE {
+    stratumLevel                    StratumLevel,
+    synchronisationStatus            SynchronisationStatus,
+    iE-Extensions                    ProtocolExtensionContainer { { TimeSynchronisationInfo-ExtIEs} } OPTIONAL,
+    ...
+}
+
+TimeSynchronisationInfo-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    -- Extension for Release 12 to transfer Muting Availability Indication --
+    {ID id-Muting-Availability-Indication        CRITICALITY ignore    EXTENSION MutingAvailabilityIndication    PRESENCE optional},
+    ...
+}
+
+S-TMSI ::= SEQUENCE {
+    mMEC    MME-Code,
+    m-TMSI    M-TMSI,
+    iE-Extensions        ProtocolExtensionContainer { {S-TMSI-ExtIEs} } OPTIONAL,
+    ...
+}
+
+S-TMSI-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+-- T
+
+TAC ::= OCTET STRING (SIZE (2))
+
+TAIBasedMDT ::= SEQUENCE {
+    tAIListforMDT            TAIListforMDT,
+    iE-Extensions            ProtocolExtensionContainer { {TAIBasedMDT-ExtIEs} } OPTIONAL,
+    ...
+}
+
+TAIBasedMDT-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+TAIListforMDT ::= SEQUENCE (SIZE(1..maxnoofTAforMDT)) OF TAI
+
+TAIListforWarning ::= SEQUENCE (SIZE(1..maxnoofTAIforWarning)) OF TAI
+
+TAI ::= SEQUENCE {
+    pLMNidentity            PLMNidentity,
+    tAC                        TAC,
+    iE-Extensions            ProtocolExtensionContainer { {TAI-ExtIEs} } OPTIONAL,
+    ...
+}
+
+TAI-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+TAI-Broadcast ::= SEQUENCE (SIZE(1..maxnoofTAIforWarning)) OF TAI-Broadcast-Item
+
+TAI-Broadcast-Item ::= SEQUENCE {
+    tAI                    TAI,
+    completedCellinTAI    CompletedCellinTAI,
+    iE-Extensions        ProtocolExtensionContainer { {TAI-Broadcast-Item-ExtIEs} } OPTIONAL,
+    ...
+}
+
+TAI-Broadcast-Item-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+TAI-Cancelled ::= SEQUENCE (SIZE(1..maxnoofTAIforWarning)) OF TAI-Cancelled-Item
+
+TAI-Cancelled-Item ::= SEQUENCE {
+    tAI                    TAI,
+    cancelledCellinTAI    CancelledCellinTAI,
+    iE-Extensions        ProtocolExtensionContainer { {TAI-Cancelled-Item-ExtIEs} } OPTIONAL,
+    ...
+}
+
+TAI-Cancelled-Item-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+TABasedMDT ::= SEQUENCE {
+    tAListforMDT        TAListforMDT,
+    iE-Extensions        ProtocolExtensionContainer { {TABasedMDT-ExtIEs} } OPTIONAL,
+    ...
+}
+
+TABasedMDT-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+TAListforMDT ::= SEQUENCE (SIZE(1..maxnoofTAforMDT)) OF TAC
+
+TABasedQMC ::= SEQUENCE {
+    tAListforQMC        TAListforQMC,
+    iE-Extensions        ProtocolExtensionContainer { {TABasedQMC-ExtIEs} } OPTIONAL,
+    ...
+}
+
+TABasedQMC-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+TAListforQMC ::= SEQUENCE (SIZE(1..maxnoofTAforQMC)) OF TAC
+
+TAIBasedQMC ::= SEQUENCE {
+    tAIListforQMC        TAIListforQMC,
+    iE-Extensions        ProtocolExtensionContainer { {TAIBasedQMC-ExtIEs} } OPTIONAL,
+    ...
+}
+
+TAIBasedQMC-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+TAIListforQMC ::= SEQUENCE (SIZE(1..maxnoofTAforQMC)) OF TAI
+
+CompletedCellinTAI ::= SEQUENCE (SIZE(1..maxnoofCellinTAI)) OF CompletedCellinTAI-Item
+
+CompletedCellinTAI-Item ::= SEQUENCE{
+    eCGI                EUTRAN-CGI,
+    iE-Extensions        ProtocolExtensionContainer { {CompletedCellinTAI-Item-ExtIEs} } OPTIONAL,
+    ...
+}
+
+CompletedCellinTAI-Item-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+TBCD-STRING ::= OCTET STRING (SIZE (3))
+
+TargetID ::= CHOICE {
+    targeteNB-ID        TargeteNB-ID,
+    targetRNC-ID        TargetRNC-ID,
+    cGI                    CGI,
+    ...,
+    targetgNgRanNode-ID        TargetNgRanNode-ID
+}
+
+TargeteNB-ID ::= SEQUENCE {
+    global-ENB-ID        Global-ENB-ID,
+    selected-TAI        TAI,
+    iE-Extensions        ProtocolExtensionContainer { {TargeteNB-ID-ExtIEs} } OPTIONAL,
+    ...
+}
+
+TargeteNB-ID-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+TargetRNC-ID ::= SEQUENCE {
+    lAI                    LAI,
+    rAC                    RAC         OPTIONAL,
+    rNC-ID                RNC-ID,
+    extendedRNC-ID        ExtendedRNC-ID        OPTIONAL,
+    iE-Extensions        ProtocolExtensionContainer { {TargetRNC-ID-ExtIEs} } OPTIONAL,
+    ...
+    }
+
+
+TargetRNC-ID-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+TargetNgRanNode-ID ::= SEQUENCE {
+    global-RAN-NODE-ID        Global-RAN-NODE-ID,
+    selected-TAI        FiveGSTAI,
+    iE-Extensions        ProtocolExtensionContainer { { TargetNgRanNode-ID-ExtIEs} } OPTIONAL,
+    ...
+}
+
+TargetNgRanNode-ID-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+Global-RAN-NODE-ID::= CHOICE {
+    gNB        GNB,
+    ng-eNB        NG-eNB,
+    ...
+}
+
+GNB ::= SEQUENCE {
+    global-gNB-ID        Global-GNB-ID,
+    iE-Extensions        ProtocolExtensionContainer { {GNB-ExtIEs} } OPTIONAL,
+    ...
+}
+
+GNB-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+Global-GNB-ID ::= SEQUENCE {
+    pLMN-Identity        PLMNidentity,
+    gNB-ID                GNB-Identity,
+    iE-Extensions        ProtocolExtensionContainer { { Global-GNB-ID-ExtIEs} } OPTIONAL,
+    ...
+}
+
+Global-GNB-ID-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+GNB-Identity ::= CHOICE {
+    gNB-ID        GNB-ID,
+    ...
+}
+
+NG-eNB ::= SEQUENCE {
+    global-ng-eNB-ID        Global-ENB-ID,
+    iE-Extensions        ProtocolExtensionContainer { { NG-eNB-ExtIEs} } OPTIONAL,
+    ...
+}
+
+NG-eNB-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+GNB-ID ::= BIT STRING (SIZE(22..32))
+
+TargeteNB-ToSourceeNB-TransparentContainer        ::= SEQUENCE {
+    rRC-Container        RRC-Container,
+    iE-Extensions        ProtocolExtensionContainer { {TargeteNB-ToSourceeNB-TransparentContainer-ExtIEs} } OPTIONAL,
+    ...
+}
+
+TargeteNB-ToSourceeNB-TransparentContainer-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+Target-ToSource-TransparentContainer ::= OCTET STRING
+-- This IE includes a transparent container from the target RAN node to the source RAN node. 
+-- The octets of the OCTET STRING are coded according to the specifications of the target system.
+
+TargetRNC-ToSourceRNC-TransparentContainer        ::= OCTET STRING
+-- This is a dummy IE used only as a reference to the actual definition in relevant specification.
+
+TargetBSS-ToSourceBSS-TransparentContainer        ::= OCTET STRING
+-- This is a dummy IE used only as a reference to the actual definition in relevant specification.
+
+TargetNgRanNode-ToSourceNgRanNode-TransparentContainer        ::= OCTET STRING
+-- This is a dummy IE used only as a reference to the actual definition in relevant specification.
+
+M1ThresholdEventA2 ::= SEQUENCE { 
+    measurementThreshold    MeasurementThresholdA2,
+    iE-Extensions            ProtocolExtensionContainer { { M1ThresholdEventA2-ExtIEs} } OPTIONAL,
+    ...
+}
+
+M1ThresholdEventA2-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+Threshold-RSRP ::= INTEGER(0..97)
+
+Threshold-RSRQ ::= INTEGER(0..34)
+
+TimeToWait ::= ENUMERATED {v1s, v2s, v5s, v10s, v20s, v60s, ...}
+
+Time-UE-StayedInCell ::= INTEGER (0..4095)
+
+Time-UE-StayedInCell-EnhancedGranularity ::= INTEGER (0..40950)
+
+TimeSinceSecondaryNodeRelease ::= OCTET STRING (SIZE(4))
+
+TransportInformation ::= SEQUENCE {
+    transportLayerAddress                TransportLayerAddress,
+    uL-GTP-TEID                            GTP-TEID,
+    ...
+}
+
+TransportLayerAddress        ::= BIT STRING (SIZE(1..160, ...))
+
+TraceActivation ::= SEQUENCE {
+    e-UTRAN-Trace-ID                    E-UTRAN-Trace-ID,
+    interfacesToTrace                    InterfacesToTrace,
+traceDepth                            TraceDepth,
+traceCollectionEntityIPAddress        TransportLayerAddress,
+    iE-Extensions                        ProtocolExtensionContainer { { TraceActivation-ExtIEs} }    OPTIONAL,
+    ...
+}
+
+TraceActivation-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+-- Extension for Rel-10 to support MDT --
+    { ID id-MDTConfiguration    CRITICALITY ignore    EXTENSION MDT-Configuration        PRESENCE optional }|
+-- Extension for Rel-15 to support QMC –
+    { ID id-UEAppLayerMeasConfig    CRITICALITY ignore    EXTENSION UEAppLayerMeasConfig        PRESENCE optional },
+    ...
+}
+
+TraceDepth ::= ENUMERATED { 
+    minimum,
+    medium,
+    maximum,
+    minimumWithoutVendorSpecificExtension,
+    mediumWithoutVendorSpecificExtension,
+    maximumWithoutVendorSpecificExtension,
+    ...
+}
+
+E-UTRAN-Trace-ID ::=  OCTET STRING (SIZE (8))
+
+TrafficLoadReductionIndication ::= INTEGER (1..99)
+
+TunnelInformation ::= SEQUENCE {
+    transportLayerAddress    TransportLayerAddress,
+    uDP-Port-Number            Port-Number            OPTIONAL,
+    iE-Extensions            ProtocolExtensionContainer { {Tunnel-Information-ExtIEs} } OPTIONAL,
+    ...
+}
+
+Tunnel-Information-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+TypeOfError ::= ENUMERATED {
+    not-understood,
+    missing,
+    ...
+}
+
+TAIListForRestart ::= SEQUENCE (SIZE(1..maxnoofRestartTAIs)) OF TAI
+
+-- U
+
+UEAggregateMaximumBitrate ::= SEQUENCE {
+    uEaggregateMaximumBitRateDL        BitRate,
+    uEaggregateMaximumBitRateUL        BitRate,
+    iE-Extensions                    ProtocolExtensionContainer { {UEAggregate-MaximumBitrates-ExtIEs} } OPTIONAL,
+    ...
+}
+
+UEAggregate-MaximumBitrates-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+-- Extension for maximum bitrate > 10G bps --
+    { ID id-extended-uEaggregateMaximumBitRateDL     CRITICALITY ignore    EXTENSION ExtendedBitRate    PRESENCE optional}|
+    { ID id-extended-uEaggregateMaximumBitRateUL        CRITICALITY ignore    EXTENSION ExtendedBitRate    PRESENCE optional},
+    ...
+}
+
+UEAppLayerMeasConfig ::= SEQUENCE {
+    containerForAppLayerMeasConfig            OCTET STRING (SIZE(1..1000)),
+    areaScopeOfQMC        AreaScopeOfQMC,
+    iE-Extensions        ProtocolExtensionContainer { {UEAppLayerMeasConfig-ExtIEs} } OPTIONAL,
+    ...
+}
+
+UEAppLayerMeasConfig-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    {ID id-serviceType    CRITICALITY ignore    EXTENSION ServiceType    PRESENCE optional},
+    ...
+}
+
+UECapabilityInfoRequest ::= ENUMERATED {
+    requested,
+    ...
+}
+
+UE-RetentionInformation ::= ENUMERATED {
+    ues-retained,
+    ...}
+
+UE-S1AP-IDs ::= CHOICE{
+    uE-S1AP-ID-pair        UE-S1AP-ID-pair,
+    mME-UE-S1AP-ID        MME-UE-S1AP-ID,
+    ...
+}
+
+UE-S1AP-ID-pair ::= SEQUENCE{
+    mME-UE-S1AP-ID        MME-UE-S1AP-ID,
+    eNB-UE-S1AP-ID        ENB-UE-S1AP-ID,
+    iE-Extensions        ProtocolExtensionContainer { {UE-S1AP-ID-pair-ExtIEs} } OPTIONAL,
+    ...
+}
+UE-S1AP-ID-pair-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+
+UE-associatedLogicalS1-ConnectionItem ::= SEQUENCE {
+    mME-UE-S1AP-ID        MME-UE-S1AP-ID OPTIONAL,
+    eNB-UE-S1AP-ID        ENB-UE-S1AP-ID OPTIONAL,
+    iE-Extensions        ProtocolExtensionContainer { { UE-associatedLogicalS1-ConnectionItemExtIEs} } OPTIONAL,
+    ...
+}
+
+
+UE-associatedLogicalS1-ConnectionItemExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+UEIdentityIndexValue    ::=    BIT STRING (SIZE (10))
+
+UE-HistoryInformation ::= SEQUENCE (SIZE(1..maxnoofCellsinUEHistoryInfo)) OF LastVisitedCell-Item
+
+UE-HistoryInformationFromTheUE ::= OCTET STRING
+-- This IE is a transparent container and shall be encoded as the VisitedCellInfoList field contained in the UEInformationResponse message as defined in TS 36.331 [16]
+
+UEPagingID ::= CHOICE {
+    s-TMSI        S-TMSI,
+    iMSI        IMSI,
+    ...
+    }
+
+UERadioCapability ::= OCTET STRING
+
+UERadioCapabilityForPaging ::= OCTET STRING
+
+UE-RLF-Report-Container ::= OCTET STRING
+-- This IE is a transparent container and shall be encoded as the rlf-Report-r9 field contained in the UEInformationResponse message as defined in TS 36.331 [16]
+
+UE-RLF-Report-Container-for-extended-bands ::= OCTET STRING
+-- This IE is a transparent container and shall be encoded as the rlf-Report-v9e0 contained in the UEInformationResponse message as defined in TS 36.331 [16]
+
+UESecurityCapabilities ::= SEQUENCE {
+    encryptionAlgorithms            EncryptionAlgorithms,
+    integrityProtectionAlgorithms    IntegrityProtectionAlgorithms,
+    iE-Extensions                    ProtocolExtensionContainer { { UESecurityCapabilities-ExtIEs} }    OPTIONAL,
+...
+}
+
+UESecurityCapabilities-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+UESidelinkAggregateMaximumBitrate ::= SEQUENCE {
+    uESidelinkAggregateMaximumBitRate        BitRate,
+    iE-Extensions                    ProtocolExtensionContainer { {UE-Sidelink-Aggregate-MaximumBitrates-ExtIEs} } OPTIONAL,
+    ...
+}
+
+UE-Sidelink-Aggregate-MaximumBitrates-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+UE-Usage-Type ::= INTEGER (0..255) 
+
+UL-CP-SecurityInformation ::= SEQUENCE {
+    ul-NAS-MAC                UL-NAS-MAC,
+    ul-NAS-Count            UL-NAS-Count,
+    iE-Extensions            ProtocolExtensionContainer { { UL-CP-SecurityInformation-ExtIEs} }    OPTIONAL,
+    ...
+}
+
+UL-CP-SecurityInformation-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+UL-NAS-MAC ::= BIT STRING (SIZE (16))
+
+UL-NAS-Count ::= BIT STRING (SIZE (5))
+
+UnlicensedSpectrumRestriction ::= ENUMERATED {
+    unlicensed-restricted,
+    ...
+}
+
+
+UserLocationInformation ::= SEQUENCE {
+    eutran-cgi                 EUTRAN-CGI,
+    tai                        TAI,
+    iE-Extensions            ProtocolExtensionContainer { { UserLocationInformation-ExtIEs} }    OPTIONAL,
+    ...
+}
+
+UserLocationInformation-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    { ID id-PSCellInformation    CRITICALITY ignore    EXTENSION PSCellInformation            PRESENCE optional},
+    ...
+}
+
+UEUserPlaneCIoTSupportIndicator ::= ENUMERATED {
+    supported,
+    ...
+}
+
+UE-Application-Layer-Measurement-Capability ::= BIT STRING (SIZE (8))
+
+-- First bit: QoE Measurement for streaming service
+-- Second bit: QoE Measurement for MTSI service
+
+-- Note that undefined bits are considered as a spare bit and spare bits shall be set to 0 by the transmitter and shall be ignored by the receiver.
+
+-- V
+
+VoiceSupportMatchIndicator ::= ENUMERATED { 
+    supported,
+    not-supported,
+    ...
+}
+
+V2XServicesAuthorized ::= SEQUENCE {
+    vehicleUE            VehicleUE                                            OPTIONAL,
+    pedestrianUE         PedestrianUE                        OPTIONAL,
+    iE-Extensions        ProtocolExtensionContainer { {V2XServicesAuthorized-ExtIEs} }    OPTIONAL,
+    ...
+}
+
+V2XServicesAuthorized-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+VehicleUE ::= ENUMERATED { 
+    authorized,
+    not-authorized,
+    ...
+}
+
+PedestrianUE ::= ENUMERATED { 
+    authorized,
+    not-authorized,
+    ...
+}
+
+-- W
+
+WarningAreaCoordinates ::= OCTET STRING (SIZE(1..1024))
+
+WarningAreaList ::= CHOICE {
+    cellIDList                        ECGIList,
+    trackingAreaListforWarning        TAIListforWarning,
+    emergencyAreaIDList                EmergencyAreaIDList,
+    ...
+}
+
+
+WarningType ::= OCTET STRING (SIZE (2))
+
+WarningSecurityInfo ::= OCTET STRING (SIZE (50))
+
+
+WarningMessageContents ::= OCTET STRING (SIZE(1..9600))
+
+WLANMeasurementConfiguration ::= SEQUENCE {
+    wlanMeasConfig             WLANMeasConfig,
+    wlanMeasConfigNameList        WLANMeasConfigNameList            OPTIONAL,
+    wlan-rssi                  ENUMERATED {true, ...}            OPTIONAL,
+    wlan-rtt                   ENUMERATED {true, ...}            OPTIONAL,
+    iE-Extensions        ProtocolExtensionContainer { { WLANMeasurementConfiguration-ExtIEs } } OPTIONAL,
+    ...
+}
+
+WLANMeasurementConfiguration-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+WLANMeasConfigNameList ::= SEQUENCE (SIZE(1..maxnoofWLANName)) OF WLANName
+
+WLANMeasConfig::= ENUMERATED {setup,...}
+
+WLANName ::= OCTET STRING (SIZE (1..32))   
+
+-- X
+
+
+X2TNLConfigurationInfo ::= SEQUENCE {
+    eNBX2TransportLayerAddresses    ENBX2TLAs,
+    iE-Extensions                    ProtocolExtensionContainer { { X2TNLConfigurationInfo-ExtIEs} } OPTIONAL,
+    ...
+}
+
+X2TNLConfigurationInfo-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+-- Extension for Release 10 to transfer the IPsec and U-plane addresses during ANR action --
+    {ID id-eNBX2ExtendedTransportLayerAddresses        CRITICALITY ignore    EXTENSION ENBX2ExtTLAs    PRESENCE optional}|
+-- Extension for Release 12 to transfer the IP addresses of the X2 GW --
+    {ID id-eNBIndirectX2TransportLayerAddresses    CRITICALITY ignore    EXTENSION ENBIndirectX2TransportLayerAddresses    PRESENCE optional},
+    ...
+}
+
+ENBX2ExtTLAs ::= SEQUENCE (SIZE(1.. maxnoofeNBX2ExtTLAs)) OF ENBX2ExtTLA
+
+ENBX2ExtTLA ::= SEQUENCE {
+    iPsecTLA                    TransportLayerAddress        OPTIONAL,
+    gTPTLAa                        ENBX2GTPTLAs                OPTIONAL,
+    iE-Extensions                ProtocolExtensionContainer { { ENBX2ExtTLA-ExtIEs} } OPTIONAL,
+    ...
+}
+
+ENBX2ExtTLA-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+ENBX2GTPTLAs ::= SEQUENCE (SIZE(1.. maxnoofeNBX2GTPTLAs)) OF TransportLayerAddress
+
+ENBIndirectX2TransportLayerAddresses ::= SEQUENCE (SIZE(1..maxnoofeNBX2TLAs)) OF TransportLayerAddress
+
+-- Y
+-- Z
+
+END
diff --git a/src/s1ap/asn1c/asnGenFiles/asn1c/S1AP-PDU-Contents.asn b/src/s1ap/asn1c/asnGenFiles/asn1c/S1AP-PDU-Contents.asn
new file mode 100644
index 0000000..f0e2003
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/asn1c/S1AP-PDU-Contents.asn
@@ -0,0 +1,3131 @@
+-- **************************************************************
+--
+-- PDU definitions for S1AP.
+--
+-- **************************************************************
+
+S1AP-PDU-Contents { 
+itu-t (0) identified-organization (4) etsi (0) mobileDomain (0) 
+eps-Access (21) modules (3) s1ap (1) version1 (1) s1ap-PDU-Contents (1) }
+
+DEFINITIONS AUTOMATIC TAGS ::= 
+
+BEGIN
+
+-- **************************************************************
+--
+-- IE parameter types from other modules.
+--
+-- **************************************************************
+
+IMPORTS
+    
+    UEAggregateMaximumBitrate,
+    BearerType,
+    Cause,
+    CellAccessMode,
+    Cdma2000HORequiredIndication,
+    Cdma2000HOStatus,
+    Cdma2000OneXSRVCCInfo,
+    Cdma2000OneXRAND,
+    Cdma2000PDU,
+    Cdma2000RATType,
+    Cdma2000SectorID,
+    EUTRANRoundTripDelayEstimationInfo,
+    CNDomain,
+    ConcurrentWarningMessageIndicator,
+    CriticalityDiagnostics,
+    CSFallbackIndicator,
+    CSG-Id,
+    CSG-IdList, 
+    CSGMembershipStatus,
+    Data-Forwarding-Not-Possible,
+    Direct-Forwarding-Path-Availability,
+    Global-ENB-ID,
+    EUTRAN-CGI,
+    ENBname,
+    ENB-StatusTransfer-TransparentContainer,
+    ENB-UE-S1AP-ID,
+    ExtendedRepetitionPeriod,
+    GTP-TEID,
+    GUMMEI,
+    GUMMEIType,
+    HandoverRestrictionList,
+    HandoverType,
+    Masked-IMEISV,
+    LAI,
+    LPPa-PDU,
+    ManagementBasedMDTAllowed,
+    MDTPLMNList,
+    MMEname,
+    MMERelaySupportIndicator,
+    MME-UE-S1AP-ID,
+    MSClassmark2,
+    MSClassmark3,
+    NAS-PDU,
+    NASSecurityParametersfromE-UTRAN,
+    NASSecurityParameterstoE-UTRAN,
+    OverloadResponse,
+    PagingDRX,
+    PagingPriority,
+    PLMNidentity,
+    ProSeAuthorized,
+    RIMTransfer,
+    RelativeMMECapacity,
+    RequestType,
+    E-RAB-ID,
+    E-RABLevelQoSParameters,
+    E-RABList,
+    RelayNode-Indicator,
+    Routing-ID,
+    SecurityKey,
+    SecurityContext,
+    ServedGUMMEIs,
+    SONConfigurationTransfer,
+    Source-ToTarget-TransparentContainer,
+    SourceBSS-ToTargetBSS-TransparentContainer,
+    SourceeNB-ToTargeteNB-TransparentContainer,
+    SourceRNC-ToTargetRNC-TransparentContainer,
+    SubscriberProfileIDforRFP,
+    SRVCCOperationNotPossible,
+    SRVCCOperationPossible,
+    SRVCCHOIndication,
+    SupportedTAs,
+    TAI,
+    Target-ToSource-TransparentContainer,
+    TargetBSS-ToSourceBSS-TransparentContainer,    
+    TargeteNB-ToSourceeNB-TransparentContainer,
+    TargetID,
+    TargetRNC-ToSourceRNC-TransparentContainer,
+    TimeToWait,
+    TraceActivation,
+    TrafficLoadReductionIndication,
+    E-UTRAN-Trace-ID,
+    TransportLayerAddress,
+    UEIdentityIndexValue,
+    UEPagingID,
+    UERadioCapability,
+    UERadioCapabilityForPaging,
+    UE-RetentionInformation,
+    UE-S1AP-IDs,
+    UE-associatedLogicalS1-ConnectionItem,
+    UESecurityCapabilities,
+    S-TMSI,
+    MessageIdentifier,
+    SerialNumber,
+    WarningAreaList,
+    RepetitionPeriod,
+    NumberofBroadcastRequest,
+    WarningType,
+    WarningSecurityInfo,
+    DataCodingScheme,
+    WarningMessageContents,
+    BroadcastCompletedAreaList,
+    RRC-Establishment-Cause,
+    BroadcastCancelledAreaList,
+    PS-ServiceNotAvailable,
+    GUMMEIList,
+    Correlation-ID,
+    GWContextReleaseIndication,
+    PrivacyIndicator,
+    VoiceSupportMatchIndicator,
+    TunnelInformation,
+    KillAllWarningMessages,
+    TransportInformation,
+    LHN-ID,
+    UserLocationInformation,
+    AdditionalCSFallbackIndicator,
+    ECGIListForRestart,
+    TAIListForRestart,
+    EmergencyAreaIDListForRestart,
+    ExpectedUEBehaviour,
+    Paging-eDRXInformation,
+    Extended-UEIdentityIndexValue,
+    MME-Group-ID,
+    Additional-GUTI,
+    PWSfailedECGIList,
+    CellIdentifierAndCELevelForCECapableUEs,
+    AssistanceDataForPaging,
+    InformationOnRecommendedCellsAndENBsForPaging,
+    UE-Usage-Type,
+    UEUserPlaneCIoTSupportIndicator,
+    NB-IoT-DefaultPagingDRX,
+    NB-IoT-Paging-eDRXInformation,
+    CE-mode-B-SupportIndicator,
+    NB-IoT-UEIdentityIndexValue,
+    V2XServicesAuthorized,
+    DCN-ID,
+    ServedDCNs,
+    UESidelinkAggregateMaximumBitrate,
+    DLNASPDUDeliveryAckRequest,
+    Coverage-Level,
+    EnhancedCoverageRestricted,
+    DL-CP-SecurityInformation,
+    UL-CP-SecurityInformation,
+    SecondaryRATDataUsageRequest,
+    SecondaryRATDataUsageReportList,
+    HandoverFlag,
+    NRUESecurityCapabilities,
+    UE-Application-Layer-Measurement-Capability,
+    CE-ModeBRestricted,
+    Packet-LossRate,
+     UECapabilityInfoRequest,
+    SourceNgRanNode-ToTargetNgRanNode-TransparentContainer,
+    TargetNgRanNode-ToSourceNgRanNode-TransparentContainer,
+    EndIndication,
+    EDT-Session,
+    LTE-M-Indication,
+    AerialUEsubscriptionInformation,
+    PendingDataIndication,
+    WarningAreaCoordinates,
+    Subscription-Based-UE-DifferentiationInfo,
+    PSCellInformation,
+    NR-CGI,
+    maxnoofE-RABs,
+    ConnectedengNBList,
+    EN-DCSONConfigurationTransfer,
+    TimeSinceSecondaryNodeRelease
+
+
+
+
+FROM S1AP-IEs
+
+    PrivateIE-Container{},
+    ProtocolExtensionContainer{},
+    ProtocolIE-Container{},
+    ProtocolIE-ContainerList{},
+    ProtocolIE-ContainerPair{},
+    ProtocolIE-ContainerPairList{},
+    ProtocolIE-SingleContainer{},
+    S1AP-PRIVATE-IES,
+    S1AP-PROTOCOL-EXTENSION,
+    S1AP-PROTOCOL-IES,
+    S1AP-PROTOCOL-IES-PAIR
+FROM S1AP-Containers
+
+
+    id-AssistanceDataForPaging,
+    id-AerialUEsubscriptionInformation,
+    id-uEaggregateMaximumBitrate,
+    id-BearerType,
+    id-Cause,
+    id-CellAccessMode,
+    id-CellIdentifierAndCELevelForCECapableUEs,
+    id-cdma2000HORequiredIndication,
+    id-cdma2000HOStatus,
+    id-cdma2000OneXSRVCCInfo,
+    id-cdma2000OneXRAND,
+    id-cdma2000PDU,
+    id-cdma2000RATType,
+    id-cdma2000SectorID,
+    id-EUTRANRoundTripDelayEstimationInfo,
+    id-CNDomain,
+    id-ConcurrentWarningMessageIndicator,
+    id-CriticalityDiagnostics,
+    id-CSFallbackIndicator,
+    id-CSG-Id,
+    id-CSG-IdList,
+    id-CSGMembershipStatus,
+    id-Data-Forwarding-Not-Possible,
+    id-DefaultPagingDRX,
+    id-Direct-Forwarding-Path-Availability,
+    id-Global-ENB-ID,
+    id-EUTRAN-CGI,
+    id-eNBname,
+    id-eNB-StatusTransfer-TransparentContainer,
+    id-eNB-UE-S1AP-ID, 
+    id-GERANtoLTEHOInformationRes,
+    id-GUMMEI-ID,
+    id-GUMMEIType,
+    id-HandoverRestrictionList,
+    id-HandoverType,
+    id-Masked-IMEISV,
+    id-InformationOnRecommendedCellsAndENBsForPaging,
+    id-InitialContextSetup,
+    id-Inter-SystemInformationTransferTypeEDT,
+    id-Inter-SystemInformationTransferTypeMDT,
+    id-LPPa-PDU,
+    id-NAS-DownlinkCount,
+    id-ManagementBasedMDTAllowed,
+    id-ManagementBasedMDTPLMNList,
+    id-MMEname,
+    id-MME-UE-S1AP-ID,
+    id-MSClassmark2,
+    id-MSClassmark3,
+    id-NAS-PDU,
+    id-NASSecurityParametersfromE-UTRAN,
+    id-NASSecurityParameterstoE-UTRAN,
+    id-OverloadResponse,
+    id-pagingDRX,
+    id-PagingPriority,
+    id-RelativeMMECapacity,
+    id-RequestType,
+    id-Routing-ID,
+    id-E-RABAdmittedItem,
+    id-E-RABAdmittedList,
+    id-E-RABDataForwardingItem,
+    id-E-RABFailedToModifyList,
+    id-E-RABFailedToReleaseList,
+    id-E-RABFailedtoSetupItemHOReqAck,
+    id-E-RABFailedToSetupListBearerSURes,
+    id-E-RABFailedToSetupListCtxtSURes,
+    id-E-RABFailedToSetupListHOReqAck,
+    id-E-RABFailedToBeReleasedList,
+    id-E-RABFailedToResumeListResumeReq,
+    id-E-RABFailedToResumeItemResumeReq,
+    id-E-RABFailedToResumeListResumeRes,
+    id-E-RABFailedToResumeItemResumeRes,
+    id-E-RABModify,
+    id-E-RABModifyItemBearerModRes,
+    id-E-RABModifyListBearerModRes,
+    id-E-RABRelease,
+    id-E-RABReleaseItemBearerRelComp,
+    id-E-RABReleaseItemHOCmd,
+    id-E-RABReleaseListBearerRelComp,
+    id-E-RABReleaseIndication,
+    id-E-RABSetup,
+    id-E-RABSetupItemBearerSURes,
+    id-E-RABSetupItemCtxtSURes,
+    id-E-RABSetupListBearerSURes,
+    id-E-RABSetupListCtxtSURes,
+    id-E-RABSubjecttoDataForwardingList,
+    id-E-RABToBeModifiedItemBearerModReq,
+    id-E-RABToBeModifiedListBearerModReq,
+    id-E-RABToBeModifiedListBearerModInd,
+    id-E-RABToBeModifiedItemBearerModInd,
+    id-E-RABNotToBeModifiedListBearerModInd,
+    id-E-RABNotToBeModifiedItemBearerModInd,
+    id-E-RABModifyListBearerModConf,
+    id-E-RABModifyItemBearerModConf,
+    id-E-RABFailedToModifyListBearerModConf, 
+    id-E-RABToBeReleasedListBearerModConf,
+    id-E-RABToBeReleasedList,
+    id-E-RABReleasedList,
+    id-E-RABToBeSetupItemBearerSUReq,
+    id-E-RABToBeSetupItemCtxtSUReq,
+    id-E-RABToBeSetupItemHOReq,
+    id-E-RABToBeSetupListBearerSUReq,
+    id-E-RABToBeSetupListCtxtSUReq,
+    id-E-RABToBeSetupListHOReq,
+    id-E-RABToBeSwitchedDLItem,
+    id-E-RABToBeSwitchedDLList,
+    id-E-RABToBeSwitchedULList,
+    id-E-RABToBeSwitchedULItem,
+    id-E-RABtoReleaseListHOCmd,
+    id-ProSeAuthorized,
+    id-SecurityKey,
+    id-SecurityContext,
+    id-ServedGUMMEIs,
+    id-SONConfigurationTransferECT,
+    id-SONConfigurationTransferMCT,
+    id-Source-ToTarget-TransparentContainer,
+    id-Source-ToTarget-TransparentContainer-Secondary,
+    id-SourceMME-UE-S1AP-ID,
+    id-SRVCCOperationNotPossible,
+    id-SRVCCOperationPossible,
+    id-SRVCCHOIndication,
+    id-SubscriberProfileIDforRFP,
+    id-SupportedTAs,
+    id-S-TMSI,
+    id-TAI,
+    id-TAIItem,
+    id-TAIList,
+    id-Target-ToSource-TransparentContainer,
+    id-Target-ToSource-TransparentContainer-Secondary,
+    id-TargetID,
+    id-TimeToWait,
+    id-TraceActivation,
+    id-TrafficLoadReductionIndication,
+    id-E-UTRAN-Trace-ID,
+    id-UEIdentityIndexValue,
+    id-UEPagingID,
+    id-UERadioCapability,
+    id-UERadioCapabilityForPaging,
+    id-UTRANtoLTEHOInformationRes,
+    id-UE-associatedLogicalS1-ConnectionListResAck,
+    id-UE-associatedLogicalS1-ConnectionItem,
+    id-UE-RetentionInformation,
+    id-UESecurityCapabilities,
+    id-UE-S1AP-IDs,
+    id-V2XServicesAuthorized,
+    id-ResetType,
+    id-MessageIdentifier,
+    id-SerialNumber,
+    id-WarningAreaList,
+    id-RepetitionPeriod,
+    id-NumberofBroadcastRequest,
+    id-WarningType,
+    id-WarningSecurityInfo,
+    id-DataCodingScheme,
+    id-WarningMessageContents,
+    id-BroadcastCompletedAreaList,
+    id-BroadcastCancelledAreaList,
+    id-RRC-Establishment-Cause,
+    id-TraceCollectionEntityIPAddress,
+    maxnoofTAIs,
+    maxnoofErrors,
+    maxnoofIndividualS1ConnectionsToReset,
+    maxnoofEmergencyAreaID,
+    maxnoofCellID,
+    maxnoofTAIforWarning,
+    maxnoofCellinTAI,
+    maxnoofCellinEAI,
+    id-ExtendedRepetitionPeriod,
+    id-PS-ServiceNotAvailable,
+    id-RegisteredLAI,
+    id-GUMMEIList,
+    id-SourceMME-GUMMEI,
+    id-MME-UE-S1AP-ID-2,
+    id-GW-TransportLayerAddress,
+    id-RelayNode-Indicator,
+    id-Correlation-ID,
+    id-MMERelaySupportIndicator,
+    id-GWContextReleaseIndication,
+    id-PrivacyIndicator,
+    id-VoiceSupportMatchIndicator,
+    id-Tunnel-Information-for-BBF,
+    id-SIPTO-Correlation-ID,
+    id-SIPTO-L-GW-TransportLayerAddress,
+    id-KillAllWarningMessages,
+    id-TransportInformation,
+    id-LHN-ID,
+    id-UserLocationInformation,
+    id-AdditionalCSFallbackIndicator,
+    id-ECGIListForRestart,
+    id-TAIListForRestart,
+    id-EmergencyAreaIDListForRestart,
+    id-ExpectedUEBehaviour,
+    id-Paging-eDRXInformation,
+    id-extended-UEIdentityIndexValue,
+    id-CSGMembershipInfo,
+    id-MME-Group-ID,
+    id-Additional-GUTI,
+    id-S1-Message,
+    id-PWSfailedECGIList,
+    id-PWSFailureIndication,
+    id-UE-Usage-Type,
+    id-UEUserPlaneCIoTSupportIndicator,
+    id-NB-IoT-DefaultPagingDRX,
+    id-NB-IoT-Paging-eDRXInformation,
+    id-CE-mode-B-SupportIndicator,
+    id-NB-IoT-UEIdentityIndexValue,
+    id-RRC-Resume-Cause,
+    id-DCN-ID,
+    id-ServedDCNs,
+    id-UESidelinkAggregateMaximumBitrate,
+    id-DLNASPDUDeliveryAckRequest,
+    id-Coverage-Level,
+    id-EnhancedCoverageRestricted,
+    id-UE-Level-QoS-Parameters,
+    id-DL-CP-SecurityInformation,
+    id-UL-CP-SecurityInformation,
+    id-SecondaryRATDataUsageRequest,
+    id-SecondaryRATDataUsageReportList,
+    id-HandoverFlag,
+    id-NRUESecurityCapabilities,
+    id-UE-Application-Layer-Measurement-Capability,
+    id-CE-ModeBRestricted,
+    id-DownlinkPacketLossRate,
+    id-UplinkPacketLossRate,
+    id-UECapabilityInfoRequest,
+    id-EndIndication,
+    id-EDT-Session,
+    id-LTE-M-Indication,
+    id-PendingDataIndication,
+    id-WarningAreaCoordinates,
+    id-Subscription-Based-UE-DifferentiationInfo,
+    id-PSCellInformation,
+    id-ConnectedengNBList,
+    id-ConnectedengNBToAddList,
+    id-ConnectedengNBToRemoveList,
+    id-EN-DCSONConfigurationTransfer-ECT,
+    id-EN-DCSONConfigurationTransfer-MCT,
+    id-TimeSinceSecondaryNodeRelease
+
+
+
+FROM S1AP-Constants;
+
+-- **************************************************************
+--
+-- Common Container Lists
+--
+-- **************************************************************
+
+E-RAB-IE-ContainerList            { S1AP-PROTOCOL-IES      : IEsSetParam }    ::= ProtocolIE-ContainerList     { 1, maxnoofE-RABs,   {IEsSetParam} }
+E-RAB-IE-ContainerPairList        { S1AP-PROTOCOL-IES-PAIR : IEsSetParam }    ::= ProtocolIE-ContainerPairList { 1, maxnoofE-RABs,   {IEsSetParam} }
+ProtocolError-IE-ContainerList    { S1AP-PROTOCOL-IES      : IEsSetParam }    ::= ProtocolIE-ContainerList     { 1, maxnoofE-RABs,   {IEsSetParam} }
+
+-- **************************************************************
+--
+-- HANDOVER PREPARATION ELEMENTARY PROCEDURE
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- Handover Required
+--
+-- **************************************************************
+
+HandoverRequired ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container        { { HandoverRequiredIEs} },
+    ...
+}
+
+HandoverRequiredIEs S1AP-PROTOCOL-IES ::= {    
+    { ID id-MME-UE-S1AP-ID                            CRITICALITY reject    TYPE MME-UE-S1AP-ID                        PRESENCE mandatory}|
+    { ID id-eNB-UE-S1AP-ID                            CRITICALITY reject    TYPE ENB-UE-S1AP-ID                        PRESENCE mandatory}|
+    { ID id-HandoverType                            CRITICALITY reject    TYPE HandoverType                        PRESENCE mandatory}|
+    { ID id-Cause                                    CRITICALITY ignore    TYPE Cause                                PRESENCE mandatory}|
+    { ID id-TargetID                                CRITICALITY reject    TYPE TargetID                            PRESENCE mandatory}|
+    { ID id-Direct-Forwarding-Path-Availability        CRITICALITY ignore    TYPE Direct-Forwarding-Path-Availability        PRESENCE optional}|
+    { ID id-SRVCCHOIndication                        CRITICALITY reject    TYPE SRVCCHOIndication                    PRESENCE optional}|
+    { ID id-Source-ToTarget-TransparentContainer    CRITICALITY reject    TYPE Source-ToTarget-TransparentContainer    PRESENCE mandatory}|
+    { ID id-Source-ToTarget-TransparentContainer-Secondary    CRITICALITY reject    TYPE Source-ToTarget-TransparentContainer    PRESENCE optional}|
+    { ID id-MSClassmark2                            CRITICALITY reject    TYPE MSClassmark2                        PRESENCE conditional}|
+    { ID id-MSClassmark3                            CRITICALITY ignore    TYPE MSClassmark3                        PRESENCE conditional}|
+    { ID id-CSG-Id                                    CRITICALITY reject    TYPE CSG-Id                                PRESENCE optional}|
+    { ID id-CellAccessMode                            CRITICALITY reject    TYPE CellAccessMode                        PRESENCE optional}|
+    { ID id-PS-ServiceNotAvailable                    CRITICALITY ignore    TYPE PS-ServiceNotAvailable            PRESENCE optional},
+    ...
+}
+
+
+-- **************************************************************
+--
+-- Handover Command
+--
+-- **************************************************************
+
+HandoverCommand ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container        { { HandoverCommandIEs} },
+    ...
+}
+
+HandoverCommandIEs S1AP-PROTOCOL-IES ::= {    
+    { ID id-MME-UE-S1AP-ID                            CRITICALITY reject    TYPE MME-UE-S1AP-ID                            PRESENCE mandatory}|
+    { ID id-eNB-UE-S1AP-ID                            CRITICALITY reject    TYPE ENB-UE-S1AP-ID                            PRESENCE mandatory}|
+    { ID id-HandoverType                            CRITICALITY reject    TYPE HandoverType                            PRESENCE mandatory}|
+    { ID id-NASSecurityParametersfromE-UTRAN        CRITICALITY reject    TYPE NASSecurityParametersfromE-UTRAN            PRESENCE conditional
+    -- This IE shall be present if HandoverType IE is set to value "LTEtoUTRAN" or "LTEtoGERAN" --}|
+    { ID id-E-RABSubjecttoDataForwardingList        CRITICALITY ignore    TYPE E-RABSubjecttoDataForwardingList            PRESENCE optional}|
+    { ID id-E-RABtoReleaseListHOCmd                    CRITICALITY ignore    TYPE E-RABList                                PRESENCE optional}|
+    { ID id-Target-ToSource-TransparentContainer    CRITICALITY reject    TYPE Target-ToSource-TransparentContainer        PRESENCE mandatory}|
+    { ID id-Target-ToSource-TransparentContainer-Secondary    CRITICALITY reject    TYPE Target-ToSource-TransparentContainer    PRESENCE optional}|
+    { ID id-CriticalityDiagnostics                    CRITICALITY ignore    TYPE CriticalityDiagnostics                PRESENCE optional},
+    ...
+}
+
+E-RABSubjecttoDataForwardingList ::= E-RAB-IE-ContainerList { {E-RABDataForwardingItemIEs} }
+
+E-RABDataForwardingItemIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-E-RABDataForwardingItem                    CRITICALITY ignore    TYPE E-RABDataForwardingItem            PRESENCE mandatory    },
+    ...
+}
+
+E-RABDataForwardingItem ::= SEQUENCE {
+    e-RAB-ID                            E-RAB-ID,
+    dL-transportLayerAddress            TransportLayerAddress                                                     OPTIONAL,
+    dL-gTP-TEID                            GTP-TEID                                                                 OPTIONAL,
+    uL-TransportLayerAddress            TransportLayerAddress                                                    OPTIONAL,
+    uL-GTP-TEID                            GTP-TEID                                                                OPTIONAL,
+    iE-Extensions                        ProtocolExtensionContainer { { E-RABDataForwardingItem-ExtIEs} }            OPTIONAL,
+    ...
+}
+
+E-RABDataForwardingItem-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+
+
+-- **************************************************************
+--
+-- Handover Preparation Failure
+--
+-- **************************************************************
+
+HandoverPreparationFailure ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container        { { HandoverPreparationFailureIEs} },
+    ...
+}
+
+HandoverPreparationFailureIEs S1AP-PROTOCOL-IES ::= {    
+    { ID id-MME-UE-S1AP-ID                    CRITICALITY ignore    TYPE MME-UE-S1AP-ID                    PRESENCE mandatory    }|
+    { ID id-eNB-UE-S1AP-ID                    CRITICALITY ignore    TYPE ENB-UE-S1AP-ID                    PRESENCE mandatory    }|
+    { ID id-Cause                            CRITICALITY ignore    TYPE Cause                            PRESENCE mandatory    }|
+    { ID id-CriticalityDiagnostics            CRITICALITY ignore    TYPE CriticalityDiagnostics            PRESENCE optional    },
+    ...
+}
+
+-- **************************************************************
+--
+-- HANDOVER RESOURCE ALLOCATION ELEMENTARY PROCEDURE
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- Handover Request
+--
+-- **************************************************************
+
+HandoverRequest ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container        { {HandoverRequestIEs} },
+    ...
+}
+
+HandoverRequestIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID                            CRITICALITY reject    TYPE MME-UE-S1AP-ID                        PRESENCE mandatory}|
+    { ID id-HandoverType                            CRITICALITY reject    TYPE HandoverType                        PRESENCE mandatory}|
+    { ID id-Cause                                    CRITICALITY ignore    TYPE Cause                                PRESENCE mandatory}|
+    { ID id-uEaggregateMaximumBitrate                CRITICALITY reject    TYPE UEAggregateMaximumBitrate            PRESENCE mandatory}|
+    { ID id-E-RABToBeSetupListHOReq                    CRITICALITY reject    TYPE E-RABToBeSetupListHOReq            PRESENCE mandatory}|
+    { ID id-Source-ToTarget-TransparentContainer    CRITICALITY reject    TYPE Source-ToTarget-TransparentContainer    PRESENCE mandatory}|
+    { ID id-UESecurityCapabilities                    CRITICALITY reject    TYPE UESecurityCapabilities            PRESENCE mandatory}|
+    { ID id-HandoverRestrictionList                    CRITICALITY ignore    TYPE HandoverRestrictionList            PRESENCE optional}|
+    { ID id-TraceActivation                            CRITICALITY ignore    TYPE TraceActivation                    PRESENCE optional}|
+    { ID id-RequestType                                CRITICALITY ignore    TYPE RequestType                        PRESENCE optional}|
+    { ID id-SRVCCOperationPossible                    CRITICALITY ignore    TYPE SRVCCOperationPossible            PRESENCE optional}|
+    { ID id-SecurityContext                            CRITICALITY reject    TYPE SecurityContext                    PRESENCE mandatory}|
+    { ID id-NASSecurityParameterstoE-UTRAN            CRITICALITY reject    TYPE NASSecurityParameterstoE-UTRAN        PRESENCE conditional
+    -- This IE shall be present if the Handover Type IE is set to the value "UTRANtoLTE" or "GERANtoLTE" --                }|
+    { ID id-CSG-Id                                    CRITICALITY reject    TYPE CSG-Id                                PRESENCE optional}|
+    { ID id-CSGMembershipStatus                        CRITICALITY ignore    TYPE CSGMembershipStatus                PRESENCE optional}|
+    { ID id-GUMMEI-ID                                CRITICALITY ignore    TYPE GUMMEI                                PRESENCE optional}|
+    { ID id-MME-UE-S1AP-ID-2                        CRITICALITY ignore    TYPE MME-UE-S1AP-ID                        PRESENCE optional}|
+    { ID id-ManagementBasedMDTAllowed                CRITICALITY ignore    TYPE ManagementBasedMDTAllowed            PRESENCE optional}|
+    { ID id-ManagementBasedMDTPLMNList                CRITICALITY ignore    TYPE MDTPLMNList                        PRESENCE optional}|
+    { ID id-Masked-IMEISV                            CRITICALITY ignore    TYPE Masked-IMEISV                        PRESENCE optional}|
+    { ID id-ExpectedUEBehaviour                        CRITICALITY ignore    TYPE ExpectedUEBehaviour                PRESENCE optional}|
+    { ID id-ProSeAuthorized                            CRITICALITY ignore    TYPE ProSeAuthorized                    PRESENCE optional}|
+    { ID id-UEUserPlaneCIoTSupportIndicator            CRITICALITY ignore    TYPE UEUserPlaneCIoTSupportIndicator         PRESENCE optional}|
+    { ID id-V2XServicesAuthorized                    CRITICALITY ignore    TYPE V2XServicesAuthorized            PRESENCE optional}|
+    { ID id-UESidelinkAggregateMaximumBitrate        CRITICALITY ignore    TYPE UESidelinkAggregateMaximumBitrate        PRESENCE optional}|
+    { ID id-EnhancedCoverageRestricted                CRITICALITY ignore    TYPE EnhancedCoverageRestricted            PRESENCE optional}|
+    { ID id-NRUESecurityCapabilities                CRITICALITY ignore    TYPE NRUESecurityCapabilities            PRESENCE optional}|
+    { ID id-CE-ModeBRestricted                        CRITICALITY ignore    TYPE CE-ModeBRestricted                    PRESENCE optional}|
+    { ID id-AerialUEsubscriptionInformation            CRITICALITY ignore    TYPE AerialUEsubscriptionInformation                PRESENCE optional}|
+    { ID id-PendingDataIndication                    CRITICALITY ignore    TYPE PendingDataIndication            PRESENCE optional}|
+    { ID id-Subscription-Based-UE-DifferentiationInfo        CRITICALITY ignore    TYPE Subscription-Based-UE-DifferentiationInfo        PRESENCE optional},
+    ...
+}
+
+E-RABToBeSetupListHOReq                     ::= E-RAB-IE-ContainerList { {E-RABToBeSetupItemHOReqIEs} }
+
+E-RABToBeSetupItemHOReqIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-E-RABToBeSetupItemHOReq                CRITICALITY reject    TYPE E-RABToBeSetupItemHOReq            PRESENCE mandatory    },
+    ...
+}
+
+E-RABToBeSetupItemHOReq ::= SEQUENCE {
+    e-RAB-ID                            E-RAB-ID,
+    transportLayerAddress                TransportLayerAddress,
+    gTP-TEID                            GTP-TEID,
+    e-RABlevelQosParameters                E-RABLevelQoSParameters,
+    iE-Extensions                        ProtocolExtensionContainer { {E-RABToBeSetupItemHOReq-ExtIEs} }        OPTIONAL,
+    ...
+}
+
+E-RABToBeSetupItemHOReq-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    { ID id-Data-Forwarding-Not-Possible        CRITICALITY ignore    EXTENSION Data-Forwarding-Not-Possible    PRESENCE optional}|
+    { ID id-BearerType                            CRITICALITY reject    EXTENSION BearerType                    PRESENCE optional},
+    ...
+}
+
+-- **************************************************************
+--
+-- Handover Request Acknowledge
+--
+-- **************************************************************
+
+HandoverRequestAcknowledge ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { {HandoverRequestAcknowledgeIEs} },
+    ...
+}
+
+HandoverRequestAcknowledgeIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID                            CRITICALITY ignore    TYPE MME-UE-S1AP-ID                        PRESENCE mandatory}|
+    { ID id-eNB-UE-S1AP-ID                            CRITICALITY ignore    TYPE ENB-UE-S1AP-ID                        PRESENCE mandatory}|
+    { ID id-E-RABAdmittedList                        CRITICALITY ignore    TYPE E-RABAdmittedList                    PRESENCE mandatory}|
+    { ID id-E-RABFailedToSetupListHOReqAck            CRITICALITY ignore    TYPE E-RABFailedtoSetupListHOReqAck        PRESENCE optional}|
+    { ID id-Target-ToSource-TransparentContainer    CRITICALITY reject    TYPE Target-ToSource-TransparentContainer    PRESENCE mandatory}|
+    { ID id-CSG-Id                                    CRITICALITY ignore    TYPE CSG-Id                                PRESENCE optional}|
+    { ID id-CriticalityDiagnostics                    CRITICALITY ignore    TYPE CriticalityDiagnostics            PRESENCE optional}|
+    { ID id-CellAccessMode                            CRITICALITY ignore    TYPE CellAccessMode                        PRESENCE optional}|
+    { ID id-CE-mode-B-SupportIndicator                CRITICALITY ignore    TYPE CE-mode-B-SupportIndicator            PRESENCE optional},
+    ...
+}
+
+E-RABAdmittedList                     ::= E-RAB-IE-ContainerList { {E-RABAdmittedItemIEs} }
+
+E-RABAdmittedItemIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-E-RABAdmittedItem            CRITICALITY ignore    TYPE E-RABAdmittedItem            PRESENCE mandatory    },
+    ...
+}
+
+E-RABAdmittedItem ::= SEQUENCE {
+    e-RAB-ID                        E-RAB-ID,
+    transportLayerAddress            TransportLayerAddress,
+    gTP-TEID                        GTP-TEID,
+    dL-transportLayerAddress        TransportLayerAddress    OPTIONAL,
+    dL-gTP-TEID                        GTP-TEID                OPTIONAL,
+    uL-TransportLayerAddress        TransportLayerAddress    OPTIONAL,
+    uL-GTP-TEID                        GTP-TEID                OPTIONAL,
+    iE-Extensions                    ProtocolExtensionContainer { {E-RABAdmittedItem-ExtIEs} }    OPTIONAL,
+    ...
+}
+
+E-RABAdmittedItem-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+E-RABFailedtoSetupListHOReqAck                     ::= E-RAB-IE-ContainerList { {E-RABFailedtoSetupItemHOReqAckIEs} }
+
+E-RABFailedtoSetupItemHOReqAckIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-E-RABFailedtoSetupItemHOReqAck            CRITICALITY ignore    TYPE E-RABFailedToSetupItemHOReqAck            PRESENCE mandatory    },
+    ...
+}
+
+E-RABFailedToSetupItemHOReqAck ::= SEQUENCE {
+    e-RAB-ID                        E-RAB-ID,
+    cause                Cause,
+    iE-Extensions                    ProtocolExtensionContainer { { E-RABFailedToSetupItemHOReqAckExtIEs} }            OPTIONAL,
+    ...
+}
+
+E-RABFailedToSetupItemHOReqAckExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+
+-- **************************************************************
+--
+-- Handover Failure
+--
+-- **************************************************************
+
+HandoverFailure ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { { HandoverFailureIEs} },
+    ...
+}
+
+HandoverFailureIEs S1AP-PROTOCOL-IES ::= {    
+    { ID id-MME-UE-S1AP-ID                CRITICALITY ignore    TYPE MME-UE-S1AP-ID                    PRESENCE mandatory    }|
+    { ID id-Cause                        CRITICALITY ignore    TYPE Cause                            PRESENCE mandatory    }|
+    { ID id-CriticalityDiagnostics        CRITICALITY ignore    TYPE CriticalityDiagnostics            PRESENCE optional    },
+    ...
+}
+
+-- **************************************************************
+--
+-- HANDOVER NOTIFICATION ELEMENTARY PROCEDURE
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- Handover Notify
+--
+-- **************************************************************
+
+HandoverNotify ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { { HandoverNotifyIEs} },
+    ...
+}
+
+HandoverNotifyIEs S1AP-PROTOCOL-IES ::= {    
+    { ID id-MME-UE-S1AP-ID                    CRITICALITY reject    TYPE MME-UE-S1AP-ID            PRESENCE mandatory}|
+    { ID id-eNB-UE-S1AP-ID                    CRITICALITY reject    TYPE ENB-UE-S1AP-ID            PRESENCE mandatory}|
+    { ID id-EUTRAN-CGI                        CRITICALITY ignore    TYPE EUTRAN-CGI                PRESENCE mandatory}|
+    { ID id-TAI                                CRITICALITY ignore    TYPE TAI                    PRESENCE mandatory}|
+-- Extension for Release 11 to support BBAI -- 
+    { ID id-Tunnel-Information-for-BBF        CRITICALITY ignore    TYPE TunnelInformation        PRESENCE optional}|
+    { ID id-LHN-ID                            CRITICALITY ignore    TYPE LHN-ID                    PRESENCE optional}|
+    { ID id-PSCellInformation                CRITICALITY ignore    TYPE PSCellInformation        PRESENCE optional },
+    ...
+}
+
+-- **************************************************************
+--
+-- PATH SWITCH REQUEST ELEMENTARY PROCEDURE
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- Path Switch Request
+--
+-- **************************************************************
+
+PathSwitchRequest ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { { PathSwitchRequestIEs} },
+    ...
+}
+
+PathSwitchRequestIEs S1AP-PROTOCOL-IES ::= {    
+    { ID id-eNB-UE-S1AP-ID                    CRITICALITY reject    TYPE ENB-UE-S1AP-ID                PRESENCE mandatory}|
+    { ID id-E-RABToBeSwitchedDLList            CRITICALITY reject    TYPE E-RABToBeSwitchedDLList    PRESENCE mandatory}|
+    { ID id-SourceMME-UE-S1AP-ID            CRITICALITY reject    TYPE MME-UE-S1AP-ID                PRESENCE mandatory}|
+    { ID id-EUTRAN-CGI                        CRITICALITY ignore    TYPE EUTRAN-CGI                    PRESENCE mandatory}|
+    { ID id-TAI                                CRITICALITY ignore    TYPE TAI                        PRESENCE mandatory}|
+    { ID id-UESecurityCapabilities            CRITICALITY ignore    TYPE UESecurityCapabilities        PRESENCE mandatory}|
+    { ID id-CSG-Id                            CRITICALITY ignore    TYPE CSG-Id                        PRESENCE optional}|
+    { ID id-CellAccessMode                    CRITICALITY ignore    TYPE CellAccessMode                PRESENCE optional}|
+    { ID id-SourceMME-GUMMEI                CRITICALITY ignore    TYPE GUMMEI                        PRESENCE optional}|
+    { ID id-CSGMembershipStatus                CRITICALITY ignore    TYPE CSGMembershipStatus        PRESENCE optional}|
+-- Extension for Release 11 to support BBAI -- 
+    { ID id-Tunnel-Information-for-BBF        CRITICALITY ignore    TYPE TunnelInformation            PRESENCE optional}|
+    { ID id-LHN-ID                            CRITICALITY ignore    TYPE LHN-ID                        PRESENCE optional}|
+    { ID id-RRC-Resume-Cause                CRITICALITY ignore    TYPE RRC-Establishment-Cause    PRESENCE optional }|
+    { ID id-NRUESecurityCapabilities                CRITICALITY ignore    TYPE NRUESecurityCapabilities            PRESENCE optional}|
+    { ID id-PSCellInformation                CRITICALITY ignore    TYPE PSCellInformation            PRESENCE optional },
+    ...
+}
+
+E-RABToBeSwitchedDLList                    ::= E-RAB-IE-ContainerList { {E-RABToBeSwitchedDLItemIEs} }
+
+E-RABToBeSwitchedDLItemIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-E-RABToBeSwitchedDLItem            CRITICALITY reject    TYPE E-RABToBeSwitchedDLItem            PRESENCE mandatory    },
+    ...
+}
+
+E-RABToBeSwitchedDLItem ::= SEQUENCE {
+    e-RAB-ID                        E-RAB-ID,
+    transportLayerAddress            TransportLayerAddress,
+    gTP-TEID                        GTP-TEID,
+    iE-Extensions                    ProtocolExtensionContainer { { E-RABToBeSwitchedDLItem-ExtIEs} }            OPTIONAL,
+    ...
+}
+
+E-RABToBeSwitchedDLItem-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+-- **************************************************************
+--
+-- Path Switch Request Acknowledge
+--
+-- **************************************************************
+
+PathSwitchRequestAcknowledge ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { { PathSwitchRequestAcknowledgeIEs} },
+    ...
+}
+
+PathSwitchRequestAcknowledgeIEs S1AP-PROTOCOL-IES ::= {    
+    { ID id-MME-UE-S1AP-ID                    CRITICALITY ignore    TYPE MME-UE-S1AP-ID                        PRESENCE mandatory}|
+    { ID id-eNB-UE-S1AP-ID                    CRITICALITY ignore    TYPE ENB-UE-S1AP-ID                        PRESENCE mandatory}|
+    { ID id-uEaggregateMaximumBitrate        CRITICALITY ignore    TYPE UEAggregateMaximumBitrate            PRESENCE optional}|
+    { ID id-E-RABToBeSwitchedULList            CRITICALITY ignore    TYPE E-RABToBeSwitchedULList            PRESENCE optional}|
+    { ID id-E-RABToBeReleasedList            CRITICALITY ignore    TYPE E-RABList                            PRESENCE optional}|
+    { ID id-SecurityContext                    CRITICALITY reject    TYPE SecurityContext                    PRESENCE mandatory}|
+    { ID id-CriticalityDiagnostics            CRITICALITY ignore    TYPE CriticalityDiagnostics                PRESENCE optional}|
+    { ID id-MME-UE-S1AP-ID-2                CRITICALITY ignore    TYPE MME-UE-S1AP-ID                        PRESENCE optional}|
+    { ID id-CSGMembershipStatus                CRITICALITY ignore    TYPE CSGMembershipStatus                PRESENCE optional}|
+    { ID id-ProSeAuthorized                    CRITICALITY ignore    TYPE ProSeAuthorized                    PRESENCE optional}|
+    { ID id-UEUserPlaneCIoTSupportIndicator    CRITICALITY ignore    TYPE UEUserPlaneCIoTSupportIndicator    PRESENCE optional}|
+    { ID id-V2XServicesAuthorized            CRITICALITY ignore    TYPE V2XServicesAuthorized                PRESENCE optional}|
+    { ID id-UESidelinkAggregateMaximumBitrate        CRITICALITY ignore    TYPE UESidelinkAggregateMaximumBitrate    PRESENCE optional}|
+    { ID id-EnhancedCoverageRestricted        CRITICALITY ignore    TYPE EnhancedCoverageRestricted            PRESENCE optional}|
+    { ID id-NRUESecurityCapabilities                CRITICALITY ignore    TYPE NRUESecurityCapabilities            PRESENCE optional}|
+    { ID id-CE-ModeBRestricted                CRITICALITY ignore    TYPE CE-ModeBRestricted            PRESENCE optional}|
+    { ID id-AerialUEsubscriptionInformation            CRITICALITY ignore    TYPE AerialUEsubscriptionInformation                PRESENCE optional}|
+    { ID id-PendingDataIndication            CRITICALITY ignore    TYPE PendingDataIndication                PRESENCE optional}|
+    { ID id-Subscription-Based-UE-DifferentiationInfo        CRITICALITY ignore    TYPE Subscription-Based-UE-DifferentiationInfo        PRESENCE optional},
+    ...
+}
+
+E-RABToBeSwitchedULList ::= E-RAB-IE-ContainerList { {E-RABToBeSwitchedULItemIEs} }
+
+E-RABToBeSwitchedULItemIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-E-RABToBeSwitchedULItem        CRITICALITY ignore    TYPE E-RABToBeSwitchedULItem        PRESENCE mandatory    },
+    ...
+}
+
+E-RABToBeSwitchedULItem ::= SEQUENCE {
+    e-RAB-ID                            E-RAB-ID,
+    transportLayerAddress                TransportLayerAddress,
+    gTP-TEID                            GTP-TEID,
+    iE-Extensions                        ProtocolExtensionContainer { { E-RABToBeSwitchedULItem-ExtIEs} }    OPTIONAL,
+    ...
+}
+
+E-RABToBeSwitchedULItem-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+
+-- **************************************************************
+--
+-- Path Switch Request Failure
+--
+-- **************************************************************
+
+PathSwitchRequestFailure ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { { PathSwitchRequestFailureIEs} },
+    ...
+}
+
+PathSwitchRequestFailureIEs S1AP-PROTOCOL-IES ::= {    
+    { ID id-MME-UE-S1AP-ID                    CRITICALITY ignore    TYPE MME-UE-S1AP-ID                    PRESENCE mandatory    }|
+    { ID id-eNB-UE-S1AP-ID                    CRITICALITY ignore    TYPE ENB-UE-S1AP-ID                    PRESENCE mandatory    }|
+    { ID id-Cause                            CRITICALITY ignore    TYPE Cause                            PRESENCE mandatory    }|
+    { ID id-CriticalityDiagnostics            CRITICALITY ignore    TYPE CriticalityDiagnostics            PRESENCE optional    },
+    ...
+}
+
+-- **************************************************************
+--
+-- HANDOVER CANCEL ELEMENTARY PROCEDURE
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- Handover Cancel
+--
+-- **************************************************************
+
+HandoverCancel ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { { HandoverCancelIEs} },
+    ...
+}
+
+HandoverCancelIEs S1AP-PROTOCOL-IES ::= {    
+    { ID id-MME-UE-S1AP-ID                    CRITICALITY reject    TYPE MME-UE-S1AP-ID                    PRESENCE mandatory    }|
+    { ID id-eNB-UE-S1AP-ID                    CRITICALITY reject    TYPE ENB-UE-S1AP-ID                    PRESENCE mandatory    }|
+    { ID id-Cause                            CRITICALITY ignore    TYPE Cause                            PRESENCE mandatory    },
+    ...
+}
+
+-- **************************************************************
+--
+-- Handover Cancel Request Acknowledge
+--
+-- **************************************************************
+
+HandoverCancelAcknowledge ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { { HandoverCancelAcknowledgeIEs} },
+    ...
+}
+
+HandoverCancelAcknowledgeIEs S1AP-PROTOCOL-IES ::= {    
+    { ID id-MME-UE-S1AP-ID                    CRITICALITY ignore    TYPE MME-UE-S1AP-ID                    PRESENCE mandatory    }|
+    { ID id-eNB-UE-S1AP-ID                    CRITICALITY ignore    TYPE ENB-UE-S1AP-ID                    PRESENCE mandatory    }|
+    { ID id-CriticalityDiagnostics            CRITICALITY ignore    TYPE CriticalityDiagnostics            PRESENCE optional    },
+    ...
+}
+
+-- **************************************************************
+--
+-- E-RAB SETUP ELEMENTARY PROCEDURE
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- E-RAB Setup Request
+--
+-- **************************************************************
+
+E-RABSetupRequest ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { {E-RABSetupRequestIEs} },
+    ...
+}
+
+E-RABSetupRequestIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID                    CRITICALITY reject    TYPE MME-UE-S1AP-ID                        PRESENCE mandatory    }|
+    { ID id-eNB-UE-S1AP-ID                    CRITICALITY reject    TYPE ENB-UE-S1AP-ID                        PRESENCE mandatory    }|
+    { ID id-uEaggregateMaximumBitrate        CRITICALITY reject    TYPE UEAggregateMaximumBitrate            PRESENCE optional    }|
+    { ID id-E-RABToBeSetupListBearerSUReq    CRITICALITY reject    TYPE E-RABToBeSetupListBearerSUReq    PRESENCE mandatory    },
+    ...
+}
+
+E-RABToBeSetupListBearerSUReq ::= SEQUENCE (SIZE(1.. maxnoofE-RABs)) OF ProtocolIE-SingleContainer { {E-RABToBeSetupItemBearerSUReqIEs} }
+
+E-RABToBeSetupItemBearerSUReqIEs     S1AP-PROTOCOL-IES ::= {
+    { ID id-E-RABToBeSetupItemBearerSUReq     CRITICALITY reject     TYPE E-RABToBeSetupItemBearerSUReq     PRESENCE mandatory },
+    ...
+}
+
+E-RABToBeSetupItemBearerSUReq ::= SEQUENCE {
+    e-RAB-ID                        E-RAB-ID,
+    e-RABlevelQoSParameters            E-RABLevelQoSParameters,
+    transportLayerAddress            TransportLayerAddress,
+    gTP-TEID                        GTP-TEID,
+    nAS-PDU                            NAS-PDU,
+    iE-Extensions                    ProtocolExtensionContainer { {E-RABToBeSetupItemBearerSUReqExtIEs} } OPTIONAL,
+    ...
+}
+
+
+E-RABToBeSetupItemBearerSUReqExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    { ID id-Correlation-ID            CRITICALITY ignore    EXTENSION Correlation-ID        PRESENCE optional}|
+    { ID id-SIPTO-Correlation-ID    CRITICALITY ignore    EXTENSION Correlation-ID        PRESENCE optional}|
+    { ID id-BearerType                CRITICALITY reject    EXTENSION BearerType            PRESENCE optional},
+    ...
+}
+
+
+-- **************************************************************
+--
+-- E-RAB Setup Response
+--
+-- **************************************************************
+
+E-RABSetupResponse ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { {E-RABSetupResponseIEs} },
+    ...
+}
+
+E-RABSetupResponseIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID                            CRITICALITY ignore    TYPE MME-UE-S1AP-ID                PRESENCE mandatory    }|
+    { ID id-eNB-UE-S1AP-ID                            CRITICALITY ignore    TYPE ENB-UE-S1AP-ID                PRESENCE mandatory    }|
+    { ID id-E-RABSetupListBearerSURes                CRITICALITY ignore    TYPE E-RABSetupListBearerSURes    PRESENCE optional    }|
+    { ID id-E-RABFailedToSetupListBearerSURes        CRITICALITY ignore    TYPE E-RABList                    PRESENCE optional    }|
+    { ID id-CriticalityDiagnostics                    CRITICALITY ignore    TYPE CriticalityDiagnostics    PRESENCE optional    },
+    ...
+}
+
+
+E-RABSetupListBearerSURes ::= SEQUENCE (SIZE(1.. maxnoofE-RABs)) OF ProtocolIE-SingleContainer { {E-RABSetupItemBearerSUResIEs} }
+
+E-RABSetupItemBearerSUResIEs     S1AP-PROTOCOL-IES ::= {
+    { ID id-E-RABSetupItemBearerSURes     CRITICALITY ignore     TYPE E-RABSetupItemBearerSURes     PRESENCE mandatory },
+    ...
+}
+
+E-RABSetupItemBearerSURes ::= SEQUENCE {
+    e-RAB-ID                    E-RAB-ID,
+    transportLayerAddress        TransportLayerAddress,
+    gTP-TEID                    GTP-TEID,
+    iE-Extensions                ProtocolExtensionContainer { {E-RABSetupItemBearerSUResExtIEs} } OPTIONAL,
+    ...
+}
+
+
+E-RABSetupItemBearerSUResExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+
+
+-- **************************************************************
+--
+-- E-RAB MODIFY ELEMENTARY PROCEDURE
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- E-RAB Modify Request
+--
+-- **************************************************************
+
+E-RABModifyRequest ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { {E-RABModifyRequestIEs} },
+    ...
+}
+
+E-RABModifyRequestIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID                        CRITICALITY reject    TYPE MME-UE-S1AP-ID                            PRESENCE mandatory    }|
+    { ID id-eNB-UE-S1AP-ID                        CRITICALITY reject    TYPE ENB-UE-S1AP-ID                            PRESENCE mandatory    }|
+    { ID id-uEaggregateMaximumBitrate            CRITICALITY reject    TYPE UEAggregateMaximumBitrate            PRESENCE optional    }|
+    { ID id-E-RABToBeModifiedListBearerModReq    CRITICALITY reject    TYPE E-RABToBeModifiedListBearerModReq        PRESENCE mandatory    }|
+    { ID id-SecondaryRATDataUsageRequest        CRITICALITY ignore    TYPE SecondaryRATDataUsageRequest        PRESENCE optional    },
+    ...
+}
+
+E-RABToBeModifiedListBearerModReq ::= SEQUENCE (SIZE(1.. maxnoofE-RABs)) OF ProtocolIE-SingleContainer { {E-RABToBeModifiedItemBearerModReqIEs} }
+
+E-RABToBeModifiedItemBearerModReqIEs     S1AP-PROTOCOL-IES ::= {
+    { ID id-E-RABToBeModifiedItemBearerModReq     CRITICALITY reject     TYPE E-RABToBeModifiedItemBearerModReq     PRESENCE mandatory },
+    ...
+}
+
+E-RABToBeModifiedItemBearerModReq ::= SEQUENCE {
+    e-RAB-ID                        E-RAB-ID,
+    e-RABLevelQoSParameters            E-RABLevelQoSParameters,
+    nAS-PDU                            NAS-PDU,
+    iE-Extensions                    ProtocolExtensionContainer { {E-RABToBeModifyItemBearerModReqExtIEs} } OPTIONAL,
+    ...
+}
+
+
+E-RABToBeModifyItemBearerModReqExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    { ID id-TransportInformation    CRITICALITY reject    EXTENSION TransportInformation        PRESENCE optional},
+    ...
+}
+
+
+
+-- **************************************************************
+--
+-- E-RAB Modify Response
+--
+-- **************************************************************
+
+E-RABModifyResponse ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { {E-RABModifyResponseIEs} },
+    ...
+}
+
+E-RABModifyResponseIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID                    CRITICALITY ignore    TYPE MME-UE-S1AP-ID                        PRESENCE mandatory    }|
+    { ID id-eNB-UE-S1AP-ID                    CRITICALITY ignore    TYPE ENB-UE-S1AP-ID                        PRESENCE mandatory    }|
+    { ID id-E-RABModifyListBearerModRes        CRITICALITY ignore    TYPE E-RABModifyListBearerModRes        PRESENCE optional    }|
+    { ID id-E-RABFailedToModifyList            CRITICALITY ignore    TYPE E-RABList                            PRESENCE optional    }|
+    { ID id-CriticalityDiagnostics            CRITICALITY ignore    TYPE CriticalityDiagnostics                PRESENCE optional    }|
+    { ID id-SecondaryRATDataUsageReportList        CRITICALITY ignore    TYPE SecondaryRATDataUsageReportList            PRESENCE optional    },
+    ...
+}
+
+
+E-RABModifyListBearerModRes ::= SEQUENCE (SIZE(1.. maxnoofE-RABs)) OF ProtocolIE-SingleContainer { {E-RABModifyItemBearerModResIEs} }
+
+E-RABModifyItemBearerModResIEs     S1AP-PROTOCOL-IES ::= {
+    { ID id-E-RABModifyItemBearerModRes        CRITICALITY ignore    TYPE E-RABModifyItemBearerModRes        PRESENCE mandatory},
+    ...
+}
+
+E-RABModifyItemBearerModRes ::= SEQUENCE {
+    e-RAB-ID                    E-RAB-ID,
+    iE-Extensions                ProtocolExtensionContainer { {E-RABModifyItemBearerModResExtIEs} } OPTIONAL,
+    ...
+}
+
+
+E-RABModifyItemBearerModResExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+
+
+
+-- **************************************************************
+--
+-- E-RAB RELEASE ELEMENTARY PROCEDURE
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- E-RAB Release Command
+--
+-- **************************************************************
+
+E-RABReleaseCommand ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container        { {E-RABReleaseCommandIEs} },
+    ...
+}
+
+E-RABReleaseCommandIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID                    CRITICALITY reject    TYPE MME-UE-S1AP-ID                    PRESENCE mandatory    }|
+    { ID id-eNB-UE-S1AP-ID                    CRITICALITY reject    TYPE ENB-UE-S1AP-ID                    PRESENCE mandatory    }|
+    { ID id-uEaggregateMaximumBitrate        CRITICALITY reject    TYPE UEAggregateMaximumBitrate        PRESENCE optional    }|
+    { ID id-E-RABToBeReleasedList            CRITICALITY ignore    TYPE E-RABList                        PRESENCE mandatory    }|
+    { ID id-NAS-PDU                            CRITICALITY ignore    TYPE NAS-PDU                        PRESENCE optional    },
+    ...
+}
+
+
+-- **************************************************************
+--
+-- E-RAB Release Response
+--
+-- **************************************************************
+
+E-RABReleaseResponse ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { { E-RABReleaseResponseIEs } },
+    ...
+}
+
+E-RABReleaseResponseIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID                    CRITICALITY ignore    TYPE MME-UE-S1AP-ID                        PRESENCE mandatory    }|
+    { ID id-eNB-UE-S1AP-ID                    CRITICALITY ignore    TYPE ENB-UE-S1AP-ID                        PRESENCE mandatory    }|
+    { ID id-E-RABReleaseListBearerRelComp    CRITICALITY ignore    TYPE E-RABReleaseListBearerRelComp    PRESENCE optional    }|
+    { ID id-E-RABFailedToReleaseList        CRITICALITY ignore    TYPE E-RABList                            PRESENCE optional    }|
+    { ID id-CriticalityDiagnostics            CRITICALITY ignore    TYPE CriticalityDiagnostics                PRESENCE optional    }|
+-- Extension for Release 12 to support User Location Information -- 
+    { ID id-UserLocationInformation            CRITICALITY ignore    TYPE UserLocationInformation            PRESENCE optional    }|
+    { ID id-SecondaryRATDataUsageReportList        CRITICALITY ignore    TYPE SecondaryRATDataUsageReportList            PRESENCE optional    },
+    ...
+}
+
+
+E-RABReleaseListBearerRelComp ::= SEQUENCE (SIZE(1.. maxnoofE-RABs)) OF ProtocolIE-SingleContainer { {E-RABReleaseItemBearerRelCompIEs} }
+
+E-RABReleaseItemBearerRelCompIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-E-RABReleaseItemBearerRelComp    CRITICALITY ignore    TYPE E-RABReleaseItemBearerRelComp    PRESENCE mandatory },
+    ...
+}
+
+E-RABReleaseItemBearerRelComp ::= SEQUENCE {
+    e-RAB-ID                        E-RAB-ID,
+    iE-Extensions                    ProtocolExtensionContainer { {E-RABReleaseItemBearerRelCompExtIEs} } OPTIONAL,
+    ...
+}
+
+
+E-RABReleaseItemBearerRelCompExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+
+
+-- **************************************************************
+--
+-- E-RAB RELEASE INDICATION ELEMENTARY PROCEDURE
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- E-RAB Release Indication
+--
+-- **************************************************************
+
+E-RABReleaseIndication ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { {E-RABReleaseIndicationIEs} },
+    ...
+}
+
+E-RABReleaseIndicationIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID                    CRITICALITY reject    TYPE MME-UE-S1AP-ID                    PRESENCE mandatory    }|
+    { ID id-eNB-UE-S1AP-ID                    CRITICALITY reject    TYPE ENB-UE-S1AP-ID                    PRESENCE mandatory    }|
+    { ID id-E-RABReleasedList                CRITICALITY ignore    TYPE E-RABList                        PRESENCE mandatory    }|
+-- Extension for Release 12 to support User Location Information -- 
+    { ID id-UserLocationInformation            CRITICALITY ignore    TYPE UserLocationInformation        PRESENCE optional    }|
+    { ID id-SecondaryRATDataUsageReportList        CRITICALITY ignore    TYPE SecondaryRATDataUsageReportList        PRESENCE optional    },
+    ...
+}
+-- **************************************************************
+--
+-- INITIAL CONTEXT SETUP ELEMENTARY PROCEDURE
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- Initial Context Setup Request
+--
+-- **************************************************************
+
+InitialContextSetupRequest ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { {InitialContextSetupRequestIEs} },
+    ...
+}
+
+InitialContextSetupRequestIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID                    CRITICALITY reject    TYPE MME-UE-S1AP-ID                        PRESENCE mandatory}|
+    { ID id-eNB-UE-S1AP-ID                    CRITICALITY reject    TYPE ENB-UE-S1AP-ID                        PRESENCE mandatory}|
+    { ID id-uEaggregateMaximumBitrate        CRITICALITY reject    TYPE UEAggregateMaximumBitrate            PRESENCE mandatory}|
+    { ID id-E-RABToBeSetupListCtxtSUReq        CRITICALITY reject    TYPE E-RABToBeSetupListCtxtSUReq        PRESENCE mandatory}|
+    { ID id-UESecurityCapabilities            CRITICALITY reject    TYPE UESecurityCapabilities                PRESENCE mandatory}|
+    { ID id-SecurityKey                        CRITICALITY reject    TYPE SecurityKey                        PRESENCE mandatory}|
+    { ID id-TraceActivation                    CRITICALITY ignore    TYPE TraceActivation                    PRESENCE optional}|
+    { ID id-HandoverRestrictionList            CRITICALITY ignore    TYPE HandoverRestrictionList            PRESENCE optional}|
+    { ID id-UERadioCapability                CRITICALITY ignore    TYPE UERadioCapability                    PRESENCE optional}|
+    { ID id-SubscriberProfileIDforRFP        CRITICALITY ignore    TYPE SubscriberProfileIDforRFP            PRESENCE optional}|
+    { ID id-CSFallbackIndicator                CRITICALITY reject    TYPE CSFallbackIndicator                PRESENCE optional}|
+    { ID id-SRVCCOperationPossible            CRITICALITY ignore    TYPE SRVCCOperationPossible                PRESENCE optional}|
+    { ID id-CSGMembershipStatus                CRITICALITY ignore    TYPE CSGMembershipStatus                PRESENCE optional}|
+    { ID id-RegisteredLAI                    CRITICALITY ignore    TYPE LAI                                PRESENCE optional}|
+    { ID id-GUMMEI-ID                        CRITICALITY ignore    TYPE GUMMEI                                PRESENCE optional}|
+    { ID id-MME-UE-S1AP-ID-2                CRITICALITY ignore    TYPE MME-UE-S1AP-ID                        PRESENCE optional}|
+    { ID id-ManagementBasedMDTAllowed        CRITICALITY ignore    TYPE ManagementBasedMDTAllowed            PRESENCE optional}|
+    { ID id-ManagementBasedMDTPLMNList        CRITICALITY ignore    TYPE MDTPLMNList                        PRESENCE optional}|
+    { ID id-AdditionalCSFallbackIndicator    CRITICALITY ignore    TYPE AdditionalCSFallbackIndicator    PRESENCE conditional}|
+    { ID id-Masked-IMEISV                    CRITICALITY ignore    TYPE Masked-IMEISV                        PRESENCE optional}|
+    { ID id-ExpectedUEBehaviour                CRITICALITY ignore    TYPE ExpectedUEBehaviour                PRESENCE optional}|
+    { ID id-ProSeAuthorized                    CRITICALITY ignore    TYPE ProSeAuthorized                    PRESENCE optional}|
+    { ID id-UEUserPlaneCIoTSupportIndicator    CRITICALITY ignore    TYPE UEUserPlaneCIoTSupportIndicator    PRESENCE optional}|
+    { ID id-V2XServicesAuthorized            CRITICALITY ignore    TYPE V2XServicesAuthorized                PRESENCE optional}|
+    { ID id-UESidelinkAggregateMaximumBitrate        CRITICALITY ignore    TYPE UESidelinkAggregateMaximumBitrate    PRESENCE optional}|
+    { ID id-EnhancedCoverageRestricted        CRITICALITY ignore    TYPE EnhancedCoverageRestricted            PRESENCE optional}|
+    { ID id-NRUESecurityCapabilities                CRITICALITY ignore    TYPE NRUESecurityCapabilities            PRESENCE optional}|
+    { ID id-CE-ModeBRestricted                CRITICALITY ignore    TYPE CE-ModeBRestricted            PRESENCE optional}|
+    { ID id-AerialUEsubscriptionInformation    CRITICALITY ignore    TYPE AerialUEsubscriptionInformation                PRESENCE optional}|
+    { ID id-PendingDataIndication            CRITICALITY ignore    TYPE PendingDataIndication                PRESENCE optional}|
+    { ID id-Subscription-Based-UE-DifferentiationInfo        CRITICALITY ignore    TYPE Subscription-Based-UE-DifferentiationInfo        PRESENCE optional},
+    ...
+}
+
+
+
+
+E-RABToBeSetupListCtxtSUReq ::= SEQUENCE (SIZE(1.. maxnoofE-RABs)) OF ProtocolIE-SingleContainer { {E-RABToBeSetupItemCtxtSUReqIEs} }
+
+E-RABToBeSetupItemCtxtSUReqIEs     S1AP-PROTOCOL-IES ::= {
+    { ID id-E-RABToBeSetupItemCtxtSUReq    CRITICALITY reject    TYPE E-RABToBeSetupItemCtxtSUReq        PRESENCE mandatory    },
+    ...
+}
+
+E-RABToBeSetupItemCtxtSUReq ::= SEQUENCE {
+    e-RAB-ID                        E-RAB-ID,
+    e-RABlevelQoSParameters            E-RABLevelQoSParameters,
+    transportLayerAddress            TransportLayerAddress,
+    gTP-TEID                        GTP-TEID,
+    nAS-PDU                            NAS-PDU        OPTIONAL,
+    iE-Extensions                    ProtocolExtensionContainer { {E-RABToBeSetupItemCtxtSUReqExtIEs} } OPTIONAL,
+    ...
+}
+
+
+E-RABToBeSetupItemCtxtSUReqExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    { ID id-Correlation-ID                    CRITICALITY ignore    EXTENSION Correlation-ID            PRESENCE optional}|
+    { ID id-SIPTO-Correlation-ID            CRITICALITY ignore    EXTENSION Correlation-ID            PRESENCE optional}|
+    { ID id-BearerType                        CRITICALITY reject    EXTENSION BearerType                PRESENCE optional},
+    ...
+}
+
+
+-- **************************************************************
+--
+-- Initial Context Setup Response
+--
+-- **************************************************************
+
+InitialContextSetupResponse ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { {InitialContextSetupResponseIEs} },
+    ...
+}
+
+InitialContextSetupResponseIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID                        CRITICALITY ignore    TYPE MME-UE-S1AP-ID                    PRESENCE mandatory    }|
+    { ID id-eNB-UE-S1AP-ID                        CRITICALITY ignore    TYPE ENB-UE-S1AP-ID                    PRESENCE mandatory    }|
+    { ID id-E-RABSetupListCtxtSURes                CRITICALITY ignore    TYPE E-RABSetupListCtxtSURes        PRESENCE mandatory    }|
+    { ID id-E-RABFailedToSetupListCtxtSURes        CRITICALITY ignore    TYPE E-RABList                        PRESENCE optional    }|
+    { ID id-CriticalityDiagnostics                CRITICALITY ignore    TYPE CriticalityDiagnostics            PRESENCE optional    },
+    ...
+}
+
+
+E-RABSetupListCtxtSURes ::= SEQUENCE (SIZE(1.. maxnoofE-RABs)) OF ProtocolIE-SingleContainer { {E-RABSetupItemCtxtSUResIEs} }
+
+E-RABSetupItemCtxtSUResIEs     S1AP-PROTOCOL-IES ::= {
+    { ID id-E-RABSetupItemCtxtSURes        CRITICALITY ignore    TYPE E-RABSetupItemCtxtSURes    PRESENCE mandatory    },
+    ...
+}
+
+E-RABSetupItemCtxtSURes ::= SEQUENCE {
+    e-RAB-ID                        E-RAB-ID,
+    transportLayerAddress             TransportLayerAddress,
+    gTP-TEID                        GTP-TEID,
+    iE-Extensions                    ProtocolExtensionContainer { {E-RABSetupItemCtxtSUResExtIEs} } OPTIONAL,
+    ...
+}
+
+
+E-RABSetupItemCtxtSUResExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+
+-- **************************************************************
+--
+-- Initial Context Setup Failure
+--
+-- **************************************************************
+
+InitialContextSetupFailure ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { {InitialContextSetupFailureIEs} },
+    ...
+}
+
+InitialContextSetupFailureIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID                CRITICALITY ignore    TYPE MME-UE-S1AP-ID                    PRESENCE mandatory    }|
+    { ID id-eNB-UE-S1AP-ID                CRITICALITY ignore    TYPE ENB-UE-S1AP-ID                    PRESENCE mandatory    }|
+    { ID id-Cause                        CRITICALITY ignore    TYPE Cause                            PRESENCE mandatory    }|
+    { ID id-CriticalityDiagnostics        CRITICALITY ignore    TYPE CriticalityDiagnostics            PRESENCE optional    },
+    ...
+}
+
+-- **************************************************************
+--
+-- PAGING ELEMENTARY PROCEDURE
+--
+-- **************************************************************
+
+
+-- **************************************************************
+--
+-- Paging
+--
+-- **************************************************************
+
+Paging ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       {{PagingIEs}},
+    ...
+}
+
+PagingIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-UEIdentityIndexValue            CRITICALITY ignore    TYPE UEIdentityIndexValue                PRESENCE mandatory}|
+    { ID id-UEPagingID                        CRITICALITY ignore    TYPE UEPagingID                            PRESENCE mandatory}|
+    { ID id-pagingDRX                        CRITICALITY ignore    TYPE PagingDRX                            PRESENCE optional}|
+    { ID id-CNDomain                        CRITICALITY ignore    TYPE CNDomain                            PRESENCE mandatory}|
+    { ID id-TAIList                            CRITICALITY ignore    TYPE TAIList                            PRESENCE mandatory}|
+    { ID id-CSG-IdList                        CRITICALITY ignore    TYPE CSG-IdList                            PRESENCE optional}|
+    { ID id-PagingPriority                    CRITICALITY ignore    TYPE PagingPriority                        PRESENCE optional}|
+    { ID id-UERadioCapabilityForPaging        CRITICALITY ignore    TYPE UERadioCapabilityForPaging            PRESENCE optional}|
+-- Extension for Release 13 to support Paging Optimisation and Coverage Enhancement paging –-
+    { ID id-AssistanceDataForPaging            CRITICALITY ignore    TYPE AssistanceDataForPaging            PRESENCE optional}|
+    { ID id-Paging-eDRXInformation            CRITICALITY ignore    TYPE Paging-eDRXInformation                PRESENCE optional}|
+    { ID id-extended-UEIdentityIndexValue    CRITICALITY ignore    TYPE Extended-UEIdentityIndexValue    PRESENCE optional}|
+    { ID id-NB-IoT-Paging-eDRXInformation    CRITICALITY ignore    TYPE NB-IoT-Paging-eDRXInformation    PRESENCE optional}|
+    { ID id-NB-IoT-UEIdentityIndexValue        CRITICALITY ignore    TYPE NB-IoT-UEIdentityIndexValue        PRESENCE optional}|
+    { ID id-EnhancedCoverageRestricted        CRITICALITY ignore    TYPE EnhancedCoverageRestricted            PRESENCE optional}|
+    { ID id-CE-ModeBRestricted                CRITICALITY ignore    TYPE CE-ModeBRestricted            PRESENCE optional},
+    ...
+}
+
+TAIList::= SEQUENCE (SIZE(1.. maxnoofTAIs)) OF ProtocolIE-SingleContainer {{TAIItemIEs}}
+
+TAIItemIEs     S1AP-PROTOCOL-IES ::= {
+    { ID id-TAIItem     CRITICALITY ignore        TYPE TAIItem    PRESENCE mandatory },
+    ...
+}
+
+TAIItem ::= SEQUENCE {
+    tAI                             TAI,
+    iE-Extensions                    ProtocolExtensionContainer { {TAIItemExtIEs} } OPTIONAL,
+    ...
+}
+
+
+TAIItemExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+-- **************************************************************
+--
+-- UE CONTEXT RELEASE ELEMENTARY PROCEDURE
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- UE Context Release Request
+--
+-- **************************************************************
+
+UEContextReleaseRequest ::= SEQUENCE {
+    protocolIEs                     ProtocolIE-Container       {{UEContextReleaseRequest-IEs}},
+    ...
+}
+
+UEContextReleaseRequest-IEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID                    CRITICALITY reject    TYPE MME-UE-S1AP-ID                    PRESENCE mandatory    }|
+    { ID id-eNB-UE-S1AP-ID                    CRITICALITY reject    TYPE ENB-UE-S1AP-ID                    PRESENCE mandatory    }|
+    { ID id-Cause                            CRITICALITY ignore    TYPE Cause                                PRESENCE mandatory    }|
+    { ID id-GWContextReleaseIndication        CRITICALITY reject    TYPE GWContextReleaseIndication        PRESENCE optional    }|
+    { ID id-SecondaryRATDataUsageReportList    CRITICALITY ignore    TYPE SecondaryRATDataUsageReportList    PRESENCE optional },
+    ...
+}
+
+-- **************************************************************
+--
+-- UE Context Release Command
+--
+-- **************************************************************
+
+UEContextReleaseCommand ::= SEQUENCE {
+    protocolIEs                     ProtocolIE-Container       {{UEContextReleaseCommand-IEs}},
+    ...
+}
+
+UEContextReleaseCommand-IEs S1AP-PROTOCOL-IES ::= {
+    { ID id-UE-S1AP-IDs                    CRITICALITY reject    TYPE UE-S1AP-IDs                    PRESENCE mandatory    }|
+    { ID id-Cause                        CRITICALITY ignore    TYPE Cause                            PRESENCE mandatory    },
+    ...
+}
+
+-- **************************************************************
+--
+-- UE Context Release Complete
+--
+-- **************************************************************
+
+UEContextReleaseComplete ::= SEQUENCE {
+    protocolIEs                     ProtocolIE-Container       {{UEContextReleaseComplete-IEs}},
+    ...
+}
+
+UEContextReleaseComplete-IEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID                                CRITICALITY ignore    TYPE MME-UE-S1AP-ID                        PRESENCE mandatory}|
+    { ID id-eNB-UE-S1AP-ID                                CRITICALITY ignore    TYPE ENB-UE-S1AP-ID                        PRESENCE mandatory}|
+    { ID id-CriticalityDiagnostics                        CRITICALITY ignore    TYPE CriticalityDiagnostics                PRESENCE optional}|
+-- Extension for Release 12 to support User Location Information -- 
+    { ID id-UserLocationInformation                        CRITICALITY ignore    TYPE UserLocationInformation                PRESENCE optional}|
+-- Extension for Release 13 to support Paging Optimisation
+    { ID id-InformationOnRecommendedCellsAndENBsForPaging    CRITICALITY ignore    TYPE InformationOnRecommendedCellsAndENBsForPaging        PRESENCE optional}|
+-- Extension for Release 13 to support coverage enhancement paging –
+    { ID id-CellIdentifierAndCELevelForCECapableUEs        CRITICALITY ignore    TYPE CellIdentifierAndCELevelForCECapableUEs    PRESENCE optional}|
+    { ID id-SecondaryRATDataUsageReportList                CRITICALITY ignore    TYPE SecondaryRATDataUsageReportList        PRESENCE optional }|
+    { ID id-TimeSinceSecondaryNodeRelease                CRITICALITY ignore    TYPE TimeSinceSecondaryNodeRelease                PRESENCE optional },
+    ...
+}
+
+
+-- **************************************************************
+--
+-- UE CONTEXT MODIFICATION ELEMENTARY PROCEDURE
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- UE Context Modification Request
+--
+-- **************************************************************
+
+UEContextModificationRequest ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { { UEContextModificationRequestIEs} },
+    ...
+}
+
+UEContextModificationRequestIEs S1AP-PROTOCOL-IES ::= {    
+    { ID id-MME-UE-S1AP-ID                    CRITICALITY reject    TYPE MME-UE-S1AP-ID                        PRESENCE mandatory}|
+    { ID id-eNB-UE-S1AP-ID                    CRITICALITY reject    TYPE ENB-UE-S1AP-ID                        PRESENCE mandatory}|
+    { ID id-SecurityKey                        CRITICALITY reject    TYPE SecurityKey                        PRESENCE optional}|
+    { ID id-SubscriberProfileIDforRFP        CRITICALITY ignore    TYPE SubscriberProfileIDforRFP            PRESENCE optional}|
+    { ID id-uEaggregateMaximumBitrate        CRITICALITY ignore    TYPE UEAggregateMaximumBitrate            PRESENCE optional}|
+    { ID id-CSFallbackIndicator                CRITICALITY reject    TYPE CSFallbackIndicator                PRESENCE optional}|
+    { ID id-UESecurityCapabilities            CRITICALITY reject    TYPE UESecurityCapabilities                PRESENCE optional}|
+    { ID id-CSGMembershipStatus                CRITICALITY ignore    TYPE CSGMembershipStatus                PRESENCE optional}|
+    { ID id-RegisteredLAI                    CRITICALITY ignore    TYPE LAI                                PRESENCE optional}|
+    { ID id-AdditionalCSFallbackIndicator    CRITICALITY ignore    TYPE AdditionalCSFallbackIndicator    PRESENCE conditional}|
+    { ID id-ProSeAuthorized                    CRITICALITY ignore    TYPE ProSeAuthorized                    PRESENCE optional}|
+    { ID id-SRVCCOperationPossible            CRITICALITY ignore    TYPE SRVCCOperationPossible                PRESENCE optional}|
+    { ID id-SRVCCOperationNotPossible        CRITICALITY ignore    TYPE SRVCCOperationNotPossible            PRESENCE optional}|
+    { ID id-V2XServicesAuthorized            CRITICALITY ignore    TYPE V2XServicesAuthorized                PRESENCE optional}|
+    { ID id-UESidelinkAggregateMaximumBitrate        CRITICALITY ignore    TYPE UESidelinkAggregateMaximumBitrate    PRESENCE optional}|
+    { ID id-NRUESecurityCapabilities                CRITICALITY ignore    TYPE NRUESecurityCapabilities            PRESENCE optional}|
+    { ID id-AerialUEsubscriptionInformation    CRITICALITY ignore    TYPE AerialUEsubscriptionInformation                PRESENCE optional},
+    ...
+}
+-- **************************************************************
+--
+-- UE Context Modification Response
+--
+-- **************************************************************
+
+UEContextModificationResponse ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { { UEContextModificationResponseIEs} },
+    ...
+}
+
+UEContextModificationResponseIEs S1AP-PROTOCOL-IES ::= {    
+    { ID id-MME-UE-S1AP-ID                CRITICALITY ignore    TYPE MME-UE-S1AP-ID                    PRESENCE mandatory    }|
+    { ID id-eNB-UE-S1AP-ID                CRITICALITY ignore    TYPE ENB-UE-S1AP-ID                    PRESENCE mandatory    }|
+    { ID id-CriticalityDiagnostics        CRITICALITY ignore    TYPE CriticalityDiagnostics            PRESENCE optional    },
+    ...
+}
+-- **************************************************************
+--
+-- UE Context Modification Failure
+--
+-- **************************************************************
+
+UEContextModificationFailure ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { { UEContextModificationFailureIEs} },
+    ...
+}
+
+UEContextModificationFailureIEs S1AP-PROTOCOL-IES ::= {    
+    { ID id-MME-UE-S1AP-ID                CRITICALITY ignore    TYPE MME-UE-S1AP-ID                    PRESENCE mandatory    }|
+    { ID id-eNB-UE-S1AP-ID                CRITICALITY ignore    TYPE ENB-UE-S1AP-ID                    PRESENCE mandatory    }|
+    { ID id-Cause                        CRITICALITY ignore    TYPE Cause                            PRESENCE mandatory    }|
+    { ID id-CriticalityDiagnostics        CRITICALITY ignore    TYPE CriticalityDiagnostics            PRESENCE optional    },
+    ...
+}
+
+-- **************************************************************
+--
+-- UE RADIO CAPABILITY MATCH ELEMENTARY PROCEDURE
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- UE Radio Capability Match Request
+--
+-- **************************************************************
+
+UERadioCapabilityMatchRequest ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { { UERadioCapabilityMatchRequestIEs} },
+    ...
+}
+
+UERadioCapabilityMatchRequestIEs S1AP-PROTOCOL-IES ::= {    
+    { ID id-MME-UE-S1AP-ID                CRITICALITY reject    TYPE MME-UE-S1AP-ID                    PRESENCE mandatory    }|
+    { ID id-eNB-UE-S1AP-ID                CRITICALITY reject    TYPE ENB-UE-S1AP-ID                    PRESENCE mandatory    }|
+    { ID id-UERadioCapability            CRITICALITY ignore    TYPE UERadioCapability                PRESENCE optional    },
+    ...
+}
+
+-- **************************************************************
+--
+-- UE Radio Capability Match Response
+--
+-- **************************************************************
+
+UERadioCapabilityMatchResponse ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { { UERadioCapabilityMatchResponseIEs} },
+    ...
+}
+
+UERadioCapabilityMatchResponseIEs S1AP-PROTOCOL-IES ::= {    
+    { ID id-MME-UE-S1AP-ID                CRITICALITY ignore    TYPE MME-UE-S1AP-ID                    PRESENCE mandatory    }|
+    { ID id-eNB-UE-S1AP-ID                CRITICALITY ignore    TYPE ENB-UE-S1AP-ID                    PRESENCE mandatory    }|
+    { ID id-VoiceSupportMatchIndicator    CRITICALITY reject    TYPE VoiceSupportMatchIndicator        PRESENCE mandatory    }|
+    { ID id-CriticalityDiagnostics        CRITICALITY ignore    TYPE CriticalityDiagnostics            PRESENCE optional    },
+    ...
+}
+
+-- **************************************************************
+--
+-- NAS TRANSPORT ELEMENTARY PROCEDURES
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- DOWNLINK NAS TRANSPORT
+--
+-- **************************************************************
+
+DownlinkNASTransport ::= SEQUENCE {
+    protocolIEs                     ProtocolIE-Container       {{DownlinkNASTransport-IEs}},
+    ...
+}
+
+DownlinkNASTransport-IEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID                CRITICALITY reject    TYPE MME-UE-S1AP-ID                    PRESENCE mandatory}|
+    { ID id-eNB-UE-S1AP-ID                CRITICALITY reject    TYPE ENB-UE-S1AP-ID                    PRESENCE mandatory}|
+    { ID id-NAS-PDU                        CRITICALITY reject    TYPE NAS-PDU                        PRESENCE mandatory}|
+    { ID id-HandoverRestrictionList        CRITICALITY ignore    TYPE HandoverRestrictionList        PRESENCE optional}|
+    { ID id-SubscriberProfileIDforRFP    CRITICALITY ignore    TYPE SubscriberProfileIDforRFP        PRESENCE optional}|
+    { ID id-SRVCCOperationPossible        CRITICALITY ignore    TYPE SRVCCOperationPossible            PRESENCE optional}|
+    { ID id-UERadioCapability            CRITICALITY ignore    TYPE UERadioCapability                PRESENCE optional}|
+    { ID id-DLNASPDUDeliveryAckRequest    CRITICALITY ignore    TYPE DLNASPDUDeliveryAckRequest    PRESENCE optional}|
+    { ID id-EnhancedCoverageRestricted    CRITICALITY ignore    TYPE EnhancedCoverageRestricted        PRESENCE optional}|
+    { ID id-NRUESecurityCapabilities    CRITICALITY ignore    TYPE NRUESecurityCapabilities        PRESENCE optional}|
+    { ID id-CE-ModeBRestricted            CRITICALITY ignore    TYPE CE-ModeBRestricted                PRESENCE optional}|
+    { ID id-UECapabilityInfoRequest        CRITICALITY ignore    TYPE UECapabilityInfoRequest    PRESENCE optional}|
+    { ID id-EndIndication                CRITICALITY ignore    TYPE EndIndication                    PRESENCE optional}|
+    { ID id-PendingDataIndication        CRITICALITY ignore    TYPE PendingDataIndication            PRESENCE optional}|
+    { ID id-Subscription-Based-UE-DifferentiationInfo        CRITICALITY ignore    TYPE Subscription-Based-UE-DifferentiationInfo        PRESENCE optional},
+    ...
+}
+
+
+-- **************************************************************
+--
+-- INITIAL UE MESSAGE
+--
+-- **************************************************************
+
+InitialUEMessage ::= SEQUENCE {
+    protocolIEs                     ProtocolIE-Container       {{InitialUEMessage-IEs}},
+    ...
+}
+
+InitialUEMessage-IEs S1AP-PROTOCOL-IES ::= {
+    { ID id-eNB-UE-S1AP-ID                CRITICALITY reject    TYPE ENB-UE-S1AP-ID                    PRESENCE mandatory}|
+    { ID id-NAS-PDU                        CRITICALITY reject    TYPE NAS-PDU                        PRESENCE mandatory}|
+    { ID id-TAI                            CRITICALITY reject    TYPE TAI                            PRESENCE mandatory}|
+    { ID id-EUTRAN-CGI                    CRITICALITY ignore    TYPE EUTRAN-CGI                        PRESENCE mandatory}|
+    { ID id-RRC-Establishment-Cause        CRITICALITY ignore    TYPE RRC-Establishment-Cause        PRESENCE mandatory}|
+    { ID id-S-TMSI                        CRITICALITY reject    TYPE S-TMSI                            PRESENCE optional}|
+    { ID id-CSG-Id                        CRITICALITY reject    TYPE CSG-Id                            PRESENCE optional}|
+    { ID id-GUMMEI-ID                    CRITICALITY reject    TYPE GUMMEI                            PRESENCE optional}|
+    { ID id-CellAccessMode                CRITICALITY reject    TYPE CellAccessMode                    PRESENCE optional}|
+    { ID id-GW-TransportLayerAddress    CRITICALITY ignore    TYPE TransportLayerAddress            PRESENCE optional}|
+    { ID id-RelayNode-Indicator            CRITICALITY reject    TYPE RelayNode-Indicator            PRESENCE optional}|
+    { ID id-GUMMEIType                    CRITICALITY ignore    TYPE GUMMEIType                        PRESENCE optional}|
+-- Extension for Release 11 to support BBAI -- 
+    { ID id-Tunnel-Information-for-BBF    CRITICALITY ignore    TYPE TunnelInformation                PRESENCE optional}|
+    { ID id-SIPTO-L-GW-TransportLayerAddress    CRITICALITY ignore    TYPE TransportLayerAddress    PRESENCE optional}|
+    { ID id-LHN-ID                        CRITICALITY ignore    TYPE LHN-ID                            PRESENCE optional}|
+    { ID id-MME-Group-ID                CRITICALITY ignore    TYPE MME-Group-ID                    PRESENCE optional}|
+    { ID id-UE-Usage-Type                CRITICALITY ignore    TYPE UE-Usage-Type                    PRESENCE optional}|
+    { ID id-CE-mode-B-SupportIndicator    CRITICALITY ignore    TYPE CE-mode-B-SupportIndicator        PRESENCE optional}|
+    { ID id-DCN-ID                        CRITICALITY ignore    TYPE DCN-ID                            PRESENCE optional}|
+    { ID id-Coverage-Level               CRITICALITY ignore    TYPE Coverage-Level                PRESENCE optional}|
+    { ID id-UE-Application-Layer-Measurement-Capability        CRITICALITY ignore    TYPE UE-Application-Layer-Measurement-Capability                            PRESENCE optional}|
+    { ID id-EDT-Session                       CRITICALITY ignore    TYPE EDT-Session                    PRESENCE optional},
+
+    ...
+}
+
+
+-- **************************************************************
+--
+-- UPLINK NAS TRANSPORT
+--
+-- **************************************************************
+
+UplinkNASTransport ::= SEQUENCE {
+    protocolIEs                     ProtocolIE-Container       {{UplinkNASTransport-IEs}},
+    ...
+}
+
+UplinkNASTransport-IEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID                CRITICALITY reject    TYPE MME-UE-S1AP-ID                    PRESENCE mandatory}|
+    { ID id-eNB-UE-S1AP-ID                CRITICALITY reject    TYPE ENB-UE-S1AP-ID                    PRESENCE mandatory}|
+    { ID id-NAS-PDU                        CRITICALITY reject    TYPE NAS-PDU                        PRESENCE mandatory}|
+    { ID id-EUTRAN-CGI                    CRITICALITY ignore    TYPE EUTRAN-CGI                        PRESENCE mandatory}|
+    { ID id-TAI                            CRITICALITY ignore    TYPE TAI                            PRESENCE mandatory}|
+    { ID id-GW-TransportLayerAddress    CRITICALITY ignore    TYPE TransportLayerAddress            PRESENCE optional}|
+    { ID id-SIPTO-L-GW-TransportLayerAddress    CRITICALITY ignore    TYPE TransportLayerAddress    PRESENCE optional}|
+    { ID id-LHN-ID                        CRITICALITY ignore    TYPE LHN-ID                            PRESENCE optional}|
+    { ID id-PSCellInformation            CRITICALITY ignore    TYPE PSCellInformation                PRESENCE optional },
+    ...
+}
+-- **************************************************************
+--
+-- NAS NON DELIVERY INDICATION
+--
+-- **************************************************************
+
+NASNonDeliveryIndication ::= SEQUENCE {
+    protocolIEs                     ProtocolIE-Container       {{NASNonDeliveryIndication-IEs}},
+    ...
+}
+
+NASNonDeliveryIndication-IEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID                CRITICALITY reject    TYPE MME-UE-S1AP-ID                PRESENCE mandatory    }|
+    { ID id-eNB-UE-S1AP-ID                CRITICALITY reject    TYPE ENB-UE-S1AP-ID                PRESENCE mandatory    }|
+    { ID id-NAS-PDU                        CRITICALITY ignore    TYPE NAS-PDU                    PRESENCE mandatory    }|
+    { ID id-Cause                        CRITICALITY ignore    TYPE Cause                        PRESENCE mandatory    },
+    ...
+}
+
+-- **************************************************************
+--
+-- REROUTE NAS REQUEST
+--
+-- **************************************************************
+
+RerouteNASRequest ::= SEQUENCE {
+    protocolIEs                     ProtocolIE-Container       {{RerouteNASRequest-IEs}},
+    ...
+}
+
+RerouteNASRequest-IEs S1AP-PROTOCOL-IES ::= {
+    { ID id-eNB-UE-S1AP-ID            CRITICALITY reject    TYPE ENB-UE-S1AP-ID            PRESENCE mandatory}|
+    { ID id-MME-UE-S1AP-ID            CRITICALITY ignore    TYPE MME-UE-S1AP-ID            PRESENCE optional}|
+    { ID id-S1-Message                CRITICALITY reject    TYPE OCTET STRING            PRESENCE mandatory}|
+    { ID id-MME-Group-ID            CRITICALITY reject    TYPE MME-Group-ID            PRESENCE mandatory}|
+    { ID id-Additional-GUTI            CRITICALITY ignore    TYPE Additional-GUTI        PRESENCE optional}|
+    { ID id-UE-Usage-Type            CRITICALITY ignore    TYPE UE-Usage-Type            PRESENCE optional},
+    ...
+}
+
+
+-- **************************************************************
+--
+-- NAS DELIVERY INDICATION
+--
+-- **************************************************************
+
+NASDeliveryIndication ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container { { NASDeliveryIndicationIEs} },
+    ...
+}
+
+NASDeliveryIndicationIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID                            CRITICALITY reject    TYPE MME-UE-S1AP-ID                        PRESENCE mandatory}|
+    { ID id-eNB-UE-S1AP-ID                            CRITICALITY reject    TYPE ENB-UE-S1AP-ID                        PRESENCE mandatory},
+    ...
+}
+
+-- **************************************************************
+--
+-- RESET ELEMENTARY PROCEDURE
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- Reset
+--
+-- **************************************************************
+
+Reset ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { {ResetIEs} },
+    ...
+}
+
+ResetIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-Cause                        CRITICALITY ignore    TYPE Cause                        PRESENCE mandatory    }|
+    { ID id-ResetType                    CRITICALITY reject    TYPE ResetType                    PRESENCE mandatory    },
+    ...
+}
+
+ResetType ::= CHOICE {
+    s1-Interface                    ResetAll,
+    partOfS1-Interface                UE-associatedLogicalS1-ConnectionListRes,
+    ...
+}
+
+
+
+ResetAll ::= ENUMERATED {
+    reset-all,
+    ...
+}
+
+UE-associatedLogicalS1-ConnectionListRes ::= SEQUENCE (SIZE(1.. maxnoofIndividualS1ConnectionsToReset)) OF ProtocolIE-SingleContainer { { UE-associatedLogicalS1-ConnectionItemRes } }
+
+UE-associatedLogicalS1-ConnectionItemRes S1AP-PROTOCOL-IES ::= {
+    { ID id-UE-associatedLogicalS1-ConnectionItem    CRITICALITY reject    TYPE UE-associatedLogicalS1-ConnectionItem    PRESENCE mandatory},
+    ...
+}
+
+
+-- **************************************************************
+--
+-- Reset Acknowledge
+--
+-- **************************************************************
+
+ResetAcknowledge ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { {ResetAcknowledgeIEs} },
+    ...
+}
+
+ResetAcknowledgeIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-UE-associatedLogicalS1-ConnectionListResAck        CRITICALITY ignore    TYPE UE-associatedLogicalS1-ConnectionListResAck            PRESENCE optional    }|
+    { ID id-CriticalityDiagnostics        CRITICALITY ignore    TYPE CriticalityDiagnostics            PRESENCE optional    },
+    ...
+}
+
+UE-associatedLogicalS1-ConnectionListResAck ::= SEQUENCE (SIZE(1.. maxnoofIndividualS1ConnectionsToReset)) OF ProtocolIE-SingleContainer { { UE-associatedLogicalS1-ConnectionItemResAck } }
+
+UE-associatedLogicalS1-ConnectionItemResAck     S1AP-PROTOCOL-IES ::= {
+    { ID id-UE-associatedLogicalS1-ConnectionItem     CRITICALITY ignore     TYPE UE-associatedLogicalS1-ConnectionItem      PRESENCE mandatory },
+    ...
+}
+
+-- **************************************************************
+--
+-- ERROR INDICATION ELEMENTARY PROCEDURE
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- Error Indication
+--
+-- **************************************************************
+
+ErrorIndication ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       {{ErrorIndicationIEs}},
+    ...
+}
+
+ErrorIndicationIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID                CRITICALITY ignore    TYPE MME-UE-S1AP-ID                PRESENCE optional    }|
+    { ID id-eNB-UE-S1AP-ID                CRITICALITY ignore    TYPE ENB-UE-S1AP-ID                PRESENCE optional    }|
+    { ID id-Cause                        CRITICALITY ignore    TYPE Cause                        PRESENCE optional    }|
+    { ID id-CriticalityDiagnostics        CRITICALITY ignore    TYPE CriticalityDiagnostics        PRESENCE optional    },
+    ...
+}
+
+-- **************************************************************
+--
+-- S1 SETUP ELEMENTARY PROCEDURE
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- S1 Setup Request
+--
+-- **************************************************************
+
+S1SetupRequest ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { {S1SetupRequestIEs} },
+    ...
+}
+
+S1SetupRequestIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-Global-ENB-ID                CRITICALITY reject    TYPE Global-ENB-ID                PRESENCE mandatory}|
+    { ID id-eNBname                        CRITICALITY ignore    TYPE ENBname                    PRESENCE optional}|
+    { ID id-SupportedTAs                CRITICALITY reject    TYPE SupportedTAs                PRESENCE mandatory}|
+    { ID id-DefaultPagingDRX            CRITICALITY ignore    TYPE PagingDRX                    PRESENCE mandatory}|
+    { ID id-CSG-IdList                    CRITICALITY reject    TYPE CSG-IdList                    PRESENCE optional}|
+    { ID id-UE-RetentionInformation        CRITICALITY ignore    TYPE UE-RetentionInformation    PRESENCE optional}|
+    { ID id-NB-IoT-DefaultPagingDRX        CRITICALITY ignore    TYPE NB-IoT-DefaultPagingDRX    PRESENCE optional}|
+    { ID id-ConnectedengNBList            CRITICALITY ignore    TYPE ConnectedengNBList            PRESENCE optional},
+    ...
+}
+
+-- **************************************************************
+--
+-- S1 Setup Response
+--
+-- **************************************************************
+
+S1SetupResponse ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { {S1SetupResponseIEs} },
+    ...
+}
+
+
+S1SetupResponseIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MMEname                        CRITICALITY ignore    TYPE MMEname                    PRESENCE optional}|
+    { ID id-ServedGUMMEIs                CRITICALITY reject    TYPE ServedGUMMEIs                PRESENCE mandatory}|
+    { ID id-RelativeMMECapacity            CRITICALITY ignore    TYPE RelativeMMECapacity        PRESENCE mandatory}|
+    { ID id-MMERelaySupportIndicator    CRITICALITY ignore    TYPE MMERelaySupportIndicator    PRESENCE optional}|
+    { ID id-CriticalityDiagnostics        CRITICALITY ignore    TYPE CriticalityDiagnostics        PRESENCE optional}|
+    { ID id-UE-RetentionInformation        CRITICALITY ignore    TYPE UE-RetentionInformation    PRESENCE optional}|
+    { ID id-ServedDCNs                    CRITICALITY ignore    TYPE ServedDCNs                    PRESENCE optional},
+    ...
+}
+
+-- **************************************************************
+--
+-- S1 Setup Failure
+--
+-- **************************************************************
+
+S1SetupFailure ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { {S1SetupFailureIEs} },
+    ...
+}
+
+S1SetupFailureIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-Cause                        CRITICALITY ignore    TYPE Cause                        PRESENCE mandatory    }|
+    { ID id-TimeToWait                    CRITICALITY ignore    TYPE TimeToWait                    PRESENCE optional    }|
+    { ID id-CriticalityDiagnostics        CRITICALITY ignore    TYPE CriticalityDiagnostics        PRESENCE optional    },
+    ...
+}
+
+-- **************************************************************
+--
+-- ENB CONFIGURATION UPDATE ELEMENTARY PROCEDURE
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- eNB Configuration Update 
+--
+-- **************************************************************
+
+ENBConfigurationUpdate ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { {ENBConfigurationUpdateIEs} },
+    ...
+}
+
+ENBConfigurationUpdateIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-eNBname                        CRITICALITY ignore    TYPE ENBname                    PRESENCE optional}|
+    { ID id-SupportedTAs                CRITICALITY reject    TYPE SupportedTAs                PRESENCE optional}|
+    { ID id-CSG-IdList                    CRITICALITY reject    TYPE CSG-IdList                    PRESENCE optional}|
+    { ID id-DefaultPagingDRX            CRITICALITY ignore    TYPE PagingDRX                    PRESENCE optional}|
+    { ID id-NB-IoT-DefaultPagingDRX        CRITICALITY ignore    TYPE NB-IoT-DefaultPagingDRX    PRESENCE optional}|
+    { ID id-ConnectedengNBToAddList        CRITICALITY ignore    TYPE ConnectedengNBList            PRESENCE optional}|
+    { ID id-ConnectedengNBToRemoveList    CRITICALITY ignore    TYPE ConnectedengNBList            PRESENCE optional},
+    ...
+}
+
+-- **************************************************************
+--
+-- eNB Configuration Update Acknowledge
+--
+-- **************************************************************
+
+ENBConfigurationUpdateAcknowledge ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { {ENBConfigurationUpdateAcknowledgeIEs} },
+    ...
+}
+
+
+ENBConfigurationUpdateAcknowledgeIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-CriticalityDiagnostics        CRITICALITY ignore    TYPE CriticalityDiagnostics    PRESENCE optional    },
+    ...
+}
+
+-- **************************************************************
+--
+-- eNB Configuration Update Failure
+--
+-- **************************************************************
+
+ENBConfigurationUpdateFailure ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { {ENBConfigurationUpdateFailureIEs} },
+    ...
+}
+
+ENBConfigurationUpdateFailureIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-Cause                        CRITICALITY ignore    TYPE Cause                        PRESENCE mandatory    }|
+    { ID id-TimeToWait                    CRITICALITY ignore    TYPE TimeToWait                    PRESENCE optional    }|
+    { ID id-CriticalityDiagnostics        CRITICALITY ignore    TYPE CriticalityDiagnostics        PRESENCE optional    },
+...
+}
+
+
+-- **************************************************************
+--
+-- MME CONFIGURATION UPDATE ELEMENTARY PROCEDURE
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- MME Configuration Update 
+--
+-- **************************************************************
+
+MMEConfigurationUpdate ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { {MMEConfigurationUpdateIEs} },
+    ...
+}
+
+MMEConfigurationUpdateIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MMEname                    CRITICALITY ignore    TYPE MMEname                PRESENCE optional    }|
+    { ID id-ServedGUMMEIs            CRITICALITY reject    TYPE ServedGUMMEIs            PRESENCE optional    }|
+    { ID id-RelativeMMECapacity        CRITICALITY reject    TYPE RelativeMMECapacity    PRESENCE optional    }|
+    { ID id-ServedDCNs                CRITICALITY ignore    TYPE ServedDCNs                PRESENCE optional},
+    ...
+}
+
+-- **************************************************************
+--
+-- MME Configuration Update Acknowledge
+--
+-- **************************************************************
+
+MMEConfigurationUpdateAcknowledge ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { {MMEConfigurationUpdateAcknowledgeIEs} },
+    ...
+}
+
+
+MMEConfigurationUpdateAcknowledgeIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-CriticalityDiagnostics        CRITICALITY ignore    TYPE CriticalityDiagnostics            PRESENCE optional    },
+    ...
+}
+
+-- **************************************************************
+--
+-- MME Configuration Update Failure
+--
+-- **************************************************************
+
+MMEConfigurationUpdateFailure ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { {MMEConfigurationUpdateFailureIEs} },
+    ...
+}
+
+MMEConfigurationUpdateFailureIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-Cause                        CRITICALITY ignore    TYPE Cause                        PRESENCE mandatory    }|
+    { ID id-TimeToWait                    CRITICALITY ignore    TYPE TimeToWait                    PRESENCE optional    }|
+    { ID id-CriticalityDiagnostics        CRITICALITY ignore    TYPE CriticalityDiagnostics        PRESENCE optional    },
+    ...
+}
+
+-- **************************************************************
+--
+-- DOWNLINK S1 CDMA2000 TUNNELLING ELEMENTARY PROCEDURE
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- Downlink S1 CDMA2000 Tunnelling
+--
+-- **************************************************************
+
+DownlinkS1cdma2000tunnelling ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { {DownlinkS1cdma2000tunnellingIEs} },
+    ...
+}
+
+DownlinkS1cdma2000tunnellingIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID                        CRITICALITY reject    TYPE MME-UE-S1AP-ID                        PRESENCE mandatory    }|
+    { ID id-eNB-UE-S1AP-ID                        CRITICALITY reject    TYPE ENB-UE-S1AP-ID                        PRESENCE mandatory    }|
+    { ID id-E-RABSubjecttoDataForwardingList    CRITICALITY ignore    TYPE E-RABSubjecttoDataForwardingList    PRESENCE optional    }|
+    { ID id-cdma2000HOStatus                    CRITICALITY ignore    TYPE Cdma2000HOStatus                    PRESENCE optional    }|
+    { ID id-cdma2000RATType                        CRITICALITY reject    TYPE Cdma2000RATType                    PRESENCE mandatory    }|
+    { ID id-cdma2000PDU                            CRITICALITY reject    TYPE Cdma2000PDU                        PRESENCE mandatory    },
+    ...
+}
+
+-- **************************************************************
+--
+-- UPLINK S1 CDMA2000 TUNNELLING ELEMENTARY PROCEDURE
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- Uplink S1 CDMA2000 Tunnelling
+--
+-- **************************************************************
+
+UplinkS1cdma2000tunnelling ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { {UplinkS1cdma2000tunnellingIEs} },
+    ...
+}
+
+UplinkS1cdma2000tunnellingIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID                            CRITICALITY reject    TYPE MME-UE-S1AP-ID                        PRESENCE mandatory    }|
+    { ID id-eNB-UE-S1AP-ID                            CRITICALITY reject    TYPE ENB-UE-S1AP-ID                        PRESENCE mandatory    }|
+    { ID id-cdma2000RATType                            CRITICALITY reject    TYPE Cdma2000RATType                    PRESENCE mandatory    }|
+    { ID id-cdma2000SectorID                        CRITICALITY reject    TYPE Cdma2000SectorID                    PRESENCE mandatory    }|
+    { ID id-cdma2000HORequiredIndication            CRITICALITY ignore    TYPE Cdma2000HORequiredIndication        PRESENCE optional    }|
+    { ID id-cdma2000OneXSRVCCInfo                    CRITICALITY reject    TYPE Cdma2000OneXSRVCCInfo            PRESENCE optional    }|
+    { ID id-cdma2000OneXRAND                        CRITICALITY reject    TYPE Cdma2000OneXRAND                    PRESENCE optional    }|
+    { ID id-cdma2000PDU                                CRITICALITY reject    TYPE Cdma2000PDU                        PRESENCE mandatory    }|
+    { ID id-EUTRANRoundTripDelayEstimationInfo        CRITICALITY ignore    TYPE EUTRANRoundTripDelayEstimationInfo        PRESENCE optional    },
+    -- Extension for Release 9 to assist target HRPD access with the acquisition of the UE --
+    ...
+}
+
+
+-- **************************************************************
+--
+-- UE CAPABILITY INFO INDICATION ELEMENTARY PROCEDURE
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- UE Capability Info Indication
+--
+-- **************************************************************
+
+UECapabilityInfoIndication ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { { UECapabilityInfoIndicationIEs} },
+    ...
+}
+
+UECapabilityInfoIndicationIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID                CRITICALITY reject    TYPE MME-UE-S1AP-ID                    PRESENCE mandatory}|
+    { ID id-eNB-UE-S1AP-ID                CRITICALITY reject    TYPE ENB-UE-S1AP-ID                    PRESENCE mandatory}|
+    { ID id-UERadioCapability            CRITICALITY ignore    TYPE UERadioCapability                PRESENCE mandatory}|
+    { ID id-UERadioCapabilityForPaging    CRITICALITY ignore    TYPE UERadioCapabilityForPaging        PRESENCE optional}|
+    { ID id-UE-Application-Layer-Measurement-Capability        CRITICALITY ignore    TYPE UE-Application-Layer-Measurement-Capability                            PRESENCE optional}|
+    { ID id-LTE-M-Indication                CRITICALITY ignore    TYPE LTE-M-Indication                PRESENCE optional},
+    ...
+}
+
+-- **************************************************************
+--
+-- eNB STATUS TRANSFER ELEMENTARY PROCEDURE
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- eNB Status Transfer
+--
+-- **************************************************************
+
+ENBStatusTransfer ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { {ENBStatusTransferIEs} },
+    ...
+}
+
+ENBStatusTransferIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID                                CRITICALITY reject    TYPE MME-UE-S1AP-ID        PRESENCE mandatory}|
+    { ID id-eNB-UE-S1AP-ID                                CRITICALITY reject    TYPE ENB-UE-S1AP-ID        PRESENCE mandatory}|
+    { ID id-eNB-StatusTransfer-TransparentContainer        CRITICALITY reject    TYPE ENB-StatusTransfer-TransparentContainer    PRESENCE mandatory},
+    ...
+}
+
+
+-- **************************************************************
+--
+-- MME STATUS TRANSFER ELEMENTARY PROCEDURE
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- MME Status Transfer
+--
+-- **************************************************************
+
+MMEStatusTransfer ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { {MMEStatusTransferIEs} },
+    ...
+}
+
+MMEStatusTransferIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID                                CRITICALITY reject    TYPE MME-UE-S1AP-ID            PRESENCE mandatory}|
+    { ID id-eNB-UE-S1AP-ID                                CRITICALITY reject    TYPE ENB-UE-S1AP-ID            PRESENCE mandatory}|
+    { ID id-eNB-StatusTransfer-TransparentContainer        CRITICALITY reject    TYPE ENB-StatusTransfer-TransparentContainer        PRESENCE mandatory},
+    ...
+}
+
+
+-- **************************************************************
+--
+-- TRACE ELEMENTARY PROCEDURES
+--
+-- **************************************************************
+-- **************************************************************
+--
+-- Trace Start
+--
+-- **************************************************************
+
+TraceStart ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { {TraceStartIEs} },
+    ...
+}
+
+TraceStartIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID                CRITICALITY reject    TYPE MME-UE-S1AP-ID                PRESENCE mandatory    }|
+    { ID id-eNB-UE-S1AP-ID                CRITICALITY reject    TYPE ENB-UE-S1AP-ID                PRESENCE mandatory    }|
+    { ID id-TraceActivation                CRITICALITY ignore    TYPE TraceActivation            PRESENCE mandatory    },
+    ...
+}
+
+-- **************************************************************
+--
+-- Trace Failure Indication
+--
+-- **************************************************************
+
+TraceFailureIndication ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { {TraceFailureIndicationIEs} },
+    ...
+}
+
+TraceFailureIndicationIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID                CRITICALITY reject    TYPE MME-UE-S1AP-ID                PRESENCE mandatory    }|
+    { ID id-eNB-UE-S1AP-ID                CRITICALITY reject    TYPE ENB-UE-S1AP-ID                PRESENCE mandatory    }|
+    { ID id-E-UTRAN-Trace-ID            CRITICALITY ignore    TYPE E-UTRAN-Trace-ID            PRESENCE mandatory    }|
+    { ID id-Cause                        CRITICALITY ignore    TYPE Cause                        PRESENCE mandatory    },
+    ...
+}
+
+-- **************************************************************
+--
+-- DEACTIVATE TRACE ELEMENTARY PROCEDURE
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- Deactivate Trace
+--
+-- **************************************************************
+
+DeactivateTrace ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { { DeactivateTraceIEs} },
+    ...
+}
+
+DeactivateTraceIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID        CRITICALITY reject    TYPE MME-UE-S1AP-ID        PRESENCE mandatory    }|
+    { ID id-eNB-UE-S1AP-ID        CRITICALITY reject    TYPE ENB-UE-S1AP-ID        PRESENCE mandatory    }|
+    { ID id-E-UTRAN-Trace-ID    CRITICALITY ignore    TYPE E-UTRAN-Trace-ID    PRESENCE mandatory    },
+    ...
+}
+
+-- **************************************************************
+--
+-- CELL TRAFFIC TRACE ELEMENTARY PROCEDURE
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- Cell Traffic Trace
+--
+-- **************************************************************
+
+CellTrafficTrace ::= SEQUENCE {
+protocolIEs        ProtocolIE-Container    { { CellTrafficTraceIEs } },
+...
+}
+
+CellTrafficTraceIEs S1AP-PROTOCOL-IES ::= {
+    {ID id-MME-UE-S1AP-ID                    CRITICALITY reject    TYPE MME-UE-S1AP-ID                PRESENCE mandatory    }|
+    {ID id-eNB-UE-S1AP-ID                    CRITICALITY reject    TYPE ENB-UE-S1AP-ID                PRESENCE mandatory    }|
+    {ID id-E-UTRAN-Trace-ID                    CRITICALITY ignore    TYPE E-UTRAN-Trace-ID            PRESENCE mandatory    }|
+    {ID id-EUTRAN-CGI                        CRITICALITY ignore    TYPE EUTRAN-CGI                    PRESENCE mandatory    }|
+    {ID id-TraceCollectionEntityIPAddress    CRITICALITY ignore    TYPE TransportLayerAddress        PRESENCE mandatory    }|
+    {ID id-PrivacyIndicator                    CRITICALITY ignore    TYPE PrivacyIndicator            PRESENCE optional    },
+    ...
+}
+
+-- **************************************************************
+--
+-- LOCATION ELEMENTARY PROCEDURES
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- Location Reporting Control
+--
+-- **************************************************************
+
+LocationReportingControl ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { { LocationReportingControlIEs} },
+    ...
+}
+
+LocationReportingControlIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID            CRITICALITY reject    TYPE MME-UE-S1AP-ID                PRESENCE mandatory    }|
+    { ID id-eNB-UE-S1AP-ID            CRITICALITY reject    TYPE ENB-UE-S1AP-ID                PRESENCE mandatory    }|
+    { ID id-RequestType                CRITICALITY ignore    TYPE RequestType                PRESENCE mandatory    },
+    ...
+}
+
+-- **************************************************************
+--
+-- Location Report Failure Indication
+--
+-- **************************************************************
+
+LocationReportingFailureIndication ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { { LocationReportingFailureIndicationIEs} },
+    ...
+}
+
+LocationReportingFailureIndicationIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID            CRITICALITY reject    TYPE MME-UE-S1AP-ID                PRESENCE mandatory    }|
+    { ID id-eNB-UE-S1AP-ID            CRITICALITY reject    TYPE ENB-UE-S1AP-ID                PRESENCE mandatory    }|
+    { ID id-Cause                    CRITICALITY ignore    TYPE Cause                        PRESENCE mandatory    },
+    ...
+}
+
+-- **************************************************************
+--
+-- Location Report 
+--
+-- **************************************************************
+
+LocationReport ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { { LocationReportIEs} },
+    ...
+}
+
+LocationReportIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID            CRITICALITY reject    TYPE MME-UE-S1AP-ID                PRESENCE mandatory    }|
+    { ID id-eNB-UE-S1AP-ID            CRITICALITY reject    TYPE ENB-UE-S1AP-ID                PRESENCE mandatory    }|
+    { ID id-EUTRAN-CGI                CRITICALITY ignore    TYPE EUTRAN-CGI                    PRESENCE mandatory    }|
+    { ID id-TAI                        CRITICALITY ignore    TYPE TAI                        PRESENCE mandatory    }|
+    { ID id-RequestType                CRITICALITY ignore    TYPE RequestType                PRESENCE mandatory    }|
+    { ID id-PSCellInformation        CRITICALITY ignore    TYPE PSCellInformation            PRESENCE optional },
+    ...
+}
+
+-- **************************************************************
+--
+-- OVERLOAD ELEMENTARY PROCEDURES
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- Overload Start
+--
+-- **************************************************************
+
+OverloadStart ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { {OverloadStartIEs} },
+    ...
+}
+
+OverloadStartIEs S1AP-PROTOCOL-IES ::= {    
+    { ID id-OverloadResponse                    CRITICALITY reject    TYPE OverloadResponse                PRESENCE mandatory    }|
+    { ID id-GUMMEIList                            CRITICALITY ignore    TYPE GUMMEIList                        PRESENCE optional    }|
+    { ID id-TrafficLoadReductionIndication        CRITICALITY ignore    TYPE TrafficLoadReductionIndication    PRESENCE optional    },
+    ...
+}
+-- **************************************************************
+--
+-- Overload Stop
+--
+-- **************************************************************
+
+OverloadStop ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { {OverloadStopIEs} },
+    ...
+}
+
+OverloadStopIEs S1AP-PROTOCOL-IES ::= {    
+{ ID id-GUMMEIList                                CRITICALITY ignore    TYPE GUMMEIList                        PRESENCE optional    },
+    ...
+}
+-- **************************************************************
+--
+-- WRITE-REPLACE WARNING ELEMENTARY PROCEDURE 
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- Write-Replace Warning Request
+--
+-- **************************************************************
+
+
+WriteReplaceWarningRequest ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { {WriteReplaceWarningRequestIEs} },
+    ...
+}
+
+WriteReplaceWarningRequestIEs S1AP-PROTOCOL-IES ::= {    
+    { ID id-MessageIdentifier                    CRITICALITY reject    TYPE MessageIdentifier                    PRESENCE mandatory    }|
+    { ID id-SerialNumber                        CRITICALITY reject    TYPE SerialNumber                        PRESENCE mandatory    }|
+    { ID id-WarningAreaList                        CRITICALITY ignore    TYPE WarningAreaList                    PRESENCE optional    }|
+    { ID id-RepetitionPeriod                    CRITICALITY reject    TYPE RepetitionPeriod                    PRESENCE mandatory    }|
+    { ID id-ExtendedRepetitionPeriod            CRITICALITY reject    TYPE ExtendedRepetitionPeriod            PRESENCE optional    }|
+    { ID id-NumberofBroadcastRequest            CRITICALITY reject    TYPE NumberofBroadcastRequest            PRESENCE mandatory    }|
+    { ID id-WarningType                            CRITICALITY ignore    TYPE WarningType                        PRESENCE optional    }|
+    { ID id-WarningSecurityInfo                    CRITICALITY ignore    TYPE WarningSecurityInfo                PRESENCE optional    }|
+    { ID id-DataCodingScheme                    CRITICALITY ignore    TYPE DataCodingScheme                    PRESENCE optional    }|
+    { ID id-WarningMessageContents                CRITICALITY ignore    TYPE WarningMessageContents                PRESENCE optional    }|
+    { ID id-ConcurrentWarningMessageIndicator    CRITICALITY reject    TYPE ConcurrentWarningMessageIndicator    PRESENCE optional    }|
+    { ID id-WarningAreaCoordinates                CRITICALITY ignore    TYPE WarningAreaCoordinates                PRESENCE optional    },
+    ...
+}
+-- **************************************************************
+--
+-- Write-Replace Warning Response
+--
+-- **************************************************************
+
+WriteReplaceWarningResponse ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container        { {WriteReplaceWarningResponseIEs} },
+    ...
+}
+
+WriteReplaceWarningResponseIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MessageIdentifier                CRITICALITY reject    TYPE MessageIdentifier                    PRESENCE mandatory    }|
+    { ID id-SerialNumber                    CRITICALITY reject    TYPE SerialNumber                        PRESENCE mandatory    }|
+    { ID id-BroadcastCompletedAreaList        CRITICALITY ignore    TYPE BroadcastCompletedAreaList            PRESENCE optional    }|
+    { ID id-CriticalityDiagnostics            CRITICALITY ignore    TYPE CriticalityDiagnostics                PRESENCE optional    },
+    ...
+}
+
+-- **************************************************************
+--
+-- eNB DIRECT INFORMATION TRANSFER ELEMENTARY PROCEDURE
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- eNB Direct Information Transfer
+--
+-- **************************************************************
+
+ENBDirectInformationTransfer ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       {{ ENBDirectInformationTransferIEs}},
+    ...
+}
+
+ENBDirectInformationTransferIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-Inter-SystemInformationTransferTypeEDT    CRITICALITY reject    TYPE Inter-SystemInformationTransferType        PRESENCE mandatory    },
+    ...
+}
+
+Inter-SystemInformationTransferType ::= CHOICE {
+    rIMTransfer        RIMTransfer,
+    ...
+}
+
+-- **************************************************************
+--
+-- MME DIRECT INFORMATION TRANSFER ELEMENTARY PROCEDURE
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- MME Direct Information Transfer
+--
+-- **************************************************************
+
+MMEDirectInformationTransfer ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       {{ MMEDirectInformationTransferIEs}},
+    ...
+}
+
+MMEDirectInformationTransferIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-Inter-SystemInformationTransferTypeMDT    CRITICALITY reject    TYPE Inter-SystemInformationTransferType    PRESENCE mandatory    },
+    ...
+}
+-- **************************************************************
+--
+-- eNB CONFIGURATION TRANSFER ELEMENTARY PROCEDURE
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- eNB Configuration Transfer
+--
+-- **************************************************************
+
+ENBConfigurationTransfer ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       {{ ENBConfigurationTransferIEs}},
+    ...
+}
+
+ENBConfigurationTransferIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-SONConfigurationTransferECT            CRITICALITY ignore    TYPE SONConfigurationTransfer            PRESENCE optional    }|
+    { ID id-EN-DCSONConfigurationTransfer-ECT    CRITICALITY ignore    TYPE EN-DCSONConfigurationTransfer    PRESENCE optional    },
+    ...
+}
+
+-- **************************************************************
+--
+-- MME CONFIGURATION TRANSFER ELEMENTARY PROCEDURE
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- MME Configuration Transfer
+--
+-- **************************************************************
+
+MMEConfigurationTransfer ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       {{ MMEConfigurationTransferIEs}},
+    ...
+}
+
+MMEConfigurationTransferIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-SONConfigurationTransferMCT            CRITICALITY ignore    TYPE SONConfigurationTransfer            PRESENCE optional    }|
+    { ID id-EN-DCSONConfigurationTransfer-MCT    CRITICALITY ignore    TYPE EN-DCSONConfigurationTransfer    PRESENCE optional    },
+    ...
+}
+
+-- **************************************************************
+--
+-- PRIVATE MESSAGE ELEMENTARY PROCEDURE
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- Private Message
+--
+-- **************************************************************
+
+PrivateMessage ::= SEQUENCE {
+    privateIEs            PrivateIE-Container       {{PrivateMessageIEs}},
+    ...
+}
+
+PrivateMessageIEs S1AP-PRIVATE-IES ::= {
+    ...
+}
+
+-- **************************************************************
+--
+-- KILL PROCEDURE
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- Kill Request
+--
+-- **************************************************************
+
+
+KillRequest ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { {KillRequestIEs} },
+    ...
+}
+
+KillRequestIEs S1AP-PROTOCOL-IES ::= {    
+    { ID id-MessageIdentifier            CRITICALITY reject    TYPE MessageIdentifier        PRESENCE mandatory}|
+    { ID id-SerialNumber                CRITICALITY reject    TYPE SerialNumber            PRESENCE mandatory}|
+    { ID id-WarningAreaList                CRITICALITY ignore    TYPE WarningAreaList        PRESENCE optional}|
+    { ID id-KillAllWarningMessages        CRITICALITY reject    TYPE KillAllWarningMessages    PRESENCE optional},
+    ...
+}
+
+-- **************************************************************
+--
+-- Kill Response
+--
+-- **************************************************************
+
+KillResponse ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container        { {KillResponseIEs} },
+    ...
+}
+
+KillResponseIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MessageIdentifier            CRITICALITY reject    TYPE MessageIdentifier                    PRESENCE mandatory    }|
+    { ID id-SerialNumber                CRITICALITY reject    TYPE SerialNumber                        PRESENCE mandatory    }|
+    { ID id-BroadcastCancelledAreaList    CRITICALITY ignore    TYPE BroadcastCancelledAreaList            PRESENCE optional    }|
+    { ID id-CriticalityDiagnostics        CRITICALITY ignore    TYPE CriticalityDiagnostics                PRESENCE optional    },
+    ...
+}
+
+-- **************************************************************
+--
+-- PWS RESTART INDICATION PROCEDURE
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- PWS Restart Indication
+--
+-- **************************************************************
+
+PWSRestartIndication::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       {{ PWSRestartIndicationIEs}},
+    ...
+}
+
+PWSRestartIndicationIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-ECGIListForRestart                CRITICALITY reject    TYPE ECGIListForRestart                    PRESENCE mandatory}|
+    { ID id-Global-ENB-ID                    CRITICALITY reject    TYPE Global-ENB-ID                        PRESENCE mandatory}|
+    { ID id-TAIListForRestart                CRITICALITY reject    TYPE TAIListForRestart                    PRESENCE mandatory}|
+    { ID id-EmergencyAreaIDListForRestart    CRITICALITY reject    TYPE EmergencyAreaIDListForRestart    PRESENCE optional},
+    ...
+}
+
+-- **************************************************************
+--
+-- PWS Failure Indication
+--
+-- **************************************************************
+
+PWSFailureIndication::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       {{ PWSFailureIndicationIEs}},
+    ...
+}
+
+PWSFailureIndicationIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-PWSfailedECGIList        CRITICALITY reject    TYPE PWSfailedECGIList    PRESENCE mandatory}|
+    { ID id-Global-ENB-ID            CRITICALITY reject    TYPE Global-ENB-ID        PRESENCE mandatory},
+    ...
+}
+
+-- **************************************************************
+--
+-- LPPA TRANSPORT ELEMENTARY PROCEDURES
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- DOWNLINK UE ASSOCIATED LPPA TRANSPORT
+--
+-- **************************************************************
+
+DownlinkUEAssociatedLPPaTransport ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       {{DownlinkUEAssociatedLPPaTransport-IEs}},
+    ...
+}
+
+DownlinkUEAssociatedLPPaTransport-IEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID            CRITICALITY reject    TYPE MME-UE-S1AP-ID                PRESENCE mandatory    }|
+    { ID id-eNB-UE-S1AP-ID            CRITICALITY reject    TYPE ENB-UE-S1AP-ID                PRESENCE mandatory    }|
+    { ID id-Routing-ID                CRITICALITY reject    TYPE Routing-ID                    PRESENCE mandatory    }|
+    { ID id-LPPa-PDU                CRITICALITY reject    TYPE LPPa-PDU                    PRESENCE mandatory    },
+    ...
+}
+
+-- **************************************************************
+--
+-- UPLINK UE ASSOCIATED LPPA TRANSPORT
+--
+-- **************************************************************
+
+UplinkUEAssociatedLPPaTransport ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       {{UplinkUEAssociatedLPPaTransport-IEs}},
+    ...
+}
+
+UplinkUEAssociatedLPPaTransport-IEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID            CRITICALITY reject    TYPE MME-UE-S1AP-ID                PRESENCE mandatory    }|
+    { ID id-eNB-UE-S1AP-ID            CRITICALITY reject    TYPE ENB-UE-S1AP-ID                PRESENCE mandatory    }|
+    { ID id-Routing-ID                CRITICALITY reject    TYPE Routing-ID                    PRESENCE mandatory    }|
+    { ID id-LPPa-PDU                CRITICALITY reject    TYPE LPPa-PDU                    PRESENCE mandatory    },
+    ...
+}
+
+-- **************************************************************
+--
+-- DOWNLINK NON UE ASSOCIATED LPPA TRANSPORT
+--
+-- **************************************************************
+
+DownlinkNonUEAssociatedLPPaTransport ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       {{DownlinkNonUEAssociatedLPPaTransport-IEs}},
+    ...
+}
+
+DownlinkNonUEAssociatedLPPaTransport-IEs S1AP-PROTOCOL-IES ::= {
+    { ID id-Routing-ID                CRITICALITY reject    TYPE Routing-ID                    PRESENCE mandatory    }|
+    { ID id-LPPa-PDU                CRITICALITY reject    TYPE LPPa-PDU                    PRESENCE mandatory    },
+    ...
+}
+
+-- **************************************************************
+--
+-- UPLINK NON UE ASSOCIATED LPPA TRANSPORT
+--
+-- **************************************************************
+
+UplinkNonUEAssociatedLPPaTransport ::= SEQUENCE {
+    protocolIEs        ProtocolIE-Container       {{UplinkNonUEAssociatedLPPaTransport-IEs}},
+    ...
+}
+
+UplinkNonUEAssociatedLPPaTransport-IEs S1AP-PROTOCOL-IES ::= {
+    { ID id-Routing-ID                CRITICALITY reject    TYPE Routing-ID                    PRESENCE mandatory    }|
+    { ID id-LPPa-PDU                CRITICALITY reject    TYPE LPPa-PDU                    PRESENCE mandatory    },
+    ...
+}
+
+
+-- **************************************************************
+--
+-- E-RAB MODIFICATION INDICATION ELEMENTARY PROCEDURE
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- E-RAB Modification Indication
+--
+-- **************************************************************
+
+E-RABModificationIndication ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { { E-RABModificationIndicationIEs} },
+    ...
+}
+
+E-RABModificationIndicationIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID                            CRITICALITY reject    TYPE MME-UE-S1AP-ID                        PRESENCE mandatory}|
+    { ID id-eNB-UE-S1AP-ID                            CRITICALITY reject    TYPE ENB-UE-S1AP-ID                        PRESENCE mandatory}|
+    { ID id-E-RABToBeModifiedListBearerModInd        CRITICALITY reject    TYPE E-RABToBeModifiedListBearerModInd        PRESENCE mandatory}|
+    { ID id-E-RABNotToBeModifiedListBearerModInd    CRITICALITY reject    TYPE E-RABNotToBeModifiedListBearerModInd    PRESENCE optional}|
+    { ID id-CSGMembershipInfo                        CRITICALITY reject    TYPE CSGMembershipInfo                    PRESENCE optional}|
+-- Extension for Release 11 to support BBAI -- 
+    { ID id-Tunnel-Information-for-BBF                CRITICALITY ignore    TYPE TunnelInformation                    PRESENCE optional}|
+    { ID id-SecondaryRATDataUsageReportList            CRITICALITY ignore    TYPE SecondaryRATDataUsageReportList        PRESENCE optional },
+    ...
+}
+
+E-RABToBeModifiedListBearerModInd ::= E-RAB-IE-ContainerList { {E-RABToBeModifiedItemBearerModIndIEs} }
+
+E-RABToBeModifiedItemBearerModIndIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-E-RABToBeModifiedItemBearerModInd        CRITICALITY reject    TYPE E-RABToBeModifiedItemBearerModInd        PRESENCE mandatory},
+    ...
+}
+
+E-RABToBeModifiedItemBearerModInd ::= SEQUENCE {
+    e-RAB-ID                        E-RAB-ID,
+    transportLayerAddress            TransportLayerAddress,
+    dL-GTP-TEID                        GTP-TEID,
+    iE-Extensions                    ProtocolExtensionContainer { { E-RABToBeModifiedItemBearerModInd-ExtIEs} }            OPTIONAL,
+    ...
+}
+
+E-RABToBeModifiedItemBearerModInd-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+E-RABNotToBeModifiedListBearerModInd ::= E-RAB-IE-ContainerList { {E-RABNotToBeModifiedItemBearerModIndIEs} }
+
+E-RABNotToBeModifiedItemBearerModIndIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-E-RABNotToBeModifiedItemBearerModInd        CRITICALITY reject    TYPE E-RABNotToBeModifiedItemBearerModInd        PRESENCE mandatory},
+    ...
+}
+
+E-RABNotToBeModifiedItemBearerModInd ::= SEQUENCE {
+    e-RAB-ID                        E-RAB-ID,
+    transportLayerAddress            TransportLayerAddress,
+    dL-GTP-TEID                        GTP-TEID,
+    iE-Extensions                    ProtocolExtensionContainer { { E-RABNotToBeModifiedItemBearerModInd-ExtIEs} }        OPTIONAL,
+    ...
+}
+
+E-RABNotToBeModifiedItemBearerModInd-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+CSGMembershipInfo ::= SEQUENCE {
+    cSGMembershipStatus        CSGMembershipStatus,
+    cSG-Id                    CSG-Id,
+    cellAccessMode            CellAccessMode    OPTIONAL,
+    pLMNidentity            PLMNidentity    OPTIONAL,
+    iE-Extensions            ProtocolExtensionContainer { { CSGMembershipInfo-ExtIEs} }        OPTIONAL,
+    ...
+}
+
+CSGMembershipInfo-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+-- **************************************************************
+--
+-- E-RAB Modification Confirm
+--
+-- **************************************************************
+
+E-RABModificationConfirm ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container { {E-RABModificationConfirmIEs} },
+    ...
+}
+
+E-RABModificationConfirmIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID                            CRITICALITY ignore    TYPE MME-UE-S1AP-ID                    PRESENCE mandatory}|
+    { ID id-eNB-UE-S1AP-ID                            CRITICALITY ignore    TYPE ENB-UE-S1AP-ID                    PRESENCE mandatory}|
+    { ID id-E-RABModifyListBearerModConf            CRITICALITY ignore    TYPE E-RABModifyListBearerModConf    PRESENCE optional}|
+    { ID id-E-RABFailedToModifyListBearerModConf    CRITICALITY ignore    TYPE E-RABList                        PRESENCE optional}|
+    { ID id-E-RABToBeReleasedListBearerModConf        CRITICALITY ignore    TYPE E-RABList                        PRESENCE optional}|
+    { ID id-CriticalityDiagnostics                    CRITICALITY ignore    TYPE CriticalityDiagnostics        PRESENCE optional}|
+    { ID id-CSGMembershipStatus                        CRITICALITY ignore    TYPE CSGMembershipStatus            PRESENCE optional},
+    ...
+}
+
+E-RABModifyListBearerModConf ::= SEQUENCE (SIZE(1.. maxnoofE-RABs)) OF ProtocolIE-SingleContainer { {E-RABModifyItemBearerModConfIEs} }
+
+E-RABModifyItemBearerModConfIEs     S1AP-PROTOCOL-IES ::= {
+    { ID id-E-RABModifyItemBearerModConf        CRITICALITY ignore    TYPE E-RABModifyItemBearerModConf        PRESENCE mandatory},
+    ...
+}
+
+E-RABModifyItemBearerModConf ::= SEQUENCE {
+    e-RAB-ID                    E-RAB-ID,
+    iE-Extensions                ProtocolExtensionContainer { {E-RABModifyItemBearerModConfExtIEs} } OPTIONAL,
+    ...
+}
+
+
+E-RABModifyItemBearerModConfExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+
+-- **************************************************************
+--
+-- UE CONTEXT MODIFICATION INDICATION ELEMENTARY PROCEDURE
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- UE Context Modification Indication
+--
+-- **************************************************************
+
+UEContextModificationIndication ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { { UEContextModificationIndicationIEs} },
+    ...
+}
+
+UEContextModificationIndicationIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID            CRITICALITY reject    TYPE MME-UE-S1AP-ID            PRESENCE mandatory}|
+    { ID id-eNB-UE-S1AP-ID            CRITICALITY reject    TYPE ENB-UE-S1AP-ID            PRESENCE mandatory}|
+    { ID id-CSGMembershipInfo        CRITICALITY reject    TYPE CSGMembershipInfo        PRESENCE optional},
+    ...
+}
+
+
+-- **************************************************************
+--
+-- UE Context Modification Confirm
+--
+-- **************************************************************
+
+UEContextModificationConfirm ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container { {UEContextModificationConfirmIEs} },
+    ...
+}
+
+UEContextModificationConfirmIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID                CRITICALITY ignore    TYPE MME-UE-S1AP-ID                PRESENCE mandatory}|
+    { ID id-eNB-UE-S1AP-ID                CRITICALITY ignore    TYPE ENB-UE-S1AP-ID                PRESENCE mandatory}|
+    { ID id-CSGMembershipStatus            CRITICALITY ignore    TYPE CSGMembershipStatus        PRESENCE optional}|
+    { ID id-CriticalityDiagnostics        CRITICALITY ignore    TYPE CriticalityDiagnostics        PRESENCE optional},
+    ...
+}
+
+-- **************************************************************
+--
+-- UE CONTEXT SUSPEND ELEMENTARY PROCEDURE
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- UE Context Suspend Request
+--
+-- **************************************************************
+
+UEContextSuspendRequest ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { { UEContextSuspendRequestIEs} },
+    ...
+}
+
+UEContextSuspendRequestIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID                                    CRITICALITY reject    TYPE MME-UE-S1AP-ID                PRESENCE mandatory}|
+    { ID id-eNB-UE-S1AP-ID                                    CRITICALITY reject    TYPE ENB-UE-S1AP-ID                PRESENCE mandatory}|
+    { ID id-InformationOnRecommendedCellsAndENBsForPaging    CRITICALITY ignore    TYPE InformationOnRecommendedCellsAndENBsForPaging PRESENCE optional}|
+    { ID id-CellIdentifierAndCELevelForCECapableUEs            CRITICALITY ignore    TYPE CellIdentifierAndCELevelForCECapableUEs    PRESENCE optional}|
+    { ID id-SecondaryRATDataUsageReportList                CRITICALITY ignore    TYPE SecondaryRATDataUsageReportList        PRESENCE optional }|
+    { ID id-UserLocationInformation                            CRITICALITY ignore    TYPE UserLocationInformation            PRESENCE optional }|
+    { ID id-TimeSinceSecondaryNodeRelease                    CRITICALITY ignore    TYPE TimeSinceSecondaryNodeRelease    PRESENCE optional },
+    ...
+}
+
+-- **************************************************************
+--
+-- UE Context Suspend Response
+--
+-- **************************************************************
+
+UEContextSuspendResponse ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container { {UEContextSuspendResponseIEs} },
+    ...
+}
+
+UEContextSuspendResponseIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID                CRITICALITY ignore    TYPE MME-UE-S1AP-ID                PRESENCE mandatory}|
+    { ID id-eNB-UE-S1AP-ID                CRITICALITY ignore    TYPE ENB-UE-S1AP-ID                PRESENCE mandatory}|
+    { ID id-CriticalityDiagnostics        CRITICALITY ignore    TYPE CriticalityDiagnostics        PRESENCE optional}|
+    { ID id-SecurityContext                CRITICALITY reject    TYPE SecurityContext            PRESENCE optional},
+    ...
+}
+
+-- **************************************************************
+--
+-- UE CONTEXT RESUME ELEMENTARY PROCEDURE
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- UE Context Resume Request
+--
+-- **************************************************************
+
+UEContextResumeRequest ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { { UEContextResumeRequestIEs} },
+    ...
+}
+
+UEContextResumeRequestIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID                                        CRITICALITY reject    TYPE MME-UE-S1AP-ID                PRESENCE mandatory}|
+    { ID id-eNB-UE-S1AP-ID                                    CRITICALITY reject    TYPE ENB-UE-S1AP-ID                PRESENCE mandatory}|
+    { ID id-E-RABFailedToResumeListResumeReq                 CRITICALITY reject    TYPE E-RABFailedToResumeListResumeReq        PRESENCE optional}|
+    { ID id-RRC-Resume-Cause                                CRITICALITY ignore    TYPE RRC-Establishment-Cause    PRESENCE optional},
+    ...
+}
+
+E-RABFailedToResumeListResumeReq ::= E-RAB-IE-ContainerList { {E-RABFailedToResumeItemResumeReqIEs} }
+
+E-RABFailedToResumeItemResumeReqIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-E-RABFailedToResumeItemResumeReq    CRITICALITY reject    TYPE E-RABFailedToResumeItemResumeReq    PRESENCE mandatory},
+    ...
+}
+
+E-RABFailedToResumeItemResumeReq ::= SEQUENCE {
+    e-RAB-ID                            E-RAB-ID,
+    cause                                Cause,
+    iE-Extensions                        ProtocolExtensionContainer { { E-RABFailedToResumeItemResumeReq-ExtIEs} }        OPTIONAL,
+    ...
+}
+
+E-RABFailedToResumeItemResumeReq-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+-- **************************************************************
+--
+-- UE Context Resume Response
+--
+-- **************************************************************
+
+UEContextResumeResponse ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { { UEContextResumeResponseIEs} },
+    ...
+}
+
+UEContextResumeResponseIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID                        CRITICALITY ignore    TYPE MME-UE-S1AP-ID                            PRESENCE mandatory}|
+    { ID id-eNB-UE-S1AP-ID                        CRITICALITY ignore    TYPE ENB-UE-S1AP-ID                            PRESENCE mandatory}|
+    { ID id-E-RABFailedToResumeListResumeRes    CRITICALITY reject    TYPE E-RABFailedToResumeListResumeRes        PRESENCE optional}|
+    { ID id-CriticalityDiagnostics                CRITICALITY ignore    TYPE CriticalityDiagnostics                    PRESENCE optional}|
+    { ID id-SecurityContext                        CRITICALITY reject    TYPE SecurityContext                        PRESENCE optional}|
+    { ID id-PendingDataIndication                CRITICALITY ignore    TYPE PendingDataIndication                    PRESENCE optional},
+    ...
+}
+
+E-RABFailedToResumeListResumeRes ::= E-RAB-IE-ContainerList { {E-RABFailedToResumeItemResumeResIEs} }
+
+E-RABFailedToResumeItemResumeResIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-E-RABFailedToResumeItemResumeRes    CRITICALITY reject    TYPE E-RABFailedToResumeItemResumeRes    PRESENCE mandatory},
+    ...
+}
+
+E-RABFailedToResumeItemResumeRes ::= SEQUENCE {
+    e-RAB-ID                            E-RAB-ID,
+    cause                                Cause,
+    iE-Extensions                        ProtocolExtensionContainer { { E-RABFailedToResumeItemResumeRes-ExtIEs} }        OPTIONAL,
+    ...
+}
+
+E-RABFailedToResumeItemResumeRes-ExtIEs S1AP-PROTOCOL-EXTENSION ::= {
+    ...
+}
+
+-- **************************************************************
+--
+-- UE Context Resume Failure
+--
+-- **************************************************************
+
+UEContextResumeFailure ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { { UEContextResumeFailureIEs} },
+    ...
+}
+
+UEContextResumeFailureIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID                        CRITICALITY ignore    TYPE MME-UE-S1AP-ID                        PRESENCE mandatory}|
+    { ID id-eNB-UE-S1AP-ID                        CRITICALITY ignore    TYPE ENB-UE-S1AP-ID                        PRESENCE mandatory}|
+    { ID id-Cause                                CRITICALITY ignore    TYPE Cause                                PRESENCE mandatory}|
+    { ID id-CriticalityDiagnostics                CRITICALITY ignore    TYPE CriticalityDiagnostics                PRESENCE optional},
+    ...
+}
+
+-- **************************************************************
+--
+-- Connection Establishment Indication
+--
+-- **************************************************************
+
+ConnectionEstablishmentIndication::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container { {ConnectionEstablishmentIndicationIEs} },
+    ...
+}
+
+ConnectionEstablishmentIndicationIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID                CRITICALITY ignore    TYPE MME-UE-S1AP-ID                PRESENCE mandatory}|
+    { ID id-eNB-UE-S1AP-ID                CRITICALITY ignore    TYPE ENB-UE-S1AP-ID                PRESENCE mandatory}|
+    { ID id-UERadioCapability            CRITICALITY ignore    TYPE UERadioCapability            PRESENCE optional }|
+    { ID id-EnhancedCoverageRestricted    CRITICALITY ignore    TYPE EnhancedCoverageRestricted    PRESENCE optional }|
+    { ID id-DL-CP-SecurityInformation    CRITICALITY ignore    TYPE DL-CP-SecurityInformation    PRESENCE optional }|
+    { ID id-CE-ModeBRestricted            CRITICALITY ignore    TYPE CE-ModeBRestricted            PRESENCE optional}|
+    { ID id-EndIndication                CRITICALITY ignore    TYPE EndIndication                PRESENCE optional}|
+    { ID id-Subscription-Based-UE-DifferentiationInfo        CRITICALITY ignore    TYPE Subscription-Based-UE-DifferentiationInfo        PRESENCE optional},
+    ...
+}
+
+-- **************************************************************
+--
+-- Retrieve UE Information 
+--
+-- **************************************************************
+
+RetrieveUEInformation ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { { RetrieveUEInformationIEs} },
+    ...
+}
+
+RetrieveUEInformationIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-S-TMSI                        CRITICALITY reject    TYPE S-TMSI                PRESENCE mandatory},
+...
+
+}
+
+
+-- **************************************************************
+
+-- UE Information Transfer
+--
+-- **************************************************************
+UEInformationTransfer ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { {  UEInformationTransferIEs} },
+    ...
+}
+
+UEInformationTransferIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-S-TMSI                        CRITICALITY reject     TYPE S-TMSI                        PRESENCE mandatory}|
+    { ID id-UE-Level-QoS-Parameters        CRITICALITY ignore    TYPE E-RABLevelQoSParameters    PRESENCE optional}|
+    { ID id-UERadioCapability            CRITICALITY ignore    TYPE UERadioCapability            PRESENCE optional}|
+    { ID id-Subscription-Based-UE-DifferentiationInfo        CRITICALITY ignore    TYPE Subscription-Based-UE-DifferentiationInfo        PRESENCE optional}|
+    { ID id-PendingDataIndication        CRITICALITY ignore    TYPE PendingDataIndication        PRESENCE optional},
+    ...
+}
+
+
+-- **************************************************************
+--
+-- eNB CP Relocation Indication
+--
+-- **************************************************************
+
+ENBCPRelocationIndication ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container { { ENBCPRelocationIndicationIEs} },
+    ...
+}
+
+ENBCPRelocationIndicationIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-eNB-UE-S1AP-ID                CRITICALITY reject    TYPE ENB-UE-S1AP-ID                PRESENCE mandatory}|
+    { ID id-S-TMSI                        CRITICALITY reject    TYPE S-TMSI                        PRESENCE mandatory}|
+    { ID id-EUTRAN-CGI                    CRITICALITY ignore    TYPE EUTRAN-CGI                    PRESENCE mandatory}|
+    { ID id-TAI                            CRITICALITY ignore    TYPE TAI                        PRESENCE mandatory}|
+    { ID id-UL-CP-SecurityInformation    CRITICALITY reject    TYPE UL-CP-SecurityInformation    PRESENCE mandatory},
+    ...
+}
+
+
+-- **************************************************************
+--
+-- MME CP Relocation Indication
+--
+-- **************************************************************
+
+MMECPRelocationIndication ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container { { MMECPRelocationIndicationIEs} },
+    ...
+}
+
+MMECPRelocationIndicationIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID                CRITICALITY reject    TYPE MME-UE-S1AP-ID                PRESENCE mandatory}|
+    { ID id-eNB-UE-S1AP-ID                CRITICALITY reject    TYPE ENB-UE-S1AP-ID                PRESENCE mandatory},
+    ...
+}
+
+
+-- **************************************************************
+--
+-- Secondary RAT Data Usage Report
+--
+-- **************************************************************
+
+SecondaryRATDataUsageReport ::= SEQUENCE {
+    protocolIEs            ProtocolIE-Container       { { SecondaryRATDataUsageReportIEs} },
+    ...
+}
+
+SecondaryRATDataUsageReportIEs S1AP-PROTOCOL-IES ::= {
+    { ID id-MME-UE-S1AP-ID                            CRITICALITY ignore    TYPE MME-UE-S1AP-ID                PRESENCE mandatory}|
+    { ID id-eNB-UE-S1AP-ID                        CRITICALITY ignore    TYPE ENB-UE-S1AP-ID                PRESENCE mandatory}|
+    { ID id-SecondaryRATDataUsageReportList            CRITICALITY ignore    TYPE SecondaryRATDataUsageReportList    PRESENCE mandatory}|
+    { ID id-HandoverFlag                            CRITICALITY ignore    TYPE HandoverFlag                    PRESENCE optional}|
+    { ID id-UserLocationInformation                CRITICALITY ignore    TYPE UserLocationInformation            PRESENCE optional}|
+    { ID id-TimeSinceSecondaryNodeRelease        CRITICALITY ignore    TYPE TimeSinceSecondaryNodeRelease    PRESENCE optional },
+    ...
+}
+
+END
diff --git a/src/s1ap/asn1c/asnGenFiles/asn1c/S1AP-PDU-Descriptions.asn b/src/s1ap/asn1c/asnGenFiles/asn1c/S1AP-PDU-Descriptions.asn
new file mode 100644
index 0000000..a1f1efb
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/asn1c/S1AP-PDU-Descriptions.asn
@@ -0,0 +1,737 @@
+--
+-- **************************************************************
+
+S1AP-PDU-Descriptions  { 
+itu-t (0) identified-organization (4) etsi (0) mobileDomain (0) 
+eps-Access (21) modules (3) s1ap (1) version1 (1) s1ap-PDU-Descriptions (0)}
+
+DEFINITIONS AUTOMATIC TAGS ::= 
+
+BEGIN
+
+-- **************************************************************
+--
+-- IE parameter types from other modules.
+--
+-- **************************************************************
+
+IMPORTS
+    Criticality,
+    ProcedureCode
+FROM S1AP-CommonDataTypes
+
+    CellTrafficTrace,
+    DeactivateTrace,
+    DownlinkUEAssociatedLPPaTransport,
+    DownlinkNASTransport,
+    DownlinkNonUEAssociatedLPPaTransport,
+    DownlinkS1cdma2000tunnelling,
+    ENBDirectInformationTransfer,
+    ENBStatusTransfer,
+    ENBConfigurationUpdate,
+    ENBConfigurationUpdateAcknowledge,
+    ENBConfigurationUpdateFailure,
+    ErrorIndication,
+    HandoverCancel,
+    HandoverCancelAcknowledge,
+    HandoverCommand,
+    HandoverFailure,
+    HandoverNotify,
+    HandoverPreparationFailure,
+    HandoverRequest,
+    HandoverRequestAcknowledge,
+    HandoverRequired,
+    InitialContextSetupFailure,
+    InitialContextSetupRequest,
+    InitialContextSetupResponse,
+    InitialUEMessage,
+    KillRequest,
+    KillResponse,
+    LocationReportingControl,
+    LocationReportingFailureIndication,
+    LocationReport,
+    MMEConfigurationUpdate,
+    MMEConfigurationUpdateAcknowledge,
+    MMEConfigurationUpdateFailure,
+    MMEDirectInformationTransfer,
+    MMEStatusTransfer,
+    NASNonDeliveryIndication,
+    OverloadStart,
+    OverloadStop,
+    Paging,
+    PathSwitchRequest,
+    PathSwitchRequestAcknowledge,
+    PathSwitchRequestFailure,    
+    PrivateMessage,
+    Reset,
+    ResetAcknowledge,
+    S1SetupFailure,
+    S1SetupRequest,
+    S1SetupResponse,
+    E-RABModifyRequest,
+    E-RABModifyResponse,
+    E-RABModificationIndication,
+    E-RABModificationConfirm,
+    E-RABReleaseCommand,
+    E-RABReleaseResponse,
+    E-RABReleaseIndication,
+    E-RABSetupRequest,
+    E-RABSetupResponse,
+    TraceFailureIndication,
+    TraceStart,
+    UECapabilityInfoIndication,
+    UEContextModificationFailure,
+    UEContextModificationRequest,
+    UEContextModificationResponse,
+    UEContextReleaseCommand,
+    UEContextReleaseComplete,
+    UEContextReleaseRequest,
+    UERadioCapabilityMatchRequest,
+    UERadioCapabilityMatchResponse,
+    UplinkUEAssociatedLPPaTransport,
+    UplinkNASTransport,
+    UplinkNonUEAssociatedLPPaTransport,
+    UplinkS1cdma2000tunnelling,
+    WriteReplaceWarningRequest,
+    WriteReplaceWarningResponse,
+    ENBConfigurationTransfer,
+    MMEConfigurationTransfer,
+    PWSRestartIndication,
+    UEContextModificationIndication,
+    UEContextModificationConfirm,
+    RerouteNASRequest,
+    PWSFailureIndication,
+    UEContextSuspendRequest,
+    UEContextSuspendResponse,
+    UEContextResumeRequest,
+    UEContextResumeResponse,
+    UEContextResumeFailure,
+    ConnectionEstablishmentIndication,
+    NASDeliveryIndication,
+    RetrieveUEInformation,
+    UEInformationTransfer,
+    ENBCPRelocationIndication,
+    MMECPRelocationIndication,
+    SecondaryRATDataUsageReport
+
+
+FROM S1AP-PDU-Contents
+    
+    id-CellTrafficTrace,
+    id-DeactivateTrace,
+    id-downlinkUEAssociatedLPPaTransport,
+    id-downlinkNASTransport,
+    id-downlinkNonUEAssociatedLPPaTransport,
+    id-DownlinkS1cdma2000tunnelling,
+    id-eNBStatusTransfer,
+    id-ErrorIndication,
+    id-HandoverCancel,
+    id-HandoverNotification,
+    id-HandoverPreparation,
+    id-HandoverResourceAllocation,
+    id-InitialContextSetup,
+    id-initialUEMessage,
+    id-ENBConfigurationUpdate,
+    id-Kill,
+    id-LocationReportingControl,
+    id-LocationReportingFailureIndication,
+    id-LocationReport,
+    id-eNBDirectInformationTransfer,
+    id-MMEConfigurationUpdate,
+    id-MMEDirectInformationTransfer,
+    id-MMEStatusTransfer,
+    id-NASNonDeliveryIndication,
+    id-OverloadStart,
+    id-OverloadStop,
+    id-Paging,
+    id-PathSwitchRequest,
+    id-PrivateMessage,
+    id-Reset,
+    id-S1Setup,
+    id-E-RABModify,
+    id-E-RABModificationIndication,
+    id-E-RABRelease,
+    id-E-RABReleaseIndication,
+    id-E-RABSetup,
+    id-TraceFailureIndication,
+    id-TraceStart,
+    id-UECapabilityInfoIndication,
+    id-UEContextModification,
+    id-UEContextRelease,
+    id-UEContextReleaseRequest,
+    id-UERadioCapabilityMatch,
+    id-uplinkUEAssociatedLPPaTransport,
+    id-uplinkNASTransport,
+    id-uplinkNonUEAssociatedLPPaTransport,
+    id-UplinkS1cdma2000tunnelling,
+    id-WriteReplaceWarning,
+    id-eNBConfigurationTransfer,
+    id-MMEConfigurationTransfer,
+    id-PWSRestartIndication,
+    id-UEContextModificationIndication,
+    id-RerouteNASRequest,
+    id-PWSFailureIndication,
+    id-UEContextSuspend,
+    id-UEContextResume,
+    id-ConnectionEstablishmentIndication,
+    id-NASDeliveryIndication,
+    id-RetrieveUEInformation,
+    id-UEInformationTransfer,
+    id-eNBCPRelocationIndication,
+    id-MMECPRelocationIndication,
+    id-SecondaryRATDataUsageReport
+
+
+FROM S1AP-Constants;
+
+
+-- **************************************************************
+--
+-- Interface Elementary Procedure Class
+--
+-- **************************************************************
+
+S1AP-ELEMENTARY-PROCEDURE ::= CLASS {
+    &InitiatingMessage                ,
+    &SuccessfulOutcome                            OPTIONAL,
+    &UnsuccessfulOutcome                        OPTIONAL,
+    &procedureCode                ProcedureCode     UNIQUE,
+    &criticality                Criticality     DEFAULT ignore
+}
+WITH SYNTAX {
+    INITIATING MESSAGE            &InitiatingMessage
+    [SUCCESSFUL OUTCOME            &SuccessfulOutcome]
+    [UNSUCCESSFUL OUTCOME        &UnsuccessfulOutcome]
+    PROCEDURE CODE                &procedureCode
+    [CRITICALITY                &criticality]
+}
+
+-- **************************************************************
+--
+-- Interface PDU Definition
+--
+-- **************************************************************
+
+S1AP-PDU ::= CHOICE {
+    initiatingMessage    InitiatingMessage,
+    successfulOutcome    SuccessfulOutcome,
+    unsuccessfulOutcome    UnsuccessfulOutcome,
+    ...
+}
+
+InitiatingMessage ::= SEQUENCE {
+    procedureCode    S1AP-ELEMENTARY-PROCEDURE.&procedureCode        ({S1AP-ELEMENTARY-PROCEDURES}),
+    criticality        S1AP-ELEMENTARY-PROCEDURE.&criticality            ({S1AP-ELEMENTARY-PROCEDURES}{@procedureCode}),
+    value            S1AP-ELEMENTARY-PROCEDURE.&InitiatingMessage    ({S1AP-ELEMENTARY-PROCEDURES}{@procedureCode})
+}
+
+SuccessfulOutcome ::= SEQUENCE {
+    procedureCode    S1AP-ELEMENTARY-PROCEDURE.&procedureCode        ({S1AP-ELEMENTARY-PROCEDURES}),
+    criticality        S1AP-ELEMENTARY-PROCEDURE.&criticality            ({S1AP-ELEMENTARY-PROCEDURES}{@procedureCode}),
+    value            S1AP-ELEMENTARY-PROCEDURE.&SuccessfulOutcome    ({S1AP-ELEMENTARY-PROCEDURES}{@procedureCode})
+}
+
+UnsuccessfulOutcome ::= SEQUENCE {
+    procedureCode    S1AP-ELEMENTARY-PROCEDURE.&procedureCode        ({S1AP-ELEMENTARY-PROCEDURES}),
+    criticality        S1AP-ELEMENTARY-PROCEDURE.&criticality            ({S1AP-ELEMENTARY-PROCEDURES}{@procedureCode}),
+    value            S1AP-ELEMENTARY-PROCEDURE.&UnsuccessfulOutcome    ({S1AP-ELEMENTARY-PROCEDURES}{@procedureCode})
+}
+
+-- **************************************************************
+--
+-- Interface Elementary Procedure List
+--
+-- **************************************************************
+
+S1AP-ELEMENTARY-PROCEDURES S1AP-ELEMENTARY-PROCEDURE ::= {
+    S1AP-ELEMENTARY-PROCEDURES-CLASS-1            |
+    S1AP-ELEMENTARY-PROCEDURES-CLASS-2,    
+    ...
+}
+
+
+S1AP-ELEMENTARY-PROCEDURES-CLASS-1 S1AP-ELEMENTARY-PROCEDURE ::= {
+    handoverPreparation                |
+    handoverResourceAllocation        |
+    pathSwitchRequest                 |
+    e-RABSetup                        |
+    e-RABModify                        |
+    e-RABRelease                    |
+    initialContextSetup                |
+    handoverCancel                    |
+    kill                            |
+    reset                            |
+    s1Setup                            |
+    uEContextModification            |
+    uEContextRelease                |
+    eNBConfigurationUpdate            |
+    mMEConfigurationUpdate            |
+    writeReplaceWarning                ,
+    ...,
+    uERadioCapabilityMatch                        |
+    e-RABModificationIndication                    |
+    uEContextModificationIndication                |
+    uEContextSuspend                            |
+    uEContextResume
+}
+
+S1AP-ELEMENTARY-PROCEDURES-CLASS-2 S1AP-ELEMENTARY-PROCEDURE ::= {    
+    handoverNotification            |
+    e-RABReleaseIndication            |
+    paging                             |
+    downlinkNASTransport            |
+    initialUEMessage                |
+    uplinkNASTransport                |
+    errorIndication                    |
+    nASNonDeliveryIndication        |
+    uEContextReleaseRequest            |
+    downlinkS1cdma2000tunnelling    |
+    uplinkS1cdma2000tunnelling        |
+    uECapabilityInfoIndication        |
+    eNBStatusTransfer                |
+    mMEStatusTransfer                |
+    deactivateTrace                    |
+    traceStart                        |
+    traceFailureIndication            |
+    cellTrafficTrace                |
+    locationReportingControl        |
+    locationReportingFailureIndication    |
+    locationReport                    |
+    overloadStart                    |
+    overloadStop                    |
+    eNBDirectInformationTransfer    |
+    mMEDirectInformationTransfer    |
+    eNBConfigurationTransfer        |
+    mMEConfigurationTransfer        |
+    privateMessage                    ,
+    ...,
+    downlinkUEAssociatedLPPaTransport    |
+    uplinkUEAssociatedLPPaTransport    |
+    downlinkNonUEAssociatedLPPaTransport    |
+    uplinkNonUEAssociatedLPPaTransport    |
+    pWSRestartIndication            |
+    rerouteNASRequest                |
+    pWSFailureIndication                        |
+    connectionEstablishmentIndication    |
+    nASDeliveryIndication            |
+    retrieveUEInformation            |
+    uEInformationTransfer            |
+    eNBCPRelocationIndication                    |
+    mMECPRelocationIndication        |
+    secondaryRATDataUsageReport
+}
+
+-- **************************************************************
+--
+-- Interface Elementary Procedures
+--
+-- **************************************************************
+
+handoverPreparation S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        HandoverRequired
+    SUCCESSFUL OUTCOME        HandoverCommand
+    UNSUCCESSFUL OUTCOME    HandoverPreparationFailure
+    PROCEDURE CODE            id-HandoverPreparation
+    CRITICALITY                reject
+}
+
+handoverResourceAllocation S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        HandoverRequest
+    SUCCESSFUL OUTCOME        HandoverRequestAcknowledge
+    UNSUCCESSFUL OUTCOME    HandoverFailure
+    PROCEDURE CODE            id-HandoverResourceAllocation
+    CRITICALITY                reject
+}
+
+handoverNotification S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        HandoverNotify
+    PROCEDURE CODE            id-HandoverNotification
+    CRITICALITY                ignore
+}
+
+pathSwitchRequest S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        PathSwitchRequest
+    SUCCESSFUL OUTCOME        PathSwitchRequestAcknowledge
+    UNSUCCESSFUL OUTCOME    PathSwitchRequestFailure
+    PROCEDURE CODE            id-PathSwitchRequest
+    CRITICALITY                reject
+}
+
+e-RABSetup S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        E-RABSetupRequest
+    SUCCESSFUL OUTCOME        E-RABSetupResponse
+    PROCEDURE CODE            id-E-RABSetup
+    CRITICALITY                reject
+}
+
+e-RABModify S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        E-RABModifyRequest
+    SUCCESSFUL OUTCOME        E-RABModifyResponse
+    PROCEDURE CODE            id-E-RABModify
+    CRITICALITY                reject
+}
+
+e-RABRelease S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        E-RABReleaseCommand
+    SUCCESSFUL OUTCOME        E-RABReleaseResponse
+    PROCEDURE CODE            id-E-RABRelease
+    CRITICALITY                reject
+}
+
+e-RABReleaseIndication S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        E-RABReleaseIndication
+    PROCEDURE CODE            id-E-RABReleaseIndication
+    CRITICALITY                ignore
+}
+
+initialContextSetup S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        InitialContextSetupRequest
+    SUCCESSFUL OUTCOME        InitialContextSetupResponse
+    UNSUCCESSFUL OUTCOME     InitialContextSetupFailure
+    PROCEDURE CODE            id-InitialContextSetup
+    CRITICALITY                reject
+}
+
+uEContextReleaseRequest S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        UEContextReleaseRequest
+    PROCEDURE CODE            id-UEContextReleaseRequest
+    CRITICALITY                ignore
+}
+
+paging S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        Paging
+    PROCEDURE CODE            id-Paging
+    CRITICALITY                ignore
+}
+
+downlinkNASTransport S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        DownlinkNASTransport
+    PROCEDURE CODE            id-downlinkNASTransport
+    CRITICALITY                ignore
+}
+
+initialUEMessage S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        InitialUEMessage
+    PROCEDURE CODE            id-initialUEMessage
+    CRITICALITY                ignore
+}
+
+uplinkNASTransport S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        UplinkNASTransport
+    PROCEDURE CODE            id-uplinkNASTransport
+    CRITICALITY                ignore
+}
+nASNonDeliveryIndication S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        NASNonDeliveryIndication
+    PROCEDURE CODE            id-NASNonDeliveryIndication
+    CRITICALITY                ignore
+}
+
+handoverCancel S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        HandoverCancel
+    SUCCESSFUL OUTCOME        HandoverCancelAcknowledge
+    PROCEDURE CODE            id-HandoverCancel
+    CRITICALITY                reject
+}
+
+reset S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        Reset
+    SUCCESSFUL OUTCOME        ResetAcknowledge
+    PROCEDURE CODE            id-Reset
+    CRITICALITY                reject
+}
+
+errorIndication S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        ErrorIndication
+    PROCEDURE CODE            id-ErrorIndication
+    CRITICALITY                ignore
+}
+
+s1Setup S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        S1SetupRequest
+    SUCCESSFUL OUTCOME        S1SetupResponse
+    UNSUCCESSFUL OUTCOME     S1SetupFailure
+    PROCEDURE CODE            id-S1Setup
+    CRITICALITY                reject
+}
+
+eNBConfigurationUpdate S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        ENBConfigurationUpdate
+    SUCCESSFUL OUTCOME        ENBConfigurationUpdateAcknowledge
+    UNSUCCESSFUL OUTCOME     ENBConfigurationUpdateFailure
+    PROCEDURE CODE            id-ENBConfigurationUpdate
+    CRITICALITY                reject
+}
+
+mMEConfigurationUpdate S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        MMEConfigurationUpdate
+    SUCCESSFUL OUTCOME        MMEConfigurationUpdateAcknowledge
+    UNSUCCESSFUL OUTCOME     MMEConfigurationUpdateFailure
+    PROCEDURE CODE            id-MMEConfigurationUpdate
+    CRITICALITY                reject
+}
+
+downlinkS1cdma2000tunnelling S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        DownlinkS1cdma2000tunnelling
+    PROCEDURE CODE            id-DownlinkS1cdma2000tunnelling
+    CRITICALITY                ignore
+}
+
+uplinkS1cdma2000tunnelling S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        UplinkS1cdma2000tunnelling
+    PROCEDURE CODE            id-UplinkS1cdma2000tunnelling
+    CRITICALITY                ignore
+}
+
+uEContextModification S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        UEContextModificationRequest
+    SUCCESSFUL OUTCOME        UEContextModificationResponse
+    UNSUCCESSFUL OUTCOME     UEContextModificationFailure
+    PROCEDURE CODE            id-UEContextModification
+    CRITICALITY                reject
+}
+
+uECapabilityInfoIndication S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        UECapabilityInfoIndication
+    PROCEDURE CODE            id-UECapabilityInfoIndication
+    CRITICALITY                ignore
+}
+
+uEContextRelease S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        UEContextReleaseCommand
+    SUCCESSFUL OUTCOME        UEContextReleaseComplete
+    PROCEDURE CODE            id-UEContextRelease
+    CRITICALITY                reject
+}
+
+eNBStatusTransfer S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        ENBStatusTransfer
+    PROCEDURE CODE            id-eNBStatusTransfer
+    CRITICALITY                ignore
+}
+
+mMEStatusTransfer S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        MMEStatusTransfer
+    PROCEDURE CODE            id-MMEStatusTransfer
+    CRITICALITY                ignore
+}
+
+deactivateTrace S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        DeactivateTrace
+    PROCEDURE CODE            id-DeactivateTrace
+    CRITICALITY                ignore
+}
+
+traceStart S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        TraceStart
+    PROCEDURE CODE            id-TraceStart
+    CRITICALITY                ignore
+}
+
+traceFailureIndication S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        TraceFailureIndication
+    PROCEDURE CODE            id-TraceFailureIndication
+    CRITICALITY                ignore
+}
+cellTrafficTrace S1AP-ELEMENTARY-PROCEDURE ::={
+INITIATING MESSAGE        CellTrafficTrace
+PROCEDURE CODE            id-CellTrafficTrace
+CRITICALITY                ignore
+}
+
+locationReportingControl S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        LocationReportingControl
+    PROCEDURE CODE            id-LocationReportingControl
+    CRITICALITY                ignore
+}
+
+locationReportingFailureIndication S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        LocationReportingFailureIndication
+    PROCEDURE CODE            id-LocationReportingFailureIndication
+    CRITICALITY                ignore
+}
+
+locationReport S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        LocationReport
+    PROCEDURE CODE            id-LocationReport
+    CRITICALITY                ignore
+}
+
+overloadStart S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        OverloadStart
+    PROCEDURE CODE            id-OverloadStart
+    CRITICALITY                ignore
+}
+
+overloadStop S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        OverloadStop
+    PROCEDURE CODE            id-OverloadStop
+    CRITICALITY                reject
+}
+
+writeReplaceWarning S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        WriteReplaceWarningRequest
+    SUCCESSFUL OUTCOME        WriteReplaceWarningResponse
+    PROCEDURE CODE            id-WriteReplaceWarning
+    CRITICALITY                reject
+}
+
+eNBDirectInformationTransfer S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        ENBDirectInformationTransfer
+    PROCEDURE CODE            id-eNBDirectInformationTransfer
+    CRITICALITY                ignore
+}
+
+mMEDirectInformationTransfer S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        MMEDirectInformationTransfer
+    PROCEDURE CODE            id-MMEDirectInformationTransfer
+    CRITICALITY                ignore
+}
+
+eNBConfigurationTransfer S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        ENBConfigurationTransfer
+    PROCEDURE CODE            id-eNBConfigurationTransfer
+    CRITICALITY                ignore
+}
+
+mMEConfigurationTransfer S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        MMEConfigurationTransfer
+    PROCEDURE CODE            id-MMEConfigurationTransfer
+    CRITICALITY                ignore
+}
+
+
+privateMessage S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        PrivateMessage
+    PROCEDURE CODE            id-PrivateMessage
+    CRITICALITY                ignore
+}
+
+pWSRestartIndication S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        PWSRestartIndication
+    PROCEDURE CODE            id-PWSRestartIndication
+    CRITICALITY                ignore
+}
+
+kill S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        KillRequest
+    SUCCESSFUL OUTCOME        KillResponse
+    PROCEDURE CODE            id-Kill
+    CRITICALITY                reject
+}
+
+downlinkUEAssociatedLPPaTransport S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        DownlinkUEAssociatedLPPaTransport
+    PROCEDURE CODE            id-downlinkUEAssociatedLPPaTransport
+    CRITICALITY                ignore
+}
+
+uplinkUEAssociatedLPPaTransport S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        UplinkUEAssociatedLPPaTransport
+    PROCEDURE CODE            id-uplinkUEAssociatedLPPaTransport
+    CRITICALITY                ignore
+}
+downlinkNonUEAssociatedLPPaTransport S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        DownlinkNonUEAssociatedLPPaTransport
+    PROCEDURE CODE            id-downlinkNonUEAssociatedLPPaTransport
+    CRITICALITY                ignore
+}
+
+uplinkNonUEAssociatedLPPaTransport S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        UplinkNonUEAssociatedLPPaTransport
+    PROCEDURE CODE            id-uplinkNonUEAssociatedLPPaTransport
+    CRITICALITY                ignore
+}
+
+uERadioCapabilityMatch S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        UERadioCapabilityMatchRequest
+    SUCCESSFUL OUTCOME        UERadioCapabilityMatchResponse
+    PROCEDURE CODE            id-UERadioCapabilityMatch
+    CRITICALITY                reject
+}
+
+e-RABModificationIndication S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        E-RABModificationIndication
+    SUCCESSFUL OUTCOME        E-RABModificationConfirm
+    PROCEDURE CODE            id-E-RABModificationIndication
+    CRITICALITY                reject
+}
+
+uEContextModificationIndication S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        UEContextModificationIndication
+    SUCCESSFUL OUTCOME        UEContextModificationConfirm
+    PROCEDURE CODE            id-UEContextModificationIndication
+    CRITICALITY                reject
+}
+
+rerouteNASRequest S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        RerouteNASRequest
+    PROCEDURE CODE            id-RerouteNASRequest
+    CRITICALITY                reject
+}
+
+pWSFailureIndication S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        PWSFailureIndication
+    PROCEDURE CODE            id-PWSFailureIndication
+    CRITICALITY                ignore
+}
+
+uEContextSuspend S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        UEContextSuspendRequest
+    SUCCESSFUL OUTCOME        UEContextSuspendResponse
+    PROCEDURE CODE            id-UEContextSuspend
+    CRITICALITY                reject
+}
+
+uEContextResume S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        UEContextResumeRequest
+    SUCCESSFUL OUTCOME        UEContextResumeResponse
+    UNSUCCESSFUL OUTCOME     UEContextResumeFailure
+    PROCEDURE CODE            id-UEContextResume
+    CRITICALITY                reject
+}
+
+connectionEstablishmentIndication S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        ConnectionEstablishmentIndication
+    PROCEDURE CODE            id-ConnectionEstablishmentIndication
+    CRITICALITY                reject
+}
+
+nASDeliveryIndication S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        NASDeliveryIndication
+    PROCEDURE CODE            id-NASDeliveryIndication
+    CRITICALITY                ignore
+}
+
+retrieveUEInformation S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        RetrieveUEInformation
+    PROCEDURE CODE            id-RetrieveUEInformation
+    CRITICALITY                reject
+}
+
+uEInformationTransfer S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        UEInformationTransfer
+    PROCEDURE CODE            id-UEInformationTransfer
+    CRITICALITY                reject
+}
+
+eNBCPRelocationIndication S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        ENBCPRelocationIndication
+    PROCEDURE CODE            id-eNBCPRelocationIndication
+    CRITICALITY                reject
+}
+
+mMECPRelocationIndication S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        MMECPRelocationIndication
+    PROCEDURE CODE            id-MMECPRelocationIndication
+    CRITICALITY                reject
+}
+
+secondaryRATDataUsageReport S1AP-ELEMENTARY-PROCEDURE ::= {
+    INITIATING MESSAGE        SecondaryRATDataUsageReport
+    PROCEDURE CODE            id-SecondaryRATDataUsageReport
+    CRITICALITY            ignore
+}
+
+
+END
diff --git a/src/s1ap/asn1c/asnGenFiles/asn1tostruct.py b/src/s1ap/asn1c/asnGenFiles/asn1tostruct.py
new file mode 100644
index 0000000..adf5455
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/asn1tostruct.py
@@ -0,0 +1,810 @@
+#
+# Copyright (c) 2015, EURECOM (www.eurecom.fr)
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright notice, this
+#    list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright notice,
+#    this list of conditions and the following disclaimer in the documentation
+#    and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# The views and conclusions contained in the software and documentation are those
+# of the authors and should not be interpreted as representing official policies,
+# either expressed or implied, of the FreeBSD Project.
+
+import re, os, sys, string
+import datetime
+import getopt
+import getpass
+
+version = "1.0.2"
+
+lines = ""
+iesDefs = {}
+ieofielist = {}
+outdir = './'
+
+filenames = []
+verbosity = 0
+prefix = ""
+
+FAIL = '\033[91m'
+WARN = '\033[93m'
+ENDC = '\033[0m'
+
+fileprefix = ""
+fileprefix_first_upper = ""
+
+def printFail(string):
+    sys.stderr.write(FAIL + string + ENDC + "\n")
+
+def printWarning(string):
+    print WARN + string + ENDC
+
+def printDebug(string):
+    if verbosity > 0:
+        print string
+
+def outputHeaderToFile(f, filename):
+    now = datetime.datetime.now()
+    f.write("""/*
+ * Copyright (c) 2015, EURECOM (www.eurecom.fr)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ *    list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions and the following disclaimer in the documentation
+ *    and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those
+ * of the authors and should not be interpreted as representing official policies,
+ * either expressed or implied, of the FreeBSD Project.
+ */
+
+""")
+    f.write("/*******************************************************************************\n")
+    f.write(" * This file had been created by asn1tostruct.py script v%s\n" % (version))
+    f.write(" * Please do not modify this file but regenerate it via script.\n")
+    f.write(" * Created on: %s by %s\n * from %s\n" % (str(now), getpass.getuser(), filenames))
+    f.write(" ******************************************************************************/\n")
+
+def lowerFirstCamelWord(word):
+    """ puts the first word in a CamelCase Word in lowercase.
+
+    I.e. CustomerID becomes customerID, XMLInfoTest becomes xmlInfoTest
+    """
+    newstr = ''
+    swapped = word.swapcase()
+    idx = 0
+
+    # if it's all-caps, return an all-lowered version
+    lowered = word.lower()
+
+    if swapped == lowered:
+        return lowered
+
+    for c in swapped:
+        if c in string.lowercase:
+            newstr += c
+            idx    += 1
+        else:
+            break
+    if idx < 2:
+        newstr += word[idx:]
+    else:
+        newstr = newstr[:-1]+ word[idx-1:]
+
+    return newstr
+
+def usage():
+    print "Python parser for asn1 v%s" % (version)
+    print "Usage: python asn1tostruct.py [options]"
+    print "Available options:"
+    print "-d        Enable script debug"
+    print "-f [file] Input file to parse"
+    print "-o [dir]  Output files to given directory"
+    print "-h        Print this help and return"
+
+try:
+    opts, args = getopt.getopt(sys.argv[1:], "df:ho:", ["debug", "file", "help", "outdir"])
+except getopt.GetoptError as err:
+    # print help information and exit:
+    usage()
+    sys.exit(2)
+
+for o, a in opts:
+    if o in ("-f", "--file"):
+        filenames.append(a)
+    if o in ("-d", "--debug"):
+        verbosity = 1
+    if o in ("-o", "--outdir"):
+        outdir = a
+        if outdir.rfind('/') != len(outdir):
+            outdir += '/'
+    if o in ("-h", "--help"):
+        usage()
+        sys.exit(2)
+
+for filename in filenames:
+    file = open(filename, 'r')
+    for line in file:
+        # Removing any comment
+        if line.find('--') >= 0:
+            line = line[:line.find('--')]
+        # Removing any carriage return
+        lines += re.sub('\r', '', line)
+
+    for m in re.findall(r'([a-zA-Z0-9-]+)\s*::=\s+SEQUENCE\s+\(\s*SIZE\s*\(\s*\d+\s*\.\.\s*[0-9a-zA-Z-]+\s*\)\s*\)\s*OF\s+[a-zA-Z-]+\s*\{\s*\{\s*([0-9a-zA-Z-]+)\s*\}\s*\}', lines, re.MULTILINE):
+        ieofielist[m[0]] = m[1]
+    for m in re.findall(r'([a-zA-Z0-9-]+)\s*::=\s+E-RAB-IE-ContainerList\s*\{\s*\{\s*([a-zA-Z0-9-]+)\s*\}\s*\}', lines, re.MULTILINE):
+        ieofielist[m[0]] = m[1]
+
+    for i in re.findall(r'([a-zA-Z0-9-]+)\s+([A-Z0-9-]+)\s*::=\s*\{\s+([\,\|\{\}\t\n\.{3}\ \-a-zA-Z0-9]+)\s+}\n', lines, re.MULTILINE):
+        ies = []
+        maxLength = 0
+        # TODO: handle extensions
+        if i[1].find('EXTENSION') >= 0:
+            continue
+        if fileprefix == "":
+            fileprefix = i[1][:i[1].find('-')].lower()
+        for j in re.findall(r'\s*\{\s*([a-zA-Z0-9-\ \t]+)\s*\}\s*[\|,]*', i[2], re.MULTILINE):
+            for k in re.findall(r'ID\s*([a-zA-Z0-9\-]+)\s*CRITICALITY\s*([a-zA-Z0-9\-]+)\s+[A-Z]+\s+([a-zA-Z0-9\-]+)\s*PRESENCE\s*([a-zA-Z0-9\-]+)', j, re.MULTILINE):
+                printDebug("Got new ie for message " + i[0] + ": " + str(k))
+                if len(k[2]) > maxLength:
+                    maxLength = len(k[2])
+                ies.append(k)
+
+        if len(ies) > 0:
+            iesDefs[i[0]] = { "length": maxLength, "ies": ies }
+        else:
+            printWarning("Didn't find any information element for message: " + i[0])
+
+if len(iesDefs) == 0:
+    printFail("No Information Element parsed, exiting")
+    sys.exit(0)
+
+fileprefix_first_upper = fileprefix[0].upper() + fileprefix[1:]
+
+f = open(outdir + fileprefix + '_ies_defs.h', 'w')
+outputHeaderToFile(f, filename)
+f.write("#include \"%s_common.h\"\n\n" % (fileprefix))
+f.write("#ifndef %s_IES_DEFS_H_\n#define %s_IES_DEFS_H_\n\n" % (fileprefix.upper(), fileprefix.upper()))
+f.write("/* Define the version of script used to generate this file */\n")
+f.write("#define %s_SCRIPT_VERSION (%s)\n\n" % (fileprefix.upper(), re.sub('\.', '', version)))
+
+for key in iesDefs:
+
+    if key not in ieofielist.values():
+        continue
+
+    for (i, j) in ieofielist.items():
+        if j == key:
+            break
+
+    f.write("typedef struct %sIEs_s {\n" % (re.sub('-', '_', i)))
+    f.write("    A_SEQUENCE_OF(struct %s_s) %s;\n" % (re.sub('IEs', '', re.sub('-', '_', ieofielist[i])), lowerFirstCamelWord(re.sub('IEs', '', re.sub('-', '_', ieofielist[i])))))
+    f.write("} %sIEs_t;\n\n" % (re.sub('-', '_', i)))
+
+for key in iesDefs:
+    keyupperunderscore = re.sub('-', '_', key.upper())
+    keylowerunderscore = re.sub('-', '_', key.lower())
+    shift = 0
+
+    if len(iesDefs[key]["ies"]) == 0:
+        continue
+
+    # Presence mask
+    for ie in iesDefs[key]["ies"]:
+        ieupperunderscore = re.sub('-', '_', re.sub('id-', '', ie[0])).upper()
+
+        if ie[3] == "optional" or ie[3] == "conditional":
+            f.write("#define {0:<{pad}} {1}\n".format("%s_%s_PRESENT" % (keyupperunderscore, ieupperunderscore), "(1 << %d)" % shift,
+            pad=iesDefs[key]["length"] + len(keyupperunderscore) + 9))
+            shift += 1
+    if (shift > 0):
+        f.write("\n")
+
+    f.write("typedef struct %s_s {\n" % (re.sub('-', '_', key)))
+    if (shift > 0):
+        f.write("    {0:<{pad}} {1};\n".format("uint16_t", "presenceMask", pad=iesDefs[key]["length"] + 2))
+    for ie in iesDefs[key]["ies"]:
+        ieunderscore = re.sub('-', '_', ie[2])
+        iename = re.sub('id-', '', ie[0])
+        ienameunderscore = lowerFirstCamelWord(re.sub('-', '_', iename))
+        if ie[2] in ieofielist:
+            f.write("    %sIEs_t %s;" % (re.sub('-', '_', ie[2]), ienameunderscore))
+        else:
+            f.write("    {0:<{pad}} {1};".format("%s_t" % ieunderscore, ienameunderscore, pad=iesDefs[key]["length"] + 2))
+        if ie[3] == "optional":
+            f.write(" ///< Optional field")
+        elif ie[3] == "conditional":
+            f.write(" ///< Conditional field")
+        f.write("\n")
+
+    f.write("} %s_t;\n\n" % (re.sub('-', '_', key)))
+
+f.write("typedef struct %s_message_s {\n" % (fileprefix))
+f.write("    %s_ProcedureCode_t procedureCode;\n" % (fileprefix_first_upper))
+f.write("    %s_Criticality_t   criticality;\n" % (fileprefix_first_upper))
+f.write("    uint8_t            direction;\n")
+f.write("    union {\n")
+
+messageList = iesDefs.keys()
+messageList.sort()
+for message in messageList:
+    if message in ieofielist.values():
+        continue
+    if len(iesDefs[message]["ies"]) == 0:
+        continue
+    f.write("        %s_t %s;\n" % (re.sub('-', '_', message), lowerFirstCamelWord(re.sub('-', '_', message))))
+f.write("    } msg;\n")
+f.write("} %s_message;\n\n" % (fileprefix))
+
+for key in iesDefs:
+    if key in ieofielist.values():
+        continue
+    structName = re.sub('ies', '', key)
+    asn1cStruct = re.sub('-', '_', re.sub('IEs', '', re.sub('-IEs', '', key)))
+    asn1cStruct = re.sub('Item', 'List', asn1cStruct)
+    keylowerunderscore = re.sub('-', '_', key.lower())
+    firstlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct)))
+    f.write("/** \\brief Decode function for %s ies.\n" % (key))
+    if len(iesDefs[key]["ies"]) != 0:
+        f.write(" * \\param %s Pointer to ASN1 structure in which data will be stored\n" % (lowerFirstCamelWord(re.sub('-', '_', key))))
+    f.write(" *  \\param any_p Pointer to the ANY value to decode.\n")
+    f.write(" **/\n")
+    f.write("int %s_decode_%s(\n" % (fileprefix, keylowerunderscore))
+
+    if len(iesDefs[key]["ies"]) != 0:
+        f.write("    %s_t *%s,\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key))))
+    f.write("    ANY_t *any_p);\n\n")
+
+    if len(iesDefs[key]["ies"]) == 0:
+        continue
+
+    f.write("/** \\brief Encode function for %s ies.\n" % (key))
+    f.write(" *  \\param %s Pointer to the ASN1 structure.\n" % (firstlower))
+    f.write(" *  \\param %s Pointer to the IES structure.\n" % (lowerFirstCamelWord(re.sub('-', '_', key))))
+    f.write(" **/\n")
+    f.write("int %s_encode_%s(\n" % (fileprefix, re.sub('-', '_', structName.lower())))
+    f.write("    %s_t *%s,\n" % (asn1cStruct, firstlower))
+    f.write("    %s_t *%s);\n\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key))))
+
+for key in iesDefs:
+    if key not in ieofielist.values():
+        continue
+    asn1cStruct = re.sub('-', '_', re.sub('IEs', '', key))
+    asn1cStruct = re.sub('Item', 'List', asn1cStruct)
+    firstlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct)))
+    f.write("/** \\brief Encode function for %s ies.\n" % (key))
+    f.write(" *  \\param %s Pointer to the ASN1 structure.\n" % (firstlower))
+    f.write(" *  \\param %s Pointer to the IES structure.\n" % (lowerFirstCamelWord(re.sub('-', '_', key))))
+    f.write(" **/\n")
+    f.write("int %s_encode_%s(\n" % (fileprefix, firstlower.lower()))
+    f.write("    %s_t *%s,\n" % (asn1cStruct, firstlower))
+    f.write("    %sIEs_t *%sIEs);\n\n" % (asn1cStruct, firstlower))
+    f.write("/** \\brief Decode function for %s ies.\n" % (key))
+    f.write(" *  \\param any_p Pointer to the ANY value to decode.\n")
+    f.write(" *  \\param callback Callback function called when any_p is successfully decoded.\n")
+    f.write(" **/\n")
+    f.write("int %s_decode_%s(\n" % (fileprefix, firstlower.lower()))
+    f.write("    %sIEs_t *%sIEs,\n" % (asn1cStruct, firstlower))
+    f.write("    %s_t *%s);\n\n" % (asn1cStruct, lowerFirstCamelWord(asn1cStruct)))
+
+for key in iesDefs:
+    asn1cStruct = re.sub('-', '_', re.sub('IEs', '', key))
+    asn1cStruct = re.sub('Item', 'List', asn1cStruct)
+    firstlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct)))
+
+    if key in ieofielist.values():
+        f.write("/** \\brief Display %s encapsulated IE using XER encoding.\n" % (asn1cStruct))
+        f.write(" *  \\param %s Pointer to the IES structure.\n" % (lowerFirstCamelWord(re.sub('-', '_', key))))
+        f.write(" *  \\param file File descriptor to write output.\n")
+        f.write(" **/\n")
+        f.write("asn_enc_rval_t %s_xer_print_%s(\n" % (fileprefix, re.sub('item', 'list', firstlower.lower())))
+        f.write("    asn_app_consume_bytes_f *cb,\n")
+        f.write("    void *app_key,\n")
+        f.write("    %sIEs_t *%sIEs);\n\n" % (re.sub('item', 'list', asn1cStruct), firstlower))
+    else:
+        f.write("/** \\brief Display %s message using XER encoding.\n" % (asn1cStruct))
+        f.write(" *  \\param message_p Pointer to root message.\n")
+        f.write(" *  \\param file File descriptor to write output.\n")
+        f.write(" **/\n")
+        f.write("asn_enc_rval_t %s_xer_print_%s(\n" % (fileprefix, firstlower.lower()))
+        f.write("    asn_app_consume_bytes_f *cb,\n")
+        f.write("    void *app_key,\n")
+        f.write("    %s_message *message_p);\n\n" % (fileprefix))
+
+f.write("int %s_xer__print2sp(const void *buffer, size_t size, void *app_key);\n\n" % (fileprefix.lower()))
+f.write("int %s_xer__print2fp(const void *buffer, size_t size, void *app_key);\n\n" % (fileprefix.lower()))
+f.write("extern size_t %s_string_total_size;\n\n" % (fileprefix.lower()))
+
+for key in iesDefs:
+    if len(iesDefs[key]["ies"]) == 0:
+        continue
+    keyupperunderscore = re.sub('-', '_', key.upper())
+    keylowerunderscore = re.sub('-', '_', key.lower())
+    structName = re.sub('ies', '', key, flags=re.IGNORECASE)
+    f.write("int free_%s(\n" % (re.sub('-', '_', structName.lower())))
+    f.write("    %s_t *%s);\n\n" % (prefix + re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key))))
+f.write("#endif /* %s_IES_DEFS_H_ */\n\n" % (fileprefix.upper()))
+
+#Generate Decode functions
+f = open(outdir + fileprefix + '_decoder.c', 'w')
+outputHeaderToFile(f, filename)
+f.write("#include \"%s_common.h\"\n#include \"%s_ies_defs.h\"\n#include \"log.h\"\n\n" % (fileprefix, fileprefix))
+for key in iesDefs:
+    if key in ieofielist.values():
+        continue
+    structName = re.sub('ies', '', key)
+    asn1cStruct = re.sub('-', '_', re.sub('IEs', '', key))
+    if asn1cStruct.rfind('_') == len(asn1cStruct) - 1:
+        asn1cStruct = asn1cStruct[:-1]
+    asn1cStruct = re.sub('Item', 'List', asn1cStruct)
+    ielistname = re.sub('UE', 'ue', asn1cStruct)
+    ielistnamefirstlower = ielistname[:1].lower() + ielistname[1:]
+    asn1cStructfirstlower = asn1cStruct[:1].lower() + asn1cStruct[1:]
+    keyName = re.sub('-', '_', key)
+    keyupperunderscore = keyName.upper()
+    firstlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct)))
+
+    iesaccess = ""
+    if key not in ieofielist.values():
+        iesaccess = "%s_ies." % (firstlower)
+
+    f.write("int %s_decode_%s(\n" % (fileprefix, re.sub('-', '_', structName.lower())))
+    if len(iesDefs[key]["ies"]) != 0:
+        f.write("    %s_t *%s,\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key))))
+    f.write("    ANY_t *any_p) {\n\n")
+
+    f.write("    %s_t  %s;\n    %s_t *%s_p = &%s;\n" % (asn1cStruct, asn1cStructfirstlower, asn1cStruct, asn1cStructfirstlower, asn1cStructfirstlower))
+    f.write("    int i, decoded = 0;\n")
+    if len(iesDefs[key]["ies"]) != 0:
+        f.write("    int tempDecoded = 0;\n")
+
+    f.write("    assert(any_p != NULL);\n")
+    if len(iesDefs[key]["ies"]) != 0:
+        f.write("    assert(%s != NULL);\n\n" % (lowerFirstCamelWord(re.sub('-', '_', key))))
+        f.write("    memset(%s, 0, sizeof(%s_t));\n" % (lowerFirstCamelWord(re.sub('-', '_', key)), prefix + re.sub('-', '_', key)))
+
+    f.write("   OAILOG_DEBUG (LOG_%s, \"Decoding message %s (%%s:%%d)\\n\", __FILE__, __LINE__);\n\n" % (fileprefix.upper(), re.sub('-', '_', keyName)))
+    f.write("    ANY_to_type_aper(any_p, &asn_DEF_%s, (void**)&%s_p);\n\n" % (asn1cStruct, asn1cStructfirstlower))
+    f.write("    for (i = 0; i < %s_p->%slist.count; i++) {\n" % (asn1cStructfirstlower, iesaccess))
+    f.write("        %s_IE_t *ie_p;\n" % (fileprefix[0].upper() + fileprefix[1:]))
+    f.write("        ie_p = %s_p->%slist.array[i];\n" % (asn1cStructfirstlower, iesaccess))
+    f.write("        switch(ie_p->id) {\n")
+    for ie in iesDefs[key]["ies"]:
+        iename = re.sub('id-', '', ie[0])
+        ienameunderscore = lowerFirstCamelWord(re.sub('-', '_', iename))
+        ienameunderscorefirstlower = lowerFirstCamelWord(ienameunderscore)
+        ietypesubst = re.sub('-', '', ie[2])
+        ietypeunderscore = re.sub('-', '_', ie[2])
+        ieupperunderscore = re.sub('-', '_', re.sub('id-', '', ie[0])).upper()
+
+        if ie[3] == "optional":
+            f.write("            /* Optional field */\n")
+        elif ie[3] == "conditional":
+            f.write("            /* Conditional field */\n")
+        f.write("            case %s_ProtocolIE_ID_%s:\n" % (fileprefix_first_upper, re.sub('-', '_', ie[0])))
+        f.write("            {\n")
+        f.write("                %s_t *%s_p = NULL;\n" % (ietypeunderscore, lowerFirstCamelWord(ietypesubst)))
+        if ie[3] != "mandatory":
+            f.write("                %s->presenceMask |= %s_%s_PRESENT;\n" % (lowerFirstCamelWord(re.sub('-', '_', key)), keyupperunderscore, ieupperunderscore))
+        f.write("                tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_%s, (void**)&%s_p);\n" % (ietypeunderscore, lowerFirstCamelWord(ietypesubst)))
+        f.write("                if (tempDecoded < 0 || %s_p == NULL) {\n" % (lowerFirstCamelWord(ietypesubst)))
+        f.write("                   OAILOG_ERROR (LOG_%s, \"Decoding of IE %s failed\\n\");\n" % (fileprefix.upper(), ienameunderscore))
+        f.write("                    if (%s_p)\n" % (lowerFirstCamelWord(ietypesubst)))
+        f.write("                        ASN_STRUCT_FREE(asn_DEF_%s, %s_p);\n" % (ietypeunderscore, lowerFirstCamelWord(ietypesubst)))
+        f.write("                    return -1;\n")
+        f.write("                }\n")
+        f.write("                decoded += tempDecoded;\n")
+        f.write("                if (asn1_xer_print)\n")
+        f.write("                    xer_fprint(stdout, &asn_DEF_%s, %s_p);\n" % (ietypeunderscore, lowerFirstCamelWord(ietypesubst)))
+        if ie[2] in ieofielist.keys():
+            f.write("                if (%s_decode_%s(&%s->%s, %s_p) < 0) {\n" % (fileprefix, ietypeunderscore.lower(), lowerFirstCamelWord(re.sub('-', '_', key)), ienameunderscore, lowerFirstCamelWord(ietypesubst)))
+            f.write("                   OAILOG_ERROR (LOG_%s, \"Decoding of encapsulated IE %s failed (1) \\n\");\n" % (fileprefix.upper(), lowerFirstCamelWord(ietypesubst)))
+#            f.write("                    ASN_STRUCT_FREE(asn_DEF_%s, %s_p);\n" % (ietypeunderscore, lowerFirstCamelWord(ietypesubst)))
+            f.write("                }\n")
+            f.write("                ASN_STRUCT_FREE(asn_DEF_%s, %s_p);\n" % (ietypeunderscore, lowerFirstCamelWord(ietypesubst)))
+        else:
+            f.write("                memcpy(&%s->%s, %s_p, sizeof(%s_t));\n" % (lowerFirstCamelWord(re.sub('-', '_', key)), ienameunderscore, lowerFirstCamelWord(ietypesubst), ietypeunderscore))
+            f.write("                FREEMEM(%s_p);\n" % (lowerFirstCamelWord(ietypesubst)))
+            f.write("                %s_p = NULL;\n" % (lowerFirstCamelWord(ietypesubst)))
+        f.write("            } break;\n")
+    f.write("            default:\n")
+    f.write("               OAILOG_ERROR (LOG_%s, \"Unknown protocol IE id (%%d) for message %s\\n\", (int)ie_p->id);\n" % (fileprefix.upper(), re.sub('-', '_', structName.lower())))
+    f.write("                return -1;\n")
+    f.write("        }\n")
+    f.write("    }\n")
+    f.write("    ASN_STRUCT_FREE(asn_DEF_%s, %s_p);\n" % (asn1cStruct, asn1cStructfirstlower))
+    f.write("    return decoded;\n")
+    f.write("}\n\n")
+
+
+# Generate free functions for encapsulated IEs
+for key in iesDefs:
+    if key not in ieofielist.values():
+        continue
+    if len(iesDefs[key]["ies"]) == 0:
+        continue
+    # TODO: Check if the encapsulated IE also contains further encap.
+    ie = iesDefs[key]["ies"][0]
+    ietypeunderscore = prefix + re.sub('-', '_', ie[2])
+    keyname = re.sub('IEs', '', re.sub('Item', 'List', key))
+    iesStructName = lowerFirstCamelWord(re.sub('Item', 'List', re.sub('-', '_', key)))
+    f.write("int free_%s(\n" % (re.sub('-', '_', keyname).lower()))
+    f.write("    %sIEs_t *%s) {\n\n" % (re.sub('-', '_', keyname), iesStructName))
+    f.write("    assert(%s != NULL);\n\n" % (iesStructName))
+    f.write("    for (int i = 0; i < %s->%s.count; i++) {\n" %
+            (iesStructName, re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key)))))
+    f.write("        ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_%s, %s->%s.array[i]);\n" %
+            (ietypeunderscore, iesStructName, re.sub('IEs', '',lowerFirstCamelWord(re.sub('-', '_', key)))))
+    f.write("    	  FREEMEM(%s->%s.array[i]);\n" %
+            (iesStructName, re.sub('IEs', '',lowerFirstCamelWord(re.sub('-', '_', key)))))
+    f.write("    }\n")
+    f.write("    /* Remove the array containing the elements. */\n")
+    f.write("    FREEMEM(%s->%s.array);\n" %
+            (iesStructName, re.sub('IEs', '',lowerFirstCamelWord(re.sub('-', '_', key)))))
+    f.write("    return 0;\n")
+    f.write("}\n\n")
+
+
+
+for key in iesDefs:
+    if len(iesDefs[key]["ies"]) == 0:
+        continue
+    keyupperunderscore = re.sub('-', '_', key.upper())
+    keylowerunderscore = re.sub('-', '_', key.lower())
+    structName = re.sub('ies', '', key, flags=re.IGNORECASE)
+
+
+    f.write("int free_%s(\n" % (re.sub('-', '_', structName.lower())))
+    f.write("    %s_t *%s) {\n\n" % (prefix + re.sub('-', '_', key),
+                                     lowerFirstCamelWord(re.sub('-', '_', key))))
+
+    for ie in iesDefs[key]["ies"]:
+        ietypeunderscore = prefix + re.sub('-', '_', ie[2])
+        ieupperunderscore = re.sub('-', '_', re.sub('id-', '', ie[0])).upper()
+        if ie[3] != "mandatory":
+            if ie[3] == "optional":
+                f.write("    /* Optional field */\n")
+            elif ie[3] == "conditional":
+                f.write("    /* Conditional field */\n")
+            f.write("    if ((%s->presenceMask & %s_%s_PRESENT)\n" % (lowerFirstCamelWord(re.sub('-', '_', key)), keyupperunderscore, ieupperunderscore))
+            f.write("        == %s_%s_PRESENT) \n    " % (keyupperunderscore, ieupperunderscore))
+
+        iename = re.sub('id-', '', ie[0])
+        ienameunderscore = lowerFirstCamelWord(re.sub('-', '_', iename))
+        # Check if this is an encapsulated IE, if so call the free function.
+        if ie[2] in ieofielist.keys():
+            keyname = re.sub('IEs', '', re.sub('Item', 'List', ie[2]))
+            f.write("    free_%s(&%s->%s);\n" % (re.sub('-', '_', keyname).lower(),
+                                                 lowerFirstCamelWord(re.sub('-', '_', key)), ienameunderscore))
+        else:
+            f.write("    ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_%s, &%s->%s);\n" % (ietypeunderscore, lowerFirstCamelWord(re.sub('-', '_', key)), ienameunderscore))
+    f.write("    return 0;\n")
+    f.write("}\n\n")
+
+for key in iesDefs:
+    if key not in ieofielist.values():
+        continue
+
+    keyname = re.sub('IEs', '', re.sub('Item', 'List', key))
+
+    f.write("int %s_decode_%s(\n" % (fileprefix, re.sub('-', '_', keyname).lower()))
+    f.write("    %sIEs_t *%sIEs,\n" % (re.sub('-', '_', keyname), lowerFirstCamelWord(re.sub('-', '_', keyname))))
+    f.write("    %s_t *%s) {\n\n" % (re.sub('-', '_', keyname), lowerFirstCamelWord(re.sub('-', '_', keyname))))
+    f.write("    int i, decoded = 0;\n")
+    f.write("    int tempDecoded = 0;\n\n")
+
+    f.write("    assert(%s != NULL);\n" % (lowerFirstCamelWord(re.sub('-', '_', keyname))))
+    f.write("    assert(%sIEs != NULL);\n\n" % (lowerFirstCamelWord(re.sub('-', '_', keyname))))
+
+    f.write("    for (i = 0; i < %s->list.count; i++) {\n" % (lowerFirstCamelWord(re.sub('-', '_', keyname))))
+    f.write("        %s_IE_t *ie_p = %s->list.array[i];\n" % (fileprefix[0].upper() + fileprefix[1:], lowerFirstCamelWord(re.sub('-', '_', keyname))))
+    f.write("        switch (ie_p->id) {\n")
+    for ie in iesDefs[key]["ies"]:
+        iename = re.sub('id-', '', ie[0])
+        ienameunderscore = lowerFirstCamelWord(re.sub('-', '_', iename))
+        f.write("            case %s_ProtocolIE_ID_%s:\n" % (fileprefix_first_upper, re.sub('-', '_', ie[0])))
+        f.write("            {\n")
+        f.write("                %s_t *%s_p = NULL;\n" % (re.sub('-', '_', ie[2]), lowerFirstCamelWord(re.sub('-', '', ie[2]))))
+        f.write("                tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_%s, (void**)&%s_p);\n" % (re.sub('-', '_', ie[2]), lowerFirstCamelWord(re.sub('-', '', ie[2]))))
+        f.write("                if (tempDecoded < 0 || %s_p == NULL) {\n" % (lowerFirstCamelWord(re.sub('-', '', ie[2]))))
+        f.write("                   OAILOG_ERROR (LOG_%s, \"Decoding of IE %s for message %s failed (2) \\n\");\n" % (fileprefix.upper(), ienameunderscore, re.sub('-', '_', keyname)))
+        f.write("                    if (%s_p)\n" % (lowerFirstCamelWord(re.sub('-', '', ie[2]))))
+        f.write("                        ASN_STRUCT_FREE(asn_DEF_%s, %s_p);\n" % (re.sub('-', '_', ie[2]), lowerFirstCamelWord(re.sub('-', '', ie[2]))))
+        f.write("                    return -1;\n")
+        f.write("                }\n")
+        f.write("                decoded += tempDecoded;\n")
+        f.write("                if (asn1_xer_print)\n")
+        f.write("                    xer_fprint(stdout, &asn_DEF_%s, %s_p);\n" % (re.sub('-', '_', ie[2]), lowerFirstCamelWord(re.sub('-', '', ie[2]))))
+        f.write("                ASN_SEQUENCE_ADD(&%sIEs->%s, %s_p);\n" % (lowerFirstCamelWord(re.sub('-', '_', keyname)),
+        re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key))), lowerFirstCamelWord(re.sub('-', '', ie[2]))))
+        f.write("            } break;\n")
+    f.write("            default:\n")
+    f.write("               OAILOG_ERROR (LOG_%s, \"Unknown protocol IE id (%%d) for message %s\\n\", (int)ie_p->id);\n" % (fileprefix.upper(), re.sub('-', '_', structName.lower())))
+    f.write("                return -1;\n")
+    f.write("        }\n")
+    f.write("    }\n")
+    f.write("    return decoded;\n")
+    f.write("}\n\n")
+
+
+#Generate IES Encode functions
+f = open(outdir + fileprefix + '_encoder.c', 'w')
+outputHeaderToFile(f,filename)
+f.write("#include \"%s_common.h\"\n" % (fileprefix))
+f.write("#include \"%s_ies_defs.h\"\n\n" % (fileprefix))
+for key in iesDefs:
+    if key in ieofielist.values():
+        continue
+
+    structName = re.sub('ies', '', key)
+    asn1cStruct = re.sub('-', '_', re.sub('IEs', '', key))
+    asn1cStruct = re.sub('Item', 'List', asn1cStruct)
+    if asn1cStruct.rfind('_') == len(asn1cStruct) - 1:
+        asn1cStruct = asn1cStruct[:-1]
+    asn1cStructfirstlower = asn1cStruct[:1].lower() + asn1cStruct[1:]
+    firstwordlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct)))
+
+    iesaccess = ""
+    if key not in ieofielist.values():
+        iesaccess = "%s_ies." % (firstwordlower)
+
+    keyName = re.sub('-', '_', key)
+    keyupperunderscore = keyName.upper()
+    # No IE to encode...
+    if len(iesDefs[key]["ies"]) == 0:
+        continue
+
+    f.write("int %s_encode_%s(\n" % (fileprefix, re.sub('-', '_', structName.lower())))
+    f.write("    %s_t *%s,\n" % (asn1cStruct, firstwordlower))
+    f.write("    %s_t *%s) {\n\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key))))
+
+    f.write("    %s_IE_t *ie;\n\n" % (fileprefix_first_upper))
+
+    f.write("    assert(%s != NULL);\n" % (firstwordlower));
+    f.write("    assert(%s != NULL);\n\n" % (lowerFirstCamelWord(re.sub('-', '_', key))));
+
+    for ie in iesDefs[key]["ies"]:
+        iename = re.sub('-', '_', re.sub('id-', '', ie[0]))
+        ienameunderscore = re.sub('-', '_', iename)
+        ienamefirstwordlower = lowerFirstCamelWord(iename)
+        ieupperunderscore = re.sub('-', '_', re.sub('id-', '', ie[0])).upper()
+        ietypeunderscore = re.sub('-', '_', ie[2])
+
+        if ie[3] != "mandatory":
+            if ie[3] == "optional":
+                f.write("    /* Optional field */\n")
+            elif ie[3] == "conditional":
+                f.write("    /* Conditional field */\n")
+            f.write("    if (%s->presenceMask & %s_%s_PRESENT) {\n" % (lowerFirstCamelWord(re.sub('-', '_', key)), keyupperunderscore, ieupperunderscore))
+            #f.write("        == %s_%s_PRESENT) {\n" % (keyupperunderscore, ieupperunderscore))
+            f.write("        if ((ie = %s_new_ie(%s_ProtocolIE_ID_%s,\n" % (fileprefix, fileprefix_first_upper, re.sub('-', '_', ie[0])))
+            f.write("                            %s_Criticality_%s,\n" % (fileprefix_first_upper, ie[1]))
+            f.write("                            &asn_DEF_%s,\n" % (ietypeunderscore))
+            f.write("                            &%s->%s)) == NULL) {\n" % (lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower))
+            f.write("            return -1;\n")
+            f.write("        }\n")
+            f.write("        ASN_SEQUENCE_ADD(&%s->%slist, ie);\n" % (firstwordlower, iesaccess))
+            f.write("    }\n\n")
+        else:
+            if ie[2] in ieofielist.keys():
+                f.write("    %s_t %s;\n\n" % (ietypeunderscore, ienamefirstwordlower))
+                f.write("    memset(&%s, 0, sizeof(%s_t));\n" % (ienamefirstwordlower, ietypeunderscore))
+                f.write("\n")
+                f.write("    if (%s_encode_%s(&%s, &%s->%s) < 0) return -1;\n" % (fileprefix, ietypeunderscore.lower(), ienamefirstwordlower, lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower))
+            f.write("    if ((ie = %s_new_ie(%s_ProtocolIE_ID_%s,\n" % (fileprefix, fileprefix_first_upper, re.sub('-', '_', ie[0])))
+            f.write("                        %s_Criticality_%s,\n" % (fileprefix_first_upper, ie[1]))
+            f.write("                        &asn_DEF_%s,\n" % (ietypeunderscore))
+            if ie[2] in ieofielist.keys():
+                f.write("                          &%s)) == NULL) {\n" % (ienamefirstwordlower))
+            else:
+                f.write("                          &%s->%s)) == NULL) {\n" % (lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower))
+            f.write("        return -1;\n")
+            f.write("    }\n")
+            f.write("    ASN_SEQUENCE_ADD(&%s->%slist, ie);\n\n" % (firstwordlower, iesaccess))
+            if ie[2] in ieofielist.keys():
+                f.write("    /* Free any dynamic allocation that is no more used */\n")
+                f.write("    ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_%s, &%s);\n\n" % (ietypeunderscore, ienamefirstwordlower))
+
+    f.write("    return 0;\n")
+    f.write("}\n\n")
+
+for (key, value) in iesDefs.items():
+    if key not in ieofielist.values():
+        continue
+
+    ie = value["ies"][0]
+    ietypeunderscore = re.sub('-', '_', ie[2])
+    asn1cStruct = re.sub('-', '_', re.sub('IEs', '', re.sub('-IEs', '', key)))
+    asn1cStruct = re.sub('Item', 'List', asn1cStruct)
+    firstwordlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct)))
+
+    for (i, j) in ieofielist.items():
+        if j == key:
+            break
+    f.write("int %s_encode_%s(\n" % (fileprefix, re.sub('-', '_', i).lower()))
+    f.write("    %s_t *%s,\n" % (asn1cStruct, firstwordlower))
+    f.write("    %sIEs_t *%sIEs) {\n\n" % (re.sub('-', '_', i), lowerFirstCamelWord(re.sub('-', '_', i))))
+    f.write("    int i;\n")
+
+    f.write("    %s_IE_t *ie;\n\n" % (fileprefix_first_upper))
+
+    f.write("    assert(%s != NULL);\n" % (firstwordlower));
+    f.write("    assert(%sIEs != NULL);\n\n" % (lowerFirstCamelWord(re.sub('-', '_', i))));
+
+    f.write("    for (i = 0; i < %sIEs->%s.count; i++) {\n" % (firstwordlower, re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key)))))
+    f.write("        if ((ie = %s_new_ie(%s_ProtocolIE_ID_%s,\n" % (fileprefix, fileprefix_first_upper, re.sub('-', '_', ie[0])))
+    f.write("                            %s_Criticality_%s,\n" % (fileprefix_first_upper, ie[1]))
+    f.write("                            &asn_DEF_%s,\n" % (ietypeunderscore))
+    f.write("                            %sIEs->%s.array[i])) == NULL) {\n" % (firstwordlower, re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key)))))
+    f.write("            return -1;\n")
+    f.write("        }\n")
+    f.write("        ASN_SEQUENCE_ADD(&%s->list, ie);\n" % (firstwordlower))
+    f.write("    }\n")
+    f.write("    return 0;\n")
+    f.write("}\n\n")
+
+#Generate xer print functions
+f = open(outdir + fileprefix + '_xer_print.c', 'w')
+outputHeaderToFile(f, filename)
+f.write("#include <stdlib.h>\n")
+f.write("#include <stdio.h>\n\n")
+f.write("#include <asn_application.h>\n#include <asn_internal.h>\n\n")
+f.write("#include \"%s_common.h\"\n#include \"%s_ies_defs.h\"\n\n" % (fileprefix, fileprefix))
+
+f.write("size_t %s_string_total_size = 0;\n\n" % (fileprefix.lower()))
+f.write("""int
+%s_xer__print2fp(const void *buffer, size_t size, void *app_key) {
+    FILE *stream = (FILE *)app_key;
+
+    if(fwrite(buffer, 1, size, stream) != size)
+        return -1;
+
+    return 0;
+}
+
+""" % (fileprefix.lower()))
+
+f.write("""int %s_xer__print2sp(const void *buffer, size_t size, void *app_key) {
+    char *string = (char *)app_key;
+
+    /* Copy buffer to the formatted string */
+    memcpy(&string[%s_string_total_size], buffer, size);
+
+    %s_string_total_size += size;
+
+    return 0;
+}
+
+""" % (fileprefix.lower(), fileprefix.lower(), fileprefix.lower()))
+
+f.write("""static asn_enc_rval_t
+xer_encode_local(asn_TYPE_descriptor_t *td, void *sptr,
+        asn_app_consume_bytes_f *cb, void *app_key, int indent) {
+    asn_enc_rval_t er, tmper;
+    const char *mname;
+    size_t mlen;
+    int xcan = 2;
+
+    if(!td || !sptr) goto cb_failed;
+
+    mname = td->xml_tag;
+    mlen = strlen(mname);
+
+    _i_ASN_TEXT_INDENT(0, indent);
+    _ASN_CALLBACK3("<", 1, mname, mlen, ">", 1);
+
+    tmper = td->xer_encoder(td, sptr, indent + 1, XER_F_BASIC, cb, app_key);
+    if(tmper.encoded == -1) return tmper;
+
+    _ASN_CALLBACK3("</", 2, mname, mlen, ">\\n", xcan);
+
+    er.encoded = 4 + xcan + (2 * mlen) + tmper.encoded;
+
+    _ASN_ENCODED_OK(er);
+cb_failed:
+    _ASN_ENCODE_FAILED;
+}
+""")
+
+for (key, value) in iesDefs.items():
+    keyName = re.sub('-', '_', key)
+    keyupperunderscore = keyName.upper()
+    iesStructName = lowerFirstCamelWord(re.sub('-', '_', key))
+
+    ie = value["ies"][0]
+    ietypeunderscore = re.sub('-', '_', ie[2])
+
+    if key in ieofielist.values():
+        f.write("asn_enc_rval_t %s_xer_print_%s(\n" % (fileprefix, re.sub('ies', '', re.sub('item', 'list', re.sub('-', '_', key).lower()))))
+    else:
+        f.write("asn_enc_rval_t %s_xer_print_%s(\n" % (fileprefix, re.sub('ies', '', re.sub('-', '_', key).lower())))
+    #f.write("    FILE *file,\n")
+    f.write("    asn_app_consume_bytes_f *cb,\n")
+    f.write("    void *app_key,\n")
+    if key in ieofielist.values():
+        iesStructName = lowerFirstCamelWord(re.sub('Item', 'List', re.sub('-', '_', key)))
+        f.write("    %sIEs_t *%s) {\n\n" % (re.sub('IEs', '', re.sub('Item', 'List', re.sub('-', '_', key))), iesStructName))
+        f.write("    int i;\n")
+        f.write("    asn_enc_rval_t er;\n")
+    else:
+        f.write("    %s_message *message_p)\n{\n" % (fileprefix))
+        f.write("    %s_t *%s;\n" % (re.sub('-', '_', key), iesStructName))
+        f.write("    asn_enc_rval_t er;\n")
+        #f.write("    void *app_key = (void *)file;\n")
+        #f.write("    asn_app_consume_bytes_f *cb = %s_xer__print2fp;\n\n" % (fileprefix.lower()))
+
+        f.write("    %s = &message_p->msg.%s;\n\n" % (iesStructName, iesStructName))
+
+    if key in ieofielist.values():
+        # Increase indentation level
+        f.write("    for (i = 0; i < %s->%s.count; i++) {\n" % (iesStructName, re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key)))))
+        #f.write("        xer_fprint(file, &asn_DEF_%s, %s->%s.array[i]);\n" % (ietypeunderscore, iesStructName, re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key)))))
+        f.write("        er = xer_encode(&asn_DEF_%s, %s->%s.array[i], XER_F_BASIC, cb, app_key);\n" % (ietypeunderscore, iesStructName, re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key)))))
+        f.write("    }\n")
+    else:
+        f.write("    cb(\"<%s-PDU>\\n\", %d, app_key);\n" % (key, len("<%s-PDU>\n" % (key))))
+        f.write("    xer_encode_local(&asn_DEF_%s_Criticality, &message_p->criticality, cb, app_key, 1);\n" % fileprefix_first_upper)
+        f.write("    xer_encode_local(&asn_DEF_%s_ProcedureCode, &message_p->procedureCode, cb, app_key, 1);\n" % fileprefix_first_upper)
+
+        f.write("    cb(\"    <%s>\\n\", %d, app_key);\n" % (key, len("    <%s>\n" % (key))))
+
+        for ie in iesDefs[key]["ies"]:
+            iename = re.sub('-', '_', re.sub('id-', '', ie[0]))
+            ienameunderscore = re.sub('-', '_', iename)
+            ienamefirstwordlower = lowerFirstCamelWord(iename)
+            ietypeunderscore = re.sub('-', '_', ie[2])
+            ieupperunderscore = re.sub('-', '_', re.sub('id-', '', ie[0])).upper()
+
+            if ie[3] != "mandatory":
+                if ie[3] == "optional":
+                    f.write("    /* Optional field */\n")
+                elif ie[3] == "conditional":
+                    f.write("    /* Conditional field */\n")
+                f.write("    if (%s->presenceMask & %s_%s_PRESENT)\n    " % (iesStructName, keyupperunderscore, ieupperunderscore))
+
+            # Is it an encapsulated IE ?
+            if ie[2] in ieofielist.keys():
+                f.write("    %s_xer_print_%s(cb, app_key, &%s->%s);\n" % (fileprefix, re.sub('ies', '', re.sub('-', '_', ie[2]).lower()), iesStructName, ienamefirstwordlower))
+            else:
+                f.write("    xer_encode_local(&asn_DEF_%s, &%s->%s, cb, app_key, 2);\n" % (ietypeunderscore, iesStructName, ienamefirstwordlower))
+        f.write("    cb(\"    </%s>\\n\", %d, app_key);\n" % (key, len("    </%s>\n" % (key))))
+        f.write("    cb(\"</%s-PDU>\\n\", %d, app_key);\n" % (key, len("</%s-PDU>\n" % (key))))
+
+    f.write("    _ASN_ENCODED_OK(er);\n")
+    #if key not in ieofielist.values():
+        #f.write("cb_failed:\n")
+        #f.write("    return er;\n")
+    f.write("}\n\n")
diff --git a/src/s1ap/asn1c/asnGenFiles/asn_SEQUENCE_OF.h b/src/s1ap/asn1c/asnGenFiles/asn_SEQUENCE_OF.h
new file mode 100644
index 0000000..e35bc44
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/asn_SEQUENCE_OF.h
@@ -0,0 +1,52 @@
+/*-
+ * Copyright (c) 2003-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+#ifndef	ASN_SEQUENCE_OF_H
+#define	ASN_SEQUENCE_OF_H
+
+#include <asn_SET_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * SEQUENCE OF is the same as SET OF with a tiny difference:
+ * the delete operation preserves the initial order of elements
+ * and thus MAY operate in non-constant time.
+ */
+#define	A_SEQUENCE_OF(type)	A_SET_OF(type)
+
+#define	ASN_SEQUENCE_ADD(headptr, ptr)		\
+	asn_sequence_add((headptr), (ptr))
+
+/***********************************************
+ * Implementation of the SEQUENCE OF structure.
+ */
+
+#define	asn_sequence_add	asn_set_add
+#define	asn_sequence_empty	asn_set_empty
+
+/*
+ * Delete the element from the set by its number (base 0).
+ * This is NOT a constant-time operation.
+ * The order of elements is preserved.
+ * If _do_free is given AND the (*free) is initialized, the element
+ * will be freed using the custom (*free) function as well.
+ */
+void asn_sequence_del(void *asn_sequence_of_x, int number, int _do_free);
+
+/*
+ * Cope with different conversions requirements to/from void in C and C++.
+ * This is mostly useful for support library.
+ */
+typedef A_SEQUENCE_OF(void) asn_anonymous_sequence_;
+#define _A_SEQUENCE_FROM_VOID(ptr)	((asn_anonymous_sequence_ *)(ptr))
+#define _A_CSEQUENCE_FROM_VOID(ptr) 	((const asn_anonymous_sequence_ *)(ptr))
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* ASN_SEQUENCE_OF_H */
diff --git a/src/s1ap/asn1c/asnGenFiles/asn_SET_OF.h b/src/s1ap/asn1c/asnGenFiles/asn_SET_OF.h
new file mode 100644
index 0000000..882e1a4
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/asn_SET_OF.h
@@ -0,0 +1,72 @@
+/*-
+ * Copyright (c) 2003-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+#ifndef	ASN_SET_OF_H
+#define	ASN_SET_OF_H
+
+#ifdef __cplusplus
+#define A_SET_OF(type)                   \
+    struct {                             \
+        type **array;                    \
+        int count; /* Meaningful size */ \
+        int size;  /* Allocated size */  \
+        void (*free)(decltype(*array));  \
+    }
+#else   /* C */
+#define A_SET_OF(type)                   \
+    struct {                             \
+        type **array;                    \
+        int count; /* Meaningful size */ \
+        int size;  /* Allocated size */  \
+        void (*free)(type *);    \
+    }
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define	ASN_SET_ADD(headptr, ptr)		\
+	asn_set_add((headptr), (ptr))
+
+/*******************************************
+ * Implementation of the SET OF structure.
+ */
+
+/*
+ * Add another structure into the set by its pointer.
+ * RETURN VALUES:
+ * 0 for success and -1/errno for failure.
+ */
+int  asn_set_add(void *asn_set_of_x, void *ptr);
+
+/*
+ * Delete the element from the set by its number (base 0).
+ * This is a constant-time operation. The order of elements before the
+ * deleted ones is guaranteed, the order of elements after the deleted
+ * one is NOT guaranteed.
+ * If _do_free is given AND the (*free) is initialized, the element
+ * will be freed using the custom (*free) function as well.
+ */
+void asn_set_del(void *asn_set_of_x, int number, int _do_free);
+
+/*
+ * Empty the contents of the set. Will free the elements, if (*free) is given.
+ * Will NOT free the set itself.
+ */
+void asn_set_empty(void *asn_set_of_x);
+
+/*
+ * Cope with different conversions requirements to/from void in C and C++.
+ * This is mostly useful for support library.
+ */
+typedef A_SET_OF(void) asn_anonymous_set_;
+#define _A_SET_FROM_VOID(ptr)		((asn_anonymous_set_ *)(ptr))
+#define _A_CSET_FROM_VOID(ptr)		((const asn_anonymous_set_ *)(ptr))
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* ASN_SET_OF_H */
diff --git a/src/s1ap/asn1c/asnGenFiles/asn_application.h b/src/s1ap/asn1c/asnGenFiles/asn_application.h
new file mode 100644
index 0000000..034f646
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/asn_application.h
@@ -0,0 +1,171 @@
+/*-
+ * Copyright (c) 2004-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+/*
+ * Application-level ASN.1 callbacks.
+ */
+#ifndef	ASN_APPLICATION_H
+#define	ASN_APPLICATION_H
+
+#include "asn_system.h"		/* for platform-dependent types */
+#include "asn_codecs.h"		/* for ASN.1 codecs specifics */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * A selection of ASN.1 Transfer Syntaxes to use with generalized
+ * encoders and decoders declared further in this .h file.
+ */
+enum asn_transfer_syntax {
+    /* Avoid appearance of a default transfer syntax. */
+    ATS_INVALID = 0,
+    /* Plaintext output (not conforming to any standard), for debugging. */
+    ATS_NONSTANDARD_PLAINTEXT,
+    /* Returns a randomly generated structure. */
+    ATS_RANDOM,
+    /*
+     * X.690:
+     * BER: Basic Encoding Rules.
+     * DER: Distinguished Encoding Rules.
+     * CER: Canonical Encoding Rules.
+     * DER and CER are more strict variants of BER.
+     */
+    ATS_BER,
+    ATS_DER,
+    ATS_CER, /* Only decoding is supported */
+    /*
+     * X.696:
+     * OER: Octet Encoding Rules.
+     * CANONICAL-OER is a more strict variant of BASIC-OER.
+     */
+    ATS_BASIC_OER,
+    ATS_CANONICAL_OER,
+    /*
+     * X.691:
+     * PER: Packed Encoding Rules.
+     * CANONICAL-PER is a more strict variant of BASIC-PER.
+     * NOTE: Produces or consumes a complete encoding (X.691 (08/2015) #11.1).
+     */
+    ATS_UNALIGNED_BASIC_PER,
+    ATS_UNALIGNED_CANONICAL_PER,
+    ATS_ALIGNED_BASIC_PER,
+    ATS_ALIGNED_CANONICAL_PER,
+    /*
+     * X.693:
+     * XER: XML Encoding Rules.
+     * CANONICAL-XER is a more strict variant of BASIC-XER.
+     */
+    ATS_BASIC_XER,
+    ATS_CANONICAL_XER
+};
+
+/*
+ * A generic encoder for any supported transfer syntax.
+ * RETURN VALUES:
+ * The (.encoded) field of the return value is REDEFINED to mean the following:
+ * >=0: The computed size of the encoded data. Can exceed the (buffer_size).
+ *  -1: Error encoding the structure. See the error code in (errno):
+ *      EINVAL: Incorrect parameters to the function, such as NULLs.
+ *      ENOENT: Encoding transfer syntax is not defined (for this type).
+ *      EBADF:  The structure has invalid form or content constraint failed.
+ *      The (.failed_type) and (.structure_ptr) MIGHT be set to the appropriate
+ *      values at the place of failure, if at all possible.
+ * WARNING: The (.encoded) field of the return value can exceed the buffer_size.
+ * This is similar to snprintf(3) contract which might return values
+ * greater than the buffer size.
+ */
+asn_enc_rval_t asn_encode_to_buffer(
+    const asn_codec_ctx_t *opt_codec_parameters, /* See asn_codecs.h */
+    enum asn_transfer_syntax,
+    const struct asn_TYPE_descriptor_s *type_to_encode,
+    const void *structure_to_encode, void *buffer, size_t buffer_size);
+
+/*
+ * A variant of asn_encode_to_buffer() with automatically allocated buffer.
+ * RETURN VALUES:
+ * On success, returns a newly allocated (.buffer) containing the whole message.
+ * The message size is returned in (.result.encoded).
+ * On failure:
+ *  (.buffer) is NULL,
+ *  (.result.encoded) as in asn_encode_to_buffer(),
+ *  The errno codes as in asn_encode_to_buffer(), plus the following:
+ *      ENOMEM: Memory allocation failed due to system or internal limits.
+ * The user is responsible for freeing the (.buffer).
+ */
+typedef struct asn_encode_to_new_buffer_result_s {
+    void *buffer;   /* NULL if failed to encode. */
+    asn_enc_rval_t result;
+} asn_encode_to_new_buffer_result_t;
+asn_encode_to_new_buffer_result_t asn_encode_to_new_buffer(
+    const asn_codec_ctx_t *opt_codec_parameters, /* See asn_codecs.h */
+    enum asn_transfer_syntax,
+    const struct asn_TYPE_descriptor_s *type_to_encode,
+    const void *structure_to_encode);
+
+
+/*
+ * Generic type of an application-defined callback to return various
+ * types of data to the application.
+ * EXPECTED RETURN VALUES:
+ *  -1: Failed to consume bytes. Abort the mission.
+ * Non-negative return values indicate success, and ignored.
+ */
+typedef int(asn_app_consume_bytes_f)(const void *buffer, size_t size,
+                                     void *application_specific_key);
+
+
+/*
+ * A generic encoder for any supported transfer syntax.
+ * Returns the comprehensive encoding result descriptor (see asn_codecs.h).
+ * RETURN VALUES:
+ * The negative (.encoded) field of the return values is accompanied with the
+ * following error codes (errno):
+ *      EINVAL: Incorrect parameters to the function, such as NULLs.
+ *      ENOENT: Encoding transfer syntax is not defined (for this type).
+ *      EBADF:  The structure has invalid form or content constraint failed.
+ *      EIO:    The (callback) has returned negative value during encoding.
+ */
+asn_enc_rval_t asn_encode(
+    const asn_codec_ctx_t *opt_codec_parameters, /* See asn_codecs.h */
+    enum asn_transfer_syntax,
+    const struct asn_TYPE_descriptor_s *type_to_encode,
+    const void *structure_to_encode,
+    asn_app_consume_bytes_f *callback, void *callback_key);
+
+
+/*
+ * A generic decoder for any supported transfer syntax.
+ */
+asn_dec_rval_t asn_decode(
+    const asn_codec_ctx_t *opt_codec_parameters, enum asn_transfer_syntax,
+    const struct asn_TYPE_descriptor_s *type_to_decode,
+    void **structure_ptr, /* Pointer to a target structure's pointer */
+    const void *buffer,   /* Data to be decoded */
+    size_t size           /* Size of that buffer */
+);
+
+
+/*
+ * A callback of this type is called whenever constraint validation fails
+ * on some ASN.1 type. See "constraints.h" for more details on constraint
+ * validation.
+ * This callback specifies a descriptor of the ASN.1 type which failed
+ * the constraint check, as well as human readable message on what
+ * particular constraint has failed.
+ */
+typedef void (asn_app_constraint_failed_f)(void *application_specific_key,
+	const struct asn_TYPE_descriptor_s *type_descriptor_which_failed,
+	const void *structure_which_failed_ptr,
+	const char *error_message_format, ...) CC_PRINTFLIKE(4, 5);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#include "constr_TYPE.h"	/* for asn_TYPE_descriptor_t */
+
+#endif	/* ASN_APPLICATION_H */
diff --git a/src/s1ap/asn1c/asnGenFiles/asn_bit_data.h b/src/s1ap/asn1c/asnGenFiles/asn_bit_data.h
new file mode 100644
index 0000000..59de7af
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/asn_bit_data.h
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2005-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+#ifndef	ASN_BIT_DATA
+#define	ASN_BIT_DATA
+
+#include <asn_system.h>		/* Platform-specific types */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This structure describes a position inside an incoming PER bit stream.
+ */
+typedef struct asn_bit_data_s {
+  const uint8_t *buffer;  /* Pointer to the octet stream */
+         size_t  nboff;   /* Bit offset to the meaningful bit */
+         size_t  nbits;   /* Number of bits in the stream */
+         size_t  moved;   /* Number of bits moved through this bit stream */
+  int (*refill)(struct asn_bit_data_s *);
+  void *refill_key;
+} asn_bit_data_t;
+
+/*
+ * Create a contiguous non-refillable bit data structure.
+ * Can be freed by FREEMEM().
+ */
+asn_bit_data_t *asn_bit_data_new_contiguous(const void *data, size_t size_bits);
+
+/*
+ * Extract a small number of bits (<= 31) from the specified PER data pointer.
+ * This function returns -1 if the specified number of bits could not be
+ * extracted due to EOD or other conditions.
+ */
+int32_t asn_get_few_bits(asn_bit_data_t *, int get_nbits);
+
+/* Undo the immediately preceeding "get_few_bits" operation */
+void asn_get_undo(asn_bit_data_t *, int get_nbits);
+
+/*
+ * Extract a large number of bits from the specified PER data pointer.
+ * This function returns -1 if the specified number of bits could not be
+ * extracted due to EOD or other conditions.
+ */
+int asn_get_many_bits(asn_bit_data_t *, uint8_t *dst, int right_align,
+			int get_nbits);
+
+/* Non-thread-safe debugging function, don't use it */
+char *asn_bit_data_string(asn_bit_data_t *);
+
+/*
+ * This structure supports forming bit output.
+ */
+typedef struct asn_bit_outp_s {
+	uint8_t *buffer;	/* Pointer into the (tmpspace) */
+	size_t nboff;		/* Bit offset to the meaningful bit */
+	size_t nbits;		/* Number of bits left in (tmpspace) */
+	uint8_t tmpspace[32];	/* Preliminary storage to hold data */
+	int (*output)(const void *data, size_t size, void *op_key);
+	void *op_key;		/* Key for (output) data callback */
+	size_t flushed_bytes;	/* Bytes already flushed through (output) */
+} asn_bit_outp_t;
+
+/* Output a small number of bits (<= 31) */
+int asn_put_few_bits(asn_bit_outp_t *, uint32_t bits, int obits);
+
+/* Output a large number of bits */
+int asn_put_many_bits(asn_bit_outp_t *, const uint8_t *src, int put_nbits);
+
+/*
+ * Flush whole bytes (0 or more) through (outper) member.
+ * The least significant bits which are not used are guaranteed to be set to 0.
+ * Returns -1 if callback returns -1. Otherwise, 0.
+ */
+int asn_put_aligned_flush(asn_bit_outp_t *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* ASN_BIT_DATA */
diff --git a/src/s1ap/asn1c/asnGenFiles/asn_codecs.h b/src/s1ap/asn1c/asnGenFiles/asn_codecs.h
new file mode 100644
index 0000000..e75c270
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/asn_codecs.h
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2003-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+#ifndef	ASN_CODECS_H
+#define	ASN_CODECS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct asn_TYPE_descriptor_s;	/* Forward declaration */
+
+/*
+ * This structure defines a set of parameters that may be passed
+ * to every ASN.1 encoder or decoder function.
+ * WARNING: if max_stack_size member is set, and you are calling the
+ *   function pointers of the asn_TYPE_descriptor_t directly,
+ *   this structure must be ALLOCATED ON THE STACK!
+ *   If you can't always satisfy this requirement, use ber_decode(),
+ *   xer_decode() and uper_decode() functions instead.
+ */
+typedef struct asn_codec_ctx_s {
+	/*
+	 * Limit the decoder routines to use no (much) more stack than a given
+	 * number of bytes. Most of decoders are stack-based, and this
+	 * would protect against stack overflows if the number of nested
+	 * encodings is high.
+	 * The OCTET STRING, BIT STRING and ANY BER decoders are heap-based,
+	 * and are safe from this kind of overflow.
+	 * A value from getrlimit(RLIMIT_STACK) may be used to initialize
+	 * this variable. Be careful in multithreaded environments, as the
+	 * stack size is rather limited.
+	 */
+	size_t  max_stack_size; /* 0 disables stack bounds checking */
+} asn_codec_ctx_t;
+
+/*
+ * Type of the return value of the encoding functions (der_encode, xer_encode).
+ */
+typedef struct asn_enc_rval_s {
+	/*
+	 * Number of bytes encoded.
+	 * -1 indicates failure to encode the structure.
+	 * In this case, the members below this one are meaningful.
+	 */
+	ssize_t encoded;
+
+	/*
+	 * Members meaningful when (encoded == -1), for post mortem analysis.
+	 */
+
+	/* Type which cannot be encoded */
+	const struct asn_TYPE_descriptor_s *failed_type;
+
+	/* Pointer to the structure of that type */
+	const void *structure_ptr;
+} asn_enc_rval_t;
+#define	ASN__ENCODE_FAILED do {					\
+	asn_enc_rval_t tmp_error;				\
+	tmp_error.encoded = -1;					\
+	tmp_error.failed_type = td;				\
+	tmp_error.structure_ptr = sptr;				\
+	ASN_DEBUG("Failed to encode element %s", td ? td->name : "");	\
+	return tmp_error;					\
+} while(0)
+#define	ASN__ENCODED_OK(rval) do {				\
+	rval.structure_ptr = 0;					\
+	rval.failed_type = 0;					\
+	return rval;						\
+} while(0)
+
+/*
+ * Type of the return value of the decoding functions (ber_decode, xer_decode)
+ * 
+ * Please note that the number of consumed bytes is ALWAYS meaningful,
+ * even if code==RC_FAIL. This is to indicate the number of successfully
+ * decoded bytes, hence providing a possibility to fail with more diagnostics
+ * (i.e., print the offending remainder of the buffer).
+ */
+enum asn_dec_rval_code_e {
+	RC_OK,		/* Decoded successfully */
+	RC_WMORE,	/* More data expected, call again */
+	RC_FAIL		/* Failure to decode data */
+};
+typedef struct asn_dec_rval_s {
+	enum asn_dec_rval_code_e code;	/* Result code */
+	size_t consumed;		/* Number of bytes consumed */
+} asn_dec_rval_t;
+#define	ASN__DECODE_FAILED do {					\
+	asn_dec_rval_t tmp_error;				\
+	tmp_error.code = RC_FAIL;				\
+	tmp_error.consumed = 0;					\
+	ASN_DEBUG("Failed to decode element %s", td ? td->name : "");	\
+	return tmp_error;					\
+} while(0)
+#define	ASN__DECODE_STARVED do {				\
+	asn_dec_rval_t tmp_error;				\
+	tmp_error.code = RC_WMORE;				\
+	tmp_error.consumed = 0;					\
+	return tmp_error;					\
+} while(0)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* ASN_CODECS_H */
diff --git a/src/s1ap/asn1c/asnGenFiles/asn_codecs_prim.h b/src/s1ap/asn1c/asnGenFiles/asn_codecs_prim.h
new file mode 100644
index 0000000..fbc5576
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/asn_codecs_prim.h
@@ -0,0 +1,51 @@
+/*-
+ * Copyright (c) 2004-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+#ifndef	ASN_CODECS_PRIM_H
+#define	ASN_CODECS_PRIM_H
+
+#include <asn_application.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct ASN__PRIMITIVE_TYPE_s {
+    uint8_t *buf;   /* Buffer with consecutive primitive encoding bytes */
+    size_t size;    /* Size of the buffer */
+} ASN__PRIMITIVE_TYPE_t;	/* Do not use this type directly! */
+
+asn_struct_free_f ASN__PRIMITIVE_TYPE_free;
+ber_type_decoder_f ber_decode_primitive;
+der_type_encoder_f der_encode_primitive;
+
+/*
+ * A callback specification for the xer_decode_primitive() function below.
+ */
+enum xer_pbd_rval {
+    XPBD_SYSTEM_FAILURE,  /* System failure (memory shortage, etc) */
+    XPBD_DECODER_LIMIT,   /* Hit some decoder limitation or deficiency */
+    XPBD_BROKEN_ENCODING, /* Encoding of a primitive body is broken */
+    XPBD_NOT_BODY_IGNORE, /* Not a body format, but safe to ignore */
+    XPBD_BODY_CONSUMED    /* Body is recognized and consumed */
+};
+typedef enum xer_pbd_rval(xer_primitive_body_decoder_f)(
+    const asn_TYPE_descriptor_t *td, void *struct_ptr, const void *chunk_buf,
+    size_t chunk_size);
+
+/*
+ * Specific function to decode simple primitive types.
+ * Also see xer_decode_general() in xer_decoder.h
+ */
+asn_dec_rval_t xer_decode_primitive(
+    const asn_codec_ctx_t *opt_codec_ctx,
+    const asn_TYPE_descriptor_t *type_descriptor, void **struct_ptr,
+    size_t struct_size, const char *opt_mname, const void *buf_ptr, size_t size,
+    xer_primitive_body_decoder_f *prim_body_decoder);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* ASN_CODECS_PRIM_H */
diff --git a/src/s1ap/asn1c/asnGenFiles/asn_constant.h b/src/s1ap/asn1c/asnGenFiles/asn_constant.h
new file mode 100644
index 0000000..8148b4a
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/asn_constant.h
@@ -0,0 +1,64 @@
+/*
+ * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
+ */
+
+#ifndef _ASN_CONSTANT_H
+#define _ASN_CONSTANT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define maxPrivateIEs (65535)
+#define maxProtocolExtensions (65535)
+#define maxProtocolIEs (65535)
+#define maxnoofCSGs (256)
+#define maxnoofE_RABs (256)
+#define maxnoofTAIs (256)
+#define maxnoofTACs (256)
+#define maxnoofErrors (256)
+#define maxnoofBPLMNs (6)
+#define maxnoofPLMNsPerMME (32)
+#define maxnoofEPLMNs (15)
+#define maxnoofEPLMNsPlusOne (16)
+#define maxnoofForbLACs (4096)
+#define maxnoofForbTACs (4096)
+#define maxnoofIndividualS1ConnectionsToReset (256)
+#define maxnoofCellsinUEHistoryInfo (16)
+#define maxnoofCellsineNB (256)
+#define maxnoofTAIforWarning (65535)
+#define maxnoofCellID (65535)
+#define maxnoofDCNs (32)
+#define maxnoofEmergencyAreaID (65535)
+#define maxnoofCellinTAI (65535)
+#define maxnoofCellinEAI (65535)
+#define maxnoofeNBX2TLAs (2)
+#define maxnoofeNBX2ExtTLAs (16)
+#define maxnoofeNBX2GTPTLAs (16)
+#define maxnoofRATs (8)
+#define maxnoofGroupIDs (65535)
+#define maxnoofMMECs (256)
+#define maxnoofCellIDforMDT (32)
+#define maxnoofTAforMDT (8)
+#define maxnoofMDTPLMNs (16)
+#define maxnoofCellsforRestart (256)
+#define maxnoofRestartTAIs (2048)
+#define maxnoofRestartEmergencyAreaIDs (256)
+#define maxEARFCN (262143)
+#define maxnoofMBSFNAreaMDT (8)
+#define maxnoofRecommendedCells (16)
+#define maxnoofRecommendedENBs (16)
+#define maxnooftimeperiods (2)
+#define maxnoofCellIDforQMC (32)
+#define maxnoofTAforQMC (8)
+#define maxnoofPLMNforQMC (16)
+#define maxnoofBluetoothName (4)
+#define maxnoofWLANName (4)
+#define maxnoofConnectedengNBs (256)
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _ASN_CONSTANT_H */
diff --git a/src/s1ap/asn1c/asnGenFiles/asn_internal.h b/src/s1ap/asn1c/asnGenFiles/asn_internal.h
new file mode 100644
index 0000000..77b270c
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/asn_internal.h
@@ -0,0 +1,153 @@
+/*
+ * Copyright (c) 2003-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+/*
+ * Declarations internally useful for the ASN.1 support code.
+ */
+#ifndef	ASN_INTERNAL_H
+#define	ASN_INTERNAL_H
+#ifndef __EXTENSIONS__
+#define __EXTENSIONS__          /* for Sun */
+#endif
+
+#include "asn_application.h"	/* Application-visible API */
+
+#ifndef	__NO_ASSERT_H__		/* Include assert.h only for internal use. */
+#include <assert.h>		/* for assert() macro */
+#endif
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+/* Environment version might be used to avoid running with the old library */
+#define	ASN1C_ENVIRONMENT_VERSION	923	/* Compile-time version */
+int get_asn1c_environment_version(void);	/* Run-time version */
+
+#define	CALLOC(nmemb, size)	calloc(nmemb, size)
+#define	MALLOC(size)		malloc(size)
+#define	REALLOC(oldptr, size)	realloc(oldptr, size)
+#define	FREEMEM(ptr)		free(ptr)
+
+#define	asn_debug_indent	0
+#define ASN_DEBUG_INDENT_ADD(i) do{}while(0)
+
+#ifdef  EMIT_ASN_DEBUG
+#warning "Use ASN_EMIT_DEBUG instead of EMIT_ASN_DEBUG"
+#define ASN_EMIT_DEBUG  EMIT_ASN_DEBUG
+#endif
+
+/*
+ * A macro for debugging the ASN.1 internals.
+ * You may enable or override it.
+ */
+#ifndef	ASN_DEBUG	/* If debugging code is not defined elsewhere... */
+#if	ASN_EMIT_DEBUG == 1	/* And it was asked to emit this code... */
+#if __STDC_VERSION__ >= 199901L
+#ifdef	ASN_THREAD_SAFE
+/* Thread safety requires sacrifice in output indentation:
+ * Retain empty definition of ASN_DEBUG_INDENT_ADD. */
+#else	/* !ASN_THREAD_SAFE */
+#undef  ASN_DEBUG_INDENT_ADD
+#undef  asn_debug_indent
+int asn_debug_indent;
+#define ASN_DEBUG_INDENT_ADD(i) do { asn_debug_indent += i; } while(0)
+#endif	/* ASN_THREAD_SAFE */
+#define	ASN_DEBUG(fmt, args...)	do {			\
+		int adi = asn_debug_indent;		\
+		while(adi--) fprintf(stderr, " ");	\
+		fprintf(stderr, fmt, ##args);		\
+		fprintf(stderr, " (%s:%d)\n",		\
+			__FILE__, __LINE__);		\
+	} while(0)
+#else	/* !C99 */
+void CC_PRINTFLIKE(1, 2) ASN_DEBUG_f(const char *fmt, ...);
+#define	ASN_DEBUG	ASN_DEBUG_f
+#endif	/* C99 */
+#else	/* ASN_EMIT_DEBUG != 1 */
+#if __STDC_VERSION__ >= 199901L
+#define ASN_DEBUG(...) do{}while(0)
+#else   /* not C99 */
+static void CC_PRINTFLIKE(1, 2) ASN_DEBUG(const char *fmt, ...) { (void)fmt; }
+#endif  /* C99 or better */
+#endif	/* ASN_EMIT_DEBUG */
+#endif	/* ASN_DEBUG */
+
+/*
+ * Print to a callback.
+ * The callback is expected to return negative values on error.
+ * 0 and positive values are treated as success.
+ * RETURN VALUES:
+ *  -1: Failed to format or invoke the callback.
+ *  >0: Size of the data that got delivered to the callback.
+ */
+ssize_t CC_PRINTFLIKE(3, 4)
+asn__format_to_callback(
+    int (*callback)(const void *, size_t, void *key), void *key,
+    const char *fmt, ...);
+
+/*
+ * Invoke the application-supplied callback and fail, if something is wrong.
+ */
+#define ASN__E_cbc(buf, size) (cb((buf), (size), app_key) < 0)
+#define ASN__E_CALLBACK(size, foo) \
+    do {                           \
+        if(foo) goto cb_failed;    \
+        er.encoded += (size);      \
+    } while(0)
+#define ASN__CALLBACK(buf, size) ASN__E_CALLBACK(size, ASN__E_cbc(buf, size))
+#define ASN__CALLBACK2(buf1, size1, buf2, size2) \
+    ASN__E_CALLBACK((size1) + (size2),           \
+                    ASN__E_cbc(buf1, size1) || ASN__E_cbc(buf2, size2))
+#define ASN__CALLBACK3(buf1, size1, buf2, size2, buf3, size3)          \
+    ASN__E_CALLBACK((size1) + (size2) + (size3),                       \
+                    ASN__E_cbc(buf1, size1) || ASN__E_cbc(buf2, size2) \
+                        || ASN__E_cbc(buf3, size3))
+
+#define ASN__TEXT_INDENT(nl, level)                                          \
+    do {                                                                     \
+        int tmp_level = (level);                                             \
+        int tmp_nl = ((nl) != 0);                                            \
+        int tmp_i;                                                           \
+        if(tmp_nl) ASN__CALLBACK("\n", 1);                                   \
+        if(tmp_level < 0) tmp_level = 0;                                     \
+        for(tmp_i = 0; tmp_i < tmp_level; tmp_i++) ASN__CALLBACK("    ", 4); \
+    } while(0)
+
+#define	_i_INDENT(nl)	do {                        \
+        int tmp_i;                                  \
+        if((nl) && cb("\n", 1, app_key) < 0)        \
+            return -1;                              \
+        for(tmp_i = 0; tmp_i < ilevel; tmp_i++)     \
+            if(cb("    ", 4, app_key) < 0)          \
+                return -1;                          \
+    } while(0)
+
+/*
+ * Check stack against overflow, if limit is set.
+ */
+#define	ASN__DEFAULT_STACK_MAX	(30000)
+static int CC_NOTUSED
+ASN__STACK_OVERFLOW_CHECK(const asn_codec_ctx_t *ctx) {
+	if(ctx && ctx->max_stack_size) {
+
+		/* ctx MUST be allocated on the stack */
+		ptrdiff_t usedstack = ((const char *)ctx - (const char *)&ctx);
+		if(usedstack > 0) usedstack = -usedstack; /* grows up! */
+
+		/* double negative required to avoid int wrap-around */
+		if(usedstack < -(ptrdiff_t)ctx->max_stack_size) {
+			ASN_DEBUG("Stack limit %ld reached",
+				(long)ctx->max_stack_size);
+			return -1;
+		}
+	}
+	return 0;
+}
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif	/* ASN_INTERNAL_H */
diff --git a/src/s1ap/asn1c/asnGenFiles/asn_ioc.h b/src/s1ap/asn1c/asnGenFiles/asn_ioc.h
new file mode 100644
index 0000000..7de210e
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/asn_ioc.h
@@ -0,0 +1,51 @@
+/*
+ * Run-time support for Information Object Classes.
+ * Copyright (c) 2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+#ifndef	ASN_IOC_H
+#define	ASN_IOC_H
+
+#include <asn_system.h>		/* Platform-specific types */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct asn_TYPE_descriptor_s;
+struct asn_ioc_cell_s;
+
+/*
+ * X.681, #13
+ */
+typedef struct asn_ioc_set_s {
+    size_t rows_count;
+    size_t columns_count;
+    const struct asn_ioc_cell_s *rows;
+} asn_ioc_set_t;
+
+
+typedef struct asn_ioc_cell_s {
+    const char *field_name; /* Is equal to corresponding column_name */
+    enum {
+        aioc__undefined = 0,
+        aioc__value,
+        aioc__type,
+        aioc__open_type,
+    } cell_kind;
+    struct asn_TYPE_descriptor_s *type_descriptor;
+    const void *value_sptr;
+    struct {
+        size_t types_count;
+        struct {
+            unsigned choice_position;
+        } *types;
+    } open_type;
+} asn_ioc_cell_t;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* ASN_IOC_H */
diff --git a/src/s1ap/asn1c/asnGenFiles/asn_random_fill.h b/src/s1ap/asn1c/asnGenFiles/asn_random_fill.h
new file mode 100644
index 0000000..47f9b8a
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/asn_random_fill.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+#ifndef	ASN_RANDOM_FILL
+#define	ASN_RANDOM_FILL
+
+/* Forward declarations */
+struct asn_TYPE_descriptor_s;
+struct asn_encoding_constraints_s;
+
+/*
+ * Initialize a structure with random data according to the type specification
+ * and optional member constraints.
+ * ARGUMENTS:
+ *  (max_length)        - See (approx_max_length_limit).
+ *  (memb_constraints)  - Member constraints, if exist.
+ *                        The type can be constrained differently according
+ *                        to PER and OER specifications, so we find a value
+ *                        at the intersection of these constraints.
+ * In case the return differs from ARFILL_OK, the (struct_ptr) contents
+ * and (current_length) value remain in their original state.
+ */
+typedef struct asn_random_fill_result_s {
+    enum {
+        ARFILL_FAILED = -1, /* System error (memory?) */
+        ARFILL_OK = 0,      /* Initialization succeeded */
+        ARFILL_SKIPPED = 1  /* Not done due to (length?) constraint */
+    } code;
+    size_t length; /* Approximate number of bytes created. */
+} asn_random_fill_result_t;
+typedef asn_random_fill_result_t(asn_random_fill_f)(
+    const struct asn_TYPE_descriptor_s *td, void **struct_ptr,
+    const struct asn_encoding_constraints_s *memb_constraints,
+    size_t max_length);
+
+/*
+ * Returns 0 if the structure was properly initialized, -1 otherwise.
+ * The (approx_max_length_limit) specifies the approximate limit of the
+ * resulting structure in units closely resembling bytes. The actual result
+ * might be several times larger or smaller than the length limit.
+ */
+int asn_random_fill(const struct asn_TYPE_descriptor_s *td, void **struct_ptr,
+                    size_t approx_max_length_limit);
+
+/*
+ * Returns a random number between min and max.
+ */
+intmax_t asn_random_between(intmax_t min, intmax_t max);
+
+#endif	/* ASN_RANDOM_FILL */
diff --git a/src/s1ap/asn1c/asnGenFiles/asn_system.h b/src/s1ap/asn1c/asnGenFiles/asn_system.h
new file mode 100644
index 0000000..fa8cf11
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/asn_system.h
@@ -0,0 +1,150 @@
+/*
+ * Copyright (c) 2003-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+/*
+ * Miscellaneous system-dependent types.
+ */
+#ifndef	ASN_SYSTEM_H
+#define	ASN_SYSTEM_H
+
+#ifdef	HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifndef _DEFAULT_SOURCE
+#define _DEFAULT_SOURCE 1
+#endif
+
+#ifndef _BSD_SOURCE
+#define _BSD_SOURCE /* for snprintf() on some linux systems  */
+#endif
+
+#include <stdio.h>	/* For snprintf(3) */
+#include <stdlib.h>	/* For *alloc(3) */
+#include <string.h>	/* For memcpy(3) */
+#include <sys/types.h>	/* For size_t */
+#include <limits.h>	/* For LONG_MAX */
+#include <stdarg.h>	/* For va_start */
+#include <stddef.h>	/* for offsetof and ptrdiff_t */
+
+#ifdef	_WIN32
+
+#include <malloc.h>
+#define	 snprintf	_snprintf
+#define	 vsnprintf	_vsnprintf
+
+/* To avoid linking with ws2_32.lib, here's the definition of ntohl() */
+#define sys_ntohl(l)	((((l) << 24)  & 0xff000000)	\
+			| (((l) << 8) & 0xff0000)	\
+			| (((l) >> 8)  & 0xff00)	\
+			| ((l >> 24) & 0xff))
+
+#ifdef _MSC_VER			/* MSVS.Net */
+#ifndef __cplusplus
+#define inline __inline
+#endif
+#ifndef	ASSUMESTDTYPES	/* Standard types have been defined elsewhere */
+#define	ssize_t		SSIZE_T
+#if _MSC_VER < 1600
+typedef	char		int8_t;
+typedef	short		int16_t;
+typedef	int		int32_t;
+typedef	unsigned char	uint8_t;
+typedef	unsigned short	uint16_t;
+typedef	unsigned int	uint32_t;
+#else /* _MSC_VER >= 1600 */
+#include <stdint.h>
+#endif /* _MSC_VER < 1600 */
+#endif	/* ASSUMESTDTYPES */
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#include <float.h>
+#define isnan _isnan
+#define finite _finite
+#define copysign _copysign
+#define	ilogb	_logb
+#else	/* !_MSC_VER */
+#include <stdint.h>
+#endif	/* _MSC_VER */
+
+#else	/* !_WIN32 */
+
+#if defined(__vxworks)
+#include <types/vxTypes.h>
+#else	/* !defined(__vxworks) */
+
+#include <inttypes.h>	/* C99 specifies this file */
+#include <netinet/in.h> /* for ntohl() */
+#define	sys_ntohl(foo)	ntohl(foo)
+#endif	/* defined(__vxworks) */
+
+#endif	/* _WIN32 */
+
+#if	__GNUC__ >= 3 || defined(__clang__)
+#define CC_ATTRIBUTE(attr)    __attribute__((attr))
+#else
+#define CC_ATTRIBUTE(attr)
+#endif
+#define CC_PRINTFLIKE(fmt, var)     CC_ATTRIBUTE(format(printf, fmt, var))
+#define	CC_NOTUSED                  CC_ATTRIBUTE(unused)
+#ifndef CC_ATTR_NO_SANITIZE
+#define CC_ATTR_NO_SANITIZE(what)   CC_ATTRIBUTE(no_sanitize(what))
+#endif
+
+/* Figure out if thread safety is requested */
+#if !defined(ASN_THREAD_SAFE) && (defined(THREAD_SAFE) || defined(_REENTRANT))
+#define	ASN_THREAD_SAFE
+#endif	/* Thread safety */
+
+#ifndef	offsetof	/* If not defined by <stddef.h> */
+#define	offsetof(s, m)	((ptrdiff_t)&(((s *)0)->m) - (ptrdiff_t)((s *)0))
+#endif	/* offsetof */
+
+#ifndef	MIN		/* Suitable for comparing primitive types (integers) */
+#if defined(__GNUC__)
+#define	MIN(a,b)	({ __typeof a _a = a; __typeof b _b = b;	\
+	((_a)<(_b)?(_a):(_b)); })
+#else	/* !__GNUC__ */
+#define	MIN(a,b)	((a)<(b)?(a):(b))	/* Unsafe variant */
+#endif /* __GNUC__ */
+#endif	/* MIN */
+
+#if __STDC_VERSION__ >= 199901L
+#ifndef SIZE_MAX
+#define SIZE_MAX   ((~((size_t)0)) >> 1)
+#endif
+
+#ifndef RSIZE_MAX   /* C11, Annex K */
+#define RSIZE_MAX   (SIZE_MAX >> 1)
+#endif
+#ifndef RSSIZE_MAX   /* Halve signed size even further than unsigned */
+#define RSSIZE_MAX   ((ssize_t)(RSIZE_MAX >> 1))
+#endif
+#else   /* Old compiler */
+#undef  SIZE_MAX
+#undef  RSIZE_MAX
+#undef  RSSIZE_MAX
+#define SIZE_MAX   ((~((size_t)0)) >> 1)
+#define RSIZE_MAX   (SIZE_MAX >> 1)
+#define RSSIZE_MAX   ((ssize_t)(RSIZE_MAX >> 1))
+#endif
+
+#if __STDC_VERSION__ >= 199901L
+#define ASN_PRI_SIZE "zu"
+#define ASN_PRI_SSIZE "zd"
+#define ASN_PRIuMAX PRIuMAX
+#define ASN_PRIdMAX PRIdMAX
+#else
+#define ASN_PRI_SIZE "lu"
+#define ASN_PRI_SSIZE "ld"
+#if LLONG_MAX > LONG_MAX
+#define ASN_PRIuMAX "llu"
+#define ASN_PRIdMAX "lld"
+#else
+#define ASN_PRIuMAX "lu"
+#define ASN_PRIdMAX "ld"
+#endif
+#endif
+
+#endif	/* ASN_SYSTEM_H */
diff --git a/src/s1ap/asn1c/asnGenFiles/ber_decoder.h b/src/s1ap/asn1c/asnGenFiles/ber_decoder.h
new file mode 100644
index 0000000..1ac2a5e
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ber_decoder.h
@@ -0,0 +1,66 @@
+/*-
+ * Copyright (c) 2003-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+#ifndef	_BER_DECODER_H_
+#define	_BER_DECODER_H_
+
+#include <asn_application.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct asn_TYPE_descriptor_s;	/* Forward declaration */
+struct asn_codec_ctx_s;		/* Forward declaration */
+
+/*
+ * The BER decoder of any type.
+ * This function may be invoked directly from the application.
+ * Decodes BER, DER and CER data (DER and CER are different subsets of BER).
+ *
+ * NOTE: Use the der_encode() function (der_encoder.h) to produce encoding
+ * which is compliant with ber_decode().
+ */
+asn_dec_rval_t ber_decode(
+    const struct asn_codec_ctx_s *opt_codec_ctx,
+    const struct asn_TYPE_descriptor_s *type_descriptor,
+    void **struct_ptr,  /* Pointer to a target structure's pointer */
+    const void *buffer, /* Data to be decoded */
+    size_t size         /* Size of that buffer */
+);
+
+/*
+ * Type of generic function which decodes the byte stream into the structure.
+ */
+typedef asn_dec_rval_t(ber_type_decoder_f)(
+    const struct asn_codec_ctx_s *opt_codec_ctx,
+    const struct asn_TYPE_descriptor_s *type_descriptor, void **struct_ptr,
+    const void *buf_ptr, size_t size, int tag_mode);
+
+/*******************************
+ * INTERNALLY USEFUL FUNCTIONS *
+ *******************************/
+
+/*
+ * Check that all tags correspond to the type definition (as given in head).
+ * On return, last_length would contain either a non-negative length of the
+ * value part of the last TLV, or the negative number of expected
+ * "end of content" sequences. The number may only be negative if the
+ * head->last_tag_form is non-zero.
+ */
+asn_dec_rval_t ber_check_tags(
+    const struct asn_codec_ctx_s *opt_codec_ctx, /* codec options */
+    const struct asn_TYPE_descriptor_s *type_descriptor,
+    asn_struct_ctx_t *opt_ctx, /* saved decoding context */
+    const void *ptr, size_t size,
+    int tag_mode,      /* {-1,0,1}: IMPLICIT, no, EXPLICIT */
+    int last_tag_form, /* {-1,0:1}: any, primitive, constr */
+    ber_tlv_len_t *last_length, int *opt_tlv_form /* optional tag form */
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _BER_DECODER_H_ */
diff --git a/src/s1ap/asn1c/asnGenFiles/ber_tlv_length.h b/src/s1ap/asn1c/asnGenFiles/ber_tlv_length.h
new file mode 100644
index 0000000..d1e4d48
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ber_tlv_length.h
@@ -0,0 +1,50 @@
+/*-
+ * Copyright (c) 2003-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+#ifndef	_BER_TLV_LENGTH_H_
+#define	_BER_TLV_LENGTH_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef ssize_t ber_tlv_len_t;
+
+/*
+ * This function tries to fetch the length of the BER TLV value and place it
+ * in *len_r.
+ * RETURN VALUES:
+ *	 0:	More data expected than bufptr contains.
+ *	-1:	Fatal error deciphering length.
+ *	>0:	Number of bytes used from bufptr.
+ * On return with >0, len_r is constrained as -1..MAX, where -1 mean
+ * that the value is of indefinite length.
+ */
+ssize_t ber_fetch_length(int _is_constructed, const void *bufptr, size_t size,
+	ber_tlv_len_t *len_r);
+
+/*
+ * This function expects bufptr to be positioned over L in TLV.
+ * It returns number of bytes occupied by L and V together, suitable
+ * for skipping. The function properly handles indefinite length.
+ * RETURN VALUES:
+ * 	Standard {-1,0,>0} convention.
+ */
+ssize_t ber_skip_length(
+	const struct asn_codec_ctx_s *opt_codec_ctx,	/* optional context */
+	int _is_constructed, const void *bufptr, size_t size);
+
+/*
+ * This function serializes the length (L from TLV) in DER format.
+ * It always returns number of bytes necessary to represent the length,
+ * it is a caller's responsibility to check the return value
+ * against the supplied buffer's size.
+ */
+size_t der_tlv_length_serialize(ber_tlv_len_t len, void *bufptr, size_t size);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _BER_TLV_LENGTH_H_ */
diff --git a/src/s1ap/asn1c/asnGenFiles/ber_tlv_tag.h b/src/s1ap/asn1c/asnGenFiles/ber_tlv_tag.h
new file mode 100644
index 0000000..ce227ad
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/ber_tlv_tag.h
@@ -0,0 +1,60 @@
+/*-
+ * Copyright (c) 2003-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+#ifndef	_BER_TLV_TAG_H_
+#define	_BER_TLV_TAG_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+enum asn_tag_class {
+	ASN_TAG_CLASS_UNIVERSAL		= 0,	/* 0b00 */
+	ASN_TAG_CLASS_APPLICATION	= 1,	/* 0b01 */
+	ASN_TAG_CLASS_CONTEXT		= 2,	/* 0b10 */
+	ASN_TAG_CLASS_PRIVATE		= 3	/* 0b11 */
+};
+typedef unsigned ber_tlv_tag_t;	/* BER TAG from Tag-Length-Value */
+
+/*
+ * Tag class is encoded together with tag value for optimization purposes.
+ */
+#define	BER_TAG_CLASS(tag)	((tag) & 0x3)
+#define	BER_TAG_VALUE(tag)	((tag) >> 2)
+#define	BER_TLV_CONSTRUCTED(tagptr)	(((*(const uint8_t *)tagptr)&0x20)?1:0)
+
+#define	BER_TAGS_EQUAL(tag1, tag2)	((tag1) == (tag2))
+
+/*
+ * Several functions for printing the TAG in the canonical form
+ * (i.e. "[PRIVATE 0]").
+ * Return values correspond to their libc counterparts (if any).
+ */
+ssize_t ber_tlv_tag_snprint(ber_tlv_tag_t tag, char *buf, size_t buflen);
+ssize_t ber_tlv_tag_fwrite(ber_tlv_tag_t tag, FILE *);
+char *ber_tlv_tag_string(ber_tlv_tag_t tag);
+
+
+/*
+ * This function tries to fetch the tag from the input stream.
+ * RETURN VALUES:
+ * 	 0:	More data expected than bufptr contains.
+ * 	-1:	Fatal error deciphering tag.
+ *	>0:	Number of bytes used from bufptr. tag_r will contain the tag.
+ */
+ssize_t ber_fetch_tag(const void *bufptr, size_t size, ber_tlv_tag_t *tag_r);
+
+/*
+ * This function serializes the tag (T from TLV) in BER format.
+ * It always returns number of bytes necessary to represent the tag,
+ * it is a caller's responsibility to check the return value
+ * against the supplied buffer's size.
+ */
+size_t ber_tlv_tag_serialize(ber_tlv_tag_t tag, void *bufptr, size_t size);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _BER_TLV_TAG_H_ */
diff --git a/src/s1ap/asn1c/asnGenFiles/constr_CHOICE.h b/src/s1ap/asn1c/asnGenFiles/constr_CHOICE.h
new file mode 100644
index 0000000..a1999ed
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/constr_CHOICE.h
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2003-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+#ifndef	_CONSTR_CHOICE_H_
+#define	_CONSTR_CHOICE_H_
+
+#include <asn_application.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct asn_CHOICE_specifics_s {
+	/*
+	 * Target structure description.
+	 */
+	unsigned struct_size;       /* Size of the target structure. */
+	unsigned ctx_offset;        /* Offset of the asn_codec_ctx_t member */
+	unsigned pres_offset;       /* Identifier of the present member */
+	unsigned pres_size;         /* Size of the identifier (enum) */
+
+	/*
+	 * Tags to members mapping table.
+	 */
+	const asn_TYPE_tag2member_t *tag2el;
+	unsigned tag2el_count;
+
+	/* Canonical ordering of CHOICE elements, for PER */
+	const unsigned *to_canonical_order;
+	const unsigned *from_canonical_order;
+
+	/*
+	 * Extensions-related stuff.
+	 */
+	signed ext_start; /* First member of extensions, or -1 */
+} asn_CHOICE_specifics_t;
+
+/*
+ * A set specialized functions dealing with the CHOICE type.
+ */
+asn_struct_free_f CHOICE_free;
+asn_struct_print_f CHOICE_print;
+asn_struct_compare_f CHOICE_compare;
+asn_constr_check_f CHOICE_constraint;
+ber_type_decoder_f CHOICE_decode_ber;
+der_type_encoder_f CHOICE_encode_der;
+xer_type_decoder_f CHOICE_decode_xer;
+xer_type_encoder_f CHOICE_encode_xer;
+oer_type_decoder_f CHOICE_decode_oer;
+oer_type_encoder_f CHOICE_encode_oer;
+per_type_decoder_f CHOICE_decode_uper;
+per_type_encoder_f CHOICE_encode_uper;
+per_type_decoder_f CHOICE_decode_aper;
+per_type_encoder_f CHOICE_encode_aper;
+asn_outmost_tag_f CHOICE_outmost_tag;
+asn_random_fill_f CHOICE_random_fill;
+extern asn_TYPE_operation_t asn_OP_CHOICE;
+
+/*
+ * Return the 1-based choice variant presence index.
+ * Returns 0 in case of error.
+ */
+unsigned CHOICE_variant_get_presence(const asn_TYPE_descriptor_t *td,
+                                     const void *structure_ptr);
+
+/*
+ * Sets or resets the 1-based choice variant presence index.
+ * In case a previous index is not zero, the currently selected structure
+ * member is freed and zeroed-out first.
+ * Returns 0 on success and -1 on error.
+ */
+int CHOICE_variant_set_presence(const asn_TYPE_descriptor_t *td,
+                                void *structure_ptr, unsigned present);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CONSTR_CHOICE_H_ */
diff --git a/src/s1ap/asn1c/asnGenFiles/constr_SEQUENCE.h b/src/s1ap/asn1c/asnGenFiles/constr_SEQUENCE.h
new file mode 100644
index 0000000..a22ed3a
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/constr_SEQUENCE.h
@@ -0,0 +1,68 @@
+/*-
+ * Copyright (c) 2003-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+#ifndef	_CONSTR_SEQUENCE_H_
+#define	_CONSTR_SEQUENCE_H_
+
+#include <asn_application.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct asn_SEQUENCE_specifics_s {
+	/*
+	 * Target structure description.
+	 */
+	unsigned struct_size;	/* Size of the target structure. */
+	unsigned ctx_offset;	/* Offset of the asn_struct_ctx_t member */
+
+	/*
+	 * Tags to members mapping table (sorted).
+	 */
+	const asn_TYPE_tag2member_t *tag2el;
+	unsigned tag2el_count;
+
+	/*
+	 * Optional members of the extensions root (roms) or additions (aoms).
+	 * Meaningful for PER.
+	 */
+	const int *oms;         /* Optional MemberS */
+	unsigned roms_count;    /* Root optional members count */
+	unsigned aoms_count;    /* Additions optional members count */
+
+	/*
+	 * Description of an extensions group.
+	 * Root components are clustered at the beginning of the structure,
+	 * whereas extensions are clustered at the end. -1 means not extensible.
+	 */
+	signed first_extension;       /* First extension addition */
+} asn_SEQUENCE_specifics_t;
+
+
+/*
+ * A set specialized functions dealing with the SEQUENCE type.
+ */
+asn_struct_free_f SEQUENCE_free;
+asn_struct_print_f SEQUENCE_print;
+asn_struct_compare_f SEQUENCE_compare;
+asn_constr_check_f SEQUENCE_constraint;
+ber_type_decoder_f SEQUENCE_decode_ber;
+der_type_encoder_f SEQUENCE_encode_der;
+xer_type_decoder_f SEQUENCE_decode_xer;
+xer_type_encoder_f SEQUENCE_encode_xer;
+oer_type_decoder_f SEQUENCE_decode_oer;
+oer_type_encoder_f SEQUENCE_encode_oer;
+per_type_decoder_f SEQUENCE_decode_uper;
+per_type_encoder_f SEQUENCE_encode_uper;
+per_type_decoder_f SEQUENCE_decode_aper;
+per_type_encoder_f SEQUENCE_encode_aper;
+asn_random_fill_f  SEQUENCE_random_fill;
+extern asn_TYPE_operation_t asn_OP_SEQUENCE;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CONSTR_SEQUENCE_H_ */
diff --git a/src/s1ap/asn1c/asnGenFiles/constr_SEQUENCE_OF.h b/src/s1ap/asn1c/asnGenFiles/constr_SEQUENCE_OF.h
new file mode 100644
index 0000000..6857f0f
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/constr_SEQUENCE_OF.h
@@ -0,0 +1,41 @@
+/*-
+ * Copyright (c) 2003-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+#ifndef	_CONSTR_SEQUENCE_OF_H_
+#define	_CONSTR_SEQUENCE_OF_H_
+
+#include <asn_application.h>
+#include <constr_SET_OF.h>		/* Implemented using SET OF */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * A set specialized functions dealing with the SEQUENCE OF type.
+ * Generally implemented using SET OF.
+ */
+asn_struct_compare_f SEQUENCE_OF_compare;
+der_type_encoder_f SEQUENCE_OF_encode_der;
+xer_type_encoder_f SEQUENCE_OF_encode_xer;
+per_type_encoder_f SEQUENCE_OF_encode_uper;
+per_type_encoder_f SEQUENCE_OF_encode_aper;
+extern asn_TYPE_operation_t asn_OP_SEQUENCE_OF;
+
+#define	SEQUENCE_OF_free	SET_OF_free
+#define	SEQUENCE_OF_print	SET_OF_print
+#define	SEQUENCE_OF_constraint	SET_OF_constraint
+#define	SEQUENCE_OF_decode_ber	SET_OF_decode_ber
+#define	SEQUENCE_OF_decode_xer	SET_OF_decode_xer
+#define	SEQUENCE_OF_decode_oer  SET_OF_decode_oer
+#define	SEQUENCE_OF_encode_oer  SET_OF_encode_oer
+#define	SEQUENCE_OF_decode_uper	SET_OF_decode_uper
+#define	SEQUENCE_OF_decode_aper	SET_OF_decode_aper
+#define	SEQUENCE_OF_random_fill SET_OF_random_fill
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CONSTR_SET_OF_H_ */
diff --git a/src/s1ap/asn1c/asnGenFiles/constr_SET_OF.h b/src/s1ap/asn1c/asnGenFiles/constr_SET_OF.h
new file mode 100644
index 0000000..7681062
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/constr_SET_OF.h
@@ -0,0 +1,49 @@
+/*-
+ * Copyright (c) 2003-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+#ifndef	CONSTR_SET_OF_H
+#define	CONSTR_SET_OF_H
+
+#include <asn_application.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct asn_SET_OF_specifics_s {
+    /*
+     * Target structure description.
+     */
+    unsigned struct_size;       /* Size of the target structure. */
+    unsigned ctx_offset;        /* Offset of the asn_struct_ctx_t member */
+
+    /* XER-specific stuff */
+    int as_XMLValueList; /* The member type must be encoded like this */
+} asn_SET_OF_specifics_t;
+
+/*
+ * A set specialized functions dealing with the SET OF type.
+ */
+asn_struct_free_f SET_OF_free;
+asn_struct_print_f SET_OF_print;
+asn_struct_compare_f SET_OF_compare;
+asn_constr_check_f SET_OF_constraint;
+ber_type_decoder_f SET_OF_decode_ber;
+der_type_encoder_f SET_OF_encode_der;
+xer_type_decoder_f SET_OF_decode_xer;
+xer_type_encoder_f SET_OF_encode_xer;
+oer_type_decoder_f SET_OF_decode_oer;
+oer_type_encoder_f SET_OF_encode_oer;
+per_type_decoder_f SET_OF_decode_uper;
+per_type_encoder_f SET_OF_encode_uper;
+per_type_decoder_f SET_OF_decode_aper;
+per_type_encoder_f SET_OF_encode_aper;
+asn_random_fill_f  SET_OF_random_fill;
+extern asn_TYPE_operation_t asn_OP_SET_OF;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* CONSTR_SET_OF_H */
diff --git a/src/s1ap/asn1c/asnGenFiles/constr_TYPE.h b/src/s1ap/asn1c/asnGenFiles/constr_TYPE.h
new file mode 100644
index 0000000..d80dea5
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/constr_TYPE.h
@@ -0,0 +1,262 @@
+/*
+ * Copyright (c) 2003-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+/*
+ * This file contains the declaration structure called "ASN.1 Type Definition",
+ * which holds all information necessary for encoding and decoding routines.
+ * This structure even contains pointer to these encoding and decoding routines
+ * for each defined ASN.1 type.
+ */
+#ifndef	_CONSTR_TYPE_H_
+#define	_CONSTR_TYPE_H_
+
+#include <ber_tlv_length.h>
+#include <ber_tlv_tag.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct asn_TYPE_descriptor_s;	/* Forward declaration */
+struct asn_TYPE_member_s;	/* Forward declaration */
+
+/*
+ * This type provides the context information for various ASN.1 routines,
+ * primarily ones doing decoding. A member _asn_ctx of this type must be
+ * included into certain target language's structures, such as compound types.
+ */
+typedef struct asn_struct_ctx_s {
+	short phase;		/* Decoding phase */
+	short step;		/* Elementary step of a phase */
+	int context;		/* Other context information */
+	void *ptr;		/* Decoder-specific stuff (stack elements) */
+	ber_tlv_len_t left;	/* Number of bytes left, -1 for indefinite */
+} asn_struct_ctx_t;
+
+#include <ber_decoder.h>	/* Basic Encoding Rules decoder */
+#include <der_encoder.h>	/* Distinguished Encoding Rules encoder */
+#include <xer_decoder.h>	/* Decoder of XER (XML, text) */
+#include <xer_encoder.h>	/* Encoder into XER (XML, text) */
+#include <per_decoder.h>	/* Packet Encoding Rules decoder */
+#include <per_encoder.h>	/* Packet Encoding Rules encoder */
+#include <constraints.h>	/* Subtype constraints support */
+#include <asn_random_fill.h>	/* Random structures support */
+
+#ifdef  ASN_DISABLE_OER_SUPPORT
+typedef void (oer_type_decoder_f)(void);
+typedef void (oer_type_encoder_f)(void);
+typedef void asn_oer_constraints_t;
+#else
+#include <oer_decoder.h>	/* Octet Encoding Rules encoder */
+#include <oer_encoder.h>	/* Octet Encoding Rules encoder */
+#endif
+
+/*
+ * Free the structure according to its specification.
+ * Use one of ASN_STRUCT_{FREE,RESET,CONTENTS_ONLY} macros instead.
+ * Do not use directly.
+ */
+enum asn_struct_free_method {
+    ASFM_FREE_EVERYTHING,   /* free(struct_ptr) and underlying members */
+    ASFM_FREE_UNDERLYING,   /* free underlying members */
+    ASFM_FREE_UNDERLYING_AND_RESET   /* FREE_UNDERLYING + memset(0) */
+};
+typedef void (asn_struct_free_f)(
+		const struct asn_TYPE_descriptor_s *type_descriptor,
+		void *struct_ptr, enum asn_struct_free_method);
+
+/*
+ * Free the structure including freeing the memory pointed to by ptr itself.
+ */
+#define ASN_STRUCT_FREE(asn_DEF, ptr) \
+    (asn_DEF).op->free_struct(&(asn_DEF), (ptr), ASFM_FREE_EVERYTHING)
+
+/*
+ * Free the memory used by the members of the structure without freeing the
+ * the structure pointer itself.
+ * ZERO-OUT the structure to the safe clean state.
+ * (Retaining the pointer may be useful in case the structure is allocated
+ *  statically or arranged on the stack, yet its elements are dynamic.)
+ */
+#define ASN_STRUCT_RESET(asn_DEF, ptr) \
+    (asn_DEF).op->free_struct(&(asn_DEF), (ptr), ASFM_FREE_UNDERLYING_AND_RESET)
+
+/*
+ * Free memory used by the members of the structure without freeing
+ * the structure pointer itself.
+ * (Retaining the pointer may be useful in case the structure is allocated
+ *  statically or arranged on the stack, yet its elements are dynamic.)
+ * AVOID using it in the application code;
+ * Use a safer ASN_STRUCT_RESET() instead.
+ */
+#define ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF, ptr) \
+    (asn_DEF).op->free_struct(&(asn_DEF), (ptr), ASFM_FREE_UNDERLYING)
+
+/*
+ * Print the structure according to its specification.
+ */
+typedef int(asn_struct_print_f)(
+    const struct asn_TYPE_descriptor_s *type_descriptor,
+    const void *struct_ptr,
+    int level, /* Indentation level */
+    asn_app_consume_bytes_f *callback, void *app_key);
+
+/*
+ * Compare two structs between each other.
+ * Returns <0 if struct_A is "smaller" than struct_B, >0 if "greater",
+ * and =0 if "equal to", for some type-specific, stable definition of
+ * "smaller", "greater" and "equal to".
+ */
+typedef int (asn_struct_compare_f)(
+		const struct asn_TYPE_descriptor_s *type_descriptor,
+		const void *struct_A,
+		const void *struct_B);
+
+/*
+ * Return the outmost tag of the type.
+ * If the type is untagged CHOICE, the dynamic operation is performed.
+ * NOTE: This function pointer type is only useful internally.
+ * Do not use it in your application.
+ */
+typedef ber_tlv_tag_t (asn_outmost_tag_f)(
+		const struct asn_TYPE_descriptor_s *type_descriptor,
+		const void *struct_ptr, int tag_mode, ber_tlv_tag_t tag);
+/* The instance of the above function type; used internally. */
+asn_outmost_tag_f asn_TYPE_outmost_tag;
+
+/*
+ * Fetch the desired type of the Open Type based on the
+ * Information Object Set driven constraints.
+ */
+typedef struct asn_type_selector_result_s {
+    const struct asn_TYPE_descriptor_s *type_descriptor; /* Type encoded. */
+    unsigned presence_index; /* Associated choice variant. */
+} asn_type_selector_result_t;
+typedef asn_type_selector_result_t(asn_type_selector_f)(
+    const struct asn_TYPE_descriptor_s *parent_type_descriptor,
+    const void *parent_structure_ptr);
+
+/*
+ * Generalized functions for dealing with the speciic type.
+ * May be directly invoked by applications.
+ */
+typedef struct asn_TYPE_operation_s {
+    asn_struct_free_f *free_struct;     /* Free the structure */
+    asn_struct_print_f *print_struct;   /* Human readable output */
+    asn_struct_compare_f *compare_struct; /* Compare two structures */
+    ber_type_decoder_f *ber_decoder;      /* Generic BER decoder */
+    der_type_encoder_f *der_encoder;      /* Canonical DER encoder */
+    xer_type_decoder_f *xer_decoder;      /* Generic XER decoder */
+    xer_type_encoder_f *xer_encoder;      /* [Canonical] XER encoder */
+    oer_type_decoder_f *oer_decoder;      /* Generic OER decoder */
+    oer_type_encoder_f *oer_encoder;      /* Canonical OER encoder */
+    per_type_decoder_f *uper_decoder;     /* Unaligned PER decoder */
+    per_type_encoder_f *uper_encoder;     /* Unaligned PER encoder */
+    per_type_decoder_f *aper_decoder;     /* Aligned PER decoder */
+    per_type_encoder_f *aper_encoder;     /* Aligned PER encoder */
+    asn_random_fill_f *random_fill;       /* Initialize with a random value */
+    asn_outmost_tag_f *outmost_tag;       /* <optional, internal> */
+} asn_TYPE_operation_t;
+
+/*
+ * A constraints tuple specifying both the OER and PER constraints.
+ */
+typedef struct asn_encoding_constraints_s {
+    const struct asn_oer_constraints_s *oer_constraints;
+    const struct asn_per_constraints_s *per_constraints;
+    asn_constr_check_f *general_constraints;
+} asn_encoding_constraints_t;
+
+/*
+ * The definitive description of the destination language's structure.
+ */
+typedef struct asn_TYPE_descriptor_s {
+    const char *name;       /* A name of the ASN.1 type. "" in some cases. */
+    const char *xml_tag;    /* Name used in XML tag */
+
+    /*
+     * Generalized functions for dealing with the specific type.
+     * May be directly invoked by applications.
+     */
+    asn_TYPE_operation_t *op;
+
+    /***********************************************************************
+     * Internally useful members. Not to be used by applications directly. *
+     **********************************************************************/
+
+    /*
+     * Tags that are expected to occur.
+     */
+    const ber_tlv_tag_t *tags;      /* Effective tags sequence for this type */
+    unsigned tags_count;            /* Number of tags which are expected */
+    const ber_tlv_tag_t *all_tags;  /* Every tag for BER/containment */
+    unsigned all_tags_count;        /* Number of tags */
+
+    /* OER, PER, and general constraints */
+    asn_encoding_constraints_t encoding_constraints;
+
+    /*
+     * An ASN.1 production type members (members of SEQUENCE, SET, CHOICE).
+     */
+    struct asn_TYPE_member_s *elements;
+    unsigned elements_count;
+
+    /*
+     * Additional information describing the type, used by appropriate
+     * functions above.
+     */
+    const void *specifics;
+} asn_TYPE_descriptor_t;
+
+/*
+ * This type describes an element of the constructed type,
+ * i.e. SEQUENCE, SET, CHOICE, etc.
+ */
+  enum asn_TYPE_flags_e {
+    ATF_NOFLAGS,
+    ATF_POINTER = 0x01,   /* Represented by the pointer */
+    ATF_OPEN_TYPE = 0x02, /* Open Type */
+    ATF_ANY_TYPE = 0x04   /* ANY type (deprecated!) */
+  };
+typedef struct asn_TYPE_member_s {
+    enum asn_TYPE_flags_e flags; /* Element's presentation flags */
+    unsigned optional;      /* Following optional members, including current */
+    unsigned memb_offset;   /* Offset of the element */
+    ber_tlv_tag_t tag;      /* Outmost (most immediate) tag */
+    int tag_mode;           /* IMPLICIT/no/EXPLICIT tag at current level */
+    asn_TYPE_descriptor_t *type;            /* Member type descriptor */
+    asn_type_selector_f *type_selector;     /* IoS runtime type selector */
+    asn_encoding_constraints_t encoding_constraints;
+    int (*default_value_cmp)(const void *sptr); /* Compare DEFAULT <value> */
+    int (*default_value_set)(void **sptr);      /* Set DEFAULT <value> */
+    const char *name; /* ASN.1 identifier of the element */
+} asn_TYPE_member_t;
+
+/*
+ * BER tag to element number mapping.
+ */
+typedef struct asn_TYPE_tag2member_s {
+    ber_tlv_tag_t el_tag;   /* Outmost tag of the member */
+    unsigned el_no;         /* Index of the associated member, base 0 */
+    int toff_first;         /* First occurence of the el_tag, relative */
+    int toff_last;          /* Last occurence of the el_tag, relative */
+} asn_TYPE_tag2member_t;
+
+/*
+ * This function prints out the contents of the target language's structure
+ * (struct_ptr) into the file pointer (stream) in human readable form.
+ * RETURN VALUES:
+ * 	 0: The structure is printed.
+ * 	-1: Problem dumping the structure.
+ * (See also xer_fprint() in xer_encoder.h)
+ */
+int asn_fprint(FILE *stream, /* Destination stream descriptor */
+               const asn_TYPE_descriptor_t *td, /* ASN.1 type descriptor */
+               const void *struct_ptr);         /* Structure to be printed */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _CONSTR_TYPE_H_ */
diff --git a/src/s1ap/asn1c/asnGenFiles/constraints.h b/src/s1ap/asn1c/asnGenFiles/constraints.h
new file mode 100644
index 0000000..0bd86a9
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/constraints.h
@@ -0,0 +1,62 @@
+/*-
+ * Copyright (c) 2004-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+#ifndef	ASN1_CONSTRAINTS_VALIDATOR_H
+#define	ASN1_CONSTRAINTS_VALIDATOR_H
+
+#include <asn_system.h>		/* Platform-dependent types */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct asn_TYPE_descriptor_s;		/* Forward declaration */
+
+/*
+ * Validate the structure according to the ASN.1 constraints.
+ * If errbuf and errlen are given, they shall be pointing to the appropriate
+ * buffer space and its length before calling this function. Alternatively,
+ * they could be passed as NULL's. If constraints validation fails,
+ * errlen will contain the actual number of bytes taken from the errbuf
+ * to encode an error message (properly 0-terminated).
+ * 
+ * RETURN VALUES:
+ * This function returns 0 in case all ASN.1 constraints are met
+ * and -1 if one or more constraints were failed.
+ */
+int asn_check_constraints(
+    const struct asn_TYPE_descriptor_s *type_descriptor,
+    const void *struct_ptr, /* Target language's structure */
+    char *errbuf,           /* Returned error description */
+    size_t *errlen          /* Length of the error description */
+);
+
+
+/*
+ * Generic type for constraint checking callback,
+ * associated with every type descriptor.
+ */
+typedef int(asn_constr_check_f)(
+    const struct asn_TYPE_descriptor_s *type_descriptor, const void *struct_ptr,
+    asn_app_constraint_failed_f *optional_callback, /* Log the error */
+    void *optional_app_key /* Opaque key passed to a callback */
+);
+
+/*******************************
+ * INTERNALLY USEFUL FUNCTIONS *
+ *******************************/
+
+asn_constr_check_f asn_generic_no_constraint;	/* No constraint whatsoever */
+asn_constr_check_f asn_generic_unknown_constraint; /* Not fully supported */
+
+/*
+ * Invoke the callback with a complete error message.
+ */
+#define	ASN__CTFAIL	if(ctfailcb) ctfailcb
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* ASN1_CONSTRAINTS_VALIDATOR_H */
diff --git a/src/s1ap/asn1c/asnGenFiles/converter-example.mk b/src/s1ap/asn1c/asnGenFiles/converter-example.mk
new file mode 100644
index 0000000..d062e7e
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/converter-example.mk
@@ -0,0 +1,32 @@
+include Makefile.am.libasncodec
+
+LIBS += -lm
+CFLAGS += $(ASN_MODULE_CFLAGS) -DPDU=S1AP_PDU -I.
+ASN_LIBRARY ?= libasncodec.a
+ASN_PROGRAM ?= converter-example
+ASN_PROGRAM_SRCS ?= \
+	converter-example.c
+
+all: $(ASN_PROGRAM)
+
+$(ASN_PROGRAM): $(ASN_LIBRARY) $(ASN_PROGRAM_SRCS:.c=.o)
+	$(CC) $(CFLAGS) $(CPPFLAGS) -o $(ASN_PROGRAM) $(ASN_PROGRAM_SRCS:.c=.o) $(LDFLAGS) $(ASN_LIBRARY) $(LIBS)
+
+$(ASN_LIBRARY): $(ASN_MODULE_SRCS:.c=.o)
+	$(AR) rcs $@ $(ASN_MODULE_SRCS:.c=.o)
+
+.SUFFIXES:
+.SUFFIXES: .c .o
+
+.c.o:
+	$(CC) $(CFLAGS) -o $@ -c $<
+
+clean:
+	rm -f $(ASN_PROGRAM) $(ASN_LIBRARY)
+	rm -f $(ASN_MODULE_SRCS:.c=.o) $(ASN_PROGRAM_SRCS:.c=.o)
+
+regen: regenerate-from-asn1-source
+
+regenerate-from-asn1-source:
+	asn1c -fcompound-names -fno-include-deps -gen-PER -findirect-choice -pdu=S1AP-PDU ./asn1c/S1AP-CommonDataTypes.asn ./asn1c/S1AP-Constants.asn ./asn1c/S1AP-Containers.asn ./asn1c/S1AP-IEs.asn ./asn1c/S1AP-PDU-Contents.asn ./asn1c/S1AP-PDU-Descriptions.asn
+
diff --git a/src/s1ap/asn1c/asnGenFiles/der_encoder.h b/src/s1ap/asn1c/asnGenFiles/der_encoder.h
new file mode 100644
index 0000000..e93944e
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/der_encoder.h
@@ -0,0 +1,68 @@
+/*-
+ * Copyright (c) 2003-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+#ifndef	_DER_ENCODER_H_
+#define	_DER_ENCODER_H_
+
+#include <asn_application.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct asn_TYPE_descriptor_s;	/* Forward declaration */
+
+/*
+ * The DER encoder of any type. May be invoked by the application.
+ * Produces DER- and BER-compliant encoding. (DER is a subset of BER).
+ *
+ * NOTE: Use the ber_decode() function (ber_decoder.h) to decode data
+ * produced by der_encode().
+ */
+asn_enc_rval_t der_encode(const struct asn_TYPE_descriptor_s *type_descriptor,
+                          const void *struct_ptr, /* Structure to be encoded */
+                          asn_app_consume_bytes_f *consume_bytes_cb,
+                          void *app_key /* Arbitrary callback argument */
+);
+
+/* A variant of der_encode() which encodes data into the pre-allocated buffer */
+asn_enc_rval_t der_encode_to_buffer(
+    const struct asn_TYPE_descriptor_s *type_descriptor,
+    const void *struct_ptr, /* Structure to be encoded */
+    void *buffer,           /* Pre-allocated buffer */
+    size_t buffer_size      /* Initial buffer size (maximum) */
+);
+
+/*
+ * Type of the generic DER encoder.
+ */
+typedef asn_enc_rval_t(der_type_encoder_f)(
+    const struct asn_TYPE_descriptor_s *type_descriptor,
+    const void *struct_ptr, /* Structure to be encoded */
+    int tag_mode,           /* {-1,0,1}: IMPLICIT, no, EXPLICIT */
+    ber_tlv_tag_t tag, asn_app_consume_bytes_f *consume_bytes_cb, /* Callback */
+    void *app_key /* Arbitrary callback argument */
+);
+
+
+/*******************************
+ * INTERNALLY USEFUL FUNCTIONS *
+ *******************************/
+
+/*
+ * Write out leading TL[v] sequence according to the type definition.
+ */
+ssize_t der_write_tags(const struct asn_TYPE_descriptor_s *type_descriptor,
+                       size_t struct_length,
+                       int tag_mode,      /* {-1,0,1}: IMPLICIT, no, EXPLICIT */
+                       int last_tag_form, /* {0,!0}: prim, constructed */
+                       ber_tlv_tag_t tag,
+                       asn_app_consume_bytes_f *consume_bytes_cb,
+                       void *app_key);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _DER_ENCODER_H_ */
diff --git a/src/s1ap/asn1c/asnGenFiles/libasncodec.a b/src/s1ap/asn1c/asnGenFiles/libasncodec.a
new file mode 100644
index 0000000..4f82353
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/libasncodec.a
Binary files differ
diff --git a/src/s1ap/asn1c/asnGenFiles/oer_decoder.h b/src/s1ap/asn1c/asnGenFiles/oer_decoder.h
new file mode 100644
index 0000000..40992e9
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/oer_decoder.h
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+#ifndef	OER_DECODER_H
+#define	OER_DECODER_H
+
+#include <asn_application.h>
+#include <oer_support.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct asn_TYPE_descriptor_s;	/* Forward declaration */
+struct asn_codec_ctx_s;		/* Forward declaration */
+
+/*
+ * The Octet Encoding Rules (OER, X.696 08/2015) decoder for any given type.
+ * This function may be invoked directly by the application.
+ * Parses CANONICAL-OER and BASIC-OER.
+ */
+asn_dec_rval_t oer_decode(const struct asn_codec_ctx_s *opt_codec_ctx,
+	const struct asn_TYPE_descriptor_s *type_descriptor,
+	void **struct_ptr,	/* Pointer to a target structure's pointer */
+	const void *buffer,	/* Data to be decoded */
+	size_t size		/* Size of that buffer */
+	);
+
+/*
+ * Type of generic function which decodes the byte stream into the structure.
+ */
+typedef asn_dec_rval_t(oer_type_decoder_f)(
+    const struct asn_codec_ctx_s *opt_codec_ctx,
+    const struct asn_TYPE_descriptor_s *type_descriptor,
+    const asn_oer_constraints_t *constraints,
+    void **struct_ptr,
+    const void *buf_ptr,
+    size_t size);
+
+/*
+ * Swallow the Open Type (X.696 (08/2015), #30) into /dev/null.
+ * RETURN VALUES:
+ *      -1:     Fatal error deciphering length.
+ *       0:     More data expected than bufptr contains.
+ *      >0:     Number of bytes used from bufptr.
+ */
+ssize_t oer_open_type_skip(const void *bufptr, size_t size);
+
+/*
+ * Read the Open Type (X.696 (08/2015), #30).
+ * RETURN VALUES:
+ *       0:     More data expected than bufptr contains.
+ *      -1:     Fatal error deciphering length.
+ *      >0:     Number of bytes used from bufptr.
+ */
+ssize_t oer_open_type_get(const asn_codec_ctx_t *opt_codec_ctx,
+                          const struct asn_TYPE_descriptor_s *td,
+                          const asn_oer_constraints_t *constraints,
+                          void **struct_ptr, const void *bufptr, size_t size);
+
+/*
+ * Length-prefixed buffer decoding for primitive types.
+ */
+oer_type_decoder_f oer_decode_primitive;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* OER_DECODER_H */
diff --git a/src/s1ap/asn1c/asnGenFiles/oer_encoder.h b/src/s1ap/asn1c/asnGenFiles/oer_encoder.h
new file mode 100644
index 0000000..6a7b681
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/oer_encoder.h
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+#ifndef	OER_ENCODER_H
+#define	OER_ENCODER_H
+
+#include <asn_application.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct asn_TYPE_descriptor_s;	/* Forward declaration */
+
+/*
+ * The Octet Encoding Rules (OER, X.696 08/2015) encoder for any type.
+ * This function may be invoked directly by the application.
+ * Produces CANONICAL-OER output compatible with CANONICAL-OER
+ * and BASIC-OER decoders.
+ */
+asn_enc_rval_t oer_encode(const struct asn_TYPE_descriptor_s *type_descriptor,
+                          const void *struct_ptr, /* Structure to be encoded */
+                          asn_app_consume_bytes_f *consume_bytes_cb,
+                          void *app_key /* Arbitrary callback argument */
+);
+
+/* A variant of oer_encode() which encodes data into the pre-allocated buffer */
+asn_enc_rval_t oer_encode_to_buffer(
+    const struct asn_TYPE_descriptor_s *type_descriptor,
+    const asn_oer_constraints_t *constraints,
+    const void *struct_ptr, /* Structure to be encoded */
+    void *buffer,           /* Pre-allocated buffer */
+    size_t buffer_size      /* Initial buffer size (maximum) */
+);
+
+/*
+ * Type of the generic OER encoder.
+ */
+typedef asn_enc_rval_t(oer_type_encoder_f)(
+    const struct asn_TYPE_descriptor_s *type_descriptor,
+    const asn_oer_constraints_t *constraints,
+    const void *struct_ptr,                    /* Structure to be encoded */
+    asn_app_consume_bytes_f *consume_bytes_cb, /* Callback */
+    void *app_key                              /* Arbitrary callback argument */
+);
+
+/*
+ * Write out the Open Type (X.696 (08/2015), #30).
+ * RETURN VALUES:
+ *  -1: Fatal error encoding the type.
+ *  >0: Number of bytes serialized.
+ */
+ssize_t oer_open_type_put(const struct asn_TYPE_descriptor_s *td,
+                          const asn_oer_constraints_t *constraints,
+                          const void *struct_ptr,
+                          asn_app_consume_bytes_f *consume_bytes_cb,
+                          void *app_key);
+
+
+/*
+ * Length-prefixed buffer encoding for primitive types.
+ */
+oer_type_encoder_f oer_encode_primitive;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* OER_ENCODER_H */
diff --git a/src/s1ap/asn1c/asnGenFiles/oer_support.h b/src/s1ap/asn1c/asnGenFiles/oer_support.h
new file mode 100644
index 0000000..dbc9b5f
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/oer_support.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+#ifndef	OER_SUPPORT_H
+#define	OER_SUPPORT_H
+
+#include <asn_system.h>		/* Platform-specific types */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Pre-computed OER constraints.
+ */
+typedef struct asn_oer_constraint_number_s {
+    unsigned width;    /* ±8,4,2,1 fixed bytes */
+    unsigned positive; /* 1 for unsigned number, 0 for signed */
+} asn_oer_constraint_number_t;
+typedef struct asn_oer_constraints_s {
+    asn_oer_constraint_number_t value;
+    ssize_t size;    /* -1 (no constraint) or >= 0 */
+} asn_oer_constraints_t;
+
+
+/*
+ * Fetch the length determinant (X.696 (08/2015), #8.6) into *len_r.
+ * RETURN VALUES:
+ *       0:     More data expected than bufptr contains.
+ *      -1:     Fatal error deciphering length.
+ *      >0:     Number of bytes used from bufptr.
+ */
+ssize_t oer_fetch_length(const void *bufptr, size_t size, size_t *len_r);
+
+/*
+ * Serialize OER length. Returns the number of bytes serialized
+ * or -1 if a given callback returned with negative result.
+ */
+ssize_t oer_serialize_length(size_t length, asn_app_consume_bytes_f *cb, void *app_key);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* OER_SUPPORT_H */
diff --git a/src/s1ap/asn1c/asnGenFiles/per_decoder.h b/src/s1ap/asn1c/asnGenFiles/per_decoder.h
new file mode 100644
index 0000000..eea474a
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/per_decoder.h
@@ -0,0 +1,82 @@
+/*-
+ * Copyright (c) 2005-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+#ifndef	_PER_DECODER_H_
+#define	_PER_DECODER_H_
+
+#include <asn_application.h>
+#include <per_support.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct asn_TYPE_descriptor_s;	/* Forward declaration */
+
+/*
+ * Unaligned PER decoder of a "complete encoding" as per X.691 (08/2015) #11.1.
+ * On success, this call always returns (.consumed >= 1), as per #11.1.3.
+ */
+asn_dec_rval_t uper_decode_complete(
+    const struct asn_codec_ctx_s *opt_codec_ctx,
+    const struct asn_TYPE_descriptor_s *type_descriptor, /* Type to decode */
+    void **struct_ptr,  /* Pointer to a target structure's pointer */
+    const void *buffer, /* Data to be decoded */
+    size_t size         /* Size of data buffer */
+);
+
+/*
+ * Unaligned PER decoder of any ASN.1 type. May be invoked by the application.
+ * WARNING: This call returns the number of BITS read from the stream. Beware.
+ */
+asn_dec_rval_t uper_decode(
+    const struct asn_codec_ctx_s *opt_codec_ctx,
+    const struct asn_TYPE_descriptor_s *type_descriptor, /* Type to decode */
+    void **struct_ptr,  /* Pointer to a target structure's pointer */
+    const void *buffer, /* Data to be decoded */
+    size_t size,        /* Size of the input data buffer, in bytes */
+    int skip_bits,      /* Number of unused leading bits, 0..7 */
+    int unused_bits     /* Number of unused tailing bits, 0..7 */
+);
+
+/*
+ * Aligned PER decoder of a "complete encoding" as per X.691#10.1.
+ * On success, this call always returns (.consumed >= 1), in BITS, as per X.691#10.1.3.
+ */
+asn_dec_rval_t aper_decode_complete(
+       const struct asn_codec_ctx_s *opt_codec_ctx,
+       const struct asn_TYPE_descriptor_s *type_descriptor,	/* Type to decode */
+       void **struct_ptr,	/* Pointer to a target structure's pointer */
+       const void *buffer,	/* Data to be decoded */
+       size_t size		/* Size of data buffer */
+									);
+
+/*
+ * Aligned PER decoder of any ASN.1 type. May be invoked by the application.
+ * WARNING: This call returns the number of BITS read from the stream. Beware.
+ */
+asn_dec_rval_t aper_decode(
+      const struct asn_codec_ctx_s *opt_codec_ctx,
+      const struct asn_TYPE_descriptor_s *type_descriptor,	/* Type to decode */
+      void **struct_ptr,	/* Pointer to a target structure's pointer */
+      const void *buffer,	/* Data to be decoded */
+      size_t size,		/* Size of data buffer */
+      int skip_bits,		/* Number of unused leading bits, 0..7 */
+      int unused_bits		/* Number of unused tailing bits, 0..7 */
+      );
+
+/*
+ * Type of the type-specific PER decoder function.
+ */
+typedef asn_dec_rval_t(per_type_decoder_f)(
+    const asn_codec_ctx_t *opt_codec_ctx,
+    const struct asn_TYPE_descriptor_s *type_descriptor,
+    const asn_per_constraints_t *constraints, void **struct_ptr,
+    asn_per_data_t *per_data);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _PER_DECODER_H_ */
diff --git a/src/s1ap/asn1c/asnGenFiles/per_encoder.h b/src/s1ap/asn1c/asnGenFiles/per_encoder.h
new file mode 100644
index 0000000..b615ef0
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/per_encoder.h
@@ -0,0 +1,93 @@
+/*-
+ * Copyright (c) 2006-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+#ifndef	_PER_ENCODER_H_
+#define	_PER_ENCODER_H_
+
+#include <asn_application.h>
+#include <per_support.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct asn_TYPE_descriptor_s;	/* Forward declaration */
+
+/*
+ * Unaligned PER encoder of any ASN.1 type. May be invoked by the application.
+ * WARNING: This function returns the number of encoded bits in the .encoded
+ * field of the return value. Use the following formula to convert to bytes:
+ * 	bytes = ((.encoded + 7) / 8)
+ */
+asn_enc_rval_t uper_encode(
+    const struct asn_TYPE_descriptor_s *type_descriptor,
+    const asn_per_constraints_t *constraints,
+    const void *struct_ptr,                    /* Structure to be encoded */
+    asn_app_consume_bytes_f *consume_bytes_cb, /* Data collector */
+    void *app_key                              /* Arbitrary callback argument */
+);
+
+asn_enc_rval_t aper_encode(
+    const struct asn_TYPE_descriptor_s *type_descriptor,
+    const asn_per_constraints_t *constraints,
+    const void *struct_ptr,                     /* Structure to be encoded */
+    asn_app_consume_bytes_f *consume_bytes_cb,  /* Data collector */
+    void *app_key                               /* Arbitrary callback argument */
+);
+
+/*
+ * A variant of uper_encode() which encodes data into the existing buffer
+ * WARNING: This function returns the number of encoded bits in the .encoded
+ * field of the return value.
+ */
+asn_enc_rval_t uper_encode_to_buffer(
+    const struct asn_TYPE_descriptor_s *type_descriptor,
+    const asn_per_constraints_t *constraints,
+    const void *struct_ptr, /* Structure to be encoded */
+    void *buffer,           /* Pre-allocated buffer */
+    size_t buffer_size      /* Initial buffer size (max) */
+);
+
+asn_enc_rval_t aper_encode_to_buffer(
+    const struct asn_TYPE_descriptor_s *type_descriptor,
+    const asn_per_constraints_t *constraints,
+    const void *struct_ptr,  /* Structure to be encoded */
+    void *buffer,            /* Pre-allocated buffer */
+    size_t buffer_size       /* Initial buffer size (max) */
+);
+/*
+ * A variant of uper_encode_to_buffer() which allocates buffer itself.
+ * Returns the number of bytes in the buffer or -1 in case of failure.
+ * WARNING: This function produces a "Production of the complete encoding",
+ * with length of at least one octet. Contrast this to precise bit-packing
+ * encoding of uper_encode() and uper_encode_to_buffer().
+ */
+ssize_t uper_encode_to_new_buffer(
+    const struct asn_TYPE_descriptor_s *type_descriptor,
+    const asn_per_constraints_t *constraints,
+    const void *struct_ptr, /* Structure to be encoded */
+    void **buffer_r         /* Buffer allocated and returned */
+);
+
+ssize_t
+aper_encode_to_new_buffer(
+    const struct asn_TYPE_descriptor_s *td,
+    const asn_per_constraints_t *constraints,
+    const void *sptr,
+    void **buffer_r
+);
+
+/*
+ * Type of the generic PER encoder function.
+ */
+typedef asn_enc_rval_t(per_type_encoder_f)(
+    const struct asn_TYPE_descriptor_s *type_descriptor,
+    const asn_per_constraints_t *constraints, const void *struct_ptr,
+    asn_per_outp_t *per_output);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _PER_ENCODER_H_ */
diff --git a/src/s1ap/asn1c/asnGenFiles/per_opentype.h b/src/s1ap/asn1c/asnGenFiles/per_opentype.h
new file mode 100644
index 0000000..1493b2d
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/per_opentype.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2007-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+#ifndef	_PER_OPENTYPE_H_
+#define	_PER_OPENTYPE_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+asn_dec_rval_t uper_open_type_get(const asn_codec_ctx_t *opt_codec_ctx,
+                                  const asn_TYPE_descriptor_t *td,
+                                  const asn_per_constraints_t *constraints,
+                                  void **sptr, asn_per_data_t *pd);
+
+int uper_open_type_skip(const asn_codec_ctx_t *opt_codec_ctx,
+                        asn_per_data_t *pd);
+
+/*
+ * X.691 (2015/08), #11.2
+ * Returns -1 if error is encountered. 0 if all OK.
+ */
+int uper_open_type_put(const asn_TYPE_descriptor_t *td,
+                       const asn_per_constraints_t *constraints,
+                       const void *sptr, asn_per_outp_t *po);
+
+asn_dec_rval_t aper_open_type_get(const asn_codec_ctx_t *opt_codec_ctx,
+                                  const asn_TYPE_descriptor_t *td,
+                                  const asn_per_constraints_t *constraints,
+                                  void **sptr, asn_per_data_t *pd);
+
+
+int aper_open_type_skip(const asn_codec_ctx_t *opt_codec_ctx, asn_per_data_t *pd);
+
+int aper_open_type_put(const asn_TYPE_descriptor_t *td,
+                       const asn_per_constraints_t *constraints,
+                       const void *sptr, asn_per_outp_t *po);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _PER_OPENTYPE_H_ */
diff --git a/src/s1ap/asn1c/asnGenFiles/per_support.h b/src/s1ap/asn1c/asnGenFiles/per_support.h
new file mode 100644
index 0000000..d13f504
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/per_support.h
@@ -0,0 +1,130 @@
+/*
+ * Copyright (c) 2005-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+#ifndef	_PER_SUPPORT_H_
+#define	_PER_SUPPORT_H_
+
+#include <asn_system.h>		/* Platform-specific types */
+#include <asn_bit_data.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Pre-computed PER constraints.
+ */
+typedef struct asn_per_constraint_s {
+	enum asn_per_constraint_flags {
+		APC_UNCONSTRAINED	= 0x0,	/* No PER visible constraints */
+		APC_SEMI_CONSTRAINED	= 0x1,	/* Constrained at "lb" */
+		APC_CONSTRAINED		= 0x2,	/* Fully constrained */
+		APC_EXTENSIBLE		= 0x4	/* May have extension */
+	} flags;
+	int  range_bits;		/* Full number of bits in the range */
+	int  effective_bits;		/* Effective bits */
+	intmax_t lower_bound;		/* "lb" value */
+	intmax_t upper_bound;		/* "ub" value */
+} asn_per_constraint_t;
+typedef struct asn_per_constraints_s {
+	asn_per_constraint_t value;
+	asn_per_constraint_t size;
+	int (*value2code)(unsigned int value);
+	int (*code2value)(unsigned int code);
+} asn_per_constraints_t;
+
+/* Temporary compatibility layer. Will get removed. */
+typedef struct asn_bit_data_s asn_per_data_t;
+#define per_get_few_bits(data, bits)   asn_get_few_bits(data, bits)
+#define per_get_undo(data, bits)   asn_get_undo(data, bits)
+#define per_get_many_bits(data, dst, align, bits) \
+    asn_get_many_bits(data, dst, align, bits)
+
+/*
+ * X.691 (08/2015) #11.9 "General rules for encoding a length determinant"
+ * Get the length "n" from the Unaligned PER stream.
+ */
+ssize_t uper_get_length(asn_per_data_t *pd, int effective_bound_bits,
+                        size_t lower_bound, int *repeat);
+
+ssize_t aper_get_length(asn_per_data_t *pd, int range,
+                        int effective_bound_bits, int *repeat);
+
+/*
+ * Get the normally small length "n".
+ */
+ssize_t uper_get_nslength(asn_per_data_t *pd);
+ssize_t aper_get_nslength(asn_per_data_t *pd);
+
+/*
+ * Get the normally small non-negative whole number.
+ */
+ssize_t uper_get_nsnnwn(asn_per_data_t *pd);
+ssize_t aper_get_nsnnwn(asn_per_data_t *pd, int range);
+
+/* X.691-2008/11, #11.5.6 */
+int uper_get_constrained_whole_number(asn_per_data_t *pd, uintmax_t *v, int nbits);
+
+
+/* Temporary compatibility layer. Will get removed. */
+typedef struct asn_bit_outp_s asn_per_outp_t;
+#define per_put_few_bits(out, bits, obits) asn_put_few_bits(out, bits, obits)
+#define per_put_many_bits(out, src, nbits) asn_put_many_bits(out, src, nbits)
+#define per_put_aligned_flush(out) asn_put_aligned_flush(out)
+
+
+/*
+ * Rebase the given value as an offset into the range specified by the
+ * lower bound (lb) and upper bound (ub).
+ * RETURN VALUES:
+ *  -1: Conversion failed due to range problems.
+ *   0: Conversion was successful.
+ */
+int per_long_range_rebase(long, intmax_t lb, intmax_t ub, unsigned long *output);
+int per_imax_range_rebase(intmax_t v, intmax_t lb, intmax_t ub, uintmax_t *output);
+/* The inverse operation: restores the value by the offset and its bounds. */
+int per_long_range_unrebase(unsigned long inp, intmax_t lb, intmax_t ub, long *outp);
+int per_imax_range_unrebase(uintmax_t inp, intmax_t lb, intmax_t ub, intmax_t *outp);
+
+/* X.691-2008/11, #11.5 */
+int uper_put_constrained_whole_number_u(asn_per_outp_t *po, unsigned long v, int nbits);
+
+/*
+ * X.691 (08/2015) #11.9 "General rules for encoding a length determinant"
+ * Put the length "whole_length" to the Unaligned PER stream.
+ * If (opt_need_eom) is given, it will be set to 1 if final 0-length is needed.
+ * In that case, invoke uper_put_length(po, 0, 0) after encoding the last block.
+ * This function returns the number of units which may be flushed
+ * in the next units saving iteration.
+ */
+ssize_t uper_put_length(asn_per_outp_t *po, size_t whole_length,
+                        int *opt_need_eom);
+
+ssize_t aper_put_length(asn_per_outp_t *po, int range, size_t length,
+                        int *opt_need_eom);
+
+/* Align the current bit position to octet bundary */
+int aper_put_align(asn_per_outp_t *po);
+int32_t aper_get_align(asn_per_data_t *pd);
+
+/*
+ * Put the normally small length "n" to the Unaligned PER stream.
+ * Returns 0 or -1.
+ */
+int uper_put_nslength(asn_per_outp_t *po, size_t length);
+
+int aper_put_nslength(asn_per_outp_t *po, size_t length);
+
+/*
+ * Put the normally small non-negative whole number.
+ */
+int uper_put_nsnnwn(asn_per_outp_t *po, int n);
+
+int aper_put_nsnnwn(asn_per_outp_t *po, int range, int number);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _PER_SUPPORT_H_ */
diff --git a/src/s1ap/asn1c/asnGenFiles/s1ap-converter b/src/s1ap/asn1c/asnGenFiles/s1ap-converter
new file mode 100644
index 0000000..4f24298
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/s1ap-converter
Binary files differ
diff --git a/src/s1ap/asn1c/asnGenFiles/xer_decoder.h b/src/s1ap/asn1c/asnGenFiles/xer_decoder.h
new file mode 100644
index 0000000..b951c41
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/xer_decoder.h
@@ -0,0 +1,106 @@
+/*-
+ * Copyright (c) 2004-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+#ifndef	_XER_DECODER_H_
+#define	_XER_DECODER_H_
+
+#include <asn_application.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct asn_TYPE_descriptor_s;	/* Forward declaration */
+
+/*
+ * The XER decoder of any ASN.1 type. May be invoked by the application.
+ * Decodes CANONICAL-XER and BASIC-XER.
+ */
+asn_dec_rval_t xer_decode(
+    const struct asn_codec_ctx_s *opt_codec_ctx,
+    const struct asn_TYPE_descriptor_s *type_descriptor,
+    void **struct_ptr,  /* Pointer to a target structure's pointer */
+    const void *buffer, /* Data to be decoded */
+    size_t size         /* Size of data buffer */
+);
+
+/*
+ * Type of the type-specific XER decoder function.
+ */
+typedef asn_dec_rval_t(xer_type_decoder_f)(
+    const asn_codec_ctx_t *opt_codec_ctx,
+    const struct asn_TYPE_descriptor_s *type_descriptor, void **struct_ptr,
+    const char *opt_mname, /* Member name */
+    const void *buf_ptr, size_t size);
+
+/*******************************
+ * INTERNALLY USEFUL FUNCTIONS *
+ *******************************/
+
+/*
+ * Generalized function for decoding the primitive values.
+ * Used by more specialized functions, such as OCTET_STRING_decode_xer_utf8
+ * and others. This function should not be used by applications, as its API
+ * is subject to changes.
+ */
+asn_dec_rval_t xer_decode_general(
+    const asn_codec_ctx_t *opt_codec_ctx,
+    asn_struct_ctx_t *ctx, /* Type decoder context */
+    void *struct_key,      /* Treated as opaque pointer */
+    const char *xml_tag,   /* Expected XML tag name */
+    const void *buf_ptr, size_t size,
+    int (*opt_unexpected_tag_decoder)(void *struct_key, const void *chunk_buf,
+                                      size_t chunk_size),
+    ssize_t (*body_receiver)(void *struct_key, const void *chunk_buf,
+                             size_t chunk_size, int have_more));
+
+
+/*
+ * Fetch the next XER (XML) token from the stream.
+ * The function returns the number of bytes occupied by the chunk type,
+ * returned in the _ch_type. The _ch_type is only set (and valid) when
+ * the return value is >= 0.
+ */
+  typedef enum pxer_chunk_type {
+	PXER_WMORE,     /* Chunk type is not clear, more data expected. */
+	PXER_TAG,	    /* Complete XER tag */
+	PXER_TEXT,	    /* Plain text between XER tags */
+	PXER_COMMENT	/* A comment, may be part of */
+  } pxer_chunk_type_e;
+ssize_t xer_next_token(int *stateContext,
+	const void *buffer, size_t size, pxer_chunk_type_e *_ch_type);
+
+/*
+ * This function checks the buffer against the tag name is expected to occur.
+ */
+  typedef enum xer_check_tag {
+	XCT_BROKEN	= 0,	/* The tag is broken */
+	XCT_OPENING	= 1,	/* This is the <opening> tag */
+	XCT_CLOSING	= 2,	/* This is the </closing> tag */
+	XCT_BOTH	= 3,	/* This is the <modified/> tag */
+	XCT__UNK__MASK	= 4,	/* Mask of everything unexpected */
+	XCT_UNKNOWN_OP	= 5,	/* Unexpected <opening> tag */
+	XCT_UNKNOWN_CL	= 6,	/* Unexpected </closing> tag */
+	XCT_UNKNOWN_BO	= 7	/* Unexpected <modified/> tag */
+  } xer_check_tag_e;
+xer_check_tag_e xer_check_tag(const void *buf_ptr, int size,
+		const char *need_tag);
+
+/*
+ * Get the number of bytes consisting entirely of XER whitespace characters.
+ * RETURN VALUES:
+ * >=0:	Number of whitespace characters in the string.
+ */
+size_t xer_whitespace_span(const void *chunk_buf, size_t chunk_size);
+
+/*
+ * Skip the series of anticipated extensions.
+ */
+int xer_skip_unknown(xer_check_tag_e tcv, ber_tlv_len_t *depth);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _XER_DECODER_H_ */
diff --git a/src/s1ap/asn1c/asnGenFiles/xer_encoder.h b/src/s1ap/asn1c/asnGenFiles/xer_encoder.h
new file mode 100644
index 0000000..9d75922
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/xer_encoder.h
@@ -0,0 +1,83 @@
+/*-
+ * Copyright (c) 2004-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+#ifndef	_XER_ENCODER_H_
+#define	_XER_ENCODER_H_
+
+#include <asn_application.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct asn_TYPE_descriptor_s;	/* Forward declaration */
+
+/* Flags used by the xer_encode() and (*xer_type_encoder_f), defined below */
+enum xer_encoder_flags_e {
+	/* Mode of encoding */
+	XER_F_BASIC	= 0x01,	/* BASIC-XER (pretty-printing) */
+	XER_F_CANONICAL	= 0x02	/* Canonical XER (strict rules) */
+};
+
+/*
+ * The XER encoder of any type. May be invoked by the application.
+ * Produces CANONICAL-XER and BASIC-XER depending on the (xer_flags).
+ */
+asn_enc_rval_t xer_encode(const struct asn_TYPE_descriptor_s *type_descriptor,
+                          const void *struct_ptr, /* Structure to be encoded */
+                          enum xer_encoder_flags_e xer_flags,
+                          asn_app_consume_bytes_f *consume_bytes_cb,
+                          void *app_key /* Arbitrary callback argument */
+);
+
+/*
+ * The variant of the above function which dumps the BASIC-XER (XER_F_BASIC)
+ * output into the chosen file pointer.
+ * RETURN VALUES:
+ * 	 0: The structure is printed.
+ * 	-1: Problem printing the structure.
+ * WARNING: No sensible errno value is returned.
+ */
+int xer_fprint(FILE *stream, const struct asn_TYPE_descriptor_s *td,
+               const void *struct_ptr);
+
+/*
+ * A helper function that uses XER encoding/decoding to verify that:
+ * - Both structures encode into the same BASIC XER.
+ * - Both resulting XER byte streams can be decoded back.
+ * - Both decoded structures encode into the same BASIC XER (round-trip).
+ * All of this verifies equivalence between structures and a round-trip.
+ * ARGUMENTS:
+ *  (opt_debug_stream)  - If specified, prints ongoing details.
+ */
+enum xer_equivalence_e {
+    XEQ_SUCCESS,          /* The only completely positive return value */
+    XEQ_FAILURE,          /* General failure */
+    XEQ_ENCODE1_FAILED,   /* First sructure XER encoding failed */
+    XEQ_ENCODE2_FAILED,   /* Second structure XER encoding failed */
+    XEQ_DIFFERENT,        /* Structures encoded into different XER */
+    XEQ_DECODE_FAILED,    /* Decode of the XER data failed */
+    XEQ_ROUND_TRIP_FAILED /* Bad round-trip */
+};
+enum xer_equivalence_e xer_equivalent(
+    const struct asn_TYPE_descriptor_s *type_descriptor, const void *struct1,
+    const void *struct2, FILE *opt_debug_stream);
+
+/*
+ * Type of the generic XER encoder.
+ */
+typedef asn_enc_rval_t(xer_type_encoder_f)(
+    const struct asn_TYPE_descriptor_s *type_descriptor,
+    const void *struct_ptr, /* Structure to be encoded */
+    int ilevel,             /* Level of indentation */
+    enum xer_encoder_flags_e xer_flags,
+    asn_app_consume_bytes_f *consume_bytes_cb, /* Callback */
+    void *app_key                              /* Arbitrary callback argument */
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _XER_ENCODER_H_ */
diff --git a/src/s1ap/asn1c/asnGenFiles/xer_support.h b/src/s1ap/asn1c/asnGenFiles/xer_support.h
new file mode 100644
index 0000000..c3a36e7
--- /dev/null
+++ b/src/s1ap/asn1c/asnGenFiles/xer_support.h
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2003, 2004 X/IO Labs, xiolabs.com.
+ * Copyright (c) 2003-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Redistribution and modifications are permitted subject to BSD license.
+ */
+#ifndef	_XER_SUPPORT_H_
+#define	_XER_SUPPORT_H_
+
+#include <asn_system.h>		/* Platform-specific types */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Types of data transferred to the application.
+ */
+typedef enum {
+	PXML_TEXT,	/* Plain text between XML tags. */
+	PXML_TAG,	/* A tag, starting with '<'. */
+	PXML_COMMENT,	/* An XML comment, including "<!--" and "-->". */
+	/* 
+	 * The following chunk types are reported if the chunk
+	 * terminates the specified XML element.
+	 */
+	PXML_TAG_END,		/* Tag ended */
+	PXML_COMMENT_END	/* Comment ended */
+} pxml_chunk_type_e;
+
+/*
+ * Callback function that is called by the parser when parsed data is
+ * available. The _opaque is the pointer to a field containing opaque user 
+ * data specified in pxml_create() call. The chunk type is _type and the text 
+ * data is the piece of buffer identified by _bufid (as supplied to
+ * pxml_feed() call) starting at offset _offset and of _size bytes size. 
+ * The chunk is NOT '\0'-terminated.
+ */
+typedef int (pxml_callback_f)(pxml_chunk_type_e _type,
+	const void *_chunk_data, size_t _chunk_size, void *_key);
+
+/*
+ * Parse the given buffer as it were a chunk of XML data.
+ * Invoke the specified callback each time the meaninful data is found.
+ * This function returns number of bytes consumed from the bufer.
+ * It will always be lesser than or equal to the specified _size.
+ * The next invocation of this function must account the difference.
+ */
+ssize_t pxml_parse(int *_stateContext, const void *_buf, size_t _size,
+	pxml_callback_f *cb, void *_key);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _XER_SUPPORT_H_ */
diff --git a/src/s1ap/conf/s1ap.json b/src/s1ap/conf/s1ap.json
new file mode 100644
index 0000000..48ecf11
--- /dev/null
+++ b/src/s1ap/conf/s1ap.json
@@ -0,0 +1,37 @@
+{
+	"mme": {
+		"ip_addr": "192.168.1.55",
+		"name": "vmmestandalone",
+		"group_id": 1,
+		"code": 1,
+		"__comment__": "Here is comment",
+		"mcc": {
+			"dig1": 2,
+			"dig2": 0,
+			"dig3": 8
+		},
+		"mnc": {
+			"dig1": 0,
+			"dig2": 1,
+			"dig3": -1
+		}
+	},
+	"s1ap": {
+		"s1ap_local_addr": "192.168.1.55",
+		"sctp_port": 36412,
+		"enb_addr": "127.0.0.1",
+		"enb_port": 5003,
+		"egtp_default_hostname": "sutlej.ccin.ccpu.com"
+	},
+	"s11": {
+		"egtp_local_addr": "192.168.1.55",
+		"egtp_default_port": 2123,
+		"sgw_addr": "127.0.0.1",
+		"pgw_addr": "192.168.1.105"
+	},
+	"s6a": {
+		"host_type": "freediameter",
+		"host": "hss.openair4G.eur",
+		"realm": "openair4G.eur"
+	}
+}
diff --git a/src/s1ap/conf/s1ap.json.bkup b/src/s1ap/conf/s1ap.json.bkup
new file mode 100644
index 0000000..1f8b80c
--- /dev/null
+++ b/src/s1ap/conf/s1ap.json.bkup
@@ -0,0 +1,37 @@
+{
+	"mme": {
+		"ip_addr": "192.168.1.55",
+		"name": "vmmestandalone",
+		"group_id": 1,
+		"code": 1,
+		"__comment__": "Here is comment",
+		"mcc": {
+			"dig1": 2,
+			"dig2": 0,
+			"dig3": 8
+		},
+		"mnc": {
+			"dig1": 0,
+			"dig2": 1,
+			"dig3": -1
+		}
+	},
+	"s1ap": {
+		"s1ap_local_addr": "127.0.0.1",
+		"sctp_port": 36412,
+		"enb_addr": "127.0.0.1",
+		"enb_port": 5003,
+		"egtp_default_hostname": "sutlej.ccin.ccpu.com"
+	},
+	"s11": {
+		"egtp_local_addr": "192.168.1.55",
+		"egtp_default_port": 2123,
+		"sgw_addr": "10.1.10.20",
+		"pgw_addr": "192.168.1.105"
+	},
+	"s6a": {
+		"host_type": "freediameter",
+		"host": "hss.openair4G.eur",
+		"realm": "openair4G.eur"
+	}
+}
diff --git a/src/s1ap/handlers/attach_authreq.c b/src/s1ap/handlers/attach_authreq.c
new file mode 100644
index 0000000..46981f3
--- /dev/null
+++ b/src/s1ap/handlers/attach_authreq.c
@@ -0,0 +1,224 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <pthread.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "log.h"
+#include "err_codes.h"
+#include "s1ap.h"
+#include "message_queues.h"
+#include "ipc_api.h"
+#include "main.h"
+#include "sctp_conn.h"
+#include "msgType.h"
+
+void
+buffer_copy(struct Buffer *buffer, void *value, size_t size)
+{
+	memcpy(buffer->buf + buffer->pos , value, size);
+	buffer->pos += size;
+	return;
+}
+
+/**
+* Get ProtocolIE value for Auth Request sent by mme-app
+*/
+static int
+get_authreq_protoie_value(struct proto_IE *value, struct authreq_info *g_authreqInfo)
+{
+	value->no_of_IEs = AUTH_REQ_NO_OF_IES;
+
+	value->data = (proto_IEs *) malloc(SEC_MODE_NO_OF_IES *
+			sizeof(proto_IEs));
+
+	value->data[0].val.mme_ue_s1ap_id = g_authreqInfo->ue_idx;
+	value->data[1].val.enb_ue_s1ap_id = g_authreqInfo->enb_s1ap_ue_id;
+
+	log_msg(LOG_INFO, "mme_ue_s1ap_id %d and enb_ue_s1ap_id %d\n",
+			g_authreqInfo->ue_idx, g_authreqInfo->enb_s1ap_ue_id);
+
+	/* TODO: Add enum for security header type */
+	value->data[2].val.nas.header.security_header_type = 0;
+	value->data[2].val.nas.header.proto_discriminator = EPSMobilityManagementMessages;
+	value->data[2].val.nas.header.message_type = AuthenticationRequest;
+	value->data[2].val.nas.header.nas_security_param = AUTHREQ_NAS_SECURITY_PARAM;
+
+	value->data[2].val.nas.elements = (nas_pdu_elements *)
+			malloc(AUTH_REQ_NO_OF_NAS_IES * sizeof(nas_pdu_elements));
+
+	memcpy(value->data[2].val.nas.elements[0].pduElement.rand,
+			g_authreqInfo->rand, NAS_RAND_SIZE);
+	memcpy(value->data[2].val.nas.elements[1].pduElement.autn,
+			g_authreqInfo->autn, NAS_AUTN_SIZE);
+
+
+	return SUCCESS;
+}
+
+
+/**
+* Stage specific message processing.
+*/
+static int
+authreq_processing(struct authreq_info *g_authreqInfo)
+{
+	struct Buffer g_buffer;
+	struct Buffer g_value_buffer;
+	struct Buffer g_nas_buffer;
+
+	struct s1ap_PDU s1apPDU= {0};
+
+	/* Assigning values to s1apPDU */
+	s1apPDU.procedurecode = id_downlinkNASTransport;
+	s1apPDU.criticality = CRITICALITY_IGNORE;
+
+	get_authreq_protoie_value(&s1apPDU.value, g_authreqInfo);
+
+	/* Copy values to buffer from s1apPDU */
+
+	g_buffer.pos = 0;
+
+	uint8_t initiating_message = 0; /* TODO: Add enum */
+	buffer_copy(&g_buffer, &initiating_message,
+			sizeof(initiating_message));
+
+	buffer_copy(&g_buffer, &s1apPDU.procedurecode,
+			sizeof(s1apPDU.procedurecode));
+
+	buffer_copy(&g_buffer, &s1apPDU.criticality,
+			sizeof(s1apPDU.criticality));
+
+	/* Copy values in g_value_buffer */
+	g_value_buffer.pos = 0;
+
+	/* TODO remove hardcoded values */
+	unsigned char chProtoIENo[3] = {0,0,3};
+
+	buffer_copy(&g_value_buffer, chProtoIENo, 3);
+
+	unsigned char tmpStr[4];
+	/* id-MME-UE-S1AP-ID */
+	uint16_t protocolIe_Id = id_MME_UE_S1AP_ID;
+	copyU16(tmpStr, protocolIe_Id);
+	buffer_copy(&g_value_buffer, tmpStr,
+					sizeof(protocolIe_Id));
+
+	uint8_t protocolIe_criticality = CRITICALITY_REJECT;
+	buffer_copy(&g_value_buffer, &protocolIe_criticality,
+					sizeof(protocolIe_criticality));
+
+	uint8_t datalen = 2;
+
+	/* TODO needs proper handling*/
+	unsigned char mme_ue_id[3];
+	datalen = copyU16(mme_ue_id,
+			s1apPDU.value.data[0].val.mme_ue_s1ap_id);
+	buffer_copy(&g_value_buffer, &datalen, sizeof(datalen));
+	buffer_copy(&g_value_buffer, mme_ue_id, datalen);
+
+	/* id-eNB-UE-S1AP-ID */
+
+	protocolIe_Id = id_eNB_UE_S1AP_ID;
+	copyU16(tmpStr, protocolIe_Id);
+	buffer_copy(&g_value_buffer, tmpStr,
+						sizeof(protocolIe_Id));
+
+	buffer_copy(&g_value_buffer, &protocolIe_criticality,
+					sizeof(protocolIe_criticality));
+
+
+	/* TODO needs proper handling*/
+	unsigned char enb_ue_id[3];
+	datalen = copyU16(enb_ue_id,
+			s1apPDU.value.data[1].val.enb_ue_s1ap_id);
+	buffer_copy(&g_value_buffer, &datalen, sizeof(datalen));
+	buffer_copy(&g_value_buffer, enb_ue_id, datalen);
+	//STIMER_GET_CURRENT_TP(g_attach_stats[s1apPDU.value.enb_ue_s1ap_id].esm_in);
+
+	/* id-NAS-PDU */
+	protocolIe_Id = id_NAS_PDU;
+	copyU16(tmpStr, protocolIe_Id);
+	buffer_copy(&g_value_buffer, tmpStr,
+						sizeof(protocolIe_Id));
+
+	buffer_copy(&g_value_buffer, &protocolIe_criticality,
+					sizeof(protocolIe_criticality));
+
+	struct nasPDU *nas = &(s1apPDU.value.data[2].val.nas);
+	uint8_t value = (nas->header.security_header_type) |
+			nas->header.proto_discriminator;
+
+	g_nas_buffer.pos = 0;
+
+	buffer_copy(&g_nas_buffer, &value, sizeof(value));
+
+	buffer_copy(&g_nas_buffer, &nas->header.message_type,
+						sizeof(nas->header.message_type));
+
+	buffer_copy(&g_nas_buffer, &nas->header.nas_security_param,
+						sizeof(nas->header.nas_security_param));
+
+	buffer_copy(&g_nas_buffer, 
+	     &nas->elements[0].pduElement.rand,
+	     sizeof(nas->elements[0].pduElement.rand));
+
+	datalen = 16;
+	buffer_copy(&g_nas_buffer, &datalen, sizeof(datalen));
+
+	buffer_copy(&g_nas_buffer, 
+	   &nas->elements[1].pduElement.autn,
+	   sizeof(nas->elements[1].pduElement.autn));
+
+	datalen = g_nas_buffer.pos + 1;
+	buffer_copy(&g_value_buffer, &datalen,
+						sizeof(datalen));
+
+	buffer_copy(&g_value_buffer, &g_nas_buffer.pos,
+						sizeof(g_nas_buffer.pos));
+
+
+	buffer_copy(&g_value_buffer, &g_nas_buffer,
+						g_nas_buffer.pos);
+
+	buffer_copy(&g_buffer, &g_value_buffer.pos,
+						sizeof(g_value_buffer.pos));
+
+	buffer_copy(&g_buffer, &g_value_buffer,
+						g_value_buffer.pos);
+
+	free(s1apPDU.value.data[2].val.nas.elements);
+	free(s1apPDU.value.data);
+
+	send_sctp_msg(g_authreqInfo->enb_fd, g_buffer.buf, g_buffer.pos, 1);
+
+	return SUCCESS;
+}
+
+void*
+authreq_handler(void *data)
+{
+	log_msg(LOG_INFO, "AuthReq handler.\n");
+
+	authreq_processing((struct authreq_info *)data);
+
+	return NULL;
+}
diff --git a/src/s1ap/handlers/attach_authresp.c b/src/s1ap/handlers/attach_authresp.c
new file mode 100644
index 0000000..c8aae42
--- /dev/null
+++ b/src/s1ap/handlers/attach_authresp.c
@@ -0,0 +1,151 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <pthread.h>
+
+#include "err_codes.h"
+#include "options.h"
+#include "ipc_api.h"
+#include "main.h"
+#include "s1ap.h"
+#include "s1ap_config.h"
+#include "sctp_conn.h"
+#include "s1ap_structs.h"
+#include "s1ap_msg_codes.h"
+#include "msgType.h"
+
+
+extern int g_enb_fd;
+extern ipc_handle ipc_S1ap_Hndl;
+extern struct time_stat g_attach_stats[];
+
+int
+s1_auth_resp_handler(struct proto_IE *s1_auth_resp_ies)
+{
+	//TODO: use static instead of synamic for perf.
+	struct s1_incoming_msg_data_t auth_resp= {0};
+
+	/*****Message structure***
+	*/
+	log_msg(LOG_INFO, "Parse s1ap auth resp message:--\n");
+
+	/*Validate all eNB info*/
+
+	/*Add eNB info to hash*/
+
+	/*Create Q structure for stage 1 to MME.
+	  contains init UE information.*/
+	auth_resp.msg_type = auth_response;	
+		
+	for(int i = 0; i < s1_auth_resp_ies->no_of_IEs; i++)
+    {
+        switch(s1_auth_resp_ies->data[i].IE_type)
+        {
+            case S1AP_IE_MME_UE_ID:
+                {
+	                auth_resp.ue_idx = s1_auth_resp_ies->data[i].val.mme_ue_s1ap_id;
+                }break;
+            case S1AP_IE_NAS_PDU:
+                {
+                    if(s1_auth_resp_ies->data[i].val.nas.header.message_type != NAS_AUTH_RESP)
+                    {
+                        auth_resp.msg_data.authresp_Q_msg_m.status = S1AP_AUTH_FAILED;//Error in authentication
+                    }
+                    else
+                    {
+                        auth_resp.msg_data.authresp_Q_msg_m.status = SUCCESS;
+                    }
+
+                    memcpy(&(auth_resp.msg_data.authresp_Q_msg_m.res), 
+                           &(s1_auth_resp_ies->data[i].val.nas.elements[0].pduElement.auth_resp),
+                           sizeof(struct XRES));
+                }break;
+            default:
+                log_msg(LOG_WARNING,"Unhandled IE");
+        }
+    }
+
+	auth_resp.destInstAddr = htonl(mmeAppInstanceNum_c);
+	auth_resp.srcInstAddr = htonl(s1apAppInstanceNum_c);
+
+	//STIMER_GET_CURRENT_TP(g_attach_stats[s1_auth_resp_ies->data[1].enb_ue_s1ap_id].auth_to_mme);
+	send_tipc_message(ipc_S1ap_Hndl, mmeAppInstanceNum_c, (char *)&auth_resp, S1_READ_MSG_BUF_SIZE);
+
+	/*Send S1Setup response*/
+	log_msg(LOG_INFO, "Auth resp send to mme-app stage3.\n");
+
+	//TODO: free IEs
+	return SUCCESS;
+}
+
+int
+s1_auth_fail_handler(struct proto_IE *s1_auth_resp_ies)
+{
+	//TODO: use static instead of synamic for perf.
+	struct s1_incoming_msg_data_t auth_resp;
+
+	/*****Message structure***
+	*/
+	log_msg(LOG_INFO, "Parse s1ap auth fail resp:--\n");
+
+	/*Validate all eNB info*/
+
+	/*Add eNB info to hash*/
+
+	/*Create Q structure for stage 1 to MME.
+	  contains init UE information.*/
+	  
+	  /* msg_type for auth_failure
+	  ?auth_resp.msg_type =?;*/
+    for(int i = 0; i < s1_auth_resp_ies->no_of_IEs; i++)
+    {
+        switch(s1_auth_resp_ies->data[i].IE_type)
+        {
+            case S1AP_IE_MME_UE_ID:
+                {
+	                auth_resp.ue_idx = s1_auth_resp_ies->data[i].val.mme_ue_s1ap_id;
+                }break;
+            case S1AP_IE_NAS_PDU:
+                {
+                    auth_resp.msg_data.authresp_Q_msg_m.status = S1AP_AUTH_FAILED;//Error in authentication
+	                memcpy(&(auth_resp.msg_data.authresp_Q_msg_m.auts), 
+                           &(s1_auth_resp_ies->data[i].val.nas.elements[0].pduElement.auth_fail_resp),
+		                   sizeof(struct AUTS));
+                }break;
+            default:
+                log_msg(LOG_WARNING,"Unhandled IE");
+        }
+    }
+	
+    auth_resp.destInstAddr = htonl(mmeAppInstanceNum_c);
+	auth_resp.srcInstAddr = htonl(s1apAppInstanceNum_c);
+
+	//STIMER_GET_CURRENT_TP(g_attach_stats[s1_auth_resp_ies->data[1].enb_ue_s1ap_id].auth_to_mme);
+	send_tipc_message(ipc_S1ap_Hndl, mmeAppInstanceNum_c, (char *)&auth_resp, S1_READ_MSG_BUF_SIZE);
+
+	/*Send S1Setup response*/
+	log_msg(LOG_INFO, "Auth resp send to mme-app stage3.\n");
+
+	//TODO: free IEs
+	return SUCCESS;
+}
+
diff --git a/src/s1ap/handlers/attach_complete.c b/src/s1ap/handlers/attach_complete.c
new file mode 100644
index 0000000..d2a9a67
--- /dev/null
+++ b/src/s1ap/handlers/attach_complete.c
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <pthread.h>
+
+#include "err_codes.h"
+#include "options.h"
+#include "ipc_api.h"
+#include "main.h"
+#include "s1ap.h"
+#include "s1ap_config.h"
+#include "sctp_conn.h"
+#include "s1ap_structs.h"
+#include "s1ap_msg_codes.h"
+#include "msgType.h"
+
+
+extern int g_enb_fd;
+extern int g_sctp_fd;
+extern ipc_handle ipc_S1ap_Hndl;
+
+int
+s1_attach_complete_handler(struct proto_IE *s1_esm_resp_ies)
+{
+	struct s1_incoming_msg_data_t attachComplete= {0};
+
+	/*****Message structure***
+	*/
+	log_msg(LOG_INFO, "Parse s1ap-nas attach complete message:--\n");
+
+	/*Validate all eNB info*/
+
+	/*Create Q structure for stage 1 to MME.
+	  contains init UE information.*/
+	attachComplete.msg_type = attach_complete;	
+	for(int i = 0; i < s1_esm_resp_ies->no_of_IEs; i++)
+    {
+        switch(s1_esm_resp_ies->data[i].IE_type)
+        {
+            case S1AP_IE_MME_UE_ID:
+                {
+	                attachComplete.ue_idx = s1_esm_resp_ies->data[i].val.mme_ue_s1ap_id;
+                }break;
+            default:
+                log_msg(LOG_WARNING,"Unhandled IE");
+        }
+    }
+	
+    attachComplete.msg_data.attach_complete_Q_msg_m.status = SUCCESS;
+	
+	
+	attachComplete.destInstAddr = htonl(mmeAppInstanceNum_c);
+	attachComplete.srcInstAddr = htonl(s1apAppInstanceNum_c);
+
+	int i = send_tipc_message(ipc_S1ap_Hndl, mmeAppInstanceNum_c, (char *)&attachComplete, S1_READ_MSG_BUF_SIZE);
+
+	if (i < 0) {
+		log_msg(LOG_ERROR, "Error to write in s1_attach_complete_handler\n");
+	} else {
+		/*Send S1Setup response*/
+		log_msg(LOG_INFO, "Attach complete send to mme-app stage8. Bytes send %d\n", i);
+	}
+
+	//Anjana: Socket cleanup
+	/*close(g_sctp_fd);
+	if (g_enb_fd != 0)
+		close(g_enb_fd);*/
+	//TODO: free IEs
+	return SUCCESS;
+}
+
diff --git a/src/s1ap/handlers/attach_esmreq.c b/src/s1ap/handlers/attach_esmreq.c
new file mode 100644
index 0000000..39f16bb
--- /dev/null
+++ b/src/s1ap/handlers/attach_esmreq.c
@@ -0,0 +1,226 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <pthread.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdint.h>
+
+#include "err_codes.h"
+#include "ipc_api.h"
+#include "main.h"
+#include "msgType.h"
+#include "s1ap.h"
+#include  "log.h"
+#include "snow_3g.h"
+
+/****Globals and externs ***/
+
+/*Making global just to avoid stack passing*/
+static Buffer g_esm_buffer;
+static Buffer g_esm_value_buffer;
+static Buffer g_esm_nas_buffer;
+
+
+/****Global and externs end***/
+extern ipc_handle ipc_S1ap_Hndl;
+/**
+* Get ProtocolIE value for Sec Request sent by mme-app
+*/
+static int
+get_esmreq_protoie_value(struct proto_IE *value, struct esm_req_Q_msg * g_esmReqInfo)
+{
+	value->no_of_IEs = ESM_REQ_NO_OF_IES;
+
+	value->data = (proto_IEs *) malloc(ESM_REQ_NO_OF_IES *
+			sizeof(proto_IEs));
+
+	value->data[0].val.mme_ue_s1ap_id = g_esmReqInfo->ue_idx;
+	value->data[1].val.enb_ue_s1ap_id = g_esmReqInfo->enb_s1ap_ue_id;
+
+	value->data[2].val.nas.header.security_header_type =
+			IntegrityProtectedCiphered;
+
+	value->data[2].val.nas.header.proto_discriminator =
+			EPSMobilityManagementMessages;
+
+	/* placeholder for mac. mac value will be calculated later */
+	uint8_t mac[MAC_SIZE] = {0};
+	memcpy(value->data[2].val.nas.header.mac, mac, MAC_SIZE);
+
+	value->data[2].val.nas.header.seq_no = g_esmReqInfo->dl_seq_no;
+
+	value->data[2].val.nas.header.message_type = ESMInformationRequest;
+
+	/* TODO: Remove hardcoded value */
+	value->data[2].val.nas.header.eps_bearer_identity = 0;
+	value->data[2].val.nas.header.procedure_trans_identity = g_esmReqInfo->pti;
+
+	return SUCCESS;
+}
+
+
+/**
+* Stage specific message processing.
+*/
+static int
+esmreq_processing(struct esm_req_Q_msg * g_esmReqInfo)
+{
+	unsigned char tmpStr[4];
+	struct s1ap_PDU s1apPDU= {0};
+	uint8_t mac_data_pos;
+
+	s1apPDU.procedurecode = id_downlinkNASTransport;
+	s1apPDU.criticality = CRITICALITY_IGNORE;
+
+	get_esmreq_protoie_value(&s1apPDU.value, g_esmReqInfo);
+
+	/* Copy values to g_sec_nas_buffer */
+
+	/* id-NAS-PDU */
+	g_esm_nas_buffer.pos = 0;
+	nasPDU nas = s1apPDU.value.data[2].val.nas;
+
+	unsigned char value = (nas.header.security_header_type << 4 |
+			nas.header.proto_discriminator);
+	buffer_copy(&g_esm_nas_buffer, &value, sizeof(value));
+
+	/* placeholder for mac. mac value will be calculated later */
+	buffer_copy(&g_esm_nas_buffer, &nas.header.mac, MAC_SIZE);
+	mac_data_pos = g_esm_nas_buffer.pos;
+
+	buffer_copy(&g_esm_nas_buffer, &nas.header.seq_no,
+			sizeof(nas.header.seq_no));
+
+	nas.header.proto_discriminator = EPSSessionManagementMessage;
+	value = (nas.header.eps_bearer_identity << 4 |
+				nas.header.proto_discriminator);
+	buffer_copy(&g_esm_nas_buffer, &value, sizeof(value));
+
+	buffer_copy(&g_esm_nas_buffer,
+			&nas.header.procedure_trans_identity,
+			sizeof(nas.header.procedure_trans_identity));
+
+	buffer_copy(&g_esm_nas_buffer, &nas.header.message_type,
+			sizeof(nas.header.message_type));
+
+	/* Calculate mac */
+	uint8_t direction = 1;
+	uint8_t bearer = 0;
+
+	calculate_mac(g_esmReqInfo->int_key, nas.header.seq_no, direction,
+			bearer, &g_esm_nas_buffer.buf[mac_data_pos],
+			g_esm_nas_buffer.pos - mac_data_pos,
+			&g_esm_nas_buffer.buf[mac_data_pos - MAC_SIZE]);
+
+	/* Copy values in g_sec_value_buffer */
+	g_esm_value_buffer.pos = 0;
+
+	/* TODO remove hardcoded values */
+	char chProtoIENo[3] = {0,0,3};
+	buffer_copy(&g_esm_value_buffer, chProtoIENo, 3);
+
+	/* id-MME-UE-S1AP-ID */
+	uint16_t protocolIe_Id = id_MME_UE_S1AP_ID;
+	copyU16(tmpStr, protocolIe_Id);
+	buffer_copy(&g_esm_value_buffer, tmpStr,
+					sizeof(protocolIe_Id));
+
+	unsigned char protocolIe_criticality = CRITICALITY_REJECT;
+	buffer_copy(&g_esm_value_buffer, &protocolIe_criticality,
+					sizeof(protocolIe_criticality));
+
+	unsigned char datalen = 2;
+
+	/* TODO need to add proper handling*/
+	unsigned char mme_ue_id[3];
+	datalen = copyU16(mme_ue_id, s1apPDU.value.data[0].val.mme_ue_s1ap_id);
+	buffer_copy(&g_esm_value_buffer, &datalen, sizeof(datalen));
+	buffer_copy(&g_esm_value_buffer, mme_ue_id, datalen);
+
+	/* id-eNB-UE-S1AP-ID */
+	protocolIe_Id = id_eNB_UE_S1AP_ID;
+	copyU16(tmpStr, protocolIe_Id);
+	buffer_copy(&g_esm_value_buffer, tmpStr,
+						sizeof(protocolIe_Id));
+
+	buffer_copy(&g_esm_value_buffer, &protocolIe_criticality,
+					sizeof(protocolIe_criticality));
+
+	/* TODO needs proper handling*/
+	unsigned char enb_ue_id[3];
+	datalen = copyU16(enb_ue_id, s1apPDU.value.data[1].val.enb_ue_s1ap_id);
+	buffer_copy(&g_esm_value_buffer, &datalen, sizeof(datalen));
+	buffer_copy(&g_esm_value_buffer, enb_ue_id, datalen);
+
+
+	/* id-NAS-PDU */
+	protocolIe_Id = id_NAS_PDU;
+	copyU16(tmpStr, protocolIe_Id);
+	buffer_copy(&g_esm_value_buffer, tmpStr,
+			sizeof(protocolIe_Id));
+
+	buffer_copy(&g_esm_value_buffer, &protocolIe_criticality,
+			sizeof(protocolIe_criticality));
+
+
+	datalen = g_esm_nas_buffer.pos + 1;
+	buffer_copy(&g_esm_value_buffer, &datalen,
+			sizeof(datalen));
+
+	buffer_copy(&g_esm_value_buffer, &g_esm_nas_buffer.pos,
+			sizeof(g_esm_nas_buffer.pos));
+
+	buffer_copy(&g_esm_value_buffer, &g_esm_nas_buffer,
+			g_esm_nas_buffer.pos);
+
+	/* Copy values in g_sec_buffer */
+	g_esm_buffer.pos = 0;
+
+	unsigned char initiating_message = 0; /* TODO: Add enum */
+	buffer_copy(&g_esm_buffer, &initiating_message,
+			sizeof(initiating_message));
+
+	buffer_copy(&g_esm_buffer, &s1apPDU.procedurecode,
+			sizeof(s1apPDU.procedurecode));
+
+	buffer_copy(&g_esm_buffer, &s1apPDU.criticality,
+			sizeof(s1apPDU.criticality));
+
+	buffer_copy(&g_esm_buffer, &g_esm_value_buffer.pos,
+			sizeof(g_esm_value_buffer.pos));
+
+	buffer_copy(&g_esm_buffer, &g_esm_value_buffer,
+			g_esm_value_buffer.pos);
+
+	send_sctp_msg(g_esmReqInfo->enb_fd, g_esm_buffer.buf, g_esm_buffer.pos, 1);
+
+	free(s1apPDU.value.data);
+
+	return SUCCESS;
+}
+
+void*
+esmreq_handler(void *data)
+{
+	log_msg(LOG_INFO, "ESM Info Request handler\n");
+	esmreq_processing((struct esm_req_Q_msg *)data);
+
+	return NULL;
+}
diff --git a/src/s1ap/handlers/attach_esmresp.c b/src/s1ap/handlers/attach_esmresp.c
new file mode 100644
index 0000000..99522a2
--- /dev/null
+++ b/src/s1ap/handlers/attach_esmresp.c
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <pthread.h>
+
+#include "err_codes.h"
+#include "options.h"
+#include "ipc_api.h"
+#include "main.h"
+#include "s1ap.h"
+#include "s1ap_config.h"
+#include "sctp_conn.h"
+#include "s1ap_structs.h"
+#include "s1ap_msg_codes.h"
+#include "msgType.h"
+
+extern int g_enb_fd;
+extern ipc_handle ipc_S1ap_Hndl;
+
+int
+s1_esm_resp_handler(struct proto_IE *s1_esm_resp_ies)
+{
+	struct s1_incoming_msg_data_t esm_resp= {0};
+	esm_resp.msg_type = esm_info_response;
+
+	/*****Message structure***
+	*/
+	log_msg(LOG_INFO, "Parse s1ap ESM response message:--\n");
+
+	/*Validate all eNB info*/
+
+	/*Add eNB info to hash*/
+
+	/*Create Q structure for stage 1 to MME.
+	  contains init UE information.*/
+    for(int i = 0; i < s1_esm_resp_ies->no_of_IEs; i++)
+    {
+        switch(s1_esm_resp_ies->data[i].IE_type)
+        {
+            case S1AP_IE_MME_UE_ID:
+                {
+	                esm_resp.ue_idx = s1_esm_resp_ies->data[i].val.mme_ue_s1ap_id;
+                }break;
+            case S1AP_IE_NAS_PDU:
+                {
+                    if(s1_esm_resp_ies->data[i].val.nas.header.message_type != NAS_ESM_RESP)
+                    {
+                        esm_resp.msg_data.esm_resp_Q_msg_m.status = S1AP_SECMODE_FAILED;//Error in authentication
+                    }
+                    else
+                    {
+                        esm_resp.msg_data.esm_resp_Q_msg_m.status = SUCCESS;
+	                    memcpy(&(esm_resp.msg_data.esm_resp_Q_msg_m.apn), &(s1_esm_resp_ies->data[i].val.nas.elements[0].pduElement.apn),
+		                       sizeof(struct apn_name));
+                    }
+
+                }break;
+            default:
+                log_msg(LOG_WARNING,"Unhandled IE");
+        }
+    }
+
+
+        esm_resp.destInstAddr = htonl(mmeAppInstanceNum_c);
+        esm_resp.srcInstAddr = htonl(s1apAppInstanceNum_c);
+
+        //STIMER_GET_CURRENT_TP(g_attach_stats[s1_auth_resp_ies->data[1].enb_ue_s1ap_id].auth_to_mme);
+        send_tipc_message(ipc_S1ap_Hndl, mmeAppInstanceNum_c, (char *)&esm_resp, S1_READ_MSG_BUF_SIZE);
+
+        /*Send S1Setup response*/
+        log_msg(LOG_INFO, "ESM Info resp send to mme-app\n");
+
+	//TODO: free IEs
+	return SUCCESS;
+}
+
diff --git a/src/s1ap/handlers/attach_icsreq.c b/src/s1ap/handlers/attach_icsreq.c
new file mode 100644
index 0000000..23c00a5
--- /dev/null
+++ b/src/s1ap/handlers/attach_icsreq.c
@@ -0,0 +1,744 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <pthread.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdint.h>
+
+#include "log.h"
+#include "err_codes.h"
+#include "message_queues.h"
+#include "ipc_api.h"
+#include "s1ap_config.h"
+#include "main.h"
+#include "s1ap.h"
+#include "msgType.h"
+
+extern s1ap_config g_s1ap_cfg;
+
+static void
+get_negotiated_qos_value(struct esm_qos *qos)
+{
+	qos->delay_class = 1;
+	qos->reliability_class = 3;
+	qos->peak_throughput = 5;
+	qos->precedence_class = 2;
+	qos->mean_throughput = 31;
+	qos->traffic_class = 3;
+	qos->delivery_order = 2;
+	qos->delivery_err_sdu = 3;
+	qos->max_sdu_size = 140;
+	qos->mbr_ul = 254;
+	qos->mbr_dl = 86;
+	qos->residual_ber = 7;
+	qos->sdu_err_ratio = 6;
+	qos->transfer_delay = 18;
+	qos->trffic_prio = 3;
+	qos->gbr_ul = 86;
+	qos->gbr_dl = 86;
+	qos->sig_ind = 0;
+	qos->src_stat_desc = 0;
+	qos->mbr_dl_ext = 108;
+	qos->gbr_dl_ext = 0;
+	qos->mbr_ul_ext = 108;
+	qos->gbr_ul_ext = 0;
+
+	return;
+}
+
+/**
+* Get ProtocolIE value for ICS Request sent by mme-app
+*/
+static int
+get_icsreq_protoie_value(struct proto_IE *value, struct init_ctx_req_Q_msg *g_icsReqInfo)
+{
+	uint8_t ieCnt = 0;
+	uint8_t nasIeCnt = 0;
+
+	value->no_of_IEs = ICS_REQ_NO_OF_IES;
+
+	value->data = (proto_IEs *) malloc(ICS_REQ_NO_OF_IES *
+			sizeof(proto_IEs));
+	
+
+	value->data[ieCnt].val.mme_ue_s1ap_id = g_icsReqInfo->ue_idx;
+	ieCnt++;
+
+	value->data[ieCnt].val.enb_ue_s1ap_id = g_icsReqInfo->enb_s1ap_ue_id;
+	ieCnt++;
+
+	log_msg(LOG_INFO, "mme_ue_s1ap_id %d and enb_ue_s1ap_id %d\n",
+                        g_icsReqInfo->ue_idx, g_icsReqInfo->enb_s1ap_ue_id);
+
+	value->data[ieCnt].val.ue_aggrt_max_bit_rate.uEaggregateMaxBitRateDL =
+			g_icsReqInfo->exg_max_dl_bitrate;
+	value->data[ieCnt].val.ue_aggrt_max_bit_rate.uEaggregateMaxBitRateUL =
+				g_icsReqInfo->exg_max_ul_bitrate;
+	ieCnt++;
+
+	/* E-RABToBeSetupItemCtxtSUReq start */
+	ERABSetup *e_rab = &(value->data[ieCnt].val.E_RABToBeSetupItemCtxtSUReq);
+	/* TODO: Remove hardcoded values. */
+	e_rab->e_RAB_ID = 1;
+	e_rab->e_RAB_QoS_Params.qci = 9;
+	e_rab->e_RAB_QoS_Params.arPrio.prioLevel = 15;
+	e_rab->e_RAB_QoS_Params.arPrio.preEmptionCapab = 1;
+	e_rab->e_RAB_QoS_Params.arPrio.preEmptionVulnebility = 1;
+
+	/*S1u information : transport layer addr and teid*/
+	e_rab->transportLayerAddress = htonl(g_icsReqInfo->gtp_teid.ip.ipv4.s_addr);
+	//e_rab->gtp_teid = htonl(g_icsReqInfo->gtp_teid.header.teid_gre);
+	{
+		char *dst = (char *)&(e_rab->gtp_teid);
+		char *src = (char *)&(g_icsReqInfo->gtp_teid.header.teid_gre);
+		memcpy(dst, src+3, 1);
+		memcpy(dst+1, src+2, 1);
+		memcpy(dst+2, src+1, 1);
+		memcpy(dst+3, src, 1);
+	}
+
+	/* NAS PDU values start */
+	e_rab->nas.header.security_header_type =
+				IntegrityProtectedCiphered;
+	e_rab->nas.header.proto_discriminator =
+			EPSMobilityManagementMessages;
+
+	/* placeholder for mac. mac value will be calculated later */
+	uint8_t mac[MAC_SIZE] = {0};
+	memcpy(e_rab->nas.header.mac, mac, MAC_SIZE);
+
+	e_rab->nas.header.seq_no = g_icsReqInfo->dl_seq_no;
+	e_rab->nas.header.message_type = AttachAccept;
+	/* TODO: Remove hardcoded value */
+	e_rab->nas.header.eps_bearer_identity = 0;
+	e_rab->nas.header.procedure_trans_identity = 1;
+
+	e_rab->nas.elements_len = ICS_REQ_NO_OF_NAS_IES;
+	e_rab->nas.elements = (nas_pdu_elements *)
+			malloc(ICS_REQ_NO_OF_NAS_IES * sizeof(nas_pdu_elements));
+
+	nas_pdu_elements *nasIEs = e_rab->nas.elements;
+	nasIEs[nasIeCnt].pduElement.attach_res = 2; /* EPS Only */
+	nasIeCnt++;
+
+    /* Refer : 24008. Section - 10.5.7.3. We want to disable TAU request coming from UE. 
+     */
+//#define DISABLE_TAU 0
+#if DISABLE_TAU
+	nasIEs[nasIeCnt].pduElement.t3412 = 224; 
+#else
+	nasIEs[nasIeCnt].pduElement.t3412 = 0x21; // per min
+#endif
+	nasIeCnt++;
+
+	nasIEs[nasIeCnt].pduElement.tailist.type = 1;
+	nasIEs[nasIeCnt].pduElement.tailist.num_of_elements = 0;
+
+    	/* S1AP TAI mcc 123, mnc 456 : 214365 */
+    	/* NAS GUTI mcc 123, mnc 456 : 216354 */
+	if ((g_icsReqInfo->tai.plmn_id.idx[1] & 0xF0) != 0xF0)
+	{
+    	unsigned char x3 = g_icsReqInfo->tai.plmn_id.idx[2];
+    	unsigned char x2 = g_icsReqInfo->tai.plmn_id.idx[1]; 
+    	unsigned char x31 = x3 >> 4;
+   	    unsigned char x32 = x3 & 0xf;
+    	unsigned char x21 = x2 >> 4;
+    	unsigned char x22  = x2 & 0xf;
+    	x3 = x21 | (x32 <<4);
+    	x2 = (x31 << 4) | x22;
+    	g_icsReqInfo->tai.plmn_id.idx[1] = x2;
+    	g_icsReqInfo->tai.plmn_id.idx[2] = x3;
+	}
+
+	memcpy(&(nasIEs[nasIeCnt].pduElement.tailist.partial_list[0]),
+			&(g_icsReqInfo->tai), sizeof(g_icsReqInfo->tai));
+	nasIeCnt++;
+
+	nasIEs[nasIeCnt].pduElement.esm_msg.eps_bearer_id = 5; /* TODO: revisit */
+	nasIEs[nasIeCnt].pduElement.esm_msg.proto_discriminator = 2;
+	memcpy(&(nasIEs[nasIeCnt].pduElement.esm_msg.procedure_trans_identity), &(g_icsReqInfo->pti), 1);
+	nasIEs[nasIeCnt].pduElement.esm_msg.session_management_msgs =
+			ESM_MSG_ACTV_DEF_BEAR__CTX_REQ;
+	nasIEs[nasIeCnt].pduElement.esm_msg.eps_qos = 9;
+
+	/* TODO: Remove hardcoded value */
+	/*char apnname[4] = "apn1";
+	memcpy(&(nasIEs[nasIeCnt].esm_msg.apn.val), apnname, 4);
+	nasIEs[nasIeCnt].esm_msg.apn.len =  4;
+	*/
+	nasIEs[nasIeCnt].pduElement.esm_msg.apn.len = g_icsReqInfo->apn.len;
+	memcpy(nasIEs[nasIeCnt].pduElement.esm_msg.apn.val,
+			g_icsReqInfo->apn.val, g_icsReqInfo->apn.len);
+
+
+	nasIEs[nasIeCnt].pduElement.esm_msg.pdn_addr.type = 1;
+    /*TODO : endian issue */
+	nasIEs[nasIeCnt].pduElement.esm_msg.pdn_addr.ipv4 = htonl(g_icsReqInfo->pdn_addr.ip_type.ipv4.s_addr);
+	nasIEs[nasIeCnt].pduElement.esm_msg.linked_ti.flag = 0;
+	nasIEs[nasIeCnt].pduElement.esm_msg.linked_ti.val = 0;
+	get_negotiated_qos_value(&nasIEs[nasIeCnt].pduElement.esm_msg.negotiated_qos);
+	nasIeCnt++;
+
+        /* Send the allocated GUTI to UE  */
+	nasIEs[nasIeCnt].pduElement.mi_guti.odd_even_indication = 0;
+	nasIEs[nasIeCnt].pduElement.mi_guti.id_type = 6;
+
+	memcpy(&(nasIEs[nasIeCnt].pduElement.mi_guti.plmn_id),
+			&(g_icsReqInfo->tai.plmn_id), sizeof(struct PLMN));
+	nasIEs[nasIeCnt].pduElement.mi_guti.mme_grp_id = htons(g_s1ap_cfg.mme_group_id);
+	nasIEs[nasIeCnt].pduElement.mi_guti.mme_code = g_s1ap_cfg.mme_code;
+	/* TODO : Revisit, temp fix for handling detach request retransmit.
+	 * M-TMSI should come from MME */
+	nasIEs[nasIeCnt].pduElement.mi_guti.m_TMSI = htonl(g_icsReqInfo->m_tmsi);
+	nasIeCnt++;
+
+	ieCnt++;
+	/* NAS PDU values end */
+	/* E-RABToBeSetupItemCtxtSUReq values end */
+
+
+	/* TODO Get value of ue_sec_capabilities
+	 *
+	 * value->data[ieCnt].ue_sec_capabilities = ??
+	 *
+	 * */
+
+
+	ieCnt++;
+
+	/* TODO: remove hard coded value */
+	/*char sec_key[32] = "abcdefghijklmnopqrstuvwxyz012345";
+	memcpy(value->data[ieCnt].sec_key, sec_key,
+			SECURITY_KEY_SIZE);
+	*/
+
+	memcpy(value->data[ieCnt].val.sec_key, g_icsReqInfo->sec_key,
+			SECURITY_KEY_SIZE);
+
+	ieCnt++;
+
+	return SUCCESS;
+}
+
+
+
+/**
+* Stage specific message processing.
+*/
+static int
+icsreq_processing(struct init_ctx_req_Q_msg *g_icsReqInfo)
+{
+
+    Buffer g_ics_buffer;
+    Buffer g_s1ap_buffer;
+    Buffer g_rab1_buffer;
+    Buffer g_rab2_buffer;
+    Buffer g_nas_buffer;
+
+	unsigned char tmpStr[4];
+	struct s1ap_PDU s1apPDU;
+	uint16_t protocolIe_Id;
+	uint8_t protocolIe_criticality;
+	uint8_t initiating_msg = 0;
+	uint8_t datalen = 0;
+	//uint8_t s1ap_len_pos;
+	//uint8_t erab_len_pos;
+	//uint8_t erab_item_len_pos;
+	//uint8_t nas_len_pos;
+	uint16_t esm_len_pos;
+	uint8_t u8value = 0;
+	uint8_t mac_data_pos;
+
+	s1apPDU.procedurecode = id_InitialContextSetup;
+	s1apPDU.criticality = CRITICALITY_REJECT;
+
+	get_icsreq_protoie_value(&s1apPDU.value, g_icsReqInfo);
+
+	g_ics_buffer.pos = 0;
+
+	buffer_copy(&g_ics_buffer, &initiating_msg,
+			sizeof(initiating_msg));
+
+	buffer_copy(&g_ics_buffer, &s1apPDU.procedurecode,
+			sizeof(s1apPDU.procedurecode));
+
+	buffer_copy(&g_ics_buffer, &s1apPDU.criticality,
+				sizeof(s1apPDU.criticality));
+
+	/* TODO: revisit , why 128 (0x80) required */
+#if 0
+	s1ap_len_pos = g_ics_buffer.pos;
+	u8value = 128;
+	buffer_copy(&g_ics_buffer, &u8value, sizeof(u8value));
+
+	
+
+
+	u8value = 0;
+	buffer_copy(&g_ics_buffer, &u8value, sizeof(u8value));
+#endif
+
+    g_s1ap_buffer.pos = 0; 
+
+	/* TODO remove hardcoded values */
+	uint8_t chProtoIENo[3] = {0,0,6};
+	buffer_copy(&g_s1ap_buffer, chProtoIENo, 3);
+
+	/* id-MME-UE-S1AP-ID */
+	protocolIe_Id = id_MME_UE_S1AP_ID;
+	copyU16(tmpStr, protocolIe_Id);
+	buffer_copy(&g_s1ap_buffer, tmpStr, sizeof(protocolIe_Id));
+	protocolIe_criticality = CRITICALITY_REJECT;
+	buffer_copy(&g_s1ap_buffer, &protocolIe_criticality,
+					sizeof(protocolIe_criticality));
+	datalen = 2;
+	/* TODO need to add proper handling*/
+	unsigned char mme_ue_id[3];
+	datalen = copyU16(mme_ue_id, s1apPDU.value.data[0].val.mme_ue_s1ap_id);
+	buffer_copy(&g_s1ap_buffer, &datalen, sizeof(datalen));
+	buffer_copy(&g_s1ap_buffer, mme_ue_id, datalen);
+
+	/* id-eNB-UE-S1AP-ID */
+	protocolIe_Id = id_eNB_UE_S1AP_ID;
+	copyU16(tmpStr, protocolIe_Id);
+	buffer_copy(&g_s1ap_buffer, tmpStr, sizeof(protocolIe_Id));
+	buffer_copy(&g_s1ap_buffer, &protocolIe_criticality,
+					sizeof(protocolIe_criticality));
+	/* TODO needs proper handling*/
+	unsigned char enb_ue_id[3];
+	datalen = copyU16(enb_ue_id, s1apPDU.value.data[1].val.enb_ue_s1ap_id);
+	buffer_copy(&g_s1ap_buffer, &datalen, sizeof(datalen));
+	buffer_copy(&g_s1ap_buffer, enb_ue_id, datalen);
+
+	protocolIe_Id = id_uEaggregatedMaximumBitrate;
+	copyU16(tmpStr, protocolIe_Id);
+	buffer_copy(&g_s1ap_buffer, tmpStr, sizeof(protocolIe_Id));
+	buffer_copy(&g_s1ap_buffer, &protocolIe_criticality,
+					sizeof(protocolIe_criticality));
+	datalen = 10;
+
+	uint8_t maximum_bit_rate_dl = 0x18;
+	uint8_t maximum_bit_rate_ul = 0x60;
+
+	buffer_copy(&g_s1ap_buffer, &datalen, sizeof(datalen));
+
+	buffer_copy(&g_s1ap_buffer, &maximum_bit_rate_dl, sizeof(maximum_bit_rate_dl));
+
+	uint32_t temp_bitrate = htonl(g_icsReqInfo->exg_max_dl_bitrate);
+	memset(tmpStr, 0, sizeof(tmpStr));
+	memcpy(tmpStr, &temp_bitrate, sizeof(temp_bitrate));
+
+	buffer_copy(&g_s1ap_buffer, tmpStr,
+			sizeof(tmpStr));
+
+	temp_bitrate = 0;
+	temp_bitrate = htonl(g_icsReqInfo->exg_max_ul_bitrate);
+	memset(tmpStr, 0, sizeof(tmpStr));
+	memcpy(tmpStr, &temp_bitrate, sizeof(temp_bitrate));
+
+	buffer_copy(&g_s1ap_buffer, &maximum_bit_rate_ul,
+			sizeof(maximum_bit_rate_ul));
+	buffer_copy(&g_s1ap_buffer, tmpStr,
+			sizeof(tmpStr));
+
+
+	/* id-E-RABToBeSetupListCtxtSUReq */
+	ERABSetup *erab = &(s1apPDU.value.data[3].val.E_RABToBeSetupItemCtxtSUReq);
+	protocolIe_Id = id_ERABToBeSetupListCtxtSUReq;
+	copyU16(tmpStr, protocolIe_Id);
+	buffer_copy(&g_s1ap_buffer, tmpStr, sizeof(protocolIe_Id));
+	buffer_copy(&g_s1ap_buffer, &protocolIe_criticality,
+					sizeof(protocolIe_criticality));
+
+    /* Lets put this in new buffer  */
+    /*rab_len_1 */
+#if 0
+	erab_len_pos = g_s1ap_buffer.pos;
+	datalen = 0;
+	buffer_copy(&g_ics_buffer, &datalen, sizeof(datalen));
+#endif
+    g_rab1_buffer.pos = 0;
+
+	buffer_copy(&g_rab1_buffer, &initiating_msg,
+			sizeof(initiating_msg));
+
+	protocolIe_Id = id_ERABToBeSetupItemCtxtSUReq;
+	copyU16(tmpStr, protocolIe_Id);
+	buffer_copy(&g_rab1_buffer, tmpStr, sizeof(protocolIe_Id));
+	buffer_copy(&g_rab1_buffer, &protocolIe_criticality,
+					sizeof(protocolIe_criticality));
+
+    /*rab_len_2 */
+#if 0
+	erab_item_len_pos = g_rab1_buffer.pos;  
+    datalen = 0;
+	buffer_copy(&g_ics_buffer, &datalen, sizeof(datalen));
+#endif
+
+	/*
+	buffer_copy(&g_ics_buffer, &(erab->e_RAB_ID),
+			sizeof(erab->e_RAB_ID));
+	*/
+    g_rab2_buffer.pos = 0;
+	/* TODO : Remove hardcoded value of erab id */
+	u8value =69; // 0x45 //1;
+	buffer_copy(&g_rab2_buffer, &u8value, sizeof(u8value));
+	/* TODO: Need to revisit why add 00 before qci value? */
+	u8value = 0;
+	buffer_copy(&g_rab2_buffer, &u8value, sizeof(u8value));
+	buffer_copy(&g_rab2_buffer, &(erab->e_RAB_QoS_Params.qci),
+			sizeof(erab->e_RAB_QoS_Params.qci));
+	buffer_copy(&g_rab2_buffer, &(erab->e_RAB_QoS_Params.arPrio),
+			sizeof(erab->e_RAB_QoS_Params.arPrio));
+
+	/* TODO: Revisit why we need to add 0f 80 before transport add? */
+
+	u8value = 15;
+	buffer_copy(&g_rab2_buffer, &u8value, sizeof(u8value));
+	u8value = 128;
+	buffer_copy(&g_rab2_buffer, &u8value, sizeof(u8value));
+
+	buffer_copy(&g_rab2_buffer, &(erab->transportLayerAddress),
+				sizeof(erab->transportLayerAddress));
+
+	buffer_copy(&g_rab2_buffer, &(erab->gtp_teid),
+				sizeof(erab->gtp_teid));
+
+
+	/* E_RABToBeSetupListCtxtSUReq NAS PDU start */
+    // at the end we will do.... rab2_buf + <nas_len> + nas_buffer 
+
+#if 0
+	nas_len_pos = g_rab2_buffer.pos;
+	datalen = 0;
+	buffer_copy(&g_ics_buffer, &datalen, sizeof(datalen));
+#endif
+
+	nas_pdu_header *nas_hdr = &(erab->nas.header);
+
+    g_nas_buffer.pos = 0; 
+	/* security header and protocol discriminator */
+	u8value = (nas_hdr->security_header_type << 4 |
+			nas_hdr->proto_discriminator);
+	buffer_copy(&g_nas_buffer, &u8value, sizeof(u8value));
+
+	/* mac */
+	/* placeholder for mac. mac value will be calculated later */
+	buffer_copy(&g_nas_buffer, nas_hdr->mac, MAC_SIZE);
+	mac_data_pos = g_nas_buffer.pos;
+
+	/* sequence number */
+	buffer_copy(&g_nas_buffer, &(nas_hdr->seq_no),
+			sizeof(nas_hdr->seq_no));
+
+	/* security header and protocol discriminator */
+	nas_hdr->security_header_type = Plain;
+	u8value = (nas_hdr->security_header_type << 4 |
+			nas_hdr->proto_discriminator);
+	buffer_copy(&g_nas_buffer, &u8value, sizeof(u8value));
+
+	/* message type */
+	buffer_copy(&g_nas_buffer, &(nas_hdr->message_type),
+			sizeof(nas_hdr->message_type));
+
+	nas_pdu_elements *ies = erab->nas.elements;
+
+	/* eps attach result */
+	buffer_copy(&g_nas_buffer, &(ies[0].pduElement.attach_res), sizeof(u8value));
+
+	/* GPRS timer */
+#define DISABLE_TAU 1
+#if DISABLE_TAU
+    uint8_t temp_timer = 224; /*e0*/
+#else
+    uint8_t temp_timer = 0x21; /*per min */
+#endif
+	//buffer_copy(&g_ics_buffer, &(ies[1].t3412), sizeof(ies[1].t3412));
+	buffer_copy(&g_nas_buffer, &temp_timer, sizeof(temp_timer));
+
+	/* TAI list */
+	u8value = 6;
+	buffer_copy(&g_nas_buffer, &u8value, sizeof(u8value));
+	u8value = 32; /* TODO: use value from tai list */
+	buffer_copy(&g_nas_buffer, &u8value, sizeof(u8value));
+	buffer_copy(&g_nas_buffer, &(ies[2].pduElement.tailist.partial_list[0].plmn_id.idx), 3);
+	buffer_copy(&g_nas_buffer, &(ies[2].pduElement.tailist.partial_list[0].tac), 2);
+
+	esm_len_pos = g_nas_buffer.pos;
+
+	/* esm message container length */
+	char tmplen[2] = {0, 0};
+	buffer_copy(&g_nas_buffer, tmplen, 2);
+
+	/* ESM message container start */
+
+	/* esm message bearer id and protocol discriminator */
+	u8value = (ies[3].pduElement.esm_msg.eps_bearer_id << 4 |
+			ies[3].pduElement.esm_msg.proto_discriminator);
+	buffer_copy(&g_nas_buffer, &u8value, sizeof(u8value));
+
+	/* esm message procedure identity */
+	buffer_copy(&g_nas_buffer, &(ies[3].pduElement.esm_msg.procedure_trans_identity),
+			sizeof(ies[3].pduElement.esm_msg.procedure_trans_identity));
+
+	/* esm message session management message */
+	buffer_copy(&g_nas_buffer, &(ies[3].pduElement.esm_msg.session_management_msgs),
+			sizeof(ies[3].pduElement.esm_msg.session_management_msgs));
+
+	/* eps qos */
+	datalen = 1;
+	buffer_copy(&g_nas_buffer, &datalen, sizeof(datalen));
+	buffer_copy(&g_nas_buffer, &(ies[3].pduElement.esm_msg.eps_qos),
+			sizeof(ies[3].pduElement.esm_msg.eps_qos));
+
+	/* apn */
+	char apn_name[25]={};
+	strncpy(apn_name, (char *)ies[3].pduElement.esm_msg.apn.val, 
+             ies[3].pduElement.esm_msg.apn.len);
+	datalen = ies[3].pduElement.esm_msg.apn.len;
+	buffer_copy(&g_nas_buffer, &datalen, sizeof(datalen));
+	buffer_copy(&g_nas_buffer, (char *)ies[3].pduElement.esm_msg.apn.val, datalen);
+	
+	/* pdn address */
+	//datalen = sizeof(ies[3].esm_msg.pdn_addr);
+	datalen = 5; //sizeof(ies[3].esm_msg.pdn_addr);
+	buffer_copy(&g_nas_buffer, &datalen, sizeof(datalen));
+	u8value = 1;
+	buffer_copy(&g_nas_buffer, &u8value, sizeof(u8value));
+	//buffer_copy(&g_ics_buffer, &(ies[3].esm_msg.pdn_addr.pdn_type), 1);
+	buffer_copy(&g_nas_buffer, &(ies[3].pduElement.esm_msg.pdn_addr.ipv4), datalen-1);
+
+	/* linked ti */
+	u8value = 0x5d; /* element id TODO: define macro or enum */
+	buffer_copy(&g_nas_buffer, &u8value, sizeof(u8value));
+	datalen = 1;//sizeof(ies[3].esm_msg.linked_ti);
+	buffer_copy(&g_nas_buffer, &datalen, sizeof(datalen));
+	buffer_copy(&g_nas_buffer, &(ies[3].pduElement.esm_msg.linked_ti), datalen);
+
+	/* negotiated qos */
+	u8value = 0x30; /* element id TODO: define macro or enum */
+	buffer_copy(&g_nas_buffer, &u8value, sizeof(u8value));
+	datalen = 16;//sizeof(ies[3].esm_msg.negotiated_qos);
+	buffer_copy(&g_nas_buffer, &datalen, sizeof(datalen));
+	buffer_copy(&g_nas_buffer, &(ies[3].pduElement.esm_msg.negotiated_qos), datalen);
+
+	/* apn ambr */
+#if 0
+	u8value = 0x5e; /* element id TODO: define macro or enum */
+	buffer_copy(&g_ics_buffer, &u8value, sizeof(u8value));
+	datalen = sizeof(ies[3].esm_msg.apn_ambr);
+	buffer_copy(&g_ics_buffer, &datalen, sizeof(datalen));
+	buffer_copy(&g_ics_buffer, &(ies[3].esm_msg.apn_ambr), datalen);
+#endif
+	/* TODO: remove hardcoded values of apn ambr */
+	char apn_ambr[8] = {0x5e, 0x06, 0x80, 0x00, 0x04, 0x05, 0x06, 0x07};
+	buffer_copy(&g_nas_buffer, apn_ambr, 8);
+
+#if 1
+    char pco_options[29] = {0x27, 0x1B, 0x80, 0x80, 0x21, 0x10, 0x03, 0x00, 0x00,0x10, 0x81, 0x06, 0x08,0x08,0x08, 0x08,0x83,0x06,0x08,0x08,0x08,0x04,0x00,0x0d, 0x04,0x08,0x08,0x08,0x08};
+	buffer_copy(&g_nas_buffer, &pco_options[0], 29);
+#endif
+
+	/* ESM message container end */
+
+	/* Copy esm container length to esm container length field */
+	uint16_t esm_datalen = g_nas_buffer.pos - esm_len_pos - 2;
+	unsigned char esm_len[2];
+	copyU16(esm_len, esm_datalen);
+	/* memcpy(&g_ics_buffer.buf[esm_len_pos], tmplen, sizeof(esm_datalen)); */
+	/*TODO: needs proper handling */
+	g_nas_buffer.buf[esm_len_pos] = esm_len[0];
+	g_nas_buffer.buf[esm_len_pos + 1] = esm_len[1];
+
+	/* EPS mobile identity GUTI */
+#if 0
+	u8value = 0x50; /* element id TODO: define macro or enum */
+	buffer_copy(&g_ics_buffer, &u8value, sizeof(u8value));
+	datalen = sizeof(ies[4].mi_guti);
+	buffer_copy(&g_ics_buffer, &datalen, sizeof(datalen));
+	buffer_copy(&g_ics_buffer, &(ies[4].mi_guti), datalen);
+#endif
+
+	u8value = 0x50; /* element id TODO: define macro or enum */
+	buffer_copy(&g_nas_buffer, &u8value, sizeof(u8value));
+	datalen = 11;
+	buffer_copy(&g_nas_buffer, &datalen, sizeof(datalen));
+
+	u8value = 246; /* TODO: remove hard coding */
+	buffer_copy(&g_nas_buffer, &u8value, sizeof(u8value));
+	buffer_copy(&g_nas_buffer, &(ies[4].pduElement.mi_guti.plmn_id.idx), 3);
+	buffer_copy(&g_nas_buffer, &(ies[4].pduElement.mi_guti.mme_grp_id),
+			sizeof(ies[4].pduElement.mi_guti.mme_grp_id));
+	buffer_copy(&g_nas_buffer, &(ies[4].pduElement.mi_guti.mme_code),
+			sizeof(ies[4].pduElement.mi_guti.mme_code));
+	buffer_copy(&g_nas_buffer, &(ies[4].pduElement.mi_guti.m_TMSI),
+			sizeof(ies[4].pduElement.mi_guti.m_TMSI));
+
+#if 0
+    {
+        // sending mobile identity to UE 
+    /*TODO : Experiment */
+	u8value = 0x23; /* element id TODO: define macro or enum */
+	buffer_copy(&g_nas_buffer, &u8value, sizeof(u8value));
+	datalen = 0x05;
+	buffer_copy(&g_nas_buffer, &datalen, sizeof(datalen));
+    u8value = 0xf4; //
+	buffer_copy(&g_nas_buffer, &u8value, sizeof(u8value));
+	buffer_copy(&g_nas_buffer, &(ies[4].pduElement.mi_guti.m_TMSI),
+			sizeof(ies[4].pduElement.mi_guti.m_TMSI));
+    }
+#endif
+	/* E_RABToBeSetupListCtxtSUReq NAS PDU end */
+
+	/* Calculate mac */
+	uint8_t direction = 1;
+	uint8_t bearer = 0;
+
+	calculate_mac(g_icsReqInfo->int_key, nas_hdr->seq_no,
+			direction, bearer, &g_nas_buffer.buf[mac_data_pos],
+			g_nas_buffer.pos - mac_data_pos,
+			&g_nas_buffer.buf[mac_data_pos - MAC_SIZE]);
+
+	/* Copy nas length to nas length field */
+    //uint16_t nas_pay_len = g_nas_buffer.pos - nas_len_pos - 1;
+	log_msg(LOG_INFO, "NAS payload length %d\n", g_nas_buffer.pos);
+
+    /* start: RAB2 + NAS start */
+    /* Now lets append NAS buffer to rab2....so rab2 = rab2_buf + nas_length + nas_buf  */
+    if(g_nas_buffer.pos <= 127 )
+    {
+	  /* datalen = g_nas_buffer.pos - nas_len_pos - 1; */
+        datalen = g_nas_buffer.pos;
+	    buffer_copy(&g_rab2_buffer, &datalen, sizeof(datalen));
+    }
+    else
+    {
+        uint16_t nas_pay_len  = g_nas_buffer.pos | 0x8000; // set MSB to 1 
+        unsigned char lenStr[2];
+        lenStr[0] = nas_pay_len >> 8;
+        lenStr[1] = nas_pay_len & 0xff;
+	    buffer_copy(&g_rab2_buffer, lenStr, sizeof(lenStr));
+    }
+	buffer_copy(&g_rab2_buffer, &g_nas_buffer.buf[0], g_nas_buffer.pos);
+    /* end : RAB2 + NAS done */
+
+	log_msg(LOG_INFO, "RAB2 payload length %d\n", g_rab2_buffer.pos);
+    /* Now lets append rab2 to rab1 */ 
+    if(g_rab2_buffer.pos <= 127)
+    {
+        datalen = g_rab2_buffer.pos;
+	    buffer_copy(&g_rab1_buffer, &datalen, sizeof(datalen));
+    }
+    else
+    {
+        uint16_t rab2_pay_len  = g_rab2_buffer.pos | 0x8000; // set MSB to 1 
+        unsigned char lenStr[2];
+        lenStr[0] = rab2_pay_len >> 8;
+        lenStr[1] = rab2_pay_len & 0xff;
+	    buffer_copy(&g_rab1_buffer, lenStr, sizeof(lenStr));
+    }
+	buffer_copy(&g_rab1_buffer, &g_rab2_buffer.buf[0], g_rab2_buffer.pos);
+    /* rab1 + rab2 is appended */ 
+    // rab1 is combined now ... 
+
+    /*g_s1ap_buffer is having rab appended to it.. */
+
+	log_msg(LOG_INFO, "RAB1 payload length %d\n", g_rab1_buffer.pos);
+    if(g_rab1_buffer.pos <= 127)
+    {
+        datalen = g_rab1_buffer.pos;
+	    buffer_copy(&(g_s1ap_buffer), &datalen, sizeof(datalen));
+    }
+    else
+    {
+        uint16_t rab1_pay_len  = g_rab1_buffer.pos | 0x8000; // set MSB to 1 
+        unsigned char lenStr[2];
+        lenStr[0] = rab1_pay_len >> 8;
+        lenStr[1] = rab1_pay_len & 0xff;
+	    buffer_copy(&g_s1ap_buffer, lenStr, sizeof(lenStr));
+    }
+	buffer_copy(&g_s1ap_buffer, &g_rab1_buffer.buf[0], g_rab1_buffer.pos);
+    /* RAB is appended to s1ap payload now */ 
+
+	/* id-UESecurityCapabilities */
+	char ue_sec_capab[5] = {0x1c, 0x00, 0x0c, 0x00, 0x00};
+	protocolIe_Id = id_UESecurityCapabilities;
+	copyU16(tmpStr, protocolIe_Id);
+	buffer_copy(&g_s1ap_buffer, tmpStr, sizeof(protocolIe_Id));
+	protocolIe_criticality = CRITICALITY_REJECT;
+	buffer_copy(&g_s1ap_buffer, &protocolIe_criticality,
+					sizeof(protocolIe_criticality));
+	datalen = 5;
+	buffer_copy(&g_s1ap_buffer, &datalen, sizeof(datalen));
+	buffer_copy(&g_s1ap_buffer, ue_sec_capab, 5);
+
+	protocolIe_Id = id_SecurityKey;
+	copyU16(tmpStr, protocolIe_Id);
+	buffer_copy(&g_s1ap_buffer, tmpStr, sizeof(protocolIe_Id));
+	protocolIe_criticality = CRITICALITY_REJECT;
+	buffer_copy(&g_s1ap_buffer, &protocolIe_criticality,
+					sizeof(protocolIe_criticality));
+	datalen = SECURITY_KEY_SIZE;
+	buffer_copy(&g_s1ap_buffer, &datalen, sizeof(datalen));
+	buffer_copy(&g_s1ap_buffer, s1apPDU.value.data[5].val.sec_key,
+					SECURITY_KEY_SIZE);
+
+	/* Copy length to s1ap length field */
+	//datalen = g_s1ap_buffer.pos - s1ap_len_pos - 1;
+	//uint16_t s1aplen = g_s1ap_buffer.pos - s1ap_len_pos - 1;
+	log_msg(LOG_INFO, "S1AP payload length %d\n", g_s1ap_buffer.pos);
+	uint16_t s1aplen = g_s1ap_buffer.pos;
+    if(s1aplen <= 127 )
+    {
+        datalen = s1aplen; 
+	    buffer_copy(&g_ics_buffer, &datalen, sizeof(datalen));
+    }
+    else
+    {
+        s1aplen  = g_s1ap_buffer.pos | 0x8000; // set MSB to 1 
+        unsigned char lenStr[2];
+        lenStr[0] = s1aplen >> 8;
+        lenStr[1] = s1aplen & 0xff;
+	    buffer_copy(&g_ics_buffer, lenStr, sizeof(lenStr));
+    }
+
+    /* this is my final s1ap buffer */
+	buffer_copy(&g_ics_buffer, &g_s1ap_buffer.buf[0], g_s1ap_buffer.pos);
+
+	free(s1apPDU.value.data[3].val.E_RABToBeSetupItemCtxtSUReq.nas.elements);
+	free(s1apPDU.value.data);
+
+	send_sctp_msg(g_icsReqInfo->enb_fd, g_ics_buffer.buf, g_ics_buffer.pos, 1);
+	log_msg(LOG_INFO,"Initial Context Setup Request sent successfully\n");
+	return SUCCESS;
+}
+
+void*
+icsreq_handler(void *data)
+{
+	log_msg(LOG_INFO, "icsreq handler ready.\n");
+
+
+	icsreq_processing((struct init_ctx_req_Q_msg *)data);
+
+
+	return NULL;
+}
diff --git a/src/s1ap/handlers/attach_id_req.c b/src/s1ap/handlers/attach_id_req.c
new file mode 100644
index 0000000..45b1dcc
--- /dev/null
+++ b/src/s1ap/handlers/attach_id_req.c
@@ -0,0 +1,213 @@
+/*
+* Copyright 2019-present Open Networking Foundation
+*
+* SPDX-License-Identifier: Apache-2.0
+*
+* 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.
+*
+*/
+#include <stdio.h>
+#include <stdlib.h>
+#include <pthread.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdint.h>
+
+#include "log.h"
+#include "err_codes.h"
+#include "s1ap.h"
+#include "message_queues.h"
+#include "ipc_api.h"
+
+#include "main.h"
+#include "sctp_conn.h"
+#include "msgType.h"
+
+
+
+/**
+* Get ProtocolIE value ID Request sent by mme-app
+*/
+static int
+get_attach_id_request_protoie_value(struct proto_IE *value,struct attachIdReq_info *g_attachIdReqInfo)
+{
+	
+	
+	value->no_of_IEs = ATTACH_ID_REQUEST_NO_OF_IES;
+	
+	value->data = (proto_IEs *) malloc(ATTACH_ID_REQUEST_NO_OF_IES*
+			sizeof(proto_IEs));
+	
+
+	value->data[0].val.mme_ue_s1ap_id = g_attachIdReqInfo->ue_idx;
+	
+	value->data[1].val.enb_ue_s1ap_id = g_attachIdReqInfo->s1ap_enb_ue_id;
+    
+
+	log_msg(LOG_INFO, "mme_ue_s1ap_id %d and enb_ue_s1ap_id %d\n",
+			g_attachIdReqInfo->ue_idx, g_attachIdReqInfo->s1ap_enb_ue_id);
+
+	/* TODO: Add enum for security header type */
+	value->data[2].val.nas.header.security_header_type = 0;
+	value->data[2].val.nas.header.proto_discriminator = EPSMobilityManagementMessages;
+	value->data[2].val.nas.header.message_type = IdentityRequest;
+	value->data[2].val.nas.header.nas_security_param = 0;
+
+	return SUCCESS;
+}
+
+
+/**
+* Stage specific message processing.
+*/
+static int
+s1ap_attach_id_req_processing(struct attachIdReq_info *g_attachIdReqInfo)
+{
+	struct Buffer g_buffer;
+	struct Buffer g_value_buffer;
+	struct Buffer g_nas_buffer;
+
+	struct s1ap_PDU s1apPDU= {0};
+
+
+	s1apPDU.procedurecode = id_downlinkNASTransport;
+	s1apPDU.criticality = CRITICALITY_IGNORE;
+
+	get_attach_id_request_protoie_value(&s1apPDU.value,g_attachIdReqInfo);
+
+	/* Copy values to buffer from s1apPDU */
+
+	g_buffer.pos = 0;
+
+	uint8_t initiating_message = 0; /* TODO: Add enum */
+	buffer_copy(&g_buffer, &initiating_message,
+			sizeof(initiating_message));
+
+	buffer_copy(&g_buffer, &s1apPDU.procedurecode,
+			sizeof(s1apPDU.procedurecode));
+
+	buffer_copy(&g_buffer, &s1apPDU.criticality,
+			sizeof(s1apPDU.criticality));
+
+	/* Copy values in g_value_buffer */
+	g_value_buffer.pos = 0;
+
+	/* TODO remove hardcoded values */
+	unsigned char chProtoIENo[3] = {0,0,3};
+
+	buffer_copy(&g_value_buffer, chProtoIENo, 3);
+
+	unsigned char tmpStr[4];
+	/* id-MME-UE-S1AP-ID */
+	uint16_t protocolIe_Id = id_MME_UE_S1AP_ID;
+	copyU16(tmpStr, protocolIe_Id);
+	buffer_copy(&g_value_buffer, tmpStr,
+					sizeof(protocolIe_Id));
+
+	uint8_t protocolIe_criticality = CRITICALITY_REJECT;
+	buffer_copy(&g_value_buffer, &protocolIe_criticality,
+					sizeof(protocolIe_criticality));
+
+	uint8_t datalen = 2;
+
+	/* TODO needs proper handling*/
+	unsigned char mme_ue_id[3];
+	datalen = copyU16(mme_ue_id,
+			s1apPDU.value.data[0].val.mme_ue_s1ap_id);
+	buffer_copy(&g_value_buffer, &datalen, sizeof(datalen));
+	buffer_copy(&g_value_buffer, mme_ue_id, datalen);
+
+	/* id-eNB-UE-S1AP-ID */
+
+	protocolIe_Id = id_eNB_UE_S1AP_ID;
+	copyU16(tmpStr, protocolIe_Id);
+	buffer_copy(&g_value_buffer, tmpStr,
+						sizeof(protocolIe_Id));
+
+	buffer_copy(&g_value_buffer, &protocolIe_criticality,
+					sizeof(protocolIe_criticality));
+
+
+	/* TODO needs proper handling*/
+	unsigned char enb_ue_id[3];
+	datalen = copyU16(enb_ue_id,
+			s1apPDU.value.data[1].val.enb_ue_s1ap_id);
+	buffer_copy(&g_value_buffer, &datalen, sizeof(datalen));
+	buffer_copy(&g_value_buffer, enb_ue_id, datalen);
+	
+
+	/* id-NAS-PDU */
+	protocolIe_Id = id_NAS_PDU;
+	copyU16(tmpStr, protocolIe_Id);
+	buffer_copy(&g_value_buffer, tmpStr,
+						sizeof(protocolIe_Id));
+
+	buffer_copy(&g_value_buffer, &protocolIe_criticality,
+					sizeof(protocolIe_criticality));
+
+	struct nasPDU *nas = &(s1apPDU.value.data[2].val.nas);
+	uint8_t value = (nas->header.security_header_type) |
+			nas->header.proto_discriminator;
+
+	g_nas_buffer.pos = 0;
+
+	buffer_copy(&g_nas_buffer, &value, sizeof(value));
+
+	buffer_copy(&g_nas_buffer, &nas->header.message_type,
+						sizeof(nas->header.message_type));
+
+    value = g_attachIdReqInfo->ue_type; 
+	buffer_copy(&g_nas_buffer, &value, sizeof(value));
+
+	datalen = g_nas_buffer.pos + 1;
+
+	buffer_copy(&g_value_buffer, &datalen,
+						sizeof(datalen));
+
+	buffer_copy(&g_value_buffer, &g_nas_buffer.pos,
+						sizeof(g_nas_buffer.pos));
+
+
+	buffer_copy(&g_value_buffer, &g_nas_buffer,
+						g_nas_buffer.pos);
+
+	buffer_copy(&g_buffer, &g_value_buffer.pos,
+						sizeof(g_value_buffer.pos));
+
+	buffer_copy(&g_buffer, &g_value_buffer,
+						g_value_buffer.pos);
+
+	free(s1apPDU.value.data[2].val.nas.elements);
+	free(s1apPDU.value.data);
+
+	send_sctp_msg(g_attachIdReqInfo->enb_fd, g_buffer.buf, g_buffer.pos, 1);
+	
+	return SUCCESS;
+}
+
+
+
+/**
+* Thread function for stage.
+*/
+void*
+idreq_handler(void *data)
+{
+	
+	log_msg(LOG_INFO, "S1Ap attach Id Request handler ready.\n");
+
+	s1ap_attach_id_req_processing((struct attachIdReq_info *)data);
+
+	return NULL;
+}
+
diff --git a/src/s1ap/handlers/attach_id_resp.c b/src/s1ap/handlers/attach_id_resp.c
new file mode 100644
index 0000000..3c8c4c8
--- /dev/null
+++ b/src/s1ap/handlers/attach_id_resp.c
@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <pthread.h>
+
+#include "err_codes.h"
+#include "options.h"
+#include "ipc_api.h"
+#include "main.h"
+#include "s1ap.h"
+#include "s1ap_config.h"
+#include "sctp_conn.h"
+#include "s1ap_structs.h"
+#include "s1ap_msg_codes.h"
+#include "msgType.h"
+
+
+extern int g_enb_fd;
+extern ipc_handle ipc_S1ap_Hndl;
+extern struct time_stat g_attach_stats[];
+
+int
+s1_identity_resp_handler(struct proto_IE *s1_id_resp_ies)
+{
+	struct s1_incoming_msg_data_t id_resp= {0};
+
+	/*****Message structure***
+	*/
+	log_msg(LOG_INFO, "Parse s1ap identity resp message:--\n");
+
+	/*Validate all eNB info*/
+
+	/*Add eNB info to hash*/
+
+	/*Create Q structure for stage 1 to MME.
+	  contains init UE information.*/
+	id_resp.msg_type = id_response;
+    for(int i = 0; i < s1_id_resp_ies->no_of_IEs; i++)
+    {
+        switch(s1_id_resp_ies->data[i].IE_type)
+        {
+            case S1AP_IE_MME_UE_ID:
+                {
+	                id_resp.ue_idx = s1_id_resp_ies->data[i].val.mme_ue_s1ap_id;
+                }break;
+            case S1AP_IE_NAS_PDU:
+                {
+                    if(s1_id_resp_ies->data[i].val.nas.header.message_type != NAS_IDENTITY_RESPONSE)
+                    {
+                        id_resp.msg_data.identityResp_Q_msg_m.status  = S1AP_IDENTITY_FAILED; 
+                    }
+                    else
+                    {
+                        id_resp.msg_data.identityResp_Q_msg_m.status = SUCCESS;
+                    }
+
+                    memcpy(&(id_resp.msg_data.identityResp_Q_msg_m.IMSI), 
+                           &(s1_id_resp_ies->data[i].val.nas.elements[0].pduElement.IMSI),
+                           BINARY_IMSI_LEN);
+                }break;
+            default:
+                log_msg(LOG_WARNING,"Unhandled IE In identification Response %d",s1_id_resp_ies->data[i].IE_type);
+        }
+    }
+	id_resp.destInstAddr = htonl(mmeAppInstanceNum_c);
+	id_resp.srcInstAddr = htonl(s1apAppInstanceNum_c);
+
+	//STIMER_GET_CURRENT_TP(g_attach_stats[s1_id_resp_ies->data[1].enb_ue_s1ap_id].auth_to_mme);
+	send_tipc_message(ipc_S1ap_Hndl, mmeAppInstanceNum_c, (char *)&id_resp, S1_READ_MSG_BUF_SIZE);
+
+	/*Send S1Setup response*/
+	log_msg(LOG_INFO, "Id resp send to mme-app stage3.\n");
+
+	//TODO: free IEs
+	return SUCCESS;
+}
+
+
diff --git a/src/s1ap/handlers/attach_initctxresp.c b/src/s1ap/handlers/attach_initctxresp.c
new file mode 100644
index 0000000..3c3404b
--- /dev/null
+++ b/src/s1ap/handlers/attach_initctxresp.c
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <pthread.h>
+
+#include "err_codes.h"
+#include "options.h"
+#include "ipc_api.h"
+#include "main.h"
+#include "s1ap.h"
+#include "s1ap_config.h"
+#include "sctp_conn.h"
+#include "s1ap_structs.h"
+#include "s1ap_msg_codes.h"
+#include "msgType.h"
+
+
+extern int g_enb_fd;
+extern ipc_handle ipc_S1ap_Hndl;
+
+int
+s1_init_ctx_resp_handler(SuccessfulOutcome_t *msg)
+{
+	struct proto_IE s1_ics_ies;
+	struct s1_incoming_msg_data_t ics_resp= {0};
+
+	/*****Message structure****/
+	log_msg(LOG_INFO, "Parse int ctx s1ap response message:--\n");
+	/*parse_IEs(msg+2, &s1_ics_ies, S1AP_INITIAL_CTX_RESP_CODE);*/
+	convertInitCtxRspToProtoIe(msg, &s1_ics_ies);
+    
+	ics_resp.msg_type = init_ctxt_response;
+	
+	for(int i = 0; i < s1_ics_ies.no_of_IEs; i++)
+    {
+        switch(s1_ics_ies.data[i].IE_type)
+        {
+            case S1AP_IE_MME_UE_ID:
+                {
+	                ics_resp.ue_idx = s1_ics_ies.data[i].val.mme_ue_s1ap_id;
+                }break;
+            case S1AP_ERAB_SETUP_CTX_SUR:
+                {
+                    for(int j = 0; j < s1_ics_ies.data[i].val.erab.no_of_elements; j++)
+                    {
+                        /*TBD: Handle multiple erabs in ics rsp*/
+	                    ics_resp.msg_data.initctx_resp_Q_msg_m.transp_layer_addr = s1_ics_ies.data[i].val.erab.elements[j].su_res.transp_layer_addr;
+	                    ics_resp.msg_data.initctx_resp_Q_msg_m.gtp_teid = s1_ics_ies.data[i].val.erab.elements[j].su_res.gtp_teid;
+                        break;
+                    }
+                }break;
+            default:
+                log_msg(LOG_WARNING,"Unhandled IE");
+        }
+    }
+	
+	
+	
+	ics_resp.destInstAddr = htonl(mmeAppInstanceNum_c);
+	ics_resp.srcInstAddr = htonl(s1apAppInstanceNum_c);
+	int i = send_tipc_message(ipc_S1ap_Hndl, mmeAppInstanceNum_c, (char *)&ics_resp, S1_READ_MSG_BUF_SIZE);
+
+	if (i < 0) {
+		log_msg(LOG_ERROR, "Error to write in s1_init_ctx_resp_handler\n");
+	}
+	/*Send S1Setup response*/
+	log_msg(LOG_INFO, "Init ctx resp send to mme-app stage7. Bytes send %d\n", i);
+
+	//TODO: free IEs
+	return SUCCESS;
+}
diff --git a/src/s1ap/handlers/attach_initue.c b/src/s1ap/handlers/attach_initue.c
new file mode 100644
index 0000000..f62394f
--- /dev/null
+++ b/src/s1ap/handlers/attach_initue.c
@@ -0,0 +1,174 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <pthread.h>
+
+#include "err_codes.h"
+#include "options.h"
+#include "ipc_api.h"
+#include "main.h"
+#include "s1ap.h"
+#include "s1ap_config.h"
+#include "sctp_conn.h"
+#include "s1ap_structs.h"
+#include "s1ap_msg_codes.h"
+#include "msgType.h"
+
+extern int g_enb_fd;
+extern ipc_handle ipc_S1ap_Hndl;
+extern struct time_stat g_attach_stats[];
+
+int
+s1_init_ue_handler(struct proto_IE *s1_init_ies, int enodeb_fd)
+{
+	struct s1_incoming_msg_data_t ue_info = {0};
+    	int nas_index = 0;
+
+	/*****Message structure***
+	*/
+	log_msg(LOG_INFO, "Parse s1ap initial UE message\n");
+
+	/*Validate all eNB info*/
+
+	/*Add eNB info to hash*/
+	//STIMER_GET_CURRENT_TP(g_attach_stats[s1_init_ies->data[0].enb_ue_s1ap_id].init_ue);
+
+	/*Create Q structure for stage 1 to MME.
+	  contains init UE information.*/
+	ue_info.msg_type = attach_request;
+			
+	ue_info.msg_data.ue_attach_info_m.enb_fd = enodeb_fd;
+	ue_info.msg_data.ue_attach_info_m.criticality = s1_init_ies->criticality;//TBD
+    for(int i = 0; i < s1_init_ies->no_of_IEs; i++)
+    {
+        switch(s1_init_ies->data[i].IE_type)
+        {
+            case S1AP_IE_ENB_UE_ID:
+                {
+	                ue_info.msg_data.ue_attach_info_m.s1ap_enb_ue_id = s1_init_ies->data[i].val.enb_ue_s1ap_id;
+                }break;
+            case S1AP_IE_TAI:
+                {
+                    memcpy(&(ue_info.msg_data.ue_attach_info_m.tai), &(s1_init_ies->data[i].val.tai), sizeof(struct TAI));
+                }break;
+            case S1AP_IE_UTRAN_CGI:
+                {
+                    memcpy(&(ue_info.msg_data.ue_attach_info_m.utran_cgi), &(s1_init_ies->data[i].val.utran_cgi),
+                           sizeof(struct CGI));
+                }break;
+            case S1AP_IE_NAS_PDU:
+                {
+                    while(nas_index < s1_init_ies->data[i].val.nas.elements_len)
+                    {
+                        log_msg(LOG_INFO, "nasIndex %d, msgType %d\n",
+                                nas_index,
+                                s1_init_ies->data[i].val.nas.elements[nas_index].msgType);
+                        ue_info.msg_data.ue_attach_info_m.seq_no = s1_init_ies->data[i].val.nas.header.seq_no;
+                        switch(s1_init_ies->data[i].val.nas.elements[nas_index].msgType)
+                        {
+                            case NAS_IE_TYPE_ESM_MSG:
+                                {
+                                    break;
+                                }
+                            case NAS_IE_TYPE_EPS_MOBILE_ID_IMSI:
+                                {
+                                    ue_info.msg_data.ue_attach_info_m.flags = s1_init_ies->data[i].val.nas.flags;
+                                    if(UE_ID_IMSI(s1_init_ies->data[i].val.nas.flags))
+                                    { 
+                                        memcpy(&(ue_info.msg_data.ue_attach_info_m.IMSI), 
+                                               &(s1_init_ies->data[i].val.nas.elements[nas_index].pduElement.IMSI),
+                                               BINARY_IMSI_LEN);
+                                    }
+                                    else if(UE_ID_GUTI(s1_init_ies->data[i].val.nas.flags))
+                                    {
+                                        memcpy(&(ue_info.msg_data.ue_attach_info_m.mi_guti), &(s1_init_ies->data[i].val.nas.elements[nas_index].pduElement.mi_guti),
+                                               sizeof(struct guti));
+                                    }
+                                    break;
+                                }
+                            case NAS_IE_TYPE_UE_NETWORK_CAPABILITY:
+                                {
+                                    memcpy(&(ue_info.msg_data.ue_attach_info_m.ue_net_capab),
+                                           &(s1_init_ies->data[i].val.nas.\
+                                             elements[nas_index].pduElement.ue_network),
+                                           sizeof(struct UE_net_capab));
+
+                                    break;
+                                }
+                            case NAS_IE_TYPE_MS_NETWORK_CAPABILITY:
+                                {
+                                    memcpy(&(ue_info.msg_data.ue_attach_info_m.ms_net_capab),
+                                           &(s1_init_ies->data[i].val.nas.\
+                                             elements[nas_index].pduElement.ms_network),
+                                           sizeof(struct MS_net_capab));
+
+                                    break;
+                                }
+                            case NAS_IE_TYPE_TX_FLAG:
+                                {
+                                    ue_info.msg_data.ue_attach_info_m.esm_info_tx_required =
+                                        s1_init_ies->data[i].val.nas.elements[nas_index].pduElement.esm_info_tx_required;
+				    log_msg(LOG_INFO, "ESM info flag %d \n", ue_info.msg_data.ue_attach_info_m.esm_info_tx_required);
+                                    break;
+                                }
+                            case NAS_IE_TYPE_PTI:
+                                {
+                                    ue_info.msg_data.ue_attach_info_m.pti =
+                                        s1_init_ies->data[i].val.nas.elements[nas_index].pduElement.pti;
+                                    break;
+                                }
+                            case NAS_IE_TYPE_PCO:
+                                {
+                                    for(int pco=0; pco < 10; pco++)
+                                    {
+                                        ue_info.msg_data.ue_attach_info_m.pco_options[pco] = 
+                                            s1_init_ies->data[i].val.nas.elements[nas_index].pduElement.pco_options[pco];
+                                    }
+                                    break;
+                                }
+                            default:
+                                {
+                                    log_msg(LOG_INFO, "nas element not handled\n");
+                                }
+                        }
+
+                        nas_index++;
+                    }
+
+                }break;
+            default:
+                log_msg(LOG_WARNING,"Unhandled IE");
+        }
+    }
+
+	ue_info.destInstAddr = htonl(mmeAppInstanceNum_c);
+	ue_info.srcInstAddr = htonl(s1apAppInstanceNum_c);
+
+	send_tipc_message(ipc_S1ap_Hndl, mmeAppInstanceNum_c, (char *)&ue_info, S1_READ_MSG_BUF_SIZE);
+
+	/*Send S1Setup response*/
+	log_msg(LOG_INFO, "Send to mme-app stage1.\n");
+
+	return SUCCESS;
+}
+
+
diff --git a/src/s1ap/handlers/attach_reject.c b/src/s1ap/handlers/attach_reject.c
new file mode 100644
index 0000000..38c20dd
--- /dev/null
+++ b/src/s1ap/handlers/attach_reject.c
@@ -0,0 +1,231 @@
+/*
+* Copyright 2019-present Open Networking Foundation
+*
+* SPDX-License-Identifier: Apache-2.0
+*
+* 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.
+*
+*/
+#include <stdio.h>
+#include <stdlib.h>
+#include <pthread.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "log.h"
+#include "err_codes.h"
+#include "s1ap.h"
+#include "message_queues.h"
+#include "ipc_api.h"
+#include "main.h"
+#include "sctp_conn.h"
+#include "msgType.h"
+
+
+
+
+/**
+* Get ProtocolIE value for Auth Request sent by mme-app
+*/
+static int
+get_attachReject_protoie_value(struct proto_IE *value, struct attachReqRej_info *g_attachReqRejInfo)
+{
+	value->no_of_IEs = AUTH_REQ_NO_OF_IES;
+
+	value->data = (proto_IEs *) malloc(ATTACH_REJECT_NO_OF_IES*
+			sizeof(proto_IEs));
+
+	value->data[0].val.mme_ue_s1ap_id = g_attachReqRejInfo->ue_idx;
+	value->data[1].val.enb_ue_s1ap_id = g_attachReqRejInfo->s1ap_enb_ue_id;
+
+	log_msg(LOG_INFO, "mme_ue_s1ap_id %d and enb_ue_s1ap_id %d\n",
+			g_attachReqRejInfo->ue_idx, g_attachReqRejInfo->s1ap_enb_ue_id);
+
+	/* TODO: Add enum for security header type */
+	value->data[2].val.nas.header.security_header_type = 0;
+	value->data[2].val.nas.header.proto_discriminator = EPSMobilityManagementMessages;
+	value->data[2].val.nas.header.message_type = AttachReject;
+	value->data[2].val.nas.header.nas_security_param = 0;
+
+#if 0
+	value->data[2].nas.elements = (nas_pdu_elements *)
+			malloc(AUTH_REQ_NO_OF_NAS_IES * sizeof(nas_pdu_elements));
+
+	memcpy(value->data[2].nas.elements[0].rand,
+			g_attachReqRejInfo->rand, NAS_RAND_SIZE);
+	memcpy(value->data[2].nas.elements[1].autn,
+			g_attachReqRejInfo->autn, NAS_AUTN_SIZE);
+#endif
+
+
+	return SUCCESS;
+}
+
+
+/**
+* Stage specific message processing.
+*/
+static int
+s1ap_attach_reject_processing(struct attachReqRej_info *g_attachReqRejInfo)
+{
+	struct Buffer g_buffer;
+	struct Buffer g_value_buffer;
+	struct Buffer g_nas_buffer;
+	struct s1ap_PDU s1apPDU= {0};
+
+
+
+	/* Assigning values to s1apPDU */
+	s1apPDU.procedurecode = id_downlinkNASTransport;
+	s1apPDU.criticality = CRITICALITY_IGNORE;
+
+	get_attachReject_protoie_value(&s1apPDU.value,g_attachReqRejInfo);
+
+	/* Copy values to buffer from s1apPDU */
+
+	g_buffer.pos = 0;
+
+	uint8_t initiating_message = 0; /* TODO: Add enum */
+	buffer_copy(&g_buffer, &initiating_message,
+			sizeof(initiating_message));
+
+	buffer_copy(&g_buffer, &s1apPDU.procedurecode,
+			sizeof(s1apPDU.procedurecode));
+
+	buffer_copy(&g_buffer, &s1apPDU.criticality,
+			sizeof(s1apPDU.criticality));
+
+	/* Copy values in g_value_buffer */
+	g_value_buffer.pos = 0;
+
+	/* TODO remove hardcoded values */
+	unsigned char chProtoIENo[3] = {0,0,3};
+
+	buffer_copy(&g_value_buffer, chProtoIENo, 3);
+
+	unsigned char tmpStr[4];
+
+	/* id-MME-UE-S1AP-ID */
+	uint16_t protocolIe_Id = id_MME_UE_S1AP_ID;
+	copyU16(tmpStr, protocolIe_Id);
+	buffer_copy(&g_value_buffer, tmpStr,
+					sizeof(protocolIe_Id));
+
+	uint8_t protocolIe_criticality = CRITICALITY_REJECT;
+	buffer_copy(&g_value_buffer, &protocolIe_criticality,
+					sizeof(protocolIe_criticality));
+
+	uint8_t datalen = 2;
+
+	/* TODO needs proper handling*/
+	unsigned char mme_ue_id[3];
+	datalen = copyU16(mme_ue_id,
+			s1apPDU.value.data[0].val.mme_ue_s1ap_id);
+	buffer_copy(&g_value_buffer, &datalen, sizeof(datalen));
+	buffer_copy(&g_value_buffer, mme_ue_id, datalen);
+
+	/* id-eNB-UE-S1AP-ID */
+
+	protocolIe_Id = id_eNB_UE_S1AP_ID;
+	copyU16(tmpStr, protocolIe_Id);
+	buffer_copy(&g_value_buffer, tmpStr,
+						sizeof(protocolIe_Id));
+
+	buffer_copy(&g_value_buffer, &protocolIe_criticality,
+					sizeof(protocolIe_criticality));
+
+
+	/* TODO needs proper handling*/
+	unsigned char enb_ue_id[3];
+	datalen = copyU16(enb_ue_id,
+			s1apPDU.value.data[1].val.enb_ue_s1ap_id);
+	buffer_copy(&g_value_buffer, &datalen, sizeof(datalen));
+	buffer_copy(&g_value_buffer, enb_ue_id, datalen);
+
+	/* id-NAS-PDU */
+	protocolIe_Id = id_NAS_PDU;
+	copyU16(tmpStr, protocolIe_Id);
+	buffer_copy(&g_value_buffer, tmpStr,
+						sizeof(protocolIe_Id));
+
+	buffer_copy(&g_value_buffer, &protocolIe_criticality,
+					sizeof(protocolIe_criticality));
+
+	struct nasPDU *nas = &(s1apPDU.value.data[2].val.nas);
+	uint8_t value = (nas->header.security_header_type) |
+			nas->header.proto_discriminator;
+
+	g_nas_buffer.pos = 0;
+
+	buffer_copy(&g_nas_buffer, &value, sizeof(value));
+
+	buffer_copy(&g_nas_buffer, &nas->header.message_type,
+						sizeof(nas->header.message_type));
+
+#if 0
+	buffer_copy(&g_nas_buffer, &nas->header.nas_security_param,
+						sizeof(nas->header.nas_security_param));
+
+#endif
+    value = 0x09; // UE identity can not be derived by the network
+	buffer_copy(&g_nas_buffer, &value, sizeof(value));
+
+#if 0
+	buffer_copy(&g_nas_buffer, &nas->elements[0].pduElement.rand,
+						sizeof(nas->elements[0].pduElement.rand));
+
+	datalen = 16;
+	buffer_copy(&g_nas_buffer, &datalen, sizeof(datalen));
+
+	buffer_copy(&g_nas_buffer, &nas->elements[1].pduElement.autn,
+						sizeof(nas->elements[1].pduElement.autn));
+
+    /* Done with filling NAS message */
+#endif
+	datalen = g_nas_buffer.pos + 1;
+
+	buffer_copy(&g_value_buffer, &datalen,
+						sizeof(datalen));
+
+	buffer_copy(&g_value_buffer, &g_nas_buffer.pos,
+						sizeof(g_nas_buffer.pos));
+
+
+	buffer_copy(&g_value_buffer, &g_nas_buffer,
+						g_nas_buffer.pos);
+
+	buffer_copy(&g_buffer, &g_value_buffer.pos,
+						sizeof(g_value_buffer.pos));
+
+	buffer_copy(&g_buffer, &g_value_buffer,
+						g_value_buffer.pos);
+
+	free(s1apPDU.value.data[2].val.nas.elements);
+	free(s1apPDU.value.data);
+	send_sctp_msg(g_attachReqRejInfo->enb_fd, g_buffer.buf, g_buffer.pos,1);
+	return SUCCESS;
+}
+
+
+void*
+attach_reject_handler(void *data)
+{
+	
+	log_msg(LOG_INFO, "S1Ap attach Reject handler ready.\n");
+
+s1ap_attach_reject_processing((struct attachReqRej_info *)data);
+
+	
+	return NULL;
+}
+
diff --git a/src/s1ap/handlers/attach_secmoderesp.c b/src/s1ap/handlers/attach_secmoderesp.c
new file mode 100644
index 0000000..0215075
--- /dev/null
+++ b/src/s1ap/handlers/attach_secmoderesp.c
@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <pthread.h>
+
+#include "err_codes.h"
+#include "options.h"
+#include "ipc_api.h"
+#include "main.h"
+#include "s1ap.h"
+#include "s1ap_config.h"
+#include "sctp_conn.h"
+#include "s1ap_structs.h"
+#include "s1ap_msg_codes.h"
+#include "msgType.h"
+
+
+extern int g_enb_fd;
+extern ipc_handle ipc_S1ap_Hndl;
+
+int
+s1_secmode_resp_handler(struct proto_IE *s1_sec_resp_ies)
+{
+	//TODO: use static instead of synamic for perf.
+	struct s1_incoming_msg_data_t secmode_resp= {0};
+
+	/*****Message structure***
+	*/
+	log_msg(LOG_INFO, "Parse s1ap sec mode complete message:--\n");
+
+	/*Validate all eNB info*/
+
+	/*Add eNB info to hash*/
+
+	/*Create Q structure for stage 1 to MME.
+	  contains init UE information.*/
+	secmode_resp.msg_type = sec_mode_complete;
+	
+	for(int i = 0; i < s1_sec_resp_ies->no_of_IEs; i++)
+    {
+        switch(s1_sec_resp_ies->data[i].IE_type)
+        {
+            case S1AP_IE_MME_UE_ID:
+                {
+	                secmode_resp.ue_idx = s1_sec_resp_ies->data[i].val.mme_ue_s1ap_id;
+                }break;
+            case S1AP_IE_NAS_PDU:
+                {
+                    if(s1_sec_resp_ies->data[i].val.nas.header.message_type != NAS_SEC_MODE_COMPLETE)
+                    {
+                        secmode_resp.msg_data.secmode_resp_Q_msg_m.status = S1AP_SECMODE_FAILED;//Error in authentication
+                    }
+                    else
+                    {
+                        secmode_resp.msg_data.secmode_resp_Q_msg_m.status = SUCCESS;
+                    }
+
+                }break;
+            default:
+                log_msg(LOG_WARNING,"Unhandled IE");
+        }
+    }
+
+	/*Copy xres from response, send to mme for verification*/
+	//...
+	//auth_res.res.len = a1_secmode_resp_ies[2].data.nas.authresp_len;
+	//memcpy(&(auth_res.res.val, s1_sec_resp_ies[2].data.nas.RES, authres.res.len);
+
+	secmode_resp.destInstAddr = htonl(mmeAppInstanceNum_c);
+	secmode_resp.srcInstAddr = htonl(s1apAppInstanceNum_c);
+	send_tipc_message(ipc_S1ap_Hndl, mmeAppInstanceNum_c, (char *)&secmode_resp, S1_READ_MSG_BUF_SIZE);
+
+	/*Send S1Setup response*/
+	log_msg(LOG_INFO, "Auth resp send to mme-app stage4.\n");
+
+	//TODO: free IEs
+	return SUCCESS;
+}
+
diff --git a/src/s1ap/handlers/attach_secreq.c b/src/s1ap/handlers/attach_secreq.c
new file mode 100644
index 0000000..8dfff86
--- /dev/null
+++ b/src/s1ap/handlers/attach_secreq.c
@@ -0,0 +1,293 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <pthread.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdint.h>
+
+#include "err_codes.h"
+#include "message_queues.h"
+#include "ipc_api.h"
+#include "log.h"
+#include "main.h"
+#include "s1ap.h"
+#include "sctp_conn.h"
+#include "msgType.h"
+#include "snow_3g.h"
+
+/**
+* Get ProtocolIE value for Sec Request sent by mme-app
+*/
+static int
+get_secreq_protoie_value(struct proto_IE *value, struct sec_mode_Q_msg * g_secReqInfo)
+{
+	value->no_of_IEs = SEC_MODE_NO_OF_IES;
+
+	value->data = (proto_IEs *) malloc(SEC_MODE_NO_OF_IES *
+			sizeof(proto_IEs));
+
+	value->data[0].val.mme_ue_s1ap_id = g_secReqInfo->ue_idx;
+	value->data[1].val.enb_ue_s1ap_id = g_secReqInfo->enb_s1ap_ue_id;
+
+	value->data[2].val.nas.header.security_header_type =
+			IntegrityProtectedEPSSecCntxt;
+
+	value->data[2].val.nas.header.proto_discriminator =
+			EPSMobilityManagementMessages;
+
+	/* placeholder for mac. mac value will be calculated later */
+	uint8_t mac[MAC_SIZE] = {0};
+	memcpy(value->data[2].val.nas.header.mac, mac, MAC_SIZE);
+
+	value->data[2].val.nas.header.seq_no = g_secReqInfo->dl_seq_no;
+
+	value->data[2].val.nas.header.message_type = SecurityModeCommand;
+
+	value->data[2].val.nas.header.security_encryption_algo = Algo_EEA0;
+
+	value->data[2].val.nas.header.security_integrity_algo = Algo_128EIA1;
+
+	/* Security Param (1 octet) =
+	 * Spare half octet, Type of Security, NAS KSI
+	 * TODO: Remove hard coded value
+	 */
+	value->data[2].val.nas.header.nas_security_param = AUTHREQ_NAS_SECURITY_PARAM;
+
+	value->data[2].val.nas.elements_len = SEC_MODE_NO_OF_NAS_IES;
+
+	value->data[2].val.nas.elements = (nas_pdu_elements *)
+			malloc(SEC_MODE_NO_OF_NAS_IES * sizeof(nas_pdu_elements));
+
+	value->data[2].val.nas.elements->pduElement.ue_network.len =
+			g_secReqInfo->ue_network.len;
+	if(g_secReqInfo->ue_network.len >= 4)
+	{
+        /*Copy first 4 bytes of security algo info*/
+	    memcpy(value->data[2].val.nas.elements->pduElement.ue_network.capab, 
+               g_secReqInfo->ue_network.capab, 4);
+	   
+        log_msg(LOG_DEBUG, "UE network length : %d", g_secReqInfo->ue_network.len);
+        if(g_secReqInfo->ms_net_capab.pres == true)
+	    {
+	        /*The MS Network capability contains the GEA
+		* capability. The MSB of 1st Byte and the 2nd to
+		* 7th Bit of 2nd byte contain the GEA info.
+		* Thus the masks 0x7F : for GEA/1
+		* and mask 0x7D: for GEA2 -GEA7
+		*/
+            log_msg(LOG_DEBUG, "MS network present"); 
+	        value->data[2].val.nas.elements->pduElement.ue_network.len = 5;
+	    	unsigned char val = 0x00;
+		    val = g_secReqInfo->ms_net_capab.capab[0]&0x80;
+            val |= g_secReqInfo->ms_net_capab.capab[1]&0x7E;
+            val >>= 1;
+	        value->data[2].val.nas.elements->pduElement.ue_network.capab[4] = val;
+	    }
+	    else
+	    {
+	        /*If MS capability is not present. Then only 
+		* Capability till UMTS Algorithms is sent.*/
+            log_msg(LOG_DEBUG, "MS network not present"); 
+	        value->data[2].val.nas.elements->pduElement.ue_network.len = 4;
+	    }
+	}
+	else
+	{
+	    /*Copy as much info of UE network capability 
+	    * as received.
+	    */
+            log_msg(LOG_DEBUG, "UE network length again: %d", g_secReqInfo->ue_network.len);
+            memcpy(value->data[2].val.nas.elements->pduElement.ue_network.capab,
+               g_secReqInfo->ue_network.capab, g_secReqInfo->ue_network.len);
+	}
+
+	return SUCCESS;
+}
+
+
+/**
+* Stage specific message processing.
+*/
+static int
+secreq_processing(struct sec_mode_Q_msg * g_secReqInfo)
+{
+	Buffer g_sec_buffer;
+	Buffer g_sec_value_buffer;
+	Buffer g_sec_nas_buffer;
+
+	unsigned char tmpStr[4];
+	struct s1ap_PDU s1apPDU= {0};
+	uint8_t mac_data_pos;
+
+	s1apPDU.procedurecode = id_downlinkNASTransport;
+	s1apPDU.criticality = CRITICALITY_IGNORE;
+
+	get_secreq_protoie_value(&s1apPDU.value, g_secReqInfo);
+
+	/* Copy values to g_sec_nas_buffer */
+
+	/* id-NAS-PDU */
+	g_sec_nas_buffer.pos = 0;
+	nasPDU nas = s1apPDU.value.data[2].val.nas;
+
+	unsigned char value = (nas.header.security_header_type << 4 |
+			nas.header.proto_discriminator);
+
+	buffer_copy(&g_sec_nas_buffer, &value, sizeof(value));
+
+	/* placeholder for mac. mac value will be calculated later */
+	buffer_copy(&g_sec_nas_buffer, &nas.header.mac, MAC_SIZE);
+
+	mac_data_pos = g_sec_nas_buffer.pos;
+
+	buffer_copy(&g_sec_nas_buffer, &nas.header.seq_no,
+			sizeof(nas.header.seq_no));
+
+	nas.header.security_header_type = Plain;
+	value = nas.header.security_header_type |
+				nas.header.proto_discriminator;
+	buffer_copy(&g_sec_nas_buffer, &value, sizeof(value));
+
+	buffer_copy(&g_sec_nas_buffer, &nas.header.message_type,
+			sizeof(nas.header.message_type));
+
+	value = (nas.header.security_encryption_algo << 4 |
+				nas.header.security_integrity_algo);
+	buffer_copy(&g_sec_nas_buffer, &value, sizeof(value));
+
+	buffer_copy(&g_sec_nas_buffer, &nas.header.nas_security_param,
+			sizeof(nas.header.nas_security_param));
+
+	buffer_copy(&g_sec_nas_buffer, &nas.elements->pduElement.ue_network.len,
+			sizeof(nas.elements->pduElement.ue_network.len));
+
+	buffer_copy(&g_sec_nas_buffer, &nas.elements->pduElement.ue_network.capab,
+			nas.elements->pduElement.ue_network.len);
+
+	/* Calculate mac */
+	uint8_t direction = 1;
+	uint8_t bearer = 0;
+
+	calculate_mac(g_secReqInfo->int_key, nas.header.seq_no,
+			direction, bearer, &g_sec_nas_buffer.buf[mac_data_pos],
+			g_sec_nas_buffer.pos - mac_data_pos,
+			&g_sec_nas_buffer.buf[mac_data_pos - MAC_SIZE]);
+
+	/* Copy values in g_sec_value_buffer */
+	g_sec_value_buffer.pos = 0;
+
+	/* TODO remove hardcoded values */
+	char chProtoIENo[3] = {0,0,3};
+	buffer_copy(&g_sec_value_buffer, chProtoIENo, 3);
+
+	/* id-MME-UE-S1AP-ID */
+	uint16_t protocolIe_Id = id_MME_UE_S1AP_ID;
+	copyU16(tmpStr, protocolIe_Id);
+	buffer_copy(&g_sec_value_buffer, tmpStr,
+					sizeof(protocolIe_Id));
+
+	unsigned char protocolIe_criticality = CRITICALITY_REJECT;
+	buffer_copy(&g_sec_value_buffer, &protocolIe_criticality,
+					sizeof(protocolIe_criticality));
+
+	unsigned char datalen = 2;
+
+	/* TODO need to add proper handling*/
+	unsigned char mme_ue_id[3];
+	datalen = copyU16(mme_ue_id, s1apPDU.value.data[0].val.mme_ue_s1ap_id);
+	buffer_copy(&g_sec_value_buffer, &datalen, sizeof(datalen));
+	buffer_copy(&g_sec_value_buffer, mme_ue_id, datalen);
+
+	/* id-eNB-UE-S1AP-ID */
+	protocolIe_Id = id_eNB_UE_S1AP_ID;
+	copyU16(tmpStr, protocolIe_Id);
+	buffer_copy(&g_sec_value_buffer, tmpStr,
+						sizeof(protocolIe_Id));
+
+	buffer_copy(&g_sec_value_buffer, &protocolIe_criticality,
+					sizeof(protocolIe_criticality));
+
+	/* TODO needs proper handling*/
+	unsigned char enb_ue_id[3];
+	datalen = copyU16(enb_ue_id, s1apPDU.value.data[1].val.enb_ue_s1ap_id);
+	buffer_copy(&g_sec_value_buffer, &datalen, sizeof(datalen));
+	buffer_copy(&g_sec_value_buffer, enb_ue_id, datalen);
+
+	/* id-NAS-PDU */
+	protocolIe_Id = id_NAS_PDU;
+	copyU16(tmpStr, protocolIe_Id);
+	buffer_copy(&g_sec_value_buffer, tmpStr,
+			sizeof(protocolIe_Id));
+
+	buffer_copy(&g_sec_value_buffer, &protocolIe_criticality,
+			sizeof(protocolIe_criticality));
+
+
+	datalen = g_sec_nas_buffer.pos + 1;
+	buffer_copy(&g_sec_value_buffer, &datalen,
+			sizeof(datalen));
+
+	buffer_copy(&g_sec_value_buffer, &g_sec_nas_buffer.pos,
+			sizeof(g_sec_nas_buffer.pos));
+
+	buffer_copy(&g_sec_value_buffer, &g_sec_nas_buffer,
+			g_sec_nas_buffer.pos);
+
+	/* Copy values in g_sec_buffer */
+	g_sec_buffer.pos = 0;
+
+	unsigned char initiating_message = 0; /* TODO: Add enum */
+	buffer_copy(&g_sec_buffer, &initiating_message,
+			sizeof(initiating_message));
+
+	buffer_copy(&g_sec_buffer, &s1apPDU.procedurecode,
+			sizeof(s1apPDU.procedurecode));
+
+	buffer_copy(&g_sec_buffer, &s1apPDU.criticality,
+			sizeof(s1apPDU.criticality));
+
+	buffer_copy(&g_sec_buffer, &g_sec_value_buffer.pos,
+			sizeof(g_sec_value_buffer.pos));
+
+	buffer_copy(&g_sec_buffer, &g_sec_value_buffer,
+			g_sec_value_buffer.pos);
+
+	free(s1apPDU.value.data[2].val.nas.elements);
+	free(s1apPDU.value.data);
+	//STIMER_GET_CURRENT_TP(g_attach_stats[s1apPDU.value.data[1].enb_ue_s1ap_id].secreq_out);
+
+	send_sctp_msg(g_secReqInfo->enb_fd, g_sec_buffer.buf, g_sec_buffer.pos, 1);
+
+	return SUCCESS;
+}
+
+/**
+* Thread function for stage.
+*/
+void*
+secreq_handler(void *data)
+{
+	log_msg(LOG_INFO, "SecReq handler ready.\n");
+
+	secreq_processing((struct sec_mode_Q_msg *)data);
+
+	return NULL;
+}
diff --git a/src/s1ap/handlers/ctxrelease_cmp.c b/src/s1ap/handlers/ctxrelease_cmp.c
new file mode 100644
index 0000000..009f23d
--- /dev/null
+++ b/src/s1ap/handlers/ctxrelease_cmp.c
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2019, Infosys Ltd.
+ * 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <pthread.h>
+
+#include "err_codes.h"
+#include "options.h"
+#include "ipc_api.h"
+#include "main.h"
+#include "s1ap.h"
+#include "s1ap_config.h"
+#include "sctp_conn.h"
+#include "s1ap_structs.h"
+#include "s1ap_msg_codes.h"
+#include "msgType.h"
+
+
+extern int g_enb_fd;
+extern ipc_handle ipc_S1ap_Hndl;
+
+int
+s1_ctx_release_complete_handler(SuccessfulOutcome_t *msg)
+{
+	struct s1_incoming_msg_data_t release_complete= {0};
+	struct proto_IE s1_ctx_release_ies;
+
+	log_msg(LOG_INFO, "Parse s1ap context release complete message:--\n");
+
+	 convertUeCtxRelComplToProtoIe(msg, &s1_ctx_release_ies);
+
+	/*TODO: Validate all eNB info*/
+     for(int i = 0; i < s1_ctx_release_ies.no_of_IEs; i++)
+    {
+        switch(s1_ctx_release_ies.data[i].IE_type)
+        {
+            case S1AP_IE_MME_UE_ID:
+                {
+	                release_complete.ue_idx = s1_ctx_release_ies.data[i].val.mme_ue_s1ap_id;
+                }break;
+            default:
+                log_msg(LOG_WARNING,"Unhandled IE");
+        }
+    }
+
+	release_complete.msg_type = s1_release_complete;
+	release_complete.destInstAddr = htonl(mmeAppInstanceNum_c);
+	release_complete.srcInstAddr = htonl(s1apAppInstanceNum_c);
+	int i = 0;
+	i = send_tipc_message(ipc_S1ap_Hndl,mmeAppInstanceNum_c,
+				(char *)&release_complete,
+				S1_READ_MSG_BUF_SIZE);
+	if (i < 0) {
+
+		log_msg(LOG_ERROR,"Error To write in s1_ctx_release_code_handler\n");
+	}
+
+	log_msg(LOG_INFO, "Ctx Release complete sent to mme-app."
+				"Bytes sent %d\n", i);
+
+	//TODO: free IEs
+	return SUCCESS;
+}
+
diff --git a/src/s1ap/handlers/ctxrelease_req.c b/src/s1ap/handlers/ctxrelease_req.c
new file mode 100644
index 0000000..2a9305a
--- /dev/null
+++ b/src/s1ap/handlers/ctxrelease_req.c
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <pthread.h>
+
+#include "err_codes.h"
+#include "options.h"
+#include "ipc_api.h"
+#include "main.h"
+#include "s1ap.h"
+#include "s1ap_config.h"
+#include "sctp_conn.h"
+#include "s1ap_structs.h"
+#include "s1ap_msg_codes.h"
+#include "msgType.h"
+
+
+extern int g_enb_fd;
+extern ipc_handle ipc_S1ap_Hndl;
+
+int
+s1_ctx_release_request_handler(InitiatingMessage_t *msg)
+{
+	struct s1_incoming_msg_data_t release_request= {0};
+	struct proto_IE s1_ctx_rel_req_ies;
+
+	log_msg(LOG_INFO, "Parse s1ap context release request message:--\n");
+
+	convertUeCtxRelReqToProtoIe(msg, &s1_ctx_rel_req_ies);
+
+	/*TODO: Validate all eNB info*/
+     for(int i = 0; i < s1_ctx_rel_req_ies.no_of_IEs; i++)
+    {
+        switch(s1_ctx_rel_req_ies.data[i].IE_type)
+        {
+            case S1AP_IE_MME_UE_ID:
+                {
+	                release_request.ue_idx = s1_ctx_rel_req_ies.data[i].val.mme_ue_s1ap_id;
+                }break;
+            default:
+                log_msg(LOG_WARNING,"Unhandled IE.\n");
+        }
+    }
+
+	
+    release_request.msg_type = s1_release_request;
+	release_request.destInstAddr = htonl(mmeAppInstanceNum_c);
+	release_request.srcInstAddr = htonl(s1apAppInstanceNum_c);
+	int i = 0;
+	i = send_tipc_message(ipc_S1ap_Hndl,mmeAppInstanceNum_c,
+				(char *)&release_request,
+				S1_READ_MSG_BUF_SIZE);
+				
+	if (i < 0) {
+
+		log_msg(LOG_ERROR,"Error To write in s1_ctx_release_request_handler\n");
+	}
+
+	log_msg(LOG_INFO, "Ctx Release request sent to mme-app."
+				"Bytes send %d\n", i);
+
+	//TODO: free IEs
+	return SUCCESS;
+}
diff --git a/src/s1ap/handlers/ctxrelease_resp.c b/src/s1ap/handlers/ctxrelease_resp.c
new file mode 100644
index 0000000..4489ae4
--- /dev/null
+++ b/src/s1ap/handlers/ctxrelease_resp.c
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <pthread.h>
+
+#include "err_codes.h"
+#include "options.h"
+#include "ipc_api.h"
+#include "main.h"
+#include "s1ap.h"
+#include "s1ap_config.h"
+#include "sctp_conn.h"
+#include "s1ap_structs.h"
+#include "s1ap_msg_codes.h"
+#include "msgType.h"
+
+
+extern int g_enb_fd;
+extern ipc_handle ipc_S1ap_Hndl;
+
+int
+s1_ctx_release_resp_handler(SuccessfulOutcome_t *msg)
+{
+	struct s1_incoming_msg_data_t release_complete= {0};
+	struct proto_IE s1_ctx_release_ies;
+
+	log_msg(LOG_INFO, "Parse s1ap context release complete message:--\n");
+
+	 convertUeCtxRelComplToProtoIe(msg, &s1_ctx_release_ies);
+
+	/*TODO: Validate all eNB info*/
+     for(int i = 0; i < s1_ctx_release_ies.no_of_IEs; i++)
+    {
+        switch(s1_ctx_release_ies.data[i].IE_type)
+        {
+            case S1AP_IE_MME_UE_ID:
+                {
+	                release_complete.ue_idx = s1_ctx_release_ies.data[i].val.mme_ue_s1ap_id;
+                }break;
+            default:
+                log_msg(LOG_WARNING,"Unhandled IE");
+        }
+    }
+
+	release_complete.msg_type = s1_release_complete;
+	release_complete.destInstAddr = htonl(mmeAppInstanceNum_c);
+	release_complete.srcInstAddr = htonl(s1apAppInstanceNum_c);
+	int i = 0;
+	i = send_tipc_message(ipc_S1ap_Hndl,mmeAppInstanceNum_c,
+				(char *)&release_complete,
+				S1_READ_MSG_BUF_SIZE);
+	if (i < 0) {
+
+		log_msg(LOG_ERROR,"Error To write in s1_ctx_release_code_handler\n");
+	}
+
+	log_msg(LOG_INFO, "Ctx Release complete sent to mme-app."
+				"Bytes sent %d\n", i);
+
+	//TODO: free IEs
+	return SUCCESS;
+}
+
diff --git a/src/s1ap/handlers/detach_accept.c b/src/s1ap/handlers/detach_accept.c
new file mode 100644
index 0000000..b0e8c1f
--- /dev/null
+++ b/src/s1ap/handlers/detach_accept.c
@@ -0,0 +1,328 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <pthread.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdint.h>
+
+#include "log.h"
+#include "err_codes.h"
+#include "message_queues.h"
+#include "ipc_api.h"
+#include "s1ap.h"
+#include "s1ap_config.h"
+#include "main.h"
+#include "msgType.h"
+
+static int
+get_detach_accept_protoie_value(struct proto_IE *value, struct detach_accept_Q_msg *g_acptReqInfo)
+{
+	uint8_t ieCnt = 0;
+
+	value->no_of_IEs = DTCH_ACCEPT_NO_OF_IES;
+
+	value->data = (proto_IEs *) malloc(DTCH_ACCEPT_NO_OF_IES *
+			sizeof(proto_IEs));
+
+	value->data[ieCnt].val.mme_ue_s1ap_id = g_acptReqInfo->ue_idx;
+	ieCnt++;
+
+	value->data[ieCnt].val.enb_ue_s1ap_id = g_acptReqInfo->enb_s1ap_ue_id;
+	ieCnt++;
+
+	struct nasPDU *nas = &(value->data[ieCnt].val.nas);
+	nas->header.security_header_type = IntegrityProtectedCiphered;
+	nas->header.proto_discriminator = EPSMobilityManagementMessages;
+
+	/* placeholder for mac. mac value will be calculated later */
+	uint8_t mac[MAC_SIZE] = {0};
+	memcpy(nas->header.mac, mac, MAC_SIZE);
+
+	nas->header.seq_no = g_acptReqInfo->dl_seq_no;
+	nas->header.message_type = DetachAccept;
+
+	ieCnt++;
+
+	return SUCCESS;
+}
+
+/**
+* Stage specific message processing.
+*/
+static int
+detach_accept_processing(struct detach_accept_Q_msg *g_acptReqInfo)
+{
+	unsigned char tmpStr[4];
+	struct s1ap_PDU s1apPDU= {0};
+	uint16_t protocolIe_Id;
+	uint8_t protocolIe_criticality = CRITICALITY_REJECT;
+	uint8_t initiating_msg = 0;
+	uint8_t datalen = 0;
+	uint8_t s1ap_len_pos;
+	uint8_t nas_len_pos;
+	uint8_t u8value = 0;
+	uint8_t mac_data_pos;
+
+	Buffer g_acpt_buffer;
+
+	s1apPDU.procedurecode = id_downlinkNASTransport;
+	s1apPDU.criticality = CRITICALITY_IGNORE;
+
+	get_detach_accept_protoie_value(&s1apPDU.value, g_acptReqInfo);
+
+	g_acpt_buffer.pos = 0;
+
+	buffer_copy(&g_acpt_buffer, &initiating_msg,
+			sizeof(initiating_msg));
+
+	buffer_copy(&g_acpt_buffer, &s1apPDU.procedurecode,
+			sizeof(s1apPDU.procedurecode));
+
+	buffer_copy(&g_acpt_buffer, &s1apPDU.criticality,
+				sizeof(s1apPDU.criticality));
+
+	s1ap_len_pos = g_acpt_buffer.pos;
+
+	/* length of Detach Accept */
+	u8value = 0;
+	buffer_copy(&g_acpt_buffer, &u8value, sizeof(u8value));
+
+	/* TODO remove hardcoded values */
+	uint8_t chProtoIENo[3] = {0,0,3};
+	buffer_copy(&g_acpt_buffer, chProtoIENo, 3);
+
+	/* id-MME-UE-S1AP-ID */
+	protocolIe_Id = id_MME_UE_S1AP_ID;
+	copyU16(tmpStr, protocolIe_Id);
+	buffer_copy(&g_acpt_buffer, tmpStr, sizeof(protocolIe_Id));
+	buffer_copy(&g_acpt_buffer, &protocolIe_criticality,
+					sizeof(protocolIe_criticality));
+	datalen = 2;
+	/* TODO need to add proper handling*/
+	unsigned char mme_ue_id[3];
+	datalen = copyU16(mme_ue_id, s1apPDU.value.data[0].val.mme_ue_s1ap_id);
+	buffer_copy(&g_acpt_buffer, &datalen, sizeof(datalen));
+	buffer_copy(&g_acpt_buffer, mme_ue_id, datalen);
+
+	/* id-eNB-UE-S1AP-ID */
+	protocolIe_Id = id_eNB_UE_S1AP_ID;
+	copyU16(tmpStr, protocolIe_Id);
+	buffer_copy(&g_acpt_buffer, tmpStr, sizeof(protocolIe_Id));
+	buffer_copy(&g_acpt_buffer, &protocolIe_criticality,
+					sizeof(protocolIe_criticality));
+	/* TODO needs proper handling*/
+	unsigned char enb_ue_id[3];
+	datalen = copyU16(enb_ue_id, s1apPDU.value.data[1].val.enb_ue_s1ap_id);
+	buffer_copy(&g_acpt_buffer, &datalen, sizeof(datalen));
+	buffer_copy(&g_acpt_buffer, enb_ue_id, datalen);
+
+	/* NAS PDU start */
+	protocolIe_Id = id_NAS_PDU;
+	copyU16(tmpStr, protocolIe_Id);
+	buffer_copy(&g_acpt_buffer, tmpStr, sizeof(protocolIe_Id));
+	buffer_copy(&g_acpt_buffer, &protocolIe_criticality,
+					sizeof(protocolIe_criticality));
+
+	nas_len_pos = g_acpt_buffer.pos;
+
+	datalen = 0;
+	buffer_copy(&g_acpt_buffer, &datalen, sizeof(datalen));
+
+	buffer_copy(&g_acpt_buffer, &datalen, sizeof(datalen));
+
+	nas_pdu_header *nas_hdr = &(s1apPDU.value.data[2].val.nas.header);
+
+	/* security header and protocol discriminator */
+	u8value = (nas_hdr->security_header_type << 4 |
+			nas_hdr->proto_discriminator);
+	buffer_copy(&g_acpt_buffer, &u8value, sizeof(u8value));
+
+	/* mac */
+	/* placeholder for mac. mac value will be calculated later */
+	buffer_copy(&g_acpt_buffer, nas_hdr->mac, MAC_SIZE);
+	mac_data_pos = g_acpt_buffer.pos;
+
+	/* sequence number */
+	buffer_copy(&g_acpt_buffer, &(nas_hdr->seq_no),
+			sizeof(nas_hdr->seq_no));
+
+	/* security header and protocol discriminator */
+	nas_hdr->security_header_type = Plain;
+	u8value = (nas_hdr->security_header_type << 4 |
+			nas_hdr->proto_discriminator);
+	buffer_copy(&g_acpt_buffer, &u8value, sizeof(u8value));
+
+	/* message type */
+	buffer_copy(&g_acpt_buffer, &(nas_hdr->message_type),
+			sizeof(nas_hdr->message_type));
+
+	/* NAS PDU end */
+
+	/* Calculate mac */
+	uint8_t direction = 1;
+	uint8_t bearer = 0;
+
+	calculate_mac(g_acptReqInfo->int_key, nas_hdr->seq_no,
+			direction, bearer, &g_acpt_buffer.buf[mac_data_pos],
+			g_acpt_buffer.pos - mac_data_pos,
+			&g_acpt_buffer.buf[mac_data_pos - MAC_SIZE]);
+
+	/* Copy nas length to nas length field */
+	datalen = g_acpt_buffer.pos - nas_len_pos -1;
+	memcpy(&(g_acpt_buffer.buf[nas_len_pos]), &datalen, sizeof(datalen));
+
+	/* Copy nas length to nas length field */
+	datalen = g_acpt_buffer.pos - nas_len_pos - 2;
+	memcpy(&(g_acpt_buffer.buf[nas_len_pos + 1]), &datalen, sizeof(datalen));
+
+	/* Copy length to s1ap length field */
+	datalen = g_acpt_buffer.pos - s1ap_len_pos - 1;
+	memcpy(g_acpt_buffer.buf + s1ap_len_pos, &datalen, sizeof(datalen));
+
+	/* TODO: temp fix */
+	//g_ics_buffer.buf[1] = 0x09;
+	send_sctp_msg(g_acptReqInfo->enb_fd, g_acpt_buffer.buf, g_acpt_buffer.pos,1);
+
+	log_msg(LOG_INFO, "Detach Accept sent to UE.");
+
+	return SUCCESS;
+}
+
+/**
+* essage processing for ue context release
+*/
+static int
+ue_ctx_release_processing(struct detach_accept_Q_msg *g_acptReqInfo)
+{
+	Buffer g_ctxrel_buffer;
+	unsigned char tmpStr[4];
+	struct s1ap_PDU s1apPDU;
+	uint16_t protocolIe_Id;
+	uint8_t protocolIe_criticality = CRITICALITY_REJECT;
+	uint8_t initiating_msg = 0;
+	uint8_t datalen = 0;
+	uint8_t s1ap_len_pos;
+	uint8_t u8value = 0;
+
+	s1apPDU.procedurecode = id_UEContexRelease;
+	s1apPDU.criticality = CRITICALITY_IGNORE;
+
+	g_ctxrel_buffer.pos = 0;
+
+	buffer_copy(&g_ctxrel_buffer, &initiating_msg,
+			sizeof(initiating_msg));
+
+	buffer_copy(&g_ctxrel_buffer, &s1apPDU.procedurecode,
+			sizeof(s1apPDU.procedurecode));
+
+	buffer_copy(&g_ctxrel_buffer, &s1apPDU.criticality,
+				sizeof(s1apPDU.criticality));
+
+	s1ap_len_pos = g_ctxrel_buffer.pos;
+
+	/* length of UE Context Release */
+	u8value = 0;
+	buffer_copy(&g_ctxrel_buffer, &u8value, sizeof(u8value));
+
+	/* TODO remove hardcoded values */
+	uint8_t chProtoIENo[3] = {0,0,2};
+	buffer_copy(&g_ctxrel_buffer, chProtoIENo, 3);
+
+	/* id-UE-S1AP-IDs */
+	protocolIe_Id = id_UE_S1AP_IDs;
+	copyU16(tmpStr, protocolIe_Id);
+	buffer_copy(&g_ctxrel_buffer, tmpStr, sizeof(protocolIe_Id));
+	buffer_copy(&g_ctxrel_buffer, &protocolIe_criticality,
+					sizeof(protocolIe_criticality));
+
+	uint8_t mme_ue_id[4];
+	uint8_t mme_ue_id_len = copyU16(mme_ue_id,
+				s1apPDU.value.data[0].val.mme_ue_s1ap_id);
+
+	if (mme_ue_id[0] == 0x40 || mme_ue_id[0] == 0x80)
+		mme_ue_id[0] = ((mme_ue_id[0] & 0x0F)<<4 |
+				(mme_ue_id[0] & 0xF0)>>4);
+
+	uint8_t enb_ue_id[4];
+	uint8_t enb_ue_id_len = copyU16(enb_ue_id,
+				s1apPDU.value.data[1].val.enb_ue_s1ap_id);
+
+	datalen = mme_ue_id_len + enb_ue_id_len;
+	buffer_copy(&g_ctxrel_buffer, &datalen, sizeof(datalen));
+	buffer_copy(&g_ctxrel_buffer, mme_ue_id, mme_ue_id_len);
+	buffer_copy(&g_ctxrel_buffer, enb_ue_id, enb_ue_id_len);
+
+#if 0
+	/* id-MME-UE-S1AP-ID */
+	protocolIe_Id = id_MME_UE_S1AP_ID;
+	copyU16(tmpStr, protocolIe_Id);
+	buffer_copy(&g_ctxrel_buffer, tmpStr,
+	                                sizeof(protocolIe_Id));
+
+	protocolIe_criticality = CRITICALITY_REJECT;
+	buffer_copy(&g_ctxrel_buffer, &protocolIe_criticality,
+	                                sizeof(protocolIe_criticality));
+
+	datalen = 2;
+
+	/* TODO needs proper handling*/
+	unsigned char mme_ue_id[4];
+	datalen = copyU16(mme_ue_id, s1apPDU.value.data[0].val.mme_ue_s1ap_id);
+	buffer_copy(&g_ctxrel_buffer, &datalen, sizeof(datalen));
+	buffer_copy(&g_ctxrel_buffer, mme_ue_id, datalen);
+#endif
+
+	/* id-Cause */
+	protocolIe_Id = id_Cause;
+	protocolIe_criticality = CRITICALITY_IGNORE;
+	copyU16(tmpStr, protocolIe_Id);
+	buffer_copy(&g_ctxrel_buffer, tmpStr, sizeof(protocolIe_Id));
+	buffer_copy(&g_ctxrel_buffer, &protocolIe_criticality,
+					sizeof(protocolIe_criticality));
+	datalen = 1;
+	buffer_copy(&g_ctxrel_buffer, &datalen, sizeof(datalen));
+	/* TODO : Revisit. cause : nas(2) and value : detach (2), why 0x24 ? */
+	u8value = 0x24;
+	buffer_copy(&g_ctxrel_buffer, &u8value, sizeof(u8value));
+
+	/* Copy length to s1ap length field */
+	datalen = g_ctxrel_buffer.pos - s1ap_len_pos - 1;
+	memcpy(g_ctxrel_buffer.buf + s1ap_len_pos, &datalen, sizeof(datalen));
+	send_sctp_msg(g_acptReqInfo->enb_fd, g_ctxrel_buffer.buf, g_ctxrel_buffer.pos,1);
+
+	log_msg(LOG_INFO,"S1 Release sent to UE");
+
+	return SUCCESS;
+}
+
+/**
+* Thread function for stage.
+*/
+void*
+detach_accept_handler(void *data)
+{
+   log_msg(LOG_INFO, "detach accept handler ready.\n");
+   struct detach_accept_Q_msg *msg = (struct detach_accept_Q_msg *)data;
+
+   detach_accept_processing(msg);
+   ue_ctx_release_processing(msg);
+
+   return NULL;
+}
diff --git a/src/s1ap/handlers/detach_accept_from_ue.c b/src/s1ap/handlers/detach_accept_from_ue.c
new file mode 100644
index 0000000..1489af5
--- /dev/null
+++ b/src/s1ap/handlers/detach_accept_from_ue.c
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <pthread.h>
+
+#include "err_codes.h"
+#include "options.h"
+#include "ipc_api.h"
+#include "main.h"
+#include "s1ap.h"
+#include "s1ap_config.h"
+#include "sctp_conn.h"
+#include "s1ap_structs.h"
+#include "s1ap_msg_codes.h"
+#include "msgType.h"
+//#include "detach_stage1_info.h"
+
+extern int g_enb_fd;
+extern ipc_handle ipc_S1ap_Hndl;
+
+int
+detach_accept_from_ue_handler(struct proto_IE *detach_ies, bool retransmit)
+{
+	struct s1_incoming_msg_data_t acpt= {0};
+
+	/*****Message structure***
+	*/
+	log_msg(LOG_INFO, "Parse s1ap ni detach accept message\n");
+
+
+	/*Validate all eNB info*/
+
+	/*Add eNB info to hash*/
+
+	/*Create Q structure for detach stage 1 to MME.
+	  contains init UE information.*/
+	/* TODO : Revisit, in InitialContextSetup Request we are sending
+	 * MME UE S1AP Id as M-TMSI.
+	 */
+	acpt.msg_type = detach_accept_from_ue;
+	for(int i = 0; i < detach_ies->no_of_IEs; i++)
+    	{
+        switch(detach_ies->data[i].IE_type)
+        {
+            case S1AP_IE_MME_UE_ID:
+                {
+                    if (!retransmit)
+                    {
+                        acpt.ue_idx = detach_ies->data[i].val.mme_ue_s1ap_id;
+                    }
+                }
+		break;
+            case S1AP_IE_ENB_UE_ID:
+                {
+                    acpt.s1ap_enb_ue_id = detach_ies->data[i].val.enb_ue_s1ap_id;
+                }
+		break;
+            default:
+                log_msg(LOG_WARNING,"Unhandled IE");
+        }
+    	}
+
+	acpt.destInstAddr = htonl(mmeAppInstanceNum_c);
+	acpt.srcInstAddr = htonl(s1apAppInstanceNum_c);
+	send_tipc_message(ipc_S1ap_Hndl, mmeAppInstanceNum_c, (char *)&acpt, S1_READ_MSG_BUF_SIZE);
+
+	/*Send S1Setup response*/
+	log_msg(LOG_INFO, "Send to mme-app stage1.\n");
+
+	return SUCCESS;
+}
+
+
diff --git a/src/s1ap/handlers/detach_req.c b/src/s1ap/handlers/detach_req.c
new file mode 100644
index 0000000..5ff68d2
--- /dev/null
+++ b/src/s1ap/handlers/detach_req.c
@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <pthread.h>
+
+#include "err_codes.h"
+#include "options.h"
+#include "ipc_api.h"
+#include "main.h"
+#include "s1ap.h"
+#include "s1ap_config.h"
+#include "sctp_conn.h"
+#include "s1ap_structs.h"
+#include "s1ap_msg_codes.h"
+#include "msgType.h"
+
+
+extern int g_enb_fd;
+extern ipc_handle ipc_S1ap_Hndl;
+
+int
+detach_stage1_handler(struct proto_IE *detach_ies, bool retransmit)
+{
+	struct s1_incoming_msg_data_t req= {0};
+
+	/*****Message structure***
+	*/
+	log_msg(LOG_INFO, "Parse s1ap detach request message\n");
+
+	/*Validate all eNB info*/
+
+	/*Add eNB info to hash*/
+
+	/*Create Q structure for detach stage 1 to MME.
+	  contains init UE information.*/
+	/* TODO : Revisit, in InitialContextSetup Request we are sending
+	 * MME UE S1AP Id as M-TMSI.
+	 */
+	req.msg_type = detach_request;
+	for(int i = 0; i < detach_ies->no_of_IEs; i++)
+    {
+        switch(detach_ies->data[i].IE_type)
+        {
+            case S1AP_IE_MME_UE_ID:
+                {
+                    if (!retransmit)
+                    {
+                        req.ue_idx = detach_ies->data[i].val.mme_ue_s1ap_id;
+                    }
+                }break;
+            case S1AP_IE_ENB_UE_ID:
+                {
+                    req.s1ap_enb_ue_id = detach_ies->data[i].val.enb_ue_s1ap_id;
+                }break;
+            case S1AP_IE_NAS_PDU:
+                {
+                    if(retransmit)
+                    {
+                        req.msg_data.detachReq_Q_msg_m.ue_m_tmsi = ntohl(detach_ies->data[i].val.nas.elements[0].pduElement.mi_guti.m_TMSI);
+                    }
+                }break;
+            default:
+                log_msg(LOG_WARNING,"Unhandled IE");
+        }
+    }
+
+	req.destInstAddr = htonl(mmeAppInstanceNum_c);
+	req.srcInstAddr = htonl(s1apAppInstanceNum_c);
+	send_tipc_message(ipc_S1ap_Hndl, mmeAppInstanceNum_c, (char *)&req, S1_READ_MSG_BUF_SIZE);
+
+	/*Send S1Setup response*/
+	log_msg(LOG_INFO, "Send to mme-app stage1.\n");
+
+	return SUCCESS;
+}
+
+
diff --git a/src/s1ap/handlers/ics_req_paging.c b/src/s1ap/handlers/ics_req_paging.c
new file mode 100644
index 0000000..a26db1a
--- /dev/null
+++ b/src/s1ap/handlers/ics_req_paging.c
@@ -0,0 +1,112 @@
+/*
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <pthread.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdint.h>
+#include "common_proc_info.h"
+#include "log.h"
+#include "err_codes.h"
+#include "message_queues.h"
+#include "ipc_api.h"
+#include "s1ap.h"
+#include "s1ap_config.h"
+#include "main.h"
+#include "msgType.h"
+
+
+/*static int
+get_uectxtrelcmd_protoie_value(struct proto_IE *value, struct s1relcmd_info *g_uectxtrelcmd)
+{
+	//uint8_t ieCnt = 0;
+
+	value->no_of_IEs = UE_CTX_RELEASE_NO_OF_IES;
+
+	value->data = (proto_IEs *) malloc(UE_CTX_RELEASE_NO_OF_IES *
+			sizeof(proto_IEs));
+
+	value->data[0].mme_ue_s1ap_id = g_uectxtrelcmd->ue_idx;
+	
+	value->data[1].enb_ue_s1ap_id = g_uectxtrelcmd->enb_s1ap_ue_id;
+	
+	log_msg(LOG_INFO, "mme_ue_s1ap_id %d and enb_ue_s1ap_id %d\n",
+					g_uectxtrelcmd->ue_idx,g_uectxtrelcmd->enb_s1ap_ue_id);
+	return SUCCESS;
+}*/
+
+/**
+* Stage specific message processing.
+*/
+static int
+ics_req_paging_processing(struct ics_req_paging_Q_msg *g_icsreq)
+{
+	log_msg(LOG_DEBUG,"Process Init Ctxt Req for service Request.");
+	uint32_t length = 0;
+    	uint8_t *buffer = NULL;
+	
+	Buffer g_ics_req_buffer;
+	struct s1ap_common_req_Q_msg req= {0};
+	
+        log_msg(LOG_DEBUG,"Inside ics_req_paging processing\n");	
+	
+    	req.IE_type = S1AP_INIT_CTXT_SETUP_REQ;
+    	req.ue_idx = g_icsreq->ue_idx;
+	req.enb_fd = g_icsreq->enb_fd;
+	req.enb_s1ap_ue_id = g_icsreq->enb_s1ap_ue_id;
+    	req.mme_s1ap_ue_id = g_icsreq->ue_idx;
+	req.ueag_max_dl_bitrate = g_icsreq->ueag_max_dl_bitrate;
+	req.ueag_max_ul_bitrate = g_icsreq->ueag_max_ul_bitrate;
+	req.bearer_id = g_icsreq->bearer_id;
+	memcpy(&(req.gtp_teid), &(g_icsreq->gtp_teid), sizeof(struct fteid));
+	memcpy(&(req.sec_key), &(g_icsreq->sec_key), KENB_SIZE);	
+	
+	log_msg(LOG_DEBUG,"Before s1ap_encoder\n");
+
+	int ret = s1ap_mme_encode_initiating(&req, &buffer, &length);
+	log_msg(LOG_DEBUG,"Invoked s1ap_encoder\n");
+    	if(ret == -1)
+    	{
+        	log_msg(LOG_ERROR, "Encoding ics_req_paging failed.\n");
+        	return E_FAIL;
+    	}
+
+	buffer_copy(&g_ics_req_buffer, buffer, length);
+	send_sctp_msg(g_icsreq->enb_fd, g_ics_req_buffer.buf, g_ics_req_buffer.pos,1);
+	log_msg(LOG_INFO, "\n----ICS Req for paging sent to UE.---\n");
+	return SUCCESS;
+	
+}
+
+
+/**
+* Thread function for stage.
+*/
+void*
+ics_req_paging_handler(void *data)
+{
+
+	log_msg(LOG_INFO,"ICS Req for paging handler ready.\n");
+	
+	ics_req_paging_processing((struct ics_req_paging_Q_msg *)data);
+
+	return NULL;
+}
+
+
diff --git a/src/s1ap/handlers/ie_parsers.c b/src/s1ap/handlers/ie_parsers.c
new file mode 100644
index 0000000..1d9cfc0
--- /dev/null
+++ b/src/s1ap/handlers/ie_parsers.c
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <pthread.h>
+#include <string.h>
+#include <unistd.h>
+#include <arpa/inet.h>
+
+#include "log.h"
+#include "err_codes.h"
+#include "message_queues.h"
+#include "s1ap_ie.h"
+
+void* 
+ie_parse_global_enb_id(char *msg, int len)
+{
+	/*8 bytes
+	1- ignore
+	2,3,4 - plmn
+	5,6,7,8 - mactoeNBID*/
+	static struct ie_global_enb_id global_enb_id;
+	
+	memcpy(&(global_enb_id.plmn), msg, sizeof(int));
+	memcpy(&(global_enb_id.macro_enb_id), msg+(sizeof(int)), MACRO_ENB_ID_SIZE);
+	global_enb_id.plmn = ntohl(global_enb_id.plmn);
+	//global_enb_id.macro_enb_id = ntohl(global_enb_id.macro_enb_id);
+	log_msg(LOG_INFO, "plmn %x\n", global_enb_id.plmn);
+	log_msg(LOG_INFO, "Macro enb id %x-%x-%x-%x\n", global_enb_id.macro_enb_id[0],
+		global_enb_id.macro_enb_id[4],global_enb_id.macro_enb_id[8],global_enb_id.macro_enb_id[12]);
+	
+	return (void*)&global_enb_id;
+}
+
+void* 
+ie_parse_enb_name(char *msg, int len)
+{
+	return NULL;
+}
+
+void* 
+ie_parse_supported_TAs(char *msg, int len)
+{
+	return NULL;
+}
+
+void* 
+ie_parse_pagins_DRX(char *msg, int len)
+{
+	return NULL;
+}
diff --git a/src/s1ap/handlers/mme_msg_delegator.c b/src/s1ap/handlers/mme_msg_delegator.c
new file mode 100644
index 0000000..6ba0162
--- /dev/null
+++ b/src/s1ap/handlers/mme_msg_delegator.c
@@ -0,0 +1,93 @@
+/*
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <pthread.h>
+
+#include "options.h"
+#include "ipc_api.h"
+#include "main.h"
+#include "s1ap.h"
+#include "s1ap_config.h"
+#include "sctp_conn.h"
+#include "s1ap_structs.h"
+#include "s1ap_msg_codes.h"
+#include "s1ap_ie.h"
+#include "err_codes.h"
+#include "msgType.h"
+
+extern void* authreq_handler(void *data);
+extern void* secreq_handler(void *data);
+extern void* icsreq_handler(void *data);
+extern void* detach_accept_handler(void *data);
+extern void* ni_detach_request_handler(void *data);
+extern void* paging_handler(void *data);
+extern void* ics_req_paging_handler(void *data);
+extern void* tau_response_handler(void *data);
+
+void
+handle_mmeapp_message(void * data)
+{
+	log_msg(LOG_INFO, "handle mme-app message ");
+	
+	char *msg = ((char *) data) + (sizeof(uint32_t)*2);
+
+	msg_type_t* msg_type = (msg_type_t*)(msg);
+
+	switch(*msg_type)		
+	{	 
+    case id_request:
+        idreq_handler(msg);
+        break;
+	case auth_request:
+		authreq_handler(msg);
+		break;
+	case sec_mode_command:
+		secreq_handler(msg);
+		break;
+	case esm_info_request:
+		esmreq_handler(msg);
+		break;
+	case init_ctxt_request:
+		icsreq_handler(msg);
+		break;
+	case detach_accept:
+		detach_accept_handler(msg);
+		break;
+	case s1_release_command:
+		s1_release_command_handler(msg);
+		break;
+	case ni_detach_request:
+		ni_detach_request_handler(msg);
+		break;
+	case paging_request:
+		paging_handler(msg);
+		break;
+	case ics_req_paging:
+		ics_req_paging_handler(msg);
+		break;
+	case tau_response:
+		tau_response_handler(msg);
+		break;
+	default:
+		log_msg(LOG_ERROR,"Unhandled mme-app message\n");
+		break;
+	}
+	free(data);
+}
diff --git a/src/s1ap/handlers/ni_detach_request.c b/src/s1ap/handlers/ni_detach_request.c
new file mode 100644
index 0000000..6ecd11c
--- /dev/null
+++ b/src/s1ap/handlers/ni_detach_request.c
@@ -0,0 +1,228 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <pthread.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdint.h>
+
+#include "log.h"
+#include "err_codes.h"
+#include "message_queues.h"
+#include "ipc_api.h"
+#include "s1ap.h"
+#include "s1ap_config.h"
+#include "main.h"
+#include "msgType.h"
+
+static int
+get_ni_detach_request_protoie_value(struct proto_IE *value, struct ni_detach_request_Q_msg *g_acptReqInfo)
+{
+	uint8_t ieCnt = 0;
+
+	value->no_of_IEs = NI_DTCH_REQUEST_NO_OF_IES;
+
+	value->data = (proto_IEs *) malloc(NI_DTCH_REQUEST_NO_OF_IES *
+			sizeof(proto_IEs));
+
+	value->data[ieCnt].val.mme_ue_s1ap_id = g_acptReqInfo->ue_idx;
+	ieCnt++;
+
+	value->data[ieCnt].val.enb_ue_s1ap_id = g_acptReqInfo->enb_s1ap_ue_id;
+	ieCnt++;
+
+	struct nasPDU *nas = &(value->data[ieCnt].val.nas);
+	nas->header.security_header_type = IntegrityProtectedCiphered;
+	nas->header.proto_discriminator = EPSMobilityManagementMessages;
+
+	/* placeholder for mac. mac value will be calculated later */
+	uint8_t mac[MAC_SIZE] = {0};
+	memcpy(nas->header.mac, mac, MAC_SIZE);
+
+	nas->header.seq_no = g_acptReqInfo->dl_seq_no;
+	nas->header.message_type = DetachRequest;
+	nas->header.detach_type = 00000002;
+	log_msg(LOG_DEBUG,"NAS Msg Type: %x\n",nas->header.message_type);
+
+	ieCnt++;
+
+	return SUCCESS;
+}
+
+/**
+* Stage specific message processing.
+*/
+static int
+ni_detach_request_processing(struct ni_detach_request_Q_msg *g_acptReqInfo)
+{
+	unsigned char tmpStr[4];
+	struct s1ap_PDU s1apPDU= {0};
+	uint16_t protocolIe_Id;
+	uint8_t protocolIe_criticality = CRITICALITY_REJECT;
+	uint8_t initiating_msg = 0;
+	uint8_t datalen = 0;
+	uint8_t s1ap_len_pos;
+	uint8_t nas_len_pos;
+	uint8_t u8value = 0;
+	uint8_t mac_data_pos;
+
+	Buffer g_acpt_buffer;
+
+	s1apPDU.procedurecode = id_downlinkNASTransport;
+	s1apPDU.criticality = CRITICALITY_IGNORE;
+
+	get_ni_detach_request_protoie_value(&s1apPDU.value, g_acptReqInfo);
+
+	g_acpt_buffer.pos = 0;
+
+	buffer_copy(&g_acpt_buffer, &initiating_msg,
+			sizeof(initiating_msg));
+
+	buffer_copy(&g_acpt_buffer, &s1apPDU.procedurecode,
+			sizeof(s1apPDU.procedurecode));
+
+	buffer_copy(&g_acpt_buffer, &s1apPDU.criticality,
+				sizeof(s1apPDU.criticality));
+
+	s1ap_len_pos = g_acpt_buffer.pos;
+
+	/* length of NI Detach Request */
+	u8value = 0;
+	buffer_copy(&g_acpt_buffer, &u8value, sizeof(u8value));
+
+	/* TODO remove hardcoded values */
+	uint8_t chProtoIENo[3] = {0,0,3};
+	buffer_copy(&g_acpt_buffer, chProtoIENo, 3);
+
+	/* id-MME-UE-S1AP-ID */
+	protocolIe_Id = id_MME_UE_S1AP_ID;
+	copyU16(tmpStr, protocolIe_Id);
+	buffer_copy(&g_acpt_buffer, tmpStr, sizeof(protocolIe_Id));
+	buffer_copy(&g_acpt_buffer, &protocolIe_criticality,
+					sizeof(protocolIe_criticality));
+	datalen = 2;
+	/* TODO need to add proper handling*/
+	unsigned char mme_ue_id[3];
+	datalen = copyU16(mme_ue_id, s1apPDU.value.data[0].val.mme_ue_s1ap_id);
+	buffer_copy(&g_acpt_buffer, &datalen, sizeof(datalen));
+	buffer_copy(&g_acpt_buffer, mme_ue_id, datalen);
+
+	/* id-eNB-UE-S1AP-ID */
+	protocolIe_Id = id_eNB_UE_S1AP_ID;
+	copyU16(tmpStr, protocolIe_Id);
+	buffer_copy(&g_acpt_buffer, tmpStr, sizeof(protocolIe_Id));
+	buffer_copy(&g_acpt_buffer, &protocolIe_criticality,
+					sizeof(protocolIe_criticality));
+	/* TODO needs proper handling*/
+	unsigned char enb_ue_id[3];
+	datalen = copyU16(enb_ue_id, s1apPDU.value.data[1].val.enb_ue_s1ap_id);
+	buffer_copy(&g_acpt_buffer, &datalen, sizeof(datalen));
+	buffer_copy(&g_acpt_buffer, enb_ue_id, datalen);
+
+	/* NAS PDU start */
+	protocolIe_Id = id_NAS_PDU;
+	copyU16(tmpStr, protocolIe_Id);
+	buffer_copy(&g_acpt_buffer, tmpStr, sizeof(protocolIe_Id));
+	buffer_copy(&g_acpt_buffer, &protocolIe_criticality,
+					sizeof(protocolIe_criticality));
+
+	nas_len_pos = g_acpt_buffer.pos;
+
+	datalen = 0;
+	buffer_copy(&g_acpt_buffer, &datalen, sizeof(datalen));
+
+	buffer_copy(&g_acpt_buffer, &datalen, sizeof(datalen));
+
+	nas_pdu_header *nas_hdr = &(s1apPDU.value.data[2].val.nas.header);
+
+	/* security header and protocol discriminator */
+	u8value = (nas_hdr->security_header_type << 4 |
+			nas_hdr->proto_discriminator);
+	buffer_copy(&g_acpt_buffer, &u8value, sizeof(u8value));
+
+	/* mac */
+	/* placeholder for mac. mac value will be calculated later */
+	buffer_copy(&g_acpt_buffer, nas_hdr->mac, MAC_SIZE);
+	mac_data_pos = g_acpt_buffer.pos;
+
+	/* sequence number */
+	buffer_copy(&g_acpt_buffer, &(nas_hdr->seq_no),
+			sizeof(nas_hdr->seq_no));
+
+	/* security header and protocol discriminator */
+	nas_hdr->security_header_type = Plain;
+	u8value = (nas_hdr->security_header_type << 4 |
+			nas_hdr->proto_discriminator);
+	buffer_copy(&g_acpt_buffer, &u8value, sizeof(u8value));
+
+	/* message type */
+	buffer_copy(&g_acpt_buffer, &(nas_hdr->message_type),
+			sizeof(nas_hdr->message_type));	
+	/* detach type */
+        buffer_copy(&g_acpt_buffer, &(nas_hdr->detach_type),
+                        sizeof(nas_hdr->detach_type));
+
+	/* NAS PDU end */
+
+	/* Calculate mac */
+	uint8_t direction = 1;
+	uint8_t bearer = 0;
+
+	calculate_mac(g_acptReqInfo->int_key, nas_hdr->seq_no,
+			direction, bearer, &g_acpt_buffer.buf[mac_data_pos],
+			g_acpt_buffer.pos - mac_data_pos,
+			&g_acpt_buffer.buf[mac_data_pos - MAC_SIZE]);
+
+	/* Copy nas length to nas length field */
+	datalen = g_acpt_buffer.pos - nas_len_pos -1;
+	memcpy(&(g_acpt_buffer.buf[nas_len_pos]), &datalen, sizeof(datalen));
+
+	/* Copy nas length to nas length field */
+	datalen = g_acpt_buffer.pos - nas_len_pos - 2;
+	memcpy(&(g_acpt_buffer.buf[nas_len_pos + 1]), &datalen, sizeof(datalen));
+
+	/* Copy length to s1ap length field */
+	datalen = g_acpt_buffer.pos - s1ap_len_pos - 1;
+	memcpy(g_acpt_buffer.buf + s1ap_len_pos, &datalen, sizeof(datalen));
+
+	/* TODO: temp fix */
+	//g_ics_buffer.buf[1] = 0x09;
+	send_sctp_msg(g_acptReqInfo->enb_fd, g_acpt_buffer.buf, g_acpt_buffer.pos,1);
+
+	log_msg(LOG_INFO, "NI Detach Request sent to UE.");
+
+	return SUCCESS;
+}
+
+
+
+/**
+* Thread function for stage.
+*/
+void*
+ni_detach_request_handler(void *data)
+{
+   log_msg(LOG_INFO, "NI detach request handler ready.\n");
+   struct ni_detach_request_Q_msg *msg = (struct ni_detach_request_Q_msg *)data;
+
+   ni_detach_request_processing(msg);
+   
+   return NULL;
+}
+
diff --git a/src/s1ap/handlers/paging.c b/src/s1ap/handlers/paging.c
new file mode 100644
index 0000000..d2c6bf1
--- /dev/null
+++ b/src/s1ap/handlers/paging.c
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <pthread.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdint.h>
+
+#include "ProtocolIE-Container.h"
+#include "ProtocolIE-ID.h"
+#include "ProtocolIE-Field.h"
+#include "log.h"
+#include "err_codes.h"
+#include "message_queues.h"
+#include "ipc_api.h"
+#include "s1ap.h"
+#include "s1ap_config.h"
+#include "main.h"
+#include "msgType.h"
+#include "common_proc_info.h"
+
+
+/*Stage specific message processing.
+*/
+static int
+paging_processing(struct paging_req_Q_msg *g_paging)
+{
+	log_msg(LOG_DEBUG,"Process paging.");
+	uint32_t length = 0;
+    	uint8_t *buffer = NULL;
+	
+	Buffer g_paging_buffer;
+	struct s1ap_common_req_Q_msg req= {0};
+
+	req.IE_type = S1AP_PAGING_REQ;
+        req.enb_fd = g_paging->enb_fd;
+        req.ue_idx = g_paging->ue_idx;
+        req.enb_s1ap_ue_id = g_paging->enb_s1ap_ue_id;
+	req.cn_domain = g_paging->cn_domain;
+	memcpy(req.imsi, g_paging->IMSI, BINARY_IMSI_LEN);
+	memcpy(&req.tai, &g_paging->tai, sizeof(struct TAI));
+
+	
+
+	int ret = s1ap_mme_encode_initiating(&req, &buffer, &length);
+
+    	if(ret == -1)
+    	{
+	        log_msg(LOG_ERROR, "Encoding paging request failed.\n");
+        	return E_FAIL;
+   	}
+
+
+	buffer_copy(&g_paging_buffer, buffer, length);
+	send_sctp_msg(g_paging->enb_fd, g_paging_buffer.buf, g_paging_buffer.pos,1);
+	log_msg(LOG_INFO, "\n-----Paging sent to UE.---\n");
+	return SUCCESS;
+}
+
+
+/**
+* Thread function for stage.
+*/
+void*
+paging_handler(void *data)
+{
+
+	log_msg(LOG_INFO, "paging handler ready.\n");
+	
+	paging_processing((struct paging_req_Q_msg*)data);
+
+	return NULL;
+}
+
+
diff --git a/src/s1ap/handlers/s1ap_encoder.c b/src/s1ap/handlers/s1ap_encoder.c
new file mode 100644
index 0000000..46ea3ce
--- /dev/null
+++ b/src/s1ap/handlers/s1ap_encoder.c
@@ -0,0 +1,471 @@
+/*
+ *
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019-Present, Infosys Ltd.
+ *
+ * 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.
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <pthread.h>
+
+#include "options.h"
+#include "ipc_api.h"
+#include "main.h"
+#include "s1ap.h"
+#include "s1ap_config.h"
+#include "sctp_conn.h"
+#include "s1ap_structs.h"
+#include "s1ap_msg_codes.h"
+#include "s1ap_ie.h"
+#include "ProtocolIE-ID.h"
+#include "ProtocolIE-Field.h"
+#include "common_proc_info.h"
+#include "InitiatingMessage.h"
+#include "UE-S1AP-ID-pair.h"
+#include "msgType.h"
+
+extern s1ap_config g_s1ap_cfg;
+
+int s1ap_mme_encode_initiating(
+  struct s1ap_common_req_Q_msg *message_p,
+  uint8_t **buffer,
+  uint32_t *length)
+{
+    log_msg(LOG_INFO, "MME initiating msg Encode.\n");
+    switch (message_p->IE_type) {
+        case S1AP_CTX_REL_CMD:
+            log_msg(LOG_INFO, "Ue Context release Command Encode.\n");
+            return s1ap_mme_encode_ue_context_release_command(
+                      message_p, buffer, length);
+        case S1AP_PAGING_REQ:
+            log_msg(LOG_INFO, "Paging req Encode.\n");
+            return s1ap_mme_encode_paging_request(
+                      message_p, buffer, length);
+	case S1AP_INIT_CTXT_SETUP_REQ:
+	    log_msg(LOG_INFO, "Init context setup req encode\n");
+	    return s1ap_mme_encode_initial_context_setup_request(
+		      message_p, buffer, length); 
+        default:
+            log_msg(
+                  LOG_WARNING,
+                  "Unknown procedure ID (%d) for initiating message_p\n",
+                  (int) message_p->IE_type);
+      }
+
+  return -1;
+}
+
+int s1ap_mme_encode_ue_context_release_command(
+  struct s1ap_common_req_Q_msg *s1apPDU,
+  uint8_t **buffer,
+  uint32_t *length)
+{
+	log_msg(LOG_DEBUG,"Inside s1ap_encoder\n");
+
+	S1AP_PDU_t                              pdu = {(S1AP_PDU_PR_NOTHING)};
+    InitiatingMessage_t *initiating_msg = NULL;
+	S1AP_PDU_t                             *pdu_p = &pdu;
+	int                                     enc_ret = -1;
+	memset ((void *)pdu_p, 0, sizeof (S1AP_PDU_t));
+
+    pdu.present = S1AP_PDU_PR_initiatingMessage;
+    pdu.choice.initiatingMessage = calloc(sizeof(InitiatingMessage_t), sizeof(uint8_t));
+    if(pdu.choice.initiatingMessage == NULL)
+    {
+        log_msg(LOG_ERROR,"calloc failed.\n");
+        return -1;
+    }
+    initiating_msg = pdu.choice.initiatingMessage;
+    initiating_msg->procedureCode = ProcedureCode_id_UEContextRelease;
+    initiating_msg->criticality = 0;
+    initiating_msg->value.present = InitiatingMessage__value_PR_UEContextReleaseCommand;  
+    
+    UEContextReleaseCommand_IEs_t val[2];
+    memset(val, 0, 2 * sizeof(UEContextReleaseCommand_IEs_t));
+    
+    UE_S1AP_IDs_t ue_id_val;
+    memset(&ue_id_val, 0, sizeof(UE_S1AP_IDs_t));
+     
+    struct UE_S1AP_ID_pair s1apId_pair;
+    if((s1apPDU->mme_s1ap_ue_id != 0xFFFFFFFF) 
+        && (s1apPDU->enb_s1ap_ue_id != 0xFFFFFFFF))
+    {
+        log_msg(LOG_INFO,"S1ap Id pair.\n");
+        ue_id_val.present = UE_S1AP_IDs_PR_uE_S1AP_ID_pair;
+        s1apId_pair.eNB_UE_S1AP_ID = s1apPDU->enb_s1ap_ue_id;
+        s1apId_pair.mME_UE_S1AP_ID = s1apPDU->mme_s1ap_ue_id;
+        ue_id_val.choice.uE_S1AP_ID_pair = calloc(sizeof(struct UE_S1AP_ID_pair), sizeof(uint8_t));
+        if(ue_id_val.choice.uE_S1AP_ID_pair == NULL)
+        {
+            log_msg(LOG_ERROR,"calloc failed.\n");
+            free(pdu.choice.initiatingMessage);
+            return -1;
+        }
+        memcpy(ue_id_val.choice.uE_S1AP_ID_pair, &s1apId_pair, sizeof(struct UE_S1AP_ID_pair));
+    }
+    else if(s1apPDU->mme_s1ap_ue_id != 0xFFFFFFFF)
+    {
+        ue_id_val.present = UE_S1AP_IDs_PR_mME_UE_S1AP_ID;
+        ue_id_val.choice.mME_UE_S1AP_ID = s1apPDU->mme_s1ap_ue_id;
+    }
+    else
+    {
+        ue_id_val.present = UE_S1AP_IDs_PR_NOTHING;
+    }
+
+    val[0].id = ProtocolIE_ID_id_UE_S1AP_IDs;
+    val[0].criticality = 0;
+    val[0].value.present = UEContextReleaseCommand_IEs__value_PR_UE_S1AP_IDs;
+    memcpy(&val[0].value.choice.UE_S1AP_IDs, &ue_id_val, sizeof(UE_S1AP_IDs_t));
+
+    val[1].id = ProtocolIE_ID_id_Cause;
+    val[1].criticality = 1;
+    val[1].value.present = UEContextReleaseCommand_IEs__value_PR_Cause;
+    //memcpy(&val[1].value.choice.Cause, &s1apPDU->cause, sizeof(Cause_t));
+    val[1].value.choice.Cause.present = s1apPDU->cause.present;
+    switch(s1apPDU->cause.present)
+    {
+        case Cause_PR_radioNetwork:
+            val[1].value.choice.Cause.choice.radioNetwork
+                = s1apPDU->cause.choice.radioNetwork;
+        break;
+        case Cause_PR_transport:
+            val[1].value.choice.Cause.choice.transport
+                = s1apPDU->cause.choice.transport;
+        break;
+        case Cause_PR_nas:
+            val[1].value.choice.Cause.choice.nas
+                = s1apPDU->cause.choice.nas;
+        break;
+        case Cause_PR_protocol:
+            val[1].value.choice.Cause.choice.protocol
+                = s1apPDU->cause.choice.protocol;
+        break;
+        case Cause_PR_misc:
+            val[1].value.choice.Cause.choice.misc
+                = s1apPDU->cause.choice.misc;
+        break;
+        case Cause_PR_NOTHING:
+        default:
+            log_msg(LOG_WARNING,"Unknown Cause type:%d\n",s1apPDU->cause.present);
+    }
+
+    log_msg(LOG_INFO,"Add values to list.\n");
+    ASN_SEQUENCE_ADD(&initiating_msg->value.choice.UEContextReleaseCommand.protocolIEs.list, &val[0]);
+    ASN_SEQUENCE_ADD(&initiating_msg->value.choice.UEContextReleaseCommand.protocolIEs.list, &val[1]);
+
+    if ((enc_ret = aper_encode_to_new_buffer (&asn_DEF_S1AP_PDU, 0, &pdu, (void **)buffer)) < 0) 
+    {
+        log_msg(LOG_ERROR, "Encoding of Ctx Release Cmd failed\n");
+        return -1;
+    }
+
+    log_msg(LOG_INFO,"free allocated msgs");
+    free(ue_id_val.choice.uE_S1AP_ID_pair);
+    free(pdu.choice.initiatingMessage);
+    
+    *length = enc_ret;
+    return enc_ret; 
+}
+
+int s1ap_mme_encode_initial_context_setup_request(
+  struct s1ap_common_req_Q_msg *s1apPDU,
+  uint8_t **buffer,
+  uint32_t *length)
+{
+    S1AP_PDU_t                              pdu = {(S1AP_PDU_PR_NOTHING)};
+    InitiatingMessage_t *initiating_msg = NULL;
+    S1AP_PDU_t                             *pdu_p = &pdu;
+    int                                     enc_ret = -1;
+    memset ((void *)pdu_p, 0, sizeof (S1AP_PDU_t));
+
+    pdu.present = S1AP_PDU_PR_initiatingMessage;
+    pdu.choice.initiatingMessage = calloc (sizeof(InitiatingMessage_t), sizeof(uint8_t));
+    if(pdu.choice.initiatingMessage == NULL)
+    {
+        log_msg(LOG_ERROR,"calloc failed.\n");
+        return -1;
+    }
+    initiating_msg = pdu.choice.initiatingMessage;
+    initiating_msg->procedureCode = ProcedureCode_id_InitialContextSetup;
+    initiating_msg->criticality = 0;
+    initiating_msg->value.present = InitiatingMessage__value_PR_InitialContextSetupRequest;
+
+    InitialContextSetupRequestIEs_t val[6];
+    memset(val, 0, 6 * (sizeof(InitialContextSetupRequestIEs_t)));
+
+    val[0].id = ProtocolIE_ID_id_MME_UE_S1AP_ID;
+    val[0].criticality = 0;
+    val[0].value.present = InitialContextSetupRequestIEs__value_PR_MME_UE_S1AP_ID;
+    val[0].value.choice.MME_UE_S1AP_ID = s1apPDU->mme_s1ap_ue_id;
+
+    val[1].id = ProtocolIE_ID_id_eNB_UE_S1AP_ID;
+    val[1].criticality = 0;
+    val[1].value.present = InitialContextSetupRequestIEs__value_PR_ENB_UE_S1AP_ID;
+    val[1].value.choice.ENB_UE_S1AP_ID = s1apPDU->enb_s1ap_ue_id;
+
+    val[2].id = ProtocolIE_ID_id_uEaggregateMaximumBitrate;
+    val[2].criticality = 0;
+    val[2].value.present = InitialContextSetupRequestIEs__value_PR_UEAggregateMaximumBitrate;
+
+    val[2].value.choice.UEAggregateMaximumBitrate.uEaggregateMaximumBitRateDL.size = 5;
+    val[2].value.choice.UEAggregateMaximumBitrate.uEaggregateMaximumBitRateDL.buf = calloc (5, sizeof(uint8_t));
+    val[2].value.choice.UEAggregateMaximumBitrate.uEaggregateMaximumBitRateDL.buf[0] = 0x0; 
+    uint32_t temp_bitrate = htonl(s1apPDU->ueag_max_dl_bitrate);
+    memcpy (&(val[2].value.choice.UEAggregateMaximumBitrate.uEaggregateMaximumBitRateDL.buf[1]), &temp_bitrate, sizeof(uint32_t));
+
+    val[2].value.choice.UEAggregateMaximumBitrate.uEaggregateMaximumBitRateUL.size =  5;
+    val[2].value.choice.UEAggregateMaximumBitrate.uEaggregateMaximumBitRateUL.buf = calloc (5, sizeof(uint8_t));
+    val[2].value.choice.UEAggregateMaximumBitrate.uEaggregateMaximumBitRateUL.buf[0] = 0x0; 
+    temp_bitrate = htonl(s1apPDU->ueag_max_ul_bitrate);
+    memcpy (&(val[2].value.choice.UEAggregateMaximumBitrate.uEaggregateMaximumBitRateUL.buf[1]), &temp_bitrate, sizeof(uint32_t));
+
+    val[3].id = ProtocolIE_ID_id_E_RABToBeSetupListCtxtSUReq;
+    val[3].criticality = 0;
+    val[3].value.present = InitialContextSetupRequestIEs__value_PR_E_RABToBeSetupListCtxtSUReq;
+
+    E_RABToBeSetupItemCtxtSUReqIEs_t erab_to_be_setup_item;
+    memset(&erab_to_be_setup_item, 0, sizeof(E_RABToBeSetupItemCtxtSUReqIEs_t));
+    E_RABToBeSetupItemCtxtSUReq_t* erab_to_be_setup = &(erab_to_be_setup_item.value.choice.E_RABToBeSetupItemCtxtSUReq);
+
+    erab_to_be_setup_item.id = ProtocolIE_ID_id_E_RABToBeSetupItemCtxtSUReq;
+    erab_to_be_setup_item.criticality = 0;
+    erab_to_be_setup_item.value.present = E_RABToBeSetupItemCtxtSUReqIEs__value_PR_E_RABToBeSetupItemCtxtSUReq;
+
+    erab_to_be_setup->e_RAB_ID = 5;
+
+    erab_to_be_setup->e_RABlevelQoSParameters.allocationRetentionPriority.priorityLevel = 15;
+    erab_to_be_setup->e_RABlevelQoSParameters.allocationRetentionPriority.pre_emptionCapability = 1;
+    erab_to_be_setup->e_RABlevelQoSParameters.allocationRetentionPriority.pre_emptionVulnerability = 1;
+    erab_to_be_setup->e_RABlevelQoSParameters.qCI = 9;
+
+    erab_to_be_setup->transportLayerAddress.size = 4;
+    erab_to_be_setup->transportLayerAddress.buf = calloc(4, sizeof(uint8_t));
+    uint32_t transport_layer_address = htonl(s1apPDU->gtp_teid.ip.ipv4.s_addr);
+    memcpy(erab_to_be_setup->transportLayerAddress.buf, &transport_layer_address, sizeof(uint32_t));
+    
+
+    erab_to_be_setup->gTP_TEID.size = 4;
+    erab_to_be_setup->gTP_TEID.buf = calloc(4, sizeof(uint8_t));
+    erab_to_be_setup->gTP_TEID.buf[0] =  s1apPDU->gtp_teid.header.teid_gre >> 24;
+    erab_to_be_setup->gTP_TEID.buf[1] =  s1apPDU->gtp_teid.header.teid_gre >> 16;
+    erab_to_be_setup->gTP_TEID.buf[2] =  s1apPDU->gtp_teid.header.teid_gre >> 8;
+    erab_to_be_setup->gTP_TEID.buf[3] =  s1apPDU->gtp_teid.header.teid_gre;
+
+    ASN_SEQUENCE_ADD(&(val[3].value.choice.E_RABToBeSetupListCtxtSUReq.list), &erab_to_be_setup_item);
+
+    val[4].id = ProtocolIE_ID_id_UESecurityCapabilities;
+    val[4].criticality = 0;
+    val[4].value.present = InitialContextSetupRequestIEs__value_PR_UESecurityCapabilities;
+    val[4].value.choice.UESecurityCapabilities.encryptionAlgorithms.buf = calloc(2, sizeof(uint8_t));
+    val[4].value.choice.UESecurityCapabilities.encryptionAlgorithms.size = 2;
+    val[4].value.choice.UESecurityCapabilities.encryptionAlgorithms.buf[0] = 0xe0;
+    val[4].value.choice.UESecurityCapabilities.encryptionAlgorithms.buf[1] = 0x00;
+    val[4].value.choice.UESecurityCapabilities.integrityProtectionAlgorithms.buf = calloc(2, sizeof(uint8_t));
+    val[4].value.choice.UESecurityCapabilities.integrityProtectionAlgorithms.size = 2;
+    val[4].value.choice.UESecurityCapabilities.integrityProtectionAlgorithms.buf[0] = 0xc0;
+    val[4].value.choice.UESecurityCapabilities.integrityProtectionAlgorithms.buf[1] = 0x00;
+
+    val[5].id = ProtocolIE_ID_id_SecurityKey;
+    val[5].criticality = 0;
+    val[5].value.present = InitialContextSetupRequestIEs__value_PR_SecurityKey;
+    val[5].value.choice.SecurityKey.size = SECURITY_KEY_SIZE;
+    val[5].value.choice.SecurityKey.buf = calloc(SECURITY_KEY_SIZE, sizeof(uint8_t));
+    memcpy(val[5].value.choice.SecurityKey.buf, s1apPDU->sec_key, SECURITY_KEY_SIZE);
+
+    ASN_SEQUENCE_ADD(&initiating_msg->value.choice.InitialContextSetupRequest.protocolIEs.list, &val[0]);
+    ASN_SEQUENCE_ADD(&initiating_msg->value.choice.InitialContextSetupRequest.protocolIEs.list, &val[1]);
+    ASN_SEQUENCE_ADD(&initiating_msg->value.choice.InitialContextSetupRequest.protocolIEs.list, &val[2]);
+    ASN_SEQUENCE_ADD(&initiating_msg->value.choice.InitialContextSetupRequest.protocolIEs.list, &val[3]);
+    ASN_SEQUENCE_ADD(&initiating_msg->value.choice.InitialContextSetupRequest.protocolIEs.list, &val[4]);
+    ASN_SEQUENCE_ADD(&initiating_msg->value.choice.InitialContextSetupRequest.protocolIEs.list, &val[5]);
+
+    if ((enc_ret = aper_encode_to_new_buffer (&asn_DEF_S1AP_PDU, 0, &pdu, (void **)buffer)) < 0)
+    {
+        log_msg(LOG_ERROR, "Encoding of Initial Context Setup Request failed\n");
+        return -1;
+    }
+
+    log_msg(LOG_INFO,"free allocated messages\n");
+
+    free(val[5].value.choice.SecurityKey.buf);
+    free(val[4].value.choice.UESecurityCapabilities.integrityProtectionAlgorithms.buf);
+    free(val[4].value.choice.UESecurityCapabilities.encryptionAlgorithms.buf);
+    free(erab_to_be_setup->gTP_TEID.buf);
+    free(erab_to_be_setup->transportLayerAddress.buf);
+    free(val[2].value.choice.UEAggregateMaximumBitrate.uEaggregateMaximumBitRateUL.buf);
+    free(val[2].value.choice.UEAggregateMaximumBitrate.uEaggregateMaximumBitRateDL.buf);
+    free(pdu.choice.initiatingMessage);
+
+    *length = enc_ret;
+    return enc_ret;
+}
+
+int s1ap_mme_encode_paging_request(
+  struct s1ap_common_req_Q_msg *s1apPDU,
+  uint8_t **buffer,
+  uint32_t *length)
+{
+    
+
+    S1AP_PDU_t pdu = {(S1AP_PDU_PR_NOTHING)};
+    InitiatingMessage_t *initiating_msg = NULL;
+    S1AP_PDU_t *pdu_p = &pdu;
+    int enc_ret = -1;
+    memset ((void *)pdu_p, 0, sizeof (S1AP_PDU_t));
+
+    pdu.present = S1AP_PDU_PR_initiatingMessage;
+    pdu.choice.initiatingMessage = calloc (sizeof(InitiatingMessage_t), sizeof(uint8_t));
+    if(pdu.choice.initiatingMessage == NULL)
+    {
+        log_msg(LOG_ERROR,"calloc failed.\n");
+        return -1;
+    }
+
+    initiating_msg = pdu.choice.initiatingMessage;
+    initiating_msg->procedureCode = ProcedureCode_id_Paging;
+    initiating_msg->criticality = 0;
+    initiating_msg->value.present = InitiatingMessage__value_PR_Paging;  
+
+    PagingIEs_t val[4];
+    memset(val, 0, 4 * sizeof(PagingIEs_t));
+
+    val[0].id = ProtocolIE_ID_id_UEIdentityIndexValue;
+    val[0].criticality = 0;
+    val[0].value.present = PagingIEs__value_PR_UEIdentityIndexValue;
+
+    UEIdentityIndexValue_t* UEIdentityIndexValue = &val[0].value.choice.UEIdentityIndexValue;
+    uint64_t ue_imsi_value = 0;
+    /* Set UE Identity Index value : IMSI mod 4096 */
+    UEIdentityIndexValue->size = 2;
+    UEIdentityIndexValue->buf = calloc(2, sizeof(uint8_t));
+
+    /* Conver string to value */
+    uint8_t imsi_bcd[BCD_IMSI_STR_LEN];
+	convert_imsi_to_bcd_str(s1apPDU->imsi, imsi_bcd);
+    for (int i = 0; i < BCD_IMSI_STR_LEN; i++)
+    {
+        ue_imsi_value = ue_imsi_value*10 + (imsi_bcd[i] - '0');
+    }
+
+    /* index(10bit) = ue_imsi_value mod 1024 */
+    uint16_t index_value = ue_imsi_value % 1024;
+    UEIdentityIndexValue->buf[0] = index_value >> 2;
+    UEIdentityIndexValue->buf[1] = (index_value & 0x3f) << 6;
+    UEIdentityIndexValue->bits_unused = 6;
+
+    log_msg(LOG_DEBUG,"Encoding STMSI\n");
+
+    val[1].id = ProtocolIE_ID_id_UEPagingID;
+    val[1].criticality = 0;
+    val[1].value.present = PagingIEs__value_PR_UEPagingID;
+
+    UEPagingID_t pagingId;
+    pagingId.present = UEPagingID_PR_s_TMSI;
+    pagingId.choice.s_TMSI = calloc(sizeof(struct S_TMSI), sizeof(uint8_t));
+    if(pagingId.choice.s_TMSI == NULL)
+    {
+        log_msg(LOG_ERROR,"malloc failed.\n");
+        free(pdu.choice.initiatingMessage);
+        return -1;
+    }
+
+    pagingId.choice.s_TMSI->mMEC.buf = calloc(1, sizeof(uint8_t));
+    if(NULL == pagingId.choice.s_TMSI->mMEC.buf)
+    {
+        log_msg(LOG_ERROR,"malloc failed.\n");
+        free(pdu.choice.initiatingMessage);
+        free(pagingId.choice.s_TMSI);
+        return -1;
+    }
+
+    memcpy(pagingId.choice.s_TMSI->mMEC.buf, &g_s1ap_cfg.mme_code, sizeof(uint8_t));
+    pagingId.choice.s_TMSI->mMEC.size = sizeof(uint8_t);
+    
+    pagingId.choice.s_TMSI->m_TMSI.buf = calloc(sizeof(uint32_t), sizeof(uint8_t));
+    if(NULL == pagingId.choice.s_TMSI->m_TMSI.buf)
+    {
+        log_msg(LOG_ERROR,"malloc failed.\n");
+        free(pdu.choice.initiatingMessage);
+        free(pagingId.choice.s_TMSI);
+        free(pagingId.choice.s_TMSI->mMEC.buf);
+        return -1;
+    }
+
+    uint32_t ue_idx = htonl(s1apPDU->ue_idx);
+    memcpy(pagingId.choice.s_TMSI->m_TMSI.buf, &ue_idx, sizeof(uint32_t));
+    pagingId.choice.s_TMSI->m_TMSI.size = sizeof(uint32_t);
+    memcpy(&val[1].value.choice.UEPagingID, &pagingId, sizeof(UEPagingID_t));
+
+    log_msg(LOG_INFO, "Encoding CNDomain\n");
+
+    val[2].id = ProtocolIE_ID_id_CNDomain;
+    val[2].criticality = 0;
+    val[2].value.present = PagingIEs__value_PR_CNDomain;
+    val[2].value.choice.CNDomain = s1apPDU->cn_domain;
+    
+    log_msg(LOG_DEBUG,"Encoding TAI List\n");
+	
+    val[3].id = ProtocolIE_ID_id_TAIList;
+    val[3].criticality = 0;
+    val[3].value.present = PagingIEs__value_PR_TAIList;
+
+    TAIItemIEs_t tai_item;
+    memset(&tai_item, 0, sizeof(TAIItemIEs_t));
+
+    tai_item.id = ProtocolIE_ID_id_TAIItem;
+    tai_item.criticality = 0;
+    tai_item.value.present = TAIItemIEs__value_PR_TAIItem;
+
+    log_msg(LOG_DEBUG,"TAI List - Encode PLMN ID\n");
+    tai_item.value.choice.TAIItem.tAI.pLMNidentity.size = 3;
+    tai_item.value.choice.TAIItem.tAI.pLMNidentity.buf = calloc(3, sizeof(uint8_t));
+    memcpy(tai_item.value.choice.TAIItem.tAI.pLMNidentity.buf, &s1apPDU->tai.plmn_id.idx, 3);
+
+    log_msg(LOG_DEBUG,"TAI List - Encode TAC\n");
+    tai_item.value.choice.TAIItem.tAI.tAC.size = 2;
+    tai_item.value.choice.TAIItem.tAI.tAC.buf = calloc(2, sizeof(uint8_t));
+    memcpy(tai_item.value.choice.TAIItem.tAI.tAC.buf, &s1apPDU->tai.tac, 2);
+
+    ASN_SEQUENCE_ADD(&val[3].value.choice.TAIList.list, &tai_item);
+
+    log_msg(LOG_INFO,"Add values to list.\n");
+    ASN_SEQUENCE_ADD(&initiating_msg->value.choice.Paging.protocolIEs.list, &val[0]);
+    ASN_SEQUENCE_ADD(&initiating_msg->value.choice.Paging.protocolIEs.list, &val[1]);
+    ASN_SEQUENCE_ADD(&initiating_msg->value.choice.Paging.protocolIEs.list, &val[2]);
+    ASN_SEQUENCE_ADD(&initiating_msg->value.choice.Paging.protocolIEs.list, &val[3]);
+
+    if ((enc_ret = aper_encode_to_new_buffer (&asn_DEF_S1AP_PDU, 0, &pdu, (void **)buffer)) < 0) 
+    {
+        log_msg(LOG_ERROR, "Encoding of Paging failed\n");
+        return -1;
+    }
+
+    log_msg(LOG_INFO,"free allocated msgs");
+    free(pdu.choice.initiatingMessage);
+    free(UEIdentityIndexValue->buf);
+    free(pagingId.choice.s_TMSI->mMEC.buf);
+    free(pagingId.choice.s_TMSI->m_TMSI.buf);
+    free(pagingId.choice.s_TMSI);
+    free(tai_item.value.choice.TAIItem.tAI.pLMNidentity.buf);
+    free(tai_item.value.choice.TAIItem.tAI.tAC.buf);
+    
+    *length = enc_ret;
+    return enc_ret; 
+}
diff --git a/src/s1ap/handlers/s1ap_msg_delegator.c b/src/s1ap/handlers/s1ap_msg_delegator.c
new file mode 100644
index 0000000..735652c
--- /dev/null
+++ b/src/s1ap/handlers/s1ap_msg_delegator.c
@@ -0,0 +1,1524 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ *
+ * 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.
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <pthread.h>
+
+#include "options.h"
+#include "ipc_api.h"
+#include "main.h"
+#include "s1ap.h"
+#include "s1ap_config.h"
+#include "sctp_conn.h"
+#include "s1ap_structs.h"
+#include "s1ap_msg_codes.h"
+#include "s1ap_ie.h"
+#include "ProtocolIE-ID.h"
+#include "ProtocolIE-Field.h"
+static void
+parse_erab_pdu(char *msg,  int nas_msg_len, struct eRAB_elements *erab)
+{
+	//struct eRAB_header *header = (struct eRAB*)msg;
+
+	//char *ie = msg + 5; /*ID(2)+crit(1)+len(1)+mistry(1)*/
+
+	/*TODO: write parse_IEs for erab IEs here going ahead*/
+	/*For now copying directly as it is single structure*/
+	char *ie = msg + 5; /*ID(2)+crit(1)+len(1)*/
+
+	erab->no_of_elements = 1;
+	erab->elements = (union eRAB_IE*)calloc(sizeof(union eRAB_IE), 1);
+	if(NULL == erab->elements) {
+		log_msg(LOG_ERROR, "Memory alloc failed\n");
+		exit(-1);
+	}
+
+	erab->elements[0].su_res.eRAB_id = *ie;
+	++ie;
+	++ie; //what is this identify.
+	memcpy(&(erab->elements[0].su_res.transp_layer_addr), ie, sizeof(unsigned int));
+	erab->elements[0].su_res.transp_layer_addr = ntohl(erab->elements[0].su_res.transp_layer_addr);
+	log_msg(LOG_INFO, "eRAB - Transport layer address : %d\n", erab->elements[0].su_res.transp_layer_addr);
+	//ntohl ??
+	ie+=sizeof(unsigned int);
+
+	memcpy(&(erab->elements[0].su_res.gtp_teid), ie, sizeof(unsigned int));
+	erab->elements[0].su_res.gtp_teid = ntohl(erab->elements[0].su_res.gtp_teid);
+	log_msg(LOG_INFO, "eRAB - Teid : %d\n", erab->elements[0].su_res.gtp_teid);
+	//ntohl ??
+}
+
+void
+parse_nas_pdu(char *msg,  int nas_msg_len, struct nasPDU *nas,
+		unsigned short proc_code)
+{
+	log_msg(LOG_INFO, "NAS PDU proc code: %u\n", proc_code);
+
+	unsigned short msg_len = nas_msg_len;
+    char* msg_end = msg + nas_msg_len;
+
+	char *buffer = NULL;
+	log_msg(LOG_INFO, "NAS PDU msg: %s\n", msg_to_hex_str(msg, msg_len, &buffer));
+	log_buffer_free(&buffer);
+
+#if 0
+	if(S1AP_UL_NAS_TX_MSG_CODE == proc_code) {
+		/*check whether there is security header*/
+		unsigned char header_type;
+		memcpy(&header_type, msg+1, 1);
+		header_type >>= 4;
+		if(0 == header_type) { /*not security header*/
+			log_msg(LOG_INFO, "No security header\n");
+			memcpy(&(nas->header), msg+1, 2);/*copy only till msg type*/
+		} else {
+			log_msg(LOG_INFO, "Security header\n");
+			/*now for esm resp, there is procedure tx identity, why the hell it was not there before.*/
+			/*one more donkey logic, do something!!*/
+			if(4 == header_type || ((7 == (*(msg+7) & 7)))) {
+				memcpy(&(nas->header), msg+7, 2);/*copy only till msg type*/
+				offset = 9;
+			} else {
+				unsigned char tmp;
+				memcpy(&(nas->header.message_type), msg+9, 1);/*copy only till msg type*/
+				memcpy(&(tmp), msg+7, 1);/*copy only till msg type*/
+				nas->header.security_header_type = tmp;
+				offset = 10;
+			}
+		}
+	} else {
+		memcpy(&(nas->header), msg+2, sizeof(nas_pdu_header));
+	}
+
+	if(S1AP_UL_NAS_TX_MSG_CODE == proc_code) {
+		/*check whether there is security header*/
+		unsigned char header_type = 0;
+
+		memcpy(&header_type, msg+1, 1);
+		header_type >>= 4;
+		if(0 == header_type) { /*not security header*/
+			log_msg(LOG_INFO, "No security header\n");
+			memcpy(&(nas->header), msg+1, 2);/*copy only till msg type*/
+		} else {
+			log_msg(LOG_INFO, "Security header\n");
+			/*now for esm resp, there is procedure tx identity, why the hell it was not there before.*/
+			/*one more donkey logic, do something!!*/
+			if(4 == header_type || ((7 == (*(msg+7) & 7)))) {
+				log_msg(LOG_INFO, "header == 4 || 7\n");
+				if(header_type == 4 || header_type == 2) {
+				log_msg(LOG_INFO, "security - cihpered\n");
+				 memcpy(&(nas->header), msg+7, 2);/*copy only till msg type*/
+				 offset = 9;
+				}
+				else {
+				log_msg(LOG_INFO, "security - noned\n");
+				memcpy(&(nas->header), msg+1, 2);/*copy only till msg type*/
+				offset = 3;
+				}
+			} else {
+				unsigned char tmp;
+				memcpy(&(nas->header.message_type), msg+9, 1);/*copy only till msg type*/
+				memcpy(&(tmp), msg+7, 1);/*copy only till msg type*/
+				nas->header.security_header_type = tmp;
+				offset = 10;
+			}
+		}
+	} else if (S1AP_INITIAL_UE_MSG_CODE == proc_code ) {
+#endif
+
+		nas_pdu_header_sec nas_header_sec;
+		nas_pdu_header_short nas_header_short;
+		nas_pdu_header_long nas_header_long;
+
+		unsigned char sec_header_type;
+		unsigned char protocol_discr;
+
+		sec_header_type = (msg[0] >> 4) & 0x0F;
+		protocol_discr = msg[0] & 0x0F;
+		unsigned char is_ESM = ((unsigned short)protocol_discr == 0x02);  // see TS 24.007
+		log_msg(LOG_INFO, "Security header=%d\n", sec_header_type);
+		log_msg(LOG_INFO, "Protocol discriminator=%d\n", protocol_discr);
+		log_msg(LOG_INFO, "is_ESM=%d\n", is_ESM);
+
+		if(0 != sec_header_type) { /*security header*/
+			log_msg(LOG_INFO, "Security header\n");
+			if(SERVICE_REQ_SECURITY_HEADER == sec_header_type)
+            		{
+                		log_msg(LOG_INFO, "Recvd security header for Service request.");
+                		nas->header.security_header_type = sec_header_type;
+                		nas->header.proto_discriminator = protocol_discr;
+                		msg += 1;
+                		nas->header.ksi = msg[0] >> 4;
+                		nas->header.seq_no = msg[0] & 0x0F;
+                		msg += 1;
+                		memcpy(nas->header.short_mac, msg, SHORT_MAC_SIZE);
+                		nas->header.message_type = NAS_SERVICE_REQUEST;
+                		return;
+            		}
+
+			memcpy(&nas_header_sec, msg, sizeof(nas_pdu_header_sec));
+
+			char *buffer = NULL;
+			log_msg(LOG_INFO, "mac=%s\n", msg_to_hex_str((char *)nas_header_sec.mac, MAC_SIZE, &buffer));
+	        	log_buffer_free(&buffer);
+
+			log_msg(LOG_INFO, "seq no=%x\n", nas_header_sec.seq_no);
+			nas->header.seq_no = nas_header_sec.seq_no; 
+			msg += 6;
+
+			sec_header_type = msg[0] >> 4;
+			protocol_discr = msg[0] & 0x0F;
+			unsigned char is_ESM = ((unsigned short)protocol_discr == 0x02);  // see TS 24.007
+			log_msg(LOG_INFO, "Security header=%d\n", sec_header_type);
+			log_msg(LOG_INFO, "Protocol discriminator=%d\n", protocol_discr);
+			log_msg(LOG_INFO, "is_ESM=%d\n", is_ESM);
+			if (is_ESM) {
+				log_msg(LOG_INFO, "NAS PDU is ESM\n");
+				memcpy(&nas_header_long, msg, sizeof(nas_header_long)); /*copy only till msg type*/
+				msg += 3;
+
+				nas->header.security_header_type = nas_header_long.security_header_type;
+				nas->header.proto_discriminator = nas_header_long.proto_discriminator;
+				nas->header.procedure_trans_identity = nas_header_long.procedure_trans_identity;
+				nas->header.message_type = nas_header_long.message_type;
+			} else {
+				log_msg(LOG_INFO, "NAS PDU is EMM\n");
+				memcpy(&nas_header_short, msg, sizeof(nas_header_short)); /*copy only till msg type*/
+				msg += 2;
+
+				nas->header.security_header_type = nas_header_short.security_header_type;
+				nas->header.proto_discriminator = nas_header_short.proto_discriminator;
+				nas->header.message_type = nas_header_short.message_type;
+			}
+		} else {
+			log_msg(LOG_INFO, "No security header\n");
+			memcpy(&nas_header_short, msg, sizeof(nas_header_short)); /*copy only till msg type*/
+			msg += 2;
+
+			nas->header.security_header_type = nas_header_short.security_header_type;
+			nas->header.proto_discriminator = nas_header_short.proto_discriminator;
+			nas->header.message_type = nas_header_short.message_type;
+		}
+
+
+	log_msg(LOG_INFO, "Nas msg type: %X\n", nas->header.message_type);
+
+	switch(nas->header.message_type) {
+	case NAS_ESM_RESP:{
+		log_msg(LOG_INFO, "NAS_ESM_RESP recvd\n");
+
+		unsigned char element_id;
+		memcpy(&element_id, msg, 1);
+		msg++;
+		nas->elements_len +=1;
+
+		nas->elements = calloc(sizeof(nas_pdu_elements), 2);
+		//if(NULL == nas.elements)...
+
+		nas->elements[0].msgType = NAS_IE_TYPE_APN;
+		memcpy(&(nas->elements[0].pduElement.apn.len), msg, 1);
+		msg++;
+		memcpy(nas->elements[0].pduElement.apn.val, msg, nas->elements[0].pduElement.apn.len);
+		log_msg(LOG_INFO, "APN name - %s\n", nas->elements[0].pduElement.apn.val);
+		break;
+		}
+
+	case NAS_SEC_MODE_COMPLETE:
+		log_msg(LOG_INFO, "NAS_SEC_MODE_COMPLETE recvd\n");
+		break;
+
+	case NAS_AUTH_RESP:
+		log_msg(LOG_INFO, "NAS_AUTH_RESP recvd\n");
+		nas->elements_len = 1;
+		nas->elements = calloc(sizeof(nas_pdu_elements), 5);
+		//if(NULL == nas.elements)...
+		unsigned short len = get_length(&msg);
+		memcpy(&(nas->elements[0].pduElement.auth_resp), msg, sizeof(struct XRES));
+
+		break;
+    
+	case NAS_IDENTITY_RESPONSE: {
+		log_msg(LOG_INFO, "NAS_IDENTITY_RESPONSE recvd\n");
+        nas->elements_len = 1;
+		nas->elements = calloc(sizeof(nas_pdu_elements), 1);
+		unsigned short imsi_len = get_length(&msg);
+		/*EPS mobility identity. TODO : More error checking */
+        memcpy(&(nas->elements[0].pduElement.IMSI), msg, imsi_len);
+        break;
+	}
+	
+	case NAS_TAU_REQUEST:
+		log_msg(LOG_INFO, "NAS_TAU_REQUEST recvd\n");
+		break;
+
+	case NAS_AUTH_FAILURE:
+	{
+		nas->elements_len = 1;
+		nas->elements = calloc(sizeof(nas_pdu_elements), 1);
+		//if(NULL == nas.elements)...
+		 char err = *(char*)(msg);
+		 if(err == AUTH_SYNC_FAILURE)
+		 {
+		 	log_msg(LOG_INFO, "AUTH Sync Failure. Start Re-Sync");
+			nas->elements[0].msgType = NAS_IE_TYPE_AUTH_FAIL_PARAM;
+			memcpy(&(nas->elements[0].pduElement.auth_fail_resp), msg + 2, sizeof(struct AUTS));
+		 }
+		 else       
+		 {
+		 	log_msg(LOG_ERROR, "Authentication Failure. Mac Failure");
+		 }
+		 
+		}break;
+	case NAS_ATTACH_REQUEST:{
+		log_msg(LOG_INFO, "NAS_ATTACH_REQUEST recvd\n");
+		
+		unsigned char tmp = msg[0];
+		nas->header.security_encryption_algo = (tmp & 0xF0) >> 4;
+		nas->header.security_integrity_algo = tmp & 0x0F;
+		msg++;
+
+		nas->elements_len = 7;
+		nas->elements = calloc(sizeof(nas_pdu_elements), nas->elements_len);
+		
+		
+		int index = 0;
+		unsigned short imsi_len = get_length(&msg);
+		
+		bool odd = msg[0] & 0x08;
+		unsigned char eps_identity = msg[0] & 0x07;
+		switch(eps_identity) {
+                case 0x01: {
+                    // Mobile Identity contains imsi
+                    nas->flags |= NAS_MSG_UE_IE_IMSI;
+                    log_msg(LOG_INFO, "IMSI len=%u - %u\n", imsi_len, BINARY_IMSI_LEN);
+                    nas->elements[index].msgType = NAS_IE_TYPE_EPS_MOBILE_ID_IMSI;
+                    memcpy(&(nas->elements[index].pduElement.IMSI), msg, imsi_len);
+                    break;
+                }
+                case 0x06: {
+                    log_msg(LOG_INFO, "Mobile identity GUTI Rcvd \n");
+                    // Mobile Identity contains GUTI
+                    // MCC+MNC offset = 3
+                    // MME Group Id   = 2
+                    // MME Code       = 1
+                    // MTMSI offset from start of this AVP = 3 + 2 + 1
+                    nas->elements[index].msgType = NAS_IE_TYPE_EPS_MOBILE_ID_IMSI;
+                    memcpy(&nas->elements[index].pduElement.mi_guti.plmn_id.idx, &msg[1], 3);
+                    nas->elements[index].pduElement.mi_guti.mme_grp_id = ntohs(*(short int *)(&msg[4]));
+                    nas->elements[index].pduElement.mi_guti.mme_code = msg[6];
+                    nas->elements[index].pduElement.mi_guti.m_TMSI = ntohl(*((unsigned int *)(&msg[7])));
+                    log_msg(LOG_INFO, "NAS Attach Request Rcvd ID: GUTI. PLMN id %d %d %d \n", nas->elements[index].pduElement.mi_guti.plmn_id.idx[0], 
+                            nas->elements[index].pduElement.mi_guti.plmn_id.idx[1], 
+                            nas->elements[index].pduElement.mi_guti.plmn_id.idx[2] );
+                    log_msg(LOG_INFO, "NAS Attach Request Rcvd ID: GUTI. mme group id = %d, MME code %d  mtmsi = %d\n", 
+                            nas->elements[index].pduElement.mi_guti.mme_grp_id, 
+                            nas->elements[index].pduElement.mi_guti.mme_code,
+                            nas->elements[index].pduElement.mi_guti.m_TMSI);
+                    nas->flags |= NAS_MSG_UE_IE_GUTI;
+                    break;
+                }
+                case 0x03: {
+                    // Mobile Identity contains imei
+                    break;
+                }
+            }
+
+            msg += imsi_len;
+            char *buffer = NULL;
+            log_msg(LOG_INFO, "IMSI=%s [to be read nibble-swapped]\n",
+                    msg_to_hex_str((char *)nas->elements[index].pduElement.IMSI, imsi_len, &buffer));
+            log_buffer_free(&buffer);
+
+            /*UE network capacity*/
+            index++;
+            nas->elements[index].msgType = 
+                NAS_IE_TYPE_UE_NETWORK_CAPABILITY;
+            nas->elements[index].pduElement.ue_network.len = msg[0];
+            msg++;
+            memcpy(
+                   (nas->elements[index].pduElement.ue_network.capab)
+                   ,msg,
+                   nas->elements[index].pduElement.ue_network.len);
+            msg += nas->elements[index].pduElement.ue_network.len;
+
+            index++;
+            /*ESM msg container*/
+            len = msg[0] << 8 | msg[1];
+            msg += 2;
+            //now msg points to ESM message contents
+            log_msg(LOG_INFO, "len=%x\n", len);
+            log_msg(LOG_INFO, "msg[0]=%x\n", msg[0]);
+            nas->elements[index].pduElement.pti = msg[1];
+            nas->elements[index].msgType = NAS_IE_TYPE_PTI;
+            log_msg(LOG_INFO, "pti=%x\n", nas->elements[index].pduElement.pti);
+            unsigned short int msg_offset = 4;
+            /*ESM message header len is 4: bearer_id_flags(1)+proc_tx_id(1)+msg_id(1)
+             * +pdn_type(1)*/
+            /*element id 13(1101....) = "esm required" flag*/
+            //if tx_flag is absent then it means flag is set to false 
+            //nas->elements[index].pduElement.esm_info_tx_required = false;
+            while(msg_offset < len)
+            {
+                unsigned char val = msg[msg_offset];
+                log_msg(LOG_INFO, "ESM container AVP val=%x\n", val);
+                if(13 == (val>>4))
+                {
+                    index++;
+                    nas->elements[index].msgType = NAS_IE_TYPE_TX_FLAG;
+                    // byte 0 - EBI+PD, byte1 - pti, byte2 - message type, byte3 - pdntype+reqtype, byte4 - ESM info transfer flag == Total 5 bytes... msg[0] to msg[4]
+                    //nas->elements[2].esm_info_tx_required = true;
+                    if(val & 1) {
+                        nas->elements[index].pduElement.esm_info_tx_required = true;
+                        log_msg(LOG_INFO, "ESM information requested ");
+                    }
+                    msg_offset++; /* just one byte AVP */
+                    continue;
+
+                }
+
+                if(0x27 == val)
+                {
+                    unsigned short int pco_offset =  msg_offset;
+                    unsigned char pco_length = msg[msg_offset+1];
+                    pco_offset += 2; // now points to first pco payload byte
+                    pco_offset += 1; // 1 byte header skipping Extension + Configuration Protocol
+                    unsigned short int pco_options=0;
+                    log_msg(LOG_INFO, "PCO length %d Msg offset = %d , pco offset = %d ", pco_length, msg_offset, pco_offset);
+                    index++;
+                    nas->elements[index].msgType = NAS_IE_TYPE_PCO;
+                    while(pco_offset < (msg_offset + pco_length))
+                    {
+                        log_msg(LOG_INFO, "Inside PCO length %d Msg offset = %d , pco offset = %d ", pco_length, msg_offset, pco_offset);
+                        unsigned short int type;
+                        unsigned char oct_len;
+                        memcpy(&type, &msg[pco_offset], sizeof(type));
+                        type = htons(type);
+                        pco_offset += 2;
+                        oct_len = msg[pco_offset];
+                        pco_offset += 1;
+                        log_msg(LOG_INFO, "pco element_id=%x len %d \n", type, oct_len);
+                        if(type == 0x8021)
+                        {
+                            nas->elements[index].pduElement.pco_options[pco_options] = 0x8021;
+                            pco_options++;
+                        }
+                        else if(type == 0x000d)
+                        {
+                            nas->elements[index].pduElement.pco_options[pco_options] = 0x000d;
+                            pco_options++;
+                        }
+                        else if(type == 0x000a)
+                        {
+                            nas->elements[index].pduElement.pco_options[pco_options] = 0x000a;
+                            pco_options++;
+                        }
+                        else if(type == 0x0005)
+                        {
+                            nas->elements[index].pduElement.pco_options[pco_options] = 0x0005;
+                            pco_options++;
+                        }
+                        else if(type == 0x0010)
+                        {
+                            nas->elements[index].pduElement.pco_options[pco_options] = 0x0010;
+                            pco_options++;
+                        }
+                        else if(type == 0x0011)
+                        {
+                            nas->elements[index].pduElement.pco_options[pco_options] = 0x0011;
+                            pco_options++;
+                        }
+                        pco_offset += oct_len;
+                    }
+
+                    //pco
+                    msg_offset = pco_length + 2; // msg offset was already at PCO AVP type. Now it should point to next AVP type
+                    continue;
+                }
+                break; // unhandled ESM AVP...Add support..for now just break out..else we would be in tight loop
+            }
+            msg += len;
+
+            unsigned char elem_id = msg[0];
+            while(msg != msg_end)
+            {
+                elem_id = msg[0];
+                elem_id >>= 4;
+                if((NAS_IE_TYPE_GUTI_TYPE == elem_id)
+                    || (NAS_IE_TYPE_TMSI_STATUS == elem_id)
+                    || (NAS_IE_TYPE_MS_NETWORK_FEATURE_SUPPORT == elem_id))
+                {
+                    switch(elem_id)
+                    {
+                        case NAS_IE_TYPE_GUTI_TYPE:
+                            {
+                                log_msg(LOG_DEBUG, "Old guti type : Skipping.\n");
+                                msg++;
+                            }break;
+                        case NAS_IE_TYPE_TMSI_STATUS:
+                            {
+                                log_msg(LOG_DEBUG, "TMSI Status : Skipping.\n");
+                                msg++;
+                            }break;
+                        case NAS_IE_TYPE_MS_NETWORK_FEATURE_SUPPORT:
+                            {
+                                log_msg(LOG_DEBUG, "MS Network feature support : Skipping.\n");
+                                msg++;
+                            }break;
+                        default:
+                            log_msg(LOG_WARNING, "Unknown AVP in attach msg. %d \n",elem_id);
+                            msg++;
+                    }
+
+                    continue;
+                }
+                else
+                {
+                    elem_id = msg[0];
+                    switch(elem_id)
+                    {
+                        case NAS_IE_TYPE_DRX_PARAM:
+                            {
+                                log_msg(LOG_DEBUG, "DRX Param : Skipping.\n");
+                                msg += 3;
+                            }break;
+                        case NAS_IE_TYPE_TAI:
+                            {
+                                log_msg(LOG_DEBUG, "TAI : Skipping.\n");
+                                msg += 6;
+                            }break;
+                        case NAS_IE_TYPE_MS_CLASSMARK_2:
+                            {
+                                log_msg(LOG_DEBUG, "MS classmark 2 : Skipping.\n");
+                                int len = msg[1];
+                                msg += len + 2; //msgid + len field + len;
+                            }break;
+                        case NAS_IE_TYPE_VOICE_DOMAIN_PREF_UE_USAGE_SETTING:
+                            {
+                                log_msg(LOG_DEBUG, "Voice domain UE Usage : Skipping.\n");
+                                int len = msg[1];
+                                msg += len + 2; //msgid + len field + len;
+                            }break;
+                        case NAS_IE_TYPE_MS_NETWORK_CAPABILITY:
+                            {
+                                log_msg(LOG_DEBUG, "MS Network capability : Handling.\n");
+                                index++;
+                                nas->elements[index].msgType = NAS_IE_TYPE_MS_NETWORK_CAPABILITY;
+                                nas->elements[index].pduElement.ms_network.pres = true;
+                                nas->elements[index].pduElement.ms_network.element_id 
+                                    = msg[0];
+                                msg++;
+                                nas->elements[index].pduElement.ms_network.len = msg[0];
+                                msg++;
+                                memcpy(
+                                       (nas->elements[index].pduElement.ms_network.capab), 
+                                       msg, 
+                                       nas->elements[index].pduElement.ms_network.len);
+                                msg += 
+                                    nas->elements[index].pduElement.ms_network.len;
+                            }break;
+                        default:
+                            log_msg(LOG_WARNING, "Unknown AVP in Attach Req  %d \n", elem_id);
+                            msg++;
+                    }
+                
+                    continue;
+                }
+            }
+            break;
+        }
+
+	case NAS_ATTACH_COMPLETE:
+		log_msg(LOG_INFO, "NAS_ATTACH_COMPLETE recvd\n");
+		/*Other than error check there seems no information to pass to mme. Marking TODO for protocol study*/
+		break;
+
+	case NAS_DETACH_REQUEST: {
+		log_msg(LOG_INFO, "NAS_DETACH_REQUEST recvd\n");
+		nas->elements_len = 1;
+		nas->elements = calloc(sizeof(nas_pdu_elements), 1);
+
+		/*EPS mobility identity*/
+		memcpy(&(nas->elements[0].pduElement.mi_guti), msg + 11, sizeof(guti));
+		log_msg(LOG_INFO, "M-TMSI - %d\n", nas->elements[0].pduElement.mi_guti.m_TMSI);
+		break;
+	}
+	
+	case NAS_DETACH_ACCEPT: {
+		log_msg(LOG_INFO, "NAS_DETACH_ACCEPT recvd\n");
+        break;
+     	}
+
+    default:
+        log_msg(LOG_ERROR, "Unknown NAS Message type- 0x%x\n", nas->header.message_type);
+        break;
+
+	}
+}
+
+
+int
+parse_IEs(char *msg, struct proto_IE *proto_ies, unsigned short proc_code)
+{
+	unsigned short int no_of_IEs=0;
+
+	//short data_size=0;
+	//msg +=1;
+	//memcpy(&data_size, msg, 1);
+
+	//msg +=2;
+	memcpy(&no_of_IEs, msg, 2);
+	//no_of_IEs=msg[0];
+	no_of_IEs = ntohs(no_of_IEs);
+
+	/*Dumb logic....protocol or is creepy. Len sometimes comes in 3 bytes. How to know that??*/
+	if(0 == no_of_IEs) {
+		++msg;
+		memcpy(&no_of_IEs, msg, 2);
+		no_of_IEs = ntohs(no_of_IEs);
+	}
+
+	log_msg(LOG_INFO, "No. of IEs = %d\n", no_of_IEs);
+	proto_ies->no_of_IEs = no_of_IEs;
+	proto_ies->data = calloc(sizeof(struct proto_IE_data), no_of_IEs);
+	//alloc fail chk
+	msg+=2;
+
+	for(int i=0; i < no_of_IEs; ++i) {
+		struct proto_IE_data *ie = &(proto_ies->data[i]);
+		unsigned short IE_type, IE_data_len = 0;
+
+		memcpy(&IE_type, msg, sizeof(short int));
+		IE_type = ntohs(IE_type);
+		ie->IE_type = IE_type;
+		msg +=2;//next to ie type
+		msg +=1;//next to criticality
+
+		IE_data_len = get_length(&msg);
+		log_msg(LOG_INFO, "IE [%d]: type = %d\n", i, IE_type);
+		log_msg(LOG_INFO, "IE [%d]: data len= %x - %u\n", i, IE_data_len, IE_data_len);
+
+		char *buffer = NULL;
+		log_msg(LOG_INFO, "IE [%d]: value= %s\n", i, msg_to_hex_str(msg, IE_data_len, &buffer));
+	    log_buffer_free(&buffer);
+
+		/*Based on IE_Type call the parser to read IE info*/
+		/*TODO: optimize with function ptr etc.*/
+		switch(IE_type) {
+		case S1AP_IE_GLOBAL_ENB_ID:
+			log_msg(LOG_INFO, "IE [%d]: parse global eNB ID\n", i);
+			ie_parse_global_enb_id(msg+6, IE_data_len);
+			break;
+
+		case S1AP_IE_ENB_NAME:
+			log_msg(LOG_INFO, "IE [%d]: parse global eNB name\n", i);
+			ie_parse_enb_name(msg, IE_data_len);
+			break;
+
+		case S1AP_IE_SUPPORTED_TAS:
+			break;
+
+		case S1AP_IE_DEF_PAGING_DRX:
+			break;
+
+		case S1AP_IE_MME_UE_ID:{
+			ie->val.mme_ue_s1ap_id = decode_int_val((unsigned char *)msg,
+					IE_data_len);
+			log_msg(LOG_INFO, "IE [%d]: parse MME_UE_S1AP_ID - %d\n", i,
+					ie->val.mme_ue_s1ap_id);
+			break;
+			}
+
+		case S1AP_IE_ENB_UE_ID:{
+			ie->val.enb_ue_s1ap_id = decode_int_val((unsigned char *)msg,
+					IE_data_len);
+			log_msg(LOG_INFO, "IE [%d]: parse ENB_UE_S1AP_ID - %d\n", i,
+					ie->val.enb_ue_s1ap_id);
+			break;
+			}
+
+		case S1AP_IE_TAI:{
+			log_msg(LOG_INFO, "IE [%d]: TAI parse\n", i);
+			memcpy(&(ie->val.tai), msg+1, sizeof(struct TAI));
+			log_msg(LOG_INFO, "IE [%d]: plmn-%x %x %x, tac-%d\n", i,
+					ie->val.tai.plmn_id.idx[0],
+					ie->val.tai.plmn_id.idx[1], ie->val.tai.plmn_id.idx[2],
+					ie->val.tai.tac);
+			break;
+			}
+
+		case S1AP_IE_UTRAN_CGI:{
+			log_msg(LOG_INFO, "IE [%d]: EUTRAN CGI\n", i);
+			memset(&(ie->val.utran_cgi), 0, sizeof(struct CGI));
+			memcpy(&(ie->val.utran_cgi), msg+1, sizeof(struct CGI));
+			log_msg(LOG_INFO, "IE [%d]: plmn-%x %x %x, cell-%d\n", i,
+					ie->val.utran_cgi.plmn_id.idx[0],
+					ie->val.utran_cgi.plmn_id.idx[1], ie->val.utran_cgi.plmn_id.idx[2],
+					ie->val.utran_cgi.cell_id);
+			break;
+			}
+
+		case S1AP_IE_NAS_PDU: {
+	        log_msg(LOG_INFO, "IE [%d]: NAS msg type parsed = %x\n", i,
+                            ie->val.nas.header.message_type);
+			parse_nas_pdu(msg, IE_data_len, &ie->val.nas, proc_code);
+			break;
+			}
+
+		case S1AP_IE_RRC_EST_CAUSE: {
+			log_msg(LOG_INFO, "IE [%d]: parse RRC establishment code - %d\n", i, 
+                     ie->val.rrc_est_cause);
+			break;
+			}
+
+		case S1AP_ERAB_SETUP_CTX_SUR:
+			log_msg(LOG_INFO, "IE [%d]: parse S1AP_ERAB_SETUP_CTX_SUR parse_erab_pdu \n", i);
+			parse_erab_pdu(msg, IE_data_len, &ie->val.erab);
+			break;
+
+		default:
+			log_msg(LOG_INFO, "IE [%d]: Check IE type %d\n", i, IE_type);
+			break;
+		}
+
+		msg += (IE_data_len);
+		if(128 == IE_data_len) ++msg;//TODO: byte size issue. chk thi.
+	}
+	return 0;
+}
+
+int convertToInitUeProtoIe(InitiatingMessage_t *msg, struct proto_IE* proto_ies)
+{
+    proto_ies->procedureCode = msg->procedureCode;
+    proto_ies->criticality = msg->criticality;
+
+    if(msg->value.present == InitiatingMessage__value_PR_InitialUEMessage)
+    {
+        ProtocolIE_Container_129P32_t* protocolIes = &msg->value.choice.InitialUEMessage.protocolIEs;
+        proto_ies->no_of_IEs = protocolIes->list.count;
+
+        log_msg(LOG_INFO, "No of IEs = %d\n", proto_ies->no_of_IEs);
+        proto_ies->data = calloc(sizeof(struct proto_IE_data), proto_ies->no_of_IEs);
+        if(proto_ies->data == NULL) {
+            log_msg(LOG_ERROR,"Calloc failed for protocol IE.");
+            return -1;
+        }
+		for (int i = 0; i < protocolIes->list.count; i++) {
+			InitialUEMessage_IEs_t *ie_p;
+			ie_p = protocolIes->list.array[i];
+			switch(ie_p->id) {
+				case ProtocolIE_ID_id_eNB_UE_S1AP_ID:
+					{
+                        ENB_UE_S1AP_ID_t *s1apENBUES1APID_p = NULL;
+                        if(InitialUEMessage_IEs__value_PR_ENB_UE_S1AP_ID == ie_p->value.present)
+                        {
+						    s1apENBUES1APID_p = &ie_p->value.choice.ENB_UE_S1AP_ID;
+                        }
+
+                        if (s1apENBUES1APID_p == NULL) {
+							log_msg (LOG_ERROR, "Decoding of IE eNB_UE_S1AP_ID failed\n");
+							return -1;
+						}
+
+                        log_msg(LOG_DEBUG, "ENB UE S1ap ID decode Success\n");
+                        proto_ies->data[i].IE_type = S1AP_IE_ENB_UE_ID;
+						memcpy(&proto_ies->data[i].val.enb_ue_s1ap_id, s1apENBUES1APID_p, sizeof(ENB_UE_S1AP_ID_t));
+						s1apENBUES1APID_p = NULL;
+					} break;
+				case ProtocolIE_ID_id_NAS_PDU:
+					{
+                        NAS_PDU_t *s1apNASPDU_p = NULL;
+                        if(InitialUEMessage_IEs__value_PR_NAS_PDU == ie_p->value.present)
+                        {
+						    s1apNASPDU_p = &ie_p->value.choice.NAS_PDU;
+                        }
+
+                        if (s1apNASPDU_p == NULL) {
+							log_msg (LOG_ERROR, "Decoding of IE NAS PDU failed\n");
+							return -1;
+						}
+
+                        log_msg(LOG_DEBUG, "NAS PDU decode Success\n");
+                        proto_ies->data[i].IE_type = S1AP_IE_NAS_PDU;
+                        parse_nas_pdu((char*)s1apNASPDU_p->buf, s1apNASPDU_p->size,
+                                       &proto_ies->data[i].val.nas, msg->procedureCode);
+						s1apNASPDU_p = NULL;
+					} break;
+				case ProtocolIE_ID_id_TAI:
+					{
+                        TAI_t *s1apTAI_p = NULL;
+                        if(InitialUEMessage_IEs__value_PR_TAI == ie_p->value.present)
+                        {
+						    s1apTAI_p = &ie_p->value.choice.TAI;
+                        }
+
+                        if (s1apTAI_p == NULL) {
+							log_msg (LOG_ERROR, "Decoding of IE TAI failed\n");
+							return -1;
+						}
+
+                        log_msg(LOG_DEBUG, "TAI decode Success\n");
+                        proto_ies->data[i].IE_type = S1AP_IE_TAI;
+						memcpy(&proto_ies->data[i].val.tai.tac, s1apTAI_p->tAC.buf, s1apTAI_p->tAC.size);
+						memcpy(proto_ies->data[i].val.tai.plmn_id.idx,
+                                s1apTAI_p->pLMNidentity.buf, s1apTAI_p->pLMNidentity.size);
+						s1apTAI_p = NULL;
+					} break;
+				case ProtocolIE_ID_id_EUTRAN_CGI:
+					{
+			            EUTRAN_CGI_t*	 s1apCGI_p = NULL;;
+                        if(InitialUEMessage_IEs__value_PR_EUTRAN_CGI == ie_p->value.present)
+                        {
+						    s1apCGI_p = &ie_p->value.choice.EUTRAN_CGI;
+                        }
+
+                        if (s1apCGI_p == NULL) {
+							log_msg (LOG_ERROR, "Decoding of IE CGI failed\n");
+							return -1;
+						}
+
+                        log_msg(LOG_DEBUG, "CGI decode Success\n");
+                        proto_ies->data[i].IE_type = S1AP_IE_UTRAN_CGI;
+						memcpy(&proto_ies->data[i].val.utran_cgi.cell_id,
+                               s1apCGI_p->cell_ID.buf, s1apCGI_p->cell_ID.size);
+						memcpy(proto_ies->data[i].val.utran_cgi.plmn_id.idx,
+                                s1apCGI_p->pLMNidentity.buf, s1apCGI_p->pLMNidentity.size);
+						s1apCGI_p = NULL;
+					} break;
+				case ProtocolIE_ID_id_RRC_Establishment_Cause:
+					{
+			            RRC_Establishment_Cause_t	 *s1apRRCEstCause_p;
+                        if(InitialUEMessage_IEs__value_PR_RRC_Establishment_Cause == ie_p->value.present)
+                        {
+						    s1apRRCEstCause_p = &ie_p->value.choice.RRC_Establishment_Cause;
+                        }
+
+                        if (s1apRRCEstCause_p == NULL) {
+							log_msg (LOG_ERROR, "Decoding of IE RRC Cause failed\n");
+							return -1;
+						}
+
+                        log_msg(LOG_DEBUG, "RRC Cause decode Success\n");
+                        proto_ies->data[i].IE_type = S1AP_IE_RRC_EST_CAUSE;
+						proto_ies->data[i].val.rrc_est_cause = (enum ie_RRC_est_cause) *s1apRRCEstCause_p;
+						s1apRRCEstCause_p = NULL;
+					} break;
+				case ProtocolIE_ID_id_S_TMSI:
+					{
+			            S_TMSI_t*	 s1apStmsi_p = NULL;;
+                        if(InitialUEMessage_IEs__value_PR_S_TMSI == ie_p->value.present)
+                        {
+						    s1apStmsi_p = &ie_p->value.choice.S_TMSI;
+                        }
+
+                        if (s1apStmsi_p == NULL) {
+							log_msg (LOG_ERROR, "Decoding of IE STMSI failed\n");
+							return -1;
+						}
+
+                        //struct STMSI     s_tmsi
+                        proto_ies->data[i].IE_type = S1AP_IE_S_TMSI;
+						memcpy(&proto_ies->data[i].val.s_tmsi.mme_code,
+                               s1apStmsi_p->mMEC.buf, sizeof(uint8_t));
+						memcpy(&proto_ies->data[i].val.s_tmsi.m_TMSI,
+                                s1apStmsi_p->m_TMSI.buf, sizeof(uint32_t));
+						s1apStmsi_p = NULL;
+					} break;
+                default:
+                    {
+                        log_msg(LOG_WARNING, "Unhandled IE %d in initial UE message ", ie_p->id);
+                    }
+			}
+		}
+     }
+
+    return 0;
+}
+
+static int
+init_ue_msg_handler(InitiatingMessage_t *msg, int enb_fd)
+{
+	//TODO: use static instead of synamic for perf.
+	struct proto_IE proto_ies;
+
+	log_msg(LOG_INFO, "S1AP_INITIAL_UE_MSG msg: \n");
+
+    /* TODO : Error handling. Bad message will lead crash. 
+     * Preferably reject the message, increment stats.
+     */
+	int decode_result = convertToInitUeProtoIe(msg, &proto_ies);
+    if(decode_result < 0 )
+    {
+	  log_msg(LOG_ERROR, "S1ap message decode failed. Dropping message");
+      return E_FAIL;
+    }
+
+	/*Check nas message type*/
+	//TODO: check through all proto IEs for which is nas
+	//currentlyy hard coding to 2 looking at packets
+	log_msg(LOG_INFO, "NAS msg type parsed = %x\n", proto_ies.data[1].val.nas.header.message_type);
+	switch(proto_ies.data[1].val.nas.header.message_type) {
+	case NAS_ATTACH_REQUEST:
+		s1_init_ue_handler(&proto_ies, enb_fd);
+		break;
+
+	case NAS_SERVICE_REQUEST:
+		s1_init_ue_service_req_handler(&proto_ies, enb_fd);
+		break;
+
+	case NAS_DETACH_REQUEST:
+		detach_stage1_handler(&proto_ies, true);
+		break;
+		
+	case NAS_DETACH_ACCEPT:
+		detach_accept_from_ue_handler(&proto_ies, true);
+		break;
+
+	case NAS_TAU_REQUEST:
+	    tau_request_handler(&proto_ies, enb_fd);
+	    break;
+	}
+
+	free(proto_ies.data);
+	//TODO: free IEs
+	return SUCCESS;
+}
+
+static int
+UL_NAS_msg_handler(InitiatingMessage_t *msg, int enb_fd)
+{
+	//TODO: use static instead of synamic for perf.
+	struct proto_IE proto_ies;
+
+	log_msg(LOG_INFO, "S1AP_UL_NAS_TX_MSG msg \n");
+
+    convertUplinkNasToProtoIe(msg, &proto_ies);
+
+	/*Check nas message type*/
+	//TODO: check through all proto IEs for which is nas
+	//currentlyy hard coding to 2 looking at packets
+	log_msg(LOG_INFO, "NAS msg type = %x\n", proto_ies.data[2].val.nas.header.message_type);
+	switch(proto_ies.data[2].val.nas.header.message_type) {
+	case NAS_AUTH_RESP:
+		s1_auth_resp_handler(&proto_ies);
+		break;
+
+	case NAS_AUTH_FAILURE:
+		s1_auth_fail_handler(&proto_ies);
+		break;
+
+	case NAS_ATTACH_REQUEST:
+		s1_init_ue_handler(&proto_ies, enb_fd);
+		break;
+
+	case NAS_SEC_MODE_COMPLETE:
+		s1_secmode_resp_handler(&proto_ies);
+		break;
+
+	case NAS_ESM_RESP:
+		s1_esm_resp_handler(&proto_ies);
+		break;
+
+	case NAS_ATTACH_COMPLETE:
+		s1_attach_complete_handler(&proto_ies);
+		break;
+
+	case NAS_DETACH_REQUEST:
+		detach_stage1_handler(&proto_ies, false);
+		break;
+		
+	case NAS_DETACH_ACCEPT:
+		detach_accept_from_ue_handler(&proto_ies, false);
+		break;
+
+	case NAS_IDENTITY_RESPONSE:
+        s1_identity_resp_handler(&proto_ies);
+        break;
+
+	case NAS_TAU_REQUEST:
+	    tau_request_handler(&proto_ies, enb_fd);
+	    break;
+	}
+
+	//TODO: free IEs
+	free(proto_ies.data);
+	return SUCCESS;
+}
+
+void
+handle_s1ap_message(void *msg)
+{
+	log_msg(LOG_INFO, "Inside handle_s1ap_message.\n");
+	/*convert message from network to host*/
+
+	/*Call handler for the procedure code. TBD: Tasks pool for handlers*/
+
+	int enb_fd = 0;
+    	int msg_size = 0;
+	memcpy(&enb_fd, msg, sizeof(int));
+	memcpy(&msg_size, msg + sizeof(int), sizeof(int));
+	char *message = ((char *) msg) + 2*sizeof(int);
+	S1AP_PDU_t                              pdu = {(S1AP_PDU_PR_NOTHING)};
+	S1AP_PDU_t                             *pdu_p = &pdu;
+	asn_dec_rval_t                          dec_ret = {(RC_OK)};
+	memset ((void *)pdu_p, 0, sizeof (S1AP_PDU_t));
+	dec_ret = aper_decode (NULL, &asn_DEF_S1AP_PDU, (void **)&pdu_p, message, msg_size, 0, 0);
+
+	if (dec_ret.code != RC_OK) {
+		log_msg(LOG_ERROR, "ASN Decode PDU Failed %d\n", dec_ret.consumed);
+		ASN__DECODE_FAILED;
+        	free(msg);
+		return;
+	}
+
+	switch (pdu_p->present) {
+	    case S1AP_PDU_PR_initiatingMessage:
+            s1ap_mme_decode_initiating (pdu_p->choice.initiatingMessage, enb_fd);
+            break;
+        case S1AP_PDU_PR_successfulOutcome:
+            s1ap_mme_decode_successfull_outcome (pdu_p->choice.successfulOutcome);
+            break;
+        case S1AP_PDU_PR_unsuccessfulOutcome:
+            s1ap_mme_decode_unsuccessfull_outcome (pdu_p->choice.unsuccessfulOutcome);
+            break;
+        default:
+            log_msg(LOG_WARNING, "Unknown message outcome (%d) or not implemented", (int)pdu_p->present);
+            break;
+      }
+
+    return;
+}
+
+int
+s1ap_mme_decode_successfull_outcome (SuccessfulOutcome_t* msg)
+{
+    log_msg(LOG_DEBUG,"successful outcome decode :");
+    log_msg(LOG_INFO, "proc code %d\n", msg->procedureCode);
+  switch (msg->procedureCode) {
+
+	case S1AP_INITIAL_CTX_RESP_CODE:
+		s1_init_ctx_resp_handler(msg);
+		break;
+	
+	case S1AP_UE_CONTEXT_RELEASE_CODE:
+		s1_ctx_release_complete_handler(msg);
+		break;
+		
+	default:
+		log_msg(LOG_ERROR, "Unknown procedure code - %d\n",
+		         msg->procedureCode & 0x00FF);
+		break;
+	}
+	
+	return 0;
+}
+
+int
+s1ap_mme_decode_unsuccessfull_outcome (UnsuccessfulOutcome_t *msg)
+{
+    log_msg(LOG_DEBUG,"unsuccessful outcome decode : TBD");
+    return 0;
+}
+
+int
+s1ap_mme_decode_initiating (InitiatingMessage_t *initiating_p, int enb_fd) 
+{
+  log_msg(LOG_INFO, "proc code %d\n", initiating_p->procedureCode);
+  switch (initiating_p->procedureCode) {
+
+	case S1AP_SETUP_REQUEST_CODE:
+		s1_setup_handler(initiating_p, enb_fd);
+		break;
+
+	case S1AP_INITIAL_UE_MSG_CODE:
+		init_ue_msg_handler(initiating_p, enb_fd);
+		break;
+
+	case S1AP_UL_NAS_TX_MSG_CODE:
+		UL_NAS_msg_handler(initiating_p, enb_fd);
+		break;
+
+		
+	case S1AP_UE_CONTEXT_RELEASE_REQUEST_CODE:
+		s1_ctx_release_request_handler(initiating_p);
+		break;
+
+	default:
+		log_msg(LOG_ERROR, "Unknown procedure code - %d\n",
+			initiating_p->procedureCode & 0x00FF);
+		break;
+	}
+	
+  //free(msg);
+	return 0;
+}
+
+int convertUplinkNasToProtoIe(InitiatingMessage_t *msg, struct proto_IE* proto_ies)
+{
+    proto_ies->procedureCode = msg->procedureCode;
+    proto_ies->criticality = msg->criticality;
+	int no_of_IEs = 0;
+
+    if(msg->value.present == InitiatingMessage__value_PR_UplinkNASTransport)
+    {
+        ProtocolIE_Container_129P33_t* protocolIes = &msg->value.choice.UplinkNASTransport.protocolIEs;
+        no_of_IEs = protocolIes->list.count;
+        proto_ies->no_of_IEs = no_of_IEs;
+
+        log_msg(LOG_INFO, "No of IEs = %d\n", no_of_IEs);
+        proto_ies->data = calloc(sizeof(struct proto_IE_data), no_of_IEs);
+        if(proto_ies->data == NULL)
+        {
+            log_msg(LOG_ERROR,"Malloc failed for protocol IE.");
+            return -1;
+        }
+		for (int i = 0; i < protocolIes->list.count; i++) {
+			UplinkNASTransport_IEs_t *ie_p;
+			ie_p = protocolIes->list.array[i];
+			switch(ie_p->id) {
+				case ProtocolIE_ID_id_eNB_UE_S1AP_ID:
+					{
+                        ENB_UE_S1AP_ID_t *s1apENBUES1APID_p = NULL;
+                        if(UplinkNASTransport_IEs__value_PR_ENB_UE_S1AP_ID == ie_p->value.present)
+                        {
+						    s1apENBUES1APID_p = &ie_p->value.choice.ENB_UE_S1AP_ID;
+                        }
+						
+                        if (s1apENBUES1APID_p == NULL) {
+							log_msg (LOG_ERROR, "Decoding of IE eNB_UE_S1AP_ID failed\n");
+							return -1;
+						}
+
+                        proto_ies->data[i].IE_type = S1AP_IE_ENB_UE_ID; 
+						memcpy(&proto_ies->data[i].val.enb_ue_s1ap_id, s1apENBUES1APID_p, sizeof(ENB_UE_S1AP_ID_t));
+						s1apENBUES1APID_p = NULL;
+					} break;
+				case ProtocolIE_ID_id_MME_UE_S1AP_ID:
+					{
+                        MME_UE_S1AP_ID_t *s1apMMEUES1APID_p = NULL;
+                        if(UplinkNASTransport_IEs__value_PR_MME_UE_S1AP_ID == ie_p->value.present)
+                        {
+						    s1apMMEUES1APID_p = &ie_p->value.choice.MME_UE_S1AP_ID;
+                        }
+						
+                        if (s1apMMEUES1APID_p == NULL) {
+							log_msg (LOG_ERROR, "Decoding of IE MME_UE_S1AP_ID failed\n");
+							return -1;
+						}
+
+                        proto_ies->data[i].IE_type = S1AP_IE_MME_UE_ID; 
+						memcpy(&proto_ies->data[i].val.mme_ue_s1ap_id, s1apMMEUES1APID_p, sizeof(MME_UE_S1AP_ID_t));
+						s1apMMEUES1APID_p = NULL;
+					} break;
+				case ProtocolIE_ID_id_NAS_PDU:
+					{
+                        NAS_PDU_t *s1apNASPDU_p = NULL;
+                        if(UplinkNASTransport_IEs__value_PR_NAS_PDU == ie_p->value.present)
+                        {
+						    s1apNASPDU_p = &ie_p->value.choice.NAS_PDU;
+                        }
+						
+                        if (s1apNASPDU_p == NULL) {
+							log_msg (LOG_ERROR, "Decoding of IE NAS PDU failed\n");
+							return -1;
+						}
+
+                        proto_ies->data[i].IE_type = S1AP_IE_NAS_PDU; 
+                        parse_nas_pdu((char*)s1apNASPDU_p->buf, s1apNASPDU_p->size, 
+                                       &proto_ies->data[i].val.nas, msg->procedureCode);
+						s1apNASPDU_p = NULL;
+					} break;
+				case ProtocolIE_ID_id_TAI:
+					{
+                        TAI_t *s1apTAI_p = NULL;
+                        if(UplinkNASTransport_IEs__value_PR_TAI == ie_p->value.present)
+                        {
+						    s1apTAI_p = &ie_p->value.choice.TAI;
+                        }
+						
+                        if (s1apTAI_p == NULL) {
+							log_msg (LOG_ERROR, "Decoding of IE TAI failed\n");
+							return -1;
+						}
+
+                        proto_ies->data[i].IE_type = S1AP_IE_TAI; 
+						memcpy(&proto_ies->data[i].val.tai.tac, s1apTAI_p->tAC.buf, s1apTAI_p->tAC.size);
+						memcpy(&proto_ies->data[i].val.tai.plmn_id, 
+                                s1apTAI_p->pLMNidentity.buf, s1apTAI_p->pLMNidentity.size);
+						s1apTAI_p = NULL;
+					} break;
+				case ProtocolIE_ID_id_EUTRAN_CGI:
+					{
+			            EUTRAN_CGI_t*	 s1apCGI_p = NULL;;
+                        if(UplinkNASTransport_IEs__value_PR_EUTRAN_CGI == ie_p->value.present)
+                        {
+						    s1apCGI_p = &ie_p->value.choice.EUTRAN_CGI;
+                        }
+						
+                        if (s1apCGI_p == NULL) {
+							log_msg (LOG_ERROR, "Decoding of IE CGI failed\n");
+							return -1;
+						}
+
+                        proto_ies->data[i].IE_type = S1AP_IE_UTRAN_CGI; 
+						memcpy(&proto_ies->data[i].val.utran_cgi.cell_id, 
+                               s1apCGI_p->cell_ID.buf, s1apCGI_p->cell_ID.size);
+						memcpy(&proto_ies->data[i].val.utran_cgi.plmn_id.idx, 
+                                s1apCGI_p->pLMNidentity.buf, s1apCGI_p->pLMNidentity.size);
+						s1apCGI_p = NULL;
+					} break;
+                default:
+                    {
+                        log_msg(LOG_WARNING, "Unhandled IE %d", ie_p->id);
+                    }
+			}
+		}
+     }
+
+    return 0;
+}
+
+int convertInitCtxRspToProtoIe(SuccessfulOutcome_t *msg, struct proto_IE* proto_ies)
+{
+    proto_ies->procedureCode = msg->procedureCode;
+    proto_ies->criticality = msg->criticality;
+	int no_of_IEs = 0;
+
+    if(msg->value.present == SuccessfulOutcome__value_PR_InitialContextSetupResponse)
+    {
+        ProtocolIE_Container_129P20_t* protocolIes 
+            = &msg->value.choice.InitialContextSetupResponse.protocolIEs;
+        no_of_IEs = protocolIes->list.count;
+        proto_ies->no_of_IEs = no_of_IEs;
+
+        log_msg(LOG_INFO, "No of IEs = %d\n", no_of_IEs);
+        proto_ies->data = calloc(sizeof(struct proto_IE_data), no_of_IEs);
+        if(proto_ies->data == NULL)
+        {
+            log_msg(LOG_ERROR,"Malloc failed for protocol IE.");
+            return -1;
+        }
+		for (int i = 0; i < protocolIes->list.count; i++) {
+			InitialContextSetupResponseIEs_t *ie_p;
+			ie_p = protocolIes->list.array[i];
+			switch(ie_p->id) {
+				case ProtocolIE_ID_id_eNB_UE_S1AP_ID:
+					{
+                        ENB_UE_S1AP_ID_t *s1apENBUES1APID_p = NULL;
+                        if(InitialContextSetupResponseIEs__value_PR_ENB_UE_S1AP_ID == ie_p->value.present)
+                        {
+						    s1apENBUES1APID_p = &ie_p->value.choice.ENB_UE_S1AP_ID;
+                        }
+						
+                        if (s1apENBUES1APID_p == NULL) {
+							log_msg (LOG_ERROR, "Decoding of IE eNB_UE_S1AP_ID failed\n");
+							return -1;
+						}
+
+                        proto_ies->data[i].IE_type = S1AP_IE_ENB_UE_ID; 
+						memcpy(&proto_ies->data[i].val.enb_ue_s1ap_id, s1apENBUES1APID_p, sizeof(ENB_UE_S1AP_ID_t));
+						s1apENBUES1APID_p = NULL;
+					} break;
+				case ProtocolIE_ID_id_MME_UE_S1AP_ID:
+					{
+                        MME_UE_S1AP_ID_t *s1apMMEUES1APID_p = NULL;
+                        if(InitialContextSetupResponseIEs__value_PR_MME_UE_S1AP_ID == ie_p->value.present)
+                        {
+						    s1apMMEUES1APID_p = &ie_p->value.choice.MME_UE_S1AP_ID;
+                        }
+						
+                        if (s1apMMEUES1APID_p == NULL) {
+							log_msg (LOG_ERROR, "Decoding of IE MME_UE_S1AP_ID failed\n");
+							return -1;
+						}
+
+                        proto_ies->data[i].IE_type = S1AP_IE_MME_UE_ID; 
+						memcpy(&proto_ies->data[i].val.mme_ue_s1ap_id, s1apMMEUES1APID_p, sizeof(MME_UE_S1AP_ID_t));
+						s1apMMEUES1APID_p = NULL;
+					} break;
+				case ProtocolIE_ID_id_E_RABSetupListCtxtSURes:
+					{
+                        E_RABSetupListCtxtSURes_t *s1apErabSetupList_p = NULL;
+                        if(InitialContextSetupResponseIEs__value_PR_E_RABSetupListCtxtSURes == ie_p->value.present)
+                        {
+						    s1apErabSetupList_p = &ie_p->value.choice.E_RABSetupListCtxtSURes;
+                        }
+						
+                        if (s1apErabSetupList_p == NULL) {
+							log_msg (LOG_ERROR, "Decoding of IE s1apErabSetupList failed\n");
+							return -1;
+						}
+
+                        proto_ies->data[i].IE_type = S1AP_ERAB_SETUP_CTX_SUR;
+                        proto_ies->data[i].val.erab.no_of_elements = s1apErabSetupList_p->list.count;
+                        proto_ies->data[i].val.erab.elements = calloc(sizeof(union eRAB_IE), 
+                                                                    s1apErabSetupList_p->list.count);
+                        if(proto_ies->data[i].val.erab.elements == NULL)
+                        {
+                            log_msg(LOG_ERROR,"Malloc failed for protocol IE: Erab elements.");
+                            break;;
+                        }
+                        for (int j = 0; 
+                             j < s1apErabSetupList_p->list.count; j++) 
+                        {
+                            E_RABSetupItemCtxtSUResIEs_t *ie_p;
+                            ie_p = (E_RABSetupItemCtxtSUResIEs_t*)s1apErabSetupList_p->list.array[j];
+                            switch(ie_p->id) {
+                                case ProtocolIE_ID_id_E_RABSetupItemCtxtSURes:
+                                    {
+                                        E_RABSetupItemCtxtSURes_t* s1apErabSetupItem_p = NULL;
+                                        if(E_RABSetupItemCtxtSUResIEs__value_PR_E_RABSetupItemCtxtSURes == ie_p->value.present)
+                                        {
+                                            s1apErabSetupItem_p = &ie_p->value.choice.E_RABSetupItemCtxtSURes;
+                                        }
+
+                                        if (s1apErabSetupItem_p == NULL) {
+                                            log_msg (LOG_ERROR, "Decoding of IE s1apErabSetupItem failed\n");
+                                            return -1;
+                                        }
+
+                                        proto_ies->data[i].val.erab.elements[j].su_res.eRAB_id 
+                                                 = (unsigned short)s1apErabSetupItem_p->e_RAB_ID;
+                                        memcpy(
+                                            &(proto_ies->data[i].val.erab.elements[j].su_res.gtp_teid),
+                                            s1apErabSetupItem_p->gTP_TEID.buf,
+                                            s1apErabSetupItem_p->gTP_TEID.size);
+                                        proto_ies->data[i].val.erab.elements[j].su_res.gtp_teid
+                                            = ntohl(proto_ies->data[i].val.erab.elements[j].su_res.gtp_teid);
+
+                                        memcpy(
+                                           &(proto_ies->data[i].val.erab.elements[j].su_res.transp_layer_addr),
+                                            s1apErabSetupItem_p->transportLayerAddress.buf,
+                                            s1apErabSetupItem_p->transportLayerAddress.size);
+                                        proto_ies->data[i].val.erab.elements[j].su_res.transp_layer_addr
+                                            = ntohl(proto_ies->data[i].val.erab.elements[j].su_res.transp_layer_addr);
+                                        s1apErabSetupItem_p = NULL;
+                                    }break;
+                                default:
+                                    {
+                                        log_msg(LOG_WARNING, "Unhandled List item %d", ie_p->id);
+                                    }
+                            }
+                        }
+
+						s1apErabSetupList_p = NULL;
+					} break;
+                default:
+                    {
+                        log_msg(LOG_WARNING, "Unhandled IE %d", ie_p->id);
+                    }
+			}
+		}
+     }
+
+    return 0;
+}
+
+int convertUeCtxRelComplToProtoIe(SuccessfulOutcome_t *msg, struct proto_IE* proto_ies)
+{
+    proto_ies->procedureCode = msg->procedureCode;
+    proto_ies->criticality = msg->criticality;
+	int no_of_IEs = 0;
+
+    if(msg->value.present == SuccessfulOutcome__value_PR_UEContextReleaseComplete)
+    {
+        ProtocolIE_Container_129P25_t* protocolIes 
+            = &msg->value.choice.UEContextReleaseComplete.protocolIEs;
+        no_of_IEs = protocolIes->list.count;
+        proto_ies->no_of_IEs = no_of_IEs;
+
+        log_msg(LOG_INFO, "No of IEs = %d\n", no_of_IEs);
+        proto_ies->data = calloc(sizeof(struct proto_IE_data), no_of_IEs);
+        if(proto_ies->data == NULL)
+        {
+            log_msg(LOG_ERROR,"Malloc failed for protocol IE.");
+            return -1;
+        }
+		for (int i = 0; i < protocolIes->list.count; i++) {
+			UEContextReleaseComplete_IEs_t *ie_p;
+			ie_p = protocolIes->list.array[i];
+			switch(ie_p->id) {
+				case ProtocolIE_ID_id_eNB_UE_S1AP_ID:
+					{
+                        ENB_UE_S1AP_ID_t *s1apENBUES1APID_p = NULL;
+                        if(UEContextReleaseComplete_IEs__value_PR_ENB_UE_S1AP_ID == ie_p->value.present)
+                        {
+						    s1apENBUES1APID_p = &ie_p->value.choice.ENB_UE_S1AP_ID;
+                        }
+						
+                        if (s1apENBUES1APID_p == NULL) {
+							log_msg (LOG_ERROR, "Decoding of IE eNB_UE_S1AP_ID failed\n");
+							return -1;
+						}
+
+                        proto_ies->data[i].IE_type = S1AP_IE_ENB_UE_ID; 
+						memcpy(&proto_ies->data[i].val.enb_ue_s1ap_id, s1apENBUES1APID_p, sizeof(ENB_UE_S1AP_ID_t));
+						s1apENBUES1APID_p = NULL;
+					} break;
+				case ProtocolIE_ID_id_MME_UE_S1AP_ID:
+					{
+                        MME_UE_S1AP_ID_t *s1apMMEUES1APID_p = NULL;
+                        if(UEContextReleaseComplete_IEs__value_PR_MME_UE_S1AP_ID == ie_p->value.present)
+                        {
+						    s1apMMEUES1APID_p = &ie_p->value.choice.MME_UE_S1AP_ID;
+                        }
+						
+                        if (s1apMMEUES1APID_p == NULL) {
+							log_msg (LOG_ERROR, "Decoding of IE MME_UE_S1AP_ID failed\n");
+							return -1;
+						}
+
+                        proto_ies->data[i].IE_type = S1AP_IE_MME_UE_ID; 
+						memcpy(&proto_ies->data[i].val.mme_ue_s1ap_id, s1apMMEUES1APID_p, sizeof(MME_UE_S1AP_ID_t));
+						s1apMMEUES1APID_p = NULL;
+					} break;
+                default:
+                    {
+                        log_msg(LOG_WARNING, "Unhandled IE %d\n", ie_p->id);
+                    }
+			}
+		}
+     }
+
+    return 0;
+}
+
+int convertUeCtxRelReqToProtoIe(InitiatingMessage_t *msg, struct proto_IE* proto_ies)
+{
+    proto_ies->procedureCode = msg->procedureCode;
+    proto_ies->criticality = msg->criticality;
+	int no_of_IEs = 0;
+
+    if(msg->value.present == InitiatingMessage__value_PR_UEContextReleaseRequest)
+    {
+        ProtocolIE_Container_129P23_t* protocolIes
+            = &msg->value.choice.UEContextReleaseRequest.protocolIEs;
+        no_of_IEs = protocolIes->list.count;
+        proto_ies->no_of_IEs = no_of_IEs;
+
+        log_msg(LOG_INFO, "No of IEs = %d\n", no_of_IEs);
+        proto_ies->data = calloc(sizeof(struct proto_IE_data), no_of_IEs);
+        if(proto_ies->data == NULL)
+        {
+            log_msg(LOG_ERROR,"Malloc failed for protocol IE.");
+            return -1;
+        }
+		for (int i = 0; i < protocolIes->list.count; i++) {
+			UEContextReleaseRequest_IEs_t *ie_p;
+			ie_p = protocolIes->list.array[i];
+			switch(ie_p->id) {
+				case ProtocolIE_ID_id_eNB_UE_S1AP_ID:
+					{
+                        ENB_UE_S1AP_ID_t *s1apENBUES1APID_p = NULL;
+                        if(UEContextReleaseRequest_IEs__value_PR_ENB_UE_S1AP_ID == ie_p->value.present)
+                        {
+						    s1apENBUES1APID_p = &ie_p->value.choice.ENB_UE_S1AP_ID;
+                        }
+
+                        if (s1apENBUES1APID_p == NULL) {
+							log_msg (LOG_ERROR, "Decoding of IE eNB_UE_S1AP_ID failed\n");
+							return -1;
+						}
+
+                        proto_ies->data[i].IE_type = S1AP_IE_ENB_UE_ID;
+						memcpy(&proto_ies->data[i].val.enb_ue_s1ap_id, s1apENBUES1APID_p, sizeof(ENB_UE_S1AP_ID_t));
+						s1apENBUES1APID_p = NULL;
+					} break;
+				case ProtocolIE_ID_id_MME_UE_S1AP_ID:
+					{
+                        MME_UE_S1AP_ID_t *s1apMMEUES1APID_p = NULL;
+                        if(UEContextReleaseRequest_IEs__value_PR_MME_UE_S1AP_ID == ie_p->value.present)
+                        {
+						    s1apMMEUES1APID_p = &ie_p->value.choice.MME_UE_S1AP_ID;
+                        }
+
+                        if (s1apMMEUES1APID_p == NULL) {
+							log_msg (LOG_ERROR, "Decoding of IE MME_UE_S1AP_ID failed\n");
+							return -1;
+						}
+
+                        proto_ies->data[i].IE_type = S1AP_IE_MME_UE_ID;
+						memcpy(&proto_ies->data[i].val.mme_ue_s1ap_id, s1apMMEUES1APID_p, sizeof(MME_UE_S1AP_ID_t));
+						s1apMMEUES1APID_p = NULL;
+					} break;
+				case ProtocolIE_ID_id_Cause:
+					{
+                        Cause_t *s1apCause_p = NULL;
+                        if(UEContextReleaseRequest_IEs__value_PR_Cause == ie_p->value.present)
+                        {
+						    s1apCause_p = &ie_p->value.choice.Cause;
+                        }
+
+                        if (s1apCause_p == NULL) {
+							log_msg (LOG_ERROR, "Decoding of IE Cause failed\n");
+							return -1;
+						}
+
+                        proto_ies->data[i].IE_type = S1AP_IE_CAUSE;
+                        proto_ies->data[i].val.cause.present = s1apCause_p->present;
+                        switch(s1apCause_p->present)
+                        {
+                            case Cause_PR_radioNetwork:
+							    log_msg (LOG_DEBUG, "RadioNetwork case : %d\n",
+                                          s1apCause_p->choice.radioNetwork);
+                                proto_ies->data[i].val.cause.choice.radioNetwork
+                                    = s1apCause_p->choice.radioNetwork;
+                                break;
+                            case Cause_PR_transport:
+							    log_msg (LOG_DEBUG, "Transport case : %d\n",
+                                          s1apCause_p->choice.transport);
+                                proto_ies->data[i].val.cause.choice.transport
+                                    = s1apCause_p->choice.transport;
+                                break;
+                            case Cause_PR_nas:
+							    log_msg (LOG_DEBUG, "Nas case : %d\n",
+                                          s1apCause_p->choice.nas);
+                                proto_ies->data[i].val.cause.choice.nas
+                                    = s1apCause_p->choice.nas;
+                                break;
+                            case Cause_PR_protocol:
+							    log_msg (LOG_DEBUG, "Protocol case : %d\n",
+                                          s1apCause_p->choice.protocol);
+                                proto_ies->data[i].val.cause.choice.protocol
+                                    = s1apCause_p->choice.protocol;
+                                break;
+                            case Cause_PR_misc:
+							    log_msg (LOG_DEBUG, "Misc case : %d\n",
+                                          s1apCause_p->choice.misc);
+                                proto_ies->data[i].val.cause.choice.misc
+                                    = s1apCause_p->choice.misc;
+                                break;
+                            case Cause_PR_NOTHING:
+                            default:
+                                log_msg(LOG_WARNING, "Unknown cause %d\n", s1apCause_p->present);
+
+                        }
+						s1apCause_p = NULL;
+					} break;
+                default:
+                    {
+                        log_msg(LOG_WARNING, "Unhandled IE %d\n", ie_p->id);
+                    }
+			}
+		}
+     }
+
+    return 0;
+}
+
diff --git a/src/s1ap/handlers/s1ap_msg_delegator.c.bkup b/src/s1ap/handlers/s1ap_msg_delegator.c.bkup
new file mode 100644
index 0000000..9732c6d
--- /dev/null
+++ b/src/s1ap/handlers/s1ap_msg_delegator.c.bkup
@@ -0,0 +1,1279 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ *
+ * 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.
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <pthread.h>
+
+#include "options.h"
+#include "ipc_api.h"
+#include "main.h"
+#include "s1ap.h"
+#include "s1ap_config.h"
+#include "sctp_conn.h"
+#include "s1ap_structs.h"
+#include "s1ap_msg_codes.h"
+#include "s1ap_ie.h"
+#include "ProtocolIE-ID.h"
+#include "ProtocolIE-Field.h"
+static void
+parse_erab_pdu(char *msg,  int nas_msg_len, struct eRAB_elements *erab)
+{
+	//struct eRAB_header *header = (struct eRAB*)msg;
+
+	//char *ie = msg + 5; /*ID(2)+crit(1)+len(1)+mistry(1)*/
+
+	/*TODO: write parse_IEs for erab IEs here going ahead*/
+	/*For now copying directly as it is single structure*/
+	char *ie = msg + 5; /*ID(2)+crit(1)+len(1)*/
+
+	erab->no_of_elements = 1;
+	erab->elements = (union eRAB_IE*)calloc(sizeof(union eRAB_IE), 1);
+	if(NULL == erab->elements) {
+		log_msg(LOG_ERROR, "Memory alloc failed\n");
+		exit(-1);
+	}
+
+	erab->elements[0].su_res.eRAB_id = *ie;
+	++ie;
+	++ie; //what is this identify.
+	memcpy(&(erab->elements[0].su_res.transp_layer_addr), ie, sizeof(unsigned int));
+	erab->elements[0].su_res.transp_layer_addr = ntohl(erab->elements[0].su_res.transp_layer_addr);
+	log_msg(LOG_INFO, "eRAB - Transport layer address : %d\n", erab->elements[0].su_res.transp_layer_addr);
+	//ntohl ??
+	ie+=sizeof(unsigned int);
+
+	memcpy(&(erab->elements[0].su_res.gtp_teid), ie, sizeof(unsigned int));
+	erab->elements[0].su_res.gtp_teid = ntohl(erab->elements[0].su_res.gtp_teid);
+	log_msg(LOG_INFO, "eRAB - Teid : %d\n", erab->elements[0].su_res.gtp_teid);
+	//ntohl ??
+}
+
+void
+parse_nas_pdu(char *msg,  int nas_msg_len, struct nasPDU *nas,
+		unsigned short proc_code)
+{
+	log_msg(LOG_INFO, "NAS PDU proc code: %u\n", proc_code);
+
+	unsigned short msg_len = nas_msg_len;
+
+	char *buffer = NULL;
+	log_msg(LOG_INFO, "NAS PDU msg: %s\n", msg_to_hex_str(msg, msg_len, &buffer));
+	log_buffer_free(&buffer);
+
+#if 0
+	if(S1AP_UL_NAS_TX_MSG_CODE == proc_code) {
+		/*check whether there is security header*/
+		unsigned char header_type;
+		memcpy(&header_type, msg+1, 1);
+		header_type >>= 4;
+		if(0 == header_type) { /*not security header*/
+			log_msg(LOG_INFO, "No security header\n");
+			memcpy(&(nas->header), msg+1, 2);/*copy only till msg type*/
+		} else {
+			log_msg(LOG_INFO, "Security header\n");
+			/*now for esm resp, there is procedure tx identity, why the hell it was not there before.*/
+			/*one more donkey logic, do something!!*/
+			if(4 == header_type || ((7 == (*(msg+7) & 7)))) {
+				memcpy(&(nas->header), msg+7, 2);/*copy only till msg type*/
+				offset = 9;
+			} else {
+				unsigned char tmp;
+				memcpy(&(nas->header.message_type), msg+9, 1);/*copy only till msg type*/
+				memcpy(&(tmp), msg+7, 1);/*copy only till msg type*/
+				nas->header.security_header_type = tmp;
+				offset = 10;
+			}
+		}
+	} else {
+		memcpy(&(nas->header), msg+2, sizeof(nas_pdu_header));
+	}
+
+	if(S1AP_UL_NAS_TX_MSG_CODE == proc_code) {
+		/*check whether there is security header*/
+		unsigned char header_type = 0;
+
+		memcpy(&header_type, msg+1, 1);
+		header_type >>= 4;
+		if(0 == header_type) { /*not security header*/
+			log_msg(LOG_INFO, "No security header\n");
+			memcpy(&(nas->header), msg+1, 2);/*copy only till msg type*/
+		} else {
+			log_msg(LOG_INFO, "Security header\n");
+			/*now for esm resp, there is procedure tx identity, why the hell it was not there before.*/
+			/*one more donkey logic, do something!!*/
+			if(4 == header_type || ((7 == (*(msg+7) & 7)))) {
+				log_msg(LOG_INFO, "header == 4 || 7\n");
+				if(header_type == 4 || header_type == 2) {
+				log_msg(LOG_INFO, "security - cihpered\n");
+				 memcpy(&(nas->header), msg+7, 2);/*copy only till msg type*/
+				 offset = 9;
+				}
+				else {
+				log_msg(LOG_INFO, "security - noned\n");
+				memcpy(&(nas->header), msg+1, 2);/*copy only till msg type*/
+				offset = 3;
+				}
+			} else {
+				unsigned char tmp;
+				memcpy(&(nas->header.message_type), msg+9, 1);/*copy only till msg type*/
+				memcpy(&(tmp), msg+7, 1);/*copy only till msg type*/
+				nas->header.security_header_type = tmp;
+				offset = 10;
+			}
+		}
+	} else if (S1AP_INITIAL_UE_MSG_CODE == proc_code ) {
+#endif
+
+		nas_pdu_header_sec nas_header_sec;
+		nas_pdu_header_short nas_header_short;
+		nas_pdu_header_long nas_header_long;
+
+		unsigned char sec_header_type;
+		unsigned char protocol_discr;
+
+		sec_header_type = msg[0] >> 4;
+		protocol_discr = msg[0] & 0x0F;
+		unsigned char is_ESM = ((unsigned short)protocol_discr == 0x02);  // see TS 24.007
+		log_msg(LOG_INFO, "Security header=%d\n", sec_header_type);
+		log_msg(LOG_INFO, "Protocol discriminator=%d\n", protocol_discr);
+		log_msg(LOG_INFO, "is_ESM=%d\n", is_ESM);
+
+		if(0 != sec_header_type) { /*security header*/
+			log_msg(LOG_INFO, "Security header\n");
+
+			memcpy(&nas_header_sec, msg, sizeof(nas_pdu_header_sec));
+
+			char *buffer = NULL;
+			log_msg(LOG_INFO, "mac=%s\n", msg_to_hex_str((char *)nas_header_sec.mac, MAC_SIZE, &buffer));
+	        log_buffer_free(&buffer);
+
+			log_msg(LOG_INFO, "seq no=%x\n", nas_header_sec.seq_no);
+			msg += 6;
+
+			sec_header_type = msg[0] >> 4;
+			protocol_discr = msg[0] & 0x0F;
+			unsigned char is_ESM = ((unsigned short)protocol_discr == 0x02);  // see TS 24.007
+			log_msg(LOG_INFO, "Security header=%d\n", sec_header_type);
+			log_msg(LOG_INFO, "Protocol discriminator=%d\n", protocol_discr);
+			log_msg(LOG_INFO, "is_ESM=%d\n", is_ESM);
+			if (is_ESM) {
+				log_msg(LOG_INFO, "NAS PDU is ESM\n");
+				memcpy(&nas_header_long, msg, sizeof(nas_header_long)); /*copy only till msg type*/
+				msg += 3;
+
+				nas->header.security_header_type = nas_header_long.security_header_type;
+				nas->header.proto_discriminator = nas_header_long.proto_discriminator;
+				nas->header.procedure_trans_identity = nas_header_long.procedure_trans_identity;
+				nas->header.message_type = nas_header_long.message_type;
+			} else {
+				log_msg(LOG_INFO, "NAS PDU is EMM\n");
+				memcpy(&nas_header_short, msg, sizeof(nas_header_short)); /*copy only till msg type*/
+				msg += 2;
+
+				nas->header.security_header_type = nas_header_short.security_header_type;
+				nas->header.proto_discriminator = nas_header_short.proto_discriminator;
+				nas->header.message_type = nas_header_short.message_type;
+			}
+		} else {
+			log_msg(LOG_INFO, "No security header\n");
+			memcpy(&nas_header_short, msg, sizeof(nas_header_short)); /*copy only till msg type*/
+			msg += 2;
+
+			nas->header.security_header_type = nas_header_short.security_header_type;
+			nas->header.proto_discriminator = nas_header_short.proto_discriminator;
+			nas->header.message_type = nas_header_short.message_type;
+		}
+
+
+	log_msg(LOG_INFO, "Nas msg type: %X\n", nas->header.message_type);
+
+	switch(nas->header.message_type) {
+	case NAS_ESM_RESP:{
+		log_msg(LOG_INFO, "NAS_ESM_RESP recvd\n");
+
+		unsigned char element_id;
+		memcpy(&element_id, msg, 1);
+		msg++;
+		nas->elements_len +=1;
+
+		nas->elements = calloc(sizeof(nas_pdu_elements), 2);
+		//if(NULL == nas.elements)...
+
+		memcpy(&(nas->elements[0].apn.len), msg, 1);
+		msg++;
+		memcpy(nas->elements[0].apn.val, msg, nas->elements[0].apn.len);
+		log_msg(LOG_INFO, "APN name - %s\n", nas->elements[0].apn.val);
+		break;
+		}
+
+	case NAS_SEC_MODE_COMPLETE:
+		log_msg(LOG_INFO, "NAS_SEC_MODE_COMPLETE recvd\n");
+		break;
+
+	case NAS_AUTH_RESP:
+		log_msg(LOG_INFO, "NAS_AUTH_RESP recvd\n");
+		nas->elements_len = 1;
+		nas->elements = calloc(sizeof(nas_pdu_elements), 5);
+		//if(NULL == nas.elements)...
+		unsigned short len = get_length(&msg);
+		memcpy(&(nas->elements[0].auth_resp), msg, sizeof(struct XRES));
+
+		break;
+
+/*	case NAS_AUTH_FAILURE:
+		nas->elements_len = 1;
+		nas->elements = calloc(sizeof(nas_pdu_elements), 1);
+		//if(NULL == nas.elements)...
+        char err = *(char*)(msg);
+        if(err == AUTH_SYNC_FAILURE)
+        {
+            log_msg(LOG_INFO, "AUTH Sync Failure. Start Re-Sync");
+            memcpy(&(nas->elements[0].auth_fail_resp), msg + 2, sizeof(struct AUTS));
+        }
+        else
+        {
+            log_msg(LOG_ERROR, "Authentication Failure. Mac Failure");
+        }
+
+		break;
+*/
+	case NAS_ATTACH_REQUEST:{
+		log_msg(LOG_INFO, "NAS_ATTACH_REQUEST recvd\n");
+		//msg += offset;
+		//short offset = 0;
+		unsigned char tmp = msg[0];
+		nas->header.security_encryption_algo = (tmp & 0xF0) >> 4;
+		nas->header.security_integrity_algo = tmp & 0x0F;
+		msg++;
+
+		nas->elements_len = 6;
+		nas->elements = calloc(sizeof(nas_pdu_elements), 6);
+		//if(NULL == nas.elements)...
+
+		/*EPS mobility identity*/
+		//memcpy(&(nas->elements[0].IMSI), msg+6, BINARY_IMSI_LEN);
+		/*TODO: This encoding/decoding has issue with sprirent and ng40. IMSI
+		 * is packed differently.*/
+		/*Code working with ng40 */
+		unsigned short imsi_len = get_length(&msg);
+		log_msg(LOG_INFO, "IMSI len=%u - %u\n", imsi_len, BINARY_IMSI_LEN);
+		memcpy(&(nas->elements[0].IMSI), msg, imsi_len);
+		msg += imsi_len;
+
+		/*Code working with sprirent and Polaris*/
+		/*
+		memcpy(&(nas->elements[0].IMSI), msg+5, BINARY_IMSI_LEN);
+		offset = 5 + BINARY_IMSI_LEN ;
+		*/
+
+		char *buffer = NULL;
+		log_msg(LOG_INFO, "IMSI=%s [to be read nibble-swapped]\n",
+			msg_to_hex_str((char *)nas->elements[0].IMSI, imsi_len, &buffer));
+	    log_buffer_free(&buffer);
+
+		/*UE network capacity*/
+		nas->elements[1].ue_network.len = msg[0];
+		msg++;
+		memcpy((nas->elements[1].ue_network.capab), msg, nas->elements[1].ue_network.len);
+		msg += nas->elements[1].ue_network.len;
+
+		/*ESM msg container*/
+		len = msg[0] << 8 | msg[1];
+		msg += 2;
+		log_msg(LOG_INFO, "len=%x\n", len);
+		log_msg(LOG_INFO, "msg[0]=%x\n", msg[0]);
+		nas->elements[5].pti = msg[1];
+		unsigned char val = msg[4];
+		log_msg(LOG_INFO, "pti=%x\n", nas->elements[5].pti);
+		log_msg(LOG_INFO, "val=%x\n", val);
+		/*ESM message header len is 4: bearer_id_flags(1)+proc_tx_id(1)+msg_id(1)
+		 * +pdn_type(1)*/
+		/*element id 13(1101....) = "esm required" flag*/
+		nas->elements[2].esm_info_tx_required = false;
+		if(13 == (val>>4)) {
+			nas->elements[2].esm_info_tx_required = true;
+			if(val & 1) {
+				nas->elements[2].esm_info_tx_required = true;
+			}
+		}
+		msg += len;
+
+		/*DRX parameter*/
+		msg += 3;
+
+		/*MS network capability*/
+		nas->elements[4].ms_network.element_id = msg[0];
+		msg++;
+		nas->elements[4].ms_network.len = msg[0];
+		msg++;
+		memcpy(nas->elements[4].ms_network.capab, msg,
+			nas->elements[4].ms_network.len);
+		log_msg(LOG_INFO, "element_id=%x\n", nas->elements[4].ms_network.element_id);
+		log_msg(LOG_INFO, "len=%x\n", nas->elements[4].ms_network.len);
+		log_msg(LOG_INFO, "network.capab=%s\n", msg_to_hex_str((char *)nas->elements[4].ms_network.capab, nas->elements[4].ms_network.len, &buffer));
+		log_buffer_free(&buffer);
+
+		break;
+		}
+
+	case NAS_ATTACH_COMPLETE:
+		log_msg(LOG_INFO, "NAS_ATTACH_COMPLETE recvd\n");
+		/*Other than error check there seems no information to pass to mme. Marking TODO for protocol study*/
+		break;
+
+	case NAS_DETACH_REQUEST: {
+		log_msg(LOG_INFO, "NAS_DETACH_REQUEST recvd\n");
+		nas->elements_len = 1;
+		nas->elements = calloc(sizeof(nas_pdu_elements), 1);
+
+		/*EPS mobility identity*/
+		memcpy(&(nas->elements[0].mi_guti), msg + 11, sizeof(guti));
+		log_msg(LOG_INFO, "M-TMSI - %d\n", nas->elements[0].mi_guti.m_TMSI);
+		break;
+	}
+	
+	case NAS_DETACH_ACCEPT: {
+		 log_msg(LOG_INFO, "NAS_DETACH_ACCEPT recvd\n");
+		 nas->elements_len = 1;
+         nas->elements = calloc(sizeof(nas_pdu_elements), 1);
+
+         /*EPS mobility identity*/
+         memcpy(&(nas->elements[0].mi_guti), msg + 11, sizeof(guti));
+         log_msg(LOG_INFO, "M-TMSI - %d\n", nas->elements[0].mi_guti.m_TMSI);
+         break;
+     }
+
+	default:
+		log_msg(LOG_ERROR, "Unknown NAS IE type- 0x%x\n", nas->header.message_type);
+		break;
+
+	}
+}
+
+
+int
+parse_IEs(char *msg, struct proto_IE *proto_ies, unsigned short proc_code)
+{
+	unsigned short int no_of_IEs=0;
+
+	//short data_size=0;
+	//msg +=1;
+	//memcpy(&data_size, msg, 1);
+
+	//msg +=2;
+	memcpy(&no_of_IEs, msg, 2);
+	//no_of_IEs=msg[0];
+	no_of_IEs = ntohs(no_of_IEs);
+
+	/*Dumb logic....protocol or is creepy. Len sometimes comes in 3 bytes. How to know that??*/
+	if(0 == no_of_IEs) {
+		++msg;
+		memcpy(&no_of_IEs, msg, 2);
+		no_of_IEs = ntohs(no_of_IEs);
+	}
+
+	log_msg(LOG_INFO, "No. of IEs = %d\n", no_of_IEs);
+	proto_ies->no_of_IEs = no_of_IEs;
+	proto_ies->data = calloc(sizeof(struct proto_IE_data), no_of_IEs);
+	//alloc fail chk
+	msg+=2;
+
+	for(int i=0; i < no_of_IEs; ++i) {
+		struct proto_IE_data *ie = &(proto_ies->data[i]);
+		unsigned short IE_type, IE_data_len = 0;
+
+		memcpy(&IE_type, msg, sizeof(short int));
+		IE_type = ntohs(IE_type);
+		ie->IE_type = IE_type;
+		msg +=2;//next to ie type
+		msg +=1;//next to criticality
+
+		IE_data_len = get_length(&msg);
+		log_msg(LOG_INFO, "IE [%d]: type = %d\n", i, IE_type);
+		log_msg(LOG_INFO, "IE [%d]: data len= %x - %u\n", i, IE_data_len, IE_data_len);
+
+		char *buffer = NULL;
+		log_msg(LOG_INFO, "IE [%d]: value= %s\n", i, msg_to_hex_str(msg, IE_data_len, &buffer));
+	    log_buffer_free(&buffer);
+
+		/*Based on IE_Type call the parser to read IE info*/
+		/*TODO: optimize with function ptr etc.*/
+		switch(IE_type) {
+		case S1AP_IE_GLOBAL_ENB_ID:
+			log_msg(LOG_INFO, "IE [%d]: parse global eNB ID\n", i);
+			ie_parse_global_enb_id(msg+6, IE_data_len);
+			break;
+
+		case S1AP_IE_ENB_NAME:
+			log_msg(LOG_INFO, "IE [%d]: parse global eNB name\n", i);
+			ie_parse_enb_name(msg, IE_data_len);
+			break;
+
+		case S1AP_IE_SUPPORTED_TAS:
+			break;
+
+		case S1AP_IE_DEF_PAGING_DRX:
+			break;
+
+		case S1AP_IE_MME_UE_ID:{
+			ie->val.mme_ue_s1ap_id = decode_int_val((unsigned char *)msg,
+					IE_data_len);
+			log_msg(LOG_INFO, "IE [%d]: parse MME_UE_S1AP_ID - %d\n", i,
+					ie->val.mme_ue_s1ap_id);
+			break;
+			}
+
+		case S1AP_IE_ENB_UE_ID:{
+			ie->val.enb_ue_s1ap_id = decode_int_val((unsigned char *)msg,
+					IE_data_len);
+			log_msg(LOG_INFO, "IE [%d]: parse ENB_UE_S1AP_ID - %d\n", i,
+					ie->val.enb_ue_s1ap_id);
+			break;
+			}
+
+		case S1AP_IE_TAI:{
+			log_msg(LOG_INFO, "IE [%d]: TAI parse\n", i);
+			memcpy(&(ie->val.tai), msg+1, sizeof(struct TAI));
+			log_msg(LOG_INFO, "IE [%d]: plmn-%x %x %x, tac-%d\n", i,
+					ie->val.tai.plmn_id.idx[0],
+					ie->val.tai.plmn_id.idx[1], ie->val.tai.plmn_id.idx[2],
+					ie->val.tai.tac);
+			break;
+			}
+
+		case S1AP_IE_UTRAN_CGI:{
+			log_msg(LOG_INFO, "IE [%d]: EUTRAN CGI\n", i);
+			memset(&(ie->val.utran_cgi), 0, sizeof(struct CGI));
+			memcpy(&(ie->val.utran_cgi), msg+1, sizeof(struct CGI));
+			log_msg(LOG_INFO, "IE [%d]: plmn-%x %x %x, cell-%d\n", i,
+					ie->val.utran_cgi.plmn_id.idx[0],
+					ie->val.utran_cgi.plmn_id.idx[1], ie->val.utran_cgi.plmn_id.idx[2],
+					ie->val.utran_cgi.cell_id);
+			break;
+			}
+
+		case S1AP_IE_NAS_PDU: {
+	        log_msg(LOG_INFO, "IE [%d]: NAS msg type parsed = %x\n", i,
+                            ie->val.nas.header.message_type);
+			parse_nas_pdu(msg, IE_data_len, &ie->val.nas, proc_code);
+			break;
+			}
+
+		case S1AP_IE_RRC_EST_CAUSE: {
+			log_msg(LOG_INFO, "IE [%d]: parse RRC establishment code - %d\n", i, 
+                     ie->val.rrc_est_cause);
+			break;
+			}
+
+		case S1AP_ERAB_SETUP_CTX_SUR:
+			log_msg(LOG_INFO, "IE [%d]: parse S1AP_ERAB_SETUP_CTX_SUR parse_erab_pdu \n", i);
+			parse_erab_pdu(msg, IE_data_len, &ie->val.erab);
+			break;
+
+		default:
+			log_msg(LOG_INFO, "IE [%d]: Check IE type %d\n", i, IE_type);
+			break;
+		}
+
+		msg += (IE_data_len);
+		if(128 == IE_data_len) ++msg;//TODO: byte size issue. chk thi.
+	}
+	return 0;
+}
+
+int convertToInitUeProtoIe(InitiatingMessage_t *msg, struct proto_IE* proto_ies)
+{
+    proto_ies->procedureCode = msg->procedureCode;
+    proto_ies->criticality = msg->criticality;
+	int no_of_IEs = 0;
+
+    if(msg->value.present == InitiatingMessage__value_PR_InitialUEMessage)
+    {
+        ProtocolIE_Container_129P32_t* protocolIes = &msg->value.choice.InitialUEMessage.protocolIEs;
+        no_of_IEs = protocolIes->list.count;
+        proto_ies->no_of_IEs = no_of_IEs;
+
+        log_msg(LOG_INFO, "No of IEs = %d\n", no_of_IEs);
+        proto_ies->data = calloc(sizeof(struct proto_IE_data), no_of_IEs);
+        if(proto_ies->data == NULL)
+        {
+            log_msg(LOG_ERROR,"Malloc failed for protocol IE.");
+            return -1;
+        }
+		for (int i = 0; i < protocolIes->list.count; i++) {
+			InitialUEMessage_IEs_t *ie_p;
+			ie_p = protocolIes->list.array[i];
+			switch(ie_p->id) {
+				case ProtocolIE_ID_id_eNB_UE_S1AP_ID:
+					{
+                        ENB_UE_S1AP_ID_t *s1apENBUES1APID_p = NULL;
+                        if(InitialUEMessage_IEs__value_PR_ENB_UE_S1AP_ID == ie_p->value.present)
+                        {
+						    s1apENBUES1APID_p = &ie_p->value.choice.ENB_UE_S1AP_ID;
+                        }
+						
+                        if (s1apENBUES1APID_p == NULL) {
+							log_msg (LOG_ERROR, "Decoding of IE eNB_UE_S1AP_ID failed\n");
+							return -1;
+						}
+
+                        log_msg(LOG_DEBUG, "ENB UE S1ap ID decode Success\n", no_of_IEs);
+                        proto_ies->data[i].IE_type = S1AP_IE_ENB_UE_ID; 
+						memcpy(&proto_ies->data[i].val.enb_ue_s1ap_id, s1apENBUES1APID_p, sizeof(ENB_UE_S1AP_ID_t));
+						s1apENBUES1APID_p = NULL;
+					} break;
+				case ProtocolIE_ID_id_NAS_PDU:
+					{
+                        NAS_PDU_t *s1apNASPDU_p = NULL;
+                        if(InitialUEMessage_IEs__value_PR_NAS_PDU == ie_p->value.present)
+                        {
+						    s1apNASPDU_p = &ie_p->value.choice.NAS_PDU;
+                        }
+						
+                        if (s1apNASPDU_p == NULL) {
+							log_msg (LOG_ERROR, "Decoding of IE NAS PDU failed\n");
+							return -1;
+						}
+
+                        log_msg(LOG_DEBUG, "NAS PDU decode Success\n", no_of_IEs);
+                        proto_ies->data[i].IE_type = S1AP_IE_NAS_PDU; 
+                        parse_nas_pdu((char*)s1apNASPDU_p->buf, s1apNASPDU_p->size, 
+                                       &proto_ies->data[i].val.nas, msg->procedureCode);
+						s1apNASPDU_p = NULL;
+					} break;
+				case ProtocolIE_ID_id_TAI:
+					{
+                        TAI_t *s1apTAI_p = NULL;
+                        if(InitialUEMessage_IEs__value_PR_TAI == ie_p->value.present)
+                        {
+						    s1apTAI_p = &ie_p->value.choice.TAI;
+                        }
+						
+                        if (s1apTAI_p == NULL) {
+							log_msg (LOG_ERROR, "Decoding of IE TAI failed\n");
+							return -1;
+						}
+
+                        log_msg(LOG_DEBUG, "TAI decode Success\n", no_of_IEs);
+                        proto_ies->data[i].IE_type = S1AP_IE_TAI; 
+						memcpy(&proto_ies->data[i].val.tai.tac, s1apTAI_p->tAC.buf, s1apTAI_p->tAC.size);
+						memcpy(&proto_ies->data[i].val.tai.plmn_id, 
+                                s1apTAI_p->pLMNidentity.buf, s1apTAI_p->pLMNidentity.size);
+						s1apTAI_p = NULL;
+					} break;
+				case ProtocolIE_ID_id_EUTRAN_CGI:
+					{
+			            EUTRAN_CGI_t*	 s1apCGI_p = NULL;;
+                        if(InitialUEMessage_IEs__value_PR_EUTRAN_CGI == ie_p->value.present)
+                        {
+						    s1apCGI_p = &ie_p->value.choice.EUTRAN_CGI;
+                        }
+						
+                        if (s1apCGI_p == NULL) {
+							log_msg (LOG_ERROR, "Decoding of IE CGI failed\n");
+							return -1;
+						}
+
+                        log_msg(LOG_DEBUG, "CGI decode Success\n", no_of_IEs);
+                        proto_ies->data[i].IE_type = S1AP_IE_UTRAN_CGI; 
+						memcpy(&proto_ies->data[i].val.utran_cgi.cell_id, 
+                               s1apCGI_p->cell_ID.buf, s1apCGI_p->cell_ID.size);
+						memcpy(&proto_ies->data[i].val.utran_cgi.plmn_id.idx, 
+                                s1apCGI_p->pLMNidentity.buf, s1apCGI_p->pLMNidentity.size);
+						s1apCGI_p = NULL;
+					} break;
+				case ProtocolIE_ID_id_RRC_Establishment_Cause:
+					{
+			            RRC_Establishment_Cause_t	 *s1apRRCEstCause_p;
+                        if(InitialUEMessage_IEs__value_PR_RRC_Establishment_Cause == ie_p->value.present)
+                        {
+						    s1apRRCEstCause_p = &ie_p->value.choice.RRC_Establishment_Cause;
+                        }
+						
+                        if (s1apRRCEstCause_p == NULL) {
+							log_msg (LOG_ERROR, "Decoding of IE RRC Cause failed\n");
+							return -1;
+						}
+
+                        log_msg(LOG_DEBUG, "RRC Cause decode Success\n", no_of_IEs);
+                        proto_ies->data[i].IE_type = S1AP_IE_RRC_EST_CAUSE; 
+						proto_ies->data[i].val.rrc_est_cause = (enum ie_RRC_est_cause) *s1apRRCEstCause_p;
+						s1apRRCEstCause_p = NULL;
+					} break;
+                default:
+                    {
+                        log_msg(LOG_WARNING, "Unhandled IE %d", ie_p->id);
+                    }
+			}
+		}
+     }
+
+    return 0;
+}
+
+static int
+init_ue_msg_handler(InitiatingMessage_t *msg, int enb_fd)
+{
+	//TODO: use static instead of synamic for perf.
+	struct proto_IE proto_ies;
+
+	log_msg(LOG_INFO, "S1AP_INITIAL_UE_MSG msg: \n");
+
+    convertToInitUeProtoIe(msg, &proto_ies);
+	/*Check nas message type*/
+	//TODO: check through all proto IEs for which is nas
+	//currentlyy hard coding to 2 looking at packets
+	log_msg(LOG_INFO, "NAS msg type parsed = %x\n", proto_ies.data[1].val.nas.header.message_type);
+	switch(proto_ies.data[1].val.nas.header.message_type) {
+	case NAS_ATTACH_REQUEST:
+		s1_init_ue_handler(&proto_ies, enb_fd);
+		break;
+
+	case NAS_DETACH_REQUEST:
+		detach_stage1_handler(&proto_ies, true);
+		break;
+		
+	case NAS_DETACH_ACCEPT:
+		detach_accept_from_ue_handler(&proto_ies, true);
+		break;
+	}
+
+	free(proto_ies.data);
+	//TODO: free IEs
+	return SUCCESS;
+}
+
+static int
+UL_NAS_msg_handler(InitiatingMessage_t *msg, int enb_fd)
+{
+	//TODO: use static instead of synamic for perf.
+	struct proto_IE proto_ies;
+
+	log_msg(LOG_INFO, "S1AP_UL_NAS_TX_MSG msg \n");
+
+    convertUplinkNasToProtoIe(msg, &proto_ies);
+
+	/*Check nas message type*/
+	//TODO: check through all proto IEs for which is nas
+	//currentlyy hard coding to 2 looking at packets
+	log_msg(LOG_INFO, "NAS msg type = %x\n", proto_ies.data[2].val.nas.header.message_type);
+	switch(proto_ies.data[2].val.nas.header.message_type) {
+	case NAS_AUTH_RESP:
+		s1_auth_resp_handler(&proto_ies);
+		break;
+/*
+	case NAS_AUTH_FAILURE:
+		s1_auth_fail_handler(&proto_ies);
+		break;
+*/
+	case NAS_ATTACH_REQUEST:
+		s1_init_ue_handler(&proto_ies, enb_fd);
+		break;
+
+	case NAS_SEC_MODE_COMPLETE:
+		s1_secmode_resp_handler(&proto_ies);
+		break;
+
+/*	case NAS_ESM_RESP:
+		s1_esm_resp_handler(&proto_ies);
+		break;
+*/
+	case NAS_ATTACH_COMPLETE:
+		s1_attach_complete_handler(&proto_ies);
+		break;
+
+	case NAS_DETACH_REQUEST:
+		detach_stage1_handler(&proto_ies, false);
+		break;
+		
+	case NAS_DETACH_ACCEPT:
+		detach_accept_from_ue_handler(&proto_ies, false);
+		break;
+	}
+
+	//TODO: free IEs
+	free(proto_ies.data);
+	return SUCCESS;
+}
+
+void
+handle_s1ap_message(void *msg)
+{
+	log_msg(LOG_INFO, "Inside handle_s1ap_message.\n");
+	/*convert message from network to host*/
+
+	/*Call handler for the procedure code. TBD: Tasks pool for handlers*/
+
+	int enb_fd = 0;
+    	int msg_size = 0;
+	memcpy(&enb_fd, msg, sizeof(int));
+	memcpy(&msg_size, msg + sizeof(int), sizeof(int));
+	char *message = ((char *) msg) + 2*sizeof(int);
+	S1AP_PDU_t                              pdu = {(S1AP_PDU_PR_NOTHING)};
+	S1AP_PDU_t                             *pdu_p = &pdu;
+	asn_dec_rval_t                          dec_ret = {(RC_OK)};
+	memset ((void *)pdu_p, 0, sizeof (S1AP_PDU_t));
+	dec_ret = aper_decode (NULL, &asn_DEF_S1AP_PDU, (void **)&pdu_p, message, msg_size, 0, 0);
+
+	if (dec_ret.code != RC_OK) {
+		log_msg(LOG_ERROR, "ASN Decode PDU Failed %d\n", dec_ret.consumed);
+        	free(msg);
+		return;
+	}
+
+	switch (pdu_p->present) {
+	    case S1AP_PDU_PR_initiatingMessage:
+            s1ap_mme_decode_initiating (pdu_p->choice.initiatingMessage, enb_fd);
+            break;
+        case S1AP_PDU_PR_successfulOutcome:
+            s1ap_mme_decode_successfull_outcome (pdu_p->choice.successfulOutcome);
+            break;
+        case S1AP_PDU_PR_unsuccessfulOutcome:
+            s1ap_mme_decode_unsuccessfull_outcome (pdu_p->choice.unsuccessfulOutcome);
+            break;
+        default:
+            log_msg(LOG_WARNING, "Unknown message outcome (%d) or not implemented", (int)pdu_p->present);
+            break;
+      }
+
+    return;
+}
+
+int
+s1ap_mme_decode_successfull_outcome (SuccessfulOutcome_t* msg)
+{
+    log_msg(LOG_DEBUG,"successful outcome decode :");
+    log_msg(LOG_INFO, "proc code %d\n", msg->procedureCode);
+  switch (msg->procedureCode) {
+
+	case S1AP_INITIAL_CTX_RESP_CODE:
+		s1_init_ctx_resp_handler(msg);
+		break;
+	
+	case S1AP_UE_CONTEXT_RELEASE_CODE:
+		s1_ctx_release_complete_handler(msg);
+		break;
+		
+	default:
+		log_msg(LOG_ERROR, "Unknown procedure code - %d\n",
+		         msg->procedureCode & 0x00FF);
+		break;
+	}
+	
+	return 0;
+}
+
+int
+s1ap_mme_decode_unsuccessfull_outcome (UnsuccessfulOutcome_t *msg)
+{
+    log_msg(LOG_DEBUG,"unsuccessful outcome decode : TBD");
+    return 0;
+}
+
+int
+s1ap_mme_decode_initiating (InitiatingMessage_t *initiating_p, int enb_fd) 
+{
+  log_msg(LOG_INFO, "proc code %d\n", initiating_p->procedureCode);
+  switch (initiating_p->procedureCode) {
+
+	case S1AP_SETUP_REQUEST_CODE:
+		s1_setup_handler(initiating_p, enb_fd);
+		break;
+
+	case S1AP_INITIAL_UE_MSG_CODE:
+		init_ue_msg_handler(initiating_p, enb_fd);
+		break;
+
+	case S1AP_UL_NAS_TX_MSG_CODE:
+		UL_NAS_msg_handler(initiating_p, enb_fd);
+		break;
+
+	/*case S1AP_UE_CTX_RELEASE_CODE:
+		s1_ctx_release_resp_handler(initiating_p);
+		break;*/
+		
+	case S1AP_UE_CONTEXT_RELEASE_REQUEST:
+		s1_ctx_release_request_handler(initiating_p);
+		break;
+
+	default:
+		log_msg(LOG_ERROR, "Unknown procedure code - %d\n",
+			initiating_p->procedureCode & 0x00FF);
+		break;
+	}
+	
+  //free(msg);
+	return 0;
+}
+
+int convertUplinkNasToProtoIe(InitiatingMessage_t *msg, struct proto_IE* proto_ies)
+{
+    proto_ies->procedureCode = msg->procedureCode;
+    proto_ies->criticality = msg->criticality;
+	int no_of_IEs = 0;
+
+    if(msg->value.present == InitiatingMessage__value_PR_UplinkNASTransport)
+    {
+        ProtocolIE_Container_129P33_t* protocolIes = &msg->value.choice.UplinkNASTransport.protocolIEs;
+        no_of_IEs = protocolIes->list.count;
+        proto_ies->no_of_IEs = no_of_IEs;
+
+        log_msg(LOG_INFO, "No of IEs = %d\n", no_of_IEs);
+        proto_ies->data = calloc(sizeof(struct proto_IE_data), no_of_IEs);
+        if(proto_ies->data == NULL)
+        {
+            log_msg(LOG_ERROR,"Malloc failed for protocol IE.");
+            return -1;
+        }
+		for (int i = 0; i < protocolIes->list.count; i++) {
+			UplinkNASTransport_IEs_t *ie_p;
+			ie_p = protocolIes->list.array[i];
+			switch(ie_p->id) {
+				case ProtocolIE_ID_id_eNB_UE_S1AP_ID:
+					{
+                        ENB_UE_S1AP_ID_t *s1apENBUES1APID_p = NULL;
+                        if(UplinkNASTransport_IEs__value_PR_ENB_UE_S1AP_ID == ie_p->value.present)
+                        {
+						    s1apENBUES1APID_p = &ie_p->value.choice.ENB_UE_S1AP_ID;
+                        }
+						
+                        if (s1apENBUES1APID_p == NULL) {
+							log_msg (LOG_ERROR, "Decoding of IE eNB_UE_S1AP_ID failed\n");
+							return -1;
+						}
+
+                        proto_ies->data[i].IE_type = S1AP_IE_ENB_UE_ID; 
+						memcpy(&proto_ies->data[i].val.enb_ue_s1ap_id, s1apENBUES1APID_p, sizeof(ENB_UE_S1AP_ID_t));
+						s1apENBUES1APID_p = NULL;
+					} break;
+				case ProtocolIE_ID_id_MME_UE_S1AP_ID:
+					{
+                        MME_UE_S1AP_ID_t *s1apMMEUES1APID_p = NULL;
+                        if(UplinkNASTransport_IEs__value_PR_MME_UE_S1AP_ID == ie_p->value.present)
+                        {
+						    s1apMMEUES1APID_p = &ie_p->value.choice.MME_UE_S1AP_ID;
+                        }
+						
+                        if (s1apMMEUES1APID_p == NULL) {
+							log_msg (LOG_ERROR, "Decoding of IE MME_UE_S1AP_ID failed\n");
+							return -1;
+						}
+
+                        proto_ies->data[i].IE_type = S1AP_IE_MME_UE_ID; 
+						memcpy(&proto_ies->data[i].val.mme_ue_s1ap_id, s1apMMEUES1APID_p, sizeof(MME_UE_S1AP_ID_t));
+						s1apMMEUES1APID_p = NULL;
+					} break;
+				case ProtocolIE_ID_id_NAS_PDU:
+					{
+                        NAS_PDU_t *s1apNASPDU_p = NULL;
+                        if(UplinkNASTransport_IEs__value_PR_NAS_PDU == ie_p->value.present)
+                        {
+						    s1apNASPDU_p = &ie_p->value.choice.NAS_PDU;
+                        }
+						
+                        if (s1apNASPDU_p == NULL) {
+							log_msg (LOG_ERROR, "Decoding of IE NAS PDU failed\n");
+							return -1;
+						}
+
+                        proto_ies->data[i].IE_type = S1AP_IE_NAS_PDU; 
+                        parse_nas_pdu((char*)s1apNASPDU_p->buf, s1apNASPDU_p->size, 
+                                       &proto_ies->data[i].val.nas, msg->procedureCode);
+						s1apNASPDU_p = NULL;
+					} break;
+				case ProtocolIE_ID_id_TAI:
+					{
+                        TAI_t *s1apTAI_p = NULL;
+                        if(UplinkNASTransport_IEs__value_PR_TAI == ie_p->value.present)
+                        {
+						    s1apTAI_p = &ie_p->value.choice.TAI;
+                        }
+						
+                        if (s1apTAI_p == NULL) {
+							log_msg (LOG_ERROR, "Decoding of IE TAI failed\n");
+							return -1;
+						}
+
+                        proto_ies->data[i].IE_type = S1AP_IE_TAI; 
+						memcpy(&proto_ies->data[i].val.tai.tac, s1apTAI_p->tAC.buf, s1apTAI_p->tAC.size);
+						memcpy(&proto_ies->data[i].val.tai.plmn_id, 
+                                s1apTAI_p->pLMNidentity.buf, s1apTAI_p->pLMNidentity.size);
+						s1apTAI_p = NULL;
+					} break;
+				case ProtocolIE_ID_id_EUTRAN_CGI:
+					{
+			            EUTRAN_CGI_t*	 s1apCGI_p = NULL;;
+                        if(UplinkNASTransport_IEs__value_PR_EUTRAN_CGI == ie_p->value.present)
+                        {
+						    s1apCGI_p = &ie_p->value.choice.EUTRAN_CGI;
+                        }
+						
+                        if (s1apCGI_p == NULL) {
+							log_msg (LOG_ERROR, "Decoding of IE CGI failed\n");
+							return -1;
+						}
+
+                        proto_ies->data[i].IE_type = S1AP_IE_UTRAN_CGI; 
+						memcpy(&proto_ies->data[i].val.utran_cgi.cell_id, 
+                               s1apCGI_p->cell_ID.buf, s1apCGI_p->cell_ID.size);
+						memcpy(&proto_ies->data[i].val.utran_cgi.plmn_id.idx, 
+                                s1apCGI_p->pLMNidentity.buf, s1apCGI_p->pLMNidentity.size);
+						s1apCGI_p = NULL;
+					} break;
+                default:
+                    {
+                        log_msg(LOG_WARNING, "Unhandled IE %d", ie_p->id);
+                    }
+			}
+		}
+     }
+
+    return 0;
+}
+
+int convertInitCtxRspToProtoIe(SuccessfulOutcome_t *msg, struct proto_IE* proto_ies)
+{
+    proto_ies->procedureCode = msg->procedureCode;
+    proto_ies->criticality = msg->criticality;
+	int no_of_IEs = 0;
+
+    if(msg->value.present == SuccessfulOutcome__value_PR_InitialContextSetupResponse)
+    {
+        ProtocolIE_Container_129P20_t* protocolIes 
+            = &msg->value.choice.InitialContextSetupResponse.protocolIEs;
+        no_of_IEs = protocolIes->list.count;
+        proto_ies->no_of_IEs = no_of_IEs;
+
+        log_msg(LOG_INFO, "No of IEs = %d\n", no_of_IEs);
+        proto_ies->data = calloc(sizeof(struct proto_IE_data), no_of_IEs);
+        if(proto_ies->data == NULL)
+        {
+            log_msg(LOG_ERROR,"Malloc failed for protocol IE.");
+            return -1;
+        }
+		for (int i = 0; i < protocolIes->list.count; i++) {
+			InitialContextSetupResponseIEs_t *ie_p;
+			ie_p = protocolIes->list.array[i];
+			switch(ie_p->id) {
+				case ProtocolIE_ID_id_eNB_UE_S1AP_ID:
+					{
+                        ENB_UE_S1AP_ID_t *s1apENBUES1APID_p = NULL;
+                        if(InitialContextSetupResponseIEs__value_PR_ENB_UE_S1AP_ID == ie_p->value.present)
+                        {
+						    s1apENBUES1APID_p = &ie_p->value.choice.ENB_UE_S1AP_ID;
+                        }
+						
+                        if (s1apENBUES1APID_p == NULL) {
+							log_msg (LOG_ERROR, "Decoding of IE eNB_UE_S1AP_ID failed\n");
+							return -1;
+						}
+
+                        proto_ies->data[i].IE_type = S1AP_IE_ENB_UE_ID; 
+						memcpy(&proto_ies->data[i].val.enb_ue_s1ap_id, s1apENBUES1APID_p, sizeof(ENB_UE_S1AP_ID_t));
+						s1apENBUES1APID_p = NULL;
+					} break;
+				case ProtocolIE_ID_id_MME_UE_S1AP_ID:
+					{
+                        MME_UE_S1AP_ID_t *s1apMMEUES1APID_p = NULL;
+                        if(InitialContextSetupResponseIEs__value_PR_MME_UE_S1AP_ID == ie_p->value.present)
+                        {
+						    s1apMMEUES1APID_p = &ie_p->value.choice.MME_UE_S1AP_ID;
+                        }
+						
+                        if (s1apMMEUES1APID_p == NULL) {
+							log_msg (LOG_ERROR, "Decoding of IE MME_UE_S1AP_ID failed\n");
+							return -1;
+						}
+
+                        proto_ies->data[i].IE_type = S1AP_IE_MME_UE_ID; 
+						memcpy(&proto_ies->data[i].val.mme_ue_s1ap_id, s1apMMEUES1APID_p, sizeof(MME_UE_S1AP_ID_t));
+						s1apMMEUES1APID_p = NULL;
+					} break;
+				case ProtocolIE_ID_id_E_RABSetupListCtxtSURes:
+					{
+                        E_RABSetupListCtxtSURes_t *s1apErabSetupList_p = NULL;
+                        if(InitialContextSetupResponseIEs__value_PR_E_RABSetupListCtxtSURes == ie_p->value.present)
+                        {
+						    s1apErabSetupList_p = &ie_p->value.choice.E_RABSetupListCtxtSURes;
+                        }
+						
+                        if (s1apErabSetupList_p == NULL) {
+							log_msg (LOG_ERROR, "Decoding of IE s1apErabSetupList failed\n");
+							return -1;
+						}
+
+                        proto_ies->data[i].IE_type = S1AP_ERAB_SETUP_CTX_SUR;
+                        proto_ies->data[i].val.erab.no_of_elements = s1apErabSetupList_p->list.count;
+                        proto_ies->data[i].val.erab.elements = calloc(sizeof(union eRAB_IE), 
+                                                                    s1apErabSetupList_p->list.count);
+                        if(proto_ies->data[i].val.erab.elements == NULL)
+                        {
+                            log_msg(LOG_ERROR,"Malloc failed for protocol IE: Erab elements.");
+                            break;;
+                        }
+                        for (int j = 0; 
+                             j < s1apErabSetupList_p->list.count; j++) 
+                        {
+                            E_RABSetupItemCtxtSUResIEs_t *ie_p;
+                            ie_p = (E_RABSetupItemCtxtSUResIEs_t*)s1apErabSetupList_p->list.array[j];
+                            switch(ie_p->id) {
+                                case ProtocolIE_ID_id_E_RABSetupItemCtxtSURes:
+                                    {
+                                        E_RABSetupItemCtxtSURes_t* s1apErabSetupItem_p = NULL;
+                                        if(E_RABSetupItemCtxtSUResIEs__value_PR_E_RABSetupItemCtxtSURes == ie_p->value.present)
+                                        {
+                                            s1apErabSetupItem_p = &ie_p->value.choice.E_RABSetupItemCtxtSURes;
+                                        }
+
+                                        if (s1apErabSetupItem_p == NULL) {
+                                            log_msg (LOG_ERROR, "Decoding of IE s1apErabSetupItem failed\n");
+                                            return -1;
+                                        }
+
+                                        proto_ies->data[i].val.erab.elements[j].su_res.eRAB_id 
+                                                 = (unsigned short)s1apErabSetupItem_p->e_RAB_ID;
+                                        memcpy(
+                                            &(proto_ies->data[i].val.erab.elements[j].su_res.gtp_teid),
+                                            s1apErabSetupItem_p->gTP_TEID.buf,
+                                            s1apErabSetupItem_p->gTP_TEID.size);
+                                        proto_ies->data[i].val.erab.elements[j].su_res.gtp_teid
+                                            = ntohl(proto_ies->data[i].val.erab.elements[j].su_res.gtp_teid);
+
+                                        memcpy(
+                                           &(proto_ies->data[i].val.erab.elements[j].su_res.transp_layer_addr),
+                                            s1apErabSetupItem_p->transportLayerAddress.buf,
+                                            s1apErabSetupItem_p->transportLayerAddress.size);
+                                        proto_ies->data[i].val.erab.elements[j].su_res.transp_layer_addr
+                                            = ntohl(proto_ies->data[i].val.erab.elements[j].su_res.transp_layer_addr);
+                                        s1apErabSetupItem_p = NULL;
+                                    }break;
+                                default:
+                                    {
+                                        log_msg(LOG_WARNING, "Unhandled List item %d", ie_p->id);
+                                    }
+                            }
+                        }
+
+						s1apErabSetupList_p = NULL;
+					} break;
+                default:
+                    {
+                        log_msg(LOG_WARNING, "Unhandled IE %d", ie_p->id);
+                    }
+			}
+		}
+     }
+
+    return 0;
+}
+
+int convertUeCtxRelComplToProtoIe(SuccessfulOutcome_t *msg, struct proto_IE* proto_ies)
+{
+    proto_ies->procedureCode = msg->procedureCode;
+    proto_ies->criticality = msg->criticality;
+	int no_of_IEs = 0;
+
+    if(msg->value.present == SuccessfulOutcome__value_PR_UEContextReleaseComplete)
+    {
+        ProtocolIE_Container_129P25_t* protocolIes 
+            = &msg->value.choice.UEContextReleaseComplete.protocolIEs;
+        no_of_IEs = protocolIes->list.count;
+        proto_ies->no_of_IEs = no_of_IEs;
+
+        log_msg(LOG_INFO, "No of IEs = %d\n", no_of_IEs);
+        proto_ies->data = calloc(sizeof(struct proto_IE_data), no_of_IEs);
+        if(proto_ies->data == NULL)
+        {
+            log_msg(LOG_ERROR,"Malloc failed for protocol IE.");
+            return -1;
+        }
+		for (int i = 0; i < protocolIes->list.count; i++) {
+			UEContextReleaseComplete_IEs_t *ie_p;
+			ie_p = protocolIes->list.array[i];
+			switch(ie_p->id) {
+				case ProtocolIE_ID_id_eNB_UE_S1AP_ID:
+					{
+                        ENB_UE_S1AP_ID_t *s1apENBUES1APID_p = NULL;
+                        if(UEContextReleaseComplete_IEs__value_PR_ENB_UE_S1AP_ID == ie_p->value.present)
+                        {
+						    s1apENBUES1APID_p = &ie_p->value.choice.ENB_UE_S1AP_ID;
+                        }
+						
+                        if (s1apENBUES1APID_p == NULL) {
+							log_msg (LOG_ERROR, "Decoding of IE eNB_UE_S1AP_ID failed\n");
+							return -1;
+						}
+
+                        proto_ies->data[i].IE_type = S1AP_IE_ENB_UE_ID; 
+						memcpy(&proto_ies->data[i].val.enb_ue_s1ap_id, s1apENBUES1APID_p, sizeof(ENB_UE_S1AP_ID_t));
+						s1apENBUES1APID_p = NULL;
+					} break;
+				case ProtocolIE_ID_id_MME_UE_S1AP_ID:
+					{
+                        MME_UE_S1AP_ID_t *s1apMMEUES1APID_p = NULL;
+                        if(UEContextReleaseComplete_IEs__value_PR_MME_UE_S1AP_ID == ie_p->value.present)
+                        {
+						    s1apMMEUES1APID_p = &ie_p->value.choice.MME_UE_S1AP_ID;
+                        }
+						
+                        if (s1apMMEUES1APID_p == NULL) {
+							log_msg (LOG_ERROR, "Decoding of IE MME_UE_S1AP_ID failed\n");
+							return -1;
+						}
+
+                        proto_ies->data[i].IE_type = S1AP_IE_MME_UE_ID; 
+						memcpy(&proto_ies->data[i].val.mme_ue_s1ap_id, s1apMMEUES1APID_p, sizeof(MME_UE_S1AP_ID_t));
+						s1apMMEUES1APID_p = NULL;
+					} break;
+                default:
+                    {
+                        log_msg(LOG_WARNING, "Unhandled IE %d\n", ie_p->id);
+                    }
+			}
+		}
+     }
+
+    return 0;
+}
+
+int convertUeCtxRelReqToProtoIe(InitiatingMessage_t *msg, struct proto_IE* proto_ies)
+{
+    proto_ies->procedureCode = msg->procedureCode;
+    proto_ies->criticality = msg->criticality;
+	int no_of_IEs = 0;
+
+    if(msg->value.present == InitiatingMessage__value_PR_UEContextReleaseRequest)
+    {
+        ProtocolIE_Container_129P23_t* protocolIes
+            = &msg->value.choice.UEContextReleaseRequest.protocolIEs;
+        no_of_IEs = protocolIes->list.count;
+        proto_ies->no_of_IEs = no_of_IEs;
+
+        log_msg(LOG_INFO, "No of IEs = %d\n", no_of_IEs);
+        proto_ies->data = calloc(sizeof(struct proto_IE_data), no_of_IEs);
+        if(proto_ies->data == NULL)
+        {
+            log_msg(LOG_ERROR,"Malloc failed for protocol IE.");
+            return -1;
+        }
+		for (int i = 0; i < protocolIes->list.count; i++) {
+			UEContextReleaseRequest_IEs_t *ie_p;
+			ie_p = protocolIes->list.array[i];
+			switch(ie_p->id) {
+				case ProtocolIE_ID_id_eNB_UE_S1AP_ID:
+					{
+                        ENB_UE_S1AP_ID_t *s1apENBUES1APID_p = NULL;
+                        if(UEContextReleaseRequest_IEs__value_PR_ENB_UE_S1AP_ID == ie_p->value.present)
+                        {
+						    s1apENBUES1APID_p = &ie_p->value.choice.ENB_UE_S1AP_ID;
+                        }
+
+                        if (s1apENBUES1APID_p == NULL) {
+							log_msg (LOG_ERROR, "Decoding of IE eNB_UE_S1AP_ID failed\n");
+							return -1;
+						}
+
+                        proto_ies->data[i].IE_type = S1AP_IE_ENB_UE_ID;
+						memcpy(&proto_ies->data[i].val.enb_ue_s1ap_id, s1apENBUES1APID_p, sizeof(ENB_UE_S1AP_ID_t));
+						s1apENBUES1APID_p = NULL;
+					} break;
+				case ProtocolIE_ID_id_MME_UE_S1AP_ID:
+					{
+                        MME_UE_S1AP_ID_t *s1apMMEUES1APID_p = NULL;
+                        if(UEContextReleaseRequest_IEs__value_PR_MME_UE_S1AP_ID == ie_p->value.present)
+                        {
+						    s1apMMEUES1APID_p = &ie_p->value.choice.MME_UE_S1AP_ID;
+                        }
+
+                        if (s1apMMEUES1APID_p == NULL) {
+							log_msg (LOG_ERROR, "Decoding of IE MME_UE_S1AP_ID failed\n");
+							return -1;
+						}
+
+                        proto_ies->data[i].IE_type = S1AP_IE_MME_UE_ID;
+						memcpy(&proto_ies->data[i].val.mme_ue_s1ap_id, s1apMMEUES1APID_p, sizeof(MME_UE_S1AP_ID_t));
+						s1apMMEUES1APID_p = NULL;
+					} break;
+				case ProtocolIE_ID_id_Cause:
+					{
+                        Cause_t *s1apCause_p = NULL;
+                        if(UEContextReleaseRequest_IEs__value_PR_Cause == ie_p->value.present)
+                        {
+						    s1apCause_p = &ie_p->value.choice.Cause;
+                        }
+
+                        if (s1apCause_p == NULL) {
+							log_msg (LOG_ERROR, "Decoding of IE Cause failed\n");
+							return -1;
+						}
+
+                        proto_ies->data[i].IE_type = S1AP_IE_CAUSE;
+                        proto_ies->data[i].val.cause.present = s1apCause_p->present;
+                        switch(s1apCause_p->present)
+                        {
+                            case Cause_PR_radioNetwork:
+							    log_msg (LOG_DEBUG, "RadioNetwork case : %d\n",
+                                          s1apCause_p->choice.radioNetwork);
+                                proto_ies->data[i].val.cause.choice.radioNetwork
+                                    = s1apCause_p->choice.radioNetwork;
+                                break;
+                            case Cause_PR_transport:
+							    log_msg (LOG_DEBUG, "Transport case : %d\n",
+                                          s1apCause_p->choice.transport);
+                                proto_ies->data[i].val.cause.choice.transport
+                                    = s1apCause_p->choice.transport;
+                                break;
+                            case Cause_PR_nas:
+							    log_msg (LOG_DEBUG, "Nas case : %d\n",
+                                          s1apCause_p->choice.nas);
+                                proto_ies->data[i].val.cause.choice.nas
+                                    = s1apCause_p->choice.nas;
+                                break;
+                            case Cause_PR_protocol:
+							    log_msg (LOG_DEBUG, "Protocol case : %d\n",
+                                          s1apCause_p->choice.protocol);
+                                proto_ies->data[i].val.cause.choice.protocol
+                                    = s1apCause_p->choice.protocol;
+                                break;
+                            case Cause_PR_misc:
+							    log_msg (LOG_DEBUG, "Misc case : %d\n",
+                                          s1apCause_p->choice.misc);
+                                proto_ies->data[i].val.cause.choice.misc
+                                    = s1apCause_p->choice.misc;
+                                break;
+                            case Cause_PR_NOTHING:
+                            default:
+                                log_msg(LOG_WARNING, "Unknown cause %d\n", s1apCause_p->present);
+
+                        }
+						s1apCause_p = NULL;
+					} break;
+                default:
+                    {
+                        log_msg(LOG_WARNING, "Unhandled IE %d\n", ie_p->id);
+                    }
+			}
+		}
+     }
+
+    return 0;
+}
+
diff --git a/src/s1ap/handlers/s1ap_tau_request_handler.c b/src/s1ap/handlers/s1ap_tau_request_handler.c
new file mode 100644
index 0000000..ae93f88
--- /dev/null
+++ b/src/s1ap/handlers/s1ap_tau_request_handler.c
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2019-present Open Networking Foundation
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <pthread.h>
+
+
+#include "err_codes.h"
+#include "options.h"
+#include "ipc_api.h"
+#include "main.h"
+#include "s1ap.h"
+#include "s1ap_config.h"
+#include "sctp_conn.h"
+#include "s1ap_structs.h"
+#include "s1ap_msg_codes.h"
+#include "msgType.h"
+
+
+extern int g_enb_fd;
+extern ipc_handle ipc_S1ap_Hndl;
+
+int
+tau_request_handler(struct proto_IE *s1_tau_req_ies, int enb_fd)
+{
+	struct s1_incoming_msg_data_t req= {0};
+
+	log_msg(LOG_INFO, "S1ap received tau Request:--\n");
+
+	req.msg_type = tau_request;
+    	req.msg_data.tauReq_Q_msg_m.enb_fd = enb_fd;
+
+    for(int i = 0; i < s1_tau_req_ies->no_of_IEs; i++)
+    {
+        switch(s1_tau_req_ies->data[i].IE_type)
+        {
+		case S1AP_IE_ENB_UE_ID:
+		{
+			req.s1ap_enb_ue_id = s1_tau_req_ies->data[i].val.enb_ue_s1ap_id;
+		}break;
+		
+		case S1AP_IE_MME_UE_ID:
+		{
+			req.ue_idx = s1_tau_req_ies->data[i].val.mme_ue_s1ap_id;	
+		}break;
+
+            	case S1AP_IE_NAS_PDU:
+            	{
+                	nas_pdu_header *hdr = &s1_tau_req_ies->data[i].val.nas.header;
+                	req.msg_data.tauReq_Q_msg_m.seq_num = hdr->seq_no;
+            	}break;
+            	default:
+			// Once MME starts handlign this request we can parse and send the content 
+			log_msg(LOG_WARNING,"Unhandled IE In tau request %d",s1_tau_req_ies->data[i].IE_type);
+		}
+	}
+	
+	req.destInstAddr = htonl(mmeAppInstanceNum_c);
+    	req.srcInstAddr = htonl(s1apAppInstanceNum_c);
+    	send_tipc_message(ipc_S1ap_Hndl, mmeAppInstanceNum_c, (char *)&req, S1_READ_MSG_BUF_SIZE);
+
+
+	log_msg(LOG_INFO, "Sent TAU request to mme-app\n");
+	return SUCCESS;
+}
+
diff --git a/src/s1ap/handlers/s1ap_tau_response_handler.c b/src/s1ap/handlers/s1ap_tau_response_handler.c
new file mode 100644
index 0000000..8838da3
--- /dev/null
+++ b/src/s1ap/handlers/s1ap_tau_response_handler.c
@@ -0,0 +1,345 @@
+/*
+ * Copyright 2019-present Open Networking Foundation
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <pthread.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdint.h>
+
+
+
+#include "log.h"
+#include "err_codes.h"
+#include "options.h"
+#include "ipc_api.h"
+#include "main.h"
+#include "s1ap.h"
+#include "s1ap_config.h"
+#include "sctp_conn.h"
+#include "s1ap_structs.h"
+#include "s1ap_msg_codes.h"
+#include "msgType.h"
+extern s1ap_config g_s1ap_cfg;
+extern ipc_handle ipc_S1ap_Hndl;
+static Buffer g_buffer;
+static int
+get_tau_rsp_protoie_value(struct proto_IE *value, struct tauResp_Q_msg *g_tauRespInfo)
+{
+    
+	value->no_of_IEs = TAU_RSP_NO_OF_IES;
+
+	value->data = (proto_IEs *) malloc(TAU_RSP_NO_OF_IES*
+			sizeof(proto_IEs));
+
+	value->data[0].val.mme_ue_s1ap_id = g_tauRespInfo->ue_idx;
+	value->data[1].val.enb_ue_s1ap_id = g_tauRespInfo->s1ap_enb_ue_id;
+
+	log_msg(LOG_INFO, "mme_ue_s1ap_id %d and enb_ue_s1ap_id %d\n",
+			g_tauRespInfo->ue_idx, g_tauRespInfo->s1ap_enb_ue_id);
+
+	/* TODO: Add enum for security header type */
+	value->data[2].val.nas.header.security_header_type = IntegrityProtectedCiphered;
+	value->data[2].val.nas.header.proto_discriminator = EPSMobilityManagementMessages;
+    if(g_tauRespInfo->status == 0)
+	  value->data[2].val.nas.header.message_type = TauAccept;
+    else
+	  value->data[2].val.nas.header.message_type = TauReject;
+	value->data[2].val.nas.header.nas_security_param = 0;
+	/* placeholder for mac. mac value will be calculated later */
+	uint8_t mac[MAC_SIZE] = {0};
+	memcpy(value->data[2].val.nas.header.mac, mac, MAC_SIZE);
+	value->data[2].val.nas.header.seq_no = g_tauRespInfo->dl_seq_no;
+	value->data[2].val.nas.header.eps_bearer_identity = 0;
+	value->data[2].val.nas.header.procedure_trans_identity = 1;
+	value->data[2].val.nas.elements_len = TAU_RSP_NO_OF_NAS_IES;
+	value->data[2].val.nas.elements = (nas_pdu_elements *) malloc(TAU_RSP_NO_OF_NAS_IES * sizeof(nas_pdu_elements));
+	nas_pdu_elements *nasIEs = value->data[2].val.nas.elements;
+	uint8_t nasIeCnt = 0;
+	nasIEs[nasIeCnt].pduElement.eps_res = 0; /* TA updated */
+	nasIeCnt++;
+	nasIEs[nasIeCnt].pduElement.spare = 0; /* TA updated */
+	nasIeCnt++;
+
+	return SUCCESS;
+}
+
+static int
+tau_rsp_processing(struct tauResp_Q_msg *g_tauRespInfo)
+{
+
+	struct s1ap_PDU s1apPDU= {0};
+    
+	uint8_t nas_len_pos;
+	uint8_t s1ap_len_pos;
+	uint8_t mac_data_pos;
+	uint8_t datalen;
+	uint8_t u8value;
+
+    if(g_tauRespInfo->status != 0)
+    {
+	  /* Assigning values to s1apPDU */
+	  s1apPDU.procedurecode = id_errorIndication;
+	  s1apPDU.criticality = CRITICALITY_IGNORE;
+	  get_tau_rsp_protoie_value(&s1apPDU.value,g_tauRespInfo);
+          g_buffer.pos = 0;
+
+	  uint8_t initiating_message = 0; /* TODO: Add enum */
+	  buffer_copy(&g_buffer, &initiating_message,
+	  		sizeof(initiating_message));
+
+	  buffer_copy(&g_buffer, &s1apPDU.procedurecode,
+	  		sizeof(s1apPDU.procedurecode));
+
+	  buffer_copy(&g_buffer, &s1apPDU.criticality,
+	  		sizeof(s1apPDU.criticality));
+
+	  s1ap_len_pos = g_buffer.pos;
+
+	  /* length of S1ap message */
+	  u8value = 0;
+	  buffer_copy(&g_buffer, &u8value, sizeof(u8value));
+
+	  /* TODO remove hardcoded values */
+	  unsigned char chProtoIENo[3] = {0,0,2};
+
+	  buffer_copy(&g_buffer, chProtoIENo, 3);
+
+	  unsigned char tmpStr[4];
+
+      /* id-eNB-UE-S1AP-ID */
+
+	  uint16_t protocolIe_Id = id_eNB_UE_S1AP_ID;
+	  uint8_t protocolIe_criticality = CRITICALITY_REJECT;
+	  copyU16(tmpStr, protocolIe_Id);
+	  buffer_copy(&g_buffer, tmpStr,
+	  					sizeof(protocolIe_Id));
+
+	  buffer_copy(&g_buffer, &protocolIe_criticality,
+	  				sizeof(protocolIe_criticality));
+
+
+	  /* TODO needs proper handling*/
+	  unsigned char enb_ue_id[3];
+	  datalen = copyU16(enb_ue_id,
+	  		s1apPDU.value.data[1].val.enb_ue_s1ap_id);
+	  buffer_copy(&g_buffer, &datalen, sizeof(datalen));
+	  buffer_copy(&g_buffer, enb_ue_id, datalen);
+
+	  unsigned char cause[6] = {0,2,40,2,4, 0};
+	  buffer_copy(&g_buffer, cause, sizeof(cause));
+
+	  /* Copy length to s1ap length field */
+	  datalen = g_buffer.pos - s1ap_len_pos - 1;
+	  memcpy(g_buffer.buf + s1ap_len_pos, &datalen, sizeof(datalen));
+      return E_FAIL;
+    }
+	/* Assigning values to s1apPDU */
+	s1apPDU.procedurecode = id_downlinkNASTransport;
+	s1apPDU.criticality = CRITICALITY_IGNORE;
+
+	get_tau_rsp_protoie_value(&s1apPDU.value,g_tauRespInfo);
+ 
+	/* Copy values to buffer from s1apPDU */
+
+	g_buffer.pos = 0;
+
+	uint8_t initiating_message = 0; /* TODO: Add enum */
+	buffer_copy(&g_buffer, &initiating_message,
+			sizeof(initiating_message));
+
+	buffer_copy(&g_buffer, &s1apPDU.procedurecode,
+			sizeof(s1apPDU.procedurecode));
+
+	buffer_copy(&g_buffer, &s1apPDU.criticality,
+			sizeof(s1apPDU.criticality));
+
+	s1ap_len_pos = g_buffer.pos;
+
+	/* length of S1ap message */
+	u8value = 0;
+	buffer_copy(&g_buffer, &u8value, sizeof(u8value));
+
+	/* TODO remove hardcoded values */
+	unsigned char chProtoIENo[3] = {0,0,3};
+
+	buffer_copy(&g_buffer, chProtoIENo, 3);
+
+	unsigned char tmpStr[4];
+
+	/* id-MME-UE-S1AP-ID */
+	uint16_t protocolIe_Id = id_MME_UE_S1AP_ID;
+	copyU16(tmpStr, protocolIe_Id);
+	buffer_copy(&g_buffer, tmpStr,
+					sizeof(protocolIe_Id));
+
+	uint8_t protocolIe_criticality = CRITICALITY_REJECT;
+	buffer_copy(&g_buffer, &protocolIe_criticality,
+					sizeof(protocolIe_criticality));
+
+	/* TODO needs proper handling*/
+	unsigned char mme_ue_id[3];
+	datalen = copyU16(mme_ue_id,
+			s1apPDU.value.data[0].val.mme_ue_s1ap_id);
+	buffer_copy(&g_buffer, &datalen, sizeof(datalen));
+	buffer_copy(&g_buffer, mme_ue_id, datalen);
+
+	/* id-eNB-UE-S1AP-ID */
+
+	protocolIe_Id = id_eNB_UE_S1AP_ID;
+	copyU16(tmpStr, protocolIe_Id);
+	buffer_copy(&g_buffer, tmpStr,
+						sizeof(protocolIe_Id));
+
+	buffer_copy(&g_buffer, &protocolIe_criticality,
+					sizeof(protocolIe_criticality));
+
+	/* TODO needs proper handling*/
+	unsigned char enb_ue_id[3];
+	datalen = copyU16(enb_ue_id,
+			s1apPDU.value.data[1].val.enb_ue_s1ap_id);
+	buffer_copy(&g_buffer, &datalen, sizeof(datalen));
+	buffer_copy(&g_buffer, enb_ue_id, datalen);
+
+	/* id-NAS-PDU */
+	protocolIe_Id = id_NAS_PDU;
+	copyU16(tmpStr, protocolIe_Id);
+	buffer_copy(&g_buffer, tmpStr,
+						sizeof(protocolIe_Id));
+	buffer_copy(&g_buffer, &protocolIe_criticality,
+					sizeof(protocolIe_criticality));
+
+	nas_len_pos = g_buffer.pos;
+	datalen = 0;
+	buffer_copy(&g_buffer, &datalen, sizeof(datalen));
+	buffer_copy(&g_buffer, &datalen, sizeof(datalen));
+
+	struct nasPDU *nas = &(s1apPDU.value.data[2].val.nas);
+	struct nas_pdu_header *nas_hdr = &(s1apPDU.value.data[2].val.nas.header);
+
+    u8value = (nas->header.security_header_type << 4) |
+			nas->header.proto_discriminator;
+	buffer_copy(&g_buffer, &u8value, sizeof(u8value));
+
+	/* mac */
+	/* placeholder for mac. mac value will be calculated later */
+	buffer_copy(&g_buffer, nas_hdr->mac, MAC_SIZE);
+	mac_data_pos = g_buffer.pos;
+
+	/* sequence number */
+	buffer_copy(&g_buffer, &(nas_hdr->seq_no),
+			sizeof(nas_hdr->seq_no));
+
+	/* security header and protocol discriminator */
+	nas_hdr->security_header_type = Plain;
+	u8value = (0 << 4 | nas_hdr->proto_discriminator);
+	buffer_copy(&g_buffer, &u8value, sizeof(u8value));
+
+	/* message type */
+	buffer_copy(&g_buffer, &nas->header.message_type,
+						sizeof(nas->header.message_type));
+
+
+	u8value = 0; 
+	buffer_copy(&g_buffer, &u8value, sizeof(u8value));
+	u8value = 0x5a; 
+	buffer_copy(&g_buffer, &u8value, sizeof(u8value));
+#define DISABLE_TAU 0
+#if DISABLE_TAU
+	u8value = 0xe0; 
+#else
+	u8value = 0x21; 
+#endif
+	buffer_copy(&g_buffer, &u8value, sizeof(u8value));
+
+#if 1 
+    /* adding GUTI */
+	u8value = 0x50; /* element id TODO: define macro or enum */
+	buffer_copy(&g_buffer, &u8value, sizeof(u8value));
+	datalen = 11;
+	buffer_copy(&g_buffer, &datalen, sizeof(datalen));
+	u8value = 246; /* TODO: remove hard coding */
+	buffer_copy(&g_buffer, &u8value, sizeof(u8value));
+
+    unsigned char x3 = g_tauRespInfo->tai.plmn_id.idx[2]; 
+    unsigned char x2 = g_tauRespInfo->tai.plmn_id.idx[1]; 
+    unsigned char x31 = x3 >> 4;
+    unsigned char x32 = x3 & 0xf;
+    unsigned char x21 = x2 >> 4;
+    unsigned char x22  = x2 & 0xf;
+    x3 = x21 | (x32 <<4);
+    x2 = (x31 << 4) | x22;
+    g_tauRespInfo->tai.plmn_id.idx[1] = x2;
+    g_tauRespInfo->tai.plmn_id.idx[2] = x3;
+
+    buffer_copy(&g_buffer, &g_tauRespInfo->tai.plmn_id, 3);
+
+    uint16_t grpid = htons(g_s1ap_cfg.mme_group_id);
+	buffer_copy(&g_buffer, &grpid, sizeof(grpid)); 
+
+    u8value = g_s1ap_cfg.mme_code;
+	buffer_copy(&g_buffer, &u8value, sizeof(u8value));
+
+    uint32_t mtmsi = htonl(g_tauRespInfo->m_tmsi); 
+	buffer_copy(&g_buffer, &(mtmsi), sizeof(mtmsi));
+#endif
+
+
+
+#if 1
+    /*TODO : Experiment */
+	u8value = 0x23; /* element id TODO: define macro or enum */
+	buffer_copy(&g_buffer, &u8value, sizeof(u8value));
+	datalen = 0x05;
+	buffer_copy(&g_buffer, &datalen, sizeof(datalen));
+    
+    u8value = 0xf4; //
+	buffer_copy(&g_buffer, &u8value, sizeof(u8value));
+
+    mtmsi = htonl(g_tauRespInfo->ue_idx); 
+	buffer_copy(&g_buffer, &(mtmsi), sizeof(mtmsi));
+#endif
+	/* NAS PDU end */
+
+	/* Calculate mac */
+	uint8_t direction = 1;
+	uint8_t bearer = 0;
+
+	calculate_mac(g_tauRespInfo->int_key, nas_hdr->seq_no,
+			direction, bearer, &g_buffer.buf[mac_data_pos],
+			g_buffer.pos - mac_data_pos,
+			&g_buffer.buf[mac_data_pos - MAC_SIZE]);
+
+	
+	/* Copy nas length to nas length field */
+	datalen = g_buffer.pos - nas_len_pos - 1;
+	memcpy(&g_buffer.buf[nas_len_pos], &datalen, sizeof(datalen));
+
+	/* Copy nas length to nas length field */
+	datalen = g_buffer.pos - nas_len_pos - 2;
+	memcpy(&(g_buffer.buf[nas_len_pos + 1]), &datalen, sizeof(datalen));
+
+	/* Copy length to s1ap length field */
+	datalen = g_buffer.pos - s1ap_len_pos - 1;
+	memcpy(g_buffer.buf + s1ap_len_pos, &datalen, sizeof(datalen));
+
+   	send_sctp_msg(g_tauRespInfo->enb_fd, g_buffer.buf, g_buffer.pos,1);
+	log_msg(LOG_INFO, "\nTAU RESP received from MME\n");
+	return SUCCESS;
+}
+
+
+void*
+tau_response_handler(void *data)
+{
+
+	log_msg(LOG_INFO, "TAU response handler ready.\n");
+
+	tau_rsp_processing((struct tauResp_Q_msg *)data);
+	
+	return NULL;
+}
diff --git a/src/s1ap/handlers/s1setup.c b/src/s1ap/handlers/s1setup.c
new file mode 100644
index 0000000..60e92d7
--- /dev/null
+++ b/src/s1ap/handlers/s1setup.c
@@ -0,0 +1,162 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <pthread.h>
+
+#include "err_codes.h"
+#include "options.h"
+#include "ipc_api.h"
+#include "main.h"
+#include "s1ap.h"
+#include "s1ap_config.h"
+#include "sctp_conn.h"
+#include "s1ap_structs.h"
+#include "s1ap_msg_codes.h"
+
+extern int g_enb_fd;
+extern s1ap_config g_s1ap_cfg;
+static struct Buffer resp_buf;
+
+int
+create_s1setup_response(/*enb info,*/unsigned char **s1_setup_resp)
+{
+	unsigned char data_len = 0;
+	unsigned char msg[50];
+	struct Buffer proto_ies;
+	struct Buffer gummies;
+	uint16_t proto_ie_id;
+	unsigned char tmp_str[4];
+	uint8_t criticality;
+
+	/*Leave a byte to fill length*/
+	resp_buf.pos = 0;
+	/*Only in case of s1setup resp, first byte is 0x20, not for any other
+	s1ap message. Nothing found in specs, please check.*/
+	/**procedureCode: id-S1Setup (17)**/
+	msg[0] = 0x20;
+	msg[1] = S1AP_SETUP_REQUEST_CODE;
+	msg[2] = CRITICALITY_REJECT;
+	buffer_copy(&resp_buf, msg, 3);
+
+	/**IE1*/
+	/**Item 0: id-MMEname*/
+	proto_ie_id = S1AP_IE_MMENAME;
+	copyU16(tmp_str, proto_ie_id);
+	buffer_copy(&proto_ies, tmp_str, sizeof(proto_ie_id));
+	criticality = CRITICALITY_IGNORE;
+	buffer_copy(&proto_ies, &criticality, sizeof(criticality));
+
+	data_len = strlen(g_s1ap_cfg.mme_name);
+	data_len = copyU16(tmp_str, data_len);
+	tmp_str[1] = tmp_str[1]+2;
+	buffer_copy(&proto_ies, &tmp_str[1], 1);
+	proto_ies.buf[proto_ies.pos++] = 0x06;/*quest: what is this in encoding?*/
+	proto_ies.buf[proto_ies.pos++] = 0x80;
+	buffer_copy(&proto_ies, g_s1ap_cfg.mme_name, strlen(g_s1ap_cfg.mme_name));
+
+	/*IE2*/
+	/**Item 1: id-ServedGUMMEIs*/
+	proto_ie_id = S1AP_IE_SERVED_GUMMEIES;
+	copyU16(tmp_str, proto_ie_id);
+	buffer_copy(&proto_ies, tmp_str, sizeof(proto_ie_id));
+	criticality = CRITICALITY_REJECT;
+	buffer_copy(&proto_ies, &criticality, sizeof(criticality));
+
+	//msg[i++] = 0x0b;//len
+	gummies.buf[0]=0x0;
+	gummies.buf[1]=0x0;
+	gummies.pos = 2;
+
+	/**Item 1: id-ServedGUMMEIs
+	 *       servedPLMNs: 1 item*/
+	buffer_copy(&gummies, &(g_s1ap_cfg.mme_plmn_id), sizeof(struct PLMN));
+	gummies.buf[gummies.pos++]=0x0;
+	gummies.buf[gummies.pos++]=0x0;
+
+	/**Item 1: id-ServedGUMMEIs
+	 *       servedGroupIDs: 1 item*/
+	data_len = copyU16(tmp_str, g_s1ap_cfg.mme_group_id);
+	buffer_copy(&gummies, tmp_str, data_len);
+
+	/**Item 1: id-ServedGUMMEIs
+	 *       servedMMECs: 1 item*/
+	gummies.buf[gummies.pos++]=0x0;
+	gummies.buf[gummies.pos++] = g_s1ap_cfg.mme_code;
+
+	data_len = copyU16(tmp_str, gummies.pos);
+	buffer_copy(&proto_ies, &(tmp_str[1]), 1);
+	buffer_copy(&proto_ies, &gummies.buf, gummies.pos);
+
+	/*IE3*/
+	/**id: id-RelativeMMECapacity (87)*/
+	proto_ie_id = S1AP_IE_REL_MME_CAPACITY;
+	copyU16(tmp_str, proto_ie_id);
+	buffer_copy(&proto_ies, tmp_str, sizeof(proto_ie_id));
+	criticality = CRITICALITY_IGNORE;
+	buffer_copy(&proto_ies, &criticality, sizeof(criticality));
+	data_len = 1;
+	buffer_copy(&proto_ies, &(data_len), 1);
+	g_s1ap_cfg.rel_cap = 1;
+	buffer_copy(&proto_ies, &(g_s1ap_cfg.rel_cap), 1);
+
+	/*number of proto IEs = 3*/
+	data_len = copyU16(tmp_str, 3);
+
+	data_len = data_len + proto_ies.pos + 1;
+	buffer_copy(&resp_buf, &data_len, 1);
+
+	resp_buf.buf[resp_buf.pos++] = 0;/*quest: packed value should be 2 bytes...
+									   here it needs 3 bytes*/
+	buffer_copy(&resp_buf, tmp_str, 2);
+
+	buffer_copy(&resp_buf, &proto_ies, proto_ies.pos);
+	*s1_setup_resp = resp_buf.buf;
+
+	return resp_buf.pos;
+}
+
+int
+s1_setup_handler(InitiatingMessage_t *msg, int enb_fd)
+{
+	unsigned char *resp_msg = NULL;
+	int resp_len = 0;
+	/*struct proto_IE s1_init_ies;
+
+	/*****Message structure***
+	*/
+	/*parse_IEs(msg+2, &s1_init_ies, S1AP_SETUP_REQUEST_CODE);
+
+	/*Validate all eNB info*/
+
+	/*Add eNB info to hash*/
+
+	/*Create S1Setup response*/
+	resp_len = create_s1setup_response(/*enb info,*/ &resp_msg);
+
+	/*Send S1Setup response*/
+	log_msg(LOG_INFO, "Send s1setup response.\n");
+	resp_len = send_sctp_msg(enb_fd, resp_msg, resp_len, 0);
+	log_msg(LOG_INFO, "send len %d\n", resp_len);
+	//free(resp_msg);
+
+	return SUCCESS;
+}
+
diff --git a/src/s1ap/handlers/service_req.c b/src/s1ap/handlers/service_req.c
new file mode 100644
index 0000000..eff8140
--- /dev/null
+++ b/src/s1ap/handlers/service_req.c
@@ -0,0 +1,123 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <pthread.h>
+
+#include "err_codes.h"
+#include "options.h"
+#include "ipc_api.h"
+#include "main.h"
+#include "s1ap.h"
+#include "s1ap_config.h"
+#include "sctp_conn.h"
+#include "s1ap_structs.h"
+#include "s1ap_msg_codes.h"
+#include "msgType.h"
+
+extern int g_enb_fd;
+extern s1ap_config g_s1ap_cfg;
+extern ipc_handle ipc_S1ap_Hndl;
+
+int
+s1_init_ue_service_req_handler(struct proto_IE *service_req_ies, int enb_fd)
+{
+	struct  s1_incoming_msg_data_t req= {0};
+
+	/*****Message structure***
+	*/
+	log_msg(LOG_INFO, "Parse s1ap Service request message\n");
+
+	/*Validate all eNB info*/
+
+	/*Add eNB info to hash*/
+
+	/*Create Q structure for Service req to MME.
+	  contains init UE information.*/
+	/* TODO : Revisit, in InitialContextSetup Request we are sending
+	 * MME UE S1AP Id as M-TMSI.
+	 */
+    req.msg_type = service_request;
+    req.msg_data.service_req_Q_msg_m.enb_fd = enb_fd;
+    for(int i = 0; i < service_req_ies->no_of_IEs; i++)
+    {
+        switch(service_req_ies->data[i].IE_type)
+        {
+            case S1AP_IE_ENB_UE_ID:
+                {
+                    log_msg(LOG_INFO, "Service Req S1AP_IE_ENB_UE_ID.\n");
+                    req.s1ap_enb_ue_id = service_req_ies->data[i].val.enb_ue_s1ap_id;
+                }break;
+            case S1AP_IE_NAS_PDU:
+                {
+                    log_msg(LOG_INFO, "Service Req NAS PDU.\n");
+                    req.msg_data.service_req_Q_msg_m.ksi = service_req_ies->data[i].val.nas.header.ksi;;
+                    req.msg_data.service_req_Q_msg_m.seq_no = service_req_ies->data[i].val.nas.header.seq_no;
+                    memcpy(&req.msg_data.service_req_Q_msg_m.mac, service_req_ies->data[i].val.nas.header.short_mac, sizeof(uint16_t));
+                }break;
+            case S1AP_IE_TAI:
+                {
+                    log_msg(LOG_INFO, "Service Req TAI.\n");
+                    memcpy(&req.msg_data.service_req_Q_msg_m.tai, 
+                        &service_req_ies->data[i].val.tai, 
+                        sizeof(struct TAI));
+                }break;
+            case S1AP_IE_UTRAN_CGI:
+                {
+                    log_msg(LOG_INFO, "Service Req CGI.\n");
+                    memcpy(&req.msg_data.service_req_Q_msg_m.utran_cgi, 
+                        &service_req_ies->data[i].val.utran_cgi, 
+                        sizeof(struct CGI));
+                }break;
+            case S1AP_IE_S_TMSI:
+                {
+                    log_msg(LOG_INFO, "Service Req STMSI.\n");
+                    if(service_req_ies->data[i].val.s_tmsi.mme_code 
+                       == g_s1ap_cfg.mme_code)
+                    {
+                        log_msg(LOG_INFO, "Service Req MME Code matched.\n");
+                        req.ue_idx = ntohl(service_req_ies->data[i].val.s_tmsi.m_TMSI);
+                        memcpy(&req.msg_data.service_req_Q_msg_m.s_tmsi, 
+                        &service_req_ies->data[i].val.s_tmsi,
+                         sizeof(struct STMSI));
+                    }
+                    else
+                    {
+                        log_msg(LOG_ERROR, "MME code mismatch. Send Service Reject. TBD");
+                        return -E_FAIL;
+                    }
+                }break;
+            default:
+                log_msg(LOG_WARNING,"Unhandled IE");
+        }
+    }
+
+	req.destInstAddr = htonl(mmeAppInstanceNum_c);
+        req.srcInstAddr = htonl(s1apAppInstanceNum_c);
+        send_tipc_message(ipc_S1ap_Hndl, mmeAppInstanceNum_c, (char *)&req, S1_READ_MSG_BUF_SIZE);
+
+	
+	/*Send Service req to mme-app*/
+	log_msg(LOG_INFO, "Send to mme-app service req handler.\n");
+
+	return SUCCESS;
+}
+
+
diff --git a/src/s1ap/handlers/uectxtrelease_cmd.c b/src/s1ap/handlers/uectxtrelease_cmd.c
new file mode 100644
index 0000000..3e93a36
--- /dev/null
+++ b/src/s1ap/handlers/uectxtrelease_cmd.c
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <pthread.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdint.h>
+#include "common_proc_info.h"
+#include "log.h"
+#include "err_codes.h"
+#include "message_queues.h"
+#include "ipc_api.h"
+#include "s1ap.h"
+#include "s1ap_config.h"
+#include "main.h"
+#include "msgType.h"
+
+
+/*static int
+get_uectxtrelcmd_protoie_value(struct proto_IE *value, struct s1relcmd_info *g_uectxtrelcmd)
+{
+	//uint8_t ieCnt = 0;
+
+	value->no_of_IEs = UE_CTX_RELEASE_NO_OF_IES;
+
+	value->data = (proto_IEs *) malloc(UE_CTX_RELEASE_NO_OF_IES *
+			sizeof(proto_IEs));
+
+	value->data[0].mme_ue_s1ap_id = g_uectxtrelcmd->ue_idx;
+	
+	value->data[1].enb_ue_s1ap_id = g_uectxtrelcmd->enb_s1ap_ue_id;
+	
+	log_msg(LOG_INFO, "mme_ue_s1ap_id %d and enb_ue_s1ap_id %d\n",
+					g_uectxtrelcmd->ue_idx,g_uectxtrelcmd->enb_s1ap_ue_id);
+	return SUCCESS;
+}*/
+
+/**
+* Stage specific message processing.
+*/
+static int
+relcmd_processing(struct s1relcmd_info *g_uectxtrelcmd)
+{
+	log_msg(LOG_DEBUG,"Process Ctx rel cmd.");
+	uint32_t length = 0;
+    	uint8_t *buffer = NULL;
+	
+	Buffer g_ctxrel_buffer;
+	struct s1ap_common_req_Q_msg req= {0};
+	
+        log_msg(LOG_DEBUG,"Inside relcmd processing\n");	
+
+    	req.IE_type = S1AP_CTX_REL_CMD;
+    	req.enb_fd = g_uectxtrelcmd->enb_fd;
+    	req.mme_s1ap_ue_id = g_uectxtrelcmd->ue_idx;
+	req.enb_s1ap_ue_id = g_uectxtrelcmd->enb_s1ap_ue_id;
+	req.cause.present = g_uectxtrelcmd->cause.present;
+    	req.cause.choice.radioNetwork = g_uectxtrelcmd->cause.choice.radioNetwork; 	
+	
+	log_msg(LOG_DEBUG,"Before s1ap_encoder\n");
+
+	int ret = s1ap_mme_encode_initiating(&req, &buffer, &length);
+	log_msg(LOG_DEBUG,"Invoked s1ap_encoder\n");
+    	if(ret == -1)
+    	{
+        	log_msg(LOG_ERROR, "Encoding ctx rel cmd failed.\n");
+        	return E_FAIL;
+    	}
+
+	buffer_copy(&g_ctxrel_buffer, buffer, length);
+	send_sctp_msg(g_uectxtrelcmd->enb_fd, g_ctxrel_buffer.buf, g_ctxrel_buffer.pos,1);
+	log_msg(LOG_INFO, "\n-----S1 Release Command sent to UE.---\n");
+	return SUCCESS;
+	
+}
+
+
+/**
+* Thread function for stage.
+*/
+void*
+s1_release_command_handler(void *data)
+{
+
+	log_msg(LOG_INFO, "s1 release command handler ready.\n");
+	
+	relcmd_processing((struct s1relcmd_info *)data);
+
+	return NULL;
+}
+
+
diff --git a/src/s1ap/json_config.c b/src/s1ap/json_config.c
new file mode 100644
index 0000000..f31de01
--- /dev/null
+++ b/src/s1ap/json_config.c
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+#include "json_data.h"
+#include "s1ap_config.h"
+#include "err_codes.h"
+
+s1ap_config g_s1ap_cfg;
+
+void
+init_parser(char *path)
+{
+	load_json(path);
+}
+
+int
+parse_s1ap_conf()
+{
+	char  mcc_dig1;
+	char  mcc_dig2;
+	char  mcc_dig3;
+	char  mnc_dig1;
+	char  mnc_dig2;
+	char  mnc_dig3;
+
+	/*s1ap information*/
+	g_s1ap_cfg.mme_name = get_string_scalar("mme.name");
+	if(NULL == g_s1ap_cfg.mme_name) return -1;
+
+	g_s1ap_cfg.s1ap_local_ip = get_ip_scalar("s1ap.s1ap_local_addr");
+	if(-1 == g_s1ap_cfg.s1ap_local_ip) return -1;
+	g_s1ap_cfg.sctp_port = get_int_scalar("s1ap.sctp_port");
+	if(-1 == g_s1ap_cfg.sctp_port) return -1;
+
+	g_s1ap_cfg.enb_ip = get_ip_scalar("s1ap.enb_addr");
+	if(-1 == g_s1ap_cfg.enb_ip) return -1;
+	g_s1ap_cfg.enb_port = get_int_scalar("s1ap.enb_port");
+	if(-1 == g_s1ap_cfg.enb_port) return -1;
+
+	g_s1ap_cfg.mme_group_id = get_int_scalar("mme.group_id");
+	if(-1 == g_s1ap_cfg.mme_group_id) return -1;
+
+	g_s1ap_cfg.mme_code = get_int_scalar("mme.code");
+	if(-1 == g_s1ap_cfg.mme_code) return -1;
+
+	mcc_dig1 = get_int_scalar("mme.mcc.dig1");
+	if(E_PARSING_FAILED == mcc_dig1) return E_PARSING_FAILED;
+	mcc_dig2 = get_int_scalar("mme.mcc.dig2");
+	if(E_PARSING_FAILED == mcc_dig1) return E_PARSING_FAILED;
+	mcc_dig3 = get_int_scalar("mme.mcc.dig3");
+	if(E_PARSING_FAILED == mcc_dig1) return E_PARSING_FAILED;
+	mnc_dig1 = get_int_scalar("mme.mnc.dig1");
+	if(E_PARSING_FAILED == mcc_dig1) return E_PARSING_FAILED;
+	mnc_dig2 = get_int_scalar("mme.mnc.dig2");
+	if(E_PARSING_FAILED == mcc_dig1) return E_PARSING_FAILED;
+	mnc_dig3 = get_int_scalar("mme.mnc.dig3");
+	if(E_PARSING_FAILED == mcc_dig1) return E_PARSING_FAILED;
+
+	g_s1ap_cfg.mme_plmn_id.idx[0] = mcc_dig2 << 4 | mcc_dig1;
+	g_s1ap_cfg.mme_plmn_id.idx[1] = mnc_dig3 << 4 | mcc_dig3;
+	g_s1ap_cfg.mme_plmn_id.idx[2] = mnc_dig2 << 4 | mnc_dig1;
+
+	return SUCCESS;
+}
diff --git a/src/s1ap/main.c b/src/s1ap/main.c
new file mode 100644
index 0000000..8948c35
--- /dev/null
+++ b/src/s1ap/main.c
@@ -0,0 +1,502 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <pthread.h>
+#include <arpa/inet.h>
+#include <errno.h>
+
+#include "options.h"
+#include "ipc_api.h"
+#include "main.h"
+#include "s1ap.h"
+#include "s1ap_config.h"
+#include "sctp_conn.h"
+#include "s1ap_structs.h"
+#include "message_queues.h"
+#include "thread_pool.h"
+#include "tpool_queue.h"
+#include "snow_3g.h"
+#include "f9.h"
+#include "err_codes.h"
+#include <sys/ioctl.h>
+#include <sys/types.h>
+
+/*Global and externs **/
+extern s1ap_config g_s1ap_cfg;
+pthread_t s1ap_iam_t;
+
+int g_enb_fd = 0;
+int g_sctp_fd = 0;
+struct thread_pool *g_tpool;
+struct thread_pool *g_tpool_tipc_reader;
+
+ipc_handle ipc_S1ap_Hndl;
+
+ipc_handle ipc_tipc_reader;
+
+ipc_handle ipcHndl_sctpsend_reader;
+ipc_handle ipcHndl_sctpsend_writer;
+
+pthread_t tipcReader_t;
+pthread_t acceptSctp_t;
+
+struct time_stat g_attach_stats[65535];
+/**End: global and externs**/
+
+extern char processName[255];
+extern int pid;
+
+extern void
+handle_mmeapp_message(void * data);
+
+#define MAX_ENB     10
+#define BUFFER_LEN  1024
+
+/**
+ * @brief Decode int value from the byte array received in the s1ap incoming
+ * packet.
+ * @param[in] bytes - Array of bytes in packet
+ * @param[in] len - Length of the bytes array from which to extract the int
+ * @return Integer value extracted out of bytes array. 0 if failed.
+ */
+char *msg_to_hex_str(const char *msg, int len, char **buffer) {
+
+  char chars[]= "0123456789abcdef";
+  char *local;
+
+  if (!len)
+      return NULL;
+
+  if (!((*buffer) = (char *)malloc(2 * len + 1)))
+      return NULL;
+
+  local = *buffer;
+  for (int i = 0; i < len; i++) {
+      local[2 * i] = chars[(msg[i] >> 4) & 0x0F];
+      local[2 * i + 1] = chars[(msg[i]) & 0x0F];
+  }
+  local[2 * len] = '\0';
+
+  return local;
+}
+
+unsigned short get_length(char **msg) {
+    /* get length and consume msg bytes accordingly */
+
+    unsigned short ie_len = 0;
+
+    unsigned char val = ((*msg)[0] & 0xc0) >> 6;
+    if(val == 2) {
+        //log_msg(LOG_INFO, "length more than 128\n");
+        unsigned short higher = (unsigned char)(*msg)[0] & 0x3f;
+        (*msg)++;
+        unsigned short lower = (unsigned char)(*msg)[0];
+        ie_len = (higher << 8) | lower;
+    } else {
+        //log_msg(LOG_INFO, "length less than 128\n");
+        ie_len = (unsigned short)(*msg)[0];
+    }
+    (*msg)++;
+    return ie_len;
+}
+	
+int
+decode_int_val(unsigned char *bytes, short len)
+{
+	switch(len) {
+		case 1:
+		case 2:
+			return (bytes[1] & 0xff);
+
+		case 3:
+			return (bytes[2] & 0xff) |
+					(0xff00 & ((unsigned short)(bytes[1] << 8)));
+
+		case 4:
+			return (((((unsigned int)(bytes[1]) << 16) & 0xffff00) |
+					((unsigned int)(bytes[2]) << 8)) & 0xffff00) |
+					((unsigned int)(bytes[3]) & 0xff);
+	};
+	return 0;
+}
+
+/**
+ * @brief Pack short number value in to the buffer
+ * @param[out] buffer to fill the value
+ * @param[in] value to fill
+ * @return number of bytes filled in to the buffer
+ */
+int
+copyU16(unsigned char *buffer, uint32_t val)
+{
+	if (val < 255) {
+		buffer[0] = (val >> 8) & 0xFF;
+		buffer[1] = val & 0xFF;
+		return 2;
+	} else if (val < 65535) {
+		buffer[0] = 0x40;
+		buffer[1] = (val >> 8) & 0xFF;
+		buffer[2] = val & 0xFF;
+		return 3;
+	} else {
+		buffer[0] = 0x80;
+		buffer[1] = (val >> 16) & 0xFF;
+		buffer[2] = (val >> 8) & 0xFF;
+		buffer[3] = val & 0xFF;
+		return 4;
+	}
+}
+
+void
+calculate_mac(uint8_t *int_key, uint32_t seq_no, uint8_t direction,
+		uint8_t bearer, uint8_t *data, uint16_t data_len,
+		uint8_t *mac)
+{
+	uint8_t *out;
+
+	out = f9(int_key, seq_no, bearer, direction, data, data_len * 8);
+
+	memcpy(mac, out, MAC_SIZE);
+
+	return;
+}
+
+int
+init_s1ap_workers()
+{
+	pthread_attr_t attr;
+
+	pthread_attr_init(&attr);
+	/* set the thread detach state */
+	pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+
+	pthread_attr_destroy(&attr);
+	return 0;
+}
+
+/**
+ * @brief Thread to read and distribute sctp request received. Messages will
+ * be passed to s1ap handler function for further processing.
+ * @param[in] thread data
+ * @return thread return data
+ */
+void *
+accept_sctp(void *data)
+{
+	log_msg(LOG_INFO, "accept connection on sctp sock\n");
+	int new_socket = 0;
+	int activity = 0;
+	int i = 0;
+	int valread = 0;
+	int sd = 0;
+	int max_sd = 0;
+	int enb_socket[MAX_ENB] = {0};
+	unsigned char buffer[BUFFER_LEN] = {0};
+
+	while(1) {
+		log_msg(LOG_INFO, "WHILE LOOP\n");
+
+		fd_set readfds;
+		memset (buffer, 0, BUFFER_LEN);
+		valread  = 0;
+
+		FD_ZERO(&readfds);
+		FD_SET(g_sctp_fd, &readfds);
+		max_sd = g_sctp_fd;
+
+		for (i = 0; i < MAX_ENB; i++) {
+			sd = enb_socket[i];
+
+			if (sd > 0) {
+				FD_SET(sd, &readfds);
+			}
+
+			if (sd > max_sd) {
+				max_sd = sd;
+			}
+		}
+
+		activity = select(max_sd + 1, &readfds, NULL, NULL, NULL);
+
+		if ((activity < 0) && (errno != EINTR)) {
+			log_msg(LOG_ERROR, "select error.\n");
+		 }
+
+		if (FD_ISSET(g_sctp_fd, &readfds)) {
+
+			if ((new_socket = accept_sctp_socket(g_sctp_fd)) == -1) {
+				log_msg(LOG_ERROR, "Error in accept on sctp socket.\n");
+			}
+
+			log_msg(LOG_INFO, "New Connection Established\n.");
+
+			for (i = 0; i < MAX_ENB; i++) {
+
+				if( enb_socket[i] == 0 ) {
+
+					enb_socket[i] = new_socket;
+					g_enb_fd = new_socket;
+					log_msg(LOG_INFO, "Adding to list of sockets at %d value %d\n" , i, new_socket);
+
+					break;
+				}
+			}
+		}
+
+		for (i = 0; i < MAX_ENB; i++) {
+
+			sd = enb_socket[i];
+
+			if (FD_ISSET(sd, &readfds)) {
+
+				if ((valread = recv_sctp_msg(sd, buffer, SCTP_BUF_SIZE)) == 0) {
+
+					log_msg(LOG_INFO, "Host Disconnected\n");
+					close(sd);
+					enb_socket[i] = 0;
+
+				} else {
+
+					unsigned char *tmpBuf = (unsigned char *)
+					malloc(sizeof(char) * valread + (2*sizeof(int)) );
+					memcpy(tmpBuf, &sd, sizeof(sd));
+					memcpy(tmpBuf + sizeof(int), &valread, sizeof(int));
+					memcpy(tmpBuf + (2*sizeof(int)), buffer, valread);
+					//tmpBuf[len] = '\0';
+					log_msg(LOG_INFO, "SCTP Received msg len : %d on fd %d\n",
+							valread, sd);
+					insert_job(g_tpool, handle_s1ap_message, tmpBuf);
+
+				}
+			}
+		}
+
+	}/* while */
+
+	return NULL;
+}
+
+void * tipc_msg_handler()
+{
+	int bytesRead = 0;
+	while (1)
+	{
+		unsigned char buffer[BUFFER_LEN] = {0};
+		if ((bytesRead = read_tipc_msg(ipc_tipc_reader, buffer,BUFFER_LEN)) > 0)
+		{
+			unsigned char *tmpBuf = (unsigned char *) malloc(sizeof(char) * bytesRead);
+			memcpy(tmpBuf, buffer, bytesRead);
+			log_msg(LOG_INFO, "S1AP message received from mme-app");
+			insert_job(g_tpool_tipc_reader, handle_mmeapp_message, tmpBuf);
+		}
+	}
+}
+
+/**
+ * @brief Initialize sctp socket connection for eNB
+ * @return Error code SUCCESS or FAIL
+*/
+int
+init_sctp()
+{
+	log_msg(LOG_INFO, "Create sctp sock, ip:%d, port:%d\n",
+			g_s1ap_cfg.s1ap_local_ip, g_s1ap_cfg.sctp_port);
+	/*Create MME sctp listned socket*/
+	g_sctp_fd = create_sctp_socket(g_s1ap_cfg.s1ap_local_ip,
+					g_s1ap_cfg.sctp_port);
+
+	if (g_sctp_fd == -1) {
+		log_msg(LOG_ERROR, "Error in creating sctp socket. \n");
+		return -E_FAIL;
+	}
+
+	pthread_attr_t attr;
+
+	pthread_attr_init(&attr);
+	/* set the thread detach state */
+	pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+
+	int ret = pthread_create(&acceptSctp_t, &attr,&accept_sctp, NULL);
+	if(ret < 0) {
+		log_msg(LOG_ERROR,"SCTP ACCEPTS THREAD FAILED\n");
+		return -E_FAIL;
+	}
+
+	pthread_attr_destroy(&attr);
+	return SUCCESS;
+}
+
+
+/**
+ * @brief Init all writer IPC channels for s1ap program
+ * @return Success/fail error code
+ */
+int
+init_writer_ipc()
+{
+	if ((ipc_S1ap_Hndl  = create_tipc_socket()) <= 0)
+		return -E_FAIL;
+
+	log_msg(LOG_INFO, "Writer IPCs initialized\n");
+
+	return SUCCESS;
+}
+
+/**
+ * @brief Init handlers to process messages coming from mme-app
+ * @return error code.
+ */
+int
+start_mme_resp_handlers()
+{
+	if ((ipc_tipc_reader = create_tipc_socket()) <= 0)
+	{
+		log_msg(LOG_ERROR, "Failed to create IPC Reader tipc socket \n");
+		return -E_FAIL;
+	}
+	if ( bind_tipc_socket(ipc_tipc_reader, s1apAppInstanceNum_c) != 1)
+	{
+		log_msg(LOG_ERROR, "Failed to bind IPC Reader tipc socket \n");
+		return -E_FAIL;
+	}
+
+	/* Initialize thread pool for mme-app messages */
+	g_tpool_tipc_reader = thread_pool_new(5);
+
+	if (g_tpool_tipc_reader == NULL) {
+		log_msg(LOG_ERROR, "Error in creating thread pool. \n");
+		return -E_FAIL_INIT;
+	}
+
+	log_msg(LOG_INFO, "S1AP Listener theadpool initalized.\n");
+
+	// thread to read incoming ipc messages from tipc socket
+	pthread_attr_t attr;
+	pthread_attr_init(&attr);
+	pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+	pthread_create(&tipcReader_t, &attr, &tipc_msg_handler, NULL);
+	pthread_attr_destroy(&attr);
+
+
+	return SUCCESS;
+}
+
+/**
+ *@Thread to handle send messages to sctp thread
+ * NOT user currently.
+ */
+void *
+sctp_write(void *args)
+{
+	while(1) {
+
+		sleep(10);
+
+	}
+}
+
+int
+start_sctp_threads()
+{
+	pthread_t sctp_writer;
+	pthread_attr_t attr;
+	int res = SUCCESS;
+
+	res = pthread_attr_init(&attr);
+	if (res != 0)
+		return -E_FAIL;
+
+	res = pthread_attr_setdetachstate(&attr,
+			PTHREAD_CREATE_DETACHED);
+	if (res != 0)
+		return -E_FAIL;
+
+	res = pthread_create(&sctp_writer, &attr,
+			sctp_write, NULL);
+	if (res != 0) {
+		log_msg(LOG_ERROR, "Error in creating sctp writer thread.\n");
+		pthread_attr_destroy(&attr);
+		return -E_FAIL;
+	}
+
+	pthread_attr_destroy(&attr);
+
+	return SUCCESS;
+}
+
+/**
+ * @brief - main entry point for s1ap application. Read json config,
+ * start all the handlers. Connect with configured enb
+ */
+int
+main(int argc, char **argv)
+{
+	memcpy (processName, argv[0], strlen(argv[0]));
+	pid = getpid();
+
+	parse_args(argc, argv);
+
+	init_parser("conf/s1ap.json");
+	parse_s1ap_conf();
+
+	if (init_writer_ipc() != SUCCESS) {
+		log_msg(LOG_ERROR, "Error in initializing writer ipc.\n");
+		return -E_FAIL_INIT;
+	}
+
+	if (start_mme_resp_handlers() != SUCCESS) {
+			log_msg(LOG_ERROR, "Error in starting mme response handlers.\n");
+			return -E_FAIL_INIT;
+	}
+
+	/* Initialize thread pool for sctp request parsers */
+	g_tpool = thread_pool_new(THREADPOOL_SIZE);
+
+	if (g_tpool == NULL) {
+		log_msg(LOG_ERROR, "Error in creating thread pool. \n");
+		return -E_FAIL_INIT;
+	}
+	log_msg(LOG_INFO, "S1AP Listener theadpool initalized.\n");
+
+
+	if (init_sctp() != SUCCESS) {
+		log_msg(LOG_ERROR, "Error in initializing sctp server.\n");
+		return -E_FAIL_INIT;
+	}
+
+	log_msg(LOG_INFO, "Connection accespted from enb \n");
+
+	if (start_sctp_threads() != SUCCESS) {
+		log_msg(LOG_ERROR, "Error in creating sctp reader/writer thread.\n");
+		return -E_FAIL_INIT;
+	}
+
+	log_msg(LOG_INFO, "sctp reader/writer thread started.\n");
+	
+
+	while (1) {
+		sleep(10);
+	}
+
+	return SUCCESS;
+}
diff --git a/src/s1ap/options.c b/src/s1ap/options.c
new file mode 100644
index 0000000..fbfae3c
--- /dev/null
+++ b/src/s1ap/options.c
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <getopt.h>
+
+#include "log.h"
+#include "options.h"
+
+void parse_args(int argc, char **argv)
+{
+	int args_set = 0;
+	int c = 0;
+
+	const struct option long_options[] = {
+	  {"config_file",  required_argument, NULL, 'f'},
+	  {0, 0, 0, 0}
+	};
+
+	do {
+		int option_index = 0;
+
+		c = getopt_long(argc, argv, "f:", long_options,
+				&option_index);
+
+		if (c == -1)
+			break;
+
+		switch (c) {
+		case 'f':
+			break;
+		default:
+			log_msg(LOG_ERROR, "Unknown argument - %s.", argv[optind]);
+			exit(0);
+		}
+	} while (c != -1);
+
+	if ((args_set & REQ_ARGS) != REQ_ARGS) {
+		log_msg(LOG_ERROR, "Usage: %s\n", argv[0]);
+		for (c = 0; long_options[c].name; ++c) {
+			log_msg(LOG_ERROR, "\t[ -%s | -%c ] %s\n",
+					long_options[c].name,
+					long_options[c].val,
+					long_options[c].name);
+		}
+		exit(0);
+	}
+}
+
+void log_buffer_free(char** buffer)
+{
+    if(*buffer != NULL)
+        free(*buffer);
+    *buffer = NULL;
+}
+
+void convert_imsi_to_bcd_str(uint8_t *src, uint8_t* dest)
+{
+  if (!src || !dest)
+  {
+      log_msg(LOG_ERROR, "invalid buffer pointers.\n");
+      return;
+  }
+
+  int len  = BINARY_IMSI_LEN;
+  int i = 0;
+  for (; i < len - 1; i++) {
+      dest[2 * i] = '0' + ((src[i] >> 4) & 0x0F);
+      dest[2 * i + 1] = '0' + ((src[i]) & 0x0F);
+  }
+
+  dest[2 * (len-1)] = '0' + ((src[i] >> 4) & 0x0F);
+
+  return;
+}
+
+
diff --git a/src/s1ap/sctp_conn.c b/src/s1ap/sctp_conn.c
new file mode 100644
index 0000000..05310e8
--- /dev/null
+++ b/src/s1ap/sctp_conn.c
@@ -0,0 +1,112 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <arpa/inet.h>
+#include <netinet/in.h>
+#include <netinet/sctp.h>
+
+#include "log.h"
+#include "sctp_conn.h"
+#define ENB_PORT 62324
+#define S1AP_PPID 18
+int create_sctp_socket(unsigned int remote_ip, unsigned short port)
+{
+	int connSock;
+	struct sockaddr_in servaddr;
+	int ret;
+
+	connSock = socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP);
+
+	if (connSock == -1)
+	{
+		log_msg(LOG_ERROR, "Socket creation failed\n");
+		return -1;
+	}
+
+	//TODO: use remote_ip
+	bzero ((void *) &servaddr, sizeof (servaddr));
+	servaddr.sin_family = AF_INET;
+	servaddr.sin_addr.s_addr = htonl(remote_ip);
+	//servaddr.sin_addr.s_addr = htonl (INADDR_ANY);
+	servaddr.sin_port = htons(port);
+
+	ret = bind(connSock, (struct sockaddr *) &servaddr, sizeof (servaddr));
+
+	if(ret == -1 )
+	{
+		perror("Bind:");
+		log_msg(LOG_ERROR, "Bind failed \n");
+		close(connSock);
+		return -1;
+	}
+
+	/* Specify maximum streams available per socket */
+	struct sctp_initmsg initmsg;
+	memset (&initmsg, 0, sizeof (initmsg));
+	initmsg.sinit_num_ostreams = MAX_STREAM;
+	initmsg.sinit_max_instreams = MAX_STREAM;
+	initmsg.sinit_max_attempts = 4;
+	ret = setsockopt(connSock, IPPROTO_SCTP, SCTP_INITMSG,
+			&initmsg, sizeof (initmsg));
+
+	if(ret == -1 )
+	{
+		log_msg(LOG_ERROR, "setsockopt() failed \n");
+		close(connSock);
+		return -1;
+	}
+
+	ret = listen(connSock, MAX_PENDING_CONN);
+	if(ret == -1 )
+	{
+		log_msg(LOG_ERROR, "listen() failed \n");
+		close(connSock);
+		return -1;
+	}
+	return connSock;
+}
+
+int accept_sctp_socket(int connSock)
+{
+	return accept(connSock, (struct sockaddr *) NULL, (socklen_t *) NULL);
+}
+
+int recv_sctp_msg(int connSock, unsigned char *buffer, size_t len)
+{
+    struct sctp_sndrcvinfo sndrcvinfo;
+	int flags;
+	return sctp_recvmsg(connSock, buffer, len,
+			(struct sockaddr *) NULL, 0, &sndrcvinfo, &flags);
+}
+
+int send_sctp_msg(int connSock, unsigned char *buffer, size_t len, uint16_t stream_no)
+{
+	uint32_t ppid = S1AP_PPID;
+	return sctp_sendmsg(connSock, (void *)buffer, len,
+			NULL, 0, htonl(ppid), 0, stream_no, 0, 0);
+}
+
+int close_sctp_socket(int connSock)
+{
+	return close(connSock);
+}
diff --git a/src/s6a/Makefile b/src/s6a/Makefile
new file mode 100644
index 0000000..a5fb2c9
--- /dev/null
+++ b/src/s6a/Makefile
@@ -0,0 +1,77 @@
+#
+# Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+# Copyright (c) 2017 Intel Corporation
+# Copyright (c) 2019, Infosys Ltd.
+#
+# 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.
+#
+
+#SRCDIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
+include ../../Makefile.common
+
+LIB_PATH +=-L../common/
+
+SRCDIR := .
+TARGET := $(BINDIR)/s6a-app
+
+SRCEXT := c
+
+SOURCES := $(shell find $(SRCDIR) -type f -name '*.$(SRCEXT)')
+
+OBJECTS := $(patsubst $(SRCDIR)/%,$(OBJDIR)/s6a/%,$(SOURCES:.$(SRCEXT)=.o))
+
+CFLAGS += -Wall
+
+ifeq ($(DEBUG),true)
+	CFLAGS += -g
+endif
+
+ifeq ($(DEBUG),false)
+#	CFLAGS += -O3
+endif
+
+
+LIBS :=  \
+	-linterface \
+	-llog \
+	-lthreadpool \
+	-ljson \
+	-lpthread \
+	-lfdproto \
+	-lfdcore
+
+$(TARGET): $(OBJECTS)
+	@echo " Linking..."
+	@mkdir -p $(BINDIR)
+	$(CC) $(LFLAGS) $^ -o $(TARGET) $(LIB_PATH) $(LIBS)
+
+$(OBJDIR)/s6a/%.o: $(SRCDIR)/%.$(SRCEXT)
+	@mkdir -p $(OBJDIR)/s6a/handlers
+	$(CC) $(CFLAGS) $(INC_DIRS) -c -o $@ $<
+
+all:$(TARGET)
+
+clean:
+	@echo " Cleaning...";
+	@rm  -rf $(OBJDIR)/s6a $(TARGET)
+
+install:
+	@mkdir -p $(TARGET_DIR)/bin
+	-@cp $(TARGET) $(TARGET_DIR)/bin
+	-@mkdir -p $(TARGET_DIR)/conf
+	-@cp conf/s6a_fd.conf $(TARGET_DIR)/conf/s6a_fd.conf
+	-@cp conf/s6a.json $(TARGET_DIR)/conf/s6a.json
+	-@cp conf/make_certs.sh $(TARGET_DIR)/conf/make_certs.sh
+
+.PHONY: clean
+
diff --git a/src/s6a/conf/01.pem b/src/s6a/conf/01.pem
new file mode 100644
index 0000000..95d0f48
--- /dev/null
+++ b/src/s6a/conf/01.pem
@@ -0,0 +1,60 @@
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number: 1 (0x1)
+        Signature Algorithm: sha256WithRSAEncryption
+        Issuer: CN=ca.localdomain, C=FR, ST=BdR, L=Aix, O=fD, OU=Tests
+        Validity
+            Not Before: Sep  2 12:10:16 2019 GMT
+            Not After : Sep  1 12:10:16 2020 GMT
+        Subject: C=FR, ST=BdR, O=fD, OU=Tests, CN=mme.localdomain
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+                RSA Public-Key: (1024 bit)
+                Modulus:
+                    00:c9:b1:bf:1e:0c:c1:6e:13:5f:5b:0a:39:f4:46:
+                    10:f6:87:70:b9:4a:34:63:01:fc:12:cb:eb:94:df:
+                    bd:24:9e:47:58:8b:90:a7:97:3a:91:cf:51:11:f6:
+                    d2:37:ce:b9:98:d0:c6:11:9d:41:a1:6b:31:13:29:
+                    dc:58:4e:24:a9:6a:5d:74:76:20:e9:cb:b1:22:f9:
+                    e5:9a:89:6f:3f:0b:c2:31:ae:9f:4b:79:2f:d6:c4:
+                    42:1c:5b:15:6d:d8:9c:61:49:8c:14:40:cc:88:0e:
+                    f7:1e:24:97:65:2d:5d:1f:fb:7d:5f:b1:19:95:3b:
+                    08:a7:e8:98:06:14:30:0c:c5
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:FALSE
+            Netscape Comment: 
+                OpenSSL Generated Certificate
+            X509v3 Subject Key Identifier: 
+                BD:1E:A7:62:7F:A7:ED:01:2C:CF:B7:B8:31:10:BD:73:FC:AA:8D:50
+            X509v3 Authority Key Identifier: 
+                keyid:E8:D3:89:BA:7B:C0:17:0A:CA:F6:15:AB:20:0F:FE:E0:78:42:8C:33
+
+    Signature Algorithm: sha256WithRSAEncryption
+         02:87:6c:ba:bf:4c:d2:a5:1a:de:84:07:fe:1e:56:0b:cd:8b:
+         6c:73:c9:22:5b:bc:97:55:72:3d:66:89:3a:49:5d:62:c2:71:
+         4f:f2:51:42:3c:2c:8a:31:8d:90:43:56:d0:12:db:d1:ce:1c:
+         55:60:ee:85:8f:7b:a8:1e:b1:bf:59:65:a1:d8:a4:7d:34:d9:
+         95:d3:62:96:59:d2:06:8d:84:73:8a:d9:9a:7a:52:fa:f5:7f:
+         7e:41:5e:7c:9e:08:fd:58:ac:b9:f4:42:46:be:3f:2b:df:57:
+         84:ad:38:50:e8:34:95:71:31:6a:70:15:f1:02:27:57:57:45:
+         1c:e7
+-----BEGIN CERTIFICATE-----
+MIICojCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADBfMRcwFQYDVQQDDA5jYS5s
+b2NhbGRvbWFpbjELMAkGA1UEBhMCRlIxDDAKBgNVBAgMA0JkUjEMMAoGA1UEBwwD
+QWl4MQswCQYDVQQKDAJmRDEOMAwGA1UECwwFVGVzdHMwHhcNMTkwOTAyMTIxMDE2
+WhcNMjAwOTAxMTIxMDE2WjBSMQswCQYDVQQGEwJGUjEMMAoGA1UECAwDQmRSMQsw
+CQYDVQQKDAJmRDEOMAwGA1UECwwFVGVzdHMxGDAWBgNVBAMMD21tZS5sb2NhbGRv
+bWFpbjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAybG/HgzBbhNfWwo59EYQ
+9odwuUo0YwH8EsvrlN+9JJ5HWIuQp5c6kc9REfbSN865mNDGEZ1BoWsxEyncWE4k
+qWpddHYg6cuxIvnlmolvPwvCMa6fS3kv1sRCHFsVbdicYUmMFEDMiA73HiSXZS1d
+H/t9X7EZlTsIp+iYBhQwDMUCAwEAAaN7MHkwCQYDVR0TBAIwADAsBglghkgBhvhC
+AQ0EHxYdT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFL0e
+p2J/p+0BLM+3uDEQvXP8qo1QMB8GA1UdIwQYMBaAFOjTibp7wBcKyvYVqyAP/uB4
+QowzMA0GCSqGSIb3DQEBCwUAA4GBAAKHbLq/TNKlGt6EB/4eVgvNi2xzySJbvJdV
+cj1miTpJXWLCcU/yUUI8LIoxjZBDVtAS29HOHFVg7oWPe6gesb9ZZaHYpH002ZXT
+YpZZ0gaNhHOK2Zp6Uvr1f35BXnyeCP1YrLn0Qka+PyvfV4StOFDoNJVxMWpwFfEC
+J1dXRRzn
+-----END CERTIFICATE-----
diff --git a/src/s6a/conf/cacert.pem b/src/s6a/conf/cacert.pem
new file mode 100644
index 0000000..b6dc142
--- /dev/null
+++ b/src/s6a/conf/cacert.pem
@@ -0,0 +1,16 @@
+-----BEGIN CERTIFICATE-----
+MIICmjCCAgOgAwIBAgIUNitxX3XfNYyyfpXI4ZyK9xIn19owDQYJKoZIhvcNAQEL
+BQAwXzEXMBUGA1UEAwwOY2EubG9jYWxkb21haW4xCzAJBgNVBAYTAkZSMQwwCgYD
+VQQIDANCZFIxDDAKBgNVBAcMA0FpeDELMAkGA1UECgwCZkQxDjAMBgNVBAsMBVRl
+c3RzMB4XDTE5MDkwMjEyMTAxNloXDTI5MDgzMDEyMTAxNlowXzEXMBUGA1UEAwwO
+Y2EubG9jYWxkb21haW4xCzAJBgNVBAYTAkZSMQwwCgYDVQQIDANCZFIxDDAKBgNV
+BAcMA0FpeDELMAkGA1UECgwCZkQxDjAMBgNVBAsMBVRlc3RzMIGfMA0GCSqGSIb3
+DQEBAQUAA4GNADCBiQKBgQCmsT/aecW48vqgLFE6k0+zwqqP/ni1NwUD95wlH8CA
+SqO2suSCsa9TEDqNUsmt3idbV/rDV9wq/7u6N2O7M97ALXbyTu+fkth3CgYapWls
+lQQseyb6TPhQkECJ0Z8CEkOzZrYAiXcfoo97Yd+VyXGSl8ISdGzH6ScAQ6ARTAmA
+6QIDAQABo1MwUTAdBgNVHQ4EFgQU6NOJunvAFwrK9hWrIA/+4HhCjDMwHwYDVR0j
+BBgwFoAU6NOJunvAFwrK9hWrIA/+4HhCjDMwDwYDVR0TAQH/BAUwAwEB/zANBgkq
+hkiG9w0BAQsFAAOBgQA9l9FlhnVcKaS30Ac54MhmASuo4T+SejfqaHilrrpm5rXu
+9zYrEGQbFA//l5Mw16e3/7MhAd9CXlA3pgKVuJ99UEpFM51FJLHD4/pmQzNS5DO1
+DaUFM8UzKf96hf9NFkQe1BjYwPqXyeUUZU8s+KF02jkiXwHvyQC6pF16wFxq0g==
+-----END CERTIFICATE-----
diff --git a/src/s6a/conf/cakey.pem b/src/s6a/conf/cakey.pem
new file mode 100644
index 0000000..a9418c5
--- /dev/null
+++ b/src/s6a/conf/cakey.pem
@@ -0,0 +1,16 @@
+-----BEGIN PRIVATE KEY-----
+MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKaxP9p5xbjy+qAs
+UTqTT7PCqo/+eLU3BQP3nCUfwIBKo7ay5IKxr1MQOo1Sya3eJ1tX+sNX3Cr/u7o3
+Y7sz3sAtdvJO75+S2HcKBhqlaWyVBCx7JvpM+FCQQInRnwISQ7NmtgCJdx+ij3th
+35XJcZKXwhJ0bMfpJwBDoBFMCYDpAgMBAAECgYBU70G634tIpr3fOVWWRBM7Y/gm
+cKIuq78pe1QbcmdStzVd1R8sHL9Z0o4TDljm96gUGesS98SeQDn2M1zkuRRJAuWX
+I14zdDDYsU/OGWGhJ7D/ZdLTgcjBXaTE5IBgMVX4xL5Pm58xtEgDAIS6LWy5Vr3J
+mOJTMdhKaMIVmbtvUQJBANg1ZOzUN04NAiI3fLRC6Tjq5+jnsiW57ifegsW61//b
+OVP2E+d1ozXj+AbXf70W3czOvtrCRrrzzYBkAvVJJuUCQQDFXunyOQnwmfTW0Jd6
+Vy6lGn5oNB/4O2ijKrn/j9R483NIeXAaMwABPKgUpkotgwCCT8GbLz7fn+WAY3cx
+I+21AkBakXtWjcshAef751xwsnq54gUFllEU5p7xyo7jP1KOFgoctr89vRSCVZ2n
+WAxlbDe7PHvMbYdtdwWFm991WpBVAkACsT7DvR9zlsYOQB4w3wuV2PysczmUa0sM
+HsMWx2GAnOGPtYhf8x4m5irszS/p2wWgwXHEqipTZpz82V6A3xqZAkEAl2WQ1NDJ
+bTzurBV8O2j8jfBpOcqTCKddXxqcxwcMtvsW6ZhVjXhYqH8EImGQmiUzwa7Px+N5
+zN9PVE3it01Lyg==
+-----END PRIVATE KEY-----
diff --git a/src/s6a/conf/demoCA/index.txt b/src/s6a/conf/demoCA/index.txt
new file mode 100644
index 0000000..c70d812
--- /dev/null
+++ b/src/s6a/conf/demoCA/index.txt
@@ -0,0 +1 @@
+V	200901121016Z		01	unknown	/C=FR/ST=BdR/O=fD/OU=Tests/CN=mme.localdomain
diff --git a/src/s6a/conf/demoCA/index.txt.attr b/src/s6a/conf/demoCA/index.txt.attr
new file mode 100644
index 0000000..8f7e63a
--- /dev/null
+++ b/src/s6a/conf/demoCA/index.txt.attr
@@ -0,0 +1 @@
+unique_subject = yes
diff --git a/src/s6a/conf/demoCA/index.txt.old b/src/s6a/conf/demoCA/index.txt.old
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/s6a/conf/demoCA/index.txt.old
diff --git a/src/s6a/conf/demoCA/serial b/src/s6a/conf/demoCA/serial
new file mode 100644
index 0000000..9e22bcb
--- /dev/null
+++ b/src/s6a/conf/demoCA/serial
@@ -0,0 +1 @@
+02
diff --git a/src/s6a/conf/demoCA/serial.old b/src/s6a/conf/demoCA/serial.old
new file mode 100644
index 0000000..8a0f05e
--- /dev/null
+++ b/src/s6a/conf/demoCA/serial.old
@@ -0,0 +1 @@
+01
diff --git a/src/s6a/conf/make_certs.sh b/src/s6a/conf/make_certs.sh
new file mode 100644
index 0000000..ff78b8f
--- /dev/null
+++ b/src/s6a/conf/make_certs.sh
@@ -0,0 +1,32 @@
+#! /bin/bash
+
+#Copyright (c) 2017 Sprint
+#
+# 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.
+
+rm -rf demoCA
+mkdir demoCA
+echo 01 > demoCA/serial
+touch demoCA/index.txt
+
+HOST=$1
+DOMAIN=$2
+
+# CA self certificate
+openssl req  -new -batch -x509 -days 3650 -nodes -newkey rsa:1024 -out cacert.pem -keyout cakey.pem -subj /CN=ca.localdomain/C=FR/ST=BdR/L=Aix/O=fD/OU=Tests
+
+#
+openssl genrsa -out $HOST.key.pem 1024
+openssl req -new -batch -out $HOST.csr.pem -key $HOST.key.pem -subj /CN=$HOST.$DOMAIN/C=FR/ST=BdR/L=Aix/O=fD/OU=Tests
+openssl ca -cert cacert.pem -keyfile cakey.pem -in $HOST.csr.pem -out $HOST.cert.pem -outdir . -batch
+
diff --git a/src/s6a/conf/mme.cert.pem b/src/s6a/conf/mme.cert.pem
new file mode 100644
index 0000000..95d0f48
--- /dev/null
+++ b/src/s6a/conf/mme.cert.pem
@@ -0,0 +1,60 @@
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number: 1 (0x1)
+        Signature Algorithm: sha256WithRSAEncryption
+        Issuer: CN=ca.localdomain, C=FR, ST=BdR, L=Aix, O=fD, OU=Tests
+        Validity
+            Not Before: Sep  2 12:10:16 2019 GMT
+            Not After : Sep  1 12:10:16 2020 GMT
+        Subject: C=FR, ST=BdR, O=fD, OU=Tests, CN=mme.localdomain
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+                RSA Public-Key: (1024 bit)
+                Modulus:
+                    00:c9:b1:bf:1e:0c:c1:6e:13:5f:5b:0a:39:f4:46:
+                    10:f6:87:70:b9:4a:34:63:01:fc:12:cb:eb:94:df:
+                    bd:24:9e:47:58:8b:90:a7:97:3a:91:cf:51:11:f6:
+                    d2:37:ce:b9:98:d0:c6:11:9d:41:a1:6b:31:13:29:
+                    dc:58:4e:24:a9:6a:5d:74:76:20:e9:cb:b1:22:f9:
+                    e5:9a:89:6f:3f:0b:c2:31:ae:9f:4b:79:2f:d6:c4:
+                    42:1c:5b:15:6d:d8:9c:61:49:8c:14:40:cc:88:0e:
+                    f7:1e:24:97:65:2d:5d:1f:fb:7d:5f:b1:19:95:3b:
+                    08:a7:e8:98:06:14:30:0c:c5
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: 
+                CA:FALSE
+            Netscape Comment: 
+                OpenSSL Generated Certificate
+            X509v3 Subject Key Identifier: 
+                BD:1E:A7:62:7F:A7:ED:01:2C:CF:B7:B8:31:10:BD:73:FC:AA:8D:50
+            X509v3 Authority Key Identifier: 
+                keyid:E8:D3:89:BA:7B:C0:17:0A:CA:F6:15:AB:20:0F:FE:E0:78:42:8C:33
+
+    Signature Algorithm: sha256WithRSAEncryption
+         02:87:6c:ba:bf:4c:d2:a5:1a:de:84:07:fe:1e:56:0b:cd:8b:
+         6c:73:c9:22:5b:bc:97:55:72:3d:66:89:3a:49:5d:62:c2:71:
+         4f:f2:51:42:3c:2c:8a:31:8d:90:43:56:d0:12:db:d1:ce:1c:
+         55:60:ee:85:8f:7b:a8:1e:b1:bf:59:65:a1:d8:a4:7d:34:d9:
+         95:d3:62:96:59:d2:06:8d:84:73:8a:d9:9a:7a:52:fa:f5:7f:
+         7e:41:5e:7c:9e:08:fd:58:ac:b9:f4:42:46:be:3f:2b:df:57:
+         84:ad:38:50:e8:34:95:71:31:6a:70:15:f1:02:27:57:57:45:
+         1c:e7
+-----BEGIN CERTIFICATE-----
+MIICojCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADBfMRcwFQYDVQQDDA5jYS5s
+b2NhbGRvbWFpbjELMAkGA1UEBhMCRlIxDDAKBgNVBAgMA0JkUjEMMAoGA1UEBwwD
+QWl4MQswCQYDVQQKDAJmRDEOMAwGA1UECwwFVGVzdHMwHhcNMTkwOTAyMTIxMDE2
+WhcNMjAwOTAxMTIxMDE2WjBSMQswCQYDVQQGEwJGUjEMMAoGA1UECAwDQmRSMQsw
+CQYDVQQKDAJmRDEOMAwGA1UECwwFVGVzdHMxGDAWBgNVBAMMD21tZS5sb2NhbGRv
+bWFpbjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAybG/HgzBbhNfWwo59EYQ
+9odwuUo0YwH8EsvrlN+9JJ5HWIuQp5c6kc9REfbSN865mNDGEZ1BoWsxEyncWE4k
+qWpddHYg6cuxIvnlmolvPwvCMa6fS3kv1sRCHFsVbdicYUmMFEDMiA73HiSXZS1d
+H/t9X7EZlTsIp+iYBhQwDMUCAwEAAaN7MHkwCQYDVR0TBAIwADAsBglghkgBhvhC
+AQ0EHxYdT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFL0e
+p2J/p+0BLM+3uDEQvXP8qo1QMB8GA1UdIwQYMBaAFOjTibp7wBcKyvYVqyAP/uB4
+QowzMA0GCSqGSIb3DQEBCwUAA4GBAAKHbLq/TNKlGt6EB/4eVgvNi2xzySJbvJdV
+cj1miTpJXWLCcU/yUUI8LIoxjZBDVtAS29HOHFVg7oWPe6gesb9ZZaHYpH002ZXT
+YpZZ0gaNhHOK2Zp6Uvr1f35BXnyeCP1YrLn0Qka+PyvfV4StOFDoNJVxMWpwFfEC
+J1dXRRzn
+-----END CERTIFICATE-----
diff --git a/src/s6a/conf/mme.csr.pem b/src/s6a/conf/mme.csr.pem
new file mode 100644
index 0000000..cbe6c05
--- /dev/null
+++ b/src/s6a/conf/mme.csr.pem
@@ -0,0 +1,11 @@
+-----BEGIN CERTIFICATE REQUEST-----
+MIIBoDCCAQkCAQAwYDEYMBYGA1UEAwwPbW1lLmxvY2FsZG9tYWluMQswCQYDVQQG
+EwJGUjEMMAoGA1UECAwDQmRSMQwwCgYDVQQHDANBaXgxCzAJBgNVBAoMAmZEMQ4w
+DAYDVQQLDAVUZXN0czCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAybG/HgzB
+bhNfWwo59EYQ9odwuUo0YwH8EsvrlN+9JJ5HWIuQp5c6kc9REfbSN865mNDGEZ1B
+oWsxEyncWE4kqWpddHYg6cuxIvnlmolvPwvCMa6fS3kv1sRCHFsVbdicYUmMFEDM
+iA73HiSXZS1dH/t9X7EZlTsIp+iYBhQwDMUCAwEAAaAAMA0GCSqGSIb3DQEBCwUA
+A4GBAFu/aD0qCfyMcLMv4uHo40LNupQaF6Zvgeb07cX3gttMOfK2OS9PF143dbXD
+iv2xvoh09w+XH372pBDbIhnoBsS6t6KLPd3sk108LpX/h7eds1bWE43ZSolhFZZ1
+1gwu/vpHurgtyQfJgZyKNemjnIHgly7He7OaEXqewknJ+pvK
+-----END CERTIFICATE REQUEST-----
diff --git a/src/s6a/conf/mme.key.pem b/src/s6a/conf/mme.key.pem
new file mode 100644
index 0000000..5a4b72a
--- /dev/null
+++ b/src/s6a/conf/mme.key.pem
@@ -0,0 +1,15 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIICXAIBAAKBgQDJsb8eDMFuE19bCjn0RhD2h3C5SjRjAfwSy+uU370knkdYi5Cn
+lzqRz1ER9tI3zrmY0MYRnUGhazETKdxYTiSpal10diDpy7Ei+eWaiW8/C8Ixrp9L
+eS/WxEIcWxVt2JxhSYwUQMyIDvceJJdlLV0f+31fsRmVOwin6JgGFDAMxQIDAQAB
+AoGAIrcFPhbT9C5Ba1oHP5QPt174d+vduGzPBi0zDxyzYWocvZDIBRBydEZKndzt
+sc1TBIpqjP2UHkRk3feGhWxtwqyQLUlzn3KajgzJjy/gMLicNi/oRtPi/olCQvZw
+57K5pFHIn8E0RMCaDqirpRuwTOIfcsI1Pw/ndykDC2Q+8AECQQD456teQsq7EuLT
+HpY3hkqvDXh4VWptGLqhTvTQFo2hazZYDhjIn0k6wSeeMgnATMP7ZSTcSy043Nie
+Zxzvh74FAkEAz3GRUThWHjCSxr2qxzZJIfM1H89ax5nHQFgwD3Jj8isyrDSY1zkX
+3VDZxswrsNg+iFkeG27gcpciEgn09fGPwQJAMjw3pwed+RG/u9JhiQVOj3QNi2PZ
+3fjuud3ApTrYDOshhbYapGsZkYUoZNI+i5QyvctVHC0EDITuJ1IyUdm4rQJBAMjm
+pePQ+aY3SI7tNS3FZ0JX9gUenj5csdmhDrqHAECSkXqxXaxigLg4CxE6vr2AT99g
+34WV9g1ETRzHQ9PE5IECQCiFVkVT/G4AHBKnm1/W+At76Ks4bWXPhh6TzQAse77T
+FmSRWdQL09qj2rOeArqc8Q5pOVLgc0YY0Ny9gMA+3/c=
+-----END RSA PRIVATE KEY-----
diff --git a/src/s6a/conf/s6a.json b/src/s6a/conf/s6a.json
new file mode 100644
index 0000000..6511ee8
--- /dev/null
+++ b/src/s6a/conf/s6a.json
@@ -0,0 +1,37 @@
+{
+	"mme": {
+		"ip_addr": "192.168.1.55",
+		"name": "vmmestandalone",
+		"group_id": 1,
+		"code": 1,
+		"__comment__": "Here is comment",
+		"mcc": {
+			"dig1": 2,
+			"dig2": 0,
+			"dig3": 8
+		},
+		"mnc": {
+			"dig1": 0,
+			"dig2": 1,
+			"dig3": -1
+		}
+	},
+	"s1ap": {
+		"s1ap_local_addr": "127.0.0.1",
+		"sctp_port": 36412,
+		"enb_addr": "127.0.0.1",
+		"enb_port": 5003,
+		"egtp_default_hostname": "sutlej.ccin.ccpu.com"
+	},
+	"s11": {
+		"egtp_local_addr": "192.168.1.55",
+		"egtp_default_port": 2123,
+		"sgw_addr": "127.0.0.1",
+		"pgw_addr": "192.168.1.105"
+	},
+	"s6a": {
+		"hss_type": "freediameter",
+		"host_name": "hss.openair4G.eur",
+		"realm": "openair4G.eur"
+	}
+}
diff --git a/src/s6a/conf/s6a_fd.conf b/src/s6a/conf/s6a_fd.conf
new file mode 100644
index 0000000..92f04f6
--- /dev/null
+++ b/src/s6a/conf/s6a_fd.conf
@@ -0,0 +1,80 @@
+
+# -------- Test configuration ---------
+AppServThreads = 40;
+SCTP_streams = 3;
+NoRelay;
+No_IPv6;
+#SCTP_streams = 3;
+
+# Identity = "<diameter_host>.<diameter_realm>";
+Identity = "mme.localdomain";
+Realm = "localdomain";
+Port = 38698;
+SecPort = 38699;
+
+ConnectPeer = "hss.openair4G.eur" { ConnectTo = "192.168.1.55"; No_TLS; port = 3868; };
+
+# TLS_Cred = "<diameter_host>.cert.pem", "<diameter_host>.key.pem";
+TLS_Cred = "conf/mme.cert.pem",
+	   "conf/mme.key.pem";
+TLS_CA = "conf/cacert.pem";
+
+LoadExtension = "/usr/local/lib/freeDiameter/dict_3gpp2_avps.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dict_CreditControl.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dict_base_rfc6733.fdx";
+###
+LoadExtension = "/usr/local/lib/freeDiameter/dict_draftload_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_etsi283034_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4004_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4006bis_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4072_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4590_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5447_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5580_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5777_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5778_avps.fdx";
+###
+LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc6734_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc6942_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc7155_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc7683_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc7944_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29061_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29128_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29154_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29173_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29212_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29214_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29215_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29217_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29229_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29272_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29273_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29329_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29336_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29337_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29338_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29343_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29344_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29345_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29368_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29468_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_ts32299_avps.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dict_CxDx.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dict_Gx.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dict_NAS.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dict_Rf.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dict_Ro.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dict_Rx.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_S6as6d.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_S6c.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dict_S6mS6n.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_S6t.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dict_S9.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_SGd.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dict_SLh.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dict_Sd.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dict_Sh.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dict_T4.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_T6aT6bT7.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dict_Tsp.fdx";
diff --git a/src/s6a/fd_init.c b/src/s6a/fd_init.c
new file mode 100644
index 0000000..b93623f
--- /dev/null
+++ b/src/s6a/fd_init.c
@@ -0,0 +1,656 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <freeDiameter/freeDiameter-host.h>
+#include <freeDiameter/libfdcore.h>
+#include <freeDiameter/libfdproto.h>
+
+#include "log.h"
+#include "s6a.h"
+#include "s6a_fd.h"
+
+/**Globals and externs**/
+extern struct fd_dict_objects g_fd_dict_objs;
+extern struct fd_dict_data g_fd_dict_data;
+extern bool g_nolog;
+extern enum log_levels g_log_level;
+/**Globals and externs**/
+
+/**
+ * @brief Add element to freediameter message
+ * ready
+ * @param[in] val - AVP value to be added
+ * @param[in] obj - Disctionary object
+ * @param[in/out] msg_bufi
+ * @return int Sucess or failure code
+ */
+int
+add_fd_msg(union avp_value *val, struct dict_object * obj,
+		struct msg **msg_buf)
+{
+	struct avp *avp_val = NULL;
+
+	CHECK_FCT_DO(fd_msg_avp_new(obj, 0, &avp_val), return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_msg_avp_setvalue(avp_val, val), return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_msg_avp_add(*msg_buf, MSG_BRW_LAST_CHILD, avp_val),
+				return S6A_FD_ERROR);
+
+	return SUCCESS;
+}
+
+/**
+ * @brief Dumo freediameter message buffer
+ * ready
+ * @param[in] Freediameter message to print
+ * @return void
+ */
+void
+dump_fd_msg(struct msg *msg)
+{
+	//char *buf = NULL;
+	//int len = 0;
+
+	g_nolog = true;
+
+	if (g_nolog) return;
+
+	//TODO: correct - fprintf(stderr, "%s\n", fd_msg_dump_treeview(&buf, &len, NULL, msg,
+	//			fd_g_config->cnf_dict, 0, 1));
+	//free(buf);
+}
+
+/**
+ * @brief Extract last integeger representing ue index from session ID
+ * @param[in] sid - session id
+ * @param[in] sidlen - session id len
+ * @return int - eror code
+ */
+int
+get_ue_idx_from_fd_resp(unsigned char *sid, int sidlen)
+{
+	int index = -1;
+	char *tmp = strrchr((char *)sid, ';');
+
+	index = strtol(++tmp, NULL, 10);
+	log_msg(LOG_INFO, "Received resp for index %d\n", index);
+	return index;
+}
+
+/**
+ * @brief Initialize free diameter vendor info
+ * @param None
+ * @return int - eror code
+ */
+int
+s6a_fd_init()
+{
+	//TODO: check vendor id
+	vendor_id_t vendor_id = 10415;
+
+	FD_DICT_SEARCH(DICT_VENDOR, VENDOR_BY_ID, &vendor_id, g_fd_dict_objs.vendor_id);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.vendor_id, &g_fd_dict_data.vendor_data),
+		return S6A_FD_ERROR);
+
+	return SUCCESS;
+}
+
+/**
+ * @brief Initialize freediameter dictionary objects
+ * @param None
+ * @return int - error code
+ */
+int
+s6a_fd_objs_init()
+{
+	//TODO: Check app id
+	application_id_t app_s6a = 16777251;
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME, "Result-Code",
+			g_fd_dict_objs.res_code);
+
+	FD_DICT_SEARCH(DICT_APPLICATION, APPLICATION_BY_ID, &app_s6a,
+			g_fd_dict_objs.s6a_app);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME, "Experimental-Result",
+					g_fd_dict_objs.exp_res);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME, "Auth-Application-Id",
+					g_fd_dict_objs.auth_app_id);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME, "Session-Id",
+					g_fd_dict_objs.sess_id);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME, "Auth-Session-State",
+					g_fd_dict_objs.auth_sess_state);
+
+	//NI Detach
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME, "Origin-Host",
+					g_fd_dict_objs.org_host);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME, "Origin-Realm",
+					g_fd_dict_objs.org_realm);
+	//NI Detach
+	
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME, "Destination-Host",
+					g_fd_dict_objs.dest_host);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME, "Destination-Realm",
+					g_fd_dict_objs.dest_realm);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME, "User-Name",
+					g_fd_dict_objs.user_name);
+
+	/*search and map avp names to elements*/
+	FD_DICT_SEARCH(DICT_COMMAND, CMD_BY_NAME,
+					"Authentication-Information-Request",
+					g_fd_dict_objs.AIR);
+
+	FD_DICT_SEARCH(DICT_COMMAND, CMD_BY_NAME,
+					"Authentication-Information-Answer",
+					g_fd_dict_objs.AIA);
+
+	FD_DICT_SEARCH(DICT_COMMAND, CMD_BY_NAME, "Update-Location-Request",
+				g_fd_dict_objs.ULR);
+
+	FD_DICT_SEARCH(DICT_COMMAND, CMD_BY_NAME, "Update-Location-Answer",
+					g_fd_dict_objs.ULA);
+
+	FD_DICT_SEARCH(DICT_COMMAND, CMD_BY_NAME, "Purge-UE-Request",
+					g_fd_dict_objs.PUR);
+
+	FD_DICT_SEARCH(DICT_COMMAND, CMD_BY_NAME, "Purge-UE-Answer",
+					g_fd_dict_objs.PUA);
+	
+	//NI Detach
+	FD_DICT_SEARCH(DICT_COMMAND, CMD_BY_NAME, "Cancel-Location-Request",
+					g_fd_dict_objs.CLR);
+
+	FD_DICT_SEARCH(DICT_COMMAND, CMD_BY_NAME, "Cancel-Location-Answer",
+					g_fd_dict_objs.CLA);
+	//NI Detach
+	
+	
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Visited-PLMN-Id",
+					g_fd_dict_objs.visited_PLMN_id);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+					"Requested-EUTRAN-Authentication-Info",
+					g_fd_dict_objs.req_EUTRAN_auth_info);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+					"Number-Of-Requested-Vectors",
+					g_fd_dict_objs.no_of_req_vectors);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+					"Immediate-Response-Preferred",
+					g_fd_dict_objs.immediate_resp_pref);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Authentication-Info",
+					g_fd_dict_objs.auth_info);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "E-UTRAN-Vector",
+					g_fd_dict_objs.E_UTRAN_vector);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "RAND",
+					g_fd_dict_objs.RAND);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "XRES",
+					g_fd_dict_objs.XRES);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "AUTN",
+					g_fd_dict_objs.AUTN);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "KASME",
+					g_fd_dict_objs.KASME);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "RAT-Type",
+					g_fd_dict_objs.RAT_type);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "ULR-Flags",
+					g_fd_dict_objs.ULR_flags);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "ULA-Flags",
+					g_fd_dict_objs.ULA_flags);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Subscription-Data",
+					g_fd_dict_objs.subscription_data);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Subscriber-Status",
+					g_fd_dict_objs.subscriber_status);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "MSISDN",
+					g_fd_dict_objs.MSISDN);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Network-Access-Mode",
+					g_fd_dict_objs.net_access_mode);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+					"Access-Restriction-Data",
+					g_fd_dict_objs.access_restriction_data);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "AMBR",
+					g_fd_dict_objs.AMBR);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+					"Max-Requested-Bandwidth-UL",
+					g_fd_dict_objs.max_req_bandwidth_UL);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+					"Max-Requested-Bandwidth-DL",
+					g_fd_dict_objs.max_req_bandwidth_DL);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+					"APN-Configuration-Profile",
+					g_fd_dict_objs.APN_config_profile);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Context-Identifier",
+					g_fd_dict_objs.ctx_id);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+					"Additional-Context-Identifier",
+					g_fd_dict_objs.additional_ctx_id);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+					"All-APN-Configurations-Included-Indicator",
+					g_fd_dict_objs.all_APN_configs_included_ind);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "APN-Configuration",
+					g_fd_dict_objs.APN_config);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "PDN-Type",
+					g_fd_dict_objs.PDN_type);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+					"PDN-GW-Allocation-Type",
+					g_fd_dict_objs.PDN_GW_alloc_type);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Specific-APN-Info",
+					g_fd_dict_objs.specific_APN_info);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+					"Non-IP-PDN-Type-Indicator",
+					g_fd_dict_objs.non_IP_PDN_type_ind);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+					"Non-IP-Data-Delivery-Mechanism",
+					g_fd_dict_objs.non_IP_data_delivery_mech);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "SCEF-ID",
+					g_fd_dict_objs.SCEF_ID);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Priority-Level",
+					g_fd_dict_objs.priority_Level);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Location-Area-Identity",
+					g_fd_dict_objs.location_area_id);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Tracking-Area-Identity",
+					g_fd_dict_objs.tracking_area_id);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+					"Subscribed-Periodic-RAU-TAU-Timer",
+					g_fd_dict_objs.subsc_periodic_RAU_TAU_tmr);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "PUR-Flags",
+					g_fd_dict_objs.PUR_flags);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+					"Regional-Subscription-Zone-Code",
+					g_fd_dict_objs.reg_subs_zone_code);
+	//NI Detach
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+					"Cancellation-Type",
+					g_fd_dict_objs.cancellation_type);
+	return SUCCESS;
+}
+
+/**
+ * @brief Initialize freediameter data objects for the dictionary object
+ * initialized
+ * @param None
+ * @return int - error code
+ */
+int
+s6a_fd_data_init()
+{
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.s6a_app,
+				&g_fd_dict_data.app_s6a_data), return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.res_code,
+				&g_fd_dict_data.res_code), return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.exp_res,
+				&g_fd_dict_data.exp_res), return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.auth_app_id,
+			&g_fd_dict_data.auth_app_id),
+			return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.sess_id,
+				&g_fd_dict_data.sess_id), return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.auth_sess_state,
+			&g_fd_dict_data.auth_sess_state),
+			return S6A_FD_ERROR);
+	//NI Detach
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.org_host,
+				&g_fd_dict_data.org_host), return S6A_FD_ERROR);
+	
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.org_realm,
+				&g_fd_dict_data.org_realm), return S6A_FD_ERROR);
+	//NI Detach
+	
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.dest_host,
+				&g_fd_dict_data.dest_host), return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.dest_realm,
+				&g_fd_dict_data.dest_realm), return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.user_name,
+				&g_fd_dict_data.user_name), return S6A_FD_ERROR);
+	
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.visited_PLMN_id,
+				&g_fd_dict_data.visited_PLMN_id),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.req_EUTRAN_auth_info,
+				&g_fd_dict_data.req_EUTRAN_auth_info),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.no_of_req_vectors,
+				&g_fd_dict_data.no_of_req_vectors),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.immediate_resp_pref,
+				&g_fd_dict_data.immediate_resp_pref),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.auth_info,
+				&g_fd_dict_data.auth_info),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.E_UTRAN_vector,
+				&g_fd_dict_data.E_UTRAN_vector),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.RAND,
+				&g_fd_dict_data.RAND),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.XRES,
+				&g_fd_dict_data.XRES),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.AUTN,
+				&g_fd_dict_data.AUTN),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.KASME,
+				&g_fd_dict_data.KASME),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.RAT_type,
+				&g_fd_dict_data.RAT_type),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.ULR_flags,
+				&g_fd_dict_data.ULR_flags),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.ULA_flags,
+				&g_fd_dict_data.ULA_flags),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.subscription_data,
+				&g_fd_dict_data.subscription_data),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.subscriber_status,
+				&g_fd_dict_data.subscriber_status),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.MSISDN,
+				&g_fd_dict_data.MSISDN),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.net_access_mode,
+				&g_fd_dict_data.net_access_mode),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.access_restriction_data,
+				&g_fd_dict_data.access_restriction_data),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.AMBR,
+				&g_fd_dict_data.AMBR),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.max_req_bandwidth_UL,
+				&g_fd_dict_data.max_req_bandwidth_UL),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.max_req_bandwidth_DL,
+				&g_fd_dict_data.max_req_bandwidth_DL),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.APN_config_profile,
+				&g_fd_dict_data.APN_config_profile),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.ctx_id,
+				&g_fd_dict_data.ctx_id),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.additional_ctx_id,
+				&g_fd_dict_data.additional_ctx_id),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.all_APN_configs_included_ind,
+				&g_fd_dict_data.all_APN_configs_included_ind),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.APN_config,
+				&g_fd_dict_data.APN_config),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.PDN_type,
+				&g_fd_dict_data.PDN_type),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.PDN_GW_alloc_type,
+				&g_fd_dict_data.PDN_GW_alloc_type),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.specific_APN_info,
+				&g_fd_dict_data.specific_APN_info),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.non_IP_PDN_type_ind,
+				&g_fd_dict_data.non_IP_PDN_type_ind),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.non_IP_data_delivery_mech,
+				&g_fd_dict_data.non_IP_data_delivery_mech),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.SCEF_ID,
+				&g_fd_dict_data.SCEF_ID),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.priority_Level,
+				&g_fd_dict_data.priority_Level),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.location_area_id,
+				&g_fd_dict_data.location_area_id),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.tracking_area_id,
+				&g_fd_dict_data.tracking_area_id),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.subsc_periodic_RAU_TAU_tmr,
+				&g_fd_dict_data.subsc_periodic_RAU_TAU_tmr),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.PUR_flags,
+				&g_fd_dict_data.PUR_flags),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.reg_subs_zone_code,
+				&g_fd_dict_data.reg_subs_zone_code),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.cancellation_type,
+				&g_fd_dict_data.cancellation_type),
+				return S6A_FD_ERROR);
+	return SUCCESS;
+}
+
+int
+s6a_fd_cb_reg(void)
+{
+	log_msg(LOG_INFO, "ANJANA s6a_fd_cb_reg.\n");
+
+	struct disp_when data;
+
+	memset(&data, 0, sizeof(data));
+	data.app = g_fd_dict_objs.s6a_app;
+
+	/* Register resp callbacks */
+	data.command = g_fd_dict_objs.AIA;
+	CHECK_FCT_DO(fd_disp_register(aia_resp_callback, DISP_HOW_CC, &data,
+			NULL, NULL),
+			return S6A_FD_ERROR);
+
+	data.command = g_fd_dict_objs.ULA;
+	CHECK_FCT_DO(fd_disp_register(ula_resp_callback, DISP_HOW_CC, &data,
+			NULL, NULL),
+			return S6A_FD_ERROR);
+
+#if 0	
+	data.command = g_fd_dict_objs.PUA;
+	CHECK_FCT_DO(fd_disp_register(purge_resp_callback, DISP_HOW_CC, &data,
+	                     NULL, NULL),
+	                     return S6A_FD_ERROR);
+#endif
+	//NI Detach
+	data.command = g_fd_dict_objs.CLR;
+        CHECK_FCT_DO(fd_disp_register(clr_resp_callback, DISP_HOW_CC, &data,
+                        NULL, NULL),
+                        return S6A_FD_ERROR);
+	
+	//NI Detach
+	
+	CHECK_FCT_DO(fd_disp_app_support(g_fd_dict_objs.s6a_app,
+			g_fd_dict_objs.vendor_id, 1, 0),
+			return S6A_FD_ERROR);
+
+	return SUCCESS;
+}
+
+/**
+ * @brief Create session ID for every HSS request. Append UE ID to session ID
+ * initialized
+ * @param [out] session ID created
+ * @param [in] UE index to append to session ID
+ * @return int - error code
+ */
+short
+create_fd_sess_id(struct s6a_sess_info *s6a_sess,
+	int ue_idx)
+{
+	struct session *sess = NULL;
+	unsigned char *sess_id;
+	size_t sess_id_len;
+	char idx[10] = {0};
+
+	/* clear the session id if exists */
+	if (s6a_sess->sess_id_len > 0) {
+		int exist = false;
+		CHECK_FCT_DO(fd_sess_fromsid((unsigned char*)s6a_sess->sess_id,
+			s6a_sess->sess_id_len, &sess, &exist),
+			return S6A_FD_ERROR);
+
+		if (exist == 0) {
+			CHECK_FCT_DO(fd_sess_destroy(&sess), return S6A_FD_ERROR);
+			sess = NULL;
+		}
+	}
+
+	sprintf(idx, "%d", ue_idx);
+	if (sess == NULL) {
+		CHECK_FCT_DO(fd_sess_new(&sess, fd_g_config->cnf_diamid,
+		fd_g_config->cnf_diamid_len, (unsigned char*)idx, strlen(idx)),
+		return S6A_FD_ERROR);
+	}
+	CHECK_FCT_DO(fd_sess_getsid(sess, &sess_id, &sess_id_len),
+			return S6A_FD_ERROR);
+
+	s6a_sess->sess_id_len = (unsigned char)sess_id_len;
+	memcpy(s6a_sess->sess_id, sess_id, s6a_sess->sess_id_len);
+	s6a_sess->sess_id[s6a_sess->sess_id_len] = '\0';
+
+	return SUCCESS;
+}
+
+/**
+ * @brief Parse AVP received in freediameter response
+ * initialized
+ * @param [in]avp - AVP value receivned
+ * @param [out] result value parserd out of avp
+ * @return int - error code
+ */
+short
+parse_fd_result(struct avp *avp, struct fd_result *res)
+{
+	struct avp_hdr *hdr;
+	struct avp *child_avp = NULL;
+
+	CHECK_FCT_DO(fd_msg_avp_hdr(avp, &hdr), return S6A_FD_ERROR);
+	if (hdr->avp_code != g_fd_dict_data.exp_res.avp_code)
+	   return S6A_FD_ERROR;
+
+	CHECK_FCT_DO(fd_msg_browse(avp, MSG_BRW_FIRST_CHILD, &child_avp, NULL),
+			return S6A_FD_ERROR);
+
+	while (child_avp) {
+	   fd_msg_avp_hdr (child_avp, &hdr);
+
+	   if (hdr->avp_code ==
+		g_fd_dict_data.exp_res_code.avp_code) {
+			res->result_code = hdr->avp_value->u32;
+			res->present = true;
+		} else if (hdr->avp_code == g_fd_dict_data.vendor_id.avp_code) {
+			res->vendor_id = hdr->avp_value->u32;
+		}
+
+		CHECK_FCT_DO(fd_msg_browse(child_avp, MSG_BRW_NEXT, &child_avp,
+				NULL),
+				return S6A_FD_ERROR);
+	}
+
+	return SUCCESS;
+}
+
+
+
+
diff --git a/src/s6a/handlers/aia_handler.c b/src/s6a/handlers/aia_handler.c
new file mode 100644
index 0000000..bb096dd
--- /dev/null
+++ b/src/s6a/handlers/aia_handler.c
@@ -0,0 +1,269 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <pthread.h>
+#include <string.h>
+#include <unistd.h>
+#include <freeDiameter/freeDiameter-host.h>
+#include <freeDiameter/libfdcore.h>
+#include <freeDiameter/libfdproto.h>
+
+#include "log.h"
+#include "err_codes.h"
+#include "message_queues.h"
+#include "ipc_api.h"
+#include "s6a_fd.h"
+#include "s6a.h"
+#include "msgType.h"
+//#include "stage1_s6a_msg.h"
+#include "hss_message.h"
+
+#define DIAMETER_SUCCESS 2001
+
+/** Global and externs**/
+extern struct fd_dict_objects g_fd_dict_objs;
+extern struct fd_dict_data g_fd_dict_data;
+
+extern int g_Q_mme_S6a_fd;
+/**global and externs end**/
+
+/**
+ * @brief Parse authentication information avp recvd in AIA. This contains
+ * important security information for the UE
+ * @param [in] avp_data - AVP value received
+ * @param [out] aia - Security info is filled in to aia msg Q
+ * @return int - error code
+ */
+static int
+get_aia_sec_vector(struct avp *avp_data, struct aia_Q_msg *aia)
+{
+	struct avp *sub_avp = NULL;
+	struct avp_hdr *element = NULL;
+
+	CHECK_FCT_DO(fd_msg_avp_hdr(avp_data, &element),
+			return S6A_FD_ERROR);
+
+	/*Authentication-Info*/
+	if ((NULL == element) ||
+			(element->avp_code != g_fd_dict_data.auth_info.avp_code))
+		return S6A_FD_ERROR;
+
+	/*Find first sub child of Authentication-Info*/
+	CHECK_FCT_DO(fd_msg_browse(avp_data, MSG_BRW_FIRST_CHILD, &sub_avp,
+			NULL),
+			return S6A_FD_ERROR);
+
+	/*Lookup for sub element "E-UTRAN-Vector" in loop*/
+	while (NULL != sub_avp) {
+
+		fd_msg_avp_hdr(sub_avp, &element);
+
+		if ((NULL != element) && (element->avp_code ==
+			g_fd_dict_data.E_UTRAN_vector.avp_code))
+			/*Found the entry*/
+			break;
+
+		/*Iterate sub entries*/
+		CHECK_FCT_DO(fd_msg_browse(sub_avp, MSG_BRW_NEXT, &sub_avp,
+			NULL),
+			return S6A_FD_ERROR);
+	}
+
+	/*Element "E-UTRAN-Vector" not found, then return*/
+	if (NULL == sub_avp) return S6A_FD_ERROR;
+
+	CHECK_FCT_DO(fd_msg_browse(sub_avp, MSG_BRW_FIRST_CHILD,
+			&sub_avp, NULL),
+			return S6A_FD_ERROR);
+
+	/*Iterate all sub elements of E-UTRAN-Vector and filter sec vector params*/
+	for (;
+		NULL != sub_avp; /*Till null*/
+//		CHECK_FCT_DO(fd_msg_browse(sub_avp, MSG_BRW_NEXT, &sub_avp, NULL),
+//			return S6A_FD_ERROR) /*Iterate elements*/
+		) {
+
+		fd_msg_avp_hdr(sub_avp, &element);
+
+		/*AVP: RAND(1447) l=28 f=VM- vnd=TGPP*/
+		if (element->avp_code == g_fd_dict_data.RAND.avp_code) {
+
+			//if (element->avp_value->os.len > sizeof(aia->sec.rand.val))
+			if (element->avp_value->os.len > AIA_RAND_SIZE)
+				return S6A_FD_ERROR;
+
+			aia->sec.rand.len = element->avp_value->os.len;
+			memcpy(aia->sec.rand.val, element->avp_value->os.data,
+				aia->sec.rand.len);
+		}
+
+		/*AVP: XRES(1448) l=20 f=VM- vnd=TGPP*/
+		if (element->avp_code == g_fd_dict_data.XRES.avp_code) {
+
+			if (element->avp_value->os.len > AIA_RES_SIZE)
+				return S6A_FD_ERROR;
+
+			aia->sec.xres.len = element->avp_value->os.len;
+			memcpy(aia->sec.xres.val, element->avp_value->os.data,
+				aia->sec.xres.len);
+		}
+
+		/*AVP: AUTN(1449) l=28 f=VM- vnd=TGPP*/
+		if (element->avp_code == g_fd_dict_data.AUTN.avp_code) {
+
+			if (element->avp_value->os.len > AIA_AUTN_SIZE)
+				return S6A_FD_ERROR;
+
+			aia->sec.autn.len = element->avp_value->os.len;
+			memcpy(aia->sec.autn.val, element->avp_value->os.data,
+				aia->sec.autn.len);
+		}
+
+		/*AVP: KASME(1450) l=44 f=VM- vnd=TGPP*/
+		if (element->avp_code == g_fd_dict_data.KASME.avp_code) {
+
+			if (element->avp_value->os.len > AIA_KASME_SIZE)
+				return S6A_FD_ERROR;
+
+			aia->sec.kasme.len = element->avp_value->os.len;
+			memcpy(aia->sec.kasme.val, element->avp_value->os.data,
+				aia->sec.kasme.len);
+		}
+
+		CHECK_FCT_DO(fd_msg_browse(sub_avp, MSG_BRW_NEXT, &sub_avp, NULL),
+			return S6A_FD_ERROR) /*Iterate elements*/
+
+	}
+
+	return SUCCESS;
+}
+
+static
+void send_to_stage2(struct s6_incoming_msg_data_t *incoming_msg_p)
+{
+	TRACE_ENTRY("\n****************WRITE TO g_Q_mme_S6a_fd");
+
+	incoming_msg_p->destInstAddr = htonl(mmeAppInstanceNum_c);
+	incoming_msg_p->srcInstAddr = htonl(s6AppInstanceNum_c);
+
+	/*Send to stage2 queue*/
+	send_tipc_message(g_Q_mme_S6a_fd, mmeAppInstanceNum_c, (char*)incoming_msg_p, S6_READ_MSG_BUF_SIZE);
+}
+
+int aia_resp_callback(struct msg **buf, struct avp *_avp,
+		struct session *session, void *data,
+		enum disp_action * action)
+{
+	TRACE_ENTRY("\n****************ANJANA ******  Callback ----- >AIA recvd\n");
+	int res = SUCCESS, sess_id_len;
+	struct msg *resp = *buf;
+	struct avp *avp_ptr = NULL;
+	unsigned char *sess_id= NULL;
+	struct s6_incoming_msg_data_t s6_incoming_msgs;
+	struct avp_hdr *avp_hdr = NULL;
+
+	log_msg(LOG_INFO, "\nCallback ----- >AIA recvd\n");
+
+	dump_fd_msg(resp);
+	//TODO - workaround for dump call. Remove this.
+	{
+		char * buf = NULL;
+		size_t len = 0;
+		printf("*********AIA CALLBACK******%s\n", fd_msg_dump_treeview(&buf, &len, NULL, resp,
+					fd_g_config->cnf_dict, 0, 1));
+		free(buf);
+	}
+
+	CHECK_FCT_DO(fd_sess_getsid(session, &sess_id, (size_t*)&sess_id_len),
+		return S6A_FD_ERROR);
+
+	log_msg(LOG_INFO, "\nCallback ----- >session id=%s \n",sess_id);
+    
+	s6_incoming_msgs.msg_type = auth_info_answer;
+	/*Retrieve UE index embedded in to session ID string at AIR time*/
+	s6_incoming_msgs.ue_idx = get_ue_idx_from_fd_resp(sess_id, sess_id_len);
+
+	/*AVP: Result-Code(268)*/
+	fd_msg_search_avp(resp, g_fd_dict_objs.res_code, &avp_ptr);
+
+	if (NULL != avp_ptr) {
+		fd_msg_avp_hdr(avp_ptr, &avp_hdr);
+		res = avp_hdr->avp_value->u32;
+
+		if (DIAMETER_SUCCESS != res) {
+			log_msg(LOG_ERROR, "Diameter error with HSS\n");
+		}
+		//Vikram: chk res = SUCCESS;
+
+	} else {
+		struct fd_result fd_res;
+
+		avp_ptr = NULL;
+		fd_msg_search_avp(resp, g_fd_dict_objs.exp_res,
+			&avp_ptr);
+
+		if (NULL == avp_ptr) {
+			res = S6A_FD_ERROR;
+		} else if (parse_fd_result(avp_ptr, &fd_res) != 0) {
+			res = S6A_FD_ERROR;
+		} else res = fd_res.result_code;
+	}
+
+	if (DIAMETER_SUCCESS == res) {
+		/*AVP: Authentication-Info*/
+		fd_msg_search_avp(resp, g_fd_dict_objs.auth_info,
+			&avp_ptr);
+
+		if (NULL != avp_ptr) {
+			if (get_aia_sec_vector(avp_ptr, &s6_incoming_msgs.msg_data.aia_Q_msg_m) != SUCCESS)
+				res = S6A_FD_ERROR;
+		} else {
+			res = S6A_FD_ERROR;
+		}
+	}
+
+	/*Handled fd msg, do cleanup*/
+	fd_msg_free(*buf);
+
+	*buf = NULL;
+
+	if (DIAMETER_SUCCESS != res) s6_incoming_msgs.msg_data.aia_Q_msg_m.res = S6A_AIA_FAILED;
+
+	send_to_stage2(&s6_incoming_msgs);
+
+	return SUCCESS;
+}
+
+void
+handle_perf_hss_aia(int ue_idx, struct hss_aia_msg *aia)
+{
+    struct s6_incoming_msg_data_t msg;
+
+	msg.ue_idx = ue_idx;
+	msg.msg_type = auth_info_answer;
+	msg.msg_data.aia_Q_msg_m.res= 0;
+	memcpy(&(msg.msg_data.aia_Q_msg_m.sec.rand), &(aia->rand), sizeof(RAND));
+	memcpy(&(msg.msg_data.aia_Q_msg_m.sec.xres), &(aia->xres), sizeof(XRES));
+	memcpy(&(msg.msg_data.aia_Q_msg_m.sec.autn), &(aia->autn), sizeof(AUTN));
+	memcpy(&(msg.msg_data.aia_Q_msg_m.sec.kasme), &(aia->kasme), sizeof(KASME));
+
+	send_to_stage2(&msg);/*handle diameter error*/
+}
diff --git a/src/s6a/handlers/clr_handler.c b/src/s6a/handlers/clr_handler.c
new file mode 100644
index 0000000..b370375
--- /dev/null
+++ b/src/s6a/handlers/clr_handler.c
@@ -0,0 +1,147 @@
+/*
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <pthread.h>
+#include <string.h>
+#include <unistd.h>
+#include <freeDiameter/freeDiameter-host.h>
+#include <freeDiameter/libfdcore.h>
+#include <freeDiameter/libfdproto.h>
+
+#include "log.h"
+#include "err_codes.h"
+#include "message_queues.h"
+#include "ipc_api.h"
+#include "s6a_fd.h"
+#include "s6a.h"
+#include "msgType.h"
+//#include "detach_stage2_info.h"
+#include "hss_message.h"
+
+#define DIAMETER_SUCCESS 2001
+
+/** Global and externs**/
+extern struct fd_dict_objects g_fd_dict_objs;
+extern struct fd_dict_data g_fd_dict_data;
+extern int g_Q_mme_S6a_fd;
+/**global and externs end**/
+
+
+
+/**
+ * @brief callback handler for clr recvd from hss
+ * Parse clr, state and do cleanup for freediameter
+ * @params callback std
+ * @return error/success
+ */
+int
+clr_resp_callback(struct msg **buf, struct avp *avps, struct session *sess,
+			void *data, enum disp_action *action)
+{
+	struct msg *resp = NULL;
+	struct avp *avp_ptr = NULL;
+	struct s6_incoming_msg_data_t s6_incoming_msgs;
+	struct avp_hdr *avp_header = NULL;
+	unsigned int sess_id_len;
+	unsigned char *sess_id= NULL;
+
+	resp = *buf;
+
+	dump_fd_msg(resp);
+
+	/*read session id and extract ue index*/
+	CHECK_FCT_DO(fd_sess_getsid(sess, &sess_id, (size_t*)&sess_id_len),
+			return S6A_FD_ERROR);
+	log_msg(LOG_INFO, "\n CLR callback ----- >session id=%s \n",sess_id);
+    
+
+	/*AVP: Cancellation-Type*/
+	avp_ptr = NULL;
+	fd_msg_search_avp(resp, g_fd_dict_objs.cancellation_type, &avp_ptr);
+	if(NULL != avp_ptr) {
+		fd_msg_avp_hdr(avp_ptr, &avp_header);
+		s6_incoming_msgs.msg_data.clr_Q_msg_m.c_type = avp_header->avp_value->i32;
+	}
+	
+	fd_msg_search_avp(resp,g_fd_dict_objs.org_host, &avp_ptr);
+	if(NULL != avp_ptr) {
+		fd_msg_avp_hdr(avp_ptr, &avp_header);
+		memcpy(s6_incoming_msgs.msg_data.clr_Q_msg_m.origin_host,avp_header->avp_value->os.data,sizeof(s6_incoming_msgs.msg_data.clr_Q_msg_m.origin_host));
+		}
+
+	fd_msg_search_avp(resp, g_fd_dict_objs.org_realm, &avp_ptr);
+	if(NULL != avp_ptr) {
+		fd_msg_avp_hdr(avp_ptr, &avp_header);
+		memcpy(s6_incoming_msgs.msg_data.clr_Q_msg_m.origin_realm,avp_header->avp_value->os.data,sizeof(s6_incoming_msgs.msg_data.clr_Q_msg_m.origin_realm));
+		}
+         
+	fd_msg_search_avp(resp, g_fd_dict_objs.user_name,&avp_ptr);
+	if(NULL != avp_ptr) {
+		fd_msg_avp_hdr(avp_ptr, &avp_header);
+		memcpy(s6_incoming_msgs.msg_data.clr_Q_msg_m.imsi,avp_header->avp_value->os.data,sizeof(s6_incoming_msgs.msg_data.clr_Q_msg_m.imsi));
+		}
+       
+       /*CLA Processing*/
+
+       struct msg *ans, *qry;
+       struct avp * a;
+
+       if (buf == NULL)
+               return EINVAL;
+
+
+       /* Create answer header */
+       qry = *buf;
+       CHECK_FCT( fd_msg_new_answer_from_req ( fd_g_config->cnf_dict, buf, 0 ) );
+       ans = *buf;
+
+       /* Set the Origin-Host, Origin-Realm, Result-Code AVPs */
+       CHECK_FCT( fd_msg_rescode_set( ans, "DIAMETER_SUCCESS", NULL, NULL, 1 ) );
+
+       /* Send the answer */
+       CHECK_FCT( fd_msg_send( buf, NULL, NULL ) );
+
+	/*Do cleanup for freediameter*/
+	fd_msg_free(*buf);
+
+	*buf = NULL;
+	
+	s6_incoming_msgs.msg_type = cancel_location_request;
+
+	s6_incoming_msgs.destInstAddr = htonl(mmeAppInstanceNum_c);
+	s6_incoming_msgs.srcInstAddr = htonl(s6AppInstanceNum_c);
+
+	/*Send to stage2 queue*/
+        send_tipc_message(g_Q_mme_S6a_fd, mmeAppInstanceNum_c, (char*)&s6_incoming_msgs, S6_READ_MSG_BUF_SIZE);
+	
+	return SUCCESS;
+}
+
+/*Handler for CLR coming from built in perf HS*/
+void
+handle_perf_hss_clr(int ue_idx, struct hss_clr_msg *clr)
+{
+	struct s6_incoming_msg_data_t msg;
+    
+	msg.msg_type = cancel_location_request;
+	msg.ue_idx = ue_idx;
+	memcpy(&(msg.msg_data.clr_Q_msg_m.c_type), &(clr->cancellation_type), sizeof(clr->cancellation_type));
+	/*Send to stage2 queue*/
+	write_ipc_channel(g_Q_mme_S6a_fd, (char*)&msg, S6_READ_MSG_BUF_SIZE);
+}
diff --git a/src/s6a/handlers/detach_session_handler.c b/src/s6a/handlers/detach_session_handler.c
new file mode 100644
index 0000000..62f26f8
--- /dev/null
+++ b/src/s6a/handlers/detach_session_handler.c
@@ -0,0 +1,235 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <pthread.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdbool.h>
+#include <freeDiameter/freeDiameter-host.h>
+#include <freeDiameter/libfdcore.h>
+#include <freeDiameter/libfdproto.h>
+
+#include "err_codes.h"
+#include "message_queues.h"
+#include "ipc_api.h"
+#include "sec.h"
+#include "s6a_fd.h"
+#include "s6a.h"
+#include "s6a_config.h"
+#include "msgType.h"
+//#include "detach_stage1_info.h"
+
+/************************************************************************
+Current file : Stage  - AIR handler of S6A
+ATTACH stages :
+@@@	Stage 1 : IAM-->[stage1 handler]-->AIR, ULR
+	Stage 2 : AIA, ULA -->[stage2 handler]--> Auth req
+	Stage 3 : Auth resp-->[stage1 handler]-->Sec mode cmd
+	Stage 4 : sec mode resp-->[stage1 handler]-->esm infor req
+	Stage 5 : esm infor resp-->[stage1 handler]-->create session
+	Stage 6 : create session resp-->[stage1 handler]-->init ctx setup
+	Stage 7 : attach complete-->[stage1 handler]-->modify bearer
+**************************************************************************/
+
+/****Globals and externs ***/
+
+static int g_Q_detachread_fd;
+
+/*Making global just to avoid stack passing*/
+
+static char buf[S6A_PURGEREQ_STAGE1_BUF_SIZE];
+
+extern s6a_config g_s6a_cfg;
+extern struct fd_dict_objects g_fd_dict_objs;
+extern struct fd_dict_data g_fd_dict_data;
+/****Global and externs end***/
+
+/**
+Initialize the stage settings, Q,
+destination communication etc.
+*/
+static void
+init_stage()
+{
+	log_msg(LOG_INFO, "Waiting for session detach initialiser  from mme-app\n");
+	if ((g_Q_detachread_fd  = open_ipc_channel(S6A_DTCHREQ_STAGE1_QUEUE, IPC_READ)) == -1){
+		log_msg(LOG_ERROR, "Error in opening reader detach channel.\n");
+		pthread_exit(NULL);
+	}
+	return;
+}
+
+/**
+* Read next message from stage Q for processing.
+*/
+static int
+read_next_msg()
+{
+	int bytes_read=0;
+	memset(buf, 0, S6A_PURGEREQ_STAGE1_BUF_SIZE);
+	while (bytes_read < S6A_PURGEREQ_STAGE1_BUF_SIZE) {//TODO : Recheck condition
+		if ((bytes_read = read_ipc_channel(
+			g_Q_detachread_fd, buf, S6A_PURGEREQ_STAGE1_BUF_SIZE)) == -1) {
+			log_msg(LOG_ERROR, "Error in reading from AIR Q.\n");
+			/* TODO : Add proper error handling */
+		}
+		log_msg(LOG_INFO, "Purge msg received, len - %d\n", bytes_read);
+	}
+	return bytes_read;
+}
+
+/**
+ * @brief Prepare PUR freediameter message, dump and post to HSS
+ * @param[in] ue_idx UE indx to append to session id
+ * @param[in] imsi - IMSI
+ * @return int Sucess or failure code
+ */
+static int
+send_purge(int ue_idx, char imsi[])
+{
+	struct msg *fd_msg = NULL;
+	union avp_value val;
+	struct s6a_sess_info s6a_sess = {.sess_id="", .sess_id_len = 0};
+
+	if(SUCCESS != create_fd_sess_id(&s6a_sess, ue_idx)) return S6A_FD_ERROR;
+
+	CHECK_FCT_DO(fd_msg_new(g_fd_dict_objs.PUR, MSGFL_ALLOC_ETEID, &fd_msg),
+			return S6A_FD_ERROR);
+
+	/*AVP: Session-Id*/
+	val.os.data = (unsigned char*)s6a_sess.sess_id;
+	val.os.len = strlen(s6a_sess.sess_id);
+	add_fd_msg(&val, g_fd_dict_objs.sess_id, &fd_msg);
+
+	/*AVP: Auth-Session-State*/
+	val.i32 = 1; /*NO_STATE_MAINTAINED*/
+	val.os.len = 0;
+	add_fd_msg(&val, g_fd_dict_objs.auth_sess_state, &fd_msg);
+
+	/*AVP: Origin-Host/Realm*/
+	CHECK_FCT_DO(fd_msg_add_origin(fd_msg, 0), return S6A_FD_ERROR);
+
+	/*AVP: Destination-Host*/
+	val.os.data = (unsigned char *)g_s6a_cfg.hss_host_name;
+	val.os.len = strlen(g_s6a_cfg.hss_host_name);
+	add_fd_msg(&val, g_fd_dict_objs.dest_host, &fd_msg);
+
+	/*AVP: Destination-Realm*/
+	val.os.data = (unsigned char*)g_s6a_cfg.realm;
+	val.os.len = strlen(g_s6a_cfg.realm);
+	add_fd_msg(&val, g_fd_dict_objs.dest_realm, &fd_msg);
+
+	/*AVP: User-Name*/
+	val.os.data = (unsigned char*)imsi;
+	val.os.len = strlen(imsi);
+	add_fd_msg(&val, g_fd_dict_objs.user_name, &fd_msg);
+
+	/*AVP: PUR-Flags*/
+	val.u32 = true;
+	val.os.len = 0;
+	add_fd_msg(&val, g_fd_dict_objs.PUR_flags, &fd_msg);
+
+	dump_fd_msg(fd_msg);
+
+	/*Post message to hss*/
+	CHECK_FCT_DO(fd_msg_send(&fd_msg, NULL, NULL), return S6A_FD_ERROR);
+
+	return SUCCESS;
+}
+
+static void
+send_rpc_purge(int ue_idx, char imsi[])
+{
+	/* TODO: For builitn HSS, we are not sending purge request to HSS,
+	 * returning dummy reply. Send request to builtin HSS and
+	 * handle response.
+	 */
+	handle_perf_hss_purge_resp(ue_idx);
+	return;
+}
+
+/**
+* Stage specific message processing.
+*/
+static int
+detach_processing()
+{
+	struct s6a_purge_Q_msg *purge_msg = (struct s6a_purge_Q_msg*)buf;
+	char imsi[16] = {0};
+
+	/*Parse and validate  the buffer*/
+	imsi_bin_to_str(purge_msg->IMSI, imsi);
+	log_msg(LOG_INFO, "IMSI recvd - %s\n", imsi);
+
+	if (HSS_FD == g_s6a_cfg.hss_type)
+		send_purge(purge_msg->ue_idx, imsi);
+	else {
+		log_msg(LOG_INFO, "Sending over IPC \n");
+		send_rpc_purge(purge_msg->ue_idx, imsi);
+	}
+
+	return SUCCESS;
+}
+
+/**
+* Post message to next handler of the stage
+*/
+static int
+post_to_next()
+{
+	return SUCCESS;
+}
+
+/**
+* Thread exit function for future reference.
+*/
+void
+shutdown_detach()
+{
+	close_ipc_channel(g_Q_detachread_fd);
+	log_msg(LOG_INFO, "Shutdown detach handler \n");
+	pthread_exit(NULL);
+	return;
+}
+
+
+/**
+* Thread function for stage.
+*/
+void*
+detach_handler(void *data)
+{
+	init_stage();
+
+	sleep(5);
+
+	log_msg(LOG_INFO, "Detach Q handler ready.\n");
+
+	while(1){
+		read_next_msg();
+
+		detach_processing();
+
+		post_to_next();
+	}
+
+	return NULL;
+}
+
diff --git a/src/s6a/handlers/hss_message_delegator.c b/src/s6a/handlers/hss_message_delegator.c
new file mode 100644
index 0000000..ab7d9a0
--- /dev/null
+++ b/src/s6a/handlers/hss_message_delegator.c
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <arpa/inet.h>
+#include <unistd.h>
+#include <string.h>
+#include <pthread.h>
+
+#include "log.h"
+#include "hss_message.h"
+#include "s6a.h"
+
+/**Global and externs **/
+
+/*Handle all messages coming from in built perf hss*/
+void
+hss_resp_handler(void *message)
+{
+	struct hss_resp_msg *msg = (struct hss_resp_msg*)message;
+
+	log_msg(LOG_INFO, "HSS response msg handler for ue_idx %d\n",
+			msg->ue_idx);
+
+	switch(msg->hdr){
+	case HSS_AIA_MSG:
+		handle_perf_hss_aia(msg->ue_idx,
+				(struct hss_aia_msg *)&(msg->data.aia));
+		break;
+
+	case HSS_ULA_MSG:
+		handle_perf_hss_ula(msg->ue_idx,
+				(struct hss_ula_msg *)&(msg->data.ula));
+		break;
+#if 0
+	case HSS_PURGE_RESP_MSG:
+		handle_perf_hss_purge_resp(msg->ue_idx);
+		break;
+#endif
+	//NI Detach
+	case HSS_CLR_MSG:
+		log_msg(LOG_INFO,"clr msg from TC\n");
+		handle_perf_hss_clr(msg->ue_idx,
+				(struct hss_clr_msg *)&(msg->data.clr));
+		break;
+
+	default:
+		log_msg(LOG_ERROR, "Unknown message received from HSS - %d\n",
+			msg->hdr);
+	}
+	return;
+
+	/*free allocated message buffer*/
+	free(message);
+}
diff --git a/src/s6a/handlers/purge_handler.c b/src/s6a/handlers/purge_handler.c
new file mode 100644
index 0000000..0ffe8e2
--- /dev/null
+++ b/src/s6a/handlers/purge_handler.c
@@ -0,0 +1,132 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <pthread.h>
+#include <string.h>
+#include <unistd.h>
+#include <freeDiameter/freeDiameter-host.h>
+#include <freeDiameter/libfdcore.h>
+#include <freeDiameter/libfdproto.h>
+
+#include "log.h"
+#include "err_codes.h"
+#include "message_queues.h"
+#include "ipc_api.h"
+#include "s6a_fd.h"
+#include "s6a.h"
+#include "msgType.h"
+//#include "detach_stage2_info.h"
+#include "hss_message.h"
+
+/** Global and externs**/
+extern struct fd_dict_objects g_fd_dict_objs;
+extern struct fd_dict_data g_fd_dict_data;
+extern int g_Q_mme_S6a_fd;
+/**global and externs end**/
+
+static
+void send_to_stage2(struct s6_incoming_msg_data_t *incoming_msg_p)
+{
+	/*Send to stage2 queue*/
+	write_ipc_channel(g_Q_mme_S6a_fd, (char*)incoming_msg_p,
+			S6_READ_MSG_BUF_SIZE);
+}
+
+/**
+ * @brief callback handler for purge answer recvd from hss
+ * Parse purge answer, state and do cleanup for freediameter
+ * @params callback std
+ * @return error/success
+ */
+int
+purge_resp_callback(struct msg **buf, struct avp *avps, struct session *sess,
+			void *data, enum disp_action *action)
+{
+	struct msg *resp = NULL;
+	struct avp *avp_ptr = NULL;
+	struct s6_incoming_msg_data_t s6_incoming_msgs;
+	struct avp_hdr *avp_header = NULL;
+	unsigned int sess_id_len;
+	unsigned char *sess_id= NULL;
+
+	resp = *buf;
+
+	dump_fd_msg(resp);
+
+	/*read session id and extract ue index*/
+	CHECK_FCT_DO(fd_sess_getsid(sess, &sess_id, (size_t*)&sess_id_len),
+			return S6A_FD_ERROR);
+	log_msg(LOG_INFO, "\nPurge callback ----- >session id=%s \n",sess_id);
+    
+	s6_incoming_msgs.msg_type = purge_answser;
+	s6_incoming_msgs.ue_idx = get_ue_idx_from_fd_resp(sess_id, sess_id_len);
+
+	/*AVP: Result-Code*/
+	avp_ptr = NULL;
+	fd_msg_search_avp(resp, g_fd_dict_objs.res_code, &avp_ptr);
+
+	if(NULL != avp_ptr) {
+		fd_msg_avp_hdr(avp_ptr, &avp_header);
+		s6_incoming_msgs.msg_data.purge_resp_Q_msg_m.status = avp_header->avp_value->u32;
+
+		if (SUCCESS != s6_incoming_msgs.msg_data.purge_resp_Q_msg_m.status) {
+			s6_incoming_msgs.msg_data.purge_resp_Q_msg_m.status = S6A_FD_ERROR;
+		}
+	} else {
+		struct fd_result res;
+		avp_ptr = NULL;
+
+		fd_msg_search_avp(resp, g_fd_dict_objs.exp_res,
+			&avp_ptr);
+
+		if (NULL != avp_ptr) {
+			s6_incoming_msgs.msg_data.purge_resp_Q_msg_m.status = S6A_FD_ERROR;
+		}
+
+		if (parse_fd_result(avp_ptr, &res) != SUCCESS) {
+			s6_incoming_msgs.msg_data.purge_resp_Q_msg_m.status = S6A_FD_ERROR;
+		}
+		s6_incoming_msgs.msg_data.purge_resp_Q_msg_m.status =res.result_code;
+	}
+
+	/*Inform response to mme-app*/
+	send_to_stage2(&s6_incoming_msgs);
+
+	/*Do cleanup for freediameter*/
+	fd_msg_free(*buf);
+
+	*buf = NULL;
+
+	return SUCCESS;
+}
+
+/*Handler for AIA coming from built in perf HS*/
+void
+handle_perf_hss_purge_resp(int ue_idx)
+{
+	struct s6_incoming_msg_data_t resp;
+    
+	resp.msg_type = purge_answser;
+	resp.ue_idx = ue_idx;
+	resp.msg_data.purge_resp_Q_msg_m.status = 0;
+
+	send_to_stage2(&resp);
+}
diff --git a/src/s6a/handlers/s6a_req_handler.c b/src/s6a/handlers/s6a_req_handler.c
new file mode 100644
index 0000000..8bc361b
--- /dev/null
+++ b/src/s6a/handlers/s6a_req_handler.c
@@ -0,0 +1,346 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <pthread.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdbool.h>
+#include <freeDiameter/freeDiameter-host.h>
+#include <freeDiameter/libfdcore.h>
+#include <freeDiameter/libfdproto.h>
+
+#include "s6a_config.h"
+#include "err_codes.h"
+#include "message_queues.h"
+#include "ipc_api.h"
+#include "sec.h"
+#include "msgType.h"
+//#include "stage1_s6a_msg.h"
+#include "s6a_fd.h"
+#include "s6a.h"
+#include "s6a_config.h"
+#include "hss_message.h"
+
+/************************************************************************
+Current file : Stage  - AIR handler of S6A
+ATTACH stages :
+@@@	Stage 1 : IAM-->[stage1 handler]-->AIR, ULR
+	Stage 2 : AIA, ULA -->[stage2 handler]--> Auth req
+	Stage 3 : Auth resp-->[stage1 handler]-->Sec mode cmd
+	Stage 4 : sec mode resp-->[stage1 handler]-->esm infor req
+	Stage 5 : esm infor resp-->[stage1 handler]-->create session
+	Stage 6 : create session resp-->[stage1 handler]-->init ctx setup
+	Stage 7 : attach complete-->[stage1 handler]-->modify bearer
+**************************************************************************/
+
+/****Globals and externs ***/
+extern int g_our_hss_fd;
+extern s6a_config  g_s6a_cfg;
+extern struct fd_dict_objects g_fd_dict_objs;
+extern struct fd_dict_data g_fd_dict_data;
+/****Global and externs end***/
+
+
+void ulr_intermediate_cb(void * data, struct msg ** msg)
+{
+	dump_fd_msg(*msg);
+}
+
+/**
+ * @brief Prepare ULR freediameter message, dump and post to HSS
+ * @param[in] aia_msg - AIA info recvd from mme-app
+ * @param[in] imsi - IMSI
+ * @return int Sucess or failure code
+ */
+static int
+send_FD_ULR(struct s6a_Q_msg *aia_msg, char imsi[])
+{
+	struct msg *fd_msg = NULL;
+	int res = SUCCESS;
+	struct s6a_sess_info s6a_sess = {.sess_id="", .sess_id_len = 0};
+	char event = 12;
+	union avp_value val;
+
+	/*Create FD header and message for update location request.*/
+	if(SUCCESS != (res = create_fd_sess_id(&s6a_sess, aia_msg->ue_idx)))
+		return res;
+
+	CHECK_FCT_DO(fd_msg_new(g_fd_dict_objs.ULR, MSGFL_ALLOC_ETEID, &fd_msg),
+			return S6A_FD_ERROR)
+
+	/*AVP: Session-Id*/
+	val.os.data = (unsigned char*)s6a_sess.sess_id;
+	val.os.len = strlen(s6a_sess.sess_id);
+	add_fd_msg(&val, g_fd_dict_objs.sess_id, &fd_msg);
+
+	/*AVP: Auth-Session-State*/
+	val.i32 = 1; /*NO_STATE_MAINTAINED*/
+	val.os.len = 0;
+	add_fd_msg(&val, g_fd_dict_objs.auth_sess_state, &fd_msg);
+
+	/*AVP: Origin-Host/Realm*/
+	CHECK_FCT_DO(fd_msg_add_origin(fd_msg, 0), return S6A_FD_ERROR);
+
+	/*AVP: Destination-Host*/
+	val.os.data = (unsigned char*)g_s6a_cfg.hss_host_name;
+	val.os.len = strlen(g_s6a_cfg.hss_host_name);
+	add_fd_msg(&val, g_fd_dict_objs.dest_host, &fd_msg);
+
+	/*AVP: Destination-Realm*/
+	val.os.data = (unsigned char*)g_s6a_cfg.realm;
+	val.os.len = strlen(g_s6a_cfg.realm);
+	add_fd_msg(&val, g_fd_dict_objs.dest_realm, &fd_msg);
+
+	/*AVP: User-Name*/
+	val.os.data = (unsigned char*)imsi;
+	val.os.len = strlen(imsi);
+	add_fd_msg(&val, g_fd_dict_objs.user_name, &fd_msg);
+
+	/*AVP: RAT-Type*/
+	val.u32 = S6A_RAT_EUTRAN;
+	val.os.len = 0;
+	add_fd_msg(&val, g_fd_dict_objs.RAT_type, &fd_msg);
+
+	/*AVP: ULR-Flags*/
+	val.u32 = ULR_FLAG_S6AS6D_IND | ULR_FLAG_INIT_ATCH_IND ;
+	add_fd_msg(&val, g_fd_dict_objs.ULR_flags, &fd_msg);
+
+	/*AVP: Visited-PLMN-Id*/
+	val.os.data = (unsigned char*)aia_msg->tai.plmn_id.idx;
+	val.os.len = 3;
+	add_fd_msg(&val, g_fd_dict_objs.visited_PLMN_id, &fd_msg);
+
+	dump_fd_msg(fd_msg);
+
+	/*Post ULR to HSS*/
+	CHECK_FCT_DO(fd_msg_send(&fd_msg, ulr_intermediate_cb, (void*)&event),
+			return S6A_FD_ERROR);
+
+	return SUCCESS;
+}
+
+
+/**
+ * @brief dump recvd aia queue msg
+ * @param[in] air_msg - IMSI
+ * @return void
+ */
+void
+dump_s6a_msg(struct s6a_Q_msg *air_msg)
+{
+	log_msg(LOG_INFO, "Received index= %d\n",air_msg->ue_idx);
+	log_msg(LOG_INFO, "Received plmn %x %x %x= %d\n",air_msg->tai.plmn_id.idx[0],
+			air_msg->tai.plmn_id.idx[1], air_msg->tai.plmn_id.idx[2]);
+}
+
+/**
+ * @brief Prepare AIR freediameter message, dump and post to HSS
+ * @param[in] aia_msg - AIA info recvd from mme-app
+ * @param[in] imsi - IMSI
+ * @return int Sucess or failure code
+ */
+static int
+send_FD_AIR(struct s6a_Q_msg *aia_msg, char imsi[])
+{
+	struct avp *avp_ptr = NULL;
+	struct msg *fd_msg = NULL;
+	int res = 0;
+	struct s6a_sess_info s6a_sess = {.sess_id="", .sess_id_len = 0};
+	union avp_value val;
+
+	log_msg(LOG_INFO, "In Send AIR:\n");
+	dump_s6a_msg(aia_msg);
+
+	/*Create FD header and message for authentication info request.*/
+	if(SUCCESS != (res = create_fd_sess_id(&s6a_sess, aia_msg->ue_idx)))
+		return res;
+
+	CHECK_FCT_DO(fd_msg_new(g_fd_dict_objs.AIR, MSGFL_ALLOC_ETEID, &fd_msg),
+			return S6A_FD_ERROR);
+
+	/*AVP: Session-Id*/
+	val.os.data = (unsigned char*)s6a_sess.sess_id;
+	val.os.len = strlen(s6a_sess.sess_id);
+	add_fd_msg(&val, g_fd_dict_objs.sess_id, &fd_msg);
+
+	/*AVP: Auth-Session-State*/
+	val.i32 = 1; /*NO_STATE_MAINTAINED*/
+	val.os.len = 0;
+	add_fd_msg(&val, g_fd_dict_objs.auth_sess_state, &fd_msg);
+
+	/*AVP: Origin-Host/Realm*/
+	CHECK_FCT_DO(fd_msg_add_origin(fd_msg, 0), return S6A_FD_ERROR)
+
+	/*AVP: Destination-Host*/
+	val.os.data = (unsigned char*)g_s6a_cfg.hss_host_name;
+	val.os.len = strlen(g_s6a_cfg.hss_host_name);
+	add_fd_msg(&val, g_fd_dict_objs.dest_host, &fd_msg);
+
+	/*AVP: Destination-Realm*/
+	val.os.data = (unsigned char*)g_s6a_cfg.realm;
+	val.os.len = strlen(g_s6a_cfg.realm);
+	add_fd_msg(&val, g_fd_dict_objs.dest_realm, &fd_msg);
+
+	/*AVP: User-Name*/
+	val.os.data = (unsigned char*)imsi;
+	val.os.len = strlen(imsi);
+	add_fd_msg(&val, g_fd_dict_objs.user_name, &fd_msg);
+
+	/*AVP: Visited-PLMN-Id*/
+	val.os.data = (unsigned char*)aia_msg->tai.plmn_id.idx;
+	val.os.len = 3;
+	add_fd_msg(&val, g_fd_dict_objs.visited_PLMN_id, &fd_msg);
+
+	/*TODO: recheck. Can it be grouped better way*/
+	/*AVP: Requested-EUTRAN-Authentication-Info*/
+	CHECK_FCT_DO(fd_msg_avp_new(
+		g_fd_dict_objs.req_EUTRAN_auth_info, 0, &avp_ptr),
+		return -1);
+	CHECK_FCT_DO(fd_msg_avp_add(fd_msg, MSG_BRW_LAST_CHILD, avp_ptr), return -1);
+
+	/*AVP: Requested-EUTRAN-Authentication-Info
+	 *----->AVP: Number-Of-Requested-Vectors(1410)*/
+	val.i32 = 1;
+	val.os.len = 0;
+	add_fd_msg(&val, g_fd_dict_objs.no_of_req_vectors,
+			(struct msg**)&avp_ptr);
+
+	/*AVP: Requested-EUTRAN-Authentication-Info
+	 * ------>AVP: Immediate-Response-Preferred*/
+	val.u32 = 0;
+	add_fd_msg(&val, g_fd_dict_objs.immediate_resp_pref,
+			(struct msg**)&avp_ptr);
+
+	dump_fd_msg(fd_msg);
+
+	/*post AIR to hss */
+	CHECK_FCT_DO(fd_msg_send(&fd_msg, NULL, NULL), return S6A_FD_ERROR);
+
+	return SUCCESS;
+}
+
+/**
+API to send AIR oto customer HSS over custome RPC
+*/
+static void
+send_rpc_AIR(struct s6a_Q_msg *air_msg, char imsi[])
+{
+	struct hss_req_msg msg;
+
+	msg.hdr = HSS_AIR_MSG;
+	msg.ue_idx = air_msg->ue_idx;
+
+	strncpy(msg.data.air.imsi, imsi, IMSI_STR_LEN);
+	memcpy(msg.data.air.plmn_id, air_msg->tai.plmn_id.idx, 3);
+
+	if (write(g_our_hss_fd, &msg, HSS_REQ_MSG_SIZE) < 0) {
+		log_msg(LOG_ERROR, "HSS AIR msg send failed.\n");
+		 		perror("writing on stream socket");
+	}
+	log_msg(LOG_INFO, "AIR msg send to hss for ue_idx %d\n",
+		air_msg->ue_idx);
+}
+
+/**
+API to send ULR oto customer HSS over custome RPC
+*/
+static void
+send_rpc_ULR(struct s6a_Q_msg *ulr_msg, char imsi[])
+{
+	struct hss_req_msg msg;
+
+	msg.hdr = HSS_ULR_MSG;
+	msg.ue_idx = ulr_msg->ue_idx;
+
+	strncpy(msg.data.air.imsi, imsi, IMSI_STR_LEN);
+	memcpy(msg.data.air.plmn_id, ulr_msg->tai.plmn_id.idx, 3);
+
+	if (write(g_our_hss_fd, &msg, HSS_REQ_MSG_SIZE) < 0) {
+		log_msg(LOG_ERROR, "HSS ULR msg send failed.\n");
+		perror("writing on stream socket");
+	}
+	log_msg(LOG_INFO, "ULR msg send to hss\n");
+}
+
+
+/**
+ * @brief convert binary imsi to string imsi
+ * Binary imsi is stored in 8 bytes, each nibble representing each imsi char.
+ * char imsi stroes each char in 1 byte.
+ * @param[in] b_imsi : Binary imsi
+ * @param[out] s_imsi : Converted string imsi
+ * @return void
+ */
+void
+imsi_bin_to_str(unsigned char *b_imsi, char *s_imsi)
+{
+	if(NULL == b_imsi || NULL == s_imsi) return;
+
+	memset(s_imsi, 0, STR_IMSI_LEN);
+
+	/* Byte 'AB' in b_imsi, is converted to two bytes 'A', 'B' in s_imsi*/
+	s_imsi[0] = '0' + ((b_imsi[0]>>4) & 0x0F);
+
+	for(int i=1; i < BINARY_IMSI_LEN; ++i) {
+		s_imsi[(i*2)-1] = '0' + (b_imsi[i] & 0x0F);
+		s_imsi[(i*2)] = '0' + ((b_imsi[i]>>4) & 0x0F);
+	}
+	s_imsi[(BINARY_IMSI_LEN*2)-1] = '\0';
+}
+
+/**
+ * @brief Post AIR and ULR messsages simultaneously to HSS.
+ * @return int Sucess or failure code
+ */
+static int
+AIR_processing(struct s6a_Q_msg * air_msg)
+{
+	log_msg(LOG_INFO, "IMSI recvd - %s\n %d \n", air_msg->imsi, air_msg->msg_type);
+
+	if(HSS_FD == g_s6a_cfg.hss_type) {
+		if(air_msg->msg_type == auth_info_request)
+			/*post to next processing*/
+			send_FD_AIR(air_msg, air_msg->imsi);
+		else if(air_msg->msg_type == update_loc_request)
+			send_FD_ULR(air_msg, air_msg->imsi);
+
+	} else {
+		log_msg(LOG_INFO, "Sending over IPC\n");
+		send_rpc_AIR(air_msg, air_msg->imsi);
+		send_rpc_ULR(air_msg, air_msg->imsi);
+	}
+
+	return SUCCESS;
+}
+
+/*
+* Thread function for stage.
+*/
+void*
+S6Req_handler(void *data)
+{
+	log_msg(LOG_INFO, "AIR Q handler ready.\n");
+
+	char *msg = ((char *) data) + ((sizeof(uint32_t)) * 2);
+	
+	AIR_processing((struct s6a_Q_msg *)msg);
+	
+	return NULL;
+}
diff --git a/src/s6a/handlers/ula_handler.c b/src/s6a/handlers/ula_handler.c
new file mode 100644
index 0000000..e9a49b8
--- /dev/null
+++ b/src/s6a/handlers/ula_handler.c
@@ -0,0 +1,240 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdbool.h>
+#include <ctype.h>
+#include <freeDiameter/freeDiameter-host.h>
+#include <freeDiameter/libfdproto.h>
+#include <freeDiameter/libfdcore.h>
+
+#include "log.h"
+#include "err_codes.h"
+#include "message_queues.h"
+#include "ipc_api.h"
+#include "s6a_fd.h"
+#include "s6a.h"
+#include "msgType.h"
+//#include "stage1_s6a_msg.h"
+#include "hss_message.h"
+
+extern int g_Q_mme_S6a_fd;
+extern struct fd_dict_objects g_fd_dict_objs;
+extern struct fd_dict_data g_fd_dict_data;
+
+/**
+ * @brief Parse subscription information for UE
+ * @param[in] avp_ptr - POinter to subscription data avp
+ * @param[out] ula information filled with parsed data
+ * @return void
+ */
+static void
+parse_ula_subscription_data(struct avp *avp_ptr, struct ula_Q_msg *ula)
+{
+	struct avp *next = NULL;
+	struct avp_hdr *element = NULL;
+
+    CHECK_FCT_DO(fd_msg_avp_hdr(avp_ptr, &element),
+                        return);
+
+    if ((NULL == element) ||
+           (element->avp_code != g_fd_dict_data.subscription_data.avp_code))
+        return;
+
+    CHECK_FCT_DO(fd_msg_browse(avp_ptr, MSG_BRW_FIRST_CHILD, &next, NULL),
+                    return);
+
+	for(;
+		NULL != next;
+		fd_msg_browse(next, MSG_BRW_NEXT, &next, NULL)) {
+
+		fd_msg_avp_hdr (next, &element);
+
+		if(NULL == element) return;
+
+		/*AVP: Access-Restriction-Data(1426)*/
+		if(g_fd_dict_data.access_restriction_data.avp_code ==
+				element->avp_code) {
+			ula->access_restriction_data = element->avp_value->u32;
+			continue;
+		}
+
+		/*AVP: Subscriber-Status(1424)*/
+		if(g_fd_dict_data.subscriber_status.avp_code == element->avp_code) {
+			ula->subscription_status = element->avp_value->i32;
+			continue;
+		}
+
+		/*AVP: Network-Access-Mode(1417)*/
+		if(g_fd_dict_data.net_access_mode.avp_code == element->avp_code) {
+			ula->net_access_mode = element->avp_value->i32;
+			continue;
+		}
+
+		/*AVP: Regional-Subscription-Zone-Code(1446)*/
+		if(g_fd_dict_data.reg_subs_zone_code.avp_code ==
+				element->avp_code) {
+			//element->avp_value : 10 string values of len 4
+			continue;
+		}
+
+		/*AVP: MSISDN(701)*/
+		if(g_fd_dict_data.MSISDN.avp_code == element->avp_code) {
+			memcpy(ula->MSISDN, element->avp_value->os.data, element->avp_value->os.len);
+			continue;
+		}
+
+		/*AVP: AMBR(1435)*/
+			/*AVP: Max-Requested-Bandwidth-UL(516)
+			  AVP: Max-Requested-Bandwidth-DL(515*/
+		if(g_fd_dict_data.AMBR.avp_code == element->avp_code) {
+			/*AMBR has its own child elements, iterate through those*/
+			struct avp *ambr_itr = NULL;
+			struct avp_hdr *ambr_element = NULL;
+
+			CHECK_FCT_DO(fd_msg_browse(next, MSG_BRW_FIRST_CHILD,
+						&ambr_itr, NULL), return);
+
+			/*Iterate through subscription data child avps*/
+			while(NULL != ambr_itr) {
+				fd_msg_avp_hdr(ambr_itr, &ambr_element);
+
+				if(g_fd_dict_data.max_req_bandwidth_UL.avp_code ==
+						ambr_element->avp_code) {
+					ula->max_requested_bw_ul = ambr_element->avp_value->u32;
+				}
+
+				if(g_fd_dict_data.max_req_bandwidth_DL.avp_code ==
+						ambr_element->avp_code) {
+					ula->max_requested_bw_dl = ambr_element->avp_value->u32;
+				}
+
+				CHECK_FCT_DO(fd_msg_browse(ambr_itr, MSG_BRW_NEXT,
+						&ambr_itr, NULL), return);
+			}
+			continue;
+		}
+
+		/*AVP: APN-Configuration-Profile(1429)*/
+			/*AVP: Context-Identifier(1423)
+			AVP: All-APN-Configurations-Included-Indicator(1428)
+			AVP: APN-Configuration(1430)*/
+		if(g_fd_dict_data.APN_config_profile.avp_code == element->avp_code) {
+			/*APN profile has its own child elements, iterate through
+			 * those*/
+			struct avp *apn_cfg_prof_itr = NULL;
+			struct avp_hdr *apn_cfg_element = NULL;
+
+			CHECK_FCT_DO(fd_msg_browse(next, MSG_BRW_FIRST_CHILD,
+						&apn_cfg_prof_itr, NULL), return);
+
+			/*Iterate through subscription data child avps*/
+			while(NULL != apn_cfg_prof_itr) {
+				fd_msg_avp_hdr(apn_cfg_prof_itr, &apn_cfg_element);
+
+				if(g_fd_dict_data.ctx_id.avp_code ==
+						apn_cfg_element->avp_code) {
+					ula->apn_config_profile_ctx_id =
+						apn_cfg_element->avp_value->u32;
+				} else
+				if(g_fd_dict_data.all_APN_configs_included_ind.avp_code ==
+						apn_cfg_element->avp_code) {
+					ula->all_APN_cfg_included_ind =
+						apn_cfg_element->avp_value->i32;
+				} else
+				if(g_fd_dict_data.APN_config.avp_code ==
+						apn_cfg_element->avp_code){
+					//APN configuration list : There is list of elements to read
+					//TODO : Write function to read all elements
+
+				}
+
+				CHECK_FCT_DO(fd_msg_browse(apn_cfg_prof_itr, MSG_BRW_NEXT,
+						&apn_cfg_prof_itr, NULL), return);
+			}
+			continue;
+		}
+
+		/*AVP: Subscribed-Periodic-RAU-TAU-Timer(1619)*/
+		if(g_fd_dict_data.subsc_periodic_RAU_TAU_tmr.avp_code
+				== element->avp_code) {
+			ula->RAU_TAU_timer = element->avp_value->u32;
+			continue;
+		}
+
+	}
+}
+
+/**
+ * @brief Call back registered to handle ULA from hss
+ * @param callback requiremd arguments
+ * @return int error code as success or failure
+ */
+int
+ula_resp_callback(struct msg **buf, struct avp *avp_ptr, struct session *sess,
+			void *data, enum disp_action *action)
+{
+	int sess_id_len, ue_idx;
+	unsigned char *sess_id= NULL;
+	struct s6_incoming_msg_data_t s6_incoming_msgs;
+	struct avp *subsc_ptr = NULL;
+
+	CHECK_FCT_DO(fd_sess_getsid(sess, &sess_id, (size_t*)&sess_id_len),
+		return S6A_FD_ERROR);
+
+	log_msg(LOG_INFO, "\nCallback ----- >session id=%s \n", sess_id);
+
+	s6_incoming_msgs.msg_data.ula_Q_msg_m.res = SUCCESS;
+	ue_idx = get_ue_idx_from_fd_resp(sess_id, sess_id_len);
+
+	/*AVP: Subscription-Data(1400)*/
+	fd_msg_search_avp(*buf, g_fd_dict_objs.subscription_data, &subsc_ptr);
+
+	/*Parse fd message and extract ula information*/
+	if(NULL != subsc_ptr) parse_ula_subscription_data(subsc_ptr, &s6_incoming_msgs.msg_data.ula_Q_msg_m);
+
+	fd_msg_free(*buf);
+	*buf = NULL;
+    
+	s6_incoming_msgs.msg_type = update_loc_answer;
+	s6_incoming_msgs.ue_idx = ue_idx;
+
+	s6_incoming_msgs.destInstAddr = htonl(mmeAppInstanceNum_c);
+	s6_incoming_msgs.srcInstAddr = htonl(s6AppInstanceNum_c);
+
+	/*Send to stage2 queue*/
+	send_tipc_message(g_Q_mme_S6a_fd, mmeAppInstanceNum_c, (char*)&s6_incoming_msgs, S6_READ_MSG_BUF_SIZE);
+
+	return SUCCESS;
+}
+
+/*Handler for ULA coming from built in perf HS*/
+void
+handle_perf_hss_ula(int ue_idx, struct hss_ula_msg *ula)
+{
+	struct s6_incoming_msg_data_t msg;
+    
+	msg.msg_type = update_loc_answer;
+	msg.ue_idx = ue_idx;
+	msg.msg_data.ula_Q_msg_m.res = ula->subscription_state;
+	/*Send to stage2 queue*/
+	write_ipc_channel(g_Q_mme_S6a_fd, (char*)&msg, S6_READ_MSG_BUF_SIZE);
+}
diff --git a/src/s6a/json_config.c b/src/s6a/json_config.c
new file mode 100644
index 0000000..01804fa
--- /dev/null
+++ b/src/s6a/json_config.c
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+#include <string.h>
+
+#include "json_data.h"
+#include "s6a_config.h"
+#include "err_codes.h"
+
+/**Globals and externs**/
+s6a_config g_s6a_cfg;
+/**Globals and externs**/
+
+/**
+ * @brief Initialize json parser and file reading
+ * @param  Path to json file
+ * @return void
+ */
+void
+init_parser(char *path)
+{
+	load_json(path);
+}
+
+/**
+ * @brief Read s6a configuration parameters from input json
+ * @param  None
+ * @return int - Success or fail
+ */
+int
+parse_s6a_conf()
+{
+	/*Read s11 config information*/
+	char *tmp = get_string_scalar("s6a.hss_type");
+	if(NULL == tmp) return E_FAIL;
+	if(!strcmp(tmp, "freediameter")) g_s6a_cfg.hss_type = HSS_FD;
+	else g_s6a_cfg.hss_type = HSS_PERF;
+	free(tmp);
+
+	g_s6a_cfg.hss_host_name = get_string_scalar("s6a.host_name");
+	if( NULL == g_s6a_cfg.hss_host_name) return E_FAIL;
+
+	g_s6a_cfg.realm = get_string_scalar("s6a.realm");
+	if(NULL == g_s6a_cfg.realm) return E_FAIL;
+
+	return SUCCESS;
+}
diff --git a/src/s6a/main.c b/src/s6a/main.c
new file mode 100644
index 0000000..9d851e3
--- /dev/null
+++ b/src/s6a/main.c
@@ -0,0 +1,288 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <stdio.h>
+
+#include <freeDiameter/freeDiameter-host.h>
+#include <freeDiameter/libfdcore.h>
+#include <freeDiameter/libfdproto.h>
+#include "s6a_config.h"
+#include "s6a.h"
+#include "s6a_fd.h"
+#include "err_codes.h"
+#include "message_queues.h"
+#include "ipc_api.h"
+#include "hss_message.h"
+#include "thread_pool.h"
+#include <sys/types.h>
+
+/**Globals and externs**/
+struct fd_dict_objects g_fd_dict_objs;
+struct fd_dict_data g_fd_dict_data;
+int g_Q_mme_S6a_fd;
+
+int g_our_hss_fd;
+struct thread_pool *g_tpool;
+extern s6a_config g_s6a_cfg;
+
+pthread_t g_AIR_handler_tid, g_ULR_handler_tid;
+pthread_t g_detach_handler_tid;
+pthread_t g_our_hss_tid;
+
+extern char processName[255];
+extern int pid;
+
+int ipc_reader_tipc_s6;
+
+extern void*
+S6Req_handler(void *data);
+
+/**Globals and externs**/
+
+/**
+ * @brief Initialize communication channel IPC or IPC to non freediameter HSS
+ * ready
+ * @param  None
+ * @return void
+ */
+void
+init_hss_rpc()
+{
+	struct sockaddr_un hss_serv;
+
+	g_our_hss_fd = socket(AF_UNIX, SOCK_STREAM, 0);
+	if (g_our_hss_fd < 0) {
+		log_msg(LOG_ERROR, "HSS socket creation failed.\n");
+		perror("Error opening HSS socket");
+		exit(-1);
+	}
+
+	hss_serv.sun_family = AF_UNIX;
+	strcpy(hss_serv.sun_path, g_s6a_cfg.hss_ipc_endpt);
+
+	if (connect(g_our_hss_fd, (struct sockaddr *)&hss_serv,
+	sizeof(struct sockaddr_un)) < 0) {
+		log_msg(LOG_ERROR, "HSS connect failed.\n");
+		perror("connecting HSS socket");
+		close(g_our_hss_fd);
+		exit(-1);
+	}
+	log_msg(LOG_INFO, "Connected to HSS\n");
+}
+
+/**
+ * @brief Initialize freediameter library, dictionary and data elements
+ * ready
+ * @param  None
+ * @return int SUCCESS or S6A_FD_ERROR
+ */
+static int
+init_fd()
+{
+	log_msg(LOG_INFO, "INIT FD .. .\n");
+
+	/* Initialize the core freeDiameter library */
+	CHECK_FCT_DO(fd_core_initialize(), return S6A_FD_ERROR);
+
+	/* Parse the configuration file */
+	CHECK_FCT_DO(fd_core_parseconf(S6A_FD_CONF), return S6A_FD_ERROR);
+
+	if(SUCCESS != s6a_fd_init()) exit(S6A_FD_ERROR);
+
+	if(SUCCESS != s6a_fd_objs_init()) exit(S6A_FD_ERROR);
+
+	if(SUCCESS != s6a_fd_data_init()) exit(S6A_FD_ERROR);
+
+	if(SUCCESS != s6a_fd_cb_reg()) exit(S6A_FD_ERROR);
+
+	CHECK_FCT_DO( fd_core_start(), return S6A_FD_ERROR);
+
+	return SUCCESS;
+}
+
+/**
+ * @brief Unused
+ * ready
+ * @param
+ * @return i
+ */
+static void
+check_args(int argc, char **argv)
+{
+	/*Parsse arguments to extract file path*/
+	/*If no file path mentioned then use default*/
+	/*For wrong arguments print help*/
+	return;
+}
+
+void * AIR_handler(void * data)
+{
+	int bytesRead = 0;
+	while (1)
+	{
+		unsigned char buffer[255] = {0};
+		if ((bytesRead = read_tipc_msg(ipc_reader_tipc_s6, buffer, 255)) > 0)
+		{
+			unsigned char *tmpBuf = (unsigned char *) malloc(sizeof(char) * bytesRead);
+			memcpy(tmpBuf, buffer, bytesRead);
+			log_msg(LOG_INFO, "S6 message received from mme-app");
+			S6Req_handler(tmpBuf);
+			free(tmpBuf);
+			memset(buffer, 0, 255);
+		}
+	}
+}
+
+/**
+ * @brief Initialize s6a application message handlers
+ * ready
+ * @param None
+ * @return int SUCCESS or FAIL
+ */
+static int
+init_handlers()
+{
+	if ((ipc_reader_tipc_s6 = create_tipc_socket()) <= 0)
+	{
+		log_msg(LOG_ERROR, "Failed to create IPC Reader tipc socket \n");
+		return -E_FAIL;
+	}
+	if ( bind_tipc_socket(ipc_reader_tipc_s6, s6AppInstanceNum_c) != 1)
+	{
+		log_msg(LOG_ERROR, "failed to bind port name %s\n", strerror(errno));
+		return -E_FAIL;
+	}
+
+	pthread_attr_t attr;
+
+	pthread_attr_init(&attr);
+	/* set the thread detach state */
+	pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+
+	pthread_create(&g_AIR_handler_tid, &attr, &AIR_handler, NULL);
+
+	pthread_attr_destroy(&attr);
+	return 0;
+}
+
+/**
+ * @brief initialize s6a application IPC mechanism, queues
+ * ready
+ * @param None
+ * @return int as SUCCESS or FAIL. exit() in case of error.
+ */
+static int
+init_s6a_ipc()
+{
+	g_Q_mme_S6a_fd = create_tipc_socket();
+	if (g_Q_mme_S6a_fd == -1) {
+		log_msg(LOG_ERROR, "Error in opening writer IPC channel\n");
+		pthread_exit(NULL);
+	}
+	log_msg(LOG_INFO, "S6a response - mme-app TIPC: Connected.\n");
+
+	return 0;
+}
+
+/**
+ * @brief HSS message listener. Listen hss response and delegate to thread pool
+ * case of dummy hss
+ * ready
+ * @param None
+ * @return void
+ */
+void
+s6a_run()
+{
+	unsigned char buf[HSS_RCV_BUF_SIZE];
+	int len;
+
+	/*If using in build perf-hss then start thread to handle it's responses*/
+	if(HSS_FD == g_s6a_cfg.hss_type) {
+		/*Use main thread for ULR or stats etc.*/
+		while(1) {
+			sleep(10);
+		}
+	} else {
+
+	while(1) {
+		bzero(buf, sizeof(buf));
+
+		if ((len = read(g_our_hss_fd, buf,
+						sizeof(struct hss_resp_msg))) < 0) {
+			log_msg(LOG_ERROR, "Error reading hss buff\n");
+	                perror("reading stream message");
+			exit(-1);
+		} else if (len == 0) {
+			log_msg(LOG_ERROR, "Error reading hss buff\n");
+	                perror("reading stream message");
+			exit(-1);
+		}else {
+			unsigned char *tmp_buf = (unsigned char *)
+					calloc(sizeof(char), len);
+			memcpy(tmp_buf, buf, len);
+			log_msg(LOG_INFO, "HSS Received msg len : %d \n",len);
+			insert_job(g_tpool, hss_resp_handler, tmp_buf);
+		}
+	}
+	} /*else - HSS_PERF*/
+}
+
+/**
+ * brief main for s6a application
+ * @param argc and argv
+ * @return int - program's exit code
+ */
+int
+main(int argc, char **argv)
+{
+        
+	memcpy (processName, argv[0], strlen(argv[0]));
+	pid = getpid();
+
+	/*Check cmd line arguments for config file path*/
+	check_args(argc, argv);
+	
+	init_parser("conf/s6a.json");
+	parse_s6a_conf();
+
+	if(HSS_FD == g_s6a_cfg.hss_type){
+		/*Initialize free diameter*/
+		init_fd();
+	} else {
+		init_hss_rpc();
+		/* Initialize thread pool for handling HSS resp*/
+		g_tpool = thread_pool_new(HSS_RESP_THREADPOOL_SIZE);
+		if (g_tpool == NULL) {
+			log_msg(LOG_ERROR, "Error in creating thread pool. \n");
+			return -1;
+		}
+	}
+
+	init_s6a_ipc();
+
+	/*Initialize listner for AIR and ULR from mme-app*/
+	init_handlers();
+
+	s6a_run();
+
+	return 0;
+}
diff --git a/src/stateMachineFwk/Makefile b/src/stateMachineFwk/Makefile
new file mode 100644
index 0000000..a7a88bb
--- /dev/null
+++ b/src/stateMachineFwk/Makefile
@@ -0,0 +1,64 @@
+#
+# Copyright (c) 2019, Infosys Ltd.
+#
+# 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.
+#
+
+include ../../Makefile.common
+
+CC := g++
+CFLAGS += -std=c++11
+
+ifeq ($(DEBUG),true)
+        CFLAGS += -g
+endif
+
+ifeq ($(DEBUG),false)
+        CFLAGS += -O3
+endif
+
+SM_LIBNAME = $(LIBDIR)/libstatemachinefwk.so
+
+SRCS := \
+	./actionTable.cpp  \
+	./controlBlock.cpp \
+	./event.cpp  \
+	./permDataBlock.cpp \
+	./procedureQueue.cpp \
+	./state.cpp \
+	./stateMachineEngine.cpp \
+	./tempDataBlock.cpp
+
+SRCDIR := .
+OBJECTS := $(patsubst $(SRCDIR)/%,$(OBJDIR)/stateMachineFwk/%,$(SRCS:.cpp=.o)) 
+
+buildSmLIB: $(OBJECTS)
+	@echo "Linking"
+	@mkdir -p $(LIBDIR)
+	$(CC) $(CFLAGS) $(OBJECTS) -shared -o $(SM_LIBNAME)
+
+$(OBJECTS) : $(OBJDIR)/stateMachineFwk/%.o : $(SRCDIR)/%.cpp
+	@mkdir -p $(OBJDIR)/stateMachineFwk
+	$(CC) $(CFLAGS) $(INC_DIRS) -fPIC -c -o $@ $<
+
+all: buildSmLIB
+
+install:all
+	-@echo "Installing"
+	-@mkdir -p $(TARGET_DIR)/lib
+	-@cp $(SM_LIBNAME) $(TARGET_DIR)/lib
+
+clean:
+	@echo " Cleaning...";
+	-@rm -rf $(OBJDIR)/stateMachineFwk $(SM_LIBNAME)
+
diff --git a/src/stateMachineFwk/actionTable.cpp b/src/stateMachineFwk/actionTable.cpp
new file mode 100644
index 0000000..63b1ace
--- /dev/null
+++ b/src/stateMachineFwk/actionTable.cpp
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <iostream>
+#include "controlBlock.h"
+#include "actionTable.h"
+#include "state.h"
+#include "log.h"
+
+using namespace std;
+
+namespace SM
+{
+
+	ActionTable::ActionTable()
+		:nextStatep(NULL)
+	{
+	}
+
+	ActionTable::~ActionTable()
+	{
+	}
+
+	ActStatus ActionTable::executeActions(ControlBlock& cb)
+	{
+		ActStatus rt = PROCEED;
+		for(auto it = actionsQ.begin(); it != actionsQ.end(); it++)
+		{
+			ActStatus ret = (*it)(cb);
+			if(PROCEED != ret)
+			{
+				// TODO: error handling
+				break;
+			}
+		}
+
+		if (PROCEED == rt &&
+				nextStatep != NULL)
+		{
+			cb.setNextState(nextStatep);
+		}
+
+		return rt;
+	}
+
+	void ActionTable::addAction(ActionPointer act)
+	{
+		actionsQ.push_back(act);
+	}
+
+	void ActionTable::setNextState(State* st)
+	{
+		nextStatep = st;
+	}
+
+	void ActionTable::display()
+	{
+		if(NULL != nextStatep)
+		{
+			log_msg(LOG_DEBUG,"\nnext State : - %d \n",nextStatep->getStateId());
+		}
+	}
+}	
diff --git a/src/stateMachineFwk/controlBlock.cpp b/src/stateMachineFwk/controlBlock.cpp
new file mode 100644
index 0000000..1c41139
--- /dev/null
+++ b/src/stateMachineFwk/controlBlock.cpp
@@ -0,0 +1,220 @@
+/*
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <iostream>
+#include <string>
+#include "controlBlock.h"
+#include "event.h"
+#include "log.h"
+#include "tempDataBlock.h"
+#include <stateMachineEngine.h>
+
+using namespace std;
+
+namespace SM
+{
+	uint32_t ControlBlock::controlBlockArrayIdx = 0;
+
+	ControlBlock::ControlBlock():mutex_m(), cbIndex_m(++controlBlockArrayIdx),
+	        cbState_m(FREE), data_p(NULL), pdb_mp(NULL),
+	        tdb_mp(NULL), inProcQueue_m(false)
+	{
+        for (int i = 0; i < MAX_FAST_BLOCK_IDX; i++)
+            fadb_mpa[i] = NULL;
+
+        std::queue<Event> emptyQ;
+        std::swap( eventQ, emptyQ );
+
+        std::deque<debugEventInfo> emptyDQ;
+        std::swap(debugEventInfoQ, emptyDQ);
+	}
+
+	void ControlBlock::reset()
+	{
+		std::lock_guard<std::mutex> lock(mutex_m);
+
+		cbState_m = FREE;
+
+		data_p = NULL;
+		pdb_mp = NULL;
+
+		for (int i = 0; i < MAX_FAST_BLOCK_IDX; i++)
+			fadb_mpa[i] = NULL;
+
+		tdb_mp = NULL;
+
+		inProcQueue_m = false;
+
+		std::queue<Event> emptyQ;
+		std::swap( eventQ, emptyQ );
+
+		std::deque<debugEventInfo> emptyDQ;
+		std::swap(debugEventInfoQ, emptyDQ);
+	}
+
+	ControlBlock::~ControlBlock()
+	{
+	}
+
+	bool ControlBlock::getCurrentEvent(Event &evt)
+	{
+		std::lock_guard<std::mutex> lock(mutex_m);
+
+		if(eventQ.empty())
+			return false;
+
+		evt = eventQ.front();
+		eventQ.pop();
+
+		setMsgData(evt.getEventData());
+
+		return true;
+	}
+    
+	State* ControlBlock::getCurrentState()
+	{
+		return tdb_mp->getCurrentState();
+	}
+      
+	void ControlBlock::display()
+	{
+		log_msg(LOG_DEBUG,"Displaying control block");
+
+		pdb_mp->display();
+
+		tdb_mp->display();
+
+	}
+
+	void ControlBlock::addEventToProcQ(Event &event)
+	{
+		std::lock_guard<std::mutex> lock(mutex_m);
+
+		if (cbState_m == ALLOCATED)
+		{
+		    eventQ.push(event);
+		    if (inProcQueue_m == false)
+		    {
+		        inProcQueue_m = true;
+		        if (!SM::StateMachineEngine::Instance()->addCBToProcQ(this))
+		        {
+		            inProcQueue_m = false;
+		        }
+		    }
+		}
+	}
+
+	void ControlBlock::setNextState(State* state)
+	{
+		if (tdb_mp != NULL)
+			tdb_mp->setNextState(state);
+	}
+
+	PermDataBlock* ControlBlock::getFastAccessBlock(unsigned short idx) const
+	{
+		PermDataBlock* permBlock_p = NULL;
+
+		if (idx < ControlBlock::MAX_FAST_BLOCK_IDX)
+			permBlock_p = fadb_mpa[idx];
+
+		return permBlock_p;
+	}
+
+	void ControlBlock::setFastAccessBlock(
+		PermDataBlock* pdb_p, unsigned short idx)
+	{
+		if (idx < ControlBlock::MAX_FAST_BLOCK_IDX)
+			fadb_mpa[idx] = pdb_p;
+	}
+
+	PermDataBlock* ControlBlock::getPermDataBlock() const
+	{
+		return pdb_mp;
+	}
+
+	void ControlBlock::setPermDataBlock(PermDataBlock* pdb_p)
+	{
+		pdb_mp = pdb_p;
+	}
+
+    TempDataBlock* ControlBlock::getTempDataBlock() const
+    {
+    	return tdb_mp;
+    }
+
+    void ControlBlock::setTempDataBlock(TempDataBlock* tdb_p)
+    {
+    	if (tdb_p == NULL)
+    		return;
+
+    	tdb_mp = tdb_p;
+    }
+
+    void ControlBlock::setCurrentTempDataBlock(TempDataBlock* tdb_p)
+    {
+    	if (tdb_p == NULL)
+    		return;
+
+        if (tdb_mp != NULL)
+        {
+        	tdb_p->setNextTempDataBlock(tdb_mp);
+        }
+
+    	tdb_mp = tdb_p;
+    }	
+	
+	void ControlBlock::addDebugInfo(debugEventInfo& eventInfo)
+	{
+		if(debugEventInfoQ.size()>=10)
+		{
+			debugEventInfoQ.pop_front();
+		}
+		debugEventInfoQ.push_back(eventInfo);
+	}
+
+	uint32_t ControlBlock::getCBIndex()
+	{
+		return cbIndex_m;
+	}
+
+    void ControlBlock::setControlBlockState(ControlBlockState state)
+    {
+        std::lock_guard<std::mutex> lock(mutex_m);
+        
+        log_msg(LOG_INFO, "CB state transition from %d to %d\n", cbState_m, state);
+
+        cbState_m = state;
+    }
+
+    ControlBlockState ControlBlock::getControlBlockState()
+    {
+        std::lock_guard<std::mutex> lock(mutex_m);
+
+        return cbState_m;
+    }
+
+    void ControlBlock::setProcQueueFlag(bool flag)
+    {
+        std::lock_guard<std::mutex> lock(mutex_m);
+        inProcQueue_m = flag;
+    }
+
+    bool ControlBlock::isInProcQueue()
+    {
+        std::lock_guard<std::mutex> lock(mutex_m);
+        return inProcQueue_m;
+    }
+}
diff --git a/src/stateMachineFwk/event.cpp b/src/stateMachineFwk/event.cpp
new file mode 100644
index 0000000..6f49536
--- /dev/null
+++ b/src/stateMachineFwk/event.cpp
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <iostream>
+#include "event.h"
+#include "log.h"
+
+using namespace std;
+
+namespace SM
+{
+	Event::Event():
+		eventID(), eventData_p(NULL)
+	{
+	}
+
+	Event::Event(Event_e evtID, void* ptr)
+	  	:eventID(evtID), eventData_p(ptr)
+	{
+	}
+
+	Event::~Event()
+	{
+	}
+
+	void *Event::getEventData() const
+	{
+		return eventData_p;
+	}
+
+	void Event::display()
+	{
+        	log_msg(LOG_DEBUG,"Event ID - %d",eventID);
+	}
+}
diff --git a/src/stateMachineFwk/permDataBlock.cpp b/src/stateMachineFwk/permDataBlock.cpp
new file mode 100644
index 0000000..4a30bd5
--- /dev/null
+++ b/src/stateMachineFwk/permDataBlock.cpp
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <iostream>
+#include "permDataBlock.h"
+#include "log.h"
+
+using namespace std;
+namespace SM
+{
+PermDataBlock::PermDataBlock()
+			  :contextID(0)
+{
+}
+
+PermDataBlock::~PermDataBlock()
+{
+}
+
+void PermDataBlock::display()
+{
+	// Display all data fields
+	log_msg(LOG_DEBUG,"\nContext ID - %d \n",contextID);
+}
+}
+
diff --git a/src/stateMachineFwk/procedureQueue.cpp b/src/stateMachineFwk/procedureQueue.cpp
new file mode 100644
index 0000000..ac56a0c
--- /dev/null
+++ b/src/stateMachineFwk/procedureQueue.cpp
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <bits/stdc++.h>
+#include <iostream>
+#include <sys/ipc.h> 
+#include <sys/shm.h> 
+#include "procedureQueue.h"
+#include "controlBlock.h"
+
+namespace SM
+{
+const size_t PROC_QUE_MAX_SIZE = 1000;
+
+ProcedureQueue::ProcedureQueue():cbQ(), mutex_m()
+{
+	sem_init(&pop_semaphore, 0, 0);
+}
+
+ProcedureQueue::~ProcedureQueue()
+{
+    queue<ControlBlock*> q;
+    swap( cbQ, q);
+    sem_destroy(&pop_semaphore);
+}
+
+ControlBlock* ProcedureQueue::pop()
+{
+	sem_wait(&pop_semaphore);
+
+	std::lock_guard<std::mutex> lock(mutex_m);
+
+	ControlBlock* cb = NULL;
+
+	if(cbQ.empty())
+	{
+		return NULL;
+	}
+
+	cb = cbQ.front();
+	cbQ.pop();
+
+	return cb;
+}
+
+bool ProcedureQueue::push(ControlBlock* cb)
+{
+	std::lock_guard<std::mutex> lock(mutex_m);
+
+	if(PROC_QUE_MAX_SIZE == cbQ.size())
+	{
+		return false;
+	}
+
+	cbQ.push(cb);
+	sem_post(&pop_semaphore);
+
+	return true;
+}
+}
diff --git a/src/stateMachineFwk/state.cpp b/src/stateMachineFwk/state.cpp
new file mode 100644
index 0000000..007ba43
--- /dev/null
+++ b/src/stateMachineFwk/state.cpp
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <string>
+#include <iostream>
+#include "state.h"
+#include "actionTable.h"
+#include "smTypes.h"
+#include "log.h"
+
+using namespace std;
+
+
+namespace SM
+{
+	State::State(State_e sID)
+	      :stateID(sID),
+	       eventToActionsMap()
+	{
+	}
+
+	State::~State()
+	{
+	}
+
+	void State::display()	
+	{
+		for(auto& eventToActionsMapEntry : eventToActionsMap)
+		{
+			log_msg(LOG_DEBUG, "Event Id = %d \n", eventToActionsMapEntry.first);
+			ActionTable& act = eventToActionsMapEntry.second;
+			act.display();
+		}
+	}
+
+	ActStatus State::executeActions(Event_e evt,ControlBlock& cb)
+	{
+		EventToActionTableMap::iterator itr = eventToActionsMap.find(evt);
+
+		if (itr != eventToActionsMap.end())
+		{
+			ActionTable& actions_r = itr->second;
+			return actions_r.executeActions(cb);
+		}
+		else
+			return ActStatus::HALT;
+	}
+}
diff --git a/src/stateMachineFwk/stateMachineEngine.cpp b/src/stateMachineFwk/stateMachineEngine.cpp
new file mode 100644
index 0000000..79bfa2c
--- /dev/null
+++ b/src/stateMachineFwk/stateMachineEngine.cpp
@@ -0,0 +1,112 @@
+/*
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include <iostream>
+#include <time.h>
+#include <msgBuffer.h>
+#include "stateMachineEngine.h"
+#include "controlBlock.h"
+#include "event.h"
+#include "state.h"
+#include "smTypes.h"
+extern "C"
+{
+    #include "log.h"
+}
+using namespace std;
+
+namespace SM
+{
+	StateMachineEngine::StateMachineEngine():
+		procQ_m()
+	{
+	}
+
+	
+	StateMachineEngine::~StateMachineEngine()
+	{
+	}
+
+	
+	StateMachineEngine* StateMachineEngine::Instance()
+	{
+		static StateMachineEngine SM;
+		return &SM;
+	}
+	
+	
+	bool StateMachineEngine::addCBToProcQ(ControlBlock* cb)
+	{
+            return procQ_m.push(cb);
+	}
+
+	void StateMachineEngine::run()
+	{
+		ControlBlock* cb = procQ_m.pop();
+
+		if(cb == NULL)
+			return;
+
+		if (cb->getControlBlockState() == FREE)
+		{
+		    log_msg(LOG_INFO, "Control block is freed\n");
+		    return;
+		}
+
+		while (true)
+		{
+			Event currentEvent;
+			if (cb->getCurrentEvent(currentEvent) == false)
+			{
+				break;
+			}
+
+			State *currentState_p = cb->getCurrentState();
+			if (currentState_p == NULL)
+			{
+				log_msg(LOG_INFO, "Current state is NULL"
+						" for control block idx %d\n", cb->getCBIndex());
+
+				// TODO: free event msg data or cleaner handling
+
+				break;;
+			}
+
+			log_msg(LOG_DEBUG,
+					"################ Executing actions for event: %s and State: %s #################\n",
+					 Events[currentEvent.getEventId()], States[currentState_p->getStateId()]);
+
+			time_t mytime = time(NULL);
+			debugEventInfo dEventInfo(currentEvent.getEventId(), currentState_p->getStateId(), mytime);
+			cb->addDebugInfo(dEventInfo);
+
+			ActStatus ret = currentState_p->executeActions(currentEvent.getEventId(),*cb);
+			if(PROCEED != ret)
+			{
+				// TODO: Error Handling, do not process further events for now
+				break;;
+			}
+
+			void * event_data = currentEvent.getEventData();
+			if (event_data != NULL)
+				delete static_cast <cmn::utils::MsgBuffer *>(event_data);
+		}
+
+		if (cb->getControlBlockState() == ALLOCATED)
+		    cb->setProcQueueFlag(false);
+	}
+}
+
diff --git a/src/stateMachineFwk/tempDataBlock.cpp b/src/stateMachineFwk/tempDataBlock.cpp
new file mode 100644
index 0000000..bf3fe80
--- /dev/null
+++ b/src/stateMachineFwk/tempDataBlock.cpp
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * 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.
+ */
+
+#include "tempDataBlock.h"
+#include "stateMachineEngine.h"
+#include "state.h"
+
+using namespace std;
+
+namespace SM
+{
+TempDataBlock::TempDataBlock(): currentStatep(NULL), next(NULL)
+{
+}
+
+TempDataBlock::~TempDataBlock()
+{
+}
+
+void TempDataBlock::display()
+{
+	if (currentStatep)
+		currentStatep->display();
+}
+
+State* TempDataBlock::getCurrentState()
+{
+	return currentStatep;
+}
+
+void TempDataBlock::setNextState(State* state)
+{
+	currentStatep = state;
+}
+
+TempDataBlock* TempDataBlock::getNextTempDataBlock()
+{
+	return next;
+}
+
+void TempDataBlock::setNextTempDataBlock(TempDataBlock* tdb_p)
+{
+	next = tdb_p;
+}
+
+}