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;
+}
+
+}
