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

Change-Id: Ie55032217232214ac8544ca76ea34335205329e4
diff --git a/.ci/config/mme.json b/.ci/config/mme.json
new file mode 100644
index 0000000..e71fd6f
--- /dev/null
+++ b/.ci/config/mme.json
@@ -0,0 +1,35 @@
+{
+	"mme": {
+		"egtp_default_port": 2123,
+		"ip_addr": "10.0.10.30",
+		"s1ap_addr": "10.0.10.30",
+		"egtp_addr": "10.1.10.22",
+		"sctp_port": 36412,
+		"name": "vmmestandalone",
+		"egtp_default_hostname": "sutlej.ccin.ccpu.com",
+		"__comment__": "Here is comment",
+		"mcc": {
+			"dig1": 2,
+			"dig2": 0,
+			"dig3": 8
+		},
+		"mnc": {
+			"dig1": 0,
+			"dig2": 1,
+			"dig3": -1
+		}
+	},
+	"enb": {
+		"enb_addr": "10.0.10.1",
+		"enb_port": "32767"
+	},
+	"s11": {
+		"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/.ci/config/s11.json b/.ci/config/s11.json
new file mode 100644
index 0000000..c637e70
--- /dev/null
+++ b/.ci/config/s11.json
@@ -0,0 +1,37 @@
+{
+	"mme": {
+		"ip_addr": "10.0.10.30",
+		"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": "10.2.10.20",
+		"sctp_port": 36412,
+		"enb_addr": "10.1.10.1",
+		"enb_port": 32767,
+		"egtp_default_hostname": "sutlej.ccin.ccpu.com"
+	},
+	"s11": {
+		"egtp_local_addr": "10.0.2.20",
+		"egtp_default_port": 2123,
+		"sgw_addr": "10.0.2.70",
+		"pgw_addr": "192.168.1.105"
+	},
+	"s6a": {
+		"host_type": "freediameter",
+		"host": "hss.openair4G.eur",
+		"realm": "openair4G.eur"
+	}
+}
diff --git a/.ci/config/s1ap.json b/.ci/config/s1ap.json
new file mode 100644
index 0000000..6634d9e
--- /dev/null
+++ b/.ci/config/s1ap.json
@@ -0,0 +1,36 @@
+{
+	"mme": {
+		"ip_addr": "10.0.10.30",
+		"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": "10.0.10.30",
+		"sctp_port": 36412,
+		"enb_addr": "10.0.10.1",
+		"enb_port": 32767,
+		"egtp_default_hostname": "sutlej.ccin.ccpu.com"
+	},
+	"s11": {
+		"egtp_local_addr": "10.0.2.20",
+		"egtp_default_port": 2123,
+		"sgw_addr": "10.0.2.70",
+		"pgw_addr": "192.168.1.105"
+	},
+	"s6a": {
+		"host_type": "freediameter",
+		"host": "hss.openair4G.eur",
+		"realm": "openair4G.eur"
+	}}
diff --git a/.ci/config/s6a.json b/.ci/config/s6a.json
new file mode 100644
index 0000000..c58062c
--- /dev/null
+++ b/.ci/config/s6a.json
@@ -0,0 +1,37 @@
+{
+	"mme": {
+		"ip_addr": "10.0.10.30",
+		"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": "10.2.10.20",
+		"sctp_port": 36412,
+		"enb_addr": "10.1.10.1",
+		"enb_port": 32767,
+		"egtp_default_hostname": "sutlej.ccin.ccpu.com"
+	},
+	"s11": {
+		"egtp_local_addr": "10.1.10.22",
+		"egtp_default_port": 2123,
+		"sgw_addr": "10.1.10.20",
+		"pgw_addr": "192.168.1.105"
+	},
+	"s6a": {
+		"hss_type": "freediameter",
+		"host_name": "hss.openair4G.eur",
+		"realm": "openair4G.eur"
+	}
+}
diff --git a/.ci/config/s6a_fd.conf b/.ci/config/s6a_fd.conf
new file mode 100644
index 0000000..64abbaf
--- /dev/null
+++ b/.ci/config/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 = 3868;
+# SecPort = 3869;
+
+ConnectPeer = "hss.openair4G.eur" { ConnectTo = "10.0.3.40"; 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/.fossa.yml b/.fossa.yml
new file mode 100644
index 0000000..056db18
--- /dev/null
+++ b/.fossa.yml
@@ -0,0 +1,33 @@
+# 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.
+
+# Generated by FOSSA CLI (https://github.com/fossas/fossa-cli)
+# Visit https://fossa.com to learn more
+
+# Usage: FOSSA_API_KEY=<> fossa analyze
+# -T <team-name> is not supported at this moment from fossa side.
+
+version: 2
+cli:
+  server: https://app.fossa.com
+  fetcher: custom
+  project: openmme
+analyze:
+  modules:
+  - name: openmme
+    type: raw
+    target: ../openmme
+    path: ../openmme
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..7344dff
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,66 @@
+.metadata
+bin/
+tmp/
+*.tmp
+*.bak
+*.swp
+*~.nib
+local.properties
+.settings/
+.loadpath
+.recommenders
+
+# External tool builders
+.externalToolBuilders/
+
+# Locally stored "Eclipse launch configurations"
+*.launch
+
+# PyDev specific (Python IDE for Eclipse)
+*.pydevproject
+
+# CDT-specific (C/C++ Development Tooling)
+.cproject
+.project
+
+# CDT- autotools
+.autotools
+
+# Java annotation processor (APT)
+.factorypath
+
+# PDT-specific (PHP Development Tools)
+.buildpath
+
+# sbteclipse plugin
+.target
+
+# Tern plugin
+.tern-project
+
+# TeXlipse plugin
+.texlipse
+
+# STS (Spring Tool Suite)
+.springBeans
+
+# Code Recommenders
+.recommenders/
+
+# Annotation Processing
+.apt_generated/
+
+# Scala IDE specific (Scala & Java development for Eclipse)
+.cache-main
+.scala_dependencies
+.worksheet
+
+# OMEC-MME ignores
+target/
+cscope.out
+
+#gtpCodeGen script op
+__pycache__/
+.idea
+output
+
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..3a5ae46
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,48 @@
+#
+# Copyright 2019-present Open Networking Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+ARG BASE_OS=ubuntu:16.04
+
+FROM $BASE_OS AS builder
+WORKDIR /openmme
+COPY install_builddeps.sh .
+RUN ./install_builddeps.sh
+
+COPY . ./
+RUN make && make install
+
+FROM $BASE_OS AS runtime
+COPY install_rundeps.sh .
+RUN bash -c "source ./install_rundeps.sh && install_run_deps && install_run_utils && cleanup_image"
+COPY --from=builder /usr/local/lib /usr/local/lib
+COPY --from=builder /tmp/grpc/libs /usr/lib/grpc
+
+WORKDIR /openmme/target
+COPY --from=builder /openmme/target .
+
+ARG org_label_schema_version=unknown
+ARG org_label_schema_vcs_url=unknown
+ARG org_label_schema_vcs_ref=unknown
+ARG org_label_schema_build_date=unknown
+ARG org_opencord_vcs_commit_date=unknown
+
+LABEL org.label-schema.schema-version=1.0 \
+      org.label-schema.name=openmme \
+      org.label-schema.version=$org_label_schema_version \
+      org.label-schema.vcs-url=$org_label_schema_vcs_url \
+      org.label-schema.vcs-ref=$org_label_schema_vcs_ref \
+      org.label-schema.build-date=$org_label_schema_build_date \
+      org.opencord.vcs-commit-date=$org_opencord_vcs_commit_date
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..261eeb9
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/MME2_ReviewComments_v1.0.xlsx b/MME2_ReviewComments_v1.0.xlsx
new file mode 100644
index 0000000..195e1d3
--- /dev/null
+++ b/MME2_ReviewComments_v1.0.xlsx
Binary files differ
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..fed9ec3
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,68 @@
+#
+# Copyright 2019-present Open Networking Foundation
+# 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.
+#
+
+PROJECT_NAME		 := openmme
+VERSION                  ?= $(shell cat ./VERSION)
+
+TOPTARGETS 		 := all clean install
+
+SUBDIRS 		 := src/cmn \
+					src/common \
+					src/gtpV2Codec \
+					src/stateMachineFwk \
+					src/mmeGrpcProtos \
+					src/mmeGrpcClient \
+					src/mme-app \
+					src/s1ap \
+					src/s11 \
+					src/s6a
+ 
+#$(wildcard src/mme-app/.)
+
+$(TOPTARGETS): $(SUBDIRS)
+$(SUBDIRS):
+	$(MAKE) -C $@ $(MAKECMDGOALS)
+
+## Docker related
+DOCKER_REGISTRY          ?=
+DOCKER_REPOSITORY        ?=
+DOCKER_BUILD_ARGS        ?=
+DOCKER_TAG               ?= ${VERSION}
+DOCKER_IMAGENAME         := ${DOCKER_REGISTRY}${DOCKER_REPOSITORY}${PROJECT_NAME}:${DOCKER_TAG}
+
+## Docker labels. Only set ref and commit date if committed
+DOCKER_LABEL_VCS_URL     ?= $(shell git remote get-url $(shell git remote))
+DOCKER_LABEL_VCS_REF     ?= $(shell git diff-index --quiet HEAD -- && git rev-parse HEAD || echo "unknown")
+DOCKER_LABEL_COMMIT_DATE ?= $(shell git diff-index --quiet HEAD -- && git show -s --format=%cd --date=iso-strict HEAD || echo "unknown" )
+DOCKER_LABEL_BUILD_DATE  ?= $(shell date -u "+%Y-%m-%dT%H:%M:%SZ")
+
+# https://docs.docker.com/engine/reference/commandline/build/#specifying-target-build-stage---target
+docker-build:
+	docker build $(DOCKER_BUILD_ARGS) \
+		-t ${DOCKER_IMAGENAME} \
+		--build-arg org_label_schema_version="${VERSION}" \
+		--build-arg org_label_schema_vcs_url="${DOCKER_LABEL_VCS_URL}" \
+		--build-arg org_label_schema_vcs_ref="${DOCKER_LABEL_VCS_REF}" \
+		--build-arg org_label_schema_build_date="${DOCKER_LABEL_BUILD_DATE}" \
+		--build-arg org_opencord_vcs_commit_date="${DOCKER_LABEL_COMMIT_DATE}" \
+		.
+
+docker-push:
+	docker push ${DOCKER_IMAGENAME}
+
+.PHONY: $(TOPTARGETS) $(SUBDIRS) docker-build docker-push
diff --git a/Makefile.common b/Makefile.common
new file mode 100644
index 0000000..7edfdce
--- /dev/null
+++ b/Makefile.common
@@ -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.
+#
+#
+MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST)))
+TOPDIR = $(patsubst %/,%,$(dir $(MAKEFILE_PATH)))
+
+BUILDDIR = $(TOPDIR)/build
+BINDIR = $(BUILDDIR)/bins
+OBJDIR = $(BUILDDIR)/objs
+LIBDIR = $(BUILDDIR)/libs
+
+TARGET_DIR = $(TOPDIR)/target
+INCLUDE_DIR = $(TOPDIR)/include
+
+INC_DIRS= \
+		  -I$(INCLUDE_DIR)/mme-app \
+          -I$(INCLUDE_DIR)/s11 \
+          -I$(INCLUDE_DIR)/s1ap \
+          -I$(INCLUDE_DIR)/s6a \
+          -I$(TOPDIR)/src/s1ap/asn1c/asnGenFiles \
+	  	  -I$(INCLUDE_DIR)/common \
+          -I$(INCLUDE_DIR)/cmn \
+          -I$(INCLUDE_DIR)/stateMachineFwk \
+	  	  -I$(TOPDIR)/src/mmeGrpcProtos          
+
+LIB_PATH := -L$(LIBDIR)
+
+CC := gcc
+
+DEBUG = false
+
+GRPC_ROOT=/tmp/grpc
+
+CFLAGS += -D_FORTIFY_SOURCE=2 -fasynchronous-unwind-tables -fexceptions
+CFLAGS += -fstack-protector-all -fstack-protector-strong -Wall
+CFLAGS += -Werror=format-security -Werror=implicit-function-declaration
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..034acfc
--- /dev/null
+++ b/README.md
@@ -0,0 +1,101 @@
+# OpenMME
+## Table of Contents
+[Introduction](#introduction)
+
+[Builds and Installation Procedure](#build-and-installation-procedure)
+
+[Update Config](#update-config)
+
+[Known Issues](#known-issues)
+
+[Config Parameters](#config-parameters)
+
+## Introduction:
+OpenMME is a grounds up implementation of the Mobility management Entity EPC S1 front end to the Cell Tower (eNB). Its design is performance optimized for high speed mobility events over the S1-MME interface, while maintaining state coherent high transaction rate interactions over the S6a interface to the HSS and the S11 interface to the Serving Gateway Control (SGWC). The design allows maximum utilization of the transaction rate allowed by the S1-MME Non-Access Stratum (NAS) messages over SCTP, S6a DIAMETER Attribute Value Pairs (AVPs) over TCP and S11 GTPV2C messages over UDP protocols.
+
+## Build and Installation Procedure
+### Update config 
+Update following config files
+
+    {install_path}/openmme/src/mme-app/conf/mme.json
+    {install_path}/openmme/src/s1ap/conf/s1ap.json
+    {install_path}/openmme/src/s11/conf/s11.json
+    {install_path}/openmme/src/s6a/conf/*.json
+    update the Diameter Configuration File:
+        {install_path}/openmme/src/s6a/conf/s6a_fd.conf
+       
+- the following values shall be defined:
+   - Identity:  
+      - the diameter identity.
+      - default value: mme.localdomain
+   - Realm:
+          - the diameter realm (everything past the first period of Identity)
+          - default value: localdomain
+          
+  - Refer free diameter  [config link](http://www.freediameter.net/trac/wiki/Configuration) 
+
+### Build open mme components as follows:
+    cd {install_path}/openmme
+    make clean; make; make install
+
+### Generate certificates   
+The "Diameter Identity" is a fully qualified domain name that is used to access the the Diameter peer. The "Diameter Host" is everything up to the first period of the "Diameter Identity". The  "Diameter Realm" is everything after the first period of the "Diameter Identity".
+
+Execute the following command, using the "Identity" configured in        {install_path}/openmme/src/s6a/conf/s6a_fd.conf
+
+    cd {install_path}/openmme/target/conf
+    ./make_certs.sh <diameter_host> <diameter_realm>
+    For Example: ./make_certs.sh mme localdomain
+
+   ### Start MME modules
+     cd {install_path}/openmme/target/
+     ./run.sh
+
+## Known Issues
+- O3 optimization flag is disabled in s6a module Observed issues in attach procedure when -O3 optimization flag is enabled in s6a module.
+- Message Authentication Code (MAC) needs to be disabled at the RAN side to support number of devices >10 and S1-MME transaction rate >10
+
+## Appendix A.
+Before starting openMME applications respective parameters should be  configured in the json files mentioned in section 2.b. For each of the application individual json file can be created, or a user can create a common json file for entire MME configuration(all interfaces), and copy contents of this file in all other jsons.
+	OpenMME applications are designed modularly so that with extended IPC support user can have an individual application running on separate hosts/VMs, to help in this situation separate configuration files are created for each of the MME application(s1ap-app, s6a-app, s11-app, mme-app)
+
+### Config Parameters
+- Following is a description of each section under json file.
+  - [U] - Reserved/Unused. Can be skipped in the json.
+  - [M] - Mandatory parameter.
+
+#### "mme" - Contains information relevant for mme-app & s1ap-app.
+  Config Parameter Name | Reserved/Unused/Mandatory | Comments |
+  ----------------------|---------------------------|----------|
+  egtp_default_port     | Unused                    | Default S11 port for MME's S11 end |
+  ip_addr               | Mandatory                 | MME's own ip address. Reserved for management. |
+  s1ap_addr             | Unused | MME's s1ap interface IP address |
+  egtp_addr             | Unused | MME's s11 interface IP address |
+  sctp_port             | Unused | MME's sctp(s1ap) port number. |
+  name                  | Unused | MME's name to use in s1 setup with eNB |
+  egtp_default_hostname | Optional| | 
+  MCC, MNC              | Mandatory | MCC, MNC for the MME|
+  
+
+#### "s1ap" -eNB information. Relevant for s1ap-app.
+Config Parameter Name | Reserved/Unused/Mandatory | Comments |
+----------------------|---------------------------|----------|
+s1ap_local_addr | Mandatory | MME's s1ap interface source IP address |
+sctp_port       | Mandatory | MME's s1ap interface source port |
+
+
+#### "s11" - SGW information for s11 communication. Relevant for s11-app  
+Config Parameter Name | Reserved/Unused/Mandatory | Comments |
+----------------------|---------------------------|----------|
+egtp_local_addr | Mandatory | MME's source s11 interface IP address. |
+egtp_default_port | Mandatory | MME's source s11 interface port. |
+sgw_addr | Mandatory | Destination SGW IP for s11 interface |
+pgw_addr | Mandatory | PGW address. This field is not used as of now. Provision made in MME config for PGW information. |
+
+#### "s6a" - HSS information for s6a communication. Relevant for s6a-app.
+Config Parameter Name | Reserved/Unused/Mandatory | Comments |
+----------------------|---------------------------|----------|
+host_type | Mandatory | Two types are supported. "freediameter" - Communicate to HSS host over freediameter interface. "hss_perf" - Use local loopback HSS option. This is only for testing purpose. |
+host_name | Mandatory | HSS destination host name. |
+realm | Mandatory | Realm for HSS freediameter communication. |
+
diff --git a/VERSION b/VERSION
new file mode 100644
index 0000000..d72f262
--- /dev/null
+++ b/VERSION
@@ -0,0 +1 @@
+2.0.0-dev
diff --git a/include/cmn/basicTypes.h b/include/cmn/basicTypes.h
new file mode 100644
index 0000000..7ea0e44
--- /dev/null
+++ b/include/cmn/basicTypes.h
@@ -0,0 +1,7 @@
+#include <stdint.h>
+
+typedef uint8_t Uint8;
+typedef uint16_t Uint16;
+typedef uint32_t Uint32;
+typedef uint64_t Uint64;
+
diff --git a/include/cmn/blockingCircularFifo.h b/include/cmn/blockingCircularFifo.h
new file mode 100644
index 0000000..41069d7
--- /dev/null
+++ b/include/cmn/blockingCircularFifo.h
@@ -0,0 +1,72 @@
+/*
+ * 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 INCLUDE_CMN_BLOCKINGCIRCULARFIFO_H_
+#define INCLUDE_CMN_BLOCKINGCIRCULARFIFO_H_
+
+#include <cstddef>
+#include <semaphore.h>
+#include "circularFifo.h"
+
+namespace cmn {
+	namespace utils {
+
+		template<typename Element, size_t size>
+		class BlockingCircularFifo
+		{
+		public:
+			BlockingCircularFifo():circularQueue()
+			{
+				sem_init(&pop_semaphore, 0, 0);
+				sem_init(&push_semaphore, 0, size);
+			}
+
+			~BlockingCircularFifo()
+			{
+				sem_destroy(&pop_semaphore);
+				sem_destroy(&push_semaphore);
+			}
+
+			bool push(Element* item)
+			{
+				sem_wait(&push_semaphore);
+				bool ret = circularQueue.push(item);
+				if (ret)
+					sem_post(&pop_semaphore);
+				else
+					sem_post(&push_semaphore);
+				return ret;
+			}
+
+			bool pop(Element*& item)
+			{
+				sem_wait(&pop_semaphore);
+				bool ret = circularQueue.pop(item);
+				if (ret)
+					sem_post(&push_semaphore);
+				else
+					sem_post(&pop_semaphore);
+				return ret;
+			}
+
+		private:
+			CircularFifo<Element, size> circularQueue;
+			sem_t pop_semaphore;
+			sem_t push_semaphore;
+		};
+	}
+}
+#endif /* INCLUDE_CMN_BLOCKINGCIRCULARFIFO_H_ */
diff --git a/include/cmn/circularFifo.h b/include/cmn/circularFifo.h
new file mode 100644
index 0000000..30e629b
--- /dev/null
+++ b/include/cmn/circularFifo.h
@@ -0,0 +1,94 @@
+/*
+ * This code is in public domain.
+ * Implementation and its platform dependent issues discussed in
+ * https://kjellkod.wordpress.com/2012/11/28/c-debt-paid-in-full-wait-free-lock-free-queue/
+ */
+
+#ifndef INCLUDE_CMN_CIRCULARFIFO_H_
+#define INCLUDE_CMN_CIRCULARFIFO_H_
+
+#include <atomic>
+#include <cstddef>
+
+namespace cmn {
+	namespace utils {
+		template<typename Element, size_t Size>
+		class CircularFifo
+		{
+			public:
+				enum { Capacity = Size + 1 };
+
+				CircularFifo() : _tail(0), _head(0){}
+				virtual ~CircularFifo() {}
+
+				bool push(Element* item);
+				bool pop(Element*& item);
+
+				bool wasEmpty() const;
+				bool wasFull() const;
+				bool isLockFree() const;
+
+			private:
+				size_t increment(size_t idx) const;
+
+				std::atomic <size_t>  _tail;
+				Element*    _array[Capacity];
+				std::atomic<size_t>   _head;
+		};
+
+		template<typename Element, size_t Size>
+		bool CircularFifo<Element, Size>::push(Element* item)
+		{
+			const auto current_tail = _tail.load(std::memory_order_relaxed);
+			const auto next_tail = increment(current_tail);
+			if(next_tail != _head.load(std::memory_order_acquire))
+			{
+				_array[current_tail] = item;
+				_tail.store(next_tail, std::memory_order_release);
+				return true;
+			}
+
+			return false;
+		}
+
+		template<typename Element, size_t Size>
+		bool CircularFifo<Element, Size>::pop(Element*& item)
+		{
+			const auto current_head = _head.load(std::memory_order_relaxed);
+			if(current_head == _tail.load(std::memory_order_acquire))
+				return false;
+
+			item = _array[current_head];
+			_head.store(increment(current_head), std::memory_order_release);
+			return true;
+		}
+
+		template<typename Element, size_t Size>
+		bool CircularFifo<Element, Size>::wasEmpty() const
+		{
+			return (_head.load() == _tail.load());
+		}
+
+		template<typename Element, size_t Size>
+		bool CircularFifo<Element, Size>::wasFull() const
+		{
+			const auto next_tail = increment(_tail.load());
+			return (next_tail == _head.load());
+		}
+
+		template<typename Element, size_t Size>
+		bool CircularFifo<Element, Size>::isLockFree() const
+		{
+			return (_tail.is_lock_free() && _head.is_lock_free());
+		}
+
+		template<typename Element, size_t Size>
+		size_t CircularFifo<Element, Size>::increment(size_t idx) const
+		{
+			return (idx + 1) % Capacity;
+		}
+	}
+}
+
+
+#endif /* INCLUDE_CMN_CIRCULARFIFO_H_ */
diff --git a/include/cmn/dataGroupManager.h b/include/cmn/dataGroupManager.h
new file mode 100644
index 0000000..b1dc16e
--- /dev/null
+++ b/include/cmn/dataGroupManager.h
@@ -0,0 +1,51 @@
+/*
+ * 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 DATA_GROUP_MANAGER_H
+#define DATA_GROUP_MANAGER_H
+
+#include <deque>
+#include "controlBlock.h"
+#include <mutex>
+
+using namespace SM;
+
+namespace cmn {
+namespace DGM
+{
+	class DataGroupManager
+	{
+		public:
+		
+			DataGroupManager();
+			virtual ~DataGroupManager();
+			
+			void initializeCBStore( int DataCount );
+			virtual ControlBlock* allocateCB();
+			virtual void deAllocateCB( uint32_t cbIndex );
+			SM::ControlBlock* findControlBlock( uint32_t index );
+
+		protected:
+			ControlBlock* cbstore_m;		// Indexed Store
+
+		private:
+			std::deque<ControlBlock*> freeQ_m;	// free Q
+			std::mutex mutex_m;
+
+	};
+};
+};
+#endif
diff --git a/include/cmn/debug.h b/include/cmn/debug.h
new file mode 100644
index 0000000..8a7a393
--- /dev/null
+++ b/include/cmn/debug.h
@@ -0,0 +1,72 @@
+/*
+ * 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 DEBUG_H_
+#define DEBUG_H_
+
+#include <iostream>
+#include <sstream>
+#include <stdint.h>
+
+using namespace std;
+
+namespace cmn
+{
+namespace utils
+{
+typedef enum{
+              LEVEL_1,
+              LEVEL_2,
+              LEVEL_3,
+              LEVEL_4
+            }DebugLevel;
+
+
+class Debug{
+public:
+  Debug();
+  ~Debug();
+
+  void printDebugStream();
+  void printDebugStreamToFile();
+
+  void add(char* data);
+  void add(uint8_t data);
+  void add(uint16_t data);
+  void add(uint32_t data);
+  void add(uint64_t data);
+  
+  void endOfLine();
+  void startNewLine();
+  void incrIndent();
+  void decrIndent();
+
+  void clearStream();
+ 
+  void setHexOutput();
+  void unsetHexOutput();
+
+private:
+
+  ostringstream stream;
+  uint8_t indent;
+  bool newLine;
+};
+};
+};
+
+#endif /* DEBUGUTILS_H_ */
+
diff --git a/include/cmn/ipcChannel.h b/include/cmn/ipcChannel.h
new file mode 100644
index 0000000..eb0dd31
--- /dev/null
+++ b/include/cmn/ipcChannel.h
@@ -0,0 +1,47 @@
+/*
+ * 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 INCLUDE_CMN_IPCCHANNEL_H_
+#define INCLUDE_CMN_IPCCHANNEL_H_
+
+#include "ipcTypes.h"
+
+namespace cmn {
+namespace ipc {
+
+class IpcChannel {
+public:
+	IpcChannel(IpcChannelType ipcType);
+	virtual ~IpcChannel();
+
+	IpcChannelType getIpcChannelType() const;
+	void setIpcChannelType(const IpcChannelType ipcType);
+
+	IpcChannelHdl getIpcChannelHdl() const;
+	void setIpcChannelHdl(const IpcChannelHdl ipcHdl, const IpcChannelType ipcType);
+
+	virtual void sendMsgTo(void * buffer, uint32_t len, IpcAddress destAddress) = 0;
+	virtual uint32_t recvMsgFrom(void * buffer, uint32_t bufLen, IpcAddress& srcAddress) = 0;
+
+protected:
+	IpcChannelType ipcType_m;
+	IpcChannelHdl ipcHdl_m;
+};
+
+} /* namespace ipc */
+} /* namespace cmn */
+
+#endif /* INCLUDE_CMN_IPCCHANNEL_H_ */
diff --git a/include/cmn/ipcTypes.h b/include/cmn/ipcTypes.h
new file mode 100644
index 0000000..d8855ed
--- /dev/null
+++ b/include/cmn/ipcTypes.h
@@ -0,0 +1,54 @@
+/*
+ * 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 INCLUDE_CMN_IPCTYPES_H_
+#define INCLUDE_CMN_IPCTYPES_H_
+
+#include <stdint.h>
+
+namespace cmn {
+namespace ipc {
+
+enum class IpcChannelType
+{
+	tipc_c,
+	maxIpcType_c
+};
+
+union IpcChannelHdl
+{
+	uint32_t u32;
+};
+
+union IpcAddress
+{
+	uint32_t u32;
+};
+
+typedef struct IpcMsgHeader
+{
+	IpcAddress destAddr;
+	IpcAddress srcAddr;
+
+} IpcMsgHeader;
+
+} /* namespace ipc */
+} /* namespace cmn */
+
+
+
+
+#endif /* INCLUDE_CMN_IPCTYPES_H_ */
diff --git a/include/cmn/memPoolManager.h b/include/cmn/memPoolManager.h
new file mode 100644
index 0000000..61d614a
--- /dev/null
+++ b/include/cmn/memPoolManager.h
@@ -0,0 +1,124 @@
+/*
+ * 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 INCLUDE_CMN_MEMPOOLMANAGER_H_
+#define INCLUDE_CMN_MEMPOOLMANAGER_H_
+
+#include <cstdint>
+#include <memory>
+#include <cstring>
+
+namespace cmn {
+	namespace memPool {
+		template <typename T>
+		class MemBlock
+		{
+		public:
+                        union Data {
+                                MemBlock<T>* next_mp;
+                                alignas(alignof(T)) uint8_t dataBlock_m[sizeof(T)];
+                        };
+
+			MemBlock() { memset(data_m.dataBlock_m, 0, sizeof(T)); }
+
+			void reset() { memset(data_m.dataBlock_m, 0, sizeof(T)); }
+
+			MemBlock<T>* getNextMemBlock() { return data_m.next_mp; }
+			void setNextMemBlock(MemBlock<T>* nxtBlk_p) { data_m.next_mp = nxtBlk_p; }
+
+			T* getDataBlock() { return (reinterpret_cast<T*> (data_m.dataBlock_m)); }
+
+		private:
+			Data data_m;
+		};
+
+		template <typename T>
+		class MemChunk
+		{
+		public:
+
+			MemChunk(uint32_t numOfBlocks)
+			{
+				std::unique_ptr<MemBlock<T>[]> blkArray_p(new MemBlock<T>[numOfBlocks]);
+				blockArray_mpa.reset(blkArray_p.release());
+
+				uint32_t  i = 1;
+				for (; i < numOfBlocks; i++)
+				{
+					blockArray_mpa[i-1].setNextMemBlock(&blockArray_mpa[i]);
+				}
+				blockArray_mpa[i].setNextMemBlock(NULL);
+			}
+
+			MemBlock<T>* getMemBlockArray() { return blockArray_mpa.get(); }
+
+			void setNextMemChunk(std::unique_ptr<MemChunk> &&nxtChunk_p) { nextMemChunk_mp.reset(nxtChunk_p.release()); }
+
+		private:
+			std::unique_ptr<MemChunk<T>> nextMemChunk_mp;
+			std::unique_ptr<MemBlock<T>[]> blockArray_mpa;
+		};
+
+		template <typename T>
+		class MemPoolManager
+		{
+		public:
+			MemPoolManager(size_t chunkSize):chunkSize_m(chunkSize),
+					currentChunk_mp(new MemChunk<T>(chunkSize)),
+					freeList_mp(currentChunk_mp->getMemBlockArray())
+			{
+
+			}
+
+			template <typename... Args> T* allocate(Args &&... args)
+			{
+				if (freeList_mp == NULL)
+				{
+					std::unique_ptr<MemChunk<T>> newChunk_p (new MemChunk<T>(chunkSize_m));
+					newChunk_p->setNextMemChunk(std::move(currentChunk_mp));
+					currentChunk_mp.reset(newChunk_p.release());
+
+					freeList_mp = currentChunk_mp->getMemBlockArray();
+				}
+				MemBlock<T>* currentBlock_p = freeList_mp;
+				freeList_mp = freeList_mp->getNextMemBlock();
+
+				T* dataBlock_p = currentBlock_p->getDataBlock();
+
+				new (dataBlock_p) T(std::forward<Args>(args)...);
+				return dataBlock_p;
+			}
+
+			void free(T* data_p)
+			{
+			    data_p->T::~T();
+			    MemBlock<T>* currentBlock_p = reinterpret_cast<MemBlock<T>*>(data_p);
+			    
+			    currentBlock_p->reset();
+
+			    currentBlock_p->setNextMemBlock(freeList_mp);
+			    freeList_mp = currentBlock_p;
+			}
+		private:
+			size_t chunkSize_m;
+			std::unique_ptr<MemChunk<T>> currentChunk_mp;
+			MemBlock<T>* freeList_mp;
+		};
+	}
+}
+
+
+#endif /* INCLUDE_CMN_MEMPOOLMANAGER_H_ */
diff --git a/include/cmn/msgBuffer.h b/include/cmn/msgBuffer.h
new file mode 100644
index 0000000..fcf799b
--- /dev/null
+++ b/include/cmn/msgBuffer.h
@@ -0,0 +1,88 @@
+/*
+ * MsgBuffer.h
+ *
+ *  Created on: Feb 13, 2011
+ *      Author: hariharanb
+ */
+
+#ifndef MSGBUFFER_H_
+#define MSGBUFFER_H_
+
+#include <sstream>
+#include <debug.h>
+
+#include <stdint.h>
+
+#define DEFAULT_BUFF_SIZE 1024
+
+using namespace std;
+extern cmn::utils::Debug errorStream;
+namespace cmn
+{
+namespace utils
+{
+class MsgBuffer
+{
+public:
+
+	MsgBuffer();
+	MsgBuffer(uint16_t size);
+
+	~MsgBuffer();
+
+
+	bool writeBits(uint8_t data, uint8_t size, bool append = true);
+	bool writeBytes(uint8_t* data, uint16_t size, bool append = true);
+	bool writeUint8(uint8_t data,  bool append = true);
+	bool writeUint16(uint16_t data, bool append = true);
+	bool writeUint32(uint32_t data, bool append = true);
+	bool writeUint64(uint64_t data, bool append = true);
+
+	void display (Debug &stream);
+
+	uint8_t readBits(uint16_t size);
+	bool readBytes(uint8_t* data, uint16_t size);
+
+	bool readBit();
+	void readUint8(uint8_t &data);
+	bool readUint16(uint16_t &data);
+	bool readUint32(uint32_t &data);
+	bool readUint64(uint64_t &data);
+	void reset();
+	void rewind();
+	void goToEnd();
+	void skipBits(uint8_t size);
+	void skipBytes(uint16_t size);
+    	uint16_t getLength();
+	uint16_t getBufferSize();
+    	uint16_t getCurrentIndex();
+    	void goToIndex(uint16_t idx);
+
+    	uint8_t charToHex(uint8_t x);
+    	uint16_t lengthLeft();
+    	uint16_t sizeLeft();
+
+    	void* getDataPointer();
+    	void setLength(uint16_t bufLen);
+
+private:
+
+	uint8_t* data_mp;
+	uint16_t bufSize;
+	uint16_t length;
+	uint16_t bitLength;
+	uint16_t byteIndex;
+	uint16_t bitIndex;
+
+	void initialize(uint16_t size);
+	bool incrBitIndex(uint8_t size);
+	bool incrByteIndex(uint16_t size);
+	void nextByte();
+};
+};
+};
+
+using namespace cmn::utils;
+
+#endif /* MSGBUFFER_H_ */
+
diff --git a/include/cmn/tipcSocket.h b/include/cmn/tipcSocket.h
new file mode 100644
index 0000000..da069db
--- /dev/null
+++ b/include/cmn/tipcSocket.h
@@ -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.
+ */
+
+#ifndef INCLUDE_CMN_TIPCSOCKET_H_
+#define INCLUDE_CMN_TIPCSOCKET_H_
+
+#include "ipcChannel.h"
+
+namespace cmn {
+namespace ipc {
+
+class TipcSocket: public IpcChannel {
+public:
+	TipcSocket();
+	virtual ~TipcSocket();
+
+	bool bindTipcSocket(IpcAddress myAddress);
+
+    virtual void sendMsgTo(void * buffer, uint32_t len, IpcAddress destAddr);
+    virtual uint32_t recvMsgFrom(void * buffer, uint32_t len, IpcAddress& srcAddr);
+
+private:
+    void initialize();
+
+};
+
+} /* namespace ipc */
+} /* namespace cmn */
+
+#endif /* INCLUDE_CMN_TIPCSOCKET_H_ */
diff --git a/include/cmn/tipcTypes.h b/include/cmn/tipcTypes.h
new file mode 100644
index 0000000..6083170
--- /dev/null
+++ b/include/cmn/tipcTypes.h
@@ -0,0 +1,36 @@
+/*
+ * 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 INCLUDE_COMMONFWK_TIPCTYPES_H_
+#define INCLUDE_COMMONFWK_TIPCTYPES_H_
+
+#include <stdint.h>
+
+static const uint32_t tipcServiceAddressType_c = 18888;
+static const uint32_t tipcDomain_c = 0x0;
+
+typedef enum TipcServiceInstance
+{
+	mmeAppInstanceNum_c = 1,
+	s1apAppInstanceNum_c,
+	s6AppInstanceNum_c,
+	s11AppInstanceNum_c,
+
+	maxInstanceNum_c
+
+} TipcInstanceTypes;
+
+#endif /* INCLUDE_COMMONFWK_TIPCTYPES_H_ */
diff --git a/include/common/3gpp_24008.h b/include/common/3gpp_24008.h
new file mode 100644
index 0000000..37c55bc
--- /dev/null
+++ b/include/common/3gpp_24008.h
@@ -0,0 +1,11 @@
+#ifndef __3gpp_24008_h__
+#define __3gpp_24008_h__
+
+/* UE Types */
+
+#define ID_IMSI  1
+#define ID_IMEI  2
+#define ID_IMEISV  3
+#define ID_TMSI  4
+
+#endif
diff --git a/include/common/common_proc_info.h b/include/common/common_proc_info.h
new file mode 100644
index 0000000..d390878
--- /dev/null
+++ b/include/common/common_proc_info.h
@@ -0,0 +1,81 @@
+/*
+ * 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.
+ */
+
+#ifndef __S11_COMMON_PROC_INFO_H_
+#define __S11_COMMON_PROC_INFO_H_
+
+#include "err_codes.h"
+#include "s1ap_structs.h"
+#include "s1ap_ie.h"
+#include "s11_structs.h"
+
+struct s1ap_common_req_Q_msg {
+    int             IE_type; 
+	int ue_idx;
+	int enb_fd;
+	int enb_s1ap_ue_id;
+	int mme_s1ap_ue_id;
+    enum s1ap_cn_domain cn_domain;
+    unsigned char imsi[BINARY_IMSI_LEN];
+	struct TAI      tai;//TODO: will be list of 16 TAI's for UE.
+	s1apCause_t cause;
+
+	unsigned long ueag_max_ul_bitrate;
+	unsigned long ueag_max_dl_bitrate;
+	struct fteid gtp_teid;
+	unsigned char sec_key[32];
+	unsigned char bearer_id;
+};
+
+struct s11_req_Q_msg {
+    int         IE_type; 
+	struct fteid s11_sgw_c_fteid;
+};
+
+struct s11_resp_Q_msg {
+    int         IE_type; 
+	int 		ue_idx;
+};
+
+enum s1ap_common_req_type
+{
+    S1AP_CTX_REL_REQ,
+    S1AP_CTX_REL_CMD,
+    S1AP_INIT_CTXT_SETUP_REQ,
+    S1AP_PAGING_REQ,
+    S1AP_REQ_UNKNOWN
+};
+
+enum s11_common_req_type
+{
+    S11_RABR_REQ,
+    S11_REQ_UNKNOWN
+};
+
+enum s11_common_resp_type
+{
+    S11_RABR_RESP,
+    S11_RESP_UNKNOWN
+};
+
+#define S1AP_COMMON_REQ_BUF_SIZE sizeof(struct s1ap_common_req_Q_msg)
+
+#define S11_COMM_REQ_STAGE_BUF_SIZE sizeof(struct s11_req_Q_msg)
+#define S11_COMM_RES_STAGE_BUF_SIZE sizeof(struct s11_resp_Q_msg)
+
+#endif /*__S11_COMMON_PROC_INFO_H_*/
+
diff --git a/include/common/err_codes.h b/include/common/err_codes.h
new file mode 100644
index 0000000..9ef2fd8
--- /dev/null
+++ b/include/common/err_codes.h
@@ -0,0 +1,49 @@
+/*
+ * 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.
+ */
+
+#ifndef ERROR_CODES_H_
+#define ERROR_CODES_H_
+
+/***
+Common error codes across MME
+*/
+
+enum ERROR_CODES{
+	SUCCESS = 0,
+	/*Generic error codes 0-100*/
+	E_FAIL,
+	E_FAIL_INIT, /*Failed in initialization*/
+	E_ALLOC_FAILED,
+	E_PARSING_FAILED,
+
+	/*S1AP error codes 200-300 */
+	S1AP_AUTH_FAILED = 201,
+	S1AP_SECMODE_FAILED,
+	S1AP_IDENTITY_FAILED,
+
+	/*S6a error codes 300-500*/
+	S6A_AIA_FAILED = 301,
+	S6A_FD_ERROR,
+	S6A_FD_CORE_INIT_FAILED,
+	S6A_FD_CORE_PARSECONF_FAILED,
+	S6A_FD_CORE_START_FAILED,
+	S6A_FD_GET_DICTVAL_FAILED,
+	S6A_FD_DICTSRCH_FAILED,
+};
+
+#endif /* ERROR_CODES_H__*/
diff --git a/include/common/f8.h b/include/common/f8.h
new file mode 100644
index 0000000..df3ef81
--- /dev/null
+++ b/include/common/f8.h
@@ -0,0 +1,37 @@
+/*-----------------------------------------------
+ * * f8.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
+ */
+
+
+#ifndef F8_H_
+#define F8_H_
+#include "snow_3g.h"
+
+
+/* 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 of
+ * https://www.gsma.com/aboutus/wp-content/uploads/2014/12/snow3gspec.pdf
+ * specs document
+*/
+
+
+void f8( u8 *key, u32 count, u32 bearer, u32 dir, u8 *data, u32 length );
+
+
+#endif
diff --git a/include/common/f9.h b/include/common/f9.h
new file mode 100644
index 0000000..e7e9ff1
--- /dev/null
+++ b/include/common/f9.h
@@ -0,0 +1,33 @@
+/*--------------------------------------------------------
+ * 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
+*/
+
+#ifndef F9_H_
+#define F9_H_
+#include "snow_3g.h"
+
+/* 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
+ * of https://www.gsma.com/aboutus/wp-content/uploads/2014/12/snow3gspec.pdf
+ * specs document.
+ */
+
+
+u8* f9( u8* key, u32 count, u32 fresh, u32 dir, u8 *data, u64 length);
+
+#endif
+
diff --git a/include/common/hss_message.h b/include/common/hss_message.h
new file mode 100644
index 0000000..2835fcb
--- /dev/null
+++ b/include/common/hss_message.h
@@ -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.
+ */
+
+#ifndef __HSS_MSG_H_
+#define __HSS_MSG_H_
+
+#include "sec.h"
+
+/*Information needed for AIR*/
+enum e_BUF_HDR {
+	HSS_AIR_MSG,
+	HSS_AIA_MSG,
+	HSS_ULR_MSG,
+	HSS_ULA_MSG,
+	//NI Detach
+	HSS_CLR_MSG,
+	HSS_CLA_MSG,
+	//NI Detach
+	HSS_PURGE_MSG,
+	HSS_PURGE_RESP_MSG,
+};
+
+
+#define IMSI_STR_LEN 16
+/*AIR  - request. Struct is same for ULR*/
+struct hss_air_msg {
+	char imsi[IMSI_STR_LEN];
+	unsigned char  plmn_id[3];
+};
+
+/*AIA  - response*/
+struct hss_aia_msg {
+	struct RAND rand;
+	struct XRES xres;
+	struct AUTN autn;
+	struct KASME kasme;
+};
+
+#define HSS_MSISDN_LEN 10
+#define SPARE_LEN 52
+
+/*ULA  - response*/
+struct hss_ula_msg {
+	int subscription_state;
+	unsigned char msisdn[HSS_MSISDN_LEN];
+	unsigned char a_msisdn[HSS_MSISDN_LEN];
+	unsigned char spare[SPARE_LEN];
+};
+
+struct hss_clr_msg {
+	char origin_host;
+	char origin_realm;
+	char user_name;
+	unsigned char cancellation_type;
+};
+
+
+struct hss_pur_msg {
+	int ue_idx;
+	char imsi[IMSI_STR_LEN];
+};
+
+struct hss_req_msg {
+	enum e_BUF_HDR hdr;
+	int ue_idx;
+	union req_data {
+		struct hss_air_msg air;
+	}data;
+};
+
+struct hss_resp_msg {
+	enum e_BUF_HDR hdr;
+	int ue_idx;
+	int result;
+	union resp_data {
+		struct hss_aia_msg aia;
+		struct hss_ula_msg ula;
+		struct hss_clr_msg clr;
+	}data;
+};
+
+#define HSS_RCV_BUF_SIZE 128
+#define HSS_REQ_MSG_SIZE sizeof(struct hss_req_msg)
+#define HSS_RESP_MSG_SIZE sizeof(struct hss_resp_msg)
+
+#endif /*__STAGE6_S6A_MSG_H_*/
+
diff --git a/include/common/ipc_api.h b/include/common/ipc_api.h
new file mode 100644
index 0000000..92ae5ce
--- /dev/null
+++ b/include/common/ipc_api.h
@@ -0,0 +1,70 @@
+/*
+ * 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.
+ */
+
+#ifndef IPC_API_H_
+#define IPC_API_H_
+
+#include <tipcTypes.h>
+
+#define		IPC_MAX_BUFFER_SIZE		1024
+
+#define IPC_MODE 0664
+
+enum ipc_access_mode {
+	IPC_READ = 01,
+	IPC_WRITE = 02,
+};
+
+typedef int ipc_handle;
+
+int
+create_ipc_channel(char *name);
+
+int
+open_ipc_channel(char *name, enum ipc_access_mode access_mode);
+
+int
+create_open_ipc_channel(char *name,
+		enum ipc_access_mode access_mode);
+
+int
+read_ipc_channel(ipc_handle fd, char *buffer, size_t size);
+
+int
+write_ipc_channel(ipc_handle fd, char *buffer, size_t size);
+
+int
+close_ipc_channel(ipc_handle fd);
+
+int
+create_tipc_socket();
+
+int
+bind_tipc_socket(int sockFd, uint32_t instanceNum);
+
+int
+send_tipc_message(int sd, uint32_t destAddr, void * buf, int len);
+
+int
+read_tipc_msg(int sockFd, void * buf, int len);
+
+void
+close_tipc_socket(int sockFd);
+
+
+#endif /* IPC_API_H_ */
diff --git a/include/common/json_data.h b/include/common/json_data.h
new file mode 100644
index 0000000..0d4357b
--- /dev/null
+++ b/include/common/json_data.h
@@ -0,0 +1,37 @@
+/*
+ * 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.
+ */
+#ifndef __JSON_DATA_H_
+#define __JSON_DATA_H_
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+char *
+get_string_scalar(char *path);
+
+int
+get_ip_scalar(char *path);
+
+int
+get_int_scalar(char *path);
+
+int
+load_json(char *filename);
+
+#endif /**/
diff --git a/include/common/log.h b/include/common/log.h
new file mode 100644
index 0000000..d2d3953
--- /dev/null
+++ b/include/common/log.h
@@ -0,0 +1,42 @@
+/*
+ * 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.
+ */
+
+#ifndef __LOG_1_H_
+#define __LOG_1_H_
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+enum log_levels{
+	LOG_INFO,
+	LOG_DEBUG,
+	LOG_WARNING,
+	LOG_ERROR,
+};
+
+void log_message(int l, const char *file, int line, const char *fmt, ...);
+//#define log_msg(LOG_LEVEL, ARGS) set_log(#LOG_LEVEL, __FILE__, __LINE__, __VA_ARGS__)
+#define log_msg(LOG_LEVEL, ...) log_message( LOG_LEVEL, __FILE__, __LINE__,  __VA_ARGS__)
+//#define log_msg(LOG_LEVEL, ...) ;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __LOG_1_H_ */
diff --git a/include/common/message_queues.h b/include/common/message_queues.h
new file mode 100644
index 0000000..faf719a
--- /dev/null
+++ b/include/common/message_queues.h
@@ -0,0 +1,58 @@
+/*
+ * 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.
+ */
+
+#ifndef __MESSAGE_QUEUES_H_
+#define __MESSAGE_QUEUES_H_
+
+#define S1AP_Q_DIR "/tmp/s1ap"
+#define MME_APP_Q_DIR "/tmp/mme-app"
+#define S6A_Q_DIR "/tmp/s6a"
+#define S11_Q_DIR "/tmp/s11"
+
+#define MME_TOTAL_HANDLERS 7
+
+/**
+Message queues used across MME, S1ap, S11, S6a
+**/
+
+
+/********** S1AP READ/WRITE QUEUE *************/
+#define S1AP_READ_QUEUE "/tmp/s1ap/s1ap_read_Q"
+#define S1AP_WRITE_QUEUE "/tmp/s1ap/s1ap_write_Q"
+
+/********** GTP READ/WRITE QUEUE *************/
+#define GTP_READ_QUEUE "/tmp/s11/gtp_read_Q"
+#define GTP_WRITE_QUEUE "/tmp/s11/gtp_write_Q"
+
+/********** S6 READ/WRITE QUEUE *************/
+#define S6_READ_QUEUE "/tmp/s6a/s6_read_Q"
+#define S6_WRITE_QUEUE "/tmp/s6a/s6_write_Q"
+
+#define S6A_REQ_STAGE1_QUEUE "/tmp/s6a/req_Q"
+#define S1AP_AUTHREQ_STAGE2_QUEUE "/tmp/s1ap/authq_stage2_Q"
+#define S1AP_SECREQ_STAGE3_QUEUE "/tmp/s1ap/secreq_stage3_Q"
+#define S1AP_ESMREQ_STAGE4_QUEUE "/tmp/s1ap/esmreq_stage4_Q"
+#define S11_CSREQ_STAGE5_QUEUE "/tmp/s11/CSreq_stage5_Q"
+#define S1AP_ICSREQ_STAGE6_QUEUE "/tmp/s1ap/icsreq_stage6_Q"
+#define S11_MBREQ_STAGE7_QUEUE "/tmp/s11/MBreq_stage7_Q"
+#define S11_DTCHREQ_STAGE1_QUEUE   "/tmp/mme-app/s11_dtchreq_stage1_Q"
+#define S6A_DTCHREQ_STAGE1_QUEUE  "/tmp/mme-app/s6a_dtchreq_stage1_Q"
+#define S1AP_DTCHACCEPT_STAGE2_QUEUE "/tmp/mme-app/s1ap_dtchaccept_stage2_Q"
+#define S6A_PURGE_STAGE2_QUEUE "/tmp/s6a/PURGE_Q"
+
+#endif /*__MESSAGE_QUEUES_H*/
diff --git a/include/common/msgType.h b/include/common/msgType.h
new file mode 100644
index 0000000..f4a13b5
--- /dev/null
+++ b/include/common/msgType.h
@@ -0,0 +1,519 @@
+/*
+ * 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 INCLUDE_COMMON_MSGTYPE_H_
+#define INCLUDE_COMMON_MSGTYPE_H_
+
+#include "err_codes.h"
+#include "s11_structs.h"
+#include "s1ap_structs.h"
+#include "s1ap_ie.h"
+
+
+#define NAS_RAND_SIZE 16
+#define NAS_AUTN_SIZE 16
+
+typedef enum msg_data_t
+{
+    ue_data = 0,
+    session_data
+}msg_data_t;
+
+typedef enum msg_type_t {
+    attach_request = 0,
+    auth_info_request,
+    auth_info_answer,
+    update_loc_request,
+    update_loc_answer,
+    auth_request,
+    auth_response,
+    id_request,
+    id_response,
+    sec_mode_command,
+    sec_mode_complete,
+    esm_info_request,
+    esm_info_response,
+    create_session_request,
+    create_session_response,
+    init_ctxt_request,
+    init_ctxt_response,
+    modify_bearer_request,
+    modify_bearer_response,
+    attach_complete,
+    detach_request,
+    detach_accept,
+    purge_request,
+    purge_answser,
+    delete_session_request,
+    delete_session_response,
+    s1_release_request,
+    s1_release_command,
+    s1_release_complete,
+    release_bearer_request,
+    release_bearer_response,
+    ni_detach_request,
+    detach_accept_from_ue,
+    cancel_location_request,
+    cancel_location_answer,
+    downlink_data_notification,
+    ddn_acknowledgement,
+    paging_request,
+    service_request,
+    ics_req_paging,
+    tau_request,
+    tau_response,
+    max_msg_type
+} msg_type_t;
+
+
+/*************************
+ * Incoming S1AP Messages
+ *************************/
+struct ue_attach_info {
+    int s1ap_enb_ue_id;
+    int criticality;
+    unsigned char IMSI[BINARY_IMSI_LEN];
+    struct TAI tai;
+    struct CGI utran_cgi;
+    struct MS_net_capab ms_net_capab;
+    struct UE_net_capab ue_net_capab;
+    enum ie_RRC_est_cause rrc_cause;
+    int enb_fd;
+    char esm_info_tx_required;
+    unsigned char pti;
+    unsigned int  flags; /* imsi - 0x00000001, GUTI - 0x00000002 */
+    guti mi_guti;
+    unsigned char seq_no;
+    unsigned char dns_present;
+    unsigned short int pco_options[10];
+	
+};
+
+struct authresp_Q_msg {
+    int status;
+    struct XRES res;
+	struct AUTS auts;
+};
+
+struct secmode_resp_Q_msg {
+    int ue_idx;
+    int status;
+};
+
+struct esm_resp_Q_msg {
+    int status;
+    struct apn_name apn;
+};
+
+struct initctx_resp_Q_msg{
+    unsigned short 	eRAB_id;
+    unsigned int 	transp_layer_addr;
+    unsigned int 	gtp_teid;
+};
+
+struct attach_complete_Q_msg {
+    unsigned short	status;
+};
+
+struct service_req_Q_msg {
+        int enb_fd;
+        unsigned int ksi;
+        unsigned int seq_no;
+        unsigned short mac;
+        struct TAI tai;
+        struct CGI utran_cgi;
+        struct STMSI s_tmsi;
+};
+
+struct tauReq_Q_msg {
+    int seq_num;
+    int enb_fd;
+};
+
+struct identityResp_Q_msg {
+	int status;
+	unsigned char IMSI[BINARY_IMSI_LEN];
+};
+
+struct detach_req_Q_msg {
+	int ue_m_tmsi;
+};
+
+typedef union s1_incoming_msgs_t {
+    struct ue_attach_info ue_attach_info_m;
+    struct authresp_Q_msg authresp_Q_msg_m;
+    struct secmode_resp_Q_msg secmode_resp_Q_msg_m;
+    struct esm_resp_Q_msg esm_resp_Q_msg_m;
+    struct initctx_resp_Q_msg initctx_resp_Q_msg_m;
+    struct attach_complete_Q_msg attach_complete_Q_msg_m;
+    struct service_req_Q_msg service_req_Q_msg_m;
+    struct identityResp_Q_msg identityResp_Q_msg_m;
+    struct tauReq_Q_msg tauReq_Q_msg_m;
+    struct detach_req_Q_msg detachReq_Q_msg_m;
+}s1_incoming_msgs_t;
+
+typedef struct s1_incoming_msg_data_t {
+    uint32_t destInstAddr;
+    uint32_t srcInstAddr;
+    msg_type_t msg_type;
+    int ue_idx;
+    int s1ap_enb_ue_id;
+    s1_incoming_msgs_t msg_data;
+}s1_incoming_msg_data_t;
+
+#define S1_READ_MSG_BUF_SIZE sizeof(s1_incoming_msg_data_t)
+
+/*************************
+ * Outgoing S1AP Messages
+ *************************/
+struct authreq_info {
+		msg_type_t msg_type;
+    	int ue_idx;
+    	int enb_s1ap_ue_id;
+    	unsigned char rand[NAS_RAND_SIZE];
+    	unsigned char autn[NAS_AUTN_SIZE];
+     	//struct TAI tai;
+    	int enb_fd;
+};
+
+#define S1AP_AUTHREQ_STAGE2_BUF_SIZE sizeof(struct authreq_info)
+
+struct sec_mode_Q_msg {
+		msg_type_t msg_type;
+    	int ue_idx;
+    	int enb_s1ap_ue_id;
+    	struct UE_net_capab ue_network;
+		struct MS_net_capab  ms_net_capab;
+    	struct KASME key;
+    	uint8_t int_key[NAS_INT_KEY_SIZE];
+    	uint32_t dl_seq_no;
+    	int enb_fd;
+};
+
+#define S1AP_SECREQ_STAGE3_BUF_SIZE sizeof(struct sec_mode_Q_msg)
+
+
+struct esm_req_Q_msg {
+	msg_type_t msg_type;
+	int ue_idx;
+	int enb_s1ap_ue_id;
+	uint8_t pti;
+	uint8_t int_key[NAS_INT_KEY_SIZE];
+	unsigned short dl_seq_no;
+	int enb_fd;
+};
+
+#define S1AP_ESMREQ_STAGE4_BUF_SIZE sizeof(struct esm_req_Q_msg)
+
+struct init_ctx_req_Q_msg {
+	msg_type_t msg_type;
+	int ue_idx;
+	int enb_s1ap_ue_id;
+	unsigned long exg_max_ul_bitrate;
+	unsigned long exg_max_dl_bitrate;
+	struct fteid gtp_teid;
+	struct TAI tai;
+	struct apn_name apn;
+	struct PAA pdn_addr;
+	unsigned char sec_key[32];
+	unsigned char bearer_id;
+	uint8_t int_key[NAS_INT_KEY_SIZE];
+	uint16_t dl_seq_no;
+	int enb_fd;
+	unsigned char pti;
+	unsigned int m_tmsi;
+};
+
+#define S1AP_ICSREQ_STAGE6_BUF_SIZE sizeof(struct init_ctx_req_Q_msg)
+
+struct detach_accept_Q_msg {
+	msg_type_t msg_type;
+	int ue_idx;
+	int enb_s1ap_ue_id;
+	uint8_t int_key[NAS_INT_KEY_SIZE];
+	uint16_t dl_seq_no;
+	int enb_fd;
+};
+
+#define S1AP_DTCHACCEPT_STAGE2_BUF_SIZE sizeof(struct detach_accept_Q_msg)
+
+
+struct s1relcmd_info{
+	msg_type_t msg_type;
+	int ue_idx;
+	int enb_s1ap_ue_id;
+	int enb_fd;
+	s1apCause_t cause;
+};
+#define S1AP_RELCMD_STAGE2_BUF_SIZE sizeof(struct s1relcmd_info)
+
+
+struct ni_detach_request_Q_msg {
+    msg_type_t msg_type;
+    int ue_idx;
+    int enb_s1ap_ue_id;
+    uint8_t int_key[NAS_INT_KEY_SIZE];
+    uint16_t dl_seq_no;
+    int enb_fd;
+    unsigned char detach_type;
+};
+#define S1AP_NI_DTCHREQUEST_BUF_SIZE sizeof(struct ni_detach_request_Q_msg)
+
+struct paging_req_Q_msg {
+	msg_type_t msg_type;
+        int ue_idx;
+        int enb_s1ap_ue_id;
+        int enb_fd;
+	enum s1ap_cn_domain cn_domain;
+	unsigned char IMSI[BINARY_IMSI_LEN];
+	struct TAI tai;
+};
+#define PAGING_REQUEST_BUF_SIZE sizeof(struct paging_req_Q_msg)
+
+struct ics_req_paging_Q_msg {
+	msg_type_t msg_type;
+    int ue_idx;
+    int enb_s1ap_ue_id;
+    int enb_fd;
+	unsigned long ueag_max_ul_bitrate;
+	unsigned long ueag_max_dl_bitrate;
+	unsigned char bearer_id;
+	struct fteid gtp_teid;
+	unsigned char sec_key[32];
+};
+#define ICS_REQ_PAGING_BUF_SIZE sizeof(struct ics_req_paging_Q_msg)
+
+struct attachReqRej_info
+{
+  msg_type_t msg_type;
+  int ue_idx; /*mme s1ap UE id*/
+  int s1ap_enb_ue_id;
+  int enb_fd;
+  unsigned char cause;
+};
+#define S1AP_REQ_REJECT_BUF_SIZE sizeof(struct attachReqRej_info)
+
+struct attachIdReq_info
+{
+	msg_type_t msg_type;
+	int ue_idx; /*mme s1ap UE id*/
+	int s1ap_enb_ue_id;
+ 	int enb_fd;
+    unsigned char ue_type;
+};
+#define S1AP_ID_REQ_BUF_SIZE sizeof(struct attachIdReq_info)
+
+struct tauResp_Q_msg {
+	msg_type_t msg_type;
+	int ue_idx;
+	int enb_fd;
+	int s1ap_enb_ue_id;
+	int status;
+	int dl_seq_no;
+	uint8_t int_key[NAS_INT_KEY_SIZE];
+	struct TAI tai;
+	unsigned int m_tmsi;
+};
+#define S1AP_TAURESP_BUF_SIZE sizeof(struct tauResp_Q_msg)
+
+/*************************
+ * Outgoing GTP Messages
+ *************************/
+struct CS_Q_msg {
+	msg_type_t msg_type;
+	int ue_idx;
+	unsigned char IMSI[BINARY_IMSI_LEN];
+	struct apn_name apn;
+	struct TAI tai;
+	struct CGI utran_cgi;
+	unsigned char MSISDN[MSISDN_STR_LEN];
+	unsigned int max_requested_bw_dl;
+	unsigned int max_requested_bw_ul;
+	unsigned short int pco_options[10];
+};
+#define S11_CSREQ_STAGE5_BUF_SIZE sizeof(struct CS_Q_msg)
+
+#define S11_MB_INDICATION_FLAG_SIZE 3
+struct MB_Q_msg {
+	msg_type_t msg_type;
+	int ue_idx;
+	unsigned short indication[S11_MB_INDICATION_FLAG_SIZE];/*Provision*/
+	unsigned char bearer_id;
+	struct fteid s11_sgw_c_fteid;
+	struct fteid s1u_enb_fteid;
+};
+#define S11_MBREQ_STAGE7_BUF_SIZE sizeof(struct MB_Q_msg)
+
+#define S11_DS_INDICATION_FLAG_SIZE 3
+struct DS_Q_msg {
+	msg_type_t msg_type;
+	unsigned char indication[S11_DS_INDICATION_FLAG_SIZE];/*Provision*/
+	unsigned char bearer_id;
+	struct fteid s11_sgw_c_fteid;
+};
+#define S11_DTCHREQ_STAGE1_BUF_SIZE sizeof(struct DS_Q_msg)
+
+
+#define S11_RB_INDICATION_FLAG_SIZE 3
+struct RB_Q_msg{
+	msg_type_t msg_type;
+	int ue_idx;
+	unsigned short indication[S11_RB_INDICATION_FLAG_SIZE];
+	unsigned char bearer_id;
+	struct fteid s11_sgw_c_fteid;
+	struct fteid s1u_enb_fteid;
+};
+#define S11_RBREQ_STAGE1_BUF_SIZE sizeof(struct RB_Q_msg)
+
+struct DDN_ACK_Q_msg{
+        msg_type_t msg_type;
+        int ue_idx;
+        uint32_t seq_no;
+        uint8_t cause;
+};
+#define S11_DDN_ACK_BUF_SIZE sizeof(struct DDN_ACK_Q_msg)
+/*************************
+ * Incoming GTP Messages
+ *************************/
+struct csr_Q_msg {
+    int status;
+    struct fteid s11_sgw_fteid;
+    struct fteid s5s8_pgwc_fteid;
+    struct fteid s1u_sgw_fteid;
+    struct fteid s5s8_pgwu_fteid;
+    struct PAA pdn_addr;
+};
+
+struct MB_resp_Q_msg {
+    struct fteid s1u_sgw_fteid;
+};
+
+
+struct RB_resp_Q_msg {
+    struct fteid s1u_sgw_fteid;
+};
+
+struct ddn_Q_msg {
+    struct ARP arp;
+    uint8_t cause;
+    uint8_t eps_bearer_id;
+    uint32_t seq_no;
+};
+
+typedef union gtp_incoming_msgs_t {
+    struct csr_Q_msg csr_Q_msg_m;
+    struct MB_resp_Q_msg MB_resp_Q_msg_m;
+    struct RB_resp_Q_msg RB_resp_Q_msg_m;
+    struct ddn_Q_msg ddn_Q_msg_m;    
+}gtp_incoming_msgs_t;
+
+typedef struct gtp_incoming_msg_data_t {
+    uint32_t destInstAddr;
+    uint32_t srcInstAddr;
+    msg_type_t msg_type;
+    int ue_idx;
+    gtp_incoming_msgs_t msg_data;
+}gtp_incoming_msg_data_t;
+
+#define GTP_READ_MSG_BUF_SIZE sizeof(gtp_incoming_msg_data_t)
+
+/*************************
+ * Outgoing S6 Messages
+ *************************/
+struct s6a_Q_msg {
+	msg_type_t msg_type;
+	unsigned char imsi[16];
+	struct TAI tai;
+	struct AUTS auts;
+	unsigned int ue_idx;
+};
+#define S6A_REQ_Q_MSG_SIZE sizeof(struct s6a_Q_msg)
+
+struct s6a_purge_Q_msg {
+	int ue_idx;
+	unsigned char IMSI[BINARY_IMSI_LEN];
+};
+#define S6A_PURGEREQ_STAGE1_BUF_SIZE sizeof(struct s6a_purge_Q_msg)
+
+
+/*************************
+ * Incoming S6 Messages
+ *************************/
+typedef struct E_UTRAN_sec_vector {
+    struct RAND rand;
+    struct XRES xres;
+    struct AUTN autn;
+    struct KASME kasme;
+} E_UTRAN_sec_vector;
+
+struct aia_Q_msg {
+    int res;
+    E_UTRAN_sec_vector sec;
+};
+
+struct ula_Q_msg {
+    unsigned int access_restriction_data;
+    int subscription_status;
+    int net_access_mode;
+    unsigned int RAU_TAU_timer;
+    int res;
+    unsigned int max_requested_bw_dl;
+    unsigned int max_requested_bw_ul;
+    unsigned int apn_config_profile_ctx_id;
+    int all_APN_cfg_included_ind;
+    char MSISDN[MSISDN_STR_LEN];
+};
+
+struct purge_resp_Q_msg {
+    int status;
+};
+
+
+enum CancellationType {
+    MME_UPDATE_PROCEDURE = 0,
+    SGSN_UPDATE_PROCEDURE = 1,
+    SUBSCRIPTION_WITHDRAWAL = 2,
+    INVALID_TYPE
+};
+
+struct clr_Q_msg {
+    msg_type_t msg_type;
+    char origin_host[18];
+    char origin_realm[15];
+    uint8_t imsi[15];   
+    enum CancellationType c_type;
+};
+
+
+typedef union s6_incoming_msgs_t {
+    struct aia_Q_msg aia_Q_msg_m;
+    struct ula_Q_msg ula_Q_msg_m;
+    struct clr_Q_msg clr_Q_msg_m;	//NI Detach
+    struct purge_resp_Q_msg purge_resp_Q_msg_m;
+}s6_incoming_msgs_t;
+
+typedef struct s6_incoming_msg_data_t {
+	uint32_t destInstAddr;
+	uint32_t srcInstAddr;
+    	msg_type_t msg_type;
+    	int ue_idx;
+    	unsigned char IMSI[16];
+	s6_incoming_msgs_t msg_data;
+}s6_incoming_msg_data_t;
+
+#define S6_READ_MSG_BUF_SIZE sizeof(s6_incoming_msg_data_t)
+
+#endif /* INCLUDE_COMMON_MSGTYPE_H_ */
diff --git a/include/common/s11_structs.h b/include/common/s11_structs.h
new file mode 100644
index 0000000..c4ad8f9
--- /dev/null
+++ b/include/common/s11_structs.h
@@ -0,0 +1,130 @@
+/*
+ * 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.
+ */
+
+#ifndef __S11_STRUCTS_H_
+#define __S11_STRUCTS_H_
+
+#include <stdlib.h>
+#include <arpa/inet.h>
+#include <unistd.h>
+
+#pragma pack(1)
+typedef struct gtpv2c_header {
+	struct gtpc{
+		unsigned char spare :3;
+		unsigned char teidFlg :1;
+		unsigned char piggyback :1;
+		unsigned char version :3;
+		unsigned char message_type;
+		unsigned short len;
+	}gtp;
+	union teid {
+		struct has_teid_t {
+			unsigned int teid;
+			unsigned int seq :24;
+			unsigned int spare :8;
+		} has_teid;
+		struct no_teid_t {
+			unsigned int seq :24;
+			unsigned int spare :8;
+		} no_teid;
+	} teid;
+} gtpv2c_header;
+
+typedef struct fteid {
+        struct fteid_header {
+                unsigned char iface_type :6;
+                unsigned char v6 :1;
+                unsigned char v4 :1;
+                unsigned int teid_gre;
+        } header;
+        union ftied_ip {
+                struct in_addr ipv4;
+                struct in6_addr ipv6;
+                struct ipv4v6_t {
+                        struct in_addr ipv4;
+                        struct in6_addr ipv6;
+                } ipv4v6;
+        } ip;
+} fteid_t;
+
+struct PAA {
+	uint8_t pdn_type;
+        union ip_type {
+                struct in_addr ipv4;
+                struct ipv6_t {
+                        uint8_t prefix_length;
+                        struct in6_addr ipv6;
+                } ipv6;
+                struct paa_ipv4v6_t {
+                        uint8_t prefix_length;
+                        struct in6_addr ipv6;
+                        struct in_addr ipv4;
+                } paa_ipv4v6;
+        } ip_type;
+};
+
+struct gtp_cause {
+	unsigned char cause;
+	unsigned char data;
+};
+
+struct bearer_ctx {
+	unsigned char eps_bearer_id;
+	struct gtp_cause cause;
+	struct fteid s1u_sgw_teid;
+	struct fteid s5s8_pgw_u_teid;
+};
+
+struct ARP {
+        uint8_t prioLevel :4;
+        uint8_t preEmptionCapab :1;
+        uint8_t preEmptionVulnebility :1;
+        uint8_t spare :2;
+};
+
+
+struct s11_IE_header {
+	unsigned char ie_type;
+	unsigned short ie_len;
+	unsigned char cr_flag:4;
+	unsigned char instance:4;
+};
+
+union s11_IE_data {
+	struct gtp_cause cause;
+	struct fteid s11_sgw_fteid;
+	struct fteid s5s8_pgw_c_fteid;
+	struct PAA pdn_addr;
+	struct bearer_ctx bearer;
+};
+
+struct s11_IE {
+	struct s11_IE_header header;
+	union s11_IE_data data;
+};
+
+struct s11_proto_IE {
+	unsigned short message_type;
+	unsigned short no_of_ies;
+	struct s11_IE *s11_ies;
+};
+
+#pragma pack()
+
+#endif /* S11_STRUCTS_H */
diff --git a/include/common/s1ap_structs.h b/include/common/s1ap_structs.h
new file mode 100644
index 0000000..d61e13f
--- /dev/null
+++ b/include/common/s1ap_structs.h
@@ -0,0 +1,761 @@
+/*
+ * 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.
+ */
+
+#ifndef __S1AP_STRUCTS_H_
+#define __S1AP_STRUCTS_H_
+
+#include <stdint.h>
+#include <stdbool.h>
+
+#include "sec.h"
+#include "ProcedureCode.h"
+#include "Criticality.h"
+#include "S1AP-PDU.h"
+#include "InitiatingMessage.h"
+
+#define NAS_RAND_SIZE 16
+#define NAS_AUTN_SIZE 16
+
+#define AUTH_REQ_NO_OF_IES 3
+#define SEC_MODE_NO_OF_IES 3
+#define ESM_REQ_NO_OF_IES 3
+#define ICS_REQ_NO_OF_IES 6
+#define DTCH_ACCEPT_NO_OF_IES 3
+#define UE_CTX_RELEASE_NO_OF_IES 3
+#define ATTACH_REJECT_NO_OF_IES 3
+
+#define ATTACH_ID_REQUEST_NO_OF_IES 3
+#define TAU_RSP_NO_OF_IES 3
+
+#define NI_UE_CTX_RELEASE_NO_OF_IES 3
+#define NI_DTCH_REQUEST_NO_OF_IES 3
+
+
+#define AUTH_REQ_NO_OF_NAS_IES 2
+#define SEC_MODE_NO_OF_NAS_IES 1
+#define ICS_REQ_NO_OF_NAS_IES 5
+#define TAU_RSP_NO_OF_NAS_IES 2
+
+#define SERVICE_REQ_SECURITY_HEADER 12
+#define SHORT_MAC_SIZE 2
+
+#define AUTHREQ_NAS_SECURITY_PARAM 0x01
+
+#define MSISDN_STR_LEN 10
+
+#define EMM_MAX_TAI_LIST 16
+
+#define SECURITY_KEY_SIZE 32
+
+#define MAC_SIZE 4
+#define AUTH_SYNC_FAILURE 21
+#define AUTH_RESPONSE 53
+/* ESM messages */
+ #define ESM_MSG_ACTV_DEF_BEAR__CTX_REQ 0xc1
+
+/*24.008 - 10.5.6.1
+APN name can be in range of min 3 octets to max 102 octets
+*/
+#define MAX_APN_LEN 102
+
+
+struct apn_name {
+	unsigned char len;
+	unsigned char val[MAX_APN_LEN];/*TODO: Make dynamic as range is big 3-102*/
+};
+
+/*TODO: Needed fro paging. Ignoring for now*/
+struct proto_conf {
+	int placeholder;
+};
+
+struct esm_sec_info {
+	struct proto_conf proto_config;
+};
+
+/*NAS MSG IE CODES */
+/* Message content : 
+   3gpp 24.301
+   Table 8.2.4.1: IEI Column.*/
+typedef enum
+{
+    NAS_IE_TYPE_EPS_MOBILE_ID_IMSI=0x1,
+    NAS_IE_TYPE_UE_NETWORK_CAPABILITY=0x2,
+    NAS_IE_TYPE_ESM_MSG=0x3,
+    NAS_IE_TYPE_TMSI_STATUS=0x09,
+    NAS_IE_TYPE_MS_NETWORK_FEATURE_SUPPORT=0x0C,
+    NAS_IE_TYPE_GUTI_TYPE=0x0E,
+    NAS_IE_TYPE_ADDITIONAL_UPDATE_TYPE=0xF,
+    NAS_IE_TYPE_MS_CLASSMARK_2=0x11,
+    NAS_IE_TYPE_LAI=0x13,
+    NAS_IE_TYPE_PTMSI_SIGNATURE=0x19,
+    NAS_IE_TYPE_MS_CLASSMARK_3=0x20,
+    NAS_IE_TYPE_APN=0x28,
+    NAS_IE_TYPE_AUTH_FAIL_PARAM=0x30,
+    NAS_IE_TYPE_MS_NETWORK_CAPABILITY=0x31,
+    NAS_IE_TYPE_DRX_PARAM=0x5C,
+    NAS_IE_TYPE_TAI=0x52,
+    NAS_IE_TYPE_VOICE_DOMAIN_PREF_UE_USAGE_SETTING=0x5D,
+    NAS_IE_TYPE_TX_FLAG=0xAA,
+    NAS_IE_TYPE_PCO=0xAB,
+    NAS_IE_TYPE_PTI=0xAC,
+}nas_ie_type;
+typedef struct MS_net_capab {
+    bool          pres;
+	unsigned char element_id;
+	unsigned char len;
+	unsigned char capab[6];
+}MS_net_capab;
+
+#if 0
+/* MS Network capability */
+typedef struct MS_net_capab {
+   unsigned char pres;
+   unsigned char len;
+   unsigned char gea1;
+   unsigned char smCapViaDdctdChan;
+   unsigned char smCapViaGprsChan;
+   unsigned char ucs2Supp;
+   unsigned char ssScrInd;
+   unsigned char soLsaCap;
+   unsigned char revLvlInd;
+   unsigned char pfcFeatMode;
+   unsigned char gea2;
+   unsigned char gea3;
+   unsigned char gea4;
+   unsigned char gea5;
+   unsigned char gea6;
+   unsigned char gea7;
+   unsigned char lcsVaCap;
+   unsigned char psInterRATho2UtranIuModeCap;
+   unsigned char psInterRATho2EutranS1ModeCap;
+   unsigned char csfbCap;
+   unsigned char isrSupp;
+   unsigned char srvcc2UtranCap;
+   unsigned char epcCap;
+}MS_net_capab;
+#endif
+
+struct UE_net_capab {
+	unsigned char len;
+	unsigned char capab[6];
+};
+#if 0
+/* UE Network capability */
+typedef struct UE_net_capab {
+   unsigned char pres;
+   unsigned char len;
+
+   unsigned char eea7;
+   unsigned char eea6;
+   unsigned char eea5;
+   unsigned char eea4;
+   unsigned char eea3;
+   unsigned char eea2_128;
+   unsigned char eea1_128;
+   unsigned char eea0;
+
+   unsigned char eia7;
+   unsigned char eia6;
+   unsigned char eia5;
+   unsigned char eia4;
+   unsigned char eia3;
+   unsigned char eia2_128;
+   unsigned char eia1_128;
+   unsigned char eia0;
+
+   unsigned char uea7;
+   unsigned char uea6;
+   unsigned char uea5;
+   unsigned char uea4;
+   unsigned char uea3;
+   unsigned char uea2;
+   unsigned char uea1;
+   unsigned char uea0;
+
+   unsigned char uia7;
+   unsigned char uia6;
+   unsigned char uia5;
+   unsigned char uia4;
+   unsigned char uia3;
+   unsigned char uia2;
+   unsigned char uia1;
+   unsigned char ucs2;
+
+   unsigned char vcc_1xsr;
+
+} UE_net_capab;
+#endif
+
+enum drx_params {
+	PAGINX_DRX32,
+	PAGINX_DRX64,
+	PAGINX_DRX128,
+	PAGINX_DRX256,
+	PAGINX_DRX512,
+};
+
+enum s1ap_cn_domain
+{
+    CN_DOMAIN_PS,
+    CN_DOMAIN_CS,
+    CN_DOMAIN_NONE
+};
+
+struct s1ap_header{
+	unsigned short procedure_code;
+	unsigned char criticality;
+};
+
+#pragma pack(1)
+
+/*36.413: 9.2.3.8 - MCC, MCN : Only 3 bytes are used*/
+struct PLMN {
+	unsigned char  idx[3];
+};
+
+struct TAI {
+	struct PLMN plmn_id;
+	short tac; /*2 bytes. 36.413: 9.2.3.7*/
+};
+
+struct STMSI {
+	uint8_t mme_code;
+    uint32_t m_TMSI;
+};
+
+
+typedef struct tai_list {
+	uint8_t spare :1;
+	uint8_t type :2;
+	uint8_t num_of_elements :4;
+	struct TAI partial_list[EMM_MAX_TAI_LIST];
+} tai_list;
+
+typedef struct pdn_address {
+	uint8_t spare :5;
+	uint8_t type :3;
+	uint32_t ipv4; /* TODO: Revisit 24.301 - 9.9.4.9.1 */
+} pdn_address;
+
+typedef struct linked_transcation_id {
+	uint8_t flag :1;
+	uint8_t val :7;
+} linked_transcation_id;
+
+typedef struct esm_qos
+{
+	uint8_t reliability_class :3;
+	uint8_t delay_class :3;
+	uint8_t spare1 :2;
+	uint8_t precedence_class :3;
+	uint8_t spare2 :1;
+	uint8_t peak_throughput :4;
+	uint8_t mean_throughput :5;
+	uint8_t spare3 :3;
+	uint8_t delivery_err_sdu :3;
+	uint8_t delivery_order :2;
+	uint8_t traffic_class :3;
+	uint8_t max_sdu_size;
+	uint8_t mbr_ul;
+	uint8_t mbr_dl;
+	uint8_t sdu_err_ratio :4;
+	uint8_t residual_ber :4;
+	uint8_t trffic_prio :2;
+	uint8_t transfer_delay :6;
+	uint8_t gbr_ul;
+	uint8_t gbr_dl;
+	uint8_t src_stat_desc :4;
+	uint8_t sig_ind :1;
+	uint8_t spare4 :3;
+	uint8_t mbr_dl_ext;
+	uint8_t gbr_dl_ext;
+	uint8_t mbr_ul_ext;
+	uint8_t gbr_ul_ext;
+
+} esm_qos;
+
+/* TODO : Revisit 24.301 - 9.9.4.2.1 */
+typedef struct ESM_APN_AMBR {
+	uint8_t dl;
+	uint8_t reserved;
+	uint8_t dlext;
+	uint8_t ulext;
+	uint8_t dlext2;
+	/* uint8_t dl_total; */
+	uint8_t ulext2;
+	/* uint8_t ul_total; */
+} ESM_APN_AMBR;
+
+typedef struct guti {
+	uint8_t spare :4;
+	uint8_t odd_even_indication :1;
+	uint8_t id_type :3;
+	struct PLMN plmn_id;
+	uint16_t mme_grp_id;
+	uint8_t mme_code;
+	uint32_t m_TMSI;
+} guti;
+
+typedef struct esm_msg_container {
+	uint8_t eps_bearer_id :4;
+	uint8_t proto_discriminator :4;
+	uint8_t procedure_trans_identity;
+	uint8_t session_management_msgs;
+	uint8_t eps_qos;  /* TODO: Revisit 24.301 - 9.9.4.3.1 */
+	struct apn_name apn;
+	pdn_address pdn_addr;
+	linked_transcation_id linked_ti;
+	esm_qos negotiated_qos;
+	ESM_APN_AMBR apn_ambr;
+} esm_msg_container;
+
+typedef struct ue_sec_capabilities {
+	uint8_t eea1 :1;
+	uint8_t eea2 :1;
+	uint8_t eea3 :1;
+	uint8_t eea4 :1;
+	uint8_t eea5 :1;
+	uint8_t eea6_128 :1;
+	uint8_t eea7_128 :1;
+	uint8_t eea8 :1;
+
+	uint8_t eia1 :1;
+	uint8_t eia2 :1;
+	uint8_t eia3 :1;
+	uint8_t eia4 :1;
+	uint8_t eia5 :1;
+	uint8_t eia6_128 :1;
+	uint8_t eia8_128 :1;
+	uint8_t eia8 :1;
+
+	uint8_t uea1 :1;
+	uint8_t uea2 :1;
+	uint8_t uea3 :1;
+	uint8_t uea4 :1;
+	uint8_t uea5 :1;
+	uint8_t uea6 :1;
+	uint8_t uea7 :1;
+	uint8_t uea8 :1;
+
+	uint8_t uia1 :1;
+	uint8_t uia2 :1;
+	uint8_t uia3 :1;
+	uint8_t uia4 :1;
+	uint8_t uia5 :1;
+	uint8_t uia6 :1;
+	uint8_t uia7 :1;
+	uint8_t spare1 :1;
+
+	uint8_t gea1 :1;
+	uint8_t gea2 :1;
+	uint8_t gea3 :1;
+	uint8_t gea4 :1;
+	uint8_t gea5 :1;
+	uint8_t gea6 :1;
+	uint8_t gea7 :1;
+	uint8_t spare2 :1;
+} ue_sec_capabilities;
+
+typedef struct nas_pdu_header {
+	unsigned char security_header_type:4;
+	unsigned char proto_discriminator:4;
+	unsigned char message_type;
+	unsigned char security_encryption_algo:4;
+	unsigned char security_integrity_algo:4;
+	unsigned char nas_security_param;
+	unsigned char mac[MAC_SIZE];
+	unsigned char short_mac[SHORT_MAC_SIZE];
+	unsigned char ksi;
+	unsigned char seq_no;
+	unsigned char eps_bearer_identity;
+	unsigned char procedure_trans_identity;
+	unsigned char detach_type;
+} nas_pdu_header;
+
+#pragma pack()
+
+/****Information elements presentations **/
+#define BINARY_IMSI_LEN 8 /*same as packet capture. TODO: Write macros*/
+#define BCD_IMSI_STR_LEN 15
+
+/*36.413 - 9.2.1.38*/
+struct CGI {
+	struct PLMN plmn_id;
+	int cell_id;
+};
+/*36.413: 9.2.1.37*/
+#define MACRO_ENB_ID_SIZE 20
+struct ie_global_enb_id {
+	int plmn;
+	char macro_enb_id[MACRO_ENB_ID_SIZE];
+	/*TODO: make union of enb IDs*/
+};
+
+/*36.413: 9.1.8.4*/
+#define ENB_NAME_SIZE 150
+struct ie_enb_name {
+	char enb_name[ENB_NAME_SIZE];
+};
+
+/*36.413: 9.2.1.3a*/
+enum ie_RRC_est_cause {
+	EMERGENCY,
+	HIGHPRIORITYACCESS,
+	MT_ACCESS,
+	MO_SIGNALLING,
+	MO_DATA,
+	DELAYTOLERANTACCESS,
+	MO_VOICECALL,
+	MO_EXCEPTIONDATA
+};
+
+/**E-RAB structure declarations**/
+struct eRAB_header { //TODO: making provision, chec -is it needed?
+	unsigned char criticality;
+};
+
+struct eRAB_setup_ctx_SU {
+	unsigned short eRAB_id;
+	unsigned short dont_know_byte;
+	unsigned int transp_layer_addr;
+	unsigned int gtp_teid;
+};
+
+union eRAB_IE {
+	struct eRAB_setup_ctx_SU su_res;
+};
+
+typedef struct eRAB_elements {
+	struct eRAB_header header;
+	unsigned char no_of_elements;
+	union eRAB_IE *elements;
+}eRAB_elements;
+/**eRAB structures end**/
+
+/**Information elements structs end**/
+typedef union nas_pdu_elements_union {
+	unsigned char rand[NAS_RAND_SIZE];
+	unsigned char autn[NAS_AUTN_SIZE];
+	unsigned char IMSI[BINARY_IMSI_LEN];
+	unsigned char short_mac[SHORT_MAC_SIZE];
+	struct esm_sec_info esm_info;
+	enum drx_params drx;
+	struct MS_net_capab ms_network;
+	struct UE_net_capab ue_network;
+
+	struct XRES   auth_resp; /*Authentication response*/
+	struct AUTS   auth_fail_resp; /*Authentication response*/
+
+	struct apn_name apn;
+
+	unsigned char attach_res;
+	unsigned char t3412;
+	tai_list tailist;
+	esm_msg_container esm_msg;
+	guti mi_guti;
+	bool esm_info_tx_required;
+	unsigned char pti;
+    unsigned char eps_res;
+    unsigned char spare;
+    unsigned short int pco_options[10];
+}nas_pdu_elements_union;
+typedef struct nas_pdu_elements {
+   nas_ie_type msgType;
+   nas_pdu_elements_union pduElement;
+}nas_pdu_elements;
+
+
+#define NAS_MSG_UE_IE_GUTI  0x00000001
+#define NAS_MSG_UE_IE_IMSI  0x00000002
+#define UE_ID_IMSI(flags)   ((flags & NAS_MSG_UE_IE_IMSI) == NAS_MSG_UE_IE_IMSI)
+#define UE_ID_GUTI(flags)   ((flags & NAS_MSG_UE_IE_GUTI) == NAS_MSG_UE_IE_GUTI)
+typedef struct nasPDU {
+	nas_pdu_header header;
+	unsigned char elements_len;
+	nas_pdu_elements *elements;
+    unsigned int flags;
+} nasPDU;
+
+#pragma pack(1)
+/* TODO : Change type */
+typedef struct ue_aggregate_maximum_bitrate {
+	uint32_t uEaggregateMaxBitRateDL;
+	uint32_t uEaggregateMaxBitRateUL;
+} ue_aggregate_maximum_bitrate;
+
+typedef struct allocation_retention_prio {
+	uint8_t prioLevel :4;
+	uint8_t preEmptionCapab :1;
+	uint8_t preEmptionVulnebility :1;
+	uint8_t spare :2;
+} allocation_retention_prio;
+
+typedef struct E_RAB_Level_QoS_Params {
+	uint8_t qci;
+	//uint8_t ext;
+    allocation_retention_prio arPrio;
+} E_RAB_Level_QoS_Params;
+
+typedef struct ERABSetup {
+	uint8_t e_RAB_ID;
+	E_RAB_Level_QoS_Params e_RAB_QoS_Params;
+	uint32_t transportLayerAddress;
+	uint32_t gtp_teid;
+	struct nasPDU nas;
+} ERABSetup;
+
+#pragma pack()
+/* Dependencies */
+typedef enum s1apCause_PR {
+    s1apCause_PR_NOTHING,   /* No components present */
+    s1apCause_PR_radioNetwork,
+    s1apCause_PR_transport,
+    s1apCause_PR_nas,
+    s1apCause_PR_protocol,
+    s1apCause_PR_misc
+
+} s1apCause_PR;
+
+typedef enum s1apCause_PR_transporauseRadioNetwork {
+    s1apCauseRadioNetwork_unspecified   = 0,
+    s1apCauseRadioNetwork_tx2relocoverall_expiry    = 1,
+    s1apCauseRadioNetwork_successful_handover   = 2,
+    s1apCauseRadioNetwork_release_due_to_eutran_generated_reason    = 3,
+    s1apCauseRadioNetwork_handover_cancelled    = 4,
+    s1apCauseRadioNetwork_partial_handover  = 5,
+    s1apCauseRadioNetwork_ho_failure_in_target_EPC_eNB_or_target_system = 6,
+    s1apCauseRadioNetwork_ho_target_not_allowed = 7,
+    s1apCauseRadioNetwork_tS1relocoverall_expiry    = 8,
+    s1apCauseRadioNetwork_tS1relocprep_expiry   = 9,
+    s1apCauseRadioNetwork_cell_not_available    = 10,
+    s1apCauseRadioNetwork_unknown_targetID  = 11,
+    s1apCauseRadioNetwork_no_radio_resources_available_in_target_cell   = 12,
+    s1apCauseRadioNetwork_unknown_mme_ue_s1ap_id    = 13,
+    s1apCauseRadioNetwork_unknown_enb_ue_s1ap_id    = 14,
+    s1apCauseRadioNetwork_unknown_pair_ue_s1ap_id   = 15,
+    s1apCauseRadioNetwork_handover_desirable_for_radio_reason   = 16,
+    s1apCauseRadioNetwork_time_critical_handover    = 17,
+    s1apCauseRadioNetwork_resource_optimisation_handover    = 18,
+    s1apCauseRadioNetwork_reduce_load_in_serving_cell   = 19,
+    s1apCauseRadioNetwork_user_inactivity   = 20,
+    s1apCauseRadioNetwork_radio_connection_with_ue_lost = 21,
+    s1apCauseRadioNetwork_load_balancing_tau_required   = 22,
+    s1apCauseRadioNetwork_cs_fallback_triggered = 23,
+    s1apCauseRadioNetwork_ue_not_available_for_ps_service   = 24,
+    s1apCauseRadioNetwork_radio_resources_not_available = 25,
+    s1apCauseRadioNetwork_failure_in_radio_interface_procedure  = 26,
+    s1apCauseRadioNetwork_invalid_qos_combination   = 27,
+    s1apCauseRadioNetwork_interrat_redirection  = 28,
+    s1apCauseRadioNetwork_interaction_with_other_procedure  = 29,
+    s1apCauseRadioNetwork_unknown_E_RAB_ID  = 30,
+    s1apCauseRadioNetwork_multiple_E_RAB_ID_instances   = 31,
+    s1apCauseRadioNetwork_encryption_and_or_integrity_protection_algorithms_not_supported   = 32,
+    s1apCauseRadioNetwork_s1_intra_system_handover_triggered    = 33,
+    s1apCauseRadioNetwork_s1_inter_system_handover_triggered    = 34,
+    s1apCauseRadioNetwork_x2_handover_triggered = 35,
+    s1apCauseRadioNetwork_redirection_towards_1xRTT = 36,
+    s1apCauseRadioNetwork_not_supported_QCI_value   = 37,
+    s1apCauseRadioNetwork_invalid_CSG_Id    = 38,
+    s1apCauseRadioNetwork_release_due_to_pre_emption    = 39
+} e_s1apCauseRadioNetwork;
+
+typedef enum s1apCauseTransport {
+    s1apCauseTransport_transport_resource_unavailable   = 0,
+    s1apCauseTransport_unspecified  = 1
+} e_s1apCauseTransport;
+
+typedef enum s1apCauseNas {
+    s1apCauseNas_normal_release = 0,
+    s1apCauseNas_authentication_failure = 1,
+    s1apCauseNas_detach = 2,
+    s1apCauseNas_unspecified    = 3,
+    s1apCauseNas_csg_subscription_expiry    = 4
+} e_s1apCauseNas;
+
+typedef enum s1apCauseProtocol {
+    s1apCauseProtocol_transfer_syntax_error = 0,
+    s1apCauseProtocol_abstract_syntax_error_reject  = 1,
+    s1apCauseProtocol_abstract_syntax_error_ignore_and_notify   = 2,
+    s1apCauseProtocol_message_not_compatible_with_receiver_state    = 3,
+    s1apCauseProtocol_semantic_error    = 4,
+    s1apCauseProtocol_abstract_syntax_error_falsely_constructed_message = 5,
+    s1apCauseProtocol_unspecified   = 6
+} e_s1apCauseProtocol;
+
+typedef enum s1apCauseMisc {
+    s1apCauseMisc_control_processing_overload   = 0,
+    s1apCauseMisc_not_enough_user_plane_processing_resources    = 1,
+    s1apCauseMisc_hardware_failure  = 2,
+    s1apCauseMisc_om_intervention   = 3,
+    s1apCauseMisc_unspecified   = 4,
+    s1apCauseMisc_unknown_PLMN  = 5
+} e_s1apCauseMisc;
+
+/* s1apCauseMisc */
+typedef long     s1apCauseMisc_t;
+/* s1apCauseProtocol */
+typedef long     s1apCauseProtocol_t;
+/* s1apCauseNas */
+typedef long     s1apCauseNas_t;
+/* s1apCauseTransport */
+typedef long     s1apCauseTransport_t;
+/* s1apCauseRadioNetwork */
+typedef long     s1apCauseRadioNetwork_t;
+
+typedef struct s1apCause {
+    s1apCause_PR present;
+    union s1apCause_u {
+        s1apCauseRadioNetwork_t  radioNetwork;
+        s1apCauseTransport_t     transport;
+        s1apCauseNas_t   nas;
+        s1apCauseProtocol_t  protocol;
+        s1apCauseMisc_t  misc;
+    } choice;
+} s1apCause_t;
+
+
+typedef struct proto_IE_data {
+	int 			IE_type;
+    union value{
+        struct ie_enb_name 	enb_name;
+        struct ie_global_enb_id global_enb_id;
+        long			enb_ue_s1ap_id;
+        long			mme_ue_s1ap_id;
+        struct 			nasPDU nas;
+        struct s1apCause cause;
+        struct TAI 		 tai;
+        struct CGI 		 utran_cgi;
+        struct STMSI	 s_tmsi;
+        enum ie_RRC_est_cause 	rrc_est_cause;
+        struct eRAB_elements 	erab;
+        ue_aggregate_maximum_bitrate ue_aggrt_max_bit_rate;
+        ERABSetup E_RABToBeSetupItemCtxtSUReq;
+        ue_sec_capabilities ue_sec_capab;
+        uint8_t sec_key[SECURITY_KEY_SIZE];
+    }val;
+}proto_IEs;
+
+struct proto_IE {
+    ProcedureCode_t  procedureCode;
+    Criticality_t    criticality;
+	short 		no_of_IEs;
+	proto_IEs	*data;
+	uint8_t     ie_nas_index;
+    uint8_t     ie_tai_index;
+    uint8_t     ie_cgi_index;
+};
+
+enum protocolie_id {
+	id_MME_UE_S1AP_ID = 0,
+	id_Cause = 2,
+	id_eNB_UE_S1AP_ID = 8,
+	id_ERABToBeSetupListCtxtSUReq = 24,
+	id_NAS_PDU = 26,
+	id_ERABToBeSetupItemCtxtSUReq = 52,
+	id_uEaggregatedMaximumBitrate = 66,
+	id_SecurityKey = 73,
+	id_UE_S1AP_IDs = 99,
+	id_UESecurityCapabilities = 107,
+};
+
+enum protocol_discriminator{
+	EPSSessionManagementMessage = 2,
+    EPSMobilityManagementMessages = 7,
+};
+
+enum criticality{
+	CRITICALITY_REJECT = 0x0,
+	CRITICALITY_IGNORE = 0x40,
+	CRITICALITY_NOTIFY,
+};
+
+enum eps_nas_mesage_type {
+	AttachAccept = 0x42,
+	AttachReject = 0x44,
+	DetachAccept = 0x46,
+	DetachRequest = 0x45,
+	TauAccept    = 0x49,
+    TauReject    = 0x4b,
+	AuthenticationRequest = 0x52,
+    IdentityRequest       = 0x55,
+	SecurityModeCommand = 0x5d,
+	ESMInformationRequest = 0xd9,
+};
+
+enum procedure_code {
+	id_InitialContextSetup = 9,
+	id_downlinkNASTransport = 11,
+	id_errorIndication = 15,
+	id_UEContexRelease = 23,
+};
+
+typedef struct s1ap_PDU {
+	unsigned char procedurecode;
+	unsigned char criticality;
+	struct proto_IE value;
+}s1ap_PDU;
+
+/* NAS Security Header */
+typedef enum security_header_type {
+    Plain = 0,
+    IntegrityProtected,
+    IntegrityProtectedCiphered,
+    IntegrityProtectedEPSSecCntxt,
+}security_header_type;
+
+typedef struct nas_pdu_header_sec {
+        unsigned char security_header_type:4;
+        unsigned char proto_discriminator:4;
+        unsigned char mac[MAC_SIZE];
+        unsigned char seq_no;
+}nas_pdu_header_sec;
+
+typedef struct nas_pdu_header_short {
+        unsigned char security_header_type:4;
+        unsigned char proto_discriminator:4;
+        unsigned char message_type;
+}nas_pdu_header_short;
+
+typedef struct nas_pdu_header_long {
+        unsigned char security_header_type:4;
+        unsigned char proto_discriminator:4;
+        unsigned char procedure_trans_identity;
+        unsigned char message_type;
+}nas_pdu_header_long;
+
+/* NAS Security Encryption Algorithm */
+typedef enum security_encryption_algo {
+	Algo_EEA0 = 0,
+
+}security_encryption_algo;
+
+/* NAS Security Integrity Algorithm */
+typedef enum security_integrity_algo {
+	Algo_EIA0 = 0,
+	Algo_128EIA1 = 1,
+}security_integrity_algo;
+
+
+#define BUFFER_SIZE 255
+
+typedef struct Buffer {
+	unsigned char buf[BUFFER_SIZE];
+	unsigned char pos;
+}Buffer;
+
+#endif /*__S1AP_STRUCTS_H*/
diff --git a/include/common/sec.h b/include/common/sec.h
new file mode 100644
index 0000000..845c2d8
--- /dev/null
+++ b/include/common/sec.h
@@ -0,0 +1,84 @@
+/*
+ * 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.
+ */
+
+#ifndef __STAGE1_SEC_H_
+#define __STAGE1_SEC_H_
+
+/* Common to HSS and MME */
+#define AIA_RES_SIZE         8
+#define AIA_AUTS_SIZE        14
+#define AIA_AUTN_SIZE        16
+#define AIA_RAND_SIZE        16
+#define AIA_KASME_SIZE       32
+#define AIA_NEXT_HOP_SIZE    32
+
+#define HASH_SALT_LEN        7
+#define HASH_KEY_LEN         512
+
+#define NAS_INT_KEY_SIZE     16
+#define KENB_SIZE            32
+#define HMAC_SIZE            1024
+
+typedef struct RAND {
+	unsigned char len;
+	unsigned char val[AIA_RAND_SIZE];
+} RAND;
+
+typedef struct XRES {
+	unsigned char len;
+	unsigned char val[AIA_RES_SIZE];
+} XRES;
+
+typedef struct AUTS {
+	unsigned char len;
+	unsigned char val[AIA_AUTS_SIZE];
+} AUTS;
+
+typedef struct AUTN {
+	unsigned char len;
+	unsigned char val[AIA_AUTN_SIZE];
+} AUTN;
+
+typedef struct KASME {
+	unsigned char len;
+	unsigned char val[AIA_KASME_SIZE];
+} KASME;
+
+/**
+ * @brief Create integrity key
+ * @param[in] kasme key
+ * @param[out] int_key generated integrity key
+ * @return void
+ */
+void create_integrity_key(unsigned char *kasme, unsigned char *int_key);
+
+/**
+ * @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 create_kenb_key(unsigned char *kasme, unsigned char *kenb_key,
+		unsigned int seq_no);
+
+
+void 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);
+
+#endif
diff --git a/include/common/snow_3g.h b/include/common/snow_3g.h
new file mode 100644
index 0000000..fe2e8d4
--- /dev/null
+++ b/include/common/snow_3g.h
@@ -0,0 +1,44 @@
+/*---------------------------------------------------------
+* SNOW_3G.h
+*---------------------------------------------------------*/
+/*
+ * 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+
+
+typedef unsigned char u8;
+typedef unsigned int u32;
+typedef unsigned long long u64;
+
+/* 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)
+ * specs document.
+ */
+
+
+void Initialize(u32 k[4], u32 IV[4]);
+
+/* 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)
+* specs document.
+*/
+
+void GenerateKeystream(u32 n, u32 *z);
+
diff --git a/include/common/stimer.h b/include/common/stimer.h
new file mode 100644
index 0000000..ddf65dc
--- /dev/null
+++ b/include/common/stimer.h
@@ -0,0 +1,60 @@
+/*
+ * 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.
+ */
+
+#ifndef __STIMER_H
+#define __STIMER_H
+
+#include <time.h>
+
+typedef long long int stimer_t;
+
+#define STIMER_GET_CURRENT_TP(__now__)                                                 \
+({                                                                                     \
+   struct timespec __ts__;                                                             \
+   __now__ = clock_gettime(CLOCK_REALTIME,&__ts__) ?                                   \
+         -1 : (((stimer_t)__ts__.tv_sec) * 1000000000) + ((stimer_t)__ts__.tv_nsec);   \
+   __now__;                                                                            \
+})
+
+#define STIMER_GET_ELAPSED_NS(_start_)                                                 \
+({                                                                                     \
+   stimer_t __ns__;                                                                    \
+   STIMER_GET_CURRENT_TP(__ns__);                                                      \
+   if (__ns__ != -1)                                                                   \
+      __ns__ -= _start_;                                                               \
+   __ns__;                                                                             \
+})
+
+#define STIMER_GET_ELAPSED_US(__start__)                                               \
+({                                                                                     \
+   stimer_t __us__ = STIMER_GET_ELAPSED_NS(__start__);                                 \
+   if (__us__ != -1)                                                                   \
+      __us__ = (__us__ / 1000) + (__us__ % 1000 >= 500 ? 1 : 0);                       \
+   __us__;                                                                             \
+})
+
+#define STIMER_GET_ELAPSED_MS(___start___)                                             \
+({                                                                                     \
+   stimer_t __ms__ = STIMER_GET_ELAPSED_US(___start___);                               \
+   if (__ms__ != -1)                                                                   \
+      __ms__ = (__ms__ / 1000) + (__ms__ % 1000 >= 500 ? 1 : 0);                       \
+   __ms__;                                                                             \
+})
+
+#endif
+
diff --git a/include/common/thread_pool.h b/include/common/thread_pool.h
new file mode 100644
index 0000000..0bbad0b
--- /dev/null
+++ b/include/common/thread_pool.h
@@ -0,0 +1,58 @@
+/*
+ * 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.
+ */
+
+#ifndef __THREAD_POOL_H
+#define __THREAD_POOL_H
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+struct thread_pool;
+typedef void (* JobFunction) (void *);
+
+/*
+ * Creates new thread pool
+ * on success return pointer to thread_pool
+ * on failure return NULL
+ */
+extern struct thread_pool *thread_pool_new(int count);
+
+/*
+ * Stops all threads and
+ * destroy the thread pool
+ * on success return 0
+ * on failure return -1
+ */
+extern int thread_pool_destroy(struct thread_pool *pool);
+
+/*
+ * Queues the job to thread pool
+ * idle threads will pick the job
+ * on success it return 0
+ * on failure returns -ve values
+ */
+extern int insert_job(struct thread_pool *pool, JobFunction function,
+		void *userdata);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/include/common/tpool_queue.h b/include/common/tpool_queue.h
new file mode 100644
index 0000000..9ebd3f3
--- /dev/null
+++ b/include/common/tpool_queue.h
@@ -0,0 +1,62 @@
+/*
+ * 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.
+ */
+
+#ifndef __TPOOL_QUEUE_H
+#define __TPOOL_QUEUE_H
+
+struct node {
+	void *data;
+	struct node *next;
+};
+
+struct Queue {
+	int length;
+	struct node *head;
+	struct node *tail;
+};
+
+struct thread_pool {
+	struct Queue *thread_queue;	/* queue to store thread ids */
+	struct Queue *job_queue;	/* for storing jobs */
+
+	pthread_mutex_t queue_mutex;	/* protection to job_queue */
+	pthread_cond_t job_received;	/* synchronisation with worker threads */
+	
+	pthread_t dispatch_thread;	/* signals threads if new work in job_queue*/
+
+	int idle_threads;		/* count of idle threads */
+};
+
+struct Job {
+	JobFunction function;
+	void *arg;
+};
+
+struct Queue;
+
+typedef void (* QueueDataFreeFunc)(void *data);
+
+extern struct Queue *queue_new();
+extern void queue_destroy(struct Queue *queue, QueueDataFreeFunc function);
+
+extern int queue_push_tail(struct Queue *queue, void *data);
+extern void *queue_pop_head(struct Queue *queue);
+extern int queue_get_length(struct Queue *queue);
+
+#endif
+
diff --git a/include/mme-app/actionHandlers/actionHandlers.h b/include/mme-app/actionHandlers/actionHandlers.h
new file mode 100644
index 0000000..be57cf7
--- /dev/null
+++ b/include/mme-app/actionHandlers/actionHandlers.h
@@ -0,0 +1,302 @@
+
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**************************************
+ * 
+ * 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/actionHandlers.h.tt>
+ **************************************/
+#ifndef ACTIONHANDLERS_H_
+#define ACTIONHANDLERS_H_
+
+#include "smTypes.h"
+
+namespace mme
+{
+    class ActionHandlers
+    {
+
+        /***************************************
+        * Constructor
+        ****************************************/
+        ActionHandlers()
+        {
+        }
+
+        /***************************************
+        * Destructor
+        ****************************************/
+        ~ActionHandlers()
+        {
+        }
+
+        public:
+
+        /**********************************************
+        * Action handler : attach_done
+        ***********************************************/
+        static SM::ActStatus attach_done(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : auth_req_to_ue
+        ***********************************************/
+        static SM::ActStatus auth_req_to_ue(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : auth_response_validate
+        ***********************************************/
+        static SM::ActStatus auth_response_validate(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : check_esm_info_req_required
+        ***********************************************/
+        static SM::ActStatus check_esm_info_req_required(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : cs_req_to_sgw
+        ***********************************************/
+        static SM::ActStatus cs_req_to_sgw(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : default_attach_req_handler
+        ***********************************************/
+        static SM::ActStatus default_attach_req_handler(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : default_cancel_loc_req_handler
+        ***********************************************/
+        static SM::ActStatus default_cancel_loc_req_handler(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : default_ddn_handler
+        ***********************************************/
+        static SM::ActStatus default_ddn_handler(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : default_detach_req_handler
+        ***********************************************/
+        static SM::ActStatus default_detach_req_handler(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : default_s1_release_req_handler
+        ***********************************************/
+        static SM::ActStatus default_s1_release_req_handler(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : default_service_req_handler
+        ***********************************************/
+        static SM::ActStatus default_service_req_handler(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : default_tau_req_handler
+        ***********************************************/
+        static SM::ActStatus default_tau_req_handler(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : del_session_req
+        ***********************************************/
+        static SM::ActStatus del_session_req(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : detach_accept_to_ue
+        ***********************************************/
+        static SM::ActStatus detach_accept_to_ue(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : ni_detach_req_to_ue
+        ***********************************************/
+        static SM::ActStatus ni_detach_req_to_ue(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : perform_auth_and_sec_check
+        ***********************************************/
+        static SM::ActStatus perform_auth_and_sec_check(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : process_aia
+        ***********************************************/
+        static SM::ActStatus process_aia(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : process_attach_cmp_from_ue
+        ***********************************************/
+        static SM::ActStatus process_attach_cmp_from_ue(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : process_cs_resp
+        ***********************************************/
+        static SM::ActStatus process_cs_resp(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : process_del_session_resp
+        ***********************************************/
+        static SM::ActStatus process_del_session_resp(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : process_detach_accept_from_ue
+        ***********************************************/
+        static SM::ActStatus process_detach_accept_from_ue(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : process_esm_info_resp
+        ***********************************************/
+        static SM::ActStatus process_esm_info_resp(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : process_identity_response
+        ***********************************************/
+        static SM::ActStatus process_identity_response(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : process_init_ctxt_resp
+        ***********************************************/
+        static SM::ActStatus process_init_ctxt_resp(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : process_init_ctxt_resp_svc_req
+        ***********************************************/
+        static SM::ActStatus process_init_ctxt_resp_svc_req(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : process_mb_resp
+        ***********************************************/
+        static SM::ActStatus process_mb_resp(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : process_mb_resp_svc_req
+        ***********************************************/
+        static SM::ActStatus process_mb_resp_svc_req(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : process_rel_ab_resp_from_sgw
+        ***********************************************/
+        static SM::ActStatus process_rel_ab_resp_from_sgw(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : process_sec_mode_resp
+        ***********************************************/
+        static SM::ActStatus process_sec_mode_resp(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : process_service_request
+        ***********************************************/
+        static SM::ActStatus process_service_request(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : process_ue_ctxt_rel_comp
+        ***********************************************/
+        static SM::ActStatus process_ue_ctxt_rel_comp(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : process_ue_ctxt_rel_comp_for_detach
+        ***********************************************/
+        static SM::ActStatus process_ue_ctxt_rel_comp_for_detach(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : process_ula
+        ***********************************************/
+        static SM::ActStatus process_ula(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : sec_mode_cmd_to_ue
+        ***********************************************/
+        static SM::ActStatus sec_mode_cmd_to_ue(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : send_air_to_hss
+        ***********************************************/
+        static SM::ActStatus send_air_to_hss(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : send_auth_reject
+        ***********************************************/
+        static SM::ActStatus send_auth_reject(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : send_ddn_ack_to_sgw
+        ***********************************************/
+        static SM::ActStatus send_ddn_ack_to_sgw(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : send_esm_info_req_to_ue
+        ***********************************************/
+        static SM::ActStatus send_esm_info_req_to_ue(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : send_identity_request_to_ue
+        ***********************************************/
+        static SM::ActStatus send_identity_request_to_ue(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : send_init_ctxt_req_to_ue
+        ***********************************************/
+        static SM::ActStatus send_init_ctxt_req_to_ue(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : send_init_ctxt_req_to_ue_svc_req
+        ***********************************************/
+        static SM::ActStatus send_init_ctxt_req_to_ue_svc_req(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : send_mb_req_to_sgw
+        ***********************************************/
+        static SM::ActStatus send_mb_req_to_sgw(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : send_mb_req_to_sgw_svc_req
+        ***********************************************/
+        static SM::ActStatus send_mb_req_to_sgw_svc_req(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : send_paging_req_to_ue
+        ***********************************************/
+        static SM::ActStatus send_paging_req_to_ue(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : send_rel_ab_req_to_sgw
+        ***********************************************/
+        static SM::ActStatus send_rel_ab_req_to_sgw(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : send_s1_rel_cmd_to_ue
+        ***********************************************/
+        static SM::ActStatus send_s1_rel_cmd_to_ue(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : send_s1_rel_cmd_to_ue_for_detach
+        ***********************************************/
+        static SM::ActStatus send_s1_rel_cmd_to_ue_for_detach(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : send_tau_response_to_ue
+        ***********************************************/
+        static SM::ActStatus send_tau_response_to_ue(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : send_ulr_to_hss
+        ***********************************************/
+        static SM::ActStatus send_ulr_to_hss(SM::ControlBlock& cb);                
+
+        /**********************************************
+        * Action handler : validate_imsi_in_ue_context
+        ***********************************************/
+        static SM::ActStatus validate_imsi_in_ue_context(SM::ControlBlock& cb);                
+    };//ActionHandlers
+};//mme
+
+#endif /* ACTIONHANDLERS_H_ */
\ No newline at end of file
diff --git a/include/mme-app/contextManager/bearerContextManager.h b/include/mme-app/contextManager/bearerContextManager.h
new file mode 100644
index 0000000..5f33047
--- /dev/null
+++ b/include/mme-app/contextManager/bearerContextManager.h
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 __BearerContextManager__
+#define __BearerContextManager__
+/******************************************************
+* bearerContextManager.h
+ * 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.h.tt>
+ ***************************************/
+#include "memPoolManager.h"
+
+namespace mme
+{
+	class BearerContext;
+
+	class BearerContextManager
+	{
+	public:
+		/****************************************
+		* BearerContextManager
+		*  constructor
+		****************************************/
+		BearerContextManager(int numOfBlocks);
+		
+		/****************************************
+		* BearerContextManager
+		*    Destructor
+		****************************************/
+		~BearerContextManager();
+		
+		/******************************************
+		 * allocateBearerContext
+		 *  allocate BearerContext data block
+		 ******************************************/
+		BearerContext* allocateBearerContext();
+		
+		/******************************************
+		 * deallocateBearerContext
+		 *  deallocate a BearerContext data block
+		 ******************************************/
+		void deallocateBearerContext(BearerContext* BearerContextp );
+	
+	private:
+		cmn::memPool::MemPoolManager<BearerContext> poolManager_m;
+	};
+};
+
+#endif
+		
+		
diff --git a/include/mme-app/contextManager/dataBlocks.h b/include/mme-app/contextManager/dataBlocks.h
new file mode 100644
index 0000000..b3b4809
--- /dev/null
+++ b/include/mme-app/contextManager/dataBlocks.h
@@ -0,0 +1,962 @@
+/*
+ * 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 DGM_BLOCKSTRUCTURES_H
+#define DGM_BLOCKSTRUCTURES_H
+/**************************************
+*
+* 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/dataBlocks.h.tt>
+ ***************************************/
+#include "structs.h"
+#include "permDataBlock.h"
+#include "tempDataBlock.h"
+#include <utils/mmeCauseTypes.h>
+
+namespace mme
+{
+	class UEContext;
+	class MmContext;
+	class SessionContext;
+	class BearerContext;
+	class MmeProcedureCtxt;
+	class MmeDetachProcedureCtxt;
+	class MmeSvcReqProcedureCtxt;
+	class MmeTauProcedureCtxt;
+
+	class UEContext:public SM::PermDataBlock
+	{
+		public:
+	
+			/****************************************
+			* UEContext
+			*    constructor
+			****************************************/
+			UEContext();
+			
+			/****************************************
+			* ~UEContext
+			*    destructor
+			****************************************/
+			~UEContext();
+			
+			/****************************************
+			* setenbFd
+			*    set enbFd to UEContext
+			****************************************/
+			void setEnbFd( int enbFd_i );
+			
+			/****************************************
+			* getenbFd
+			*    get enbFd from UEContext
+			****************************************/
+			int getEnbFd();
+			
+			/****************************************
+			* sets1apEnbUeId
+			*    set s1apEnbUeId to UEContext
+			****************************************/
+			void setS1apEnbUeId( int s1apEnbUeId_i );
+			
+			/****************************************
+			* gets1apEnbUeId
+			*    get s1apEnbUeId from UEContext
+			****************************************/
+			int getS1apEnbUeId();
+			
+			/****************************************
+			* setsubscriptionStatus
+			*    set subscriptionStatus to UEContext
+			****************************************/
+			void setSubscriptionStatus( int subscriptionStatus_i );
+			
+			/****************************************
+			* getsubscriptionStatus
+			*    get subscriptionStatus from UEContext
+			****************************************/
+			int getSubscriptionStatus();
+			
+			/****************************************
+			* setnetAccessMode
+			*    set netAccessMode to UEContext
+			****************************************/
+			void setNetAccessMode( int netAccessMode_i );
+			
+			/****************************************
+			* getnetAccessMode
+			*    get netAccessMode from UEContext
+			****************************************/
+			int getNetAccessMode();
+			
+			/****************************************
+			* setcontextID
+			*    set contextID to UEContext
+			****************************************/
+			void setContextID( uint32_t contextID_i );
+			
+			/****************************************
+			* getcontextID
+			*    get contextID from UEContext
+			****************************************/
+			uint32_t getContextID();
+			
+			/****************************************
+			* setrauTauTimer
+			*    set rauTauTimer to UEContext
+			****************************************/
+			void setRauTauTimer( unsigned int rauTauTimer_i );
+			
+			/****************************************
+			* getrauTauTimer
+			*    get rauTauTimer from UEContext
+			****************************************/
+			unsigned int getRauTauTimer();
+			
+			/****************************************
+			* setaccessRestrictionData
+			*    set accessRestrictionData to UEContext
+			****************************************/
+			void setAccessRestrictionData( unsigned int accessRestrictionData_i );
+			
+			/****************************************
+			* getaccessRestrictionData
+			*    get accessRestrictionData from UEContext
+			****************************************/
+			unsigned int getAccessRestrictionData();
+			
+			/****************************************
+			* setimsi
+			*    set imsi to UEContext
+			****************************************/
+			void setImsi( const DigitRegister15& imsi_i );
+			
+			/****************************************
+			* getimsi
+			*    get imsi from UEContext
+			****************************************/
+			const DigitRegister15& getImsi()const;
+			
+			/****************************************
+			* setmsisdn
+			*    set msisdn to UEContext
+			****************************************/
+			void setMsisdn( const DigitRegister15& msisdn_i );
+			
+			/****************************************
+			* getmsisdn
+			*    get msisdn from UEContext
+			****************************************/
+			const DigitRegister15& getMsisdn()const;
+			
+			/****************************************
+			* setdwnLnkSeqNo
+			*    set dwnLnkSeqNo to UEContext
+			****************************************/
+			void setDwnLnkSeqNo( unsigned short dwnLnkSeqNo_i );
+			
+			/****************************************
+			* getdwnLnkSeqNo
+			*    get dwnLnkSeqNo from UEContext
+			****************************************/
+			unsigned short getDwnLnkSeqNo();
+			
+			/****************************************
+			* setupLnkSeqNo
+			*    set upLnkSeqNo to UEContext
+			****************************************/
+			void setUpLnkSeqNo( unsigned short upLnkSeqNo_i );
+			
+			/****************************************
+			* getupLnkSeqNo
+			*    get upLnkSeqNo from UEContext
+			****************************************/
+			unsigned short getUpLnkSeqNo();
+			
+			/****************************************
+			* setueState
+			*    set ueState to UEContext
+			****************************************/
+			void setUeState( UE_State_e ueState_i );
+			
+			/****************************************
+			* getueState
+			*    get ueState from UEContext
+			****************************************/
+			UE_State_e getUeState();
+			
+			/****************************************
+			* settai
+			*    set tai to UEContext
+			****************************************/
+			void setTai( const Tai& tai_i );
+			
+			/****************************************
+			* gettai
+			*    get tai from UEContext
+			****************************************/
+			const Tai& getTai()const;
+			
+			/****************************************
+			* setutranCgi
+			*    set utranCgi to UEContext
+			****************************************/
+			void setUtranCgi( const Cgi& utranCgi_i );
+			
+			/****************************************
+			* getutranCgi
+			*    get utranCgi from UEContext
+			****************************************/
+			const Cgi& getUtranCgi()const;
+			
+			/****************************************
+			* setmsNetCapab
+			*    set msNetCapab to UEContext
+			****************************************/
+			void setMsNetCapab( const Ms_net_capab& msNetCapab_i );
+			
+			/****************************************
+			* getmsNetCapab
+			*    get msNetCapab from UEContext
+			****************************************/
+			const Ms_net_capab& getMsNetCapab()const;
+			
+			/****************************************
+			* setueNetCapab
+			*    set ueNetCapab to UEContext
+			****************************************/
+			void setUeNetCapab( const Ue_net_capab& ueNetCapab_i );
+			
+			/****************************************
+			* getueNetCapab
+			*    get ueNetCapab from UEContext
+			****************************************/
+			const Ue_net_capab& getUeNetCapab()const;
+			
+			/****************************************
+			* setueSecInfo
+			*    set ueSecInfo to UEContext
+			****************************************/
+			void setUeSecInfo( const Secinfo& ueSecInfo_i );
+			
+			/****************************************
+			* getueSecInfo
+			*    get ueSecInfo from UEContext
+			****************************************/
+			const Secinfo& getUeSecInfo()const;
+			
+			/****************************************
+			* setambr
+			*    set ambr to UEContext
+			****************************************/
+			void setAmbr( const Ambr& ambr_i );
+			
+			/****************************************
+			* getambr
+			*    get ambr from UEContext
+			****************************************/
+			const Ambr& getAmbr()const;
+			
+			/****************************************
+			* setaiaSecInfo
+			*    set aiaSecInfo to UEContext
+			****************************************/
+			void setAiaSecInfo( const E_utran_sec_vector& aiaSecInfo_i );
+			
+			/****************************************
+			* getaiaSecInfo
+			*    get aiaSecInfo from UEContext
+			****************************************/
+			const E_utran_sec_vector& getAiaSecInfo()const;
+			
+			/****************************************
+			* setmTmsi
+			*    set mTmsi to UEContext
+			****************************************/
+			void setMtmsi( uint32_t mTmsi );
+
+			/****************************************
+			* getaiaSecInfo
+			*    get aiaSecInfo from UEContext
+			****************************************/
+			uint32_t getMtmsi();
+			
+			/****************************************
+			* setMmContext
+			*    set MmContext to UEContext
+			****************************************/
+			void setMmContext( MmContext* MmContextp ) ;
+			
+			/****************************************
+			* getMmContext
+			*    get MmContext to UEContext
+			****************************************/
+			MmContext* getMmContext();
+			
+			/****************************************
+			* setSessionContext
+			*    set SessionContext to UEContext
+			****************************************/
+			void setSessionContext( SessionContext* SessionContextp ) ;
+			
+			/****************************************
+			* getSessionContext
+			*    get SessionContext to UEContext
+			****************************************/
+			SessionContext* getSessionContext();
+			
+		
+		private:
+		
+			// DataName
+			int enbFd_m;
+			
+			// DataName
+			int s1apEnbUeId_m;
+			
+			// DataName
+			int subscriptionStatus_m;
+			
+			// DataName
+			int netAccessMode_m;
+			
+			// DataName
+			uint32_t contextID_m;
+			
+			// DataName
+			unsigned int rauTauTimer_m;
+			
+			// DataName
+			unsigned int accessRestrictionData_m;
+			
+			// DataName
+			DigitRegister15 imsi_m;
+			
+			// DataName
+			DigitRegister15 msisdn_m;
+			
+			// DataName
+			unsigned short dwnLnkSeqNo_m;
+			
+			// DataName
+			unsigned short upLnkSeqNo_m;
+			
+			// DataName
+			UE_State_e ueState_m;
+			
+			// DataName
+			Tai tai_m;
+			
+			// DataName
+			Cgi utranCgi_m;
+			
+			// DataName
+			Ms_net_capab msNetCapab_m;
+			
+			// DataName
+			Ue_net_capab ueNetCapab_m;
+			
+			// DataName
+			Secinfo ueSecInfo_m;
+			
+			// DataName
+			Ambr ambr_m;
+			
+			// DataName
+			E_utran_sec_vector aiaSecInfo_m;
+			
+			// DataName
+			uint32_t mTmsi_m;
+
+			// MmContext
+			MmContext* MmContext_mp;
+			
+			// SessionContext
+			SessionContext* SessionContext_mp;
+			
+	};
+	 
+	class MmContext:public SM::PermDataBlock
+	{
+		public:
+	
+			/****************************************
+			* MmContext
+			*    constructor
+			****************************************/
+			MmContext();
+			
+			/****************************************
+			* ~MmContext
+			*    destructor
+			****************************************/
+			~MmContext();
+			
+			/****************************************
+			* setmmState
+			*    set mmState to MmContext
+			****************************************/
+			void setMmState(EmmState mmState_i );
+			
+			/****************************************
+			* getmmState
+			*    get mmState from MmContext
+			****************************************/
+			EmmState getMmState();
+			
+			
+		private:
+		
+			// DataName
+			EmmState mmState_m;
+			
+			
+	};
+	 
+	class SessionContext:public SM::PermDataBlock
+	{
+		public:
+	
+			/****************************************
+			* SessionContext
+			*    constructor
+			****************************************/
+			SessionContext();
+			
+			/****************************************
+			* ~SessionContext
+			*    destructor
+			****************************************/
+			~SessionContext();
+			
+			/****************************************
+			* setsessionId
+			*    set sessionId to SessionContext
+			****************************************/
+			void setSessionId( uint8_t sessionId_i );
+			
+			/****************************************
+			* getsessionId
+			*    get sessionId from SessionContext
+			****************************************/
+			uint8_t getSessionId();
+			
+			/****************************************
+			* sets11SgwCtrlFteid
+			*    set s11SgwCtrlFteid to SessionContext
+			****************************************/
+			void setS11SgwCtrlFteid( const Fteid& s11SgwCtrlFteid_i );
+			
+			/****************************************
+			* gets11SgwCtrlFteid
+			*    get s11SgwCtrlFteid from SessionContext
+			****************************************/
+			const Fteid& getS11SgwCtrlFteid()const;
+			
+			/****************************************
+			* sets5S8PgwCtrlFteid
+			*    set s5S8PgwCtrlFteid to SessionContext
+			****************************************/
+			void setS5S8PgwCtrlFteid( const Fteid& s5S8PgwCtrlFteid_i );
+			
+			/****************************************
+			* gets5S8PgwCtrlFteid
+			*    get s5S8PgwCtrlFteid from SessionContext
+			****************************************/
+			const Fteid& getS5S8PgwCtrlFteid()const;
+			
+			/****************************************
+			* setpdnAddr
+			*    set pdnAddr to SessionContext
+			****************************************/
+			void setPdnAddr( const Paa& pdnAddr_i );
+			
+			/****************************************
+			* getpdnAddr
+			*    get pdnAddr from SessionContext
+			****************************************/
+			const Paa& getPdnAddr()const;
+			
+			/****************************************
+			* setaccessPtName
+			*    set accessPtName to SessionContext
+			****************************************/
+			void setAccessPtName( const Apn_name& accessPtName_i );
+			
+			/****************************************
+			* getaccessPtName
+			*    get accessPtName from SessionContext
+			****************************************/
+			const Apn_name& getAccessPtName()const;
+			
+			/****************************************
+			* geteRabId
+			*    get eRabId from SessionContext
+			****************************************/
+			unsigned short getErabId();
+			
+			/****************************************
+			* setapnConfigProfileCtxId
+			*    set apnConfigProfileCtxId to SessionContext
+			****************************************/
+			void setApnConfigProfileCtxId( unsigned int apnConfigProfileCtxId_i );
+			
+			/****************************************
+			* getapnConfigProfileCtxId
+			*    get apnConfigProfileCtxId from SessionContext
+			****************************************/
+			unsigned int getApnConfigProfileCtxId();
+
+			/****************************************
+		        * setpti
+			*    set pti to SessionContext
+			****************************************/
+			void setPti( uint8_t pti_i );
+
+			/****************************************
+			* getpti
+			*    get pti from SessionContext
+			****************************************/
+			uint8_t getPti();
+			
+			/****************************************
+			* setBearerContext
+			*    set BearerContext to SessionContext
+			****************************************/
+			void setBearerContext( BearerContext* BearerContextp ) ;
+			
+			/****************************************
+			* getBearerContext
+			*    get BearerContext to SessionContext
+			****************************************/
+			BearerContext* getBearerContext();
+		
+		
+		private:
+		
+			// DataName
+			uint8_t sessionId_m;
+			
+			// DataName
+			Fteid s11SgwCtrlFteid_m;
+			
+			// DataName
+			Fteid s5S8PgwCtrlFteid_m;
+			
+			// DataName
+			Paa pdnAddr_m;
+			
+			// DataName
+			Apn_name accessPtName_m;
+
+			// DataName
+			unsigned int apnConfigProfileCtxId_m;
+			
+			// DataName
+			uint8_t pti_m;
+			
+			// BearerContext
+			BearerContext* BearerContext_mp;
+			
+	};
+	 
+	class BearerContext:public SM::PermDataBlock
+	{
+		public:
+	
+			/****************************************
+			* BearerContext
+			*    constructor
+			****************************************/
+			BearerContext();
+			
+			/****************************************
+			* ~BearerContext
+			*    destructor
+			****************************************/
+			~BearerContext();
+			
+			/****************************************
+			* sets1uSgwUserFteid
+			*    set s1uSgwUserFteid to BearerContext
+			****************************************/
+			void setS1uSgwUserFteid( const Fteid& s1uSgwUserFteid_i );
+			
+			/****************************************
+			* gets1uSgwUserFteid
+			*    get s1uSgwUserFteid from BearerContext
+			****************************************/
+			const Fteid& getS1uSgwUserFteid()const;
+			
+			/****************************************
+			* sets5S8PgwUserFteid
+			*    set s5S8PgwUserFteid to BearerContext
+			****************************************/
+			void setS5S8PgwUserFteid( const Fteid& s5S8PgwUserFteid_i );
+			
+			/****************************************
+			* gets5S8PgwUserFteid
+			*    get s5S8PgwUserFteid from BearerContext
+			****************************************/
+			const Fteid& getS5S8PgwUserFteid()const;
+			
+			/****************************************
+			* sets1uEnbUserFteid
+			*    set s1uEnbUserFteid to BearerContext
+			****************************************/
+			void setS1uEnbUserFteid( const Fteid& s1uEnbUserFteid_i );
+			
+			/****************************************
+			* gets1uEnbUserFteid
+			*    get s1uEnbUserFteid from BearerContext
+			****************************************/
+			const Fteid& getS1uEnbUserFteid()const;
+			
+			/****************************************
+			* setbearerId
+			*    set bearerId to BearerContext
+			****************************************/
+			void setBearerId( unsigned char bearerId_i );
+			
+			/****************************************
+			* getbearerId
+			*    get bearerId from BearerContext
+			****************************************/
+			unsigned char getBearerId();
+			
+			
+		
+		private:
+		
+			// DataName
+			Fteid s1uSgwUserFteid_m;
+			
+			// DataName
+			Fteid s5S8PgwUserFteid_m;
+			
+			// DataName
+			Fteid s1uEnbUserFteid_m;
+			
+			// DataName
+			unsigned char bearerId_m;
+			
+			
+	};
+	 
+	class MmeProcedureCtxt:public SM::TempDataBlock
+	{
+		public:
+	
+			/****************************************
+			* MmeProcedureCtxt
+			*    constructor
+			****************************************/
+			MmeProcedureCtxt();
+			
+			/****************************************
+			* ~MmeProcedureCtxt
+			*    destructor
+			****************************************/
+			~MmeProcedureCtxt();
+			
+			/****************************************
+			* setctxtType
+			*    set ctxtType to MmeProcedureCtxt
+			****************************************/
+			void setCtxtType( ProcedureType ctxtType_i );
+			
+			/****************************************
+			* getctxtType
+			*    get ctxtType from MmeProcedureCtxt
+			****************************************/
+			ProcedureType getCtxtType();
+
+			/****************************************
+			* setesmInfoTxRequired
+			*    set esmInfoTxRequired to MmeProcedureCtxt
+			****************************************/
+			void setEsmInfoTxRequired( bool esmInfoTxRequired_i );
+			
+			/****************************************
+			* getesmInfoTxRequired
+			*    get esmInfoTxRequired from MmeProcedureCtxt
+			****************************************/
+			bool getEsmInfoTxRequired();
+			
+			/****************************************
+			* setpti
+			*    set pti to MmeProcedureCtxt
+			****************************************/
+			void setPti( uint8_t pti_i );
+
+			/****************************************
+			* getpti
+			*    get pti from MmeProcedureCtxt
+			****************************************/
+			uint8_t getPti();
+			
+			/****************************************
+			* setpcoOptions
+			*    set pcoOptions to MmeProcedureCtxt
+			****************************************/
+			void setPcoOptions(const unsigned short int* pco_options_i);
+
+			/****************************************
+			* getpcoOptions
+			*    get pcoOptions from MmeProcedureCtxt
+			****************************************/
+			const unsigned short int* getPcoOptions()const;
+
+			/****************************************
+			* setattachType
+			*    set attachType to MmeProcedureCtxt
+			****************************************/
+			void setAttachType( AttachType attachType_i );
+
+			/****************************************
+			* getattachType
+			*    get attachType from MmeProcedureCtxt
+			****************************************/
+			AttachType getAttachType();
+
+			/****************************************
+			* setMmeErrorCause
+			*    set mmeErrorCause to MmeProcedureCtxt
+			*******************************************/
+			void setMmeErrorCause( MmeErrorCause mmeErrorCause_i );
+
+			/*******************************************
+			* getMmeErrorCause
+			*    get mmeErrorCause from MmeProcedureCtxt
+			*********************************************/
+			MmeErrorCause getMmeErrorCause();
+
+
+		private:
+		
+			// DataName
+			ProcedureType ctxtType_m;
+
+            // DataName
+            MmeErrorCause mmeErrorCause_m;
+	
+			//DataName
+			AttachType attachType_m;
+
+			//DataName
+			unsigned short int pcoOptions_m[10];
+
+			// DataName
+			uint8_t pti_m;
+
+			//DataName
+			bool esmInfoTxRequired_m;
+
+	};
+	
+	class MmeDetachProcedureCtxt:public MmeProcedureCtxt
+	{
+		public:
+
+			/****************************************
+			* MmeDetachProcedureCtxt
+			*    constructor
+			****************************************/
+			MmeDetachProcedureCtxt();
+
+			/****************************************
+			* ~MmeDetachProcedureCtxt
+			*    destructor
+			****************************************/
+			~MmeDetachProcedureCtxt();
+
+			/****************************************
+			* setdetachType
+			*    set detachType to MmeDetachProcedureCtxt
+			****************************************/
+			void setDetachType(DetachType detachType_i );
+
+			/****************************************
+			* getdetachType
+			*    get detachType from MmeDetachProcedureCtxt
+			****************************************/
+			DetachType getDetachType();
+
+			/****************************************
+			* setcancellationType
+			*    set cancellationType to MmeProcedureCtxt
+			****************************************/
+			void setCancellationType(CancellationType cancellationType_i );
+
+			/****************************************
+			* getcancellationType
+			*    get cancellationType from MmeProcedureCtxt
+			****************************************/
+			CancellationType getCancellationType();
+
+		private:
+
+			// DataName
+			DetachType detachType_m;
+
+			//DataName
+			CancellationType cancellationType_m;
+	};
+
+
+
+	class MmeSvcReqProcedureCtxt:public MmeProcedureCtxt
+	{
+		public:
+		    /****************************************
+		    * MmeSvcReqProcedureCtxt
+		    *    constructor
+		    ****************************************/
+		    MmeSvcReqProcedureCtxt();
+
+		    /****************************************
+		    * ~MmeSvcReqProcedureCtxt
+		    *    destructor
+		    ****************************************/
+		    ~MmeSvcReqProcedureCtxt();
+			
+		    /****************************************
+		    * setseqNo
+		    *    set seqNo to MmeSvcReqProcedureCtxt
+		    ****************************************/
+		    void setDdnSeqNo( uint32_t ddnSeqNum_i );
+
+		    /****************************************
+		    * getseqNo
+		    *    get seqNo from MmeSvcReqProcedureCtxt
+		    ****************************************/
+		    uint32_t getDdnSeqNo();
+
+		    /**************************************************
+		    * setPagingTrigger
+		    *    set pagingTrigger to MmeSvcReqProcedureCtxt
+		    **************************************************/
+		    void setPagingTrigger( PagingTrigger pagingTrigger_i );
+	
+		    /****************************************
+		    * getPagingTrigger
+		    *    get pagingTrigger from MmeSvcReqProcedureCtxt
+		    ****************************************/
+		    PagingTrigger getPagingTrigger();
+	
+		    /****************************************
+		    * setEpsBearerId
+		    *    set epsBearerId to MmeSvcReqProcedureCtxt
+		    ****************************************/
+		    void setEpsBearerId( unsigned char epsBearerId_i );
+	
+		    /****************************************
+		    * getEpsBearerId
+		    *    get epsBearerId from MmeSvcReqProcedureCtxt
+		    ****************************************/
+		    unsigned char getEpsBearerId();
+	
+		    /****************************************
+		    * setArp
+		    *    set arp to MmeSvcReqProcedureCtxt
+	   	    ****************************************/
+		    void setArp( const Arp& arp_i );
+	
+		    /****************************************
+		    * getArp
+		    *    get arp from MmeSvcReqProcedureCtxt
+		    ****************************************/
+		    const Arp& getArp()const;
+	
+		    					
+	    private:
+			// DataName
+			PagingTrigger pagingTrigger_m;
+			
+			// DataName
+			unsigned char epsBearerId_m;
+			
+			// DataName
+			Arp arp_m;
+			
+			// DataName
+			uint32_t ddnSeqNum_m;
+			
+	};
+	
+	class MmeTauProcedureCtxt:public MmeProcedureCtxt
+	{
+		public:
+			/****************************************
+			* MmeTauProcedureCtxt
+			*    constructor
+			****************************************/
+			MmeTauProcedureCtxt();
+
+			/****************************************
+			* ~MmeTauProcedureCtxt
+			*    destructor
+			****************************************/
+			~MmeTauProcedureCtxt();
+				
+			/****************************************
+			* sets1apEnbUeId
+			*    set s1apEnbUeId to MmeTauProcedureCtxt
+			****************************************/
+			void setS1apEnbUeId( int s1apEnbUeId_i );
+			
+			/****************************************
+			* gets1apEnbUeId
+			*    get s1apEnbUeId from MmeTauProcedureCtxt
+			****************************************/
+			int getS1apEnbUeId();
+			
+			/****************************************
+			* settai
+			*    set tai to MmeTauProcedureCtxt
+			****************************************/
+			void setTai( const Tai& tai_i );
+			
+			/****************************************
+			* gettai
+			*    get tai from MmeTauProcedureCtxt
+			****************************************/
+			const Tai& getTai()const;
+			
+			/****************************************
+			* setenbFd
+			*    set enbFd to MmeTauProcedureCtxt
+			****************************************/
+			void setEnbFd( int enbFd_i );
+			
+			/****************************************
+			* getenbFd
+			*    get enbFd from MmeTauProcedureCtxt
+			****************************************/
+			int getEnbFd();		
+			
+			
+				
+		private:
+			int s1apEnbUeId_m;
+			Tai tai_m;
+			int enbFd_m;			
+			
+	};
+	
+} // mme
+#endif
diff --git a/include/mme-app/contextManager/mmContextManager.h b/include/mme-app/contextManager/mmContextManager.h
new file mode 100644
index 0000000..cdf2113
--- /dev/null
+++ b/include/mme-app/contextManager/mmContextManager.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 __MmContextManager__
+#define __MmContextManager__
+/******************************************************
+* mmContextManager.h
+ * 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.h.tt>
+ ***************************************/
+#include "memPoolManager.h"
+
+namespace mme
+{
+	class MmContext;
+	class MmContextManager
+	{
+	public:
+		/****************************************
+		* MmContextManager
+		*  constructor
+		****************************************/
+		MmContextManager(int numOfBlocks);
+		
+		/****************************************
+		* MmContextManager
+		*    Destructor
+		****************************************/
+		~MmContextManager();
+		
+		/******************************************
+		 * allocateMmContext
+		 *  allocate MmContext data block
+		 ******************************************/
+		MmContext* allocateMmContext();
+		
+		/******************************************
+		 * deallocateMmContext
+		 *  deallocate a MmContext data block
+		 ******************************************/
+		void deallocateMmContext(MmContext* MmContextp );
+	
+	private:
+		cmn::memPool::MemPoolManager<MmContext> poolManager_m;
+	};
+};
+
+#endif
+		
+		
diff --git a/include/mme-app/contextManager/mmeDetachProcedureCtxtManager.h b/include/mme-app/contextManager/mmeDetachProcedureCtxtManager.h
new file mode 100644
index 0000000..b7c3197
--- /dev/null
+++ b/include/mme-app/contextManager/mmeDetachProcedureCtxtManager.h
@@ -0,0 +1,65 @@
+/*
+ * 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 __MmeDetachProcedureCtxtManager__
+#define __MmeDetachProcedureCtxtManager__
+/******************************************************
+ * mmeDetachProcedureCtxtManager.h
+ * 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.h.tt>
+ ***************************************/
+#include "memPoolManager.h"
+
+namespace mme
+{
+	class MmeDetachProcedureCtxt;
+	class MmeDetachProcedureCtxtManager
+	{
+	public:
+		/****************************************
+		* MmeDetachProcedureCtxtManager
+		*  constructor
+		****************************************/
+		MmeDetachProcedureCtxtManager(int numOfBlocks);
+		
+		/****************************************
+		* MmeDetachProcedureCtxtManager
+		*    Destructor
+		****************************************/
+		~MmeDetachProcedureCtxtManager();
+		
+		/******************************************
+		 * allocateMmeDetachProcedureCtxt
+		 *  allocate MmeDetachProcedureCtxt data block
+		 ******************************************/
+		MmeDetachProcedureCtxt* allocateMmeDetachProcedureCtxt();
+		
+		/******************************************
+		 * deallocateMmeDetachProcedureCtxt
+		 *  deallocate a MmeDetachProcedureCtxt data block
+		 ******************************************/
+		void deallocateMmeDetachProcedureCtxt(MmeDetachProcedureCtxt* MmeDetachProcedureCtxtp );
+	
+	private:
+		cmn::memPool::MemPoolManager<MmeDetachProcedureCtxt> poolManager_m;
+	};
+};
+
+#endif
+		
+		
diff --git a/include/mme-app/contextManager/mmeProcedureCtxtManager.h b/include/mme-app/contextManager/mmeProcedureCtxtManager.h
new file mode 100644
index 0000000..c244fd4
--- /dev/null
+++ b/include/mme-app/contextManager/mmeProcedureCtxtManager.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 __MmeProcedureCtxtManager__
+#define __MmeProcedureCtxtManager__
+/******************************************************
+* mmeProcedureCtxtManager.h
+ * 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.h.tt>
+ ***************************************/
+#include "memPoolManager.h"
+
+namespace mme
+{
+	class MmeProcedureCtxt;
+	class MmeProcedureCtxtManager
+	{
+	public:
+		/****************************************
+		* MmeProcedureCtxtManager
+		*  constructor
+		****************************************/
+		MmeProcedureCtxtManager(int numOfBlocks);
+		
+		/****************************************
+		* MmeProcedureCtxtManager
+		*    Destructor
+		****************************************/
+		~MmeProcedureCtxtManager();
+		
+		/******************************************
+		 * allocateMmeProcedureCtxt
+		 *  allocate MmeProcedureCtxt data block
+		 ******************************************/
+		MmeProcedureCtxt* allocateMmeProcedureCtxt();
+		
+		/******************************************
+		 * deallocateMmeProcedureCtxt
+		 *  deallocate a MmeProcedureCtxt data block
+		 ******************************************/
+		void deallocateMmeProcedureCtxt(MmeProcedureCtxt* MmeProcedureCtxtp );
+	
+	private:
+		cmn::memPool::MemPoolManager<MmeProcedureCtxt> poolManager_m;
+	};
+};
+
+#endif
+		
+		
diff --git a/include/mme-app/contextManager/mmeSvcReqProcedureCtxtManager.h b/include/mme-app/contextManager/mmeSvcReqProcedureCtxtManager.h
new file mode 100644
index 0000000..cd3e55a
--- /dev/null
+++ b/include/mme-app/contextManager/mmeSvcReqProcedureCtxtManager.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2019, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 __MmeSvcReqProcedureCtxtManager__
+#define __MmeSvcReqProcedureCtxtManager__
+/******************************************************
+* mmeSvcReqProcedureCtxtManager.h
+ * 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.h.tt>
+ ***************************************/
+#include "memPoolManager.h"
+
+namespace mme
+{
+	class MmeSvcReqProcedureCtxt;
+	class MmeSvcReqProcedureCtxtManager
+	{
+	public:
+		/****************************************
+		* MmeSvcReqProcedureCtxtManager
+		*  constructor
+		****************************************/
+		MmeSvcReqProcedureCtxtManager(int numOfBlocks);
+		
+		/****************************************
+		* MmeSvcReqProcedureCtxtManager
+		*    Destructor
+		****************************************/
+		~MmeSvcReqProcedureCtxtManager();
+		
+		/******************************************
+		 * allocateMmeSvcReqProcedureCtxt
+		 *  allocate MmeSvcReqProcedureCtxt data block
+		 ******************************************/
+		MmeSvcReqProcedureCtxt* allocateMmeSvcReqProcedureCtxt();
+		
+		/******************************************
+		 * deallocateMmeSvcReqProcedureCtxt
+		 *  deallocate a MmeSvcReqProcedureCtxt data block
+		 ******************************************/
+		void deallocateMmeSvcReqProcedureCtxt(MmeSvcReqProcedureCtxt* MmeSvcReqProcedureCtxtp );
+	
+	private:
+		cmn::memPool::MemPoolManager<MmeSvcReqProcedureCtxt> poolManager_m;
+	};
+};
+
+#endif
+		
+		
diff --git a/include/mme-app/contextManager/mmeTauProcedureCtxtManager.h b/include/mme-app/contextManager/mmeTauProcedureCtxtManager.h
new file mode 100644
index 0000000..da46b7f
--- /dev/null
+++ b/include/mme-app/contextManager/mmeTauProcedureCtxtManager.h
@@ -0,0 +1,65 @@
+/*
+ * 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 __MmeTauProcedureCtxtManager__
+#define __MmeTauProcedureCtxtManager__
+/******************************************************
+ * MmeTauProcedureCtxtManager.h
+ * 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.h.tt>
+ ***************************************/
+#include "memPoolManager.h"
+
+namespace mme
+{
+	class MmeTauProcedureCtxt;
+	class MmeTauProcedureCtxtManager
+	{
+	public:
+		/****************************************
+		* MmeTauProcedureCtxtManager
+		*  constructor
+		****************************************/
+		MmeTauProcedureCtxtManager(int numOfBlocks);
+		
+		/****************************************
+		* MmeTauProcedureCtxtManager
+		*    Destructor
+		****************************************/
+		~MmeTauProcedureCtxtManager();
+		
+		/******************************************
+		* allocateMmeTauProcedureCtxt
+		*  allocate MmeTauProcedureCtxt data block
+		******************************************/
+		MmeTauProcedureCtxt* allocateMmeTauProcedureCtxt();
+		
+		/******************************************
+		* deallocateMmeTauProcedureCtxt
+		*  deallocate a MmeTauProcedureCtxt data block
+		******************************************/
+		void deallocateMmeTauProcedureCtxt(MmeTauProcedureCtxt* MmeTauProcedureCtxtp );
+	
+	private:
+		cmn::memPool::MemPoolManager<MmeTauProcedureCtxt> poolManager_m;
+	};
+};
+
+#endif
+		
+		
diff --git a/include/mme-app/contextManager/sessionContextManager.h b/include/mme-app/contextManager/sessionContextManager.h
new file mode 100644
index 0000000..7b55924
--- /dev/null
+++ b/include/mme-app/contextManager/sessionContextManager.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 __SessionContextManager__
+#define __SessionContextManager__
+/******************************************************
+* sessionContextManager.h
+ * 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.h.tt>
+ ***************************************/
+#include "memPoolManager.h"
+
+namespace mme
+{
+	class SessionContext;
+	class SessionContextManager
+	{
+	public:
+		/****************************************
+		* SessionContextManager
+		*  constructor
+		****************************************/
+		SessionContextManager(int numOfBlocks);
+		
+		/****************************************
+		* SessionContextManager
+		*    Destructor
+		****************************************/
+		~SessionContextManager();
+		
+		/******************************************
+		 * allocateSessionContext
+		 *  allocate SessionContext data block
+		 ******************************************/
+		SessionContext* allocateSessionContext();
+		
+		/******************************************
+		 * deallocateSessionContext
+		 *  deallocate a SessionContext data block
+		 ******************************************/
+		void deallocateSessionContext(SessionContext* SessionContextp );
+	
+	private:
+		cmn::memPool::MemPoolManager<SessionContext> poolManager_m;
+	};
+};
+
+#endif
+		
+		
diff --git a/include/mme-app/contextManager/subsDataGroupManager.h b/include/mme-app/contextManager/subsDataGroupManager.h
new file mode 100644
index 0000000..b8d7b16
--- /dev/null
+++ b/include/mme-app/contextManager/subsDataGroupManager.h
@@ -0,0 +1,270 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 __SUBS_DATAGROUPMANAGER__
+#define __SUBS_DATAGROUPMANAGER__
+/**************************************
+ *
+ * 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.h.tt>
+ ***************************************/
+#include <map>
+#include <mutex>
+
+#include "dataGroupManager.h"
+#include "contextManager/dataBlocks.h"
+#include "contextManager/uEContextManager.h"
+#include "contextManager/mmContextManager.h"
+#include "contextManager/sessionContextManager.h"
+#include "contextManager/bearerContextManager.h"
+#include "contextManager/mmeProcedureCtxtManager.h"
+#include "contextManager/mmeDetachProcedureCtxtManager.h"
+#include "contextManager/mmeSvcReqProcedureCtxtManager.h"
+#include "contextManager/mmeTauProcedureCtxtManager.h"
+
+
+namespace mme
+{	
+	class SubsDataGroupManager:public cmn::DGM::DataGroupManager
+	{
+		public:
+		
+			/******************************************
+			* Instance 
+			*    Creates static instance for the SubsDataGroupManager
+			*******************************************/
+			static SubsDataGroupManager* Instance();
+	
+			/****************************************
+			* SubsDataGroupManager
+			*    Destructor
+			****************************************/
+			virtual ~SubsDataGroupManager();
+			
+			/******************************************
+			* initialize
+			*  Initializes control block and pool managers
+			******************************************/
+			void initialize();
+
+			/******************************************
+			* getUEContext
+			*  Get UEContext data block
+			******************************************/
+			UEContext* getUEContext();
+			
+			/******************************************
+			* deleteUEContext
+			*  Delete a UEContext data block
+			******************************************/
+			void deleteUEContext(UEContext* UEContextp );
+			
+			/******************************************
+			* getMmContext
+			*  Get MmContext data block
+			******************************************/
+			MmContext* getMmContext();
+			
+			/******************************************
+			* deleteMmContext
+			*  Delete a MmContext data block
+			******************************************/
+			void deleteMmContext(MmContext* MmContextp );
+			
+			/******************************************
+			* getSessionContext
+			*  Get SessionContext data block
+			******************************************/
+			SessionContext* getSessionContext();
+			
+			/******************************************
+			* deleteSessionContext
+			*  Delete a SessionContext data block
+			******************************************/
+			void deleteSessionContext(SessionContext* SessionContextp );
+			
+			/******************************************
+			* getBearerContext
+			*  Get BearerContext data block
+			******************************************/
+			BearerContext* getBearerContext();
+			
+			/******************************************
+			* deleteBearerContext
+			*  Delete a BearerContext data block
+			******************************************/
+			void deleteBearerContext(BearerContext* BearerContextp );
+			
+			/******************************************
+			* getMmeProcedureCtxt
+			*  Get MmeProcedureCtxt data block
+			******************************************/
+			MmeProcedureCtxt* getMmeProcedureCtxt();
+			
+			/******************************************
+			* deleteMmeProcedureCtxt
+			*  Delete a MmeProcedureCtxt data block
+			******************************************/
+			void deleteMmeProcedureCtxt(MmeProcedureCtxt* MmeProcedureCtxtp );
+			
+			/******************************************
+			* getMmeDetachProcedureCtxt
+			*  Get MmeDetachProcedureCtxt data block
+			****************************************/
+			MmeDetachProcedureCtxt* getMmeDetachProcedureCtxt();
+
+			/******************************************
+                        * deleteMmeDetachProcedureCtxt
+                        *  Delete a MmeDetachProcedureCtxt data block
+                        ******************************************/
+                        void deleteMmeDetachProcedureCtxt(MmeDetachProcedureCtxt* MmeDetachProcedureCtxtp );
+			
+			/******************************************
+			* getMmeSvcReqProcedureCtxt
+			*  Get MmeSvcReqProcedureCtxt data block
+			******************************************/
+			MmeSvcReqProcedureCtxt* getMmeSvcReqProcedureCtxt();
+
+                        /******************************************
+                        * deleteMmeSvcReqProcedureCtxt
+                        *  Delete a MmeSvcReqProcedureCtxt data block
+                        ******************************************/
+                        void deleteMmeSvcReqProcedureCtxt(MmeSvcReqProcedureCtxt* MmeSvcReqProcedureCtxtp );
+						
+			/******************************************
+			* getMmeTauProcedureCtxt
+			*  Get MmeTauProcedureCtxt data block
+			******************************************/
+			MmeTauProcedureCtxt* getMmeTauProcedureCtxt();
+			
+			/******************************************
+			* deleteMmeTauProcedureCtxt
+			*  Delete a MmeTauProcedureCtxt data block
+			******************************************/
+			void deleteMmeTauProcedureCtxt(MmeTauProcedureCtxt* MmeTauProcedureCtxtp );
+
+			/******************************************
+			* addimsikey
+			* Add a imsi as key and cb index as value to imsi_cb_id_map
+			******************************************/
+			int addimsikey( DigitRegister15 key, int cb_index );
+			
+			/******************************************
+			* deleteimsikey
+			* delete a imsi key from imsi_cb_id_map
+			******************************************/
+			int deleteimsikey( DigitRegister15 key );
+			
+			/******************************************
+			* findCBWithimsi
+			* Find cb with given imsi from imsi_cb_id_map
+			******************************************/
+			int findCBWithimsi( DigitRegister15 key );
+
+			/******************************************
+			* addmTmsikey
+			* Add a mTmsi as key and cb index as value to mTmsi_cb_id_map
+			******************************************/
+			int addmTmsikey( uint32_t mTmsi, int cb_index );
+
+			/******************************************
+			* deletemTmsikey
+			* delete a mTmsi key from mTmsi_cb_id_map
+			******************************************/
+			int deletemTmsikey( uint32_t key );
+			
+			/******************************************
+			* findCBWithmTmsi
+			* Find cb with given mTmsi from mTmsi_cb_id_map
+			******************************************/
+			int findCBWithmTmsi( uint32_t key );
+			
+		private:
+			
+			/****************************************
+			* SubsDataGroupManager
+			*    Private constructor
+			****************************************/
+			SubsDataGroupManager();  
+			
+			/****************************************
+			* UEContext Pool Manager
+			****************************************/
+			UEContextManager* UEContextManagerm_p;
+			
+			/****************************************
+			* MmContext Pool Manager
+			****************************************/
+			MmContextManager* MmContextManagerm_p;
+			
+			/****************************************
+			* SessionContext Pool Manager
+			****************************************/
+			SessionContextManager* SessionContextManagerm_p;
+			
+			/****************************************
+			* BearerContext Pool Manager
+			****************************************/
+			BearerContextManager* BearerContextManagerm_p;
+			
+			/****************************************
+			* MmeProcedureCtxt Pool Manager
+			****************************************/
+			MmeProcedureCtxtManager* MmeProcedureCtxtManagerm_p;
+			
+			/****************************************
+			* MmeDetachProcedureCtxt Pool Manager
+			****************************************/
+			MmeDetachProcedureCtxtManager* MmeDetachProcedureCtxtManagerm_p;
+
+			/****************************************
+			* MmeSvcReqProcedureCtxt Pool Manager
+			****************************************/
+			MmeSvcReqProcedureCtxtManager* MmeSvcReqProcedureCtxtManagerm_p;
+						
+			/****************************************
+			* MmeTauProcedureCtxt Pool Manager
+			****************************************/
+			MmeTauProcedureCtxtManager* MmeTauProcedureCtxtManagerm_p;
+
+			/****************************************
+			* imsi Key Map
+			****************************************/
+			std::map<DigitRegister15, int> imsi_cb_id_map;
+
+			/****************************************
+			 * imsi Key Map Mutex
+			 ****************************************/
+			std::mutex imsi_cb_id_map_mutex;
+
+			/****************************************
+			* mTmsi Key Map
+			****************************************/
+			std::map<uint32_t, int> mTmsi_cb_id_map;
+
+			/****************************************
+			* mTmsi Key Map Mutex
+			****************************************/
+			std::mutex mTmsi_cb_id_map_mutex;
+
+	};
+};
+
+
+
+#endif
diff --git a/include/mme-app/contextManager/uEContextManager.h b/include/mme-app/contextManager/uEContextManager.h
new file mode 100644
index 0000000..1daa305
--- /dev/null
+++ b/include/mme-app/contextManager/uEContextManager.h
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2019, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 __UEContextManager__
+#define __UEContextManager__
+/******************************************************
+* uEContextManager.h
+ * 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.h.tt>
+ ***************************************/
+#include "memPoolManager.h"
+
+namespace mme
+{
+	class UEContext;
+
+	class UEContextManager
+	{
+	public:
+		/****************************************
+		* UEContextManager
+		*  constructor
+		****************************************/
+		UEContextManager(int numOfBlocks);
+		
+		/****************************************
+		* UEContextManager
+		*    Destructor
+		****************************************/
+		~UEContextManager();
+		
+		/******************************************
+		 * getUEContext
+		 *  get UEContext data block
+		 ******************************************/
+		UEContext* allocateUEContext();
+		
+		/******************************************
+		 * deleteUEContext
+		 *  deallocate a UEContext data block
+		 ******************************************/
+		void deallocateUEContext(UEContext* UEContextp );
+	
+	private:
+		cmn::memPool::MemPoolManager<UEContext> poolManager_m;
+	};
+};
+
+#endif
+		
+		
diff --git a/include/mme-app/hash.h b/include/mme-app/hash.h
new file mode 100644
index 0000000..739f707
--- /dev/null
+++ b/include/mme-app/hash.h
@@ -0,0 +1,25 @@
+/*
+ * 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.
+ */
+
+
+#ifndef __IMSI_LOOKUP_H_
+#define __IMSI_LOOKUP_H_
+
+int
+init_hash();
+
+#endif /*__IMSI_LOOKUP_H_*/
diff --git a/include/mme-app/interfaces/mmeIpcInterface.h b/include/mme-app/interfaces/mmeIpcInterface.h
new file mode 100644
index 0000000..58d85c6
--- /dev/null
+++ b/include/mme-app/interfaces/mmeIpcInterface.h
@@ -0,0 +1,42 @@
+/*
+ * mmeIpcInterface.h
+ *
+ *  Created on: Aug 29, 2019
+ *      Author: Anjana_Sreekumar
+ */
+
+#ifndef INCLUDE_MME_APP_INTERFACES_MMEIPCINTERFACE_H_
+#define INCLUDE_MME_APP_INTERFACES_MMEIPCINTERFACE_H_
+
+#include <ipcChannel.h>
+
+namespace cmn{
+namespace utils{
+	class MsgBuffer;
+}
+}
+
+class MmeIpcInterface {
+
+public:
+	MmeIpcInterface();
+	virtual ~MmeIpcInterface();
+
+	bool setup();
+	void teardown();
+
+	cmn::ipc::IpcChannel* sender();
+	cmn::ipc::IpcChannel* reader();
+
+	void handleIpcMsg(cmn::utils::MsgBuffer* buf);
+
+	bool dispatchIpcMsg(char* buf, uint32_t len, cmn::ipc::IpcAddress& destAddr);
+
+	bool dispatchIpcMsg(cmn::utils::MsgBuffer* msgBuf_p, cmn::ipc::IpcAddress& destAddr);
+
+private:
+	cmn::ipc::IpcChannel* sender_mp;
+	cmn::ipc::IpcChannel* reader_mp;
+};
+
+#endif /* INCLUDE_MME_APP_INTERFACES_MMEIPCINTERFACE_H_ */
diff --git a/include/mme-app/mmeStates/attachStart.h b/include/mme-app/mmeStates/attachStart.h
new file mode 100644
index 0000000..56df80b
--- /dev/null
+++ b/include/mme-app/mmeStates/attachStart.h
@@ -0,0 +1,61 @@
+ /*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+ /******************************************************
+ * attachStart.h
+ * 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.h.tt>
+ ******************************************************/
+ 
+#ifndef __AttachStart__
+#define __AttachStart__
+
+#include "state.h"
+
+namespace mme {
+
+	class AttachStart : public SM::State
+	{
+		public:
+			/******************************************
+			* Instance 
+			*    Creates static instance for the state
+			*******************************************/
+			static AttachStart* Instance();
+
+			/****************************************
+			* AttachStart
+			*    Destructor
+			****************************************/
+			~AttachStart();			
+			
+			/******************************************
+			* initialize
+			*  Initializes action handlers for the state
+			* and next state
+			******************************************/
+			void initialize();
+	
+		private:
+			/****************************************
+			* AttachStart
+			*    Private constructor
+			****************************************/
+			AttachStart();  
+	};
+};
+#endif // __AttachStart__
diff --git a/include/mme-app/mmeStates/attachWfAia.h b/include/mme-app/mmeStates/attachWfAia.h
new file mode 100644
index 0000000..b54c808
--- /dev/null
+++ b/include/mme-app/mmeStates/attachWfAia.h
@@ -0,0 +1,61 @@
+ /*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+ /******************************************************
+ * attachWfAia.h
+ * 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.h.tt>
+ ******************************************************/
+ 
+#ifndef __AttachWfAia__
+#define __AttachWfAia__
+
+#include "state.h"
+
+namespace mme {
+
+	class AttachWfAia : public SM::State
+	{
+		public:
+			/******************************************
+			* Instance 
+			*    Creates static instance for the state
+			*******************************************/
+			static AttachWfAia* Instance();
+
+			/****************************************
+			* AttachWfAia
+			*    Destructor
+			****************************************/
+			~AttachWfAia();			
+			
+			/******************************************
+			* initialize
+			*  Initializes action handlers for the state
+			* and next state
+			******************************************/
+			void initialize();
+	
+		private:
+			/****************************************
+			* AttachWfAia
+			*    Private constructor
+			****************************************/
+			AttachWfAia();  
+	};
+};
+#endif // __AttachWfAia__
diff --git a/include/mme-app/mmeStates/attachWfAttCmp.h b/include/mme-app/mmeStates/attachWfAttCmp.h
new file mode 100644
index 0000000..5913047
--- /dev/null
+++ b/include/mme-app/mmeStates/attachWfAttCmp.h
@@ -0,0 +1,61 @@
+ /*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+ /******************************************************
+ * attachWfAttCmp.h
+ * 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.h.tt>
+ ******************************************************/
+ 
+#ifndef __AttachWfAttCmp__
+#define __AttachWfAttCmp__
+
+#include "state.h"
+
+namespace mme {
+
+	class AttachWfAttCmp : public SM::State
+	{
+		public:
+			/******************************************
+			* Instance 
+			*    Creates static instance for the state
+			*******************************************/
+			static AttachWfAttCmp* Instance();
+
+			/****************************************
+			* AttachWfAttCmp
+			*    Destructor
+			****************************************/
+			~AttachWfAttCmp();			
+			
+			/******************************************
+			* initialize
+			*  Initializes action handlers for the state
+			* and next state
+			******************************************/
+			void initialize();
+	
+		private:
+			/****************************************
+			* AttachWfAttCmp
+			*    Private constructor
+			****************************************/
+			AttachWfAttCmp();  
+	};
+};
+#endif // __AttachWfAttCmp__
diff --git a/include/mme-app/mmeStates/attachWfAuthResp.h b/include/mme-app/mmeStates/attachWfAuthResp.h
new file mode 100644
index 0000000..af8c4ba
--- /dev/null
+++ b/include/mme-app/mmeStates/attachWfAuthResp.h
@@ -0,0 +1,61 @@
+ /*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+ /******************************************************
+ * attachWfAuthResp.h
+ * 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.h.tt>
+ ******************************************************/
+ 
+#ifndef __AttachWfAuthResp__
+#define __AttachWfAuthResp__
+
+#include "state.h"
+
+namespace mme {
+
+	class AttachWfAuthResp : public SM::State
+	{
+		public:
+			/******************************************
+			* Instance 
+			*    Creates static instance for the state
+			*******************************************/
+			static AttachWfAuthResp* Instance();
+
+			/****************************************
+			* AttachWfAuthResp
+			*    Destructor
+			****************************************/
+			~AttachWfAuthResp();			
+			
+			/******************************************
+			* initialize
+			*  Initializes action handlers for the state
+			* and next state
+			******************************************/
+			void initialize();
+	
+		private:
+			/****************************************
+			* AttachWfAuthResp
+			*    Private constructor
+			****************************************/
+			AttachWfAuthResp();  
+	};
+};
+#endif // __AttachWfAuthResp__
diff --git a/include/mme-app/mmeStates/attachWfAuthRespValidate.h b/include/mme-app/mmeStates/attachWfAuthRespValidate.h
new file mode 100644
index 0000000..46cfe57
--- /dev/null
+++ b/include/mme-app/mmeStates/attachWfAuthRespValidate.h
@@ -0,0 +1,61 @@
+ /*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+ /******************************************************
+ * attachWfAuthRespValidate.h
+ * 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.h.tt>
+ ******************************************************/
+ 
+#ifndef __AttachWfAuthRespValidate__
+#define __AttachWfAuthRespValidate__
+
+#include "state.h"
+
+namespace mme {
+
+	class AttachWfAuthRespValidate : public SM::State
+	{
+		public:
+			/******************************************
+			* Instance 
+			*    Creates static instance for the state
+			*******************************************/
+			static AttachWfAuthRespValidate* Instance();
+
+			/****************************************
+			* AttachWfAuthRespValidate
+			*    Destructor
+			****************************************/
+			~AttachWfAuthRespValidate();			
+			
+			/******************************************
+			* initialize
+			*  Initializes action handlers for the state
+			* and next state
+			******************************************/
+			void initialize();
+	
+		private:
+			/****************************************
+			* AttachWfAuthRespValidate
+			*    Private constructor
+			****************************************/
+			AttachWfAuthRespValidate();  
+	};
+};
+#endif // __AttachWfAuthRespValidate__
diff --git a/include/mme-app/mmeStates/attachWfCsResp.h b/include/mme-app/mmeStates/attachWfCsResp.h
new file mode 100644
index 0000000..a9ebb84
--- /dev/null
+++ b/include/mme-app/mmeStates/attachWfCsResp.h
@@ -0,0 +1,61 @@
+ /*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+ /******************************************************
+ * attachWfCsResp.h
+ * 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.h.tt>
+ ******************************************************/
+ 
+#ifndef __AttachWfCsResp__
+#define __AttachWfCsResp__
+
+#include "state.h"
+
+namespace mme {
+
+	class AttachWfCsResp : public SM::State
+	{
+		public:
+			/******************************************
+			* Instance 
+			*    Creates static instance for the state
+			*******************************************/
+			static AttachWfCsResp* Instance();
+
+			/****************************************
+			* AttachWfCsResp
+			*    Destructor
+			****************************************/
+			~AttachWfCsResp();			
+			
+			/******************************************
+			* initialize
+			*  Initializes action handlers for the state
+			* and next state
+			******************************************/
+			void initialize();
+	
+		private:
+			/****************************************
+			* AttachWfCsResp
+			*    Private constructor
+			****************************************/
+			AttachWfCsResp();  
+	};
+};
+#endif // __AttachWfCsResp__
diff --git a/include/mme-app/mmeStates/attachWfEsmInfoCheck.h b/include/mme-app/mmeStates/attachWfEsmInfoCheck.h
new file mode 100644
index 0000000..13c0d24
--- /dev/null
+++ b/include/mme-app/mmeStates/attachWfEsmInfoCheck.h
@@ -0,0 +1,61 @@
+ /*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+ /******************************************************
+ * attachWfEsmInfoCheck.h
+ * 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.h.tt>
+ ******************************************************/
+ 
+#ifndef __AttachWfEsmInfoCheck__
+#define __AttachWfEsmInfoCheck__
+
+#include "state.h"
+
+namespace mme {
+
+	class AttachWfEsmInfoCheck : public SM::State
+	{
+		public:
+			/******************************************
+			* Instance 
+			*    Creates static instance for the state
+			*******************************************/
+			static AttachWfEsmInfoCheck* Instance();
+
+			/****************************************
+			* AttachWfEsmInfoCheck
+			*    Destructor
+			****************************************/
+			~AttachWfEsmInfoCheck();			
+			
+			/******************************************
+			* initialize
+			*  Initializes action handlers for the state
+			* and next state
+			******************************************/
+			void initialize();
+	
+		private:
+			/****************************************
+			* AttachWfEsmInfoCheck
+			*    Private constructor
+			****************************************/
+			AttachWfEsmInfoCheck();  
+	};
+};
+#endif // __AttachWfEsmInfoCheck__
diff --git a/include/mme-app/mmeStates/attachWfEsmInfoResp.h b/include/mme-app/mmeStates/attachWfEsmInfoResp.h
new file mode 100644
index 0000000..b710b26
--- /dev/null
+++ b/include/mme-app/mmeStates/attachWfEsmInfoResp.h
@@ -0,0 +1,61 @@
+ /*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+ /******************************************************
+ * attachWfEsmInfoResp.h
+ * 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.h.tt>
+ ******************************************************/
+ 
+#ifndef __AttachWfEsmInfoResp__
+#define __AttachWfEsmInfoResp__
+
+#include "state.h"
+
+namespace mme {
+
+	class AttachWfEsmInfoResp : public SM::State
+	{
+		public:
+			/******************************************
+			* Instance 
+			*    Creates static instance for the state
+			*******************************************/
+			static AttachWfEsmInfoResp* Instance();
+
+			/****************************************
+			* AttachWfEsmInfoResp
+			*    Destructor
+			****************************************/
+			~AttachWfEsmInfoResp();			
+			
+			/******************************************
+			* initialize
+			*  Initializes action handlers for the state
+			* and next state
+			******************************************/
+			void initialize();
+	
+		private:
+			/****************************************
+			* AttachWfEsmInfoResp
+			*    Private constructor
+			****************************************/
+			AttachWfEsmInfoResp();  
+	};
+};
+#endif // __AttachWfEsmInfoResp__
diff --git a/include/mme-app/mmeStates/attachWfIdentityResponse.h b/include/mme-app/mmeStates/attachWfIdentityResponse.h
new file mode 100644
index 0000000..52ce29c
--- /dev/null
+++ b/include/mme-app/mmeStates/attachWfIdentityResponse.h
@@ -0,0 +1,61 @@
+ /*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+ /******************************************************
+ * attachWfIdentityResponse.h
+ * 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.h.tt>
+ ******************************************************/
+ 
+#ifndef __AttachWfIdentityResponse__
+#define __AttachWfIdentityResponse__
+
+#include "state.h"
+
+namespace mme {
+
+	class AttachWfIdentityResponse : public SM::State
+	{
+		public:
+			/******************************************
+			* Instance 
+			*    Creates static instance for the state
+			*******************************************/
+			static AttachWfIdentityResponse* Instance();
+
+			/****************************************
+			* AttachWfIdentityResponse
+			*    Destructor
+			****************************************/
+			~AttachWfIdentityResponse();			
+			
+			/******************************************
+			* initialize
+			*  Initializes action handlers for the state
+			* and next state
+			******************************************/
+			void initialize();
+	
+		private:
+			/****************************************
+			* AttachWfIdentityResponse
+			*    Private constructor
+			****************************************/
+			AttachWfIdentityResponse();  
+	};
+};
+#endif // __AttachWfIdentityResponse__
diff --git a/include/mme-app/mmeStates/attachWfImsiValidateAction.h b/include/mme-app/mmeStates/attachWfImsiValidateAction.h
new file mode 100644
index 0000000..aeede2b
--- /dev/null
+++ b/include/mme-app/mmeStates/attachWfImsiValidateAction.h
@@ -0,0 +1,61 @@
+ /*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+ /******************************************************
+ * attachWfImsiValidateAction.h
+ * 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.h.tt>
+ ******************************************************/
+ 
+#ifndef __AttachWfImsiValidateAction__
+#define __AttachWfImsiValidateAction__
+
+#include "state.h"
+
+namespace mme {
+
+	class AttachWfImsiValidateAction : public SM::State
+	{
+		public:
+			/******************************************
+			* Instance 
+			*    Creates static instance for the state
+			*******************************************/
+			static AttachWfImsiValidateAction* Instance();
+
+			/****************************************
+			* AttachWfImsiValidateAction
+			*    Destructor
+			****************************************/
+			~AttachWfImsiValidateAction();			
+			
+			/******************************************
+			* initialize
+			*  Initializes action handlers for the state
+			* and next state
+			******************************************/
+			void initialize();
+	
+		private:
+			/****************************************
+			* AttachWfImsiValidateAction
+			*    Private constructor
+			****************************************/
+			AttachWfImsiValidateAction();  
+	};
+};
+#endif // __AttachWfImsiValidateAction__
diff --git a/include/mme-app/mmeStates/attachWfInitCtxtResp.h b/include/mme-app/mmeStates/attachWfInitCtxtResp.h
new file mode 100644
index 0000000..e6a37bc
--- /dev/null
+++ b/include/mme-app/mmeStates/attachWfInitCtxtResp.h
@@ -0,0 +1,61 @@
+ /*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+ /******************************************************
+ * attachWfInitCtxtResp.h
+ * 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.h.tt>
+ ******************************************************/
+ 
+#ifndef __AttachWfInitCtxtResp__
+#define __AttachWfInitCtxtResp__
+
+#include "state.h"
+
+namespace mme {
+
+	class AttachWfInitCtxtResp : public SM::State
+	{
+		public:
+			/******************************************
+			* Instance 
+			*    Creates static instance for the state
+			*******************************************/
+			static AttachWfInitCtxtResp* Instance();
+
+			/****************************************
+			* AttachWfInitCtxtResp
+			*    Destructor
+			****************************************/
+			~AttachWfInitCtxtResp();			
+			
+			/******************************************
+			* initialize
+			*  Initializes action handlers for the state
+			* and next state
+			******************************************/
+			void initialize();
+	
+		private:
+			/****************************************
+			* AttachWfInitCtxtResp
+			*    Private constructor
+			****************************************/
+			AttachWfInitCtxtResp();  
+	};
+};
+#endif // __AttachWfInitCtxtResp__
diff --git a/include/mme-app/mmeStates/attachWfInitCtxtRespAttCmp.h b/include/mme-app/mmeStates/attachWfInitCtxtRespAttCmp.h
new file mode 100644
index 0000000..0484d76
--- /dev/null
+++ b/include/mme-app/mmeStates/attachWfInitCtxtRespAttCmp.h
@@ -0,0 +1,61 @@
+ /*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+ /******************************************************
+ * attachWfInitCtxtRespAttCmp.h
+ * 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.h.tt>
+ ******************************************************/
+ 
+#ifndef __AttachWfInitCtxtRespAttCmp__
+#define __AttachWfInitCtxtRespAttCmp__
+
+#include "state.h"
+
+namespace mme {
+
+	class AttachWfInitCtxtRespAttCmp : public SM::State
+	{
+		public:
+			/******************************************
+			* Instance 
+			*    Creates static instance for the state
+			*******************************************/
+			static AttachWfInitCtxtRespAttCmp* Instance();
+
+			/****************************************
+			* AttachWfInitCtxtRespAttCmp
+			*    Destructor
+			****************************************/
+			~AttachWfInitCtxtRespAttCmp();			
+			
+			/******************************************
+			* initialize
+			*  Initializes action handlers for the state
+			* and next state
+			******************************************/
+			void initialize();
+	
+		private:
+			/****************************************
+			* AttachWfInitCtxtRespAttCmp
+			*    Private constructor
+			****************************************/
+			AttachWfInitCtxtRespAttCmp();  
+	};
+};
+#endif // __AttachWfInitCtxtRespAttCmp__
diff --git a/include/mme-app/mmeStates/attachWfMbResp.h b/include/mme-app/mmeStates/attachWfMbResp.h
new file mode 100644
index 0000000..4ceb47d
--- /dev/null
+++ b/include/mme-app/mmeStates/attachWfMbResp.h
@@ -0,0 +1,61 @@
+ /*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+ /******************************************************
+ * attachWfMbResp.h
+ * 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.h.tt>
+ ******************************************************/
+ 
+#ifndef __AttachWfMbResp__
+#define __AttachWfMbResp__
+
+#include "state.h"
+
+namespace mme {
+
+	class AttachWfMbResp : public SM::State
+	{
+		public:
+			/******************************************
+			* Instance 
+			*    Creates static instance for the state
+			*******************************************/
+			static AttachWfMbResp* Instance();
+
+			/****************************************
+			* AttachWfMbResp
+			*    Destructor
+			****************************************/
+			~AttachWfMbResp();			
+			
+			/******************************************
+			* initialize
+			*  Initializes action handlers for the state
+			* and next state
+			******************************************/
+			void initialize();
+	
+		private:
+			/****************************************
+			* AttachWfMbResp
+			*    Private constructor
+			****************************************/
+			AttachWfMbResp();  
+	};
+};
+#endif // __AttachWfMbResp__
diff --git a/include/mme-app/mmeStates/attachWfSecCmp.h b/include/mme-app/mmeStates/attachWfSecCmp.h
new file mode 100644
index 0000000..e5efe91
--- /dev/null
+++ b/include/mme-app/mmeStates/attachWfSecCmp.h
@@ -0,0 +1,61 @@
+ /*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+ /******************************************************
+ * attachWfSecCmp.h
+ * 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.h.tt>
+ ******************************************************/
+ 
+#ifndef __AttachWfSecCmp__
+#define __AttachWfSecCmp__
+
+#include "state.h"
+
+namespace mme {
+
+	class AttachWfSecCmp : public SM::State
+	{
+		public:
+			/******************************************
+			* Instance 
+			*    Creates static instance for the state
+			*******************************************/
+			static AttachWfSecCmp* Instance();
+
+			/****************************************
+			* AttachWfSecCmp
+			*    Destructor
+			****************************************/
+			~AttachWfSecCmp();			
+			
+			/******************************************
+			* initialize
+			*  Initializes action handlers for the state
+			* and next state
+			******************************************/
+			void initialize();
+	
+		private:
+			/****************************************
+			* AttachWfSecCmp
+			*    Private constructor
+			****************************************/
+			AttachWfSecCmp();  
+	};
+};
+#endif // __AttachWfSecCmp__
diff --git a/include/mme-app/mmeStates/attachWfUla.h b/include/mme-app/mmeStates/attachWfUla.h
new file mode 100644
index 0000000..3c046a2
--- /dev/null
+++ b/include/mme-app/mmeStates/attachWfUla.h
@@ -0,0 +1,61 @@
+ /*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+ /******************************************************
+ * attachWfUla.h
+ * 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.h.tt>
+ ******************************************************/
+ 
+#ifndef __AttachWfUla__
+#define __AttachWfUla__
+
+#include "state.h"
+
+namespace mme {
+
+	class AttachWfUla : public SM::State
+	{
+		public:
+			/******************************************
+			* Instance 
+			*    Creates static instance for the state
+			*******************************************/
+			static AttachWfUla* Instance();
+
+			/****************************************
+			* AttachWfUla
+			*    Destructor
+			****************************************/
+			~AttachWfUla();			
+			
+			/******************************************
+			* initialize
+			*  Initializes action handlers for the state
+			* and next state
+			******************************************/
+			void initialize();
+	
+		private:
+			/****************************************
+			* AttachWfUla
+			*    Private constructor
+			****************************************/
+			AttachWfUla();  
+	};
+};
+#endif // __AttachWfUla__
diff --git a/include/mme-app/mmeStates/defaultMmeState.h b/include/mme-app/mmeStates/defaultMmeState.h
new file mode 100644
index 0000000..e223b75
--- /dev/null
+++ b/include/mme-app/mmeStates/defaultMmeState.h
@@ -0,0 +1,61 @@
+ /*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+ /******************************************************
+ * defaultMmeState.h
+ * 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.h.tt>
+ ******************************************************/
+ 
+#ifndef __DefaultMmeState__
+#define __DefaultMmeState__
+
+#include "state.h"
+
+namespace mme {
+
+	class DefaultMmeState : public SM::State
+	{
+		public:
+			/******************************************
+			* Instance 
+			*    Creates static instance for the state
+			*******************************************/
+			static DefaultMmeState* Instance();
+
+			/****************************************
+			* DefaultMmeState
+			*    Destructor
+			****************************************/
+			~DefaultMmeState();			
+			
+			/******************************************
+			* initialize
+			*  Initializes action handlers for the state
+			* and next state
+			******************************************/
+			void initialize();
+	
+		private:
+			/****************************************
+			* DefaultMmeState
+			*    Private constructor
+			****************************************/
+			DefaultMmeState();  
+	};
+};
+#endif // __DefaultMmeState__
diff --git a/include/mme-app/mmeStates/detachStart.h b/include/mme-app/mmeStates/detachStart.h
new file mode 100644
index 0000000..d40bcfd
--- /dev/null
+++ b/include/mme-app/mmeStates/detachStart.h
@@ -0,0 +1,61 @@
+ /*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+ /******************************************************
+ * detachStart.h
+ * 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.h.tt>
+ ******************************************************/
+ 
+#ifndef __DetachStart__
+#define __DetachStart__
+
+#include "state.h"
+
+namespace mme {
+
+	class DetachStart : public SM::State
+	{
+		public:
+			/******************************************
+			* Instance 
+			*    Creates static instance for the state
+			*******************************************/
+			static DetachStart* Instance();
+
+			/****************************************
+			* DetachStart
+			*    Destructor
+			****************************************/
+			~DetachStart();			
+			
+			/******************************************
+			* initialize
+			*  Initializes action handlers for the state
+			* and next state
+			******************************************/
+			void initialize();
+	
+		private:
+			/****************************************
+			* DetachStart
+			*    Private constructor
+			****************************************/
+			DetachStart();  
+	};
+};
+#endif // __DetachStart__
diff --git a/include/mme-app/mmeStates/detachWfDelSessionResp.h b/include/mme-app/mmeStates/detachWfDelSessionResp.h
new file mode 100644
index 0000000..6b9a9a7
--- /dev/null
+++ b/include/mme-app/mmeStates/detachWfDelSessionResp.h
@@ -0,0 +1,61 @@
+ /*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+ /******************************************************
+ * detachWfDelSessionResp.h
+ * 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.h.tt>
+ ******************************************************/
+ 
+#ifndef __DetachWfDelSessionResp__
+#define __DetachWfDelSessionResp__
+
+#include "state.h"
+
+namespace mme {
+
+	class DetachWfDelSessionResp : public SM::State
+	{
+		public:
+			/******************************************
+			* Instance 
+			*    Creates static instance for the state
+			*******************************************/
+			static DetachWfDelSessionResp* Instance();
+
+			/****************************************
+			* DetachWfDelSessionResp
+			*    Destructor
+			****************************************/
+			~DetachWfDelSessionResp();			
+			
+			/******************************************
+			* initialize
+			*  Initializes action handlers for the state
+			* and next state
+			******************************************/
+			void initialize();
+	
+		private:
+			/****************************************
+			* DetachWfDelSessionResp
+			*    Private constructor
+			****************************************/
+			DetachWfDelSessionResp();  
+	};
+};
+#endif // __DetachWfDelSessionResp__
diff --git a/include/mme-app/mmeStates/niDetachStart.h b/include/mme-app/mmeStates/niDetachStart.h
new file mode 100644
index 0000000..a45260f
--- /dev/null
+++ b/include/mme-app/mmeStates/niDetachStart.h
@@ -0,0 +1,61 @@
+ /*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+ /******************************************************
+ * niDetachStart.h
+ * 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.h.tt>
+ ******************************************************/
+ 
+#ifndef __NiDetachStart__
+#define __NiDetachStart__
+
+#include "state.h"
+
+namespace mme {
+
+	class NiDetachStart : public SM::State
+	{
+		public:
+			/******************************************
+			* Instance 
+			*    Creates static instance for the state
+			*******************************************/
+			static NiDetachStart* Instance();
+
+			/****************************************
+			* NiDetachStart
+			*    Destructor
+			****************************************/
+			~NiDetachStart();			
+			
+			/******************************************
+			* initialize
+			*  Initializes action handlers for the state
+			* and next state
+			******************************************/
+			void initialize();
+	
+		private:
+			/****************************************
+			* NiDetachStart
+			*    Private constructor
+			****************************************/
+			NiDetachStart();  
+	};
+};
+#endif // __NiDetachStart__
diff --git a/include/mme-app/mmeStates/niDetachWfDelSessResp.h b/include/mme-app/mmeStates/niDetachWfDelSessResp.h
new file mode 100644
index 0000000..9f334ce
--- /dev/null
+++ b/include/mme-app/mmeStates/niDetachWfDelSessResp.h
@@ -0,0 +1,61 @@
+ /*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+ /******************************************************
+ * niDetachWfDelSessResp.h
+ * 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.h.tt>
+ ******************************************************/
+ 
+#ifndef __NiDetachWfDelSessResp__
+#define __NiDetachWfDelSessResp__
+
+#include "state.h"
+
+namespace mme {
+
+	class NiDetachWfDelSessResp : public SM::State
+	{
+		public:
+			/******************************************
+			* Instance 
+			*    Creates static instance for the state
+			*******************************************/
+			static NiDetachWfDelSessResp* Instance();
+
+			/****************************************
+			* NiDetachWfDelSessResp
+			*    Destructor
+			****************************************/
+			~NiDetachWfDelSessResp();			
+			
+			/******************************************
+			* initialize
+			*  Initializes action handlers for the state
+			* and next state
+			******************************************/
+			void initialize();
+	
+		private:
+			/****************************************
+			* NiDetachWfDelSessResp
+			*    Private constructor
+			****************************************/
+			NiDetachWfDelSessResp();  
+	};
+};
+#endif // __NiDetachWfDelSessResp__
diff --git a/include/mme-app/mmeStates/niDetachWfDetAccptDelSessResp.h b/include/mme-app/mmeStates/niDetachWfDetAccptDelSessResp.h
new file mode 100644
index 0000000..c3f3f3d
--- /dev/null
+++ b/include/mme-app/mmeStates/niDetachWfDetAccptDelSessResp.h
@@ -0,0 +1,61 @@
+ /*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+ /******************************************************
+ * niDetachWfDetAccptDelSessResp.h
+ * 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.h.tt>
+ ******************************************************/
+ 
+#ifndef __NiDetachWfDetAccptDelSessResp__
+#define __NiDetachWfDetAccptDelSessResp__
+
+#include "state.h"
+
+namespace mme {
+
+	class NiDetachWfDetAccptDelSessResp : public SM::State
+	{
+		public:
+			/******************************************
+			* Instance 
+			*    Creates static instance for the state
+			*******************************************/
+			static NiDetachWfDetAccptDelSessResp* Instance();
+
+			/****************************************
+			* NiDetachWfDetAccptDelSessResp
+			*    Destructor
+			****************************************/
+			~NiDetachWfDetAccptDelSessResp();			
+			
+			/******************************************
+			* initialize
+			*  Initializes action handlers for the state
+			* and next state
+			******************************************/
+			void initialize();
+	
+		private:
+			/****************************************
+			* NiDetachWfDetAccptDelSessResp
+			*    Private constructor
+			****************************************/
+			NiDetachWfDetAccptDelSessResp();  
+	};
+};
+#endif // __NiDetachWfDetAccptDelSessResp__
diff --git a/include/mme-app/mmeStates/niDetachWfDetachAccept.h b/include/mme-app/mmeStates/niDetachWfDetachAccept.h
new file mode 100644
index 0000000..47ccdc9
--- /dev/null
+++ b/include/mme-app/mmeStates/niDetachWfDetachAccept.h
@@ -0,0 +1,61 @@
+ /*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+ /******************************************************
+ * niDetachWfDetachAccept.h
+ * 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.h.tt>
+ ******************************************************/
+ 
+#ifndef __NiDetachWfDetachAccept__
+#define __NiDetachWfDetachAccept__
+
+#include "state.h"
+
+namespace mme {
+
+	class NiDetachWfDetachAccept : public SM::State
+	{
+		public:
+			/******************************************
+			* Instance 
+			*    Creates static instance for the state
+			*******************************************/
+			static NiDetachWfDetachAccept* Instance();
+
+			/****************************************
+			* NiDetachWfDetachAccept
+			*    Destructor
+			****************************************/
+			~NiDetachWfDetachAccept();			
+			
+			/******************************************
+			* initialize
+			*  Initializes action handlers for the state
+			* and next state
+			******************************************/
+			void initialize();
+	
+		private:
+			/****************************************
+			* NiDetachWfDetachAccept
+			*    Private constructor
+			****************************************/
+			NiDetachWfDetachAccept();  
+	};
+};
+#endif // __NiDetachWfDetachAccept__
diff --git a/include/mme-app/mmeStates/niDetachWfS1RelComp.h b/include/mme-app/mmeStates/niDetachWfS1RelComp.h
new file mode 100644
index 0000000..57af7a1
--- /dev/null
+++ b/include/mme-app/mmeStates/niDetachWfS1RelComp.h
@@ -0,0 +1,61 @@
+ /*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+ /******************************************************
+ * niDetachWfS1RelComp.h
+ * 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.h.tt>
+ ******************************************************/
+ 
+#ifndef __NiDetachWfS1RelComp__
+#define __NiDetachWfS1RelComp__
+
+#include "state.h"
+
+namespace mme {
+
+	class NiDetachWfS1RelComp : public SM::State
+	{
+		public:
+			/******************************************
+			* Instance 
+			*    Creates static instance for the state
+			*******************************************/
+			static NiDetachWfS1RelComp* Instance();
+
+			/****************************************
+			* NiDetachWfS1RelComp
+			*    Destructor
+			****************************************/
+			~NiDetachWfS1RelComp();			
+			
+			/******************************************
+			* initialize
+			*  Initializes action handlers for the state
+			* and next state
+			******************************************/
+			void initialize();
+	
+		private:
+			/****************************************
+			* NiDetachWfS1RelComp
+			*    Private constructor
+			****************************************/
+			NiDetachWfS1RelComp();  
+	};
+};
+#endif // __NiDetachWfS1RelComp__
diff --git a/include/mme-app/mmeStates/pagingStart.h b/include/mme-app/mmeStates/pagingStart.h
new file mode 100644
index 0000000..d42f481
--- /dev/null
+++ b/include/mme-app/mmeStates/pagingStart.h
@@ -0,0 +1,61 @@
+ /*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+ /******************************************************
+ * pagingStart.h
+ * 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.h.tt>
+ ******************************************************/
+ 
+#ifndef __PagingStart__
+#define __PagingStart__
+
+#include "state.h"
+
+namespace mme {
+
+	class PagingStart : public SM::State
+	{
+		public:
+			/******************************************
+			* Instance 
+			*    Creates static instance for the state
+			*******************************************/
+			static PagingStart* Instance();
+
+			/****************************************
+			* PagingStart
+			*    Destructor
+			****************************************/
+			~PagingStart();			
+			
+			/******************************************
+			* initialize
+			*  Initializes action handlers for the state
+			* and next state
+			******************************************/
+			void initialize();
+	
+		private:
+			/****************************************
+			* PagingStart
+			*    Private constructor
+			****************************************/
+			PagingStart();  
+	};
+};
+#endif // __PagingStart__
diff --git a/include/mme-app/mmeStates/pagingWfServiceReq.h b/include/mme-app/mmeStates/pagingWfServiceReq.h
new file mode 100644
index 0000000..5c81557
--- /dev/null
+++ b/include/mme-app/mmeStates/pagingWfServiceReq.h
@@ -0,0 +1,61 @@
+ /*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+ /******************************************************
+ * pagingWfServiceReq.h
+ * 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.h.tt>
+ ******************************************************/
+ 
+#ifndef __PagingWfServiceReq__
+#define __PagingWfServiceReq__
+
+#include "state.h"
+
+namespace mme {
+
+	class PagingWfServiceReq : public SM::State
+	{
+		public:
+			/******************************************
+			* Instance 
+			*    Creates static instance for the state
+			*******************************************/
+			static PagingWfServiceReq* Instance();
+
+			/****************************************
+			* PagingWfServiceReq
+			*    Destructor
+			****************************************/
+			~PagingWfServiceReq();			
+			
+			/******************************************
+			* initialize
+			*  Initializes action handlers for the state
+			* and next state
+			******************************************/
+			void initialize();
+	
+		private:
+			/****************************************
+			* PagingWfServiceReq
+			*    Private constructor
+			****************************************/
+			PagingWfServiceReq();  
+	};
+};
+#endif // __PagingWfServiceReq__
diff --git a/include/mme-app/mmeStates/s1ReleaseStart.h b/include/mme-app/mmeStates/s1ReleaseStart.h
new file mode 100644
index 0000000..7540446
--- /dev/null
+++ b/include/mme-app/mmeStates/s1ReleaseStart.h
@@ -0,0 +1,61 @@
+ /*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+ /******************************************************
+ * s1ReleaseStart.h
+ * 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.h.tt>
+ ******************************************************/
+ 
+#ifndef __S1ReleaseStart__
+#define __S1ReleaseStart__
+
+#include "state.h"
+
+namespace mme {
+
+	class S1ReleaseStart : public SM::State
+	{
+		public:
+			/******************************************
+			* Instance 
+			*    Creates static instance for the state
+			*******************************************/
+			static S1ReleaseStart* Instance();
+
+			/****************************************
+			* S1ReleaseStart
+			*    Destructor
+			****************************************/
+			~S1ReleaseStart();			
+			
+			/******************************************
+			* initialize
+			*  Initializes action handlers for the state
+			* and next state
+			******************************************/
+			void initialize();
+	
+		private:
+			/****************************************
+			* S1ReleaseStart
+			*    Private constructor
+			****************************************/
+			S1ReleaseStart();  
+	};
+};
+#endif // __S1ReleaseStart__
diff --git a/include/mme-app/mmeStates/s1ReleaseWfReleaseAccessBearerResp.h b/include/mme-app/mmeStates/s1ReleaseWfReleaseAccessBearerResp.h
new file mode 100644
index 0000000..6c6eef7
--- /dev/null
+++ b/include/mme-app/mmeStates/s1ReleaseWfReleaseAccessBearerResp.h
@@ -0,0 +1,61 @@
+ /*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+ /******************************************************
+ * s1ReleaseWfReleaseAccessBearerResp.h
+ * 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.h.tt>
+ ******************************************************/
+ 
+#ifndef __S1ReleaseWfReleaseAccessBearerResp__
+#define __S1ReleaseWfReleaseAccessBearerResp__
+
+#include "state.h"
+
+namespace mme {
+
+	class S1ReleaseWfReleaseAccessBearerResp : public SM::State
+	{
+		public:
+			/******************************************
+			* Instance 
+			*    Creates static instance for the state
+			*******************************************/
+			static S1ReleaseWfReleaseAccessBearerResp* Instance();
+
+			/****************************************
+			* S1ReleaseWfReleaseAccessBearerResp
+			*    Destructor
+			****************************************/
+			~S1ReleaseWfReleaseAccessBearerResp();			
+			
+			/******************************************
+			* initialize
+			*  Initializes action handlers for the state
+			* and next state
+			******************************************/
+			void initialize();
+	
+		private:
+			/****************************************
+			* S1ReleaseWfReleaseAccessBearerResp
+			*    Private constructor
+			****************************************/
+			S1ReleaseWfReleaseAccessBearerResp();  
+	};
+};
+#endif // __S1ReleaseWfReleaseAccessBearerResp__
diff --git a/include/mme-app/mmeStates/s1ReleaseWfUeCtxtReleaseComp.h b/include/mme-app/mmeStates/s1ReleaseWfUeCtxtReleaseComp.h
new file mode 100644
index 0000000..25b39c6
--- /dev/null
+++ b/include/mme-app/mmeStates/s1ReleaseWfUeCtxtReleaseComp.h
@@ -0,0 +1,61 @@
+ /*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+ /******************************************************
+ * s1ReleaseWfUeCtxtReleaseComp.h
+ * 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.h.tt>
+ ******************************************************/
+ 
+#ifndef __S1ReleaseWfUeCtxtReleaseComp__
+#define __S1ReleaseWfUeCtxtReleaseComp__
+
+#include "state.h"
+
+namespace mme {
+
+	class S1ReleaseWfUeCtxtReleaseComp : public SM::State
+	{
+		public:
+			/******************************************
+			* Instance 
+			*    Creates static instance for the state
+			*******************************************/
+			static S1ReleaseWfUeCtxtReleaseComp* Instance();
+
+			/****************************************
+			* S1ReleaseWfUeCtxtReleaseComp
+			*    Destructor
+			****************************************/
+			~S1ReleaseWfUeCtxtReleaseComp();			
+			
+			/******************************************
+			* initialize
+			*  Initializes action handlers for the state
+			* and next state
+			******************************************/
+			void initialize();
+	
+		private:
+			/****************************************
+			* S1ReleaseWfUeCtxtReleaseComp
+			*    Private constructor
+			****************************************/
+			S1ReleaseWfUeCtxtReleaseComp();  
+	};
+};
+#endif // __S1ReleaseWfUeCtxtReleaseComp__
diff --git a/include/mme-app/mmeStates/serviceRequestStart.h b/include/mme-app/mmeStates/serviceRequestStart.h
new file mode 100644
index 0000000..24ca62a
--- /dev/null
+++ b/include/mme-app/mmeStates/serviceRequestStart.h
@@ -0,0 +1,61 @@
+ /*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+ /******************************************************
+ * serviceRequestStart.h
+ * 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.h.tt>
+ ******************************************************/
+ 
+#ifndef __ServiceRequestStart__
+#define __ServiceRequestStart__
+
+#include "state.h"
+
+namespace mme {
+
+	class ServiceRequestStart : public SM::State
+	{
+		public:
+			/******************************************
+			* Instance 
+			*    Creates static instance for the state
+			*******************************************/
+			static ServiceRequestStart* Instance();
+
+			/****************************************
+			* ServiceRequestStart
+			*    Destructor
+			****************************************/
+			~ServiceRequestStart();			
+			
+			/******************************************
+			* initialize
+			*  Initializes action handlers for the state
+			* and next state
+			******************************************/
+			void initialize();
+	
+		private:
+			/****************************************
+			* ServiceRequestStart
+			*    Private constructor
+			****************************************/
+			ServiceRequestStart();  
+	};
+};
+#endif // __ServiceRequestStart__
diff --git a/include/mme-app/mmeStates/serviceRequestWfAuthAndSecCheckCmp.h b/include/mme-app/mmeStates/serviceRequestWfAuthAndSecCheckCmp.h
new file mode 100644
index 0000000..ba37289
--- /dev/null
+++ b/include/mme-app/mmeStates/serviceRequestWfAuthAndSecCheckCmp.h
@@ -0,0 +1,61 @@
+ /*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+ /******************************************************
+ * serviceRequestWfAuthAndSecCheckCmp.h
+ * 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.h.tt>
+ ******************************************************/
+ 
+#ifndef __ServiceRequestWfAuthAndSecCheckCmp__
+#define __ServiceRequestWfAuthAndSecCheckCmp__
+
+#include "state.h"
+
+namespace mme {
+
+	class ServiceRequestWfAuthAndSecCheckCmp : public SM::State
+	{
+		public:
+			/******************************************
+			* Instance 
+			*    Creates static instance for the state
+			*******************************************/
+			static ServiceRequestWfAuthAndSecCheckCmp* Instance();
+
+			/****************************************
+			* ServiceRequestWfAuthAndSecCheckCmp
+			*    Destructor
+			****************************************/
+			~ServiceRequestWfAuthAndSecCheckCmp();			
+			
+			/******************************************
+			* initialize
+			*  Initializes action handlers for the state
+			* and next state
+			******************************************/
+			void initialize();
+	
+		private:
+			/****************************************
+			* ServiceRequestWfAuthAndSecCheckCmp
+			*    Private constructor
+			****************************************/
+			ServiceRequestWfAuthAndSecCheckCmp();  
+	};
+};
+#endif // __ServiceRequestWfAuthAndSecCheckCmp__
diff --git a/include/mme-app/mmeStates/serviceRequestWfInitCtxtResp.h b/include/mme-app/mmeStates/serviceRequestWfInitCtxtResp.h
new file mode 100644
index 0000000..0276c08
--- /dev/null
+++ b/include/mme-app/mmeStates/serviceRequestWfInitCtxtResp.h
@@ -0,0 +1,61 @@
+ /*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+ /******************************************************
+ * serviceRequestWfInitCtxtResp.h
+ * 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.h.tt>
+ ******************************************************/
+ 
+#ifndef __ServiceRequestWfInitCtxtResp__
+#define __ServiceRequestWfInitCtxtResp__
+
+#include "state.h"
+
+namespace mme {
+
+	class ServiceRequestWfInitCtxtResp : public SM::State
+	{
+		public:
+			/******************************************
+			* Instance 
+			*    Creates static instance for the state
+			*******************************************/
+			static ServiceRequestWfInitCtxtResp* Instance();
+
+			/****************************************
+			* ServiceRequestWfInitCtxtResp
+			*    Destructor
+			****************************************/
+			~ServiceRequestWfInitCtxtResp();			
+			
+			/******************************************
+			* initialize
+			*  Initializes action handlers for the state
+			* and next state
+			******************************************/
+			void initialize();
+	
+		private:
+			/****************************************
+			* ServiceRequestWfInitCtxtResp
+			*    Private constructor
+			****************************************/
+			ServiceRequestWfInitCtxtResp();  
+	};
+};
+#endif // __ServiceRequestWfInitCtxtResp__
diff --git a/include/mme-app/mmeStates/serviceRequestWfMbResp.h b/include/mme-app/mmeStates/serviceRequestWfMbResp.h
new file mode 100644
index 0000000..b7b103c
--- /dev/null
+++ b/include/mme-app/mmeStates/serviceRequestWfMbResp.h
@@ -0,0 +1,61 @@
+ /*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+ /******************************************************
+ * serviceRequestWfMbResp.h
+ * 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.h.tt>
+ ******************************************************/
+ 
+#ifndef __ServiceRequestWfMbResp__
+#define __ServiceRequestWfMbResp__
+
+#include "state.h"
+
+namespace mme {
+
+	class ServiceRequestWfMbResp : public SM::State
+	{
+		public:
+			/******************************************
+			* Instance 
+			*    Creates static instance for the state
+			*******************************************/
+			static ServiceRequestWfMbResp* Instance();
+
+			/****************************************
+			* ServiceRequestWfMbResp
+			*    Destructor
+			****************************************/
+			~ServiceRequestWfMbResp();			
+			
+			/******************************************
+			* initialize
+			*  Initializes action handlers for the state
+			* and next state
+			******************************************/
+			void initialize();
+	
+		private:
+			/****************************************
+			* ServiceRequestWfMbResp
+			*    Private constructor
+			****************************************/
+			ServiceRequestWfMbResp();  
+	};
+};
+#endif // __ServiceRequestWfMbResp__
diff --git a/include/mme-app/mmeStates/stateFactory.h b/include/mme-app/mmeStates/stateFactory.h
new file mode 100644
index 0000000..5367e85
--- /dev/null
+++ b/include/mme-app/mmeStates/stateFactory.h
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+/**************************************
+ * 
+ * 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.h.tt>
+ **************************************/
+
+#ifndef __StateFactory__
+#define __StateFactory__
+
+namespace mme {
+	class StateFactory {
+            public:
+			/******************************************
+			* Instance
+			*   Creates static instance for the state
+			*******************************************/
+            static StateFactory* Instance();
+
+			/*****************************************
+			* StateFactory
+			*   Destructor
+			*****************************************/
+			~StateFactory();
+
+			/******************************************
+			* initialize
+			*  Initializes action handlers for the state
+			* and next state
+			******************************************/
+             void initialize();
+
+            private:
+			/****************************************
+			* StateFactory
+			*	Private constructor
+			****************************************/
+            StateFactory();
+
+	};
+};
+#endif // __StateFactory__
diff --git a/include/mme-app/mmeStates/tauStart.h b/include/mme-app/mmeStates/tauStart.h
new file mode 100644
index 0000000..d42c203
--- /dev/null
+++ b/include/mme-app/mmeStates/tauStart.h
@@ -0,0 +1,61 @@
+ /*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+ /******************************************************
+ * tauStart.h
+ * 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.h.tt>
+ ******************************************************/
+ 
+#ifndef __TauStart__
+#define __TauStart__
+
+#include "state.h"
+
+namespace mme {
+
+	class TauStart : public SM::State
+	{
+		public:
+			/******************************************
+			* Instance 
+			*    Creates static instance for the state
+			*******************************************/
+			static TauStart* Instance();
+
+			/****************************************
+			* TauStart
+			*    Destructor
+			****************************************/
+			~TauStart();			
+			
+			/******************************************
+			* initialize
+			*  Initializes action handlers for the state
+			* and next state
+			******************************************/
+			void initialize();
+	
+		private:
+			/****************************************
+			* TauStart
+			*    Private constructor
+			****************************************/
+			TauStart();  
+	};
+};
+#endif // __TauStart__
diff --git a/include/mme-app/mme_app.h b/include/mme-app/mme_app.h
new file mode 100644
index 0000000..3f792fd
--- /dev/null
+++ b/include/mme-app/mme_app.h
@@ -0,0 +1,62 @@
+/*
+ * 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.
+ */
+
+#ifndef __MME_APP_H_
+#define __MME_APP_H_
+
+#include <stdbool.h>
+#include <map>
+#include <array>
+
+#include "s1ap_structs.h"
+
+/**
+ * MME main application configuration parameters structures.
+ * All fields in this will be filled in from input json file.
+ */
+typedef struct mme_config
+{
+	unsigned int mme_ip_addr;
+	unsigned short mme_sctp_port;
+	unsigned int s11_sgw_ip;
+	unsigned int s11_pgw_ip;
+	unsigned int enb_ip;
+	unsigned short enb_port;
+	unsigned short mme_egtp_def_port;
+	char  *mme_egtp_def_hostname;
+	char  *mme_name;
+
+	char  mcc_dig1;
+	char  mcc_dig2;
+	char  mcc_dig3;
+	char  mnc_dig1;
+	char  mnc_dig2;
+	char  mnc_dig3;
+	struct PLMN plmn_id;
+
+	unsigned int mme_s1ap_ip;
+	unsigned int mme_egtp_ip;
+	unsigned short mme_group_id;
+	unsigned char mme_code;
+} mme_config;
+
+const size_t fifoQSize_c = 1000;
+
+void stat_init();
+
+
+#endif /*__MME_APP_H_*/
diff --git a/include/mme-app/msgHandlers/gtpMsgHandler.h b/include/mme-app/msgHandlers/gtpMsgHandler.h
new file mode 100644
index 0000000..7f38784
--- /dev/null
+++ b/include/mme-app/msgHandlers/gtpMsgHandler.h
@@ -0,0 +1,31 @@
+/*
+ * gtpMsgHandler.h
+ *
+ *  Created on: Jun 5, 2019
+ *      Author: Anjana_Sreekumar
+ */
+
+#ifndef INCLUDE_MME_APP_MSGHANDLERS_GTPMSGHANDLER_H_
+#define INCLUDE_MME_APP_MSGHANDLERS_GTPMSGHANDLER_H_
+
+#include "msgType.h"
+#include <msgBuffer.h>
+
+class GtpMsgHandler {
+public:
+	static GtpMsgHandler* Instance();
+	~GtpMsgHandler();
+
+	void handleGtpMessage_v(cmn::utils::MsgBuffer* buffer);
+
+private:
+	GtpMsgHandler();
+
+	void handleCreateSessionResponseMsg_v(const cmn::utils::MsgBuffer* msgData_p, uint32_t ueIdx);
+	void handleModifyBearerResponseMsg_v(const cmn::utils::MsgBuffer* msgData_p, uint32_t ueIdx);
+	void handleDeleteSessionResponseMsg_v(const cmn::utils::MsgBuffer* msgData_p, uint32_t ueIdx);
+	void handleReleaseBearerResponseMsg_v(const cmn::utils::MsgBuffer* msgData_p, uint32_t ueIdx);
+	void handleDdnMsg_v(const cmn::utils::MsgBuffer* msgData_p, uint32_t ueIdx);
+};
+
+#endif /* INCLUDE_MME_APP_MSGHANDLERS_GTPMSGHANDLER_H_ */
diff --git a/include/mme-app/msgHandlers/s1MsgHandler.h b/include/mme-app/msgHandlers/s1MsgHandler.h
new file mode 100644
index 0000000..32ca4d7
--- /dev/null
+++ b/include/mme-app/msgHandlers/s1MsgHandler.h
@@ -0,0 +1,40 @@
+/*
+ * s1MsgHandler.h
+ *
+ *  Created on: Jun 5, 2019
+ *      Author: Anjana_Sreekumar
+ */
+
+#ifndef INCLUDE_MME_APP_MSGHANDLERS_S1MSGHANDLER_H_
+#define INCLUDE_MME_APP_MSGHANDLERS_S1MSGHANDLER_H_
+
+#include "msgType.h"
+#include <msgBuffer.h>
+
+class S1MsgHandler {
+public:
+	static S1MsgHandler* Instance();
+	~S1MsgHandler();
+
+	void handleS1Message_v(const cmn::utils::MsgBuffer* buffer);
+
+private:
+	S1MsgHandler();
+
+	void handleInitUeAttachRequestMsg_v(const cmn::utils::MsgBuffer* msgData_p);
+	void handleIdentityResponseMsg_v(const cmn::utils::MsgBuffer* msgData_p, uint32_t ueIdx);
+	void handleAuthResponseMsg_v(const cmn::utils::MsgBuffer* msgData_p, uint32_t ueIdx);
+	void handleSecurityModeResponse_v(const cmn::utils::MsgBuffer* msgData_p, uint32_t ueIdx);
+	void handleEsmInfoResponse_v(const cmn::utils::MsgBuffer* msgData_p, uint32_t ueIdx);
+	void handleInitCtxtResponse_v(const cmn::utils::MsgBuffer* msgData_p, uint32_t ueIdx);
+	void handleAttachComplete_v(const cmn::utils::MsgBuffer* msgData_p, uint32_t ueIdx);
+	void handleDetachRequest_v(const cmn::utils::MsgBuffer* msgData_p, uint32_t ueIdx);
+	void handleS1ReleaseRequestMsg_v(const cmn::utils::MsgBuffer* msgData_p, uint32_t ueIdx);
+	void handleS1ReleaseComplete_v(const cmn::utils::MsgBuffer* msgData_p, uint32_t ueIdx);
+	void handleNIDetachRequest_v(const cmn::utils::MsgBuffer* msgData_p, uint32_t ueIdx);
+	void handleDetachAcceptFromUE_v(const cmn::utils::MsgBuffer* msgData_p, uint32_t ueIdx);
+	void handleServiceRequest_v(const cmn::utils::MsgBuffer* msgData_p, uint32_t ueIdx);
+	void handleTauRequestMsg_v(const cmn::utils::MsgBuffer* msgData_p, uint32_t ueIdx);
+};
+
+#endif /* INCLUDE_MME_APP_MSGHANDLERS_S1MSGHANDLER_H_ */
diff --git a/include/mme-app/msgHandlers/s6MsgHandler.h b/include/mme-app/msgHandlers/s6MsgHandler.h
new file mode 100644
index 0000000..7d9b4fd
--- /dev/null
+++ b/include/mme-app/msgHandlers/s6MsgHandler.h
@@ -0,0 +1,31 @@
+/*
+ * s6MsgHandler.h
+ *
+ *  Created on: Jun 5, 2019
+ *      Author: Anjana_Sreekumar
+ */
+
+#ifndef INCLUDE_MME_APP_MSGHANDLERS_S6MSGHANDLER_H_
+#define INCLUDE_MME_APP_MSGHANDLERS_S6MSGHANDLER_H_
+
+#include "msgType.h"
+#include <msgBuffer.h>
+
+class S6MsgHandler {
+public:
+	static S6MsgHandler* Instance();
+	virtual ~S6MsgHandler();
+
+	void handleS6Message_v(cmn::utils::MsgBuffer* msgBuf);
+
+private:
+	S6MsgHandler();
+
+	void handleAuthInfoAnswer_v(cmn::utils::MsgBuffer* msgData_p, uint32_t ueIdx);
+	void handleUpdateLocationAnswer_v(cmn::utils::MsgBuffer* msgData_p, uint32_t ueIdx);
+	void handlePurgeAnswer_v(cmn::utils::MsgBuffer* msgData_p, uint32_t ueIdx);
+	void handleCancelLocationRequest_v(cmn::utils::MsgBuffer* msgData_p);
+
+};
+
+#endif /* INCLUDE_MME_APP_MSGHANDLERS_S6MSGHANDLER_H_ */
diff --git a/include/mme-app/procedureStats.h b/include/mme-app/procedureStats.h
new file mode 100644
index 0000000..e9501fe
--- /dev/null
+++ b/include/mme-app/procedureStats.h
@@ -0,0 +1,54 @@
+#ifndef PROCEDURE_STATS_H
+#define PROCEDURE_STATS_H
+namespace mme
+{
+        class ProcedureStats
+        {
+        public:
+                static int num_of_air_sent;
+                static int num_of_ulr_sent;
+                static int num_of_processed_aia;
+                static int num_of_processed_ula;
+                static int num_of_auth_req_to_ue_sent;
+                static int num_of_processed_auth_response;
+                static int num_of_sec_mode_cmd_to_ue_sent;
+                static int num_of_processed_sec_mode_resp;
+                static int num_of_esm_info_req_to_ue_sent;
+                static int num_of_handled_esm_info_resp;
+                static int num_of_cs_req_to_sgw_sent;
+                static int num_of_processed_cs_resp;
+                static int num_of_init_ctxt_req_to_ue_sent;
+                static int num_of_processed_init_ctxt_resp;
+                static int num_of_mb_req_to_sgw_sent;
+                static int num_of_processed_attach_cmp_from_ue;
+                static int num_of_processed_mb_resp;
+                static int num_of_attach_done;
+                static int num_of_del_session_req_sent;
+                static int num_of_purge_req_sent;
+                static int num_of_processed_del_session_resp;
+                static int num_of_processed_pur_resp;
+                static int num_of_detach_accept_to_ue_sent;
+                static int num_of_processed_detach_accept;
+                static int num_of_ue_ctxt_release;
+                static int num_of_processed_ctxt_rel_resp;
+                static int num_of_subscribers_attached;
+                static int num_of_rel_access_bearer_req_sent;
+                static int num_of_rel_access_bearer_resp_received;
+                static int num_of_s1_rel_req_received;
+                static int num_of_s1_rel_cmd_sent;
+                static int num_of_s1_rel_comp_received;
+                static int num_of_clr_received;
+                static int num_of_cla_sent;
+                static int num_of_detach_req_to_ue_sent;
+                static int num_of_detach_accept_from_ue;
+                static int total_num_of_subscribers;
+                static int num_of_subscribers_detached;
+		static int num_of_ddn_received;
+		static int num_of_service_request_received;
+		static int num_of_ddn_ack_sent;		
+		static int num_of_tau_response_to_ue_sent;
+		
+
+        };
+};
+#endif
diff --git a/include/mme-app/secUtils.h b/include/mme-app/secUtils.h
new file mode 100644
index 0000000..14abb3f
--- /dev/null
+++ b/include/mme-app/secUtils.h
@@ -0,0 +1,12 @@
+class SecUtils
+{
+	public:
+	static void create_integrity_key(unsigned char *kasme, unsigned char *int_key);
+
+	static void create_kenb_key(unsigned char *kasme, unsigned char *kenb_key,
+			unsigned int seq_no);
+
+	static void 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);
+};
diff --git a/include/mme-app/structs.h b/include/mme-app/structs.h
new file mode 100644
index 0000000..9420b0e
--- /dev/null
+++ b/include/mme-app/structs.h
@@ -0,0 +1,182 @@
+/*
+ * 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 STRUCTS_H_
+#define STRUCTS_H_
+
+#include <iostream>
+#include "msgType.h"
+#include "s1ap_structs.h"
+#include "ue_table.h"
+#include "s11_structs.h"
+#include <utils/mmeProcedureTypes.h>
+
+
+class Tai
+{
+	public:
+		Tai();
+		Tai( const TAI& tai_i );
+		~Tai();
+		void operator = ( const Tai& tai_i );
+	public:
+		TAI tai_m;
+};
+
+class Cgi
+{
+	public:
+		Cgi();
+		Cgi( const CGI& cgi_i );
+		~Cgi();
+		void operator = ( const Cgi& cgi_i );
+	public:
+		CGI cgi_m;
+};
+
+class Stmsi
+{
+        public:
+                Stmsi();
+                Stmsi( const STMSI& stmsi_i );
+                ~Stmsi();
+                void operator = ( const Stmsi& stmsi_i );
+        public:
+                STMSI stmsi_m;
+};
+
+
+class Arp
+{
+        public:
+                Arp();
+                Arp( const ARP& arp_i );
+                ~Arp();
+                void operator = ( const Arp& arp_i );
+        public:
+                ARP arp_m;
+};
+
+class Ms_net_capab
+{
+	public:
+		Ms_net_capab();
+		Ms_net_capab( const MS_net_capab& ms_net_capb_i );
+		~Ms_net_capab();
+		void operator = ( const Ms_net_capab& ms_net_capb_i );
+	public:
+		MS_net_capab ms_net_capab_m;
+};
+
+class Ue_net_capab
+{
+	public:
+		Ue_net_capab();
+		Ue_net_capab( const UE_net_capab& ue_net_capab_i );
+		~Ue_net_capab();
+		void operator = ( const Ue_net_capab& ue_net_capab_i );
+	public:
+		UE_net_capab ue_net_capab_m;
+};
+
+class Secinfo
+{
+	public:
+		Secinfo();
+		Secinfo( const secinfo& secinfo_i );
+		~Secinfo();
+		void operator = ( const Secinfo& secinfo_i );		
+	public:
+		secinfo secinfo_m;
+};
+
+class Ambr
+{
+	public:
+		Ambr();
+		Ambr( const AMBR& ambr_i );
+		~Ambr();
+		void operator = ( const Ambr& ambr_i );
+	public:
+		AMBR ambr_m;
+};
+
+class E_utran_sec_vector
+{
+	public:
+		E_utran_sec_vector();
+		E_utran_sec_vector( const E_UTRAN_sec_vector& secinfo_i );
+		~E_utran_sec_vector();
+		void operator = ( const E_utran_sec_vector& secinfo_i );
+		friend std::ostream& operator << ( std::ostream& os, const E_utran_sec_vector& data_i );
+	public:
+		E_UTRAN_sec_vector* AiaSecInfo_mp;
+};
+	
+class Fteid
+{
+	public:
+		Fteid();
+		Fteid( const fteid& fteid_i );
+		~Fteid();
+		void operator = ( const Fteid& fteid_i );
+	public:
+		fteid fteid_m;
+};
+
+class Paa
+{
+	public:
+		Paa();
+		Paa( const PAA& paa_i );
+		~Paa();
+		void operator = ( const Paa& paa_i );
+	public:
+		PAA paa_m;
+};
+
+class Apn_name
+{
+	public:
+		Apn_name();
+		Apn_name( const apn_name& apn_name_i );
+		~Apn_name();
+		void operator = ( const Apn_name& apn_name_i );
+	public:
+		apn_name apnname_m;
+};
+
+class DigitRegister15
+{
+	public:
+		DigitRegister15();
+		void convertToBcdArray(uint8_t* arrayOut) const;
+		void convertFromBcdArray(const uint8_t* bcdArrayIn);
+		void setImsiDigits( uint8_t* digitsArrayIn );
+		void getImsiDigits( uint8_t* digitsArrayIn ) const;	
+		bool isValid() const;
+		void operator = ( const DigitRegister15& data_i );
+		bool operator == ( const DigitRegister15& data_i )const;
+		bool operator < ( const DigitRegister15& data_i )const;
+
+		friend std::ostream& operator << ( std::ostream& os, const DigitRegister15& data_i );
+	
+	private:
+
+		uint8_t digitsArray[15];
+};
+
+#endif
diff --git a/include/mme-app/ue_table.h b/include/mme-app/ue_table.h
new file mode 100644
index 0000000..a038ac0
--- /dev/null
+++ b/include/mme-app/ue_table.h
@@ -0,0 +1,35 @@
+/*
+ * 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.
+ */
+
+#ifndef __UE_TABLE_H_
+#define __UE_TABLE_H_
+
+#include "s1ap_structs.h"
+#include "s11_structs.h"
+#include "msgType.h"
+
+struct secinfo {
+	uint8_t int_key[NAS_INT_KEY_SIZE];
+	uint8_t kenb_key[KENB_SIZE];
+};
+
+struct AMBR {
+	unsigned int max_requested_bw_dl;
+	unsigned int max_requested_bw_ul;
+};
+
+#endif /*ue_table*/
diff --git a/include/mme-app/utils/defaultMmeProcedureCtxt.h b/include/mme-app/utils/defaultMmeProcedureCtxt.h
new file mode 100644
index 0000000..5fb4204
--- /dev/null
+++ b/include/mme-app/utils/defaultMmeProcedureCtxt.h
@@ -0,0 +1,37 @@
+/*
+ * 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 INCLUDE_MME_APP_UTILS_DEFAULTMMEPROCEDURECTXT_H_
+#define INCLUDE_MME_APP_UTILS_DEFAULTMMEPROCEDURECTXT_H_
+
+#include <contextManager/dataBlocks.h>
+
+namespace mme
+{
+class DefaultMmeProcedureCtxt : public MmeProcedureCtxt
+{
+public:
+    static DefaultMmeProcedureCtxt* Instance();
+
+private:
+    DefaultMmeProcedureCtxt();
+    ~DefaultMmeProcedureCtxt();
+};
+}
+
+
+
+#endif /* INCLUDE_MME_APP_UTILS_DEFAULTMMEPROCEDURECTXT_H_ */
diff --git a/include/mme-app/utils/mmeCauseTypes.h b/include/mme-app/utils/mmeCauseTypes.h
new file mode 100644
index 0000000..6535119
--- /dev/null
+++ b/include/mme-app/utils/mmeCauseTypes.h
@@ -0,0 +1,32 @@
+/*
+ * 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 INCLUDE_MME_APP_UTILS_MMECAUSETYPES_H_
+#define INCLUDE_MME_APP_UTILS_MMECAUSETYPES_H_
+
+#include <stdint.h>
+
+namespace mme
+{
+
+typedef uint32_t MmeErrorCause;
+
+const MmeErrorCause noError_c = 0x00;
+const MmeErrorCause ueContextNotFound_c = 0x01;
+
+}
+
+#endif /* INCLUDE_MME_APP_UTILS_MMECAUSETYPES_H_ */
diff --git a/include/mme-app/utils/mmeCommonUtils.h b/include/mme-app/utils/mmeCommonUtils.h
new file mode 100644
index 0000000..cc40620
--- /dev/null
+++ b/include/mme-app/utils/mmeCommonUtils.h
@@ -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.
+ */
+
+#ifndef INCLUDE_MME_APP_UTILS_MMECOMMONUTILS_H_
+#define INCLUDE_MME_APP_UTILS_MMECOMMONUTILS_H_
+
+#include <stdint.h>
+#include <utils/mmeProcedureTypes.h>
+#include <msgType.h>
+
+struct guti;
+
+namespace SM
+{
+	class ControlBlock;
+}
+
+namespace cmn
+{
+	namespace utils
+	{
+		class MsgBuffer;
+	}
+}
+
+namespace mme
+{
+	class MmeProcedureCtxt;
+	class UEContext;
+	class MmeCommonUtils
+	{
+	public:
+		static bool isLocalGuti(const guti& guti_r);
+		static uint32_t allocateMtmsi();
+
+		static SM::ControlBlock* findControlBlock(cmn::utils::MsgBuffer* msgData_p);
+
+		static AttachType getAttachType(UEContext* ueCtxt_p, const struct ue_attach_info& attachReqMsg_r);
+
+	private:
+		MmeCommonUtils();
+		~MmeCommonUtils();
+	};
+}
+
+#endif /* INCLUDE_MME_APP_UTILS_MMECOMMONUTILS_H_ */
diff --git a/include/mme-app/utils/mmeContextManagerUtils.h b/include/mme-app/utils/mmeContextManagerUtils.h
new file mode 100644
index 0000000..4f844a5
--- /dev/null
+++ b/include/mme-app/utils/mmeContextManagerUtils.h
@@ -0,0 +1,53 @@
+/*
+ * 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 INCLUDE_MME_APP_UTILS_MMECONTEXTMANAGERUTILS_H_
+#define INCLUDE_MME_APP_UTILS_MMECONTEXTMANAGERUTILS_H_
+
+#include <utils/mmeProcedureTypes.h>
+#include <stdint.h>
+
+namespace SM
+{
+class ControlBlock;
+}
+
+namespace mme
+{
+
+class MmeProcedureCtxt;
+class MmeContextManagerUtils
+{
+public:
+
+    static MmeProcedureCtxt* findProcedureCtxt(SM::ControlBlock& cb_r, ProcedureType procType);
+
+	static bool deleteProcedureCtxt(MmeProcedureCtxt* procedure_p);
+	static bool deallocateProcedureCtxt(SM::ControlBlock& cb_r, ProcedureType procType);
+	static bool deallocateAllProcedureCtxts(SM::ControlBlock& cb_r);
+
+	static void deleteUEContext(uint32_t cbIndex);
+	static void deleteSessionContext(SM::ControlBlock& cb_r);
+
+private:
+	MmeContextManagerUtils();
+	~MmeContextManagerUtils();
+};
+}
+
+
+
+#endif /* INCLUDE_MME_APP_UTILS_MMECONTEXTMANAGERUTILS_H_ */
diff --git a/include/mme-app/utils/mmeProcedureTypes.h b/include/mme-app/utils/mmeProcedureTypes.h
new file mode 100644
index 0000000..2c7c620
--- /dev/null
+++ b/include/mme-app/utils/mmeProcedureTypes.h
@@ -0,0 +1,80 @@
+/*
+ * 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 INCLUDE_MME_APP_UTILS_MMEPROCEDURETYPES_H_
+#define INCLUDE_MME_APP_UTILS_MMEPROCEDURETYPES_H_
+
+namespace mme
+{
+ enum AttachType
+ {
+	 invalidAttachType_c,
+
+	 imsiAttach_c,
+	 knownGutiAttach_c,
+	 unknownGutiAttach_c,
+
+	 maxAttachType_c
+ };
+
+ enum ProcedureType
+ {
+    	invalidProcedureType_c,
+
+    	defaultMmeProcedure_c,
+    	attach_c,
+    	detach_c,
+    	s1Release_c,
+    	serviceRequest_c,
+    	tau_c,
+
+    	maxProcedureType_c
+ };
+
+ enum DetachType
+ {
+    	invalidDetachType_c,
+
+    	mmeInitDetach_c,
+    	hssInitDetach_c,
+    	ueInitDetach_c,
+
+    	maxDetachtype_c
+ };
+
+ enum UE_State_e
+ {
+        InvalidState,
+
+        NoState,
+        EpsAttached,
+        EpsDetached,
+
+        maxUeState
+ };
+ using EmmState = UE_State_e;
+
+ enum PagingTrigger
+ {
+        none_c,
+        hssInit_c,
+        ddnInit_c,
+        maxPagingTrigger_c
+ };
+
+}
+
+#endif /* INCLUDE_MME_APP_UTILS_MMEPROCEDURETYPES_H_ */
diff --git a/include/s11/gtpv2c.h b/include/s11/gtpv2c.h
new file mode 100644
index 0000000..6177146
--- /dev/null
+++ b/include/s11/gtpv2c.h
@@ -0,0 +1,48 @@
+/*
+ * 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.
+ */
+
+#ifndef __GTPV2C_H_
+#define __GTPV2C_H_
+
+#include <stdint.h>
+
+#include "s11_structs.h"
+
+#define MAX_GTPV2C_UDP_LEN                                   4096
+
+#define GTP_VERSION_GTPV2C                                   2
+
+/* GTP Message Type */
+#define GTP_CREATE_SESSION_REQ                               32
+#define GTP_CREATE_SESSION_RSP                               33
+#define GTP_MODIFY_BEARER_REQ                                34
+#define GTP_MODIFY_BEARER_RSP                                35
+#define GTP_DELETE_SESSION_REQ                               36
+#define GTP_DELETE_SESSION_RSP                               37
+//S1 Release
+#define GTP_RELEASE_BEARER_REQ				     170
+
+enum gtpv2c_interfaces {
+	GTPV2C_IFTYPE_S1U_ENODEB_GTPU = 0,
+};
+
+
+void
+set_gtpv2c_header(struct gtpv2c_header *gtpv2c_tx, uint8_t type,
+		uint32_t teid, uint32_t seq);
+
+#endif /* __GTPV2C_H_ */
diff --git a/include/s11/gtpv2c_ie.h b/include/s11/gtpv2c_ie.h
new file mode 100644
index 0000000..05f409f
--- /dev/null
+++ b/include/s11/gtpv2c_ie.h
@@ -0,0 +1,120 @@
+/*
+ * 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.
+ */
+
+
+#ifndef __GTPV2C_IE_H_
+#define __GTPV2C_IE_H_
+
+
+#include <inttypes.h>
+#include <stdlib.h>
+#include <netinet/in.h>
+
+#define IPV4_IE_LENGTH          4
+#define IPV6_IE_LENGTH          16
+
+/* TODO: Check size */
+#define GTPV2C_MAX_LEN          4096
+
+#define AMBR_UPLINK             100000000
+#define AMBR_DOWNLINK           50000000
+
+#define MBR_UPLINK              245018193L//245018193976L
+#define MBR_DOWNLINK            245018193L//245018193976L
+
+enum gtpv2c_ie_type {
+	IE_RESERVED = 0,
+	IE_IMSI = 1,
+	IE_APN = 71,
+	IE_AMBR = 72,
+	IE_EBI = 73,
+	IE_INDICATION = 77,
+	IE_MSISDN = 76,
+	IE_PAA = 79,
+	IE_BEARER_QOS = 80,
+	IE_RAT_TYPE = 82,
+	IE_SERVING_NETWORK = 83,
+	IE_ULI = 86,
+	IE_FTEID = 87,
+	IE_BEARER_CONTEXT = 93,
+	IE_PDN_TYPE = 99,
+	IE_APN_RESTRICTION = 127,
+	IE_SELECTION_MODE = 128,
+};
+
+enum cause_value {
+	GTPV2C_CAUSE_REQUEST_ACCEPTED = 16,
+	GTPV2C_CAUSE_REQUEST_ACCEPTED_PARTIALLY = 17,
+	GTPV2C_CAUSE_NEW_PDN_TYPE_NETWORK_PREFERENCE = 18,
+	GTPV2C_CAUSE_NEW_PDN_TYPE_SINGLE_ADDR_BEARER = 19,
+	GTPV2C_CAUSE_CONTEXT_NOT_FOUND = 64,
+	GTPV2C_CAUSE_INVALID_MESSAGE_FORMAT = 65,
+	GTPV2C_CAUSE_INVALID_LENGTH = 67,
+	GTPV2C_CAUSE_SERVICE_NOT_SUPPORTED = 68,
+	GTPV2C_CAUSE_MANDATORY_IE_INCORRECT = 69,
+	GTPV2C_CAUSE_MANDATORY_IE_MISSING = 70,
+	GTPV2C_CAUSE_SYSTEM_FAILURE = 72,
+	GTPV2C_CAUSE_NO_RESOURCES_AVAILABLE = 73,
+	GTPV2C_CAUSE_MISSING_UNKNOWN_APN = 78,
+	GTPV2C_CAUSE_PREFERRED_PDN_TYPE_UNSUPPORTED = 83,
+	GTPV2C_CAUSE_ALL_DYNAMIC_ADDRESSES_OCCUPIED = 84,
+	GTPV2C_CAUSE_REQUEST_REJECTED = 94,
+	GTPV2C_CAUSE_REMOTE_PEER_NOT_RESPONDING = 100,
+	GTPV2C_CAUSE_CONDITIONAL_IE_MISSING = 103,
+};
+
+#define PDN_IP_TYPE_IPV4                                      1
+#define PDN_IP_TYPE_IPV6                                      2
+#define PDN_IP_TYPE_IPV4V6                                    3
+
+
+enum gtpv2c_ie_instance {
+	INSTANCE_ZERO = 0,
+	INSTANCE_ONE = 1,
+	INSTANCE_TWO = 2,
+};
+
+#pragma pack(1)
+
+
+typedef struct gtpv2c_ie_t {
+	uint8_t type;
+	uint16_t length;
+	uint8_t instance;
+	uint8_t value[GTPV2C_MAX_LEN];
+} gtpv2c_ie;
+
+
+typedef struct fteid_ie_t {
+	uint8_t iface_type :6;
+	uint8_t ipv6 :1;
+	uint8_t ipv4 :1;
+	uint32_t teid;
+	union ip_t {
+		uint32_t ipv4;
+		uint8_t ipv6[INET6_ADDRSTRLEN];
+		struct ipv4v6_t_x {
+			uint32_t ipv4;
+			uint8_t ipv6[INET6_ADDRSTRLEN];
+		} ipv4v6;
+	} ipaddr;
+} fteid_ie;
+
+
+#pragma pack()
+
+#endif /* __GTPV2C_IE_H_ */
diff --git a/include/s11/s11.h b/include/s11/s11.h
new file mode 100644
index 0000000..cdc6536
--- /dev/null
+++ b/include/s11/s11.h
@@ -0,0 +1,80 @@
+/*
+ * 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 __UE_S11_H_
+#define __UE_S11_H_
+
+#include <stdint.h>
+#include "log.h"
+#include "s11_structs.h"
+
+/*No of threads handling S11 GTPv2 messages coming in*/
+#define S11_THREADPOOL_SIZE 5
+
+#define S11_GTPV2C_BUF_LEN	4096
+
+/*GTPv2c message types*/
+#define S11_GTP_CREATE_SESSION_REQ	32
+#define S11_GTP_CREATE_SESSION_RESP	33
+#define S11_GTP_MODIFY_BEARER_RESP	35
+#define S11_GTP_DELETE_SESSION_RESP	37
+#define S11_GTP_RELEASE_BEARER_REQ	170
+#define S11_GTP_RELEASE_BEARER_RESP	171
+#define S11_GTP_DDN			176
+
+/*GTPv2c IE message types*/
+#define S11_IE_CAUSE		2
+#define S11_IE_FTEID_C		87
+#define S11_IE_PAA		79
+#define S11_IE_APN_RESTRICTION	127
+#define S11_IE_BEARER_CTX	93
+#define S11_IE_EPS_BEARER_ID	73
+
+int
+init_s11();
+
+void
+handle_s11_message(void *message);
+
+int
+init_s11();
+
+void
+handle_s11_message(void *message);
+
+int
+s11_transation(char * buf, unsigned int len);
+
+void* create_session_handler(void *);
+void* modify_bearer_handler(void *);
+void* release_bearer_handler(void *); 
+void* delete_session_handler(void *);
+void* ddn_ack_handler(void *);
+/*int s11_CS_resp_handler(char *message);
+int s11_MB_resp_handler(char *message);
+int s11_DS_resp_handler(char *message);
+int s11_RB_resp_handler(char *message);
+int s11_DDN_handler(char *message);
+*/
+
+
+void
+bswap8_array(uint8_t *src, uint8_t *dest, uint32_t len);
+
+int parse_gtpv2c_IEs(char *msg, int len, struct s11_proto_IE *proto_ies);
+
+#endif /*S11_H*/
diff --git a/include/s11/s11_config.h b/include/s11/s11_config.h
new file mode 100644
index 0000000..98de079
--- /dev/null
+++ b/include/s11/s11_config.h
@@ -0,0 +1,37 @@
+/*
+ * 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.
+ */
+
+#ifndef __S11_CONFIG_H_
+#define __S11_CONFIG_H_
+
+#include <stdbool.h>
+
+typedef struct s11_config
+{
+	unsigned int sgw_ip;
+	unsigned int pgw_ip;
+	unsigned int egtp_def_port;
+	unsigned int local_egtp_ip;
+} s11_config;
+
+void
+init_parser(char *path);
+
+int
+parse_s11_conf();
+
+#endif /*__S11_CONFIG_H*/
diff --git a/include/s1ap/enb.h b/include/s1ap/enb.h
new file mode 100644
index 0000000..4d976f0
--- /dev/null
+++ b/include/s1ap/enb.h
@@ -0,0 +1,21 @@
+/*
+ * 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.
+ */
+
+#ifndef __ENB_H_
+#define __ENB_H_
+
+#endif /*__ENB_H_*/
diff --git a/include/s1ap/main.h b/include/s1ap/main.h
new file mode 100644
index 0000000..089121a
--- /dev/null
+++ b/include/s1ap/main.h
@@ -0,0 +1,112 @@
+/*
+ * 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.
+ */
+
+/*
+ * main.h
+ *
+ */
+
+#ifndef MAIN_H_
+#define MAIN_H_
+
+#include <time.h>
+#include <stdint.h>
+
+#include "stimer.h"
+
+#define THREADPOOL_SIZE 10
+
+#define SCTP_BUF_SIZE 1024
+
+/*Timer and stat calculations*/
+struct time_stat {
+	stimer_t init_ue;
+	stimer_t esm_in;
+	stimer_t esm_out;
+	stimer_t auth_in;
+	stimer_t auth_to_mme;
+	stimer_t secreq_in;
+	stimer_t secreq_out;
+	stimer_t secresp_in;
+	stimer_t secresp_to_mme;
+	stimer_t esmreq_in;
+	stimer_t esmreq_out;
+	stimer_t espresp_in;
+	stimer_t espresp_to_mme;
+	stimer_t initctx_out;
+	stimer_t initctx_resp;
+	stimer_t att_done;
+};
+
+void
+*authreq_handler(void *);
+
+void
+*attach_reject_handler(void *);
+
+void
+*idreq_handler(void *);
+
+void
+*secreq_handler(void *);
+
+void
+*esmreq_handler(void *);
+
+void
+*icsreq_handler(void *);
+
+void
+*detach_accept_handler(void *);
+
+void
+*s1_release_command_handler(void *);
+
+void
+*paging_handler(void *);
+
+void
+*ics_req_paging_handler(void *);
+
+void 
+*tau_response_handler(void *);
+
+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);
+
+typedef long long int stimer_t;
+
+#define STIMER_GET_CURRENT_TP(__now__)                                                 \
+	({                                                                                     \
+	    struct timespec __ts__;                                                             \
+	    __now__ = clock_gettime(CLOCK_REALTIME,&__ts__) ?                                   \
+	          -1 : (((stimer_t)__ts__.tv_sec) * 1000000000) + ((stimer_t)__ts__.tv_nsec);   \
+	    __now__;                                                                            \
+	 })
+
+#define STIMER_GET_ELAPSED_NS(_start_)                                                 \
+	({                                                                                     \
+	    stimer_t __ns__;                                                                    \
+	    STIMER_GET_CURRENT_TP(__ns__);                                                      \
+	    if (__ns__ != -1)                                                                   \
+	       __ns__ -= _start_;                                                               \
+	    __ns__;                                                                             \
+	 })
+
+#endif /* MAIN_H_ */
diff --git a/include/s1ap/options.h b/include/s1ap/options.h
new file mode 100644
index 0000000..50eab87
--- /dev/null
+++ b/include/s1ap/options.h
@@ -0,0 +1,32 @@
+/*
+ * 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.
+ */
+
+/*
+ * options.h
+ *
+ */
+
+#ifndef OPTIONS_H_
+#define OPTIONS_H_
+
+#include "s1ap.h"
+
+#define REQ_ARGS 0x0000
+void parse_args(int argc, char **argv);
+void log_buffer_free(char** buffer);
+void convert_imsi_to_bcd_str(uint8_t *src, uint8_t* dest); 
+#endif /* OPTIONS_H_ */
diff --git a/include/s1ap/s1ap.h b/include/s1ap/s1ap.h
new file mode 100644
index 0000000..b955a03
--- /dev/null
+++ b/include/s1ap/s1ap.h
@@ -0,0 +1,143 @@
+/*
+ * 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.
+ */
+
+#ifndef __S1AP_H_
+#define __S1AP_H_
+
+#include <stdbool.h>
+
+#include "s1ap_structs.h"
+#include "log.h"
+#include "s1ap_ie.h"
+#include "InitiatingMessage.h"
+#include "SuccessfulOutcome.h"
+#include "UnsuccessfulOutcome.h"
+#include "common_proc_info.h"
+
+int
+s1_init_ctx_resp_handler(SuccessfulOutcome_t *msg);
+
+int
+parse_IEs(char *msg, struct proto_IE *proto_ies, unsigned short proc_code);
+
+int convertToInitUeProtoIe(InitiatingMessage_t *msg, struct proto_IE* proto_ies);
+int convertUplinkNasToProtoIe(InitiatingMessage_t *msg, struct proto_IE* proto_ies);
+int convertUeCtxRelReqToProtoIe(InitiatingMessage_t *msg, struct proto_IE* proto_ies);
+int convertInitCtxRspToProtoIe(SuccessfulOutcome_t *msg, struct proto_IE* proto_ies);
+int convertUeCtxRelComplToProtoIe(SuccessfulOutcome_t *msg, struct proto_IE* proto_ies);
+
+int
+s1_setup_handler(InitiatingMessage_t *msg, int enb_fd);
+
+int
+s1_init_ue_handler(struct proto_IE *s1_init_ies, int enb_fd);
+
+void
+handle_s1ap_message(void *message);
+
+int
+init_s1ap();
+
+void
+read_config();
+
+void*
+IAM_handler(void *data);
+
+int s1_esm_resp_handler(struct proto_IE *s1_esm_resp_ies);
+
+int s1_secmode_resp_handler(struct proto_IE *s1_sec_resp_ies);
+
+int s1_auth_resp_handler(struct proto_IE *s1_auth_resp_ies);
+
+int s1_auth_fail_handler(struct proto_IE *s1_auth_resp_ies);
+
+int s1_identity_resp_handler(struct proto_IE *s1_id_resp_ies);
+
+int s1_attach_complete_handler(struct proto_IE *s1_esm_resp_ies);
+
+int
+detach_stage1_handler(struct proto_IE *detach_ies, bool retransmit);
+
+int
+s1_init_ue_service_req_handler(struct proto_IE *service_req_ies, int enb_fd);
+
+int
+tau_request_handler(struct proto_IE *s1_tau_req_ies, int enb_fd);
+
+int
+s1_ctx_release_resp_handler(SuccessfulOutcome_t *msg);
+
+int
+s1_ctx_release_request_handler(InitiatingMessage_t *msg);
+
+int 
+s1_ctx_release_complete_handler(SuccessfulOutcome_t *msg);
+
+int
+detach_accept_from_ue_handler(struct proto_IE *detach_ies, bool retransmit);
+
+int s1ap_mme_encode_ue_context_release_command(
+        struct s1ap_common_req_Q_msg *s1apPDU,
+        uint8_t **buffer, uint32_t *length);
+
+int s1ap_mme_encode_paging_request(
+        struct s1ap_common_req_Q_msg *s1apPDU,
+        uint8_t **buffer, uint32_t *length);
+
+int s1ap_mme_encode_initiating(
+        struct s1ap_common_req_Q_msg *s1apPDU,
+        uint8_t **buffer, uint32_t *length);
+
+int s1ap_mme_encode_initial_context_setup_request(
+        struct s1ap_common_req_Q_msg *s1apPDU,
+        uint8_t **buffer, uint32_t *length);
+
+int
+s1ap_mme_decode_initiating (InitiatingMessage_t *initiating_p, int enb_fd);
+
+int
+s1ap_mme_decode_successfull_outcome (SuccessfulOutcome_t *initiating_p);
+
+int
+s1ap_mme_decode_unsuccessfull_outcome (UnsuccessfulOutcome_t *initiating_p);
+
+int
+copyU16(unsigned char *buffer, uint32_t val);
+
+int
+send_sctp_msg(int connSock, unsigned char *buffer, size_t len, uint16_t stream_no);
+
+void
+buffer_copy(struct Buffer *buffer, void *value, size_t size);
+
+/**
+ * @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.
+ */
+int
+decode_int_val(unsigned char *bytes, short len);
+
+char*
+msg_to_hex_str(const char *msg, int len, char **buffer);
+
+unsigned short
+get_length(char **msg);
+#endif /*__S1AP_H_*/
diff --git a/include/s1ap/s1ap_config.h b/include/s1ap/s1ap_config.h
new file mode 100644
index 0000000..5f18140
--- /dev/null
+++ b/include/s1ap/s1ap_config.h
@@ -0,0 +1,51 @@
+/*
+ * 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.
+ */
+
+#ifndef __S1AP_CONFIG_H_
+#define __S1AP_CONFIG_H_
+
+#include <stdbool.h>
+#include "s1ap_structs.h"
+
+#define MME_NAME_LEN 256
+
+/**
+ * s1ap interface configuration parameters
+ */
+typedef struct s1ap_config
+{
+	unsigned short sctp_port;
+	unsigned short enb_port;
+	unsigned int enb_ip;
+	char  *mme_name;
+	unsigned int s1ap_local_ip;
+	unsigned short mme_group_id;
+	unsigned short max_enbs_cnt;
+	unsigned char rel_cap;
+	unsigned char mme_code;
+	char  sctp_type; /* sctp, udp */
+	struct PLMN mme_plmn_id;
+	struct PLMN target_mme_plmn_id;
+} s1ap_config;
+
+void
+init_parser(char *path);
+
+int
+parse_s1ap_conf();
+
+#endif /*__S1AP_CONFIG_H_*/
diff --git a/include/s1ap/s1ap_ie.h b/include/s1ap/s1ap_ie.h
new file mode 100644
index 0000000..f93a461
--- /dev/null
+++ b/include/s1ap/s1ap_ie.h
@@ -0,0 +1,39 @@
+/*
+ * 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.
+ */
+
+#ifndef __S1AP_IE_H_
+#define __S1AP_IE_H_
+
+#include "s1ap_msg_codes.h"
+#include "s1ap_structs.h"
+
+
+#define S1AP_INITUE_IEs 5
+
+/*** IE parsing functions ***/
+typedef void * (ie_parser_function)(char *msg, int len);
+
+//ie_parser_function ie_parser[32];//={};
+
+void* ie_parse_global_enb_id(char *msg, int len);
+void* ie_parse_enb_name(char *msg, int len);
+void* ie_parse_supported_TAs(char *msg, int len);
+void* ie_parse_pagins_DRX(char *msg, int len);
+
+/*** IE parsing functions end***/
+
+#endif /*S1AP_IE_H_*/
diff --git a/include/s1ap/s1ap_msg_codes.h b/include/s1ap/s1ap_msg_codes.h
new file mode 100644
index 0000000..67ca2c9
--- /dev/null
+++ b/include/s1ap/s1ap_msg_codes.h
@@ -0,0 +1,67 @@
+/*
+ * 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.
+ */
+
+#ifndef __S1AP_MSG_CODES_H_
+#define __S1AP_MSG_CODES_H_
+
+/****S1AP Procedude codes****/
+#define S1AP_SETUP_REQUEST_CODE 17
+#define S1AP_INITIAL_UE_MSG_CODE 12
+#define S1AP_UE_CONTEXT_RELEASE_REQUEST_CODE 18
+#define S1AP_UE_CONTEXT_RELEASE_CODE 23
+/*uplink NAS Transport*/
+#define S1AP_UL_NAS_TX_MSG_CODE 13
+#define S1AP_INITIAL_CTX_RESP_CODE 9
+
+/*S1AP Protocol IE types*/
+#define S1AP_IE_GLOBAL_ENB_ID 59
+#define S1AP_IE_ENB_NAME 60
+#define S1AP_IE_SUPPORTED_TAS 64
+#define S1AP_IE_DEF_PAGING_DRX 137
+#define S1AP_IE_MMENAME 61
+#define S1AP_IE_SERVED_GUMMEIES 105
+#define S1AP_IE_REL_MME_CAPACITY 87
+
+#define S1AP_IE_MME_UE_ID 0
+#define S1AP_IE_CAUSE 2
+#define S1AP_IE_ENB_UE_ID 8
+#define S1AP_IE_NAS_PDU  26
+#define S1AP_IE_TAI  67
+#define S1AP_IE_UTRAN_CGI  100
+#define S1AP_IE_S_TMSI  96
+#define S1AP_IE_RRC_EST_CAUSE  134
+#define S1AP_ERAB_SETUP_CTX_SUR 51
+
+/*NAS message type codes*/
+#define NAS_ESM_RESP 0xda
+#define NAS_AUTH_RESP 0x53
+#define NAS_AUTH_REJECT 0x54
+#define NAS_AUTH_FAILURE 0x5c
+#define NAS_IDENTITY_REQUEST 0x55
+#define NAS_IDENTITY_RESPONSE 0x56
+#define NAS_SEC_MODE_COMPLETE 0x5e
+#define NAS_SEC_MODE_REJECT  0x5f
+#define NAS_ATTACH_REQUEST 0x41
+#define NAS_ATTACH_COMPLETE 0x43
+#define NAS_ATTACH_REJECT 0x44
+#define NAS_TAU_REQUEST    0x48
+#define NAS_TAU_COMPLETE   0x4
+#define NAS_DETACH_REQUEST 0x45
+#define NAS_DETACH_ACCEPT 0x46
+#define NAS_SERVICE_REQUEST 0x4D
+
+#endif /*__S1AP_MSG_CODES*/
diff --git a/include/s1ap/sctp_conn.h b/include/s1ap/sctp_conn.h
new file mode 100644
index 0000000..be9a9e0
--- /dev/null
+++ b/include/s1ap/sctp_conn.h
@@ -0,0 +1,40 @@
+/*
+ * 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.
+ */
+
+#ifndef __S1AP_SCTP_CONN_H_
+#define __S1AP_SCTP_CONN_H_
+
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <netinet/sctp.h>
+
+#define MAX_STREAM 5
+#define MAX_PENDING_CONN 5
+#define ENB_PORT 62324
+
+int create_sctp_socket(unsigned int remote_ip, unsigned short port);
+
+int accept_sctp_socket(int sockfd);
+
+int recv_sctp_msg(int sockfd, unsigned char *buf, size_t len);
+
+int send_sctp_msg(int connSock, unsigned char *buffer, size_t len, uint16_t stream_no);
+
+int close_sctp_socket(int sockfd);
+
+#endif /*__S1AP_SCTP_CONN_H*/
diff --git a/include/s6a/s6a.h b/include/s6a/s6a.h
new file mode 100644
index 0000000..e4aa383
--- /dev/null
+++ b/include/s6a/s6a.h
@@ -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.
+ */
+
+#ifndef __S6A_H_
+#define __S6A_H_
+
+#include <freeDiameter/freeDiameter-host.h>
+#include <freeDiameter/libfdproto.h>
+#include <freeDiameter/libfdcore.h>
+
+#include "log.h"
+#include "hss_message.h"
+
+#define S6A_FD_CONF "conf/s6a_fd.conf"
+#define HSS_RESP_THREADPOOL_SIZE 10
+#define STR_IMSI_LEN 16
+#define SESS_ID_LEN 128
+
+/**
+ * brief: Structure to store s6a freediameter session information
+ */
+struct s6a_sess_info {
+	unsigned char imsi[8];
+	char sess_id[SESS_ID_LEN];
+	int sess_id_len;
+};
+
+/**
+ * @brief Handle HSS reponse message
+ * @param[in] message buffer
+ * @return void
+ */
+void
+hss_resp_handler(void *message);
+
+/**
+ * @brief Handler thread for AIR/ULR request coming from mme-app
+ * This function sends both AIR and ULR
+ * @param[in] data- message buffer
+ * @return void*
+ */
+void*
+AIR_handler(void *data);
+
+/**
+ * @brief Handler thread for detach request coming from mme-app
+ * @param[in] data- message buffer
+ * @return void *
+ */
+void*
+detach_handler(void *data);
+
+/*Handler for AIA coming from built in perf HS*/
+void
+handle_perf_hss_aia(int ue_idx, struct hss_aia_msg *aia);
+
+/*Handler for ULA coming from built in perf HS*/
+void
+handle_perf_hss_ula(int ue_idx, struct hss_ula_msg *ula);
+
+/*Handler for AIA coming from built in perf HS*/
+void
+handle_perf_hss_purge_resp(int ue_idx);
+
+
+//NI Detach
+/*Handler for CLR coming from built in perf HSS*/
+void
+handle_perf_hss_clr(int ue_idx, struct hss_clr_msg *clr);
+
+/**
+ * @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);
+
+#endif /*S6A*/
diff --git a/include/s6a/s6a_config.h b/include/s6a/s6a_config.h
new file mode 100644
index 0000000..aaed84d
--- /dev/null
+++ b/include/s6a/s6a_config.h
@@ -0,0 +1,78 @@
+/*
+ * 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.
+ */
+
+#ifndef __S1AP_CONFIG_H_
+#define __S1AP_CONFIG_H_
+
+#include <stdbool.h>
+#include "s1ap_structs.h"
+
+#define HSS_HOST_NAME_LEN 256
+#define HSS_REALM_LEN 256
+#define SS_IPC_ENDPT_FILE_LEN 256
+
+/**
+ * @brief: Whether HSS to be contacted is freediameter based real HSS or the
+ * dummy designed for performance testing
+ */
+enum  e_HSS_HOST_TYPE {
+	HSS_PERF,
+	HSS_FD,
+};
+
+/**
+ * @brief What type of RPC mechanism to use for communication with dummy HSS
+ */
+enum  e_HSS_RPC {
+	HSS_IPC,
+	HSS_RPC,
+};
+
+/**
+ * @brief HSS configuration read from hss json file
+ */
+typedef struct s6a_config {
+	/**Defines whether freediameter based hss to be used or inbuilt hss to be
+	 * used.
+	 */
+	enum  e_HSS_HOST_TYPE hss_type;
+
+	/*Applicable in case of in built HSS. Defines which type of communication
+	 * to be used. This is for future provision to support RPC
+	 */
+	enum  e_HSS_RPC hss_rpc;
+	char  *hss_ipc_endpt;
+	char  *hss_host_name;
+	char  *realm;
+} s6a_config;
+
+/**
+ * @brief Initialize json parser for givn file
+ * @param path to the hss json file
+ */
+void
+init_parser(char *path);
+
+/**
+ * @brief Parser hss json file and store parameters in the structure
+ * @params none
+ * @return int as success/fail
+ */
+int
+parse_s6a_conf();
+
+#endif /*__S1AP_CONFIG_H_*/
diff --git a/include/s6a/s6a_fd.h b/include/s6a/s6a_fd.h
new file mode 100644
index 0000000..2bc716a
--- /dev/null
+++ b/include/s6a/s6a_fd.h
@@ -0,0 +1,333 @@
+/*
+ * 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.
+ */
+
+#ifndef __S6A_FD_H__
+#define __S6A_FD_H__
+
+#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 "err_codes.h"
+#include "s6a.h"
+
+/*Update location request(ULR) flag bitfields*/
+/* Single-Registration-Indication  -------1*/
+#define ULR_FLAG_SINGLE_REG_IND (1)
+/*S6a/S6d-Indicator:               ------1-*/
+#define ULR_FLAG_S6AS6D_IND (1<<1)
+/*Skip-Subscriber-Data:            -----1--*/
+#define ULR_FLAGS_SKIP_SUB_DATA (1<<2)
+/*GPRS-Subscription-Data-Indicator:----1---*/
+#define ULR_FLAGS_GPRS_SUBS_DATA_IBND (1<<3)
+/*Node-Type-Indicator:             ---1----*/
+#define ULR_FLAGS_NODE_TYPE_IIND (1<<4)
+/*Initial-Attach-Indicator:        --1-----*/
+#define ULR_FLAG_INIT_ATCH_IND (1<<5)
+/*PS-LCS-Not-Supported-By-UE:      -1------*/
+#define ULR_FLAG_PS_LCS_NOT_SUPPORTED_BY_UE (1<<6)
+/*SMS-Only-Indication:             1-------*/
+#define ULR_FLAG_SMS_ONLY_IND (1<<7)
+
+#define S6A_RAT_EUTRAN 1004
+
+#define FD_DICT_SEARCH(dict, cond, id, obj) \
+	CHECK_FCT_DO(fd_dict_search(fd_g_config->cnf_dict, dict, cond,\
+		(void*)id, &obj, ENOENT),\
+		return S6A_FD_DICTSRCH_FAILED)
+
+/**
+ * @brief Freediameter result
+ */
+struct fd_result {
+	bool present;
+	unsigned int vendor_id;
+	unsigned int result_code;
+};
+
+/**
+ * @brief Freediameter disctionary objects user in s6a transactions
+ */
+struct fd_dict_objects {
+	/*s6a and app id*/
+	struct dict_object *vendor_id;
+	struct dict_object *s6a_app;
+
+	/*Message types*/
+	struct dict_object *AIR; /*Authentication-Information-Request*/
+	struct dict_object *AIA; /*Authentication-information-Answer*/
+	struct dict_object *ULR; /*Update-Location-Request*/
+	struct dict_object *ULA; /*Update-Location-Answer*/
+	struct dict_object *PUR; /*Purge-Request*/
+	struct dict_object *PUA; /*Purge-Answer*/
+	//NI Detach
+	struct dict_object *CLR; /*Cancel-Location-Request*/
+	struct dict_object *CLA; /*Cancel-Location-Answer*/
+	//NI Detach
+	
+	/*common s6a requst header*/
+	struct dict_object *auth_app_id;
+	struct dict_object *sess_id;
+	struct dict_object *org_host;	//NI Detach
+	struct dict_object *org_realm;	//NI Detach
+	struct dict_object *dest_host;
+	struct dict_object *dest_realm;
+	struct dict_object *auth_sess_state;
+	struct dict_object *res_code;
+	struct dict_object *exp_res;
+	struct dict_object *user_name;
+
+	/*AIR elements*/
+	struct dict_object *visited_PLMN_id;
+	struct dict_object *req_EUTRAN_auth_info;
+	struct dict_object *no_of_req_vectors;
+	struct dict_object *immediate_resp_pref;
+
+	/*AIA elements*/
+	struct dict_object *auth_info;
+	struct dict_object *E_UTRAN_vector;
+	struct dict_object *RAND;
+	struct dict_object *XRES;
+	struct dict_object *AUTN;
+	struct dict_object *KASME;
+
+	/*ULR elements*/
+	struct dict_object *RAT_type;
+	struct dict_object *ULR_flags;
+
+	/*ULA elements*/
+	struct dict_object *ULA_flags;
+	struct dict_object *subscription_data;
+	struct dict_object *subscriber_status;
+	struct dict_object *MSISDN;
+	struct dict_object *net_access_mode;
+	struct dict_object *access_restriction_data;
+	struct dict_object *AMBR;
+	struct dict_object *max_req_bandwidth_UL;
+	struct dict_object *max_req_bandwidth_DL;
+	struct dict_object *APN_config_profile;
+	struct dict_object *ctx_id;
+	struct dict_object *additional_ctx_id;
+	struct dict_object *all_APN_configs_included_ind;
+	struct dict_object *APN_config;
+	struct dict_object *PDN_type;
+	struct dict_object *PDN_GW_alloc_type;
+	struct dict_object *specific_APN_info;
+	struct dict_object *non_IP_PDN_type_ind;
+	struct dict_object *non_IP_data_delivery_mech;
+	struct dict_object *SCEF_ID;
+	struct dict_object *priority_Level;
+	struct dict_object *location_area_id;
+	struct dict_object *tracking_area_id;
+	struct dict_object *subsc_periodic_RAU_TAU_tmr;
+
+	/*PUR elements*/
+	struct dict_object *PUR_flags;
+	struct dict_object *reg_subs_zone_code;
+
+	//NI Detach
+	/*CLR elements*/
+	struct dict_object *cancellation_type;
+};
+
+/**
+ * @brief Freediameter dictionary data storage
+ */
+struct fd_dict_data {
+	/* S6A AVP data */
+	struct dict_application_data app_s6a_data;
+	struct dict_vendor_data vendor_data;
+
+	/*Common s6a elements*/
+	struct dict_avp_data res_code;
+	struct dict_avp_data exp_res;
+	struct dict_avp_data exp_res_code;
+	struct dict_avp_data vendor_specific_app_id;
+	struct dict_avp_data auth_app_id;
+	struct dict_avp_data acct_app_id;
+	struct dict_avp_data vendor_id;
+	struct dict_avp_data sess_id;
+	struct dict_avp_data auth_sess_state;
+	struct dict_avp_data org_host;
+	struct dict_avp_data org_realm;
+	struct dict_avp_data dest_host;
+	struct dict_avp_data dest_realm;
+	struct dict_avp_data user_name;
+	struct dict_avp_data visited_PLMN_id;
+	struct dict_avp_data req_EUTRAN_auth_info;
+	struct dict_avp_data no_of_req_vectors;
+	struct dict_avp_data immediate_resp_pref;
+
+	/*AIA data*/
+	struct dict_avp_data auth_info;
+	struct dict_avp_data E_UTRAN_vector;
+	struct dict_avp_data RAND;
+	struct dict_avp_data XRES;
+	struct dict_avp_data AUTN;
+	struct dict_avp_data KASME;
+
+	/*ULR data*/
+	struct dict_avp_data RAT_type;
+	struct dict_avp_data ULR_flags;
+
+	/*ULA data*/
+	struct dict_avp_data ULA_flags;
+	struct dict_avp_data subscription_data;
+	struct dict_avp_data subscriber_status;
+	struct dict_avp_data MSISDN;
+	struct dict_avp_data net_access_mode;
+	struct dict_avp_data access_restriction_data;
+	struct dict_avp_data AMBR;
+	struct dict_avp_data max_req_bandwidth_UL;
+	struct dict_avp_data max_req_bandwidth_DL;
+	struct dict_avp_data APN_config_profile;
+	struct dict_avp_data ctx_id;
+	struct dict_avp_data additional_ctx_id;
+	struct dict_avp_data all_APN_configs_included_ind;
+	struct dict_avp_data APN_config;
+	struct dict_avp_data PDN_type;
+	struct dict_avp_data PDN_GW_alloc_type;
+	struct dict_avp_data specific_APN_info;
+	struct dict_avp_data non_IP_PDN_type_ind;
+	struct dict_avp_data non_IP_data_delivery_mech;
+	struct dict_avp_data SCEF_ID;
+	struct dict_avp_data priority_Level;
+	struct dict_avp_data location_area_id;
+	struct dict_avp_data tracking_area_id;
+	struct dict_avp_data subsc_periodic_RAU_TAU_tmr;
+
+	/*PUR flags*/
+	struct dict_avp_data PUR_flags;
+	struct dict_avp_data reg_subs_zone_code;
+
+	//NI Detach
+	/*CLR Data*/
+	struct dict_avp_data cancellation_type;
+};
+
+/**
+ * @brief Initialize freediameter parser, callbacks, dictionary etc.
+ * @params none
+ * @return int as success/fail
+ */
+int
+s6a_fd_init();
+
+/**
+ * @brief Initialize freediameter dictionary
+ * @param none
+ * @return int as success/fail
+ */
+int
+s6a_fd_objs_init();
+
+/**
+ * @brief Initialize freediameter dictionary data objects
+ * @param none
+ * @return int as success/fail
+ */
+int
+s6a_fd_data_init();
+
+/**
+ * @brief Initialize freediameter API callbacks for response handling
+ * @param none
+ * @return int as success/fail
+ */
+int
+s6a_fd_cb_reg();
+
+/**
+ * @brief extract ue index from session id of freediameter
+ * @param[in] sid - session id
+ * @param[in] sidlen - Session Id length
+ * @return UE index extracted out of session id
+ */
+int
+get_ue_idx_from_fd_resp(unsigned char *sid, int sidlen);
+
+/**
+ * @brief Cression session id, append ue index to session id
+ * @param[in, out] s6a_sess - session information
+ * @param[in] ue_idx to append to session id
+ * @return int as success/fail
+ */
+short
+create_fd_sess_id(struct s6a_sess_info *s6a_sess, int ue_idx);
+
+int
+aia_resp_callback(struct msg **msg, struct avp *avp, struct session *sess,
+		void *data, enum disp_action *act);
+
+int
+ula_resp_callback(struct msg **msg, struct avp *avp, struct session *sess,
+		void *data, enum disp_action *act);
+
+//NI Detach
+int
+clr_resp_callback(struct msg **msg, struct avp *avp, struct session *sess,
+		void *data, enum disp_action *act);
+
+
+#if 0
+int
+purge_resp_callback(struct msg **msg, struct avp *avp, struct session *sess,
+		void *data, enum disp_action *act);
+#endif
+
+/**
+ * @brief Dumo freediameter message on console
+ * @param msg - Freediameter message structure
+ * @return void
+ */
+void
+dump_fd_msg(struct msg *msg);
+
+/**
+ * brief add AVl object to freediameter message
+ * @param[in] avp value to add
+ * @param[in] ditionary object for reference
+ * @param[out] frediameter message where avp is added
+ * @return int as success/fail
+ */
+int
+add_fd_msg(union avp_value *val, struct dict_object * obj,
+struct msg **msg_buf);
+
+void
+handle_perf_hss_aia(int ue_idx, struct hss_aia_msg *aia);
+
+void
+handle_perf_hss_ula(int ue_idx, struct hss_ula_msg *ula);
+
+void
+handle_perf_hss_purge_resp(int ue_idx);
+
+//NI Detach
+void 
+handle_perf_hss_clr(int ue_idx, struct hss_clr_msg *clr);
+
+short
+parse_fd_result(struct avp *avp, struct fd_result *res);
+
+#endif /* __S6A_FD_H__ */
diff --git a/include/stateMachineFwk/actionTable.h b/include/stateMachineFwk/actionTable.h
new file mode 100644
index 0000000..f3b9794
--- /dev/null
+++ b/include/stateMachineFwk/actionTable.h
@@ -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 <string>
+#include <deque>
+#include "smTypes.h"
+
+#ifndef ACTIONTABLE_H_
+#define ACTIONTABLE_H_
+
+namespace SM
+{
+
+	class ControlBlock;
+	class State;
+
+	using namespace std;
+
+	class ActionTable
+	{
+   	public:
+		ActionTable();
+		virtual ~ActionTable();
+
+		virtual void display();
+
+		ActStatus executeActions(ControlBlock& cb);
+		void addAction(ActionPointer act);
+		void setNextState(State*st);
+	private:
+     		deque<ActionPointer> actionsQ;
+        	State* nextStatep;
+	};
+}
+#endif /* ACTIONTABLE_H_ */
diff --git a/include/stateMachineFwk/controlBlock.h b/include/stateMachineFwk/controlBlock.h
new file mode 100644
index 0000000..7591a1a
--- /dev/null
+++ b/include/stateMachineFwk/controlBlock.h
@@ -0,0 +1,124 @@
+/*
+ * 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 CONTROLBLOCK_H_
+#define CONTROLBLOCK_H_
+
+#include <mutex>
+#include <queue>
+#include <deque>
+#include <stdint.h>
+#include <time.h>
+#include "permDataBlock.h"
+#include <smTypes.h>
+#include "tempDataBlock.h"
+
+class Event;
+class State;
+
+using namespace std;
+
+namespace SM
+{
+	typedef struct debugEventInfo
+	{
+        	Event_e event;
+	        State_e state;
+        	time_t evt_time;
+
+        	debugEventInfo(Event_e evt, State_e st, time_t t)
+        	{
+        		event = evt;
+        		state = st;
+        		evt_time = t;
+        	}
+
+	}debugEventInfo;
+
+	class Event;
+	class State;
+	class ControlBlock
+	{
+   	public:
+			static const unsigned short MAX_FAST_BLOCK_IDX = 5;
+			static uint32_t controlBlockArrayIdx;
+
+      		ControlBlock();
+      		virtual ~ControlBlock();
+
+      		void reset();
+
+      		uint32_t getCBIndex();
+
+      		void addEventToProcQ(Event &event);
+	      	bool getCurrentEvent(Event &evt);
+
+	      	State* getCurrentState();
+      		void setNextState(State* state);
+
+      		PermDataBlock* getFastAccessBlock(unsigned short idx) const;
+      		void setFastAccessBlock(PermDataBlock* pdb_p, unsigned short idx);
+
+      		PermDataBlock* getPermDataBlock() const;
+      		void setPermDataBlock(PermDataBlock* pdb_p);
+
+      		TempDataBlock* getTempDataBlock() const;
+      		void setTempDataBlock(TempDataBlock* tdb_p); 
+      		void setCurrentTempDataBlock(TempDataBlock* tdb_p);
+
+      		void addDebugInfo(debugEventInfo& eventInfo);
+      		inline deque<debugEventInfo> getDebugInfoQueue()const
+			{
+      			return debugEventInfoQ;
+			}
+
+      		void* getMsgData()
+      		{
+      			return data_p;
+      		}
+
+      		void setMsgData(void* ptr)
+      		{
+      			data_p = ptr;
+      		}
+
+      		void setControlBlockState(ControlBlockState state);
+      		ControlBlockState getControlBlockState();
+
+            bool isInProcQueue();
+            void setProcQueueFlag(bool flag);
+
+      		virtual void display();
+
+   	private:
+		std::mutex mutex_m;
+		const uint32_t cbIndex_m;
+		ControlBlockState cbState_m;
+
+		// deallocated once the event is processed
+		void* data_p;
+
+      		PermDataBlock* pdb_mp;
+      		PermDataBlock* fadb_mpa[MAX_FAST_BLOCK_IDX];
+      		TempDataBlock* tdb_mp;
+
+      		queue<Event> eventQ;
+		
+	    	deque<debugEventInfo> debugEventInfoQ;
+		bool inProcQueue_m;
+	};
+}
+#endif /* CONTROLBLOCK_H_ */
diff --git a/include/stateMachineFwk/event.h b/include/stateMachineFwk/event.h
new file mode 100644
index 0000000..7ad9423
--- /dev/null
+++ b/include/stateMachineFwk/event.h
@@ -0,0 +1,51 @@
+/*
+ * 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 EVENT_H_
+#define EVENT_H_
+
+#include <string>
+#include <map>
+
+#include "smEnumTypes.h"
+
+using namespace std;
+
+namespace SM
+{
+	class Event
+	{
+   	public:
+		Event();
+      		Event(Event_e evtID, void* eventData);
+      		virtual ~Event();
+
+      		inline Event_e getEventId()const
+      		{
+      			return eventID;
+      		}
+
+      		void* getEventData() const;
+
+      		virtual void display();
+ 
+   	private:
+	      	Event_e eventID;
+	      	void * eventData_p;
+	};
+}
+
+#endif /* EVENT_H_ */
diff --git a/include/stateMachineFwk/permDataBlock.h b/include/stateMachineFwk/permDataBlock.h
new file mode 100644
index 0000000..0d35bd8
--- /dev/null
+++ b/include/stateMachineFwk/permDataBlock.h
@@ -0,0 +1,35 @@
+/*
+ * 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 PERMDATABLOCK_H_
+#define PERMDATABLOCK_H_
+
+namespace SM
+{
+class PermDataBlock
+{
+   public:
+      PermDataBlock();
+      virtual ~PermDataBlock();
+      virtual void display();
+      
+   private:
+      // Add permanant data fields here
+      unsigned int contextID;
+};
+}
+
+#endif /* PERMDATABLOCK_H_ */
diff --git a/include/stateMachineFwk/procedureQueue.h b/include/stateMachineFwk/procedureQueue.h
new file mode 100644
index 0000000..efffaf5
--- /dev/null
+++ b/include/stateMachineFwk/procedureQueue.h
@@ -0,0 +1,46 @@
+/*
+ * 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 PROCEDUREQUEUE_H_
+#define PROCEDUREQUEUE_H_
+
+#include <queue>
+#include <mutex>
+#include <semaphore.h>
+
+using namespace std;
+
+namespace SM
+{
+
+class ControlBlock;
+
+class ProcedureQueue
+{
+   public:
+      ProcedureQueue();
+      ~ProcedureQueue();
+
+      ControlBlock* pop();
+      bool push(ControlBlock* cb);
+
+   private:
+      queue <ControlBlock*> cbQ;
+      std::mutex mutex_m;
+      sem_t pop_semaphore;
+};
+}
+#endif /* PROCEDUREQUEUE_H_ */
diff --git a/include/stateMachineFwk/smEnumTypes.h b/include/stateMachineFwk/smEnumTypes.h
new file mode 100644
index 0000000..2b8a456
--- /dev/null
+++ b/include/stateMachineFwk/smEnumTypes.h
@@ -0,0 +1,282 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 SM_ENUMS_H
+#define SM_ENUMS_H
+/**************************************
+ * 
+ * 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/enum.tt>
+ **************************************/
+ 
+enum State_e
+{ 
+    attach_start, 
+    attach_wf_aia, 
+    attach_wf_att_cmp, 
+    attach_wf_auth_resp, 
+    attach_wf_auth_resp_validate, 
+    attach_wf_cs_resp, 
+    attach_wf_esm_info_check, 
+    attach_wf_esm_info_resp, 
+    attach_wf_identity_response, 
+    attach_wf_imsi_validate_action, 
+    attach_wf_init_ctxt_resp, 
+    attach_wf_init_ctxt_resp_att_cmp, 
+    attach_wf_mb_resp, 
+    attach_wf_sec_cmp, 
+    attach_wf_ula, 
+    default_mme_state, 
+    detach_start, 
+    detach_wf_del_session_resp, 
+    ni_detach_start, 
+    ni_detach_wf_del_sess_resp, 
+    ni_detach_wf_det_accpt_del_sess_resp, 
+    ni_detach_wf_detach_accept, 
+    ni_detach_wf_s1_rel_comp, 
+    paging_start, 
+    paging_wf_service_req, 
+    s1_release_start, 
+    s1_release_wf_release_access_bearer_resp, 
+    s1_release_wf_ue_ctxt_release_comp, 
+    service_request_start, 
+    service_request_wf_auth_and_sec_check_cmp, 
+    service_request_wf_init_ctxt_resp, 
+    service_request_wf_mb_resp, 
+    tau_start,
+    END_STATE
+};
+
+static constexpr const char* States[] =
+{
+    "attach_start",
+    "attach_wf_aia",
+    "attach_wf_att_cmp",
+    "attach_wf_auth_resp",
+    "attach_wf_auth_resp_validate",
+    "attach_wf_cs_resp",
+    "attach_wf_esm_info_check",
+    "attach_wf_esm_info_resp",
+    "attach_wf_identity_response",
+    "attach_wf_imsi_validate_action",
+    "attach_wf_init_ctxt_resp",
+    "attach_wf_init_ctxt_resp_att_cmp",
+    "attach_wf_mb_resp",
+    "attach_wf_sec_cmp",
+    "attach_wf_ula",
+    "default_mme_state",
+    "detach_start",
+    "detach_wf_del_session_resp",
+    "ni_detach_start",
+    "ni_detach_wf_del_sess_resp",
+    "ni_detach_wf_det_accpt_del_sess_resp",
+    "ni_detach_wf_detach_accept",
+    "ni_detach_wf_s1_rel_comp",
+    "paging_start",
+    "paging_wf_service_req",
+    "s1_release_start",
+    "s1_release_wf_release_access_bearer_resp",
+    "s1_release_wf_ue_ctxt_release_comp",
+    "service_request_start",
+    "service_request_wf_auth_and_sec_check_cmp",
+    "service_request_wf_init_ctxt_resp",
+    "service_request_wf_mb_resp",
+    "tau_start",
+    "END_STATE"
+};
+
+enum Event_e
+{
+    AIA_FROM_HSS,
+    ATT_CMP_FROM_UE,
+    ATTACH_REQ_FROM_UE,
+    AUTH_AND_SEC_CHECK_COMPLETE,
+    AUTH_RESP_FAILURE,
+    AUTH_RESP_FROM_UE,
+    AUTH_RESP_SUCCESS,
+    AUTH_RESP_SYNC_FAILURE,
+    CLR_FROM_HSS,
+    CS_RESP_FROM_SGW,
+    DDN_FROM_SGW,
+    DEL_SESSION_RESP_FROM_SGW,
+    DETACH_ACCEPT_FROM_UE,
+    DETACH_REQ_FROM_UE,
+    ESM_INFO_NOT_REQUIRED,
+    ESM_INFO_REQUIRED,
+    ESM_INFO_RESP_FROM_UE,
+    IDENTITY_RESPONSE_FROM_UE,
+    IMSI_VALIDATION_FAILURE,
+    IMSI_VALIDATION_SUCCESS,
+    INIT_CTXT_RESP_FROM_UE,
+    MB_RESP_FROM_SGW,
+    REL_AB_RESP_FROM_SGW,
+    S1_REL_REQ_FROM_UE,
+    SEC_MODE_RESP_FROM_UE,
+    SERVICE_REQUEST_FROM_UE,
+    TAU_REQUEST_FROM_UE,
+    UE_CTXT_REL_COMP_FROM_ENB,
+    ULA_FROM_HSS,
+    VALIDATE_IMSI,
+    END_EVENT
+};
+
+static constexpr const char* Events[] =
+{
+    "AIA_FROM_HSS",
+    "ATT_CMP_FROM_UE",
+    "ATTACH_REQ_FROM_UE",
+    "AUTH_AND_SEC_CHECK_COMPLETE",
+    "AUTH_RESP_FAILURE",
+    "AUTH_RESP_FROM_UE",
+    "AUTH_RESP_SUCCESS",
+    "AUTH_RESP_SYNC_FAILURE",
+    "CLR_FROM_HSS",
+    "CS_RESP_FROM_SGW",
+    "DDN_FROM_SGW",
+    "DEL_SESSION_RESP_FROM_SGW",
+    "DETACH_ACCEPT_FROM_UE",
+    "DETACH_REQ_FROM_UE",
+    "ESM_INFO_NOT_REQUIRED",
+    "ESM_INFO_REQUIRED",
+    "ESM_INFO_RESP_FROM_UE",
+    "IDENTITY_RESPONSE_FROM_UE",
+    "IMSI_VALIDATION_FAILURE",
+    "IMSI_VALIDATION_SUCCESS",
+    "INIT_CTXT_RESP_FROM_UE",
+    "MB_RESP_FROM_SGW",
+    "REL_AB_RESP_FROM_SGW",
+    "S1_REL_REQ_FROM_UE",
+    "SEC_MODE_RESP_FROM_UE",
+    "SERVICE_REQUEST_FROM_UE",
+    "TAU_REQUEST_FROM_UE",
+    "UE_CTXT_REL_COMP_FROM_ENB",
+    "ULA_FROM_HSS",
+    "VALIDATE_IMSI",
+    "END_EVENT"
+};
+
+enum Action_e
+{
+    ATTACH_DONE,
+    AUTH_REQ_TO_UE,
+    AUTH_RESPONSE_VALIDATE,
+    CHECK_ESM_INFO_REQ_REQUIRED,
+    CS_REQ_TO_SGW,
+    DEFAULT_ATTACH_REQ_HANDLER,
+    DEFAULT_CANCEL_LOC_REQ_HANDLER,
+    DEFAULT_DDN_HANDLER,
+    DEFAULT_DETACH_REQ_HANDLER,
+    DEFAULT_S1_RELEASE_REQ_HANDLER,
+    DEFAULT_SERVICE_REQ_HANDLER,
+    DEFAULT_TAU_REQ_HANDLER,
+    DEL_SESSION_REQ,
+    DETACH_ACCEPT_TO_UE,
+    NI_DETACH_REQ_TO_UE,
+    PERFORM_AUTH_AND_SEC_CHECK,
+    PROCESS_AIA,
+    PROCESS_ATTACH_CMP_FROM_UE,
+    PROCESS_CS_RESP,
+    PROCESS_DEL_SESSION_RESP,
+    PROCESS_DETACH_ACCEPT_FROM_UE,
+    PROCESS_ESM_INFO_RESP,
+    PROCESS_IDENTITY_RESPONSE,
+    PROCESS_INIT_CTXT_RESP,
+    PROCESS_INIT_CTXT_RESP_SVC_REQ,
+    PROCESS_MB_RESP,
+    PROCESS_MB_RESP_SVC_REQ,
+    PROCESS_REL_AB_RESP_FROM_SGW,
+    PROCESS_SEC_MODE_RESP,
+    PROCESS_SERVICE_REQUEST,
+    PROCESS_UE_CTXT_REL_COMP,
+    PROCESS_UE_CTXT_REL_COMP_FOR_DETACH,
+    PROCESS_ULA,
+    SEC_MODE_CMD_TO_UE,
+    SEND_AIR_TO_HSS,
+    SEND_AUTH_REJECT,
+    SEND_DDN_ACK_TO_SGW,
+    SEND_ESM_INFO_REQ_TO_UE,
+    SEND_IDENTITY_REQUEST_TO_UE,
+    SEND_INIT_CTXT_REQ_TO_UE,
+    SEND_INIT_CTXT_REQ_TO_UE_SVC_REQ,
+    SEND_MB_REQ_TO_SGW,
+    SEND_MB_REQ_TO_SGW_SVC_REQ,
+    SEND_PAGING_REQ_TO_UE,
+    SEND_REL_AB_REQ_TO_SGW,
+    SEND_S1_REL_CMD_TO_UE,
+    SEND_S1_REL_CMD_TO_UE_FOR_DETACH,
+    SEND_TAU_RESPONSE_TO_UE,
+    SEND_ULR_TO_HSS,
+    VALIDATE_IMSI_IN_UE_CONTEXT,
+    END_ACTION
+};
+
+static constexpr const char* Actions[] =
+{
+    "ATTACH_DONE",
+    "AUTH_REQ_TO_UE",
+    "AUTH_RESPONSE_VALIDATE",
+    "CHECK_ESM_INFO_REQ_REQUIRED",
+    "CS_REQ_TO_SGW",
+    "DEFAULT_ATTACH_REQ_HANDLER",
+    "DEFAULT_CANCEL_LOC_REQ_HANDLER",
+    "DEFAULT_DDN_HANDLER",
+    "DEFAULT_DETACH_REQ_HANDLER",
+    "DEFAULT_S1_RELEASE_REQ_HANDLER",
+    "DEFAULT_SERVICE_REQ_HANDLER",
+    "DEFAULT_TAU_REQ_HANDLER",
+    "DEL_SESSION_REQ",
+    "DETACH_ACCEPT_TO_UE",
+    "NI_DETACH_REQ_TO_UE",
+    "PERFORM_AUTH_AND_SEC_CHECK",
+    "PROCESS_AIA",
+    "PROCESS_ATTACH_CMP_FROM_UE",
+    "PROCESS_CS_RESP",
+    "PROCESS_DEL_SESSION_RESP",
+    "PROCESS_DETACH_ACCEPT_FROM_UE",
+    "PROCESS_ESM_INFO_RESP",
+    "PROCESS_IDENTITY_RESPONSE",
+    "PROCESS_INIT_CTXT_RESP",
+    "PROCESS_INIT_CTXT_RESP_SVC_REQ",
+    "PROCESS_MB_RESP",
+    "PROCESS_MB_RESP_SVC_REQ",
+    "PROCESS_REL_AB_RESP_FROM_SGW",
+    "PROCESS_SEC_MODE_RESP",
+    "PROCESS_SERVICE_REQUEST",
+    "PROCESS_UE_CTXT_REL_COMP",
+    "PROCESS_UE_CTXT_REL_COMP_FOR_DETACH",
+    "PROCESS_ULA",
+    "SEC_MODE_CMD_TO_UE",
+    "SEND_AIR_TO_HSS",
+    "SEND_AUTH_REJECT",
+    "SEND_DDN_ACK_TO_SGW",
+    "SEND_ESM_INFO_REQ_TO_UE",
+    "SEND_IDENTITY_REQUEST_TO_UE",
+    "SEND_INIT_CTXT_REQ_TO_UE",
+    "SEND_INIT_CTXT_REQ_TO_UE_SVC_REQ",
+    "SEND_MB_REQ_TO_SGW",
+    "SEND_MB_REQ_TO_SGW_SVC_REQ",
+    "SEND_PAGING_REQ_TO_UE",
+    "SEND_REL_AB_REQ_TO_SGW",
+    "SEND_S1_REL_CMD_TO_UE",
+    "SEND_S1_REL_CMD_TO_UE_FOR_DETACH",
+    "SEND_TAU_RESPONSE_TO_UE",
+    "SEND_ULR_TO_HSS",
+    "VALIDATE_IMSI_IN_UE_CONTEXT",
+    "END_ACTION"
+};
+
+#endif
\ No newline at end of file
diff --git a/include/stateMachineFwk/smTypes.h b/include/stateMachineFwk/smTypes.h
new file mode 100644
index 0000000..cb3c31f
--- /dev/null
+++ b/include/stateMachineFwk/smTypes.h
@@ -0,0 +1,49 @@
+/*
+ * 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 INCLUDE_STATEMACHFWK_SMTYPES_H_
+#define INCLUDE_STATEMACHFWK_SMTYPES_H_
+
+#include <map>
+#include <smEnumTypes.h>
+
+using namespace std;
+
+namespace SM{
+
+class ControlBlock;
+class State;
+class ActionTable;
+
+enum ActStatus
+{
+	PROCEED,
+	HALT,
+};
+
+enum ControlBlockState
+{
+    FREE,
+    ALLOCATED,
+    MAX_STATE
+};
+
+using ActionPointer = ActStatus(*)(ControlBlock&);
+using EventToActionTableMap = std::map <Event_e, ActionTable>;
+
+};
+
+#endif /* INCLUDE_STATEMACHFWK_SMTYPES_H_ */
diff --git a/include/stateMachineFwk/state.h b/include/stateMachineFwk/state.h
new file mode 100644
index 0000000..c928d6c
--- /dev/null
+++ b/include/stateMachineFwk/state.h
@@ -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.
+ */
+
+#ifndef STATE_H_
+#define STATE_H_
+
+#include <string>
+#include <map>
+#include "smTypes.h"
+
+using namespace std;
+
+namespace SM
+{
+	class State
+	{
+  	public:
+		State(State_e sID);
+      		virtual ~State();
+
+	      	virtual void display();
+
+      		ActStatus executeActions(Event_e evtId,ControlBlock& cb);
+
+	      	inline State_e getStateId()const
+      		{
+			return stateID;
+      		}
+
+   	protected:
+      		State_e stateID;
+	      	EventToActionTableMap eventToActionsMap;
+	};
+}
+#endif /* STATE_H_ */
diff --git a/include/stateMachineFwk/stateMachineEngine.h b/include/stateMachineFwk/stateMachineEngine.h
new file mode 100644
index 0000000..2a47c85
--- /dev/null
+++ b/include/stateMachineFwk/stateMachineEngine.h
@@ -0,0 +1,42 @@
+/*
+ * 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 STATEMACHINEENGINE_H_
+#define STATEMACHINEENGINE_H_
+
+#include <map>
+#include "smTypes.h"
+#include "procedureQueue.h"
+
+namespace SM
+{
+	class State;
+	class StateMachineEngine
+	{
+	public:
+		~StateMachineEngine();
+		static StateMachineEngine* Instance();
+	    void run();
+      	bool addCBToProcQ(ControlBlock* cb);
+	
+   	private:
+		StateMachineEngine();
+
+		ProcedureQueue procQ_m;
+	};
+}
+
+#endif /* STATEMACHINEENGINE_H_ */
diff --git a/include/stateMachineFwk/tempDataBlock.h b/include/stateMachineFwk/tempDataBlock.h
new file mode 100644
index 0000000..5971b1c
--- /dev/null
+++ b/include/stateMachineFwk/tempDataBlock.h
@@ -0,0 +1,44 @@
+/*
+ * 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 TEMPDATABLOCK_H_
+#define TEMPDATABLOCK_H_
+
+namespace SM
+{
+class State;
+class TempDataBlock
+{
+   public:
+      TempDataBlock();
+      virtual ~TempDataBlock();
+
+      virtual void display();
+
+      State* getCurrentState();
+      void setNextState(State* state);
+
+      TempDataBlock* getNextTempDataBlock();
+      void setNextTempDataBlock(TempDataBlock* tdb_p);
+
+   protected:
+      State* currentStatep;
+      TempDataBlock* next;
+};
+}
+
+#endif /* TEMPDATABLOCK_H_ */
+
diff --git a/install_builddeps.sh b/install_builddeps.sh
new file mode 100644
index 0000000..c899322
--- /dev/null
+++ b/install_builddeps.sh
@@ -0,0 +1,73 @@
+#!/bin/bash
+#
+# Copyright 2019-present Open Networking Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+SUDO=''
+[[ $EUID -ne 0 ]] && SUDO=sudo
+
+install_build_pkg_deps() {
+	$SUDO apt-get update && $SUDO apt-get install -y \
+		git \
+		build-essential \
+		cmake \
+		libuv-dev \
+		libgcrypt-dev \
+		libidn11-dev \
+		bison \
+		flex \
+		libgnutls-dev \
+		libsctp-dev \
+		libssl-dev \
+		autoconf \
+		libtool \
+		pkg-config \
+		curl \
+  		automake \
+		make \
+		unzip
+}
+
+install_freediameter() {
+    $SUDO rm -rf /tmp/freediameter
+	git clone -q https://github.com/omec-project/freediameter.git /tmp/freediameter
+	pushd /tmp/freediameter
+	mkdir -p build && cd build
+	cmake -DDISABLE_SCTP:BOOL=OFF .. && make -j && $SUDO make install
+}
+
+install_grpc() {
+	$SUDO rm -rf /tmp/grpc
+	git clone -b $(curl -L https://grpc.io/release) \
+	-q https://github.com/grpc/grpc /tmp/grpc
+	cd /tmp/grpc && \
+	git submodule update --init && \
+    	CXXFLAGS='-Wno-error' make && make install && ldconfig
+}
+
+install_build_deps() {
+	install_build_pkg_deps
+	install_freediameter
+	install_grpc
+}
+
+(return 2>/dev/null) && echo "Sourced" && return
+
+set -o errexit
+set -o pipefail
+set -o nounset
+
+install_build_deps
+echo "Dependency install completed"
diff --git a/install_rundeps.sh b/install_rundeps.sh
new file mode 100644
index 0000000..315626b
--- /dev/null
+++ b/install_rundeps.sh
@@ -0,0 +1,63 @@
+#!/bin/bash
+#
+# Copyright 2019-present Open Networking Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+SUDO=''
+[[ $EUID -ne 0 ]] && SUDO=sudo
+
+install_run_pkg_deps() {
+	$SUDO apt-get update && $SUDO apt-get install -y \
+		openssl \
+		libidn11 \
+		libgnutls30 \
+		libsctp1 \
+		openssh-server
+}
+
+install_run_utils() {
+        $SUDO apt-get update && $SUDO apt-get install -y \
+        jq \
+        dnsutils \
+		iproute2 \
+		iputils-ping \
+		tcpdump
+}
+
+install_ssh_server() {
+	$SUDO mkdir /var/run/sshd
+	echo 'root:mypass' | chpasswd
+	sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
+	sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
+	echo "export VISIBLE=now" >> /etc/profile
+}
+
+cleanup_image() {
+	$SUDO rm -rf /var/lib/apt/lists/*
+}
+
+install_run_deps() {
+        install_run_pkg_deps
+        install_ssh_server
+}
+
+(return 2>/dev/null) && echo "Sourced" && return
+
+set -o errexit
+set -o pipefail
+set -o nounset
+
+install_run_deps
+echo "Dependency install completed"
diff --git a/scripts/GtpV2StackCodeGen/README.txt b/scripts/GtpV2StackCodeGen/README.txt
new file mode 100644
index 0000000..7958516
--- /dev/null
+++ b/scripts/GtpV2StackCodeGen/README.txt
@@ -0,0 +1,28 @@
+Requirements:
+1.Python3.6.
+2.Install the template-toolkit package.
+	a. pip3 install Template-Toolkit-Python or 
+	b. git clone https://github.com/lmr/Template-Toolkit-Python, and set the path of the package in the datatypeCodeGen.py,groupedIECodeGen.py,iECodeGen.py,msgCodeGen.py,xlUtils.py script [as argument in sys.path.append]
+
+Inputs:
+	1 Excel file with 4 spreadsheets:
+		Message Modeling ,IE Modeling,Grouped IE Modeling and DataType Modeling: Defines the message structure,IEs,Grouped IEs and Datatype of IEs for the GTP classes to be generated . 
+Output:
+	1.	IE Classes .cpp and header files. 
+	2.	Message Classes .cpp and header files.
+	3.	gtpV2stack .cpp and header files
+	4.	MakeFile
+
+
+Remove all existing generated Files:
+-Use below commands:
+	rm ../../src/gtpV2Codec/ieClasses/*.cpp ../../src/gtpV2Codec/ieClasses/*.h;
+	rm ../../src/gtpV2Codec/msgClasses/*.cpp ../../src/gtpV2Codec/msgClasses/*.h;
+	rm ../../src/gtpV2Codec/Makefile;
+Execution:
+-Run the below command:
+	python3 startCodeGen.py
+
+
+
+
diff --git a/scripts/GtpV2StackCodeGen/dataModel/prototypeV8.xlsx b/scripts/GtpV2StackCodeGen/dataModel/prototypeV8.xlsx
new file mode 100644
index 0000000..6b3d954
--- /dev/null
+++ b/scripts/GtpV2StackCodeGen/dataModel/prototypeV8.xlsx
Binary files differ
diff --git a/scripts/GtpV2StackCodeGen/datatypeCodeGen.py b/scripts/GtpV2StackCodeGen/datatypeCodeGen.py
new file mode 100644
index 0000000..81e48a9
--- /dev/null
+++ b/scripts/GtpV2StackCodeGen/datatypeCodeGen.py
@@ -0,0 +1,335 @@
+# Copyright 2019-present Infosys Limited     
+# SPDX-License-Identifier: Apache-2.0
+
+
+import re
+from template import Template
+import os
+from xlUtils import xlUtils,wb
+dataTypeData={}
+dataTypeData['arrayTypeList']=[]
+dataTypeData['DataTypeListAuto']=[]
+class GenerateDataTypeClass():
+    def __init__( self ):
+        self.templateDataTypes()  
+
+        
+    def templateDataTypes(self):
+        typeDataTemplate = GenerateDataTypeClass.dataTypeParser()
+        
+        templateData = dict()
+        sequenceList = []
+        dataTypeListAuto = []
+        arrayTypeInfoList = []
+        dataTypeListManual = []
+        templateData['className'] = 'DataTypeCodecUtils'
+        templateData['fileName'] = templateData['className'][0].lower()+templateData['className'][1:]
+        templateData['classNameUC'] = templateData['className'].upper()
+        
+        #building the dictionary obtained to a dict 'templateData'
+        #which is the input to template process 
+        for typeNames in typeDataTemplate['DataTypeList']:
+            myData = {}
+            sequenceList = []
+            
+            
+            myData['typeName'] = typeNames
+            for typeDetails in typeDataTemplate['typeDetails']:
+                if typeNames in typeDetails:
+                    myTypeData = typeDetails[typeNames]
+                   
+                    for varDetails in myTypeData['varDetails']:
+                     
+                        for key,value in varDetails.items():
+                            for en in myTypeData['encodeSeq']:
+                               
+                                mEncode = re.search('encode:(\w+):',en)
+                                mSkip = re.search('skip:(\d+):(\w+)',en)
+                                item = dict()
+                               
+                                if mSkip:
+                                    bitByte = mSkip.group(2)
+                                    skipValue = mSkip.group(1)
+                                    item['skipType'] = 'y'
+                                    item['bitByte'] = bitByte
+                                    item['skipValue'] = skipValue
+                                elif mEncode:
+                                    varName = mEncode.group(1)
+                                    if key == varName:
+                                        item['fieldName'] = varName
+                                        if value['bitLength'] != 0:
+                                            item['bitField'] = 'y'
+                                            item['fieldSize'] = value['bitLength']
+                                            item['leafType'] = 'y'
+                                        else:
+                                            item['fieldSize'] = value['byteLength']
+                                        if value['decodeCondition'] != '':
+                                            item['decodeConditional'] = 'y'
+                                            item['decodeCondition'] = value['decodeCondition']
+                                        if value['encodeCondition'] != '':
+                                            item['encodeConditional'] = 'y'
+                                            item['encodeCondition'] = value['encodeCondition']
+                                        if value['presence'] == 'optional':
+                                            item['presence'] = 'optional'
+                                        item['fieldType'] = value['varType']
+                                        mUint = re.search('^Uint(\d+)$',value['varType'])
+                                        if mUint or value['varType'] == 'bool':
+                                
+                                            item['leafType'] = 'y'
+                    
+                                        else:
+                                            if value['lengthStr'] == 'EOI' or value['lengthStr'] == '':
+                                                item['length'] = 'lengthLeft'
+                                            else:
+                                                item['length'] = value['lengthStr']
+                                        mArrayUint = re.search('^(\w+)Array(\d+)$',value['varType'])
+                                        if mArrayUint :
+                                
+                                            item['arrayType'] = 'y'
+                                            
+                                            item['count'] =0
+                                                
+                                        if value['validation'] != '':
+                    
+                                            item['validationPresent'] = 'y'
+                                            item['validationRule'] = value['validation']
+                    
+                                if item not in sequenceList and item!={}:
+                                    sequenceList.append(item)
+                                    
+               
+            
+            for arrayLists in typeDataTemplate['ArrayTypeList']:
+                arrayTypeInfo = {} 
+                
+                if typeNames in arrayLists:
+                       
+                    arrayType = arrayLists[typeNames]
+                    arrayTypeInfo['typeName'] = arrayType['arrayTypeName']
+                    arrayTypeInfo['subType'] = arrayType['arraySubType']
+                    mArraySubType = re.search('^Uint\d+$',arrayTypeInfo['subType'])
+                    if mArraySubType:
+                        arrayTypeInfo['leafType'] = 'y'
+                    
+                    arrayTypeInfoList.append(arrayTypeInfo)
+                        
+            for dataCodecManual in typeDataTemplate['DataTypeCodecList']:
+                if typeNames == dataCodecManual:
+                    dataTypeListManual.append(myData)
+                    
+            
+            
+            if sequenceList != []:
+                myData['sequence'] = sequenceList
+                dataTypeListAuto.append(myData)
+                
+          
+                   
+        templateData['arrayTypeList'] = arrayTypeInfoList
+        templateData['DataTypeListManual'] = dataTypeListManual
+        templateData['DataTypeListAuto'] = dataTypeListAuto  
+        
+        GenerateDataTypeClass.generateDataType(templateData) 
+        outputDir = '../../src/gtpV2Codec/ieClasses'  
+        ttFileNameCpp = 'tts/datatypetemplate.cpp.tt'
+        ttFileNameH = 'tts/datatypetemplate.h.tt'
+        xlUtils.templateProcess(templateData,ttFileNameCpp,ttFileNameH,outputDir,outputDir)
+       
+    #Parse the data from excel sheet 'DataType Modeling' 
+    #and build to a dict 'typeData'
+    def dataTypeParser():
+        
+        sheet = wb['DataType Modeling']
+        state = ''
+        typeData = {}
+        encodeSeq = []
+        varDetailList = []
+        dataTypeList = []
+        dataTypeCodecList = []
+        arrayTypeList = []
+        typeDataList = []
+        currentType = ''
+        currentDataType = ''
+        varType = ''
+        decodeCondition = ''
+        encodeCondition = ''
+        validation = ''
+        bitLength = 0
+        byteLength = 0
+        lengthStr = ''
+        presence = ''
+        dataType = {}
+        
+        for i in range(1,sheet.max_row+1):
+            cell_value_B = xlUtils.getCellValue(sheet,i,'B')
+            
+            # Search pattern for data definition start,end 
+            mDataDefineStartCodec = re.search('DataType Definition Start:(\w+):Codec\[Manual\]\s*$',str(cell_value_B))
+            mArrayDefine = re.search('ArrayTypes Definition:([\w\d]*)Array(\d+)',str(cell_value_B))
+            mDataDefineStart = re.search('DataType Definition Start:(\w+)',str(cell_value_B))
+            mDataDefineEnd = re.search('DataType Definition End:(\w+)',str(cell_value_B))
+            if mDataDefineStartCodec:
+                currentType = mDataDefineStartCodec.group(1)
+                currentDataType = currentType
+                dataTypeCodecList.append(currentDataType)
+                typeData['DataTypeCodecList'] = dataTypeCodecList
+                dataTypeList.append(currentDataType)
+                typeData['DataTypeList'] = dataTypeList
+                continue
+            
+            if mArrayDefine:
+                
+                arraySubType = mArrayDefine.group(1)
+                arrayCount = mArrayDefine.group(2)
+                arrayTypeName = arraySubType + 'Array' + arrayCount
+                typeData['ArrayTypeList'] = {}
+                typeData['ArrayTypeList'][arrayTypeName] = {}
+                typeData['ArrayTypeList'][arrayTypeName]['arrayTypeName'] = arrayTypeName
+                typeData['ArrayTypeList'][arrayTypeName]['arraySubType'] = arraySubType
+                typeData['ArrayTypeList'][arrayTypeName]['arrayCount'] = arrayCount
+                arrayTypeList.append(typeData['ArrayTypeList'])
+                typeData['ArrayTypeList'] = arrayTypeList
+                dataTypeList.append(arrayTypeName)
+                typeData['DataTypeList'] = dataTypeList
+                continue
+            
+            if mDataDefineStart:
+                currentType = mDataDefineStart.group(1)
+                currentDataType = currentType
+                
+                state = 'StartDetected'
+                dataTypeList.append(currentDataType)
+                typeData['DataTypeList'] = dataTypeList
+                typeData['typeDetails'] = {}
+                typeData['typeDetails'][currentDataType] = {}
+                dataType = typeData['typeDetails'][currentDataType]
+                typeData['typeDetails'][currentDataType]['typeName'] = currentType
+                typeDataList.append(typeData['typeDetails'])
+                typeData['typeDetails'] = typeDataList
+                
+            elif mDataDefineEnd:
+                state = 'EndDetected'
+               
+            elif state == 'StartDetected':
+                encodeSeq = []
+                varDetailList = []
+                state = 'TypeDefinitionStart'
+            elif state == 'TypeDefinitionStart':
+                (byteLength,lengthStr) = xlUtils.getByteLength(sheet,i)
+                
+                #for fields less than 1 bytelength
+                
+                if byteLength == 0:
+                   varList = []
+                   
+                   for j in map(chr, range( ord('D'), ord('L'))):
+                       field = xlUtils.getCellValue(sheet,i,j)
+                       bitLength = 0
+                       byteLength = 0
+                       if field != None:
+                           
+                           bitLength = xlUtils.getBitLength(sheet,i,j) 
+                           (varName,varType,encodeCondition,decodeCondition,validation,count) = xlUtils.extractField(field)
+                           
+                           if varType == '':
+                               varType = 'Uint8'
+                           if bitLength == 8:
+                               byteLength = 1
+                               bitLength = 0        
+                           if varName != 'Spare':
+                               varList.append(varName)
+                            
+                               dataType['varDetails'] = {}
+                               dataType['varDetails'][varName] = {}
+                               dataType['varDetails'][varName]['varType'] = varType
+                               dataType['varDetails'][varName]['decodeCondition'] = decodeCondition
+                               dataType['varDetails'][varName]['encodeCondition'] = encodeCondition
+                               dataType['varDetails'][varName]['validation'] = validation
+                               dataType['varDetails'][varName]['bitLength'] = bitLength
+                               dataType['varDetails'][varName]['byteLength'] = byteLength
+                               dataType['varDetails'][varName]['lengthStr'] = lengthStr
+                               dataType['varDetails'][varName]['presence'] = presence
+                               
+                               encStrBit = 'encode:' + varName + ':' + str(bitLength) + ':Bits'
+                               encodeSeq.append(encStrBit)
+                               dataType['encodeSeq'] = encodeSeq
+                               varDetailList.append(dataType['varDetails'])
+                               dataType['varDetails'] = varDetailList
+                               
+                               
+                               
+                               
+                           else:
+                               skipStrBit = 'skip:'+ str(bitLength) + ':Bits'
+                               encodeSeq.append(skipStrBit)
+                               dataType['encodeSeq'] = encodeSeq
+                               
+                #for fields of length 1 byte
+                else:
+                    varList = []
+                    
+                    field = sheet.cell(row=i, column=4).value
+                    (varName,varType,encodeCondition,decodeCondition,validation,count) = xlUtils.extractField(field)
+                    
+                    if varType == '':
+                        varType = xlUtils.lengthToType(byteLength)
+                
+                    if varName != 'Spare':
+                        varList.append(varName)
+                        
+                        
+                        dataType['varDetails'] = {}
+                        dataType['varDetails'][varName] = {}
+                        dataType['varDetails'][varName]['varType'] = varType
+                        dataType['varDetails'][varName]['decodeCondition'] = decodeCondition
+                        dataType['varDetails'][varName]['encodeCondition'] = encodeCondition
+                        dataType['varDetails'][varName]['validation'] = validation
+                        dataType['varDetails'][varName]['bitLength'] = bitLength
+                        dataType['varDetails'][varName]['byteLength'] = byteLength
+                        dataType['varDetails'][varName]['lengthStr'] = lengthStr
+                        bitLength = 0
+                        byteLength = 0
+                        
+                        if str(cell_value_B) == 'Yes':
+                             presence = 'optional'  
+                        dataType['varDetails'][varName]['presence'] = presence
+                        varDetailList.append(dataType['varDetails'])
+                        dataType['varDetails'] = varDetailList
+                        
+                        encStrByte = 'encode:' + varName + ':' + str(byteLength) + ':Bytes'
+                        encodeSeq.append(encStrByte)
+                        dataType['encodeSeq'] = encodeSeq
+                        
+                    else:
+                        skipStrByte = 'skip:'+ str(byteLength) + ':Bytes'
+                        encodeSeq.append(skipStrByte)
+                        dataType['encodeSeq'] = encodeSeq
+                        
+        return typeData    
+        
+    def generateDataType(templateData):
+        dataTypeInfo={}
+        dataTypeData['arrayTypeList']=[]
+        for dataType in templateData['arrayTypeList']:
+            dataTypeInfo={}
+            dataTypeInfo['typeName']=dataType['typeName']
+            dataTypeInfo['subType']=dataType['subType']
+            mtypeName = re.search('^(\w+)Array(\d+)$',dataTypeInfo['typeName'])
+            if mtypeName:
+                
+                dataTypeInfo['arraySize']=mtypeName.group(2)
+            dataTypeData['arrayTypeList'].append(dataTypeInfo)
+        dataTypeData['DataTypeListAuto']=templateData['DataTypeListAuto']
+        
+        
+        template = Template()
+        ttFileNamefactoryH = 'tts/v2DataTypetemplate.h.tt'
+        outputDir = '../../src/gtpV2Codec/ieClasses'
+        
+        if not os.path.exists(outputDir):
+            os.makedirs(outputDir)
+        outputFileName = 'gtpV2DataTypes.h'
+        template.__init__({'OUTPUT' : outputFileName, 'OUTPUT_PATH' : outputDir})
+        template.process(ttFileNamefactoryH, {'tempdata' : dataTypeData})
+        
+GenerateDataTypeClass()
diff --git a/scripts/GtpV2StackCodeGen/groupedIECodeGen.py b/scripts/GtpV2StackCodeGen/groupedIECodeGen.py
new file mode 100644
index 0000000..072ccc0
--- /dev/null
+++ b/scripts/GtpV2StackCodeGen/groupedIECodeGen.py
@@ -0,0 +1,271 @@
+# Copyright 2019-present Infosys Limited     
+# SPDX-License-Identifier: Apache-2.0
+
+
+import re
+import os
+
+from template import Template
+from xlUtils import xlUtils,wb
+templateData = {}
+templateData['instList']=[]
+grpIeDataTypeData={}
+grpIeDataTypeData['grpList']=[]
+grpIeDataTypeData['grpTypeList']=[]
+class GenerateGrpIeClass():
+    def __init__( self ):
+        
+        self.groupIEParser()
+    
+    def groupIEParser(self):
+        
+        
+        sheet = wb['Grouped IE Modeling']
+        state = ''
+        
+        data = {}
+        grpIeData = {}
+        currentGrpie = ''
+        currentMsg = ''
+        currentVar = ''
+        currentInstance = ''
+        currentInstanceValue = 0
+        grpIeList = []
+        ieDetailsList = []
+        ieList = []
+       
+        for i in range(1,sheet.max_row+1):
+            
+            cell_value_B = xlUtils.getCellValue(sheet,i,'B')
+            
+            mGroupedIeDefStart = re.search('Grouped IE Definition Start:(\w+):(\d+):(\w+):(\w+):Instance\[(\d+)]',str(cell_value_B))
+            mGroupedIeDefEnd = re.search('Grouped IE Definition End:(\w+):(\w+)',str(cell_value_B))
+            
+            if mGroupedIeDefStart:
+                
+                state = 'StartDetected'
+                currentGrpie = mGroupedIeDefStart.group(1)
+                currentMsg = mGroupedIeDefStart.group(4)
+                currentVar = mGroupedIeDefStart.group(3)
+                currentInstanceValue = mGroupedIeDefStart.group(5)
+                currentInstance = currentVar + 'In' + currentMsg
+                
+                if currentGrpie not in grpIeList:
+                     grpIeList.append(currentGrpie)
+                     data['grpIeList'] = grpIeList
+                data['grpIeDetails'] = {}
+                data['grpIeDetails'][currentGrpie] = {}
+                data['grpIeDetails'][currentGrpie]['ieTypeValue'] = mGroupedIeDefStart.group(2)
+                data['grpIeDetails'][currentGrpie]['instList'] = []
+                data['grpIeDetails'][currentGrpie]['instList'].append(currentInstance)
+                data['grpIeDetails'][currentGrpie][currentInstance] = {}
+                data['grpIeDetails'][currentGrpie][currentInstance]['instance'] = currentInstanceValue
+                grpIeData = data['grpIeDetails'][currentGrpie][currentInstance]
+                grpIeData['msgName'] = currentMsg
+                
+            elif mGroupedIeDefEnd:
+                state = 'EndDetected'
+                grpIeData = {} 
+                ieList = []
+                grpIeList=[]
+                ieDetailsList = []
+               
+                GenerateGrpIeClass.generateGroupedIeClasses(data)
+                GenerateGrpIeClass.prepareGrpIeMakeFile()
+                
+                
+            elif state == 'StartDetected':
+                state = 'IeListStart'
+                
+            elif state == 'IeListStart':
+                
+                if xlUtils.getCellValue(sheet,i,'D') != None:
+                    ieData = {}
+                    ieDescription = xlUtils.getCellValue(sheet,i,'D')
+                    ieData['ieDescription'] = xlUtils.getCellValue(sheet,i,'D')
+                    ieData['presence'] = xlUtils.getCellValue(sheet,i,'E')
+                    ieData['grouped'] = xlUtils.getCellValue(sheet,i,'B')
+                    ieData['cardinality'] = xlUtils.getCellValue(sheet,i,'C')
+                    ieData['instance'] = xlUtils.getCellValue(sheet,i,'H') 
+                    
+                    if ieData['cardinality'] == None:
+                        ieData['cardinality'] = 1 
+                    ieTypeDescription = xlUtils.getCellValue(sheet,i,'G')
+                    ieData['ieTypeDescription'] = ieTypeDescription
+                    
+                    ieVarName  = xlUtils.getVarNameFromString(ieDescription,0)
+                    
+                    ieTypeName  = xlUtils.getVarNameFromString(ieTypeDescription,1)
+                    
+                    if ieData['grouped'] == 'Yes':
+                        ieData['ieGroupTypeName'] = ieVarName.capitalize() + 'In' + currentMsg
+                        
+                    ieData['ieVarName'] = ieVarName
+                    ieData['ieTypeName'] = ieTypeName
+                    
+                    
+                    ieList.append(ieVarName)
+                    grpIeData['ieList'] = ieList
+                    grpIeData['ieDetails'] = {}
+                    grpIeData['ieDetails'][ieVarName] = ieData
+                    ieDetailsList.append(grpIeData['ieDetails'])
+                    grpIeData['ieDetails'] = ieDetailsList
+                    
+        
+    def generateGroupedIeClasses(data):
+        parsedData = data
+        
+        for grpIe in parsedData['grpIeList']:
+            
+            grpIeDetails = parsedData['grpIeDetails'][grpIe]
+            
+            GenerateGrpIeClass.generateGroupedIeClass(grpIeDetails,grpIe)
+            GenerateGrpIeClass.generateGroupedIeDataType(grpIeDetails, grpIe)
+    def generateGroupedIeClass(grpIeDetails,grpIe):
+        
+        templateData['fileName'] = grpIe[0].lower()+grpIe[1:] + 'Ie'
+        templateData['className'] = grpIe + 'Ie'
+        templateData['classNameUC'] = templateData['fileName'].upper()
+        fileName=templateData['fileName']
+
+        for inst in grpIeDetails['instList']:
+            instanceInfo = {}
+            instDetails  = grpIeDetails[inst]
+            GenerateGrpIeClass.generateGroupedIeInstanceClass(instDetails, inst)
+            
+            instanceInfo['className'] = inst
+            instanceInfo['fileName'] = inst[0].lower()+inst[1:]
+            instanceInfo['msgType'] =  instDetails['msgName'] + 'MsgType'
+            instanceInfo['instance'] = instDetails['instance']
+            
+            if instanceInfo not in templateData['instList']:
+                templateData['instList'].append(instanceInfo)
+            
+        templateData[fileName]=[inst for inst in templateData['instList'] if grpIe in inst['className']]                
+           
+        outputDir = '../../src/gtpV2Codec/ieClasses'
+        ttFileNameCpp = 'tts/grpietemplate.cpp.tt'
+        ttFileNameH = 'tts/grpietemplate.h.tt'
+        xlUtils.templateProcess(templateData,ttFileNameCpp,ttFileNameH,outputDir,outputDir)
+        
+        objectfile ='ieClasses/' + templateData['fileName'] + '.o'
+        sourcefile = 'ieClasses/' + templateData['fileName'] + '.cpp'
+        xlUtils.addToMakeSo('gtpV2Stack.so',objectfile,sourcefile)
+    
+    def generateGroupedIeDataType(grpIeDetails, grpIe):
+        grpIeInfo={}
+        
+        grpIeInfo['iePresenceList']=[]
+        grpIeTypeInfo={}
+        grpIeTypeInfo['grpIeTypeName']=grpIe + 'IeType'
+        grpIeTypeInfo['grpIeTypeValue']=grpIeDetails['ieTypeValue']
+        if grpIeTypeInfo not in grpIeDataTypeData['grpTypeList']:
+            grpIeDataTypeData['grpTypeList'].append(grpIeTypeInfo)
+        
+        for inst in grpIeDetails['instList']:
+            
+            instDetails  = grpIeDetails[inst]
+            grpIeInfo={}
+            grpIeInfo['iePresenceList']=[]
+            grpIeInfo['grpIeName']= inst+'Data'
+            grpIeInfo['ieList']=[]
+            for ieDict in instDetails['ieDetails']:
+                for ieDetails in ieDict:
+                    if ieDict[ieDetails]['presence']!='M':
+                        grpIeInfo['iePresenceList'].append(ieDict[ieDetails]['ieVarName']+'IePresent')
+                    ieInfo={}
+                    ieInfo['ieTypeName']=ieDict[ieDetails]['ieTypeName']+'IeData'
+                    ieInfo['ieVarName']=ieDict[ieDetails]['ieVarName']
+                    grpIeInfo['ieList'].append(ieInfo)
+        
+        if grpIeInfo not in grpIeDataTypeData['grpList']:
+            grpIeDataTypeData['grpList'].append(grpIeInfo)
+        template = Template()
+        ttFileNamefactoryH = 'tts/grpIeDataTypetemplate.h.tt'
+        outputDir = '../../src/gtpV2Codec/ieClasses/'
+        
+        if not os.path.exists(outputDir):
+            os.makedirs(outputDir)
+        outputFileName = 'gtpV2GrpIeDataTypes.h'
+        template.__init__({'OUTPUT' : outputFileName, 'OUTPUT_PATH' : outputDir})
+        template.process(ttFileNamefactoryH, {'tempdata' : grpIeDataTypeData})
+        
+    def generateGroupedIeInstanceClass(instDetails, inst):
+        templateInstData = {}
+        ieTypeList = []
+        ieTypeDetailsList = []
+       
+        ieInfoList =[]
+       
+        templateInstData['fileName'] = inst[0].lower()+inst[1:]
+        
+        templateInstData['msgClassName'] = inst
+        templateInstData['classNameUC'] = templateInstData['fileName'].upper()
+        
+        for ieEntry in instDetails['ieList']:
+            
+            ieInfo = {}
+            ieTypeInfo = {}
+            
+            ies = instDetails['ieDetails']
+            for x in ies:
+                
+                ie = x.get(ieEntry)
+                
+                if ie != None and ieEntry == ie.get('ieVarName'):
+                    ieInfo['ieName'] =  ie['ieVarName']
+                    ieInfo['ieVarName'] = ie['ieVarName']
+                    ieInfo['ieType'] = ie['ieTypeName']
+                    ieInfo['ieFileName'] = ie['ieTypeName'][0].lower()+ie['ieTypeName'][1:] + 'Ie'
+                    ieInfo['ieLocalVar'] = ie['ieTypeName'][0].lower()+ie['ieTypeName'][1:]
+                    ieInfo['iePresence'] = ie['presence']
+                    ieInfo['ieCardinality'] = ie['cardinality']
+                    ieInfo['instance'] = ie['instance']
+                    ieInfo['grouped'] = ie['grouped']
+                   
+                    ieType = ieInfo['ieType']
+                    
+                    ieTypeInfo['ieName'] =  ie['ieVarName']
+                    ieTypeInfo['ieVarName'] = ie['ieVarName']
+                    ieTypeInfo['ieType'] = ie['ieTypeName']
+                    ieTypeInfo['ieFileName'] = ie['ieTypeName'][0].lower()+ie['ieTypeName'][1:] + 'Ie'
+                    ieTypeInfo['ieLocalVar'] = ie['ieTypeName'][0].lower()+ie['ieTypeName'][1:]
+                    ieTypeInfo['iePresence'] = ie['presence']
+                    ieTypeInfo['ieCardinality'] = ie['cardinality']
+                    ieTypeInfo['instance'] = ie['instance']
+                    ieTypeInfo['grouped'] = ie['grouped']
+                                        
+                    if ieInfo['ieType'] not in ieTypeList:   
+                        ieTypeList.append(ieInfo['ieType'])
+                        templateInstData['ieTypeList'] = ieTypeList
+                                        
+                    if ieInfo not in ieInfoList:
+                                              
+                        ieInfoList.append(ieInfo)
+                        templateInstData['ieList'] = ieInfoList
+                    
+                    templateInstData['ieTypeDetails'] = {}
+                    templateInstData['ieTypeDetails'][ieType] = []
+                    if ieTypeInfo not in templateInstData['ieTypeDetails'][ieType]:
+                        templateInstData['ieTypeDetails'][ieType].append(ieTypeInfo)
+                        ieTypeDetailsList.append(templateInstData['ieTypeDetails'])
+                        templateInstData['ieTypeDetails'] = ieTypeDetailsList
+      
+        GenerateGrpIeClass.templateInstanceprocess(templateInstData)
+        outputDirCpp = 'ieClasses/'
+        objectfile = outputDirCpp +templateInstData['fileName'] + '.o'
+        sourcefile = outputDirCpp + templateInstData['fileName'] + '.cpp'
+        xlUtils.addToMakeSo('gtpV2Stack.so',objectfile,sourcefile)
+        
+    def templateInstanceprocess(templateInstData):
+        
+        ttFileNameInstCpp = 'tts/grpieinsttemplate.cpp.tt'
+        outputDir = '../../src/gtpV2Codec/ieClasses'
+        ttFileNameInstH = 'tts/grpieinsttemplate.h.tt'
+        xlUtils.templateProcess(templateInstData,ttFileNameInstCpp,ttFileNameInstH,outputDir,outputDir)
+            
+    def prepareGrpIeMakeFile():
+        outputDirCpp = 'ieClasses/manual/'
+        xlUtils.addToMakeSo("gtpV2Stack.so", outputDirCpp+'gtpV2GroupedIe.o',outputDirCpp+'gtpV2GroupedIe.cpp')
+                    
+GenerateGrpIeClass()
diff --git a/scripts/GtpV2StackCodeGen/iECodeGen.py b/scripts/GtpV2StackCodeGen/iECodeGen.py
new file mode 100644
index 0000000..2a90656
--- /dev/null
+++ b/scripts/GtpV2StackCodeGen/iECodeGen.py
@@ -0,0 +1,318 @@
+# Copyright 2019-present Infosys Limited     
+# SPDX-License-Identifier: Apache-2.0
+
+
+import re
+import os
+from template import Template
+from xlUtils import xlUtils,wb
+
+ieFactoryData = {}
+ieFactoryData['ieList'] = []
+
+ieDataTypeData = {}
+ieDataTypeData['ieTypeList'] = []
+ieDataTypeData['ieList'] = []
+class GenerateIeClass:
+    
+    def __init__( self ):
+        
+        self.ieParser()
+    
+    #Parse the data from excel sheet 'IE Modeling' 
+    #and build to a dict 'iedata'
+    def ieParser(self):
+        
+        sheet = wb['IE Modeling']
+        state = ''
+        
+        encodeSeq = []
+        byteLength = 0
+        currentType = ''
+        validation = ''
+        count = ''
+        decodeCondition = ''
+        encodeCondition = ''
+        typeVal = ''
+        presence = ''
+        bitLength = 0        
+        varDetailList = []
+        ieData = dict()         
+        ieTypeList = []
+        lengthStr = ''        
+        varType = ''
+        varName = ''
+        mType=0
+        varList=[]
+        grpIeList = []
+        
+        for i in range(1,sheet.max_row+1):
+            presence = ''
+            bitLength = 0
+            byteLength = 0
+            cell_value_B = xlUtils.getCellValue(sheet,i,'B')
+            cell_value_D = xlUtils.getCellValue(sheet,i,'D')
+            cell_value_H = xlUtils.getCellValue(sheet,i,'H')
+            
+            # Search pattern for IE definition start,end 
+            mGroupedIe = re.search('Grouped IE Definition:(\w+)',str(cell_value_B))
+            mIeDefStart = re.search('IE Definition Start:(\w+)',str(cell_value_B))
+            mIeDefEnd = re.search('IE Definition End:(\w+)' ,str(cell_value_B))
+             
+            if mGroupedIe:
+                
+                grpIeName = mGroupedIe.group(1)
+                grpIeList.append(grpIeName)
+                for grpie in grpIeList:
+                    self.generateIeFactory(grpie)
+                
+            if mIeDefStart:
+                currentType = mIeDefStart.group(1)
+                state = 'StartDetected'
+                ieTypeList.append(currentType)
+                
+            elif mIeDefEnd:
+                
+                state = 'EndDetected' 
+                self.templateIes(ieData,currentType)
+                self.generateIeFactory(currentType)
+                self.generateIeDataType(currentType,typeVal,varList)
+                self.prepareIeMakeFile()
+                varList = []
+                
+            elif state == 'StartDetected':
+                varDetailList = []
+                encodeSeq = []
+                
+                colDValue = str(cell_value_D)
+                mType = re.search('Type = (\d+)',colDValue)
+                mSpare = re.search('Spare',colDValue)
+                mInstance = re.search('Instance',str(cell_value_H))
+                
+                if mType:
+                    typeVal = mType.group(1)
+                    ieData['ieDetails'] = {}
+                    ieData['ieDetails'][currentType] = {}
+                    ieData['ieDetails'][currentType]['ieName'] = currentType
+                    ieData['ieDetails'][currentType]['ieTypeVal'] = typeVal
+                    
+                if mSpare and mInstance:
+                    state = 'TypeDefinitionStart'
+                                    
+            elif state == 'TypeDefinitionStart':
+                
+                (byteLength,lengthStr) = xlUtils.getByteLength(sheet,i)
+                
+                #for fields less than 1 bytelength
+                if byteLength == 0:
+                    
+                   for j in map(chr, range( ord('D'), ord('L'))):
+                       field = xlUtils.getCellValue(sheet,i,j)
+                       fieldDetails=dict()
+                       if field != None:
+                           
+                           bitLength = xlUtils.getBitLength(sheet,i,j) 
+                           (varName,varType,encodeCondition,decodeCondition,validation,count) = xlUtils.extractField(field)
+                           
+                           if varType == '':
+                               varType = 'Uint8'
+                           if bitLength == 8:
+                               byteLength = 1
+                               bitLength = 0        
+                           if varName != 'Spare':
+                               fieldDetails['varName']=varName
+                               fieldDetails['varType']=varType
+                               fieldDetails['presence']=presence
+                               varList.append(fieldDetails)
+                              
+                               ieData['varDetails'] = {}
+                               ieData['varDetails'][varName] = {}
+                               ieData['varDetails'][varName]['varType'] = varType
+                               ieData['varDetails'][varName]['decodeCondition'] = decodeCondition
+                               ieData['varDetails'][varName]['encodeCondition'] = encodeCondition
+                               ieData['varDetails'][varName]['validation'] = validation
+                               ieData['varDetails'][varName]['bitLength'] = bitLength
+                               ieData['varDetails'][varName]['byteLength'] = byteLength
+                               ieData['varDetails'][varName]['lengthStr'] = lengthStr
+                               ieData['varDetails'][varName]['presence'] = presence
+                               ieData['varDetails'][varName]['count'] = count
+                               varDetailList.append(ieData['varDetails'])
+                               ieData['varDetails'] = varDetailList
+                               
+                               encStrBit = 'encode:' + varName + ':' + str(bitLength) + ':Bits'
+                               encodeSeq.append(encStrBit)
+                               ieData['encodeSeq'] = encodeSeq
+                               
+                           else:
+                               skipStrBit = 'skip:'+ str(bitLength) + ':Bits'
+                               encodeSeq.append(skipStrBit)
+                               ieData['encodeSeq'] = encodeSeq
+                
+                #for fields of length 1 byte
+                else:
+                                        
+                    field = sheet.cell(row=i, column=4).value
+                    (varName,varType,encodeCondition,decodeCondition,validation,count) = xlUtils.extractField(field)
+                    fieldDetails=dict()
+                    if varType == '':
+                        varType = xlUtils.lengthToType(byteLength)
+                
+                    if varName != 'Spare':
+                        fieldDetails['varName']=varName
+                        fieldDetails['varType']=varType
+                        if xlUtils.getCellValue(sheet,i,'B') == 'Yes':
+                             presence = 'optional'
+                        fieldDetails['presence']=presence
+                        varList.append(fieldDetails)
+                                              
+                        ieData['varDetails'] = {}
+                        ieData['varDetails'][varName] = {}
+                        ieData['varDetails'][varName]['varType'] = varType
+                        ieData['varDetails'][varName]['decodeCondition'] = decodeCondition
+                        ieData['varDetails'][varName]['encodeCondition'] = encodeCondition
+                        ieData['varDetails'][varName]['validation'] = validation
+                        ieData['varDetails'][varName]['bitLength'] = bitLength
+                        ieData['varDetails'][varName]['byteLength'] = byteLength
+                        ieData['varDetails'][varName]['lengthStr'] = lengthStr
+                        ieData['varDetails'][varName]['count'] = count
+                                           
+                        if xlUtils.getCellValue(sheet,i,'B') == 'Yes':
+                             presence = 'optional' 
+                             
+                             ieData['varDetails'][varName]['presence'] = presence
+                        varDetailList.append(ieData['varDetails'])
+                        ieData['varDetails'] = varDetailList
+                        
+                        encstrbyte = 'encode:' + varName + ':' + str(byteLength) + ':Bytes'
+                        encodeSeq.append(encstrbyte)
+                        ieData['encodeSeq'] = encodeSeq
+                    else:
+                        skipstrbyte = 'skip:'+ str(byteLength) + ':Bytes'
+                        encodeSeq.append(skipstrbyte)
+                        ieData['encodeSeq'] = encodeSeq    
+        return ieData    
+    
+    def templateIes(self,ieData,currentType):
+        
+        templateData = dict()  
+        varDetailsList = []
+        sequenceList = []
+        varDetailsList = ieData['varDetails']
+        templateData['className'] = ieData['ieDetails'][currentType]['ieName']+'Ie'
+        templateData['fileName'] = templateData['className'][0].lower() + templateData['className'][1:] 
+        templateData['classNameUC'] = templateData['className'].upper()
+        templateData['ieTypeVal'] = ieData['ieDetails'][currentType]['ieTypeVal']
+        
+        #building the dictionary obtained to a dict 'templateData'
+        #which is the input to template process 
+        
+        for en in ieData['encodeSeq']:   
+            mEncode = re.search('encode:(\w+):',en)
+            mSkip = re.search('skip:(\d+):(\w+)',en)
+            item = dict()
+            if mSkip:
+                bitByte = mSkip.group(2)
+                skipValue = mSkip.group(1)
+                item['skipType'] = 'y'
+                item['bitByte'] = bitByte
+                item['skipValue'] = skipValue
+            elif mEncode:
+                varName = mEncode.group(1)
+                for variableDetails in varDetailsList:
+                    for key,value in variableDetails.items():
+                        if key == varName:
+                            item['fieldName'] = varName
+                            if value['bitLength'] != 0:
+                                item['bitField'] = 'y'
+                                item['fieldSize'] = value['bitLength']
+                                item['leafType'] = 'y'
+                            else:
+                                item['fieldSize'] = value['byteLength']
+                            if value['decodeCondition'] != '':
+                                item['decodeConditional'] = 'y'
+                                item['decodeCondition'] = value['decodeCondition']
+                            if value['encodeCondition'] != '':
+                                item['encodeConditional'] = 'y'
+                                item['encodeCondition'] = value['encodeCondition']
+                            if value.get('presence') == 'optional':
+                                item['presence'] = 'optional'
+                            item['fieldType'] = value['varType']
+                            mUint = re.search('^Uint(\d+)$',value['varType'])
+                            if mUint or value['varType'] == 'bool':
+                                item['leafType'] = 'y'                    
+                            else:
+                                if value['lengthStr'] == 'EOI' or value['lengthStr'] == '':
+                                    item['length'] = 'lengthLeft'
+                                else:
+                                    item['length'] = value['lengthStr']
+                            if value['validation'] != '':
+                    
+                                item['validationPresent'] = 'y'
+                                item['validationRule'] = value['validation']
+                            mArray = re.search('Array',value['varType'])
+                            if mArray:
+                                item['arrayType']='y'
+                                if value['count'] =='':
+                                    item['count']=0
+                                else:
+                                    item['count']=value['count']
+                                
+            if  item != {}:
+                sequenceList.append(item)
+                templateData['sequence'] = sequenceList
+   
+        outputDir = '../../src/gtpV2Codec/ieClasses'
+        ttFileNameCpp = 'tts/ietemplate.cpp.tt'
+        ttFileNameH = 'tts/ietemplate.h.tt'
+        xlUtils.templateProcess(templateData,ttFileNameCpp,ttFileNameH,outputDir,outputDir)
+        
+        objectFile = 'ieClasses/' +templateData['fileName'] + '.o'
+        sourceFile ='ieClasses/' + templateData['fileName'] + '.cpp'
+        xlUtils.addToMakeSo('gtpV2Stack.so',objectFile,sourceFile)
+       
+    def ieFactoryTemplate(self,ieFactoryData):
+        
+        ieFactoryData['fileName']='gtpV2IeFactory'
+        ttFileNameFactoryCpp = 'tts/iefactorytemplate.cpp.tt'
+        outputDir = '../../src/gtpV2Codec/ieClasses'
+        ttFileNamefactoryH = 'tts/iefactorytemplate.h.tt'
+        xlUtils.templateProcess(ieFactoryData,ttFileNameFactoryCpp,ttFileNamefactoryH,outputDir,outputDir)
+        
+    def generateIeFactory(self,currentType):
+        ieinfo = {}
+        ieinfo['className'] = currentType + 'Ie'
+        ieinfo['ieFileName'] = currentType[0].lower()+currentType[1:] + 'Ie'
+        if ieinfo not in ieFactoryData['ieList']:
+            ieFactoryData['ieList'].append(ieinfo)
+        outputDir = 'ieClasses/'
+        self.ieFactoryTemplate(ieFactoryData)
+        xlUtils.addToMakeSo('gtpV2Stack.so',outputDir+'gtpV2IeFactory.o',outputDir+'gtpV2IeFactory.cpp')
+        
+    def generateIeDataType(self,currentType,typeVal,varList):
+        ieinfo = {}
+        ieTypeInfo={}    
+        ieinfo['ieName'] = currentType + 'IeData'
+        ieinfo['varList'] = varList
+        ieTypeInfo['ieName']=currentType + 'IeType'
+        ieTypeInfo['value']=typeVal
+        if ieinfo not in ieDataTypeData['ieList']:
+            ieDataTypeData['ieList'].append(ieinfo)
+        if ieTypeInfo not in ieDataTypeData['ieTypeList']:
+            ieDataTypeData['ieTypeList'].append(ieTypeInfo)
+        #print(ieDataTypeData)
+        template = Template()
+        ttFileNamefactoryH = 'tts/ieDataTypetemplate.h.tt'
+        outputDir = '../../src/gtpV2Codec/ieClasses'
+        
+        if not os.path.exists(outputDir):
+            os.makedirs(outputDir)
+        outputFileName = 'gtpV2IeDataTypes.h'
+        template.__init__({'OUTPUT' : outputFileName, 'OUTPUT_PATH' : outputDir})
+        template.process(ttFileNamefactoryH, {'tempdata' : ieDataTypeData})
+        
+    def prepareIeMakeFile(self):
+        outputDir = 'ieClasses/'
+        xlUtils.addToMakeSo('gtpV2Stack.so', outputDir+'dataTypeCodecUtils.o', outputDir+'dataTypeCodecUtils.cpp')
+        xlUtils.addToMakeSo('gtpV2Stack.so', outputDir+'manual/gtpV2Ie.o', outputDir+'manual/gtpV2Ie.cpp')
+        
+GenerateIeClass()
diff --git a/scripts/GtpV2StackCodeGen/msgCodeGen.py b/scripts/GtpV2StackCodeGen/msgCodeGen.py
new file mode 100644
index 0000000..cfa7281
--- /dev/null
+++ b/scripts/GtpV2StackCodeGen/msgCodeGen.py
@@ -0,0 +1,267 @@
+# Copyright 2019-present Infosys Limited     
+# SPDX-License-Identifier: Apache-2.0
+
+
+import re
+
+import os
+from template import Template
+
+
+from xlUtils import xlUtils,wb
+msgFactoryData = {}
+msgFactoryData['msgList'] = []
+msgDataTypeData = {}
+msgDataTypeData['msgTypeList'] = []
+msgDataTypeData['msgList'] = []
+class GenerateMsgClass():
+    def __init__( self ):
+        self.msgParser()
+    
+    def msgParser(self):
+        
+        sheet = wb['Message Modeling']
+        state = ''
+        ieDetailList = []
+        ieList = []
+        
+        currentMessage = ''
+        msgValue = 0
+        msgData = {}
+        
+        
+        for i in range(1,sheet.max_row+1):
+            
+            cell_value_B = xlUtils.getCellValue(sheet,i,'B')
+            
+            mMsgDefinitionStart = re.search('Message Definition Start:(\w+):(\d+)',str(cell_value_B))
+            mMsgDefinitionEnd = re.search('Message Definition End:(\w+)',str(cell_value_B))
+            mResponseMsg = re.search('ResponseMessage',str(cell_value_B))
+            mGrouped = re.search('Grouped',str(cell_value_B))
+            
+            
+            if mMsgDefinitionStart:
+                
+                
+                state = 'StartDetected'
+                currentMessage = mMsgDefinitionStart.group(1)
+                msgValue = mMsgDefinitionStart.group(2)
+               
+                
+            if mMsgDefinitionEnd:
+                
+                ieList = []
+                ieDetailList = []
+                state = 'EndDetected'
+                
+                GenerateMsgClass.templateIes(msgData,currentMessage)
+                GenerateMsgClass.generateMsgFactory(msgData,currentMessage)
+                GenerateMsgClass.generateMsgDataType(msgData,currentMessage)
+                GenerateMsgClass.prepareMsgMakeFile()
+                
+            elif state == 'StartDetected':
+                
+                msgData['msgDetails'] = {}
+                msgData['msgDetails'][currentMessage] = {}
+                msgData['msgDetails'][currentMessage]['msgValue'] = msgValue
+                msgData['msgDetails'][currentMessage]['msgDataType'] = currentMessage + 'MsgData'
+                msgData['msgDetails'][currentMessage]['msgCategory'] = "RequestMessage"
+                if mResponseMsg:
+                    
+                    msgData['msgDetails'][currentMessage]['msgCategory'] = "ResponseMessage"
+                elif mGrouped:
+                    state = 'IeListStart'
+                
+                
+                    
+            elif state == 'IeListStart':
+                
+                if xlUtils.getCellValue(sheet,i,'D') != None:
+                    
+                    ieDescription  = xlUtils.getCellValue(sheet,i,'D')
+                    presence = xlUtils.getCellValue(sheet,i,'E')
+                    grouped = xlUtils.getCellValue(sheet,i,'B')
+                    cardinality = xlUtils.getCellValue(sheet,i,'C')
+                    instance = xlUtils.getCellValue(sheet,i,'H')
+                    msgData['ieDetails'] = {}
+                    msgData['ieDetails'][ieDescription] = {}
+                    msgData['ieDetails'][ieDescription]['ieDescription'] = ieDescription
+                    msgData['ieDetails'][ieDescription]['presence'] = presence
+                    msgData['ieDetails'][ieDescription]['grouped'] = grouped
+                    msgData['ieDetails'][ieDescription]['cardinality'] = cardinality
+                    msgData['ieDetails'][ieDescription]['instance'] = instance
+                    
+                    if msgData['ieDetails'][ieDescription]['cardinality'] is None:
+                        msgData['ieDetails'][ieDescription]['cardinality'] = 1
+                    ieTypeDescription = xlUtils.getCellValue(sheet,i,'G')
+                    msgData['ieDetails'][ieDescription]['ieTypeDescription'] = ieTypeDescription
+                    
+                    ieVarName = xlUtils.getVarNameFromString(ieDescription,0)
+                    ieTypeName  = xlUtils.getVarNameFromString(ieTypeDescription,1)
+                    ieVarName = ieVarName.replace('/','')
+                    
+                    msgData['ieDetails'][ieDescription]['ieGroupTypeName'] = ''
+                    if msgData['ieDetails'][ieDescription]['grouped'] == 'Yes':
+                        msgData['ieDetails'][ieDescription]['ieGroupTypeName'] = ieVarName + 'In' + currentMessage
+                    msgData['ieDetails'][ieDescription]['ieVarName'] = ieVarName
+                    msgData['ieDetails'][ieDescription]['ieTypeName'] = ieTypeName      
+                               
+                    if ieVarName!="privateExtension":
+                        ieDetailList.append(msgData['ieDetails'])
+                        
+                        ieList.append(ieVarName)
+                    msgData['ieList'] = ieList
+                    msgData['ieDetails'] = ieDetailList
+                      
+        return msgData
+    
+    
+    def templateIes(msgData,currentMessage):
+        templateData = dict()
+        ieListTemplate = []
+        ieTypeTemplate = []
+        ieTypeDetailList = []
+        ieTypeList = []
+        templateData['fileName'] = currentMessage[0].lower()+currentMessage[1:] + 'Msg'
+        templateData['msgClassName'] = currentMessage[0].upper()+currentMessage[1:] + 'Msg'
+        templateData['classNameUC'] = templateData['fileName'].upper()
+        templateData['msgCategory'] = msgData['msgDetails'][currentMessage]['msgCategory']
+        
+        for ieDetail in msgData['ieDetails']:
+            for key,value in ieDetail.items():
+                for ie in msgData['ieList']:
+                    ieInfo = {}
+                    ieTypeInfo = {}
+                    if value['ieVarName'] == ie:
+
+                        ieInfo['ieName'] = value['ieVarName']
+                        ieInfo['ieVarName'] = value['ieVarName']
+                        ieInfo['ieType'] = value['ieTypeName']
+                        ieInfo['ieFileName'] = value['ieTypeName'][0].lower()+value['ieTypeName'][1:] + 'Ie'
+                        ieInfo['ieLocalVar'] = value['ieTypeName'][0].lower()+value['ieTypeName'][1:]
+                        ieInfo['iePresence'] = value['presence']
+                        ieInfo['ieCardinality'] = value['cardinality']
+                        ieInfo['instance'] = value['instance']
+                        ieInfo['grouped'] = value['grouped']
+                        ieInfo['grpIeInstClassName'] = value['ieGroupTypeName']
+                        if ieInfo['grouped']=='Yes':
+                            ieInfo['grpIeInstClassName'] = value['ieGroupTypeName'][0].upper()+value['ieGroupTypeName'][1:]
+                        ieInfo['grpIeInstFileName'] = value['ieGroupTypeName']
+                        
+                        ieType = ieInfo['ieType']
+                        ieTypeInfo['ieName'] = value['ieVarName']
+                        ieTypeInfo['ieVarName'] = value['ieVarName']
+                        ieTypeInfo['ieType'] = value['ieTypeName']
+                        ieTypeInfo['ieFileName'] = value['ieTypeName'][0].lower()+value['ieTypeName'][1:] + 'Ie'
+                        ieTypeInfo['ieLocalVar'] = value['ieTypeName'].capitalize()
+                        ieTypeInfo['iePresence'] = value['presence']
+                        ieTypeInfo['ieCardinality'] = value['cardinality']
+                        ieTypeInfo['instance'] = value['instance']
+                        ieTypeInfo['grouped'] = value['grouped']
+                        ieTypeInfo['grpIeInstClassName'] = value['ieGroupTypeName']
+                        if ieTypeInfo['grouped']=='Yes':
+                            ieTypeInfo['grpIeInstClassName'] = value['ieGroupTypeName'][0].upper()+value['ieGroupTypeName'][1:]
+                        ieTypeInfo['grpIeInstFileName'] = value['ieGroupTypeName'].capitalize()
+                        
+                       
+                        ieListTemplate.append(ieInfo)
+                        templateData['ieList'] = ieListTemplate
+                       
+                        if ieInfo['ieType'] not in ieTypeList:   
+                            ieTypeList.append(ieInfo['ieType'])
+                            templateData['ieTypeList'] = ieTypeList
+                            
+                        ieTypeTemplate = []
+                        ieTypeTemplate.append(ieTypeInfo)
+                        templateData['ieTypeDetails'] = {}   
+                        templateData['ieTypeDetails'][ieType] = ieTypeTemplate
+                        
+                        ieTypeDetailList.append(templateData['ieTypeDetails'])
+                        templateData['ieTypeDetails'] = ieTypeDetailList
+        
+        outputDir = '../../src/gtpV2Codec/msgClasses'
+        ttFileNameCpp = 'tts/msgtemplate.cpp.tt'
+        ttFileNameH = 'tts/msgtemplate.h.tt'
+        xlUtils.templateProcess(templateData,ttFileNameCpp,ttFileNameH,outputDir,outputDir)
+        
+        objectFile = 'msgClasses/' +templateData['fileName'] + '.o'
+        sourceFile = 'msgClasses/' + templateData['fileName'] + '.cpp'
+        xlUtils.addToMakeSo('gtpV2Stack.so',objectFile,sourceFile)
+       
+    def generateMsgFactory(msgData,currentMessage):
+        msgInfo = {}
+        
+        msgInfo['className'] = currentMessage + 'Msg'
+        msgInfo['msgFileName'] = currentMessage[0].lower()+currentMessage[1:] + 'Msg'
+        msgInfo['dataMember'] = currentMessage[0].lower()+currentMessage[1:] + 'StackData'
+        if msgInfo not in msgFactoryData['msgList']:
+            msgFactoryData['msgList'].append(msgInfo)
+        outputDirCpp = 'msgClasses/'
+        GenerateMsgClass.msgfactoryStacktemplate(msgFactoryData)
+        xlUtils.addToMakeSo('gtpV2Stack.so',outputDirCpp+'gtpV2MsgFactory.o',outputDirCpp+'gtpV2MsgFactory.cpp')
+        xlUtils.addToMakeSo('gtpV2Stack.so','gtpV2Stack.o','gtpV2Stack.cpp')
+        
+    def msgfactoryStacktemplate(msgFactoryData):
+ 
+        ttFileNamefactoryCpp = 'tts/msgfactorytemplate.cpp.tt'
+        outputDir = '../../src/gtpV2Codec/msgClasses'   
+        msgFactoryData['fileName'] = 'gtpV2MsgFactory'
+        ttFileNamefactoryH = 'tts/msgfactorytemplate.h.tt'
+        xlUtils.templateProcess(msgFactoryData,ttFileNamefactoryCpp,ttFileNamefactoryH,outputDir,outputDir)
+        
+        ttFileNameStackCpp = 'tts/stacktemplate.cpp.tt'
+        outputDir = '../../src/gtpV2Codec/'
+        msgFactoryData['fileName'] = 'gtpV2Stack' 
+        ttFileNameStackH = 'tts/stacktemplate.h.tt'
+
+        xlUtils.templateProcess(msgFactoryData,ttFileNameStackCpp,ttFileNameStackH,outputDir,outputDir)
+        
+        
+      
+    def prepareMsgMakeFile():
+        outputDir = 'msgClasses/manual/'
+        xlUtils.addToMakeSo('gtpV2Stack.so', outputDir+'gtpV2Message.o', outputDir+'gtpV2Message.cpp')
+    def generateMsgDataType(msgData,currentMessage):
+        msginfo = {}
+        msgTypeInfo={}    
+        msginfo['msgDataName'] = currentMessage + 'MsgData'
+        msginfo['ieDetails']=[]
+        msgTypeInfo['msgDataType']=currentMessage + 'MsgType'
+        msgTypeInfo['msgValue']=msgData['msgDetails'][currentMessage]['msgValue']
+        
+        if  msgTypeInfo not in msgDataTypeData['msgTypeList']:
+            msgDataTypeData['msgTypeList'].append(msgTypeInfo)
+        
+        for ieDetail in msgData['ieDetails']:
+            for key,value in ieDetail.items():
+                for ie in msgData['ieList']:
+                    ieInfo = {}
+                    
+                    if value['ieVarName'] == ie:
+                        ieInfo['ieName'] = value['ieVarName']
+                        ieInfo['ieVarName'] = value['ieVarName']
+                        ieInfo['ieType'] = value['ieTypeName']
+                        ieInfo['iePresence'] = value['presence']
+                        ieInfo['ieCardinality'] = value['cardinality']
+                        ieInfo['grouped'] = value['grouped']
+                        ieInfo['grpIeInstClassName'] = value['ieGroupTypeName']
+                        if ieInfo['grouped']=='Yes':
+                            ieInfo['grpIeInstClassName'] = value['ieGroupTypeName'][0].upper()+value['ieGroupTypeName'][1:]
+                        ieInfo['grpIeInstFileName'] = value['ieGroupTypeName']
+                        if ieInfo not in msginfo['ieDetails']:
+                            msginfo['ieDetails'].append(ieInfo)
+        if msginfo not in msgDataTypeData['msgList']:
+            msgDataTypeData['msgList'].append(msginfo)
+                        
+        template = Template()
+        ttFileNamefactoryH = 'tts/msgDataTypetemplate.h.tt'
+        outputDir = '../../src/gtpV2Codec/msgClasses'
+        
+        if not os.path.exists(outputDir):
+            os.makedirs(outputDir)
+        outputFileName = 'gtpV2MsgDataTypes.h'
+        template.__init__({'OUTPUT' : outputFileName, 'OUTPUT_PATH' : outputDir})
+        template.process(ttFileNamefactoryH, {'tempdata' : msgDataTypeData})
+    
+        
+GenerateMsgClass()
\ No newline at end of file
diff --git a/scripts/GtpV2StackCodeGen/startCodeGen.py b/scripts/GtpV2StackCodeGen/startCodeGen.py
new file mode 100644
index 0000000..a3a2a27
--- /dev/null
+++ b/scripts/GtpV2StackCodeGen/startCodeGen.py
@@ -0,0 +1,16 @@
+
+# Copyright 2019-present Infosys Limited     
+# SPDX-License-Identifier: Apache-2.0   
+
+from iECodeGen import GenerateIeClass
+from datatypeCodeGen import GenerateDataTypeClass
+from xlUtils import xlUtils
+from msgCodeGen import GenerateMsgClass
+from groupedIECodeGen import GenerateGrpIeClass
+
+GenerateIeClass()
+GenerateDataTypeClass()
+GenerateMsgClass()
+GenerateGrpIeClass()
+
+xlUtils.generateMakeFile()
diff --git a/scripts/GtpV2StackCodeGen/tts/datatypetemplate.cpp.tt b/scripts/GtpV2StackCodeGen/tts/datatypetemplate.cpp.tt
new file mode 100644
index 0000000..14d1288
--- /dev/null
+++ b/scripts/GtpV2StackCodeGen/tts/datatypetemplate.cpp.tt
@@ -0,0 +1,395 @@
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+
+/******************************************************************************
+ *
+ * This is 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 "[% tempdata.fileName %].h"
+
+// TODO
+
+[% tempdata.className %]::[% tempdata.className %]()
+{
+    // TODO
+}
+
+[% tempdata.className %]::~[%tempdata.className %]() {
+    // TODO Auto-generated destructor stub
+}
+
+[% FOREACH type IN tempdata.DataTypeListAuto %]
+bool [%tempdata.className %]::encode[% type.typeName %](MsgBuffer &buffer, [% type.typeName %] const &data)
+{
+[% IF type.validationPresent == "y" -%]
+    if (!([% type.validationRule %]))
+    {
+        errorStream.add((char *)"Data validation failure: [% type.typeName %]\n"); 
+        return false; //TODO need to add validations
+    }
+[% END -%]   
+[% FOREACH Item IN type.sequence -%]
+[% IF Item.skipType == "y" -%]
+    buffer.skip[% Item.bitByte %]([% Item.skipValue %]);
+
+[% ELSE -%]
+[% IF Item.presence == "optional" -%]
+    if (data.[% Item.fieldName %]Present)
+    {
+
+[% IF Item.encodeConditional == "y" -%]
+        if ([% Item.encodeCondition %])
+        {
+
+[% IF Item.validationPresent == "y" -%]
+            if (!([% Item.validationRule %]))
+            {
+                errorStream.add((char *)"Data validation failure: [% Item.fieldName %]\n"); 
+                return false; //TODO need to add validations
+            }
+[% END -%]
+[% IF Item.leafType == "y" -%]
+[% IF Item.bitField == "y" -%]
+            buffer.writeBits(data.[% Item.fieldName %], [% Item.fieldSize %]);
+[% ELSE -%]
+            buffer.write[% Item.fieldType %](data.[% Item.fieldName %]);
+[% END -%]
+[% ELSE -%]
+            if (!(DataTypeCodecUtils::encode[% Item.fieldType %](buffer, data.[% Item.fieldName %])))
+            {
+                errorStream.add((char *)"Failed to encode [% Item.fieldName %]\n");
+                return false;
+            }
+[% END -%]
+
+        }
+    }
+[% ELSE -%]
+[% IF Item.leafType == "y" -%]
+[% IF Item.bitField == "y" -%]
+        buffer.writeBits(data.[% Item.fieldName %], [% Item.fieldSize %]);
+[% ELSE -%]
+        buffer.write[% Item.fieldType %](data.[% Item.fieldName %]);
+[% END -%]
+[% ELSE -%]
+        if (!(DataTypeCodecUtils::encode[% Item.fieldType %](buffer, data.[% Item.fieldName %])))
+        {
+            errorStream.add((char *)"Failed to encode [% Item.fieldName %]\n");
+            return false;
+        }
+
+[% END -%]
+    }
+[% END -%]
+[% ELSE -%]
+[% IF Item.encodeConditional == "y" -%]
+    if ([% Item.encodeCondition %])
+    {
+[% IF Item.validationPresent == "y" -%]
+        if (!([% Item.validationRule %]))
+        {    
+            errorStream.add((char *)"Data validation failure: [% Item.fieldName %]\n"); 
+            return false; //TODO need to add validations
+        }
+[% END -%]
+[% IF Item.leafType == "y" -%]
+[% IF Item.bitField == "y" -%]
+        buffer.writeBits(data.[% Item.fieldName %], [% Item.fieldSize %]);
+[% ELSE -%]
+        buffer.write[% Item.fieldType %](data.[% Item.fieldName %]);
+[% END -%]
+[% ELSE -%]
+        if (!(DataTypeCodecUtils::encode[% Item.fieldType %](buffer, data.[% Item.fieldName %])))
+        {
+            errorStream.add((char *)"Failed to encode [% Item.fieldName %]\n");
+            return false;
+        }
+
+[% END -%]
+    }
+
+[% ELSE -%]
+[% IF Item.validationPresent == "y" -%]
+    if (!([% Item.validationRule %]))
+    {
+         errorStream.add((char *)"Data validation failure: [% Item.fieldName %]\n"); 
+         return false; //TODO need to add validations
+    }
+[% END -%]
+[% IF Item.leafType == "y" -%]
+[% IF Item.bitField == "y" -%]
+    buffer.writeBits(data.[% Item.fieldName %], [% Item.fieldSize %]);
+[% ELSE -%]
+    buffer.write[% Item.fieldType %](data.[% Item.fieldName %]);
+[% END -%]
+[% ELSE -%]
+    if (!(DataTypeCodecUtils::encode[% Item.fieldType %](buffer, data.[% Item.fieldName %])))
+    {
+        errorStream.add((char *)"Failed to encode [% Item.fieldName %]\n");
+        return false;
+    }
+
+[% END -%]
+[% END -%]
+[% END -%]
+[% END -%]
+[% END -%]
+    return true;
+}
+
+bool [%tempdata.className %]::decode[% type.typeName %](MsgBuffer &buffer,[% type.typeName %] &data,
+                         Uint16 length)
+{
+    
+    Uint16 typeBoundary = buffer.getCurrentIndex() + length;
+[% FOREACH Item IN type.sequence -%]
+[% IF Item.skipType == "y" -%]
+    buffer.skip[% Item.bitByte %]([% Item.skipValue %]);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond type boundary: [% Item.fieldName %]\n");
+        return false;
+    }
+[% ELSE -%]
+[% IF Item.decodeConditional == "y" %]
+    if ([% Item.decodeCondition %])
+    {
+
+[% IF Item.leafType == "y" -%]
+[% IF Item.bitField == "y" -%]
+        data.[% Item.fieldName %] = buffer.readBits([% Item.fieldSize %]);
+        if (buffer.getCurrentIndex() > typeBoundary)
+        {
+            errorStream.add((char *)"Attempt to read beyond type boundary: [% Item.fieldName %]\n");
+            return false;
+        }
+[% ELSE %]
+        buffer.read[% Item.fieldType %](data.[% Item.fieldName %]);
+        if (buffer.getCurrentIndex() > typeBoundary)
+        {
+            errorStream.add((char *)"Attempt to read beyond type boundary: [% Item.fieldName %]\n");
+            return false;
+        }
+[% END -%]
+[% ELSE -%]
+[% IF Item.length == "lengthLeft" -%]
+        Uint16 lengthLeft = typeBoundary - buffer.getCurrentIndex();
+[% END -%]
+[% IF Item.arrayType == "y" -%]
+        if (!(DataTypeCodecUtils::decode[% Item.fieldType %](buffer, data.[% Item.fieldName %], [% Item.length %], [% Item.count %])))
+[% ELSE -%]
+        if (!(DataTypeCodecUtils::decode[% Item.fieldType %](buffer, data.[% Item.fieldName %], [% Item.length %])))
+[% END -%]
+        {
+            errorStream.add((char *)"Failed to decode: [% Item.fieldName %]\n");
+            return false;
+        }
+[% END -%]
+[% IF Item.validationPresent == "y" -%]
+        if (!([% Item.validationRule %]))
+        {
+            errorStream.add((char *)"Data validation failure: [% Item.fieldName %]\n");
+            return false; //TODO need to add validations
+        }
+[% END -%]
+[% IF Item.presence == "optional" -%]
+        data.[% Item.fieldName %]Present = true;
+[% END -%]
+
+    }
+[% ELSE -%]
+[% IF Item.leafType == "y" -%]
+[% IF Item.bitField == "y" -%]
+    data.[% Item.fieldName %] = buffer.readBits([% Item.fieldSize %]);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: [% Item.fieldName %]\n");
+         return false;
+    }
+[% ELSE %]
+    buffer.read[% Item.fieldType %](data.[% Item.fieldName %]);
+    if (buffer.getCurrentIndex() > typeBoundary)
+    {
+         errorStream.add((char *)"Attempt to read beyond type boundary: [% Item.fieldName %]\n");
+         return false;
+    }
+[% END -%]
+[% ELSE -%]
+[% IF Item.length == "lengthLeft" -%]
+ Uint16   lengthLeft = typeBoundary - buffer.getCurrentIndex();
+[% END -%]
+[% IF Item.arrayType == "y" -%]
+    if (!(DataTypeCodecUtils::decode[% Item.fieldType %](buffer, data.[% Item.fieldName %], [% Item.length %], [% Item.count %])))
+[% ELSE -%]
+    if (!(DataTypeCodecUtils::decode[% Item.fieldType %](buffer, data.[% Item.fieldName %], [% Item.length %])))
+[% END -%]
+    {
+        errorStream.add((char *)"Failed to decode: [% Item.fieldName %]\n");
+        return false;
+    }
+[% END -%]
+[% IF Item.validationPresent == "y" -%]
+    if (!([% Item.validationRule %]))
+    {
+         errorStream.add((char *)"Data validation failure: [% Item.fieldName %]\n");
+         return false; //TODO need to add validations
+    }
+[% END -%]
+[% IF Item.presence == "optional" -%]
+    data.[% Item.fieldName %]Present = true;
+[% END -%]
+[% END -%]
+[% END -%]
+[% END -%]
+
+[% IF validationPresent == "y" -%]
+    if (!([% validationRule %]))
+    {
+        errorStream.add((char *)"Data validation failure at IE: [%tempdata.className %]\n");
+        return false;
+    }
+[% END -%]
+  return true;
+}
+
+void [%tempdata.className %]::display[% type.typeName %]_v([% type.typeName %] const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"[% type.typeName %]:");
+    stream.incrIndent();
+    stream.endOfLine();
+[% FOREACH Item IN type.sequence -%]
+[% IF Item.skipType != "y" -%]
+[% IF Item.presence == "optional" -%]
+    if (data.[% Item.fieldName %]Present)
+    {
+[% IF Item.encodeConditional == "y" %]
+        if ([% Item.encodeCondition %])
+        {
+[% IF Item.leafType == "y" -%]
+            stream.add((char *)"[% Item.fieldName %] = ");
+            stream.add(data.[% Item.fieldName %]);
+            stream.endOfLine();
+[% ELSE -%]
+            DataTypeCodecUtils::display[% Item.fieldType %]_v(data.[% Item.fieldName %], stream);  
+[% END -%]
+        }
+    }
+[%ELSE-%]
+[% IF Item.leafType == "y" -%]
+        stream.add((char *)"[% Item.fieldName %] = ");
+        stream.add(data.[% Item.fieldName %]);
+        stream.endOfLine();
+[% ELSE -%]
+         DataTypeCodecUtils::display[% Item.fieldType %]_v(data.[% Item.fieldName %], stream);
+[% END -%]
+    }
+
+[% END -%]
+[% ELSE -%]
+[% IF Item.encodeConditional == "y" %]
+    if ([% Item.encodeCondition %])
+    {
+[% IF Item.leafType == "y" -%]
+        stream.add((char *)"[% Item.fieldName %] = ");
+        stream.add(data.[% Item.fieldName %]);
+        stream.endOfLine();
+[% END -%]
+    }
+[%ELSE-%]
+[% IF Item.leafType == "y" -%]
+    stream.add((char *)"[% Item.fieldName %] = ");
+    stream.add(data.[% Item.fieldName %]);
+    stream.endOfLine();
+[% END -%]
+[% END -%]    
+[% END -%]
+[% END -%]
+[% END -%]
+    stream.decrIndent();
+    stream.decrIndent();
+}
+[% END %]
+
+[% FOREACH arrayType IN tempdata.arrayTypeList %]
+bool [%tempdata.className %]::encode[% arrayType.typeName %](MsgBuffer &buffer,
+ [% arrayType.typeName %] const &data)
+{
+    Uint16 i;
+    for (i = 0; i < data.count; i++)
+    {
+[% IF arrayType.leafType == "y" -%]
+        buffer.write[% arrayType.subType %](data.values[i]);
+[% ELSE -%]
+        if (!(DataTypeCodecUtils::encode[% arrayType.subType %](buffer, data.values[i])))
+        {
+            errorStream.add((char *)"Failed to encode [% arrayType.typeName %]\n");
+            return false;
+        }
+[% END -%]
+    }
+    return true;
+}
+
+bool [%tempdata.className %]::decode[% arrayType.typeName %](MsgBuffer &buffer,
+ [% arrayType.typeName %] &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)))
+    {
+[% IF arrayType.leafType == "y" -%]
+        buffer.read[% arrayType.subType %](data.values[i]);
+[% ELSE -%]
+        Uint16 lengthLeft = typeBoundary - buffer.getCurrentIndex();
+        [% IF arrayType.arrayType == "y" -%]
+         if (!(DataTypeCodecUtils::decode[% arrayType.subType %](buffer, data.values[i], lengthLeft, data.count)))
+         [% ELSE -%]
+         if (!(DataTypeCodecUtils::decode[% arrayType.subType %](buffer, data.values[i], lengthLeft)))
+         [% END -%]
+        
+        {
+            errorStream.add((char *)"Failed to encode [% arrayType.typeName %]\n");
+            return false;
+        }
+[% END -%]
+        if (buffer.getCurrentIndex() > typeBoundary)
+        {
+            errorStream.add((char *)"Attempt to read beyond type boundary:[% arrayType.typeName %]\n");
+            return false;
+        }
+        data.count++;
+        i++;
+    }
+	return true;
+}
+
+void [%tempdata.className %]::display[% arrayType.typeName %]_v([% arrayType.typeName %] const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"[% arrayType.typeName %]: Count: ");
+    stream.add(data.count);
+    stream.incrIndent();
+    stream.endOfLine();
+[% IF arrayType.leafType == "y" -%]    
+    Uint16 i;
+    for (i = 0; i < data.count; i++)
+    {
+        stream.add(data.values[i]);
+        stream.endOfLine();     
+    }
+[% END -%]
+    stream.decrIndent();
+    stream.decrIndent();
+}
+[% END %]
\ No newline at end of file
diff --git a/scripts/GtpV2StackCodeGen/tts/datatypetemplate.h.tt b/scripts/GtpV2StackCodeGen/tts/datatypetemplate.h.tt
new file mode 100644
index 0000000..a1fbf4b
--- /dev/null
+++ b/scripts/GtpV2StackCodeGen/tts/datatypetemplate.h.tt
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ /******************************************************************************
+ *
+ * This is 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 [% tempdata.classNameUC %]_H_
+#define [% tempdata.classNameUC %]_H_
+
+#include <sstream>
+#include <msgBuffer.h>
+#include "gtpV2IeDataTypes.h"
+#include "gtpV2DataTypes.h"
+#include "manual/gtpV2DataTypes_Manual.h"
+
+//TODO Includes
+
+class DataTypeCodecUtils {
+public:
+    [% tempdata.className %]();
+    virtual ~[% tempdata.className %]();
+
+[% FOREACH type IN tempdata.DataTypeListAuto %]
+    static bool encode[% type.typeName %](MsgBuffer &buffer, [% type.typeName %] const &data);
+    static bool decode[% type.typeName %](MsgBuffer &buffer, [% type.typeName %] &data,
+                 Uint16 length);
+    static void display[% type.typeName %]_v([% type.typeName %] const &data, Debug &stream);
+[% END %]
+
+    // The following methods are generated to encode, decode and display array types
+[% FOREACH arrayType IN tempdata.arrayTypeList %]
+    static bool encode[% arrayType.typeName %](MsgBuffer &buffer, [% arrayType.typeName %] const &data);
+    static bool decode[% arrayType.typeName %](MsgBuffer &buffer, [% arrayType.typeName %] &data,
+                 Uint16 length, Uint16 count);
+    static void display[% arrayType.typeName %]_v([% arrayType.typeName %] const &data, Debug &stream);
+
+[% END -%]
+
+    // The following methods are to be written manually
+    // See DataTypeCodecUtils_Manual.cc for implementation
+[% FOREACH type IN tempdata.DataTypeListManual %]
+    static bool encode[% type.typeName %](MsgBuffer &buffer, [% type.typeName %] const &data);
+    static bool decode[% type.typeName %](MsgBuffer &buffer, [% type.typeName %] &data,
+                 Uint16 length);
+    static void display[% type.typeName %]_v([% type.typeName %] const &data, Debug &stream);
+[% END %]
+         
+};
+
+#endif /*[% tempdata.classNameUC %]_H_*/
\ No newline at end of file
diff --git a/scripts/GtpV2StackCodeGen/tts/grpIeDataTypetemplate.h.tt b/scripts/GtpV2StackCodeGen/tts/grpIeDataTypetemplate.h.tt
new file mode 100644
index 0000000..55943ca
--- /dev/null
+++ b/scripts/GtpV2StackCodeGen/tts/grpIeDataTypetemplate.h.tt
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ /******************************************************************************
+ *
+ * This is 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"
+
+[% FOREACH grpIe IN tempdata.grpList -%]
+typedef struct
+{
+[% FOREACH iePresence IN grpIe.iePresenceList -%]
+    bool [% iePresence %];    
+[% END -%]
+
+[% FOREACH ie IN grpIe.ieList -%]
+    [% ie.ieTypeName %] [% ie.ieVarName %];    
+[% END -%]
+
+}[% grpIe.grpIeName %];
+
+[% END -%]
+
+//Ie Type Constants
+[% FOREACH ie IN tempdata.grpTypeList -%]
+static const  Uint8  [% ie.grpIeTypeName %] = [% ie.grpIeTypeValue %];    
+[% END -%]
+
+
+#endif 
\ No newline at end of file
diff --git a/scripts/GtpV2StackCodeGen/tts/grpieinsttemplate.cpp.tt b/scripts/GtpV2StackCodeGen/tts/grpieinsttemplate.cpp.tt
new file mode 100644
index 0000000..60935b4
--- /dev/null
+++ b/scripts/GtpV2StackCodeGen/tts/grpieinsttemplate.cpp.tt
@@ -0,0 +1,261 @@
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */ 
+
+/******************************************************************************
+ *
+ * This is 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 "[% tempdata.fileName %].h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2IeFactory.h"
+[% FOREACH ieData IN tempdata.ieList -%]
+#include "[% ieData.ieFileName %].h"
+[% END -%]
+
+[% tempdata.msgClassName %]::
+[% tempdata.msgClassName %]()
+{
+[% PROCESS MandIeList %]
+}
+
+[% tempdata.msgClassName %]::
+~[% tempdata.msgClassName %]()
+{
+
+}
+bool [% tempdata.msgClassName %]::
+encode[% tempdata.msgClassName %](MsgBuffer &buffer,
+                         [% tempdata.msgClassName %]Data
+                          const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+[% FOREACH ieData IN tempdata.ieList -%]
+
+[% IF ieData.iePresence != 'M' -%]
+    if (data.[% ieData.ieVarName %]IePresent)
+    {
+        [% INCLUDE tts/msgEncode.tt FILTER indent%]
+        if (!(rc))
+        {
+          errorStream.add((char *)"Failed to encode IE: [% ieData.ieVarName %]\n");
+          return false;
+        }
+    }
+[% ELSE %]
+    [% INCLUDE tts/msgEncode.tt -%]
+    if (!(rc))
+    {
+        errorStream.add((char *)"Failed to encode IE: [% ieData.ieVarName %]\n");
+        return false;
+    }
+[% END -%]
+[% END -%]
+    return rc;
+}
+
+bool [% tempdata.msgClassName %]::
+decode[% tempdata.msgClassName %](MsgBuffer &buffer,
+                         [% tempdata.msgClassName %]Data 
+                         &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){
+[% FOREACH ieTypeEntry IN tempdata.ieTypeList -%]
+            case [% ieTypeEntry %]IeType:
+            {
+                [% ieTypeEntry %]Ie ieObject =
+                dynamic_cast<
+                [% ieTypeEntry %]Ie&>(GtpV2IeFactory::getInstance().
+                         getIeObject([% ieTypeEntry %]IeType));
+[% SET first = 1 -%]
+[% FOREACH ieTypeData IN tempdata.ieList -%]
+[% IF ieTypeData.ieType == ieTypeEntry -%] 
+
+[% IF first == 1 -%]
+[% SET first = 0 %]
+                if(ieHeader.instance == [% ieTypeData.instance %])
+[% ELSE -%]
+                else if(ieHeader.instance == [% ieTypeData.instance %])
+[% END -%]
+                {
+
+                [% INCLUDE tts/msgDecode.tt %]
+[% IF ieTypeData.ieCardinality == 1 %][% IF ieTypeData.iePresence != "M" -%]
+                    data.[% ieTypeData.ieVarName %]IePresent = true;
+[% END %][% END -%]
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: [% ieTypeData.ieVarName %]\n");
+                        return false;
+                    }
+[% IF ieTypeData.iePresence == 'M' -%]
+                    Uint16 mandIe = [% ieTypeEntry %]IeType;
+                    mandIe = (mandIe << 8) | [% ieTypeData.instance %];
+                    mandatoryIeLocalList.erase(mandIe);
+[% END -%]
+                }
+[% END -%]
+[% END -%] 
+                else
+                {
+                    // Unknown IE instance print error TODO
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+[% END -%]
+            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 [% tempdata.msgClassName %]::
+display[% tempdata.msgClassName %]Data_v
+([% tempdata.msgClassName %]Data const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"[% tempdata.msgClassName %]:");
+    stream.endOfLine();
+    stream.incrIndent();
+[% FOREACH ieData IN tempdata.ieList -%]
+
+[% IF ieData.iePresence != 'M' -%][% IF ieData.ieCardinality == 1 -%]
+    if (data.[% ieData.ieVarName %]IePresent)
+    {
+
+[% IF ieData.ieCardinality == 1 -%]
+        stream.add((char *)"[% ieData.ieVarName %]:");
+        stream.endOfLine();
+        [% ieData.ieType %]Ie [% ieData.ieLocalVar %]=
+        dynamic_cast<
+        [% ieData.ieType %]Ie&>(GtpV2IeFactory::getInstance().getIeObject([% ieData.ieType %]IeType));
+    [% PROCESS ieDisplay_grp %]
+[% ELSE -%]
+        for (Uint8 i = 0; i < data.[% ieData.ieVarName %]Count; i++)
+        {
+            stream.add((char *)"IE -  [% ieData.ieVarName %]:");
+            stream.endOfLine();
+            [% ieData.ieType %]Ie [% ieData.ieLocalVar %]=
+            dynamic_cast<[% ieData.ieType %]Ie&>(GtpV2IeFactory::getInstance().getIeObject([% ieData.ieType %]IeType));
+        [% PROCESS ieDisplay_grp %]
+        }
+[% END -%]
+    }
+[% ELSE -%]
+[% IF ieData.ieCardinality == 1 -%]
+    stream.add((char *)"[% ieData.ieVarName %]:");
+    stream.endOfLine();
+    [% ieData.ieType %]Ie [% ieData.ieLocalVar %]=
+    dynamic_cast<
+    [% ieData.ieType %]Ie&>(GtpV2IeFactory::getInstance().getIeObject([% ieData.ieType %]IeType));
+[% PROCESS ieDisplay_grp -%]
+[% ELSE -%]
+    for (Uint8 i = 0; i < data.[% ieData.ieVarName %]Count; i++)
+    {
+        stream.add((char *)"IE -  [% ieData.ieVarName %]:");
+        stream.endOfLine();
+        [% ieData.ieType %]Ie [% ieData.ieLocalVar %]=
+        dynamic_cast<[% ieData.ieType %]Ie&>(GtpV2IeFactory::getInstance().getIeObject([% ieData.ieType %]IeType));
+    [% PROCESS ieDisplay_grp -%]
+    }
+[% END -%]
+[% END %][% END -%]
+[% END -%]
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+
+[% BLOCK ieDisplay_grp -%]
+[% IF ieData.grouped == "Yes" -%]
+    [% ieData.grpIeInstClassName %] groupedIeInstance =
+    dynamic_cast<
+    [% ieData.grpIeInstClassName %]&>([% ieData.ieLocalVar %].getGroupedIe(msgType, [% ieData.instance %]));
+    groupedIeInstance.display[% ieData.grpIeInstClassName %]Data_v(data.[% ieData.ieVarName %][% PROCESS cardinalIndex %], stream);
+[% ELSE -%]
+    [% ieData.ieLocalVar %].display[% ieData.ieType %]Ie_v(data.[% ieData.ieVarName %][% PROCESS cardinalIndex %], stream);
+[% END -%]
+[% END -%]
+
+[% BLOCK cardinalIndex -%]
+[% IF ieData.ieCardinality != 1 %][i][% END -%]
+[% END -%]
+
+
+[% BLOCK MandIeList -%]
+[% SET first = 1 -%]
+[% FOREACH ieData IN tempdata.ieList -%]
+[% IF ieData.iePresence == 'M' -%]
+[% IF first == 1 -%]
+    Uint16 mandIe;
+[% SET first = 0 -%]
+[% END -%]
+    mandIe = [% ieData.ieType %]IeType;
+    mandIe = (mandIe << 8) | [% ieData.instance %]; // [% ieData.ieVarName %]
+    mandatoryIeSet.insert(mandIe);
+[% END -%]
+[% END -%]
+[% END -%]
\ No newline at end of file
diff --git a/scripts/GtpV2StackCodeGen/tts/grpieinsttemplate.h.tt b/scripts/GtpV2StackCodeGen/tts/grpieinsttemplate.h.tt
new file mode 100644
index 0000000..a1549e8
--- /dev/null
+++ b/scripts/GtpV2StackCodeGen/tts/grpieinsttemplate.h.tt
@@ -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 [% tempdata.classNameUC %]_H_
+#define [% tempdata.classNameUC %]_H_
+
+#include <set>
+#include <sstream>
+#include "manual/gtpV2GroupedIe.h"
+#include <msgBuffer.h>
+#include "gtpV2GrpIeDataTypes.h"
+#include "../msgClasses/gtpV2MsgDataTypes.h"
+
+class [% tempdata.msgClassName %]:public GtpV2GroupedIe
+{
+public:
+    [% tempdata.msgClassName %]();
+    virtual ~[% tempdata.msgClassName %]();
+    bool encode[% tempdata.msgClassName %](MsgBuffer &buffer,
+                             [% tempdata.msgClassName %]Data
+                              const &data);
+
+    bool decode[% tempdata.msgClassName %] (MsgBuffer &buffer,
+                             [% tempdata.msgClassName %]Data 
+                             & data, Uint16 length);
+
+    void display[% tempdata.msgClassName %]Data_v
+    ([% tempdata.msgClassName %]Data const &data,
+     Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/scripts/GtpV2StackCodeGen/tts/grpietemplate.cpp.tt b/scripts/GtpV2StackCodeGen/tts/grpietemplate.cpp.tt
new file mode 100644
index 0000000..9a68e5a
--- /dev/null
+++ b/scripts/GtpV2StackCodeGen/tts/grpietemplate.cpp.tt
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */ 
+
+/******************************************************************************
+ *
+ * This is 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 "[% tempdata.fileName %].h"
+#include "gtpV2GrpIeDataTypes.h"
+#include "manual/gtpV2GroupedIe.h"
+[%fileList =tempdata.fileName -%]
+
+[% FOREACH inst IN tempdata.$fileList -%]
+#include "[% inst.fileName %].h"
+[% END -%]
+
+[% tempdata.className %]::[% tempdata.className %]()
+{
+    ieType = [% tempdata.className %]Type;
+   
+[% FOREACH inst IN tempdata.$fileList -%]
+    [% inst.className %]* [% inst.fileName %]_p = new ([% inst.className %]);
+    insertGroupedIeObject([% inst.msgType %], [% inst.instance %], [% inst.fileName %]_p);
+[% END -%]
+}
+
+[% tempdata.className %]::~[% tempdata.className %]() {
+// TODO Auto-generated destructor stub
+}
+
+GtpV2GroupedIe& [% tempdata.className %]::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 [% tempdata.className %]::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/scripts/GtpV2StackCodeGen/tts/grpietemplate.h.tt b/scripts/GtpV2StackCodeGen/tts/grpietemplate.h.tt
new file mode 100644
index 0000000..f8105c5
--- /dev/null
+++ b/scripts/GtpV2StackCodeGen/tts/grpietemplate.h.tt
@@ -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 [% tempdata.classNameUC %]_H_
+#define [% tempdata.classNameUC %]_H_
+
+#include <map>
+#include "manual/gtpV2Ie.h"
+#include "manual/gtpV2GroupedIe.h"
+#include "gtpV2DataTypes.h"
+
+class [% tempdata.className %]:public GtpV2Ie
+{
+public:
+    [% tempdata.className %] ();
+    virtual ~ [% tempdata.className %] ();
+
+    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/scripts/GtpV2StackCodeGen/tts/ieDataTypetemplate.h.tt b/scripts/GtpV2StackCodeGen/tts/ieDataTypetemplate.h.tt
new file mode 100644
index 0000000..99b2c7b
--- /dev/null
+++ b/scripts/GtpV2StackCodeGen/tts/ieDataTypetemplate.h.tt
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ /******************************************************************************
+ *
+ * This is 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"
+
+[% FOREACH ie IN tempdata.ieList -%]
+typedef struct
+{
+[% FOREACH ieField IN ie.varList -%]
+[% IF ieField.presence == "optional" -%]
+    bool [% ieField.varName %]Present;
+[% END -%]
+    [% ieField.varType %] [% ieField.varName %];    
+[% END -%]
+
+}[% ie.ieName %];
+
+[% END -%]
+
+//Ie Type Constants
+[% FOREACH ie IN tempdata.ieTypeList -%]
+static const  Uint8  [% ie.ieName %] = [% ie.value %];    
+[% END -%]
+
+
+#endif 
\ No newline at end of file
diff --git a/scripts/GtpV2StackCodeGen/tts/iefactorytemplate.cpp.tt b/scripts/GtpV2StackCodeGen/tts/iefactorytemplate.cpp.tt
new file mode 100644
index 0000000..5ecde81
--- /dev/null
+++ b/scripts/GtpV2StackCodeGen/tts/iefactorytemplate.cpp.tt
@@ -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/iefactorytemplate.cpp.tt>
+ ******************************************************************************/
+
+#include <map>
+#include "gtpV2IeFactory.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2GrpIeDataTypes.h"
+[% FOREACH ie IN tempdata.ieList -%]
+#include "[% ie.ieFileName %].h"
+[% END -%]
+
+GtpV2IeFactory::GtpV2IeFactory() 
+{
+    //Create Message Objects    
+[% FOREACH ie IN tempdata.ieList -%]
+    [% ie.className %]* [% ie.ieFileName %]_p = new ([% ie.className %]);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>([% ie.className %]Type, [% ie.ieFileName %]_p));
+
+[% END -%]
+
+}
+
+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/scripts/GtpV2StackCodeGen/tts/iefactorytemplate.h.tt b/scripts/GtpV2StackCodeGen/tts/iefactorytemplate.h.tt
new file mode 100644
index 0000000..b04eb47
--- /dev/null
+++ b/scripts/GtpV2StackCodeGen/tts/iefactorytemplate.h.tt
@@ -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/scripts/GtpV2StackCodeGen/tts/ietemplate.cpp.tt b/scripts/GtpV2StackCodeGen/tts/ietemplate.cpp.tt
new file mode 100644
index 0000000..2e1a131
--- /dev/null
+++ b/scripts/GtpV2StackCodeGen/tts/ietemplate.cpp.tt
@@ -0,0 +1,445 @@
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+/******************************************************************************
+ *
+ * This is an 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 "[% tempdata.fileName %].h"
+#include "dataTypeCodecUtils.h"
+
+[% tempdata.className %]::[% tempdata.className %]() 
+{
+    ieType = [% tempdata.ieTypeVal %];
+    // TODO
+
+}
+
+[% tempdata.className %]::~[% tempdata.className %]() {
+    // TODO Auto-generated destructor stub
+}
+
+bool [% tempdata.className %]::encode[% tempdata.className %](MsgBuffer &buffer, [% tempdata.className %]Data const &data)
+{
+[% IF validationPresent == "y" -%]
+    if (!([% validationRule %]))
+    {
+        errorStream.add((char *)"Data validation failure at IE : [% tempdata.className %]\n");
+        return false; 
+    }[% END -%]
+[% FOREACH Item IN tempdata.sequence -%]
+[% IF Item -%]
+[% IF Item.skipType == "y" -%]
+    buffer.skip[% Item.bitByte %]([% Item.skipValue %]);
+
+[% ELSE -%]
+[% IF Item.presence == "optional" -%]
+    if (data.[% Item.fieldName %]Present)
+    {
+[% IF Item.encodeConditional == "y" -%]
+        if ([% Item.encodeCondition %])
+        {
+[% IF Item.leafType == "y" -%]
+[% IF Item.validationPresent == "y" -%]
+            if (!([% Item.validationRule %]))
+            {
+                errorStream.add((char *)"Data validation failure: [% Item.fieldName %]\n");
+                return false; 
+            }
+[% END -%]
+[% IF Item.bitField == "y" -%]
+            if(!(buffer.writeBits(data.[% Item.fieldName %], [% Item.fieldSize %])))
+            {
+                errorStream.add((char *)"Encoding of [% Item.fieldName %] failed\n");
+                return false;
+            }
+[% ELSE -%]
+            if (!(buffer.write[% Item.fieldType %](data.[% Item.fieldName %])))
+            {
+                errorStream.add((char *)"Encoding of [% Item.fieldName %] failed\n");
+                return false;
+            }
+[% END -%]
+[% ELSE -%]
+[% IF Item.validationPresent == "y" -%]
+            if (!([% Item.validationRule %]))
+            {
+                errorStream.add((char *)"Data validation failure: [% Item.fieldName %]\n");
+                return false; 
+            }
+[% END -%]
+            if (!(DataTypeCodecUtils::encode[% Item.fieldType %](buffer, data.[% Item.fieldName %])))
+            {
+                errorStream.add((char *)"Encoding of [% Item.fieldName %] failed\n");
+                return false;
+            }
+[% END -%]
+        }
+    }
+[% ELSE -%]
+[% IF Item.leafType == "y" -%]
+[% IF Item.validationPresent == "y" -%]
+        if (!([% Item.validationRule %]))
+        {
+            errorStream.add((char *)"Data validation failure: [% Item.fieldName %]\n");
+            return false; 
+        }
+[% END -%]
+[% IF Item.bitField == "y" -%]
+        if(!(buffer.writeBits(data.[% Item.fieldName %], [% Item.fieldSize %])))
+        {
+            errorStream.add((char *)"Encoding of [% Item.fieldName %] failed\n");
+            return false;
+        }
+[% ELSE -%]
+        if (!(buffer.write[% Item.fieldType %](data.[% Item.fieldName %])))
+        {
+            errorStream.add((char *)"Encoding of [% Item.fieldName %] failed\n");
+            return false;
+        }
+[% END -%]
+[% ELSE -%]
+[% IF Item.validationPresent == "y" -%]
+        if (!([% Item.validationRule %]))
+        {
+            errorStream.add((char *)"Data validation failure: [% Item.fieldName %]\n");
+            return false; 
+        }
+[% END -%]
+        if (!(DataTypeCodecUtils::encode[% Item.fieldType %](buffer, data.[% Item.fieldName %])))
+        {
+            errorStream.add((char *)"Encoding of [% Item.fieldName %] failed\n");
+            return false;
+        }
+[% END -%]
+    }
+[% END -%]
+[% ELSE -%]
+[% IF Item.encodeConditional == "y" -%]
+    if ([% Item.encodeCondition %])
+    {
+[% IF Item.leafType == "y" -%]
+[% IF Item.validationPresent == "y" -%]
+        if (!([% Item.validationRule %]))
+        {
+            errorStream.add((char *)"Data validation failure: [% Item.fieldName %]\n");
+            return false; 
+        }
+[% END -%]
+[% IF Item.bitField == "y" -%]
+        if(!(buffer.writeBits(data.[% Item.fieldName %], [% Item.fieldSize %])))
+        {
+            errorStream.add((char *)"Encoding of [% Item.fieldName %] failed\n");
+            return false;
+        }
+[% ELSE -%]
+        if (!(buffer.write[% Item.fieldType %](data.[% Item.fieldName %])))
+        {
+    errorStream.add((char *)"Encoding of [% Item.fieldName %] failed\n");
+    return false;
+        }
+[% END -%]
+[% ELSE -%]
+[% IF Item.validationPresent == "y" -%]
+        if (!([% Item.validationRule %]))
+        {
+            errorStream.add((char *)"Data validation failure: [% Item.fieldName %]\n");
+            return false; 
+        }
+[% END -%]
+        if (!(DataTypeCodecUtils::encode[% Item.fieldType %](buffer, data.[% Item.fieldName %])))
+        {
+            errorStream.add((char *)"Encoding of [% Item.fieldName %] failed\n");
+            return false;
+        }
+[% END -%]
+    }
+[% ELSE -%]
+[% IF Item.leafType == "y" -%]
+[% IF Item.validationPresent == "y" -%]
+    if (!([% Item.validationRule %]))
+    {
+        errorStream.add((char *)"Data validation failure: [% Item.fieldName %]\n");
+        return false; 
+    }
+[% END -%]
+[% IF Item.bitField == "y" -%]
+    if(!(buffer.writeBits(data.[% Item.fieldName %], [% Item.fieldSize %])))
+    {
+        errorStream.add((char *)"Encoding of [% Item.fieldName %] failed\n");
+        return false;
+    }
+[% ELSE -%]
+    if (!(buffer.write[% Item.fieldType %](data.[% Item.fieldName %])))
+    {
+        errorStream.add((char *)"Encoding of [% Item.fieldName %] failed\n");
+        return false;
+    }
+[% END -%]
+[% ELSE -%]
+[% IF Item.validationPresent == "y" -%]
+    if (!([% Item.validationRule %]))
+    {
+        errorStream.add((char *)"Data validation failure: [% Item.fieldName %]\n");
+        return false; 
+    }
+[% END -%]
+    if (!(DataTypeCodecUtils::encode[% Item.fieldType %](buffer, data.[% Item.fieldName %])))
+    {
+    errorStream.add((char *)"Encoding of [% Item.fieldName %] failed\n");
+    return false;
+    }
+[% END -%]
+[% END -%]
+[% END -%]
+[% END -%]
+[% END -%]
+[% END %]
+    return true;
+}
+
+bool [% tempdata.className %]::decode[% tempdata.className %](MsgBuffer &buffer, [% tempdata.className %]Data &data, Uint16 length)
+{ 
+[%- flag = 0 -%]
+    
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+[% FOREACH Item IN tempdata.sequence -%]
+[% IF Item.length == "lengthLeft" -%][%- IF flag == 0 %]
+    Uint16 lengthLeft = length;
+    [%- flag = 1 %]
+[% END -%][% END -%]
+[% IF Item.skipType == "y" -%]
+    buffer.skip[% Item.bitByte %]([% Item.skipValue %]);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: [% Item.fieldName %]\n");
+        return false;
+    }
+
+[% ELSE -%]
+[% IF Item.decodeConditional == "y" %]
+    if ([% Item.decodeCondition %])
+    {
+[% IF Item.leafType == "y" -%]
+[% IF Item.bitField == "y" -%]
+        data.[% Item.fieldName %] = buffer.readBits([% Item.fieldSize %]);
+        // confirm that we are not reading beyond the IE boundary
+        if (buffer.getCurrentIndex() > ieBoundary)
+        {
+            errorStream.add((char *)"Attempt to read beyond IE boundary: [% Item.fieldName %]\n");
+            return false;
+        }
+[% ELSE %]
+        buffer.read[% Item.fieldType %](data.[% Item.fieldName %]);
+        if (buffer.getCurrentIndex() > ieBoundary)
+        {
+            errorStream.add((char *)"Attempt to read beyond IE boundary: [% Item.fieldName %]\n");
+            return false;
+        }
+[% END -%]
+[% IF Item.validationPresent == "y" -%]
+        if (!([% Item.validationRule %]))
+        {
+            errorStream.add((char *)"Data validation failure : [% Item.fieldName %]\n");
+            return false; //TODO need to add validations
+        }
+[% END -%]
+[% ELSE -%]
+[% IF Item.length == "lengthLeft" -%]
+        lengthLeft = ieBoundary - buffer.getCurrentIndex();
+[% END -%]
+[% IF Item.arrayType == "y" -%]
+        if (!(DataTypeCodecUtils::decode[% Item.fieldType %](buffer, data.[% Item.fieldName %], [% Item.length %], [% Item.count %])))
+[% ELSE -%]
+        if (!(DataTypeCodecUtils::decode[% Item.fieldType %](buffer, data.[% Item.fieldName %], [% Item.length %])))
+[% END -%]
+        {
+            errorStream.add((char *)"Failed to decode: [% Item.fieldName %]\n");
+            return false;
+        }
+[% IF Item.validationPresent == "y" -%]
+        if (!([% Item.validationRule %]))
+        {
+            errorStream.add((char *)"Data validation failure : [% Item.fieldName %]\n");
+            return false; //TODO need to add validations
+        }
+[% END -%]
+[% END -%]
+[% IF Item.presence == "optional" -%]
+        data.[% Item.fieldName %]Present = true;
+[% END -%]
+    }
+[% ELSE -%]
+[% IF Item.leafType == "y" -%]
+[% IF Item.bitField == "y" -%]
+    data.[% Item.fieldName %] = buffer.readBits([% Item.fieldSize %]);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: [% Item.fieldName %]\n");
+        return false;
+    }
+[% ELSE %]
+    buffer.read[% Item.fieldType %](data.[% Item.fieldName %]);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: [% Item.fieldName %]\n");
+        return false;
+    }
+[% END -%]
+[% IF Item.validationPresent == "y" -%]
+    if (!([% Item.validationRule %]))
+    {
+        errorStream.add((char *)"Data validation failure : [% Item.fieldName %]\n");
+        return false; //TODO need to add validations
+    }
+[% END -%]
+[% ELSE -%]
+[% IF Item.length == "lengthLeft" -%]
+    lengthLeft = ieBoundary - buffer.getCurrentIndex();
+[% END -%]
+[% IF Item.arrayType == "y" -%]
+    if (!(DataTypeCodecUtils::decode[% Item.fieldType %](buffer, data.[% Item.fieldName %], [% Item.length %], [% Item.count %])))
+[% ELSE -%]
+    if (!(DataTypeCodecUtils::decode[% Item.fieldType %](buffer, data.[% Item.fieldName %], [% Item.length %])))
+[% END -%]
+    {
+        errorStream.add((char *)"Failed to decode: [% Item.fieldName %]\n");
+        return false;
+    }
+[% IF Item.validationPresent == "y" -%]
+    if (!([% Item.validationRule %]))
+    {
+        errorStream.add((char *)"Data validation failure : [% Item.fieldName %]\n");
+        return false; //TODO need to add validations
+    }
+[% END -%]
+[% END -%]
+[% IF Item.presence == "optional" -%]
+    data.[% Item.fieldName %]Present = true;
+[% END -%]
+[% END -%]
+[% END -%]
+[% END -%]
+[% IF validationPresent == "y" -%]
+    if (!([% validationRule %]))
+    {
+        errorStream.add((char *)"Data validation failure at IE: [% tempdata.className %]\n");
+        return false;
+    }
+[% END -%]
+
+    // 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 [% tempdata.className %]\n");
+        return false;
+    }
+}
+void [% tempdata.className %]::display[% tempdata.className %]_v([% tempdata.className %]Data const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"[% tempdata.className %]Data:");
+    stream.incrIndent();
+    stream.endOfLine();
+[% FOREACH Item IN tempdata.sequence -%]
+[% IF Item.skipType != "y" -%]
+  
+[% IF Item.presence == "optional" -%]  
+    if (data.[% Item.fieldName %]Present)
+    {
+[% IF Item.encodeConditional == "y" -%]
+        if ([% Item.encodeCondition %])
+        {
+[% IF Item.leafType == "y" -%]
+[% IF Item.bitField == "y" -%]
+            stream.add((char *) "[% Item.fieldName %]: "); 
+            stream.add((Uint8)data.[% Item.fieldName %]);
+            stream.endOfLine();
+[% ELSE -%]
+            stream.add((char *)"[% Item.fieldName %]: ");
+            stream.add(data.[% Item.fieldName %]);
+            stream.endOfLine();
+[% END -%]
+[% ELSE -%]
+            stream.add((char *)"[% Item.fieldName %]:");
+            stream.endOfLine();
+            DataTypeCodecUtils::display[% Item.fieldType %]_v(data.[% Item.fieldName %], stream);
+[% END -%]
+        }
+    }
+[% ELSE -%] 
+[% IF Item.leafType == "y" -%]
+[% IF Item.bitField == "y" -%]
+        stream.add((char *) "[% Item.fieldName %]: "); 
+        stream.add((Uint8)data.[% Item.fieldName %]);
+        stream.endOfLine();
+[% ELSE -%]
+        stream.add((char *)"[% Item.fieldName %]: ");
+        stream.add(data.[% Item.fieldName %]);
+        stream.endOfLine();
+[% END -%]
+[% ELSE -%]
+        stream.add((char *)"[% Item.fieldName %]:");
+        stream.endOfLine();
+        DataTypeCodecUtils::display[% Item.fieldType %]_v(data.[% Item.fieldName %], stream);
+[% END -%]
+    }   
+[% END -%]
+[% ELSE -%]
+[% IF Item.encodeConditional == "y" -%]
+    if ([% Item.encodeCondition %])
+    {
+[% IF Item.leafType == "y" -%]
+[% IF Item.bitField == "y" -%]
+        stream.add( (char *)"[% Item.fieldName %]: "); 
+        stream.add((Uint8)data.[% Item.fieldName %]);
+        stream.endOfLine();
+[% ELSE -%]
+        stream.add((char *)"[% Item.fieldName %]: ");
+        stream.add(data.[% Item.fieldName %]);
+        stream.endOfLine();
+[% END -%]
+[% ELSE -%]
+        stream.add((char *)"[% Item.fieldName %]:");
+        stream.endOfLine();
+        DataTypeCodecUtils::display[% Item.fieldType %]_v(data.[% Item.fieldName %], stream);
+[% END -%]
+    }
+[% ELSE -%] 
+[% IF Item.leafType == "y" -%]
+[% IF Item.bitField == "y" -%]
+    stream.add( (char *)"[% Item.fieldName %]: "); 
+    stream.add((Uint8)data.[% Item.fieldName %]);
+    stream.endOfLine();
+[% ELSE -%]
+    stream.add((char *)"[% Item.fieldName %]: ");
+    stream.add(data.[% Item.fieldName %]);
+    stream.endOfLine();
+[% END -%]
+[% ELSE -%]
+    stream.add((char *)"[% Item.fieldName %]:");
+    stream.endOfLine();
+    DataTypeCodecUtils::display[% Item.fieldType %]_v(data.[% Item.fieldName %], stream);
+[% END -%]
+[% END -%]
+[% END -%]
+[% END -%]
+[% END -%]
+    stream.decrIndent();
+    stream.decrIndent();
+}
diff --git a/scripts/GtpV2StackCodeGen/tts/ietemplate.h.tt b/scripts/GtpV2StackCodeGen/tts/ietemplate.h.tt
new file mode 100644
index 0000000..0dafcd2
--- /dev/null
+++ b/scripts/GtpV2StackCodeGen/tts/ietemplate.h.tt
@@ -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 [% tempdata.classNameUC %]_H_
+#define [% tempdata.classNameUC %]_H_
+
+#include "manual/gtpV2Ie.h"
+
+
+
+class [% tempdata.className %]: public GtpV2Ie {
+public:
+    [% tempdata.className %]();
+    virtual ~[% tempdata.className %]();
+
+    bool encode[% tempdata.className %](MsgBuffer &buffer,
+                 [% tempdata.className %]Data const &data);
+    bool decode[% tempdata.className %](MsgBuffer &buffer,
+                 [% tempdata.className %]Data &data, Uint16 length);
+    void display[% tempdata.className %]_v([% tempdata.className %]Data const &data,
+                 Debug &stream);
+};
+
+#endif /* [% tempdata.classNameUC %]_H_ */
\ No newline at end of file
diff --git a/scripts/GtpV2StackCodeGen/tts/makefiletemplate.tt b/scripts/GtpV2StackCodeGen/tts/makefiletemplate.tt
new file mode 100644
index 0000000..63e4c88
--- /dev/null
+++ b/scripts/GtpV2StackCodeGen/tts/makefiletemplate.tt
@@ -0,0 +1,51 @@
+#
+# Copyright 2019-present, Infosys Limited.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT 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
+
+[% FOREACH lib IN makefiledata.libList -%]
+gtpV2CodecOBJS := $(addprefix $(gtpV2CodecOBJDIR), \
+[% FOREACH file IN lib.fileList -%]
+	[% file.objFile -%] \
+[% END -%]
+	ieClasses/manual/dataTypeCodecUtils_manual.o \
+	gtpV2StackWrappers.o )
+[% END -%]
+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/scripts/GtpV2StackCodeGen/tts/msgDataTypetemplate.h.tt b/scripts/GtpV2StackCodeGen/tts/msgDataTypetemplate.h.tt
new file mode 100644
index 0000000..0bccf65
--- /dev/null
+++ b/scripts/GtpV2StackCodeGen/tts/msgDataTypetemplate.h.tt
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */ 
+ /******************************************************************************
+ *
+ * This is 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;
+
+[% FOREACH msg IN tempdata.msgList -%]
+typedef struct
+{
+[% FOREACH ieData IN msg.ieDetails -%]
+[% IF ieData.iePresence != 'M' -%][% IF ieData.ieCardinality == 1 -%]
+    bool [% ieData.ieVarName %]IePresent;   
+[% END -%][% END -%]
+[% END -%]
+
+
+[% FOREACH ieData IN msg.ieDetails -%]
+[% IF ieData.ieCardinality != 1 -%]
+
+    Uint16 [% ieData.ieVarName %]Count;
+[% END -%]
+[% IF ieData.grouped == 'Yes'-%]
+[% IF ieData.ieCardinality != 1 -%]
+    [% ieData.grpIeInstClassName%]Data [% ieData.ieVarName%][[%ieData.ieCardinality%]];
+[% ELSE -%]
+    [% ieData.grpIeInstClassName%]Data [% ieData.ieVarName%];
+[% END -%]
+[% ELSE -%]
+    [% ieData.ieType%]IeData [% ieData.ieVarName%];
+[% END -%]
+[% END -%]
+}[% msg.msgDataName %];
+
+[% END -%]
+
+//Ie Type Constants
+[% FOREACH msg IN tempdata.msgTypeList -%]
+static const  Uint8  [% msg.msgDataType %] = [% msg.msgValue %];    
+[% END -%]
+
+
+#endif 
\ No newline at end of file
diff --git a/scripts/GtpV2StackCodeGen/tts/msgDecode.tt b/scripts/GtpV2StackCodeGen/tts/msgDecode.tt
new file mode 100644
index 0000000..bd96798
--- /dev/null
+++ b/scripts/GtpV2StackCodeGen/tts/msgDecode.tt
@@ -0,0 +1,27 @@
+[% IF ieTypeData.ieCardinality == 1 -%][% IF ieTypeData.grouped == "Yes" -%]
+					[% ieTypeData.grpIeInstClassName %] groupedIeInstance =
+					dynamic_cast<
+					[% ieTypeData.grpIeInstClassName %]&>(ieObject.getGroupedIe(msgType, [% ieTypeData.instance %]));
+					rc = groupedIeInstance.decode[% ieTypeData.grpIeInstClassName %](buffer, data.[% ieTypeData.ieVarName %], ieHeader.length);
+[% ELSE -%]
+					rc = ieObject.decode[% ieTypeData.ieType %]Ie(buffer, data.[% ieTypeData.ieVarName %], ieHeader.length);
+[% END -%]
+[% ELSE -%]
+					// First check if we have enough space left to decode and store this instance
+                    if (data.[% ieTypeData.ieVarName %]Count == [% ieTypeData.ieCardinality %])
+                    {
+                        errorStream.add((char *)"More than [% ieTypeData.ieCardinality %] instances of [% ieTypeData.ieVarName %] received\n");
+                        return false;
+                    }
+[% IF ieTypeData.grouped == "Yes" -%]
+                    [% ieTypeData.grpIeInstClassName %] groupedIeInstance =
+                    dynamic_cast<
+                    [% ieTypeData.grpIeInstClassName %]&>(ieObject.getGroupedIe(msgType, [% ieTypeData.instance %]));
+                    rc = groupedIeInstance.decode[% ieTypeData.grpIeInstClassName %](buffer,
+                    data.[% ieTypeData.ieVarName %][data.[% ieTypeData.ieVarName %]Count], ieHeader.length);
+                    data.[% ieTypeData.ieVarName %]Count++; // TODO Count validation
+[% ELSE -%]
+					rc = ieObject.decode[% ieTypeData.ieType %]Ie(buffer, data.[% ieTypeData.ieVarName %][[% ieTypeData.ieVarName %]Count], ieHeader.length);
+					data.[% ieTypeData.ieVarName %]Count++; // TODO Count validation
+[% END -%]
+[% END -%]
\ No newline at end of file
diff --git a/scripts/GtpV2StackCodeGen/tts/msgEncode.tt b/scripts/GtpV2StackCodeGen/tts/msgEncode.tt
new file mode 100644
index 0000000..b1dcd54
--- /dev/null
+++ b/scripts/GtpV2StackCodeGen/tts/msgEncode.tt
@@ -0,0 +1,63 @@
+[% IF ieData.ieCardinality == 1 -%]
+
+    // Encode the Ie Header
+    header.ieType = [% ieData.ieType %]IeType;
+    header.instance = [% ieData.instance %];
+    header.length = 0; // We will encode the IE first and then update the length
+    GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+    startIndex = buffer.getCurrentIndex(); 
+    [% ieData.ieType %]Ie [% ieData.ieLocalVar %]=
+    dynamic_cast<
+    [% ieData.ieType %]Ie&>(GtpV2IeFactory::getInstance().getIeObject([% ieData.ieType %]IeType));
+[% IF ieData.grouped == 'Yes'-%]
+    [% ieData.grpIeInstClassName %] groupedIeInstance =
+    dynamic_cast<
+     [% ieData.grpIeInstClassName %]&>([% ieData.ieLocalVar %].getGroupedIe(msgType, [% ieData.instance %]));
+    rc = groupedIeInstance.encode[% ieData.grpIeInstClassName %](buffer, data.[% ieData.ieVarName %]);
+[% ELSE -%]
+    rc = [% ieData.ieLocalVar %].encode[% ieData.ieType %]Ie(buffer, data.[% ieData.ieVarName %]);
+[% END -%]
+    endIndex = buffer.getCurrentIndex();
+    length = endIndex - startIndex;
+
+    // encode the length value now
+    buffer.goToIndex(startIndex - 3);
+    buffer.writeUint16(length, false);
+    buffer.goToIndex(endIndex);
+[% ELSE -%]
+    // First validate if the applicatoin provided more than the expected cardinality
+    if (data.[% ieData.ieVarName %]Count > [% ieData.ieCardinality %])
+    {
+        errorStream.add((char *)"Number of entries of [% ieData.ieVarName %] exceeded\n");
+        errorStream.add((char *)"Expected count: [% ieData.ieCardinality %] Received count: ");
+        errorStream.add((char *)"data.[% ieData.ieVarName %]Count");
+        errorStream.endOfLine();
+        return false;
+    }
+    for (Uint8 i = 0; i < data.[% ieData.ieVarName %]Count; i++)
+    {
+        // Encode the Ie Header
+        header.ieType = [% ieData.ieType %]IeType;
+        header.instance = [% ieData.instance %];
+        header.length = 0; // We will encode the IE first and then update the length
+        GtpV2Ie::encodeGtpV2IeHeader(buffer, header);
+        startIndex = buffer.getCurrentIndex(); 
+        [% ieData.ieType %]Ie [% ieData.ieLocalVar %]=
+        dynamic_cast<
+        [% ieData.ieType %]Ie&>(GtpV2IeFactory::getInstance().
+        getIeObject([% ieData.ieType %]IeType));
+[% IF ieData.grouped == 'Yes'-%]
+        [% ieData.grpIeInstClassName %] groupedIeInstance = dynamic_cast<[% ieData.grpIeInstClassName %]&>([% ieData.ieLocalVar %].getGroupedIe(msgType, [% ieData.instance %]));
+        rc = groupedIeInstance.encode[% ieData.grpIeInstClassName %](buffer, data.[% ieData.ieVarName %][i]);
+[% ELSE -%]
+        rc = [% ieData.ieLocalVar %].encode[% ieData.ieType %]Ie(buffer, data.[% ieData.ieVarName %][i]);
+[% END -%]
+        endIndex = buffer.getCurrentIndex();
+        length = endIndex - startIndex;
+
+        // encode the length value now
+        buffer.goToIndex(startIndex - 3);
+        buffer.writeUint16(length, false);
+        buffer.goToIndex(endIndex);
+    }
+[% END -%]
diff --git a/scripts/GtpV2StackCodeGen/tts/msgfactorytemplate.cpp.tt b/scripts/GtpV2StackCodeGen/tts/msgfactorytemplate.cpp.tt
new file mode 100644
index 0000000..d21197e
--- /dev/null
+++ b/scripts/GtpV2StackCodeGen/tts/msgfactorytemplate.cpp.tt
@@ -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/msgfactorytemplate.cpp.tt>
+ ******************************************************************************/ 
+
+#include "gtpV2MsgFactory.h"
+[% FOREACH msg IN tempdata.msgList -%]
+#include "[% msg.msgFileName %].h"
+[% END -%]
+
+static GtpV2MsgFactory gtpV2MsgFactory;
+
+GtpV2MsgFactory::GtpV2MsgFactory() 
+{
+    //Create Message Objects
+        
+[% FOREACH msg IN tempdata.msgList -%]
+    [% msg.className %]* [% msg.msgFileName %]_p = new ([% msg.className %]);
+    msgObjectContainer.insert(std::pair<Uint8, GtpV2Message*>([% msg.className %]Type, [% msg.msgFileName %]_p));
+
+[% END -%]
+
+}
+
+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/scripts/GtpV2StackCodeGen/tts/msgfactorytemplate.h.tt b/scripts/GtpV2StackCodeGen/tts/msgfactorytemplate.h.tt
new file mode 100644
index 0000000..e2546b2
--- /dev/null
+++ b/scripts/GtpV2StackCodeGen/tts/msgfactorytemplate.h.tt
@@ -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/scripts/GtpV2StackCodeGen/tts/msgtemplate.cpp.tt b/scripts/GtpV2StackCodeGen/tts/msgtemplate.cpp.tt
new file mode 100644
index 0000000..ceef7ae
--- /dev/null
+++ b/scripts/GtpV2StackCodeGen/tts/msgtemplate.cpp.tt
@@ -0,0 +1,273 @@
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+
+/******************************************************************************
+ *
+ * This is 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 "[% tempdata.fileName %].h"
+#include "../ieClasses/manual/gtpV2Ie.h"
+#include "../ieClasses/gtpV2IeFactory.h"
+[% FOREACH ieData IN tempdata.ieList -%]
+#include "../ieClasses/[% ieData.ieFileName %].h"
+[% IF ieData.grouped == 'Yes'-%]
+#include "../ieClasses/[% ieData.grpIeInstFileName %].h"
+[% END -%]
+[% END -%]
+
+[% tempdata.msgClassName %]::[% tempdata.msgClassName %]()
+{
+    msgType = [% tempdata.msgClassName %]Type;
+[% PROCESS MandIeList %]
+}
+
+[% tempdata.msgClassName %]::~[% tempdata.msgClassName %]()
+{
+
+}
+
+bool [% tempdata.msgClassName %]::encode[% tempdata.msgClassName %](MsgBuffer &buffer,
+                        [% tempdata.msgClassName %]Data
+							const &data)
+{
+    bool rc = false;
+    GtpV2IeHeader header;
+    Uint16 startIndex = 0;
+    Uint16 endIndex = 0;
+    Uint16 length = 0;
+[% FOREACH ieData IN tempdata.ieList -%]
+
+[% IF ieData.iePresence != 'M' -%][% IF ieData.ieCardinality == 1 -%]
+    if (data.[% ieData.ieVarName %]IePresent)
+    {
+        [% INCLUDE tts/msgEncode.tt FILTER indent%]
+        if (!(rc))
+        { 
+            errorStream.add((char *)"Failed to encode IE: [% ieData.ieVarName %]\n");
+            return false;
+        }
+    }
+[% ELSE -%]
+    [% INCLUDE tts/msgEncode.tt %]
+    if (!(rc))
+    { 
+        errorStream.add((char *)"Failed to encode IE: [% ieData.ieVarName %]\n");
+        return false;
+    }
+[% END -%]
+[% ELSE -%]
+    [% INCLUDE tts/msgEncode.tt %]
+    if (!(rc))
+    { 
+        errorStream.add((char *)"Failed to encode IE: [% ieData.ieVarName %]\n");
+        return false;
+    }
+[% END -%]
+[% END -%]
+    return rc;
+
+}
+
+bool [% tempdata.msgClassName %]::decode[% tempdata.msgClassName %](MsgBuffer &buffer,
+ [% tempdata.msgClassName %]Data 
+ &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){
+[% FOREACH ieTypeEntry IN tempdata.ieTypeList -%]
+     
+            case [% ieTypeEntry %]IeType:
+            {
+                [% ieTypeEntry %]Ie ieObject =
+                dynamic_cast<
+                [% ieTypeEntry %]Ie&>(GtpV2IeFactory::getInstance().getIeObject([% ieTypeEntry %]IeType));
+[% SET first = 1 -%]
+[% FOREACH ieTypeData IN tempdata.ieList -%]
+[% IF ieTypeData.ieType == ieTypeEntry -%] 
+[% IF first == 1 -%]
+[% SET first = 0 %]
+                if(ieHeader.instance == [% ieTypeData.instance %])
+[% ELSE -%]
+                else if(ieHeader.instance == [% ieTypeData.instance %])
+[% END -%]
+                {
+[% INCLUDE tts/msgDecode.tt %]
+[% IF ieTypeData.ieCardinality == 1 -%][% IF ieTypeData.iePresence != "M" -%]
+                    data.[% ieTypeData.ieVarName %]IePresent = true;
+[% END -%][% END -%]
+                    if (!(rc))
+                    {
+                        errorStream.add((char *)"Failed to decode IE: [% ieTypeData.ieVarName %]\n");
+                        return false;
+                    }
+                }
+[% END %][% END %]
+                else
+                {
+                    // Unknown IE instance print error
+                    errorStream.add((char *)"Unknown IE Type: ");
+                    errorStream.add(ieHeader.ieType);
+                    errorStream.endOfLine();
+                    buffer.skipBytes(ieHeader.length);
+                }
+                break;
+            }
+[% END %]
+            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 [% tempdata.msgClassName %]::
+display[% tempdata.msgClassName %]Data_v([% tempdata.msgClassName %]Data const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"[% tempdata.msgClassName %]:");
+    stream.endOfLine();
+    stream.incrIndent();
+    
+    [%- flag = 0 -%]
+    
+    
+[% FOREACH ieData IN tempdata.ieList -%]
+[% IF ieData.ieCardinality != 1 -%]
+[%- IF flag == 0 %]
+    Uint8 displayCount;
+    
+[%- flag = 1 %]
+[% END -%][% END -%]
+[% IF ieData.iePresence != 'M' -%][% IF ieData.ieCardinality == 1 -%]
+    if (data.[% ieData.ieVarName %]IePresent)
+    {
+
+
+        stream.add((char *)"IE - [% ieData.ieVarName %]:");
+        stream.endOfLine();
+        [% ieData.ieType %]Ie [% ieData.ieLocalVar %]=
+        dynamic_cast<
+        [% ieData.ieType %]Ie&>(GtpV2IeFactory::getInstance().getIeObject([% ieData.ieType %]IeType));
+    [% PROCESS ieDisplay_grp %]
+    }
+[% ELSE -%]
+    displayCount = data.[% ieData.ieVarName %]Count;
+    if (displayCount > [% ieData.ieCardinality %])
+    {
+        stream.add((char *)"Invalid data more than [% ieData.ieCardinality %] instances");
+        stream.endOfLine();
+        stream.add((char *)"Displaying only [% ieData.ieCardinality %]");
+        stream.endOfLine();
+        displayCount = [% ieData.ieCardinality %];
+    }
+    for (Uint8 i = 0; i < displayCount; i++)
+    {
+        stream.add((char *)"IE -  [% ieData.ieVarName %]:");
+        stream.endOfLine();
+        [% ieData.ieType %]Ie [% ieData.ieLocalVar %]=
+        dynamic_cast<
+        [% ieData.ieType %]Ie&>(GtpV2IeFactory::getInstance().getIeObject([% ieData.ieType %]IeType));
+        [% PROCESS ieDisplay_grp -%]
+    }
+
+    
+
+    
+[% END -%]
+[% ELSE -%]
+[% IF ieData.ieCardinality == 1 -%]
+        stream.add((char *)"IE - [% ieData.ieVarName %]:");
+        stream.endOfLine();
+        [% ieData.ieType %]Ie [% ieData.ieLocalVar %]=
+        dynamic_cast<
+        [% ieData.ieType %]Ie&>(GtpV2IeFactory::getInstance().getIeObject([% ieData.ieType %]IeType));
+    [% PROCESS ieDisplay_grp %]
+[% ELSE -%]
+    displayCount = data.[% ieData.ieVarName %]Count;
+    if (displayCount > [% ieData.ieCardinality %])
+    {
+        stream.add((char *)"Invalid data more than [% ieData.ieCardinality %] instances");
+        stream.endOfLine();
+        stream.add((char *)"Displaying only [% ieData.ieCardinality %]");
+        stream.endOfLine();
+        displayCount = [% ieData.ieCardinality %];
+    }
+    for (Uint8 i = 0; i < displayCount; i++)
+    {
+        stream.add((char *)"IE -  [% ieData.ieVarName %]:");
+        stream.endOfLine();
+        [% ieData.ieType %]Ie [% ieData.ieLocalVar %]=
+        dynamic_cast<
+        [% ieData.ieType %]Ie&>(GtpV2IeFactory::getInstance().getIeObject([% ieData.ieType %]IeType));
+[% PROCESS ieDisplay_grp %]
+    }
+[% END -%]            
+[% END -%]
+[% END -%]
+
+    stream.decrIndent();
+    stream.decrIndent();
+}
+
+[% BLOCK ieDisplay_grp -%]
+[% IF ieData.grouped == "Yes" -%]
+        [% ieData.grpIeInstClassName %] groupedIeInstance =
+        dynamic_cast<
+        [% ieData.grpIeInstClassName %]&>([% ieData.ieLocalVar %].getGroupedIe(msgType, [% ieData.instance %]));
+        groupedIeInstance.display[% ieData.grpIeInstClassName %]Data_v(data.[% ieData.ieVarName %][% PROCESS cardinalIndex %], stream);
+[% ELSE -%]
+    [% ieData.ieLocalVar %].display[% ieData.ieType %]Ie_v(data.[% ieData.ieVarName %][% PROCESS cardinalIndex %], stream);
+[% END -%]
+[% END -%]
+
+[% BLOCK cardinalIndex -%]
+[% IF ieData.ieCardinality != 1 %][i][% END -%]
+[% END -%]
+[% BLOCK MandIeList -%]
+[% SET first = 1 -%]
+[% FOREACH ieData IN tempdata.ieList -%]
+[% IF ieData.iePresence == 'M' -%]
+[% IF first == 1 -%]
+    Uint16 mandIe;
+[% SET first = 0 -%]
+[% END -%]
+    mandIe = [% ieData.ieType %]IeType;
+    mandIe = (mandIe << 8) | [% ieData.instance %]; // [% ieData.ieVarName %]
+    mandatoryIeSet.insert(mandIe);
+[%- END -%]
+[% END -%]
+[% END -%]
\ No newline at end of file
diff --git a/scripts/GtpV2StackCodeGen/tts/msgtemplate.h.tt b/scripts/GtpV2StackCodeGen/tts/msgtemplate.h.tt
new file mode 100644
index 0000000..949d03f
--- /dev/null
+++ b/scripts/GtpV2StackCodeGen/tts/msgtemplate.h.tt
@@ -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 [% tempdata.classNameUC %]_H_
+#define [% tempdata.classNameUC %]_H_
+
+#include <set>
+#include "manual/gtpV2Message.h"
+#include <msgBuffer.h>
+#include <debug.h>
+#include "gtpV2MsgDataTypes.h"
+
+
+class [% tempdata.msgClassName %]:public GtpV2Message
+{
+public:
+    [% tempdata.msgClassName %]();
+    virtual ~[% tempdata.msgClassName %]();
+    bool encode[% tempdata.msgClassName %](MsgBuffer &buffer, [% tempdata.msgClassName %]Data const &data);
+
+    bool decode[% tempdata.msgClassName %] (MsgBuffer &buffer, [% tempdata.msgClassName %]Data& data, Uint16 length);
+
+    void display[% tempdata.msgClassName %]Data_v([% tempdata.msgClassName %]Data const &data, Debug &stream);
+
+private:
+    set <Uint16> mandatoryIeSet;
+};
+
+#endif
\ No newline at end of file
diff --git a/scripts/GtpV2StackCodeGen/tts/stacktemplate.cpp.tt b/scripts/GtpV2StackCodeGen/tts/stacktemplate.cpp.tt
new file mode 100644
index 0000000..a9d511c
--- /dev/null
+++ b/scripts/GtpV2StackCodeGen/tts/stacktemplate.cpp.tt
@@ -0,0 +1,203 @@
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+ 
+/******************************************************************************
+ *
+ * This is 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"
+[% FOREACH msg IN tempdata.msgList -%]
+#include "msgClasses/[% msg.msgFileName %].h"
+[% END -%]
+
+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)
+    {
+[% FOREACH msg IN tempdata.msgList -%]
+        case [% msg.className %]Type:
+        {
+            if (data_p != NULL)
+            {
+                rc =
+               dynamic_cast<
+               [% msg.className %] & >(msg).
+               encode[% msg.className %](buffer,
+    			     *(([% msg.className %]Data *)
+        			     data_p));
+            }
+            else
+            { 
+                // Application has filled the data structure provided by the stack
+                rc = 
+                dynamic_cast<
+                [% msg.className %] & >(msg).
+                encode[% msg.className %] (buffer,
+                            [% msg.dataMember %]);
+            }
+            break;
+        }
+[% END -%]
+    }
+
+    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){
+[% FOREACH msg IN tempdata.msgList -%]
+        case [% msg.className %]Type:
+        {
+            if (data_p != NULL)
+            {
+                rc =
+                dynamic_cast<
+                [% msg.className %] & >(msg).
+                decode[% msg.className %](buffer,
+                            *([% msg.className %]Data*)
+                             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 (&[% msg.dataMember %], 0,
+                sizeof ([% msg.className %]Data));
+                rc =
+                dynamic_cast<
+                [% msg.className %] & >(msg).
+                decode[% msg.className %](buffer,
+                            [% msg.dataMember %],
+                            msgDataLength);
+            }
+            break;
+        }
+[% END -%]
+    }
+    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){
+[% FOREACH msg IN tempdata.msgList -%]
+        case [% msg.className %]Type:
+        {
+            stream.add ((char *)"Message: [% msg.className %]");
+            stream.endOfLine ();
+            if (data_p != NULL)
+            {
+            dynamic_cast<
+            [% msg.className %] & >(msg).
+            display[% msg.className %]Data_v (*
+                        (([% msg.className %]Data*) data_p), stream);
+            }
+            else
+            {
+            // Application wants to use the data structure provided by the stack
+            dynamic_cast<
+            [% msg.className %] & >(msg).
+            display[% msg.className %]Data_v
+                        ([% msg.dataMember %], stream);
+            }
+           break;
+        }
+[% END -%]
+    }
+}
diff --git a/scripts/GtpV2StackCodeGen/tts/stacktemplate.h.tt b/scripts/GtpV2StackCodeGen/tts/stacktemplate.h.tt
new file mode 100644
index 0000000..044c57a
--- /dev/null
+++ b/scripts/GtpV2StackCodeGen/tts/stacktemplate.h.tt
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */ 
+/******************************************************************************
+ *
+ * This is 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
+[% FOREACH msg IN tempdata.msgList -%]
+    [% msg.className %]Data [% msg.dataMember %];
+[% END -%]
+
+    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/scripts/GtpV2StackCodeGen/tts/v2DataTypetemplate.h.tt b/scripts/GtpV2StackCodeGen/tts/v2DataTypetemplate.h.tt
new file mode 100644
index 0000000..b3d982d
--- /dev/null
+++ b/scripts/GtpV2StackCodeGen/tts/v2DataTypetemplate.h.tt
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ /******************************************************************************
+ *
+ * This is 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>
+
+[%- arrayDataTypesList = [] -%]
+[%- FOREACH data IN tempdata.DataTypeListAuto -%]
+    [%- FOREACH seq IN data.sequence -%]
+        [%- IF seq.skipType !='y' -%]
+            [%- FOREACH arrayItem IN tempdata.arrayTypeList -%]
+                [%- IF seq.fieldType == arrayItem.typeName -%]
+                    [% arrayDataTypesList.push(arrayItem.typeName) -%]
+                [% END -%]
+            [% END -%]
+        [% END -%]
+    [% END -%]
+[% END -%]
+[%- arrayDataTypesList = arrayDataTypesList.unique -%]
+[%- FOREACH data IN tempdata.arrayTypeList -%]
+    [%- flag = 0 -%]
+    [%- FOREACH item IN arrayDataTypesList -%]
+        [%- IF item == data.typeName %]
+            [%- flag = 1 %]
+        [%- END -%]
+    [%- END -%]
+    [%- IF flag == 1 %]
+typedef struct
+{
+    Uint16 count;
+    [% data.subType %] values[[% data.arraySize %]];
+
+}[% data.typeName %];
+    [% END -%]
+[% END -%]
+
+[% FOREACH data IN tempdata.DataTypeListAuto -%]
+typedef struct
+{
+[% FOREACH seq IN data.sequence -%][% IF seq.skipType !='y' -%]
+    [% seq.fieldType %] [% seq.fieldName %];
+[% END -%][% END -%]
+}[% data.typeName %];
+
+[% END -%]
+
+[% FOREACH data IN tempdata.arrayTypeList -%]
+    [% flag = 0 -%]
+    [% FOREACH item IN arrayDataTypesList -%]
+        [% IF item == data.typeName %]
+            [% flag = 1 %]
+        [% END -%]
+    [% END -%]
+    [% IF flag == 0 %]
+typedef struct
+{
+    Uint16 count;
+    [% data.subType %] values[[% data.arraySize %]];
+
+}[% data.typeName %];
+    [% END -%]
+[% END -%]
+
+#endif 
\ No newline at end of file
diff --git a/scripts/GtpV2StackCodeGen/xlUtils.py b/scripts/GtpV2StackCodeGen/xlUtils.py
new file mode 100644
index 0000000..1af0983
--- /dev/null
+++ b/scripts/GtpV2StackCodeGen/xlUtils.py
@@ -0,0 +1,219 @@
+# Copyright 2019-present Infosys Limited    
+# SPDX-License-Identifier: Apache-2.0   
+
+import re
+from template import Template
+import os
+from openpyxl import load_workbook
+
+libData = {}
+progData = {}
+template = Template()
+wb = load_workbook('dataModel/prototypeV8.xlsx')
+class xlUtils:
+    def __init__(self):
+        pass
+    
+   
+    def extractField(field):
+        varName = ''
+        varType = ''
+        encodeCondition = ''
+        decodeCondition = ''
+        validation = ''
+        count = ''
+        mVarName = re.search('^(\w+)',str(field))
+        mVarType = re.search(':Type\[(\w+)\]',str(field))
+        mEnCond = re.search(':Condition\[([^\:]*)\]',str(field))
+        mDeCond = re.search(':DecodeCondition\[([^\:]*)]',str(field))
+        mValid = re.search(':Validation\[([^\:]+)\]',str(field))
+        mCount = re.search(':Count\[([^\:]*)]',str(field))
+        if mVarName:
+            varName = mVarName.group(1)
+          
+        if mVarType:
+            varType = mVarType.group(1)
+           
+        if mEnCond:
+            encodeCondition = mEnCond.group(1)
+            
+        if mDeCond:
+            decodeCondition = mDeCond.group(1)
+        else:
+            if mEnCond:
+                decodeCondition = mEnCond.group(1)
+            
+            
+        if mValid:
+            validation = mValid.group(1)
+            dataVarName = 'data.' + varName
+            validation = re.sub(r'\$.',dataVarName,validation)
+
+        if mCount:
+            count =  mCount.group(1)
+            
+        return (varName,varType,encodeCondition,decodeCondition,validation,count)
+    
+    def lengthToType(byteLength):
+        lTdict = {1:'Uint8',2:'Uint16',3:'Uint32',4:'Uint32',5:'Uint64',6:'Uint64',7:'Uint64',8:'Uint64',65535:'Uint8',9:'Uint8',12:'Uint8'}
+        return lTdict[byteLength]
+     
+    def getByteLength(sheet,i): 
+        length = 0
+        lengthStr = ''
+        cell_value_C = xlUtils.getCellValue(sheet,i,'C')
+        octets =  str(cell_value_C) 
+        
+        mTo = re.search('to',str(octets)) 
+        mVar = re.search('^variable\[(.*)]',str(octets))
+        mToD = re.search('^(\d+) to (\d+)',str(octets))
+        mToWD = re.search('^(\w) to (\w)\+(\d+)',str(octets))
+        mToWWD = re.search('^(\w)\+(\d+) to (\w)\+(\d+)',str(octets))
+        
+        if not mTo:
+            if mVar:
+                lenStr = mVar.group(1)
+                length = 65535
+                lengthStr = lenStr
+                                           
+            elif xlUtils.getBitLength(sheet,i,'D') == 8:
+                length = 1
+                
+        else:
+            if mToD:
+                toD = mToD.group(1)
+                toD2 = mToD.group(2)
+                length = int(toD2) - int(toD) + 1
+                
+            elif mToWD:
+                ToWD = mToWD.group(3)
+                length = int(ToWD) + 1
+                            
+            elif mToWWD:
+                ToWWD2 = mToWWD.group(2)
+                ToWWD4 = mToWWD.group(4)
+                length = int(ToWWD4) - int(ToWWD2) + 1        
+        return (length,lengthStr)
+    
+    def getBitLength(sheet,i,j):
+        length = 0
+        fieldName = xlUtils.getCellValue(sheet,i,j)
+        mcolDtoK = re.search('[D-K]',j)
+        if fieldName != None and mcolDtoK:
+           for k in map(chr, range( ord(j), ord('L'))):
+               fName = xlUtils.getCellValue(sheet,i,k)
+              
+               if length == 0:
+                   length = length + 1
+                   
+               elif fName == None:
+                   length = length + 1
+            
+               else:
+                   break
+        return length
+    
+    
+    def getCellValue(sheet,row,column):
+        colNum = 0
+        chartoint = {'A' : 1,'B' : 2, 'C' : 3, 'D' : 4, 'E' : 5, 'F' : 6, 'G' : 7,
+               'H' : 8, 'I' : 9, 'J' : 10, 'K' : 11, 'L' : 12, 'M' : 13, 'N' : 14,
+               'O' : 15, 'P' : 16, 'Q' : 17, 'R' : 18, 'S' : 19, 'T' : 20, 'U' : 21,
+               'V' : 22, 'W' : 23, 'X' : 24, 'Y' : 25, 'Z' : 26}
+        
+        colNum = chartoint[column]
+        cellvalue = sheet.cell(row=row, column=colNum).value
+        return cellvalue
+    
+    def getVarNameFromString(localString,typeName):
+          
+        localString = localString.lower()
+        varName = ''
+        localString = re.sub(r'\(.*\)'," ",localString)
+        localString=localString.replace('/'," ")
+        localString = re.sub('-'," ",localString)
+        tokens = [x.capitalize() for x in localString.split(" ")]
+        varName = varName.join(tokens)
+        varName = varName[0].upper() + varName[1:]
+        if typeName == 1:
+            return varName
+        else:
+            return varName[0].lower() + varName[1:]
+        
+    def templateProcess(templateData,ttFileNameCpp,ttFileNameH,outputDirCpp,outputDirH):
+        
+        
+        template = Template()
+        
+        if not os.path.exists(outputDirCpp):
+            os.makedirs(outputDirCpp)
+        outputFileNameCpp = templateData['fileName'] + '.cpp'
+        
+        template.__init__({'OUTPUT' : outputFileNameCpp, 'OUTPUT_PATH' : outputDirCpp})
+        template.process(ttFileNameCpp, {'tempdata' : templateData})
+        
+
+        if not os.path.exists(outputDirH):
+            os.makedirs(outputDirH)
+        outputFileNameH = templateData['fileName'] + '.h'
+        template.__init__({'OUTPUT' : outputFileNameH, 'OUTPUT_PATH' : outputDirH})
+        template.process(ttFileNameH, {'tempdata' : templateData})
+        
+    def addToMakeSo(libName,objFile,srcFile):
+       
+        fileData = {}
+        fileData['objFile'] = objFile
+        fileData['sourceFile'] = srcFile
+        if libName not in libData:
+            lib = libName
+            lib = re.sub(r'.so','',lib)
+            libData[libName] = {}
+            libData[libName]['libName'] = lib
+            libData[libName]['fileList'] = []
+        if fileData not in libData[libName]['fileList']:
+            libData[libName]['fileList'].append(fileData)
+       
+    def addToMakeExe(progName,objFile,srcFile):
+        fileData = {}
+        fileData['objFile'] = objFile
+        fileData['sourceFile'] = srcFile
+        
+        if progName not in progData:
+            prog = progName
+            prog = re.sub(r'.exe','',prog)
+            progData[progName] = {}
+            progData[progName]['progName'] = prog
+            
+        progData[progName]['fileList'] = []
+        progData[progName]['fileList'].append(fileData)
+        
+    def addSoToMakeExe(progName,soName):
+        if progName not in progData:
+            prog = progName
+            prog = re.sub(r'.exe','',prog)
+            progData[progName] = {}
+            progData[progName]['progName'] = prog
+            
+            progData[progName]['soList'] = []
+        progData[progName]['soList'].append(soName)
+       
+    def generateMakeFile():
+        makeFileData = {}
+       
+        for libr in libData.keys():
+             makeFileData['libList'] = []
+             makeFileData['libList'].append(libData[libr])
+        for prog in progData.keys():
+            makeFileData['progList']=[]
+            makeFileData['progList'].append(progData[prog])
+        
+        
+        ttFileName = 'tts/makefiletemplate.tt'
+       
+        fileName = 'Makefile'
+        outputDir='../../src/gtpV2Codec'
+        
+        template.__init__({'OUTPUT' : fileName, 'OUTPUT_PATH' : outputDir})
+        template.process(ttFileName, {'makefiledata': makeFileData})
+        
+xlUtils()
diff --git a/scripts/SMCodeGen/README.txt b/scripts/SMCodeGen/README.txt
new file mode 100644
index 0000000..66c7ac3
--- /dev/null
+++ b/scripts/SMCodeGen/README.txt
@@ -0,0 +1,28 @@
+Requirements:
+1.Python3.6.
+2.Install the template-toolkit package.
+	a. pip install Template-Toolkit-Python or 
+	b. git clone https://github.com/lmr/Template-Toolkit-Python, and set the path of the package in the codeGen.py script [as argument in sys.path.append]
+
+Inputs:
+	2 Json files:
+		generateItem.json - Defines path of templates, the class type to be generated(State/actionHandler/Enum), output directory to be produced.
+		stateMachineAppModel.json - Defines procedures, states for each procedure, event for each state, actions to be taken under each event and nextstate of the procedure.
+	
+		Existing actionHandler.h and attachActionHandlers.cpp,detachActionHandlers.cpp,s1ReleaseActionHandlers.cpp files from <top-dir>/include/mme-app/actionHandlers and <top-dir>/src/mme-app/actionHandlers respectively.
+		Place it in output directories as the output produced should be merged with existing file properly. 
+
+Output:
+	1.	mme states .cpp and header files. Copy to <top-dir>/src/mme-app/mme-states and <top-dir>/include/mme-app/mme-states
+	2.	stateFactory.h and stateFactory.cpp Copy to <top-dir>/src/mme-app/mme-states and <top-dir>/include/mme-app/mme-states
+	3.	actionHandlers
+			actionHandler.h and actionHandler source files per procedure (eg: attachActionHandlers.cpp, detachActionHandlers.cpp )
+			actionHandler.h should be placed in <top-dir>/include/mme-app/actionHandlers
+			attachActionHandler.cpp should placed in <top-dir>/src/mme-app/actionHandlers
+	4.	enums used by the MME state machine - <top-dir>/include/stateMachineFwk
+
+Execution:
+-Run the below command:
+	python codeGen.py
+
+
diff --git a/scripts/SMCodeGen/__init__.py b/scripts/SMCodeGen/__init__.py
new file mode 100644
index 0000000..95b7eed
--- /dev/null
+++ b/scripts/SMCodeGen/__init__.py
@@ -0,0 +1,15 @@
+# 
+# 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.
+# 
diff --git a/scripts/SMCodeGen/codeGen.py b/scripts/SMCodeGen/codeGen.py
new file mode 100644
index 0000000..15259be
--- /dev/null
+++ b/scripts/SMCodeGen/codeGen.py
@@ -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.
+# 
+
+import json, sys, os
+from os.path import join
+import utils
+
+with open('dataModels/stateMachineAppModel.json') as jsonFile:
+    stateMachineAppModelJSON = json.load(jsonFile)
+with open('dataModels/ctxtManagerAppModel.json') as jsonFile:
+    contextMgrAppModelJSON = json.load(jsonFile)
+
+def processTemplate(templateIp):
+    from template import Template
+    
+    utils.outputFileName = ''
+    if utils.outputFileKeyword != '':
+        utils.outputFileName = utils.getFileName(templateIp[utils.outputFileKeyword])    
+    if utils.outputFile != '':
+        utils.outputFileName = utils.outputFileName + utils.outputFile
+    
+    utils.outputFileName = utils.outputFileName + utils.outputFileExt
+
+    tt = Template({'EVAL_PYTHON':1, 'AUTO_RESET':1})
+    op = tt.process(utils.ttFileName, {'TemplateInputVar' : templateIp})
+    utils.WriteFile(utils.outputDir, utils.outputFileName, op, utils.mode)
+
+def getTemplateIn(appModelItems, depth):
+    depthChanged = False
+
+    if (depth == 0):
+        print(appModelItems)
+        processTemplate(appModelItems)
+        return
+    
+    if depthChanged == False:
+        depth = depth - 1
+        depthChanged = True
+        
+    for item in appModelItems:
+        getTemplateIn(item, depth)
+      
+def genCppCode(genModel, appModelJSON):
+    for item in genModel:
+        keyWord = item["appModelKeyword"]
+        depth = item["appModelValueDepth"]
+        utils.ttFileName = item["templateFile"]
+        utils.outputDir = item["outputPath"]
+        utils.outputFile = item["outputFile"]
+        utils.outputFileKeyword = item["outputFileKey"]
+        utils.outputFileExt = item["outputFileExt"]
+        utils.mode = item["mode"]
+        
+        if not os.path.exists(utils.outputDir):
+            os.makedirs(utils.outputDir)
+        
+        appModelItems = utils.get_key_values(appModelJSON, keyWord) 
+        getTemplateIn(appModelItems, depth)
+            
+with open('dataModels/generationItem.json') as JSONFile:
+    GenItemJSON = json.load(JSONFile)
+    if 'Model1' in GenItemJSON:
+        genCppCode(GenItemJSON['Model1'], stateMachineAppModelJSON)
+    if "Model2" in GenItemJSON:
+        genCppCode(GenItemJSON['Model2'], contextMgrAppModelJSON)
+    
diff --git a/scripts/SMCodeGen/dataModels/ctxtManagerAppModel.json b/scripts/SMCodeGen/dataModels/ctxtManagerAppModel.json
new file mode 100644
index 0000000..0d6c83e
--- /dev/null
+++ b/scripts/SMCodeGen/dataModels/ctxtManagerAppModel.json
@@ -0,0 +1,309 @@
+{
+"DataStore":
+	{
+     "DataGroups":[
+        {
+		"DgName":"SubscriberData",
+		"PoolSize":"8000",
+         "DataBlocks":[
+            {
+			"BlockName":"UEContext",
+            "BlockType":"Permanent",
+            "Parent":"None",
+            "Children":["MmContext", "SessionContext"],
+            "PoolSize":"8000",
+            "Cardinality":"1",
+            "Data":[
+                {
+				"Name": "enbFd",
+                "Type": "int",
+				"Key":"No"
+				},
+                {
+				"Name": "s1apEnbUeId",
+                "Type": "int",
+				"Key":"No"
+				},
+                {
+				"Name": "subscriptionStatus",
+                "Type": "int",
+				"Key":"No"
+				},
+                {
+				"Name": "netAccessMode",
+                "Type": "int",
+				"Key":"No"
+				},
+                {
+				"Name": "contextID",
+                "Type": "uint32_t",
+				"Key":"No"
+				},
+                {
+				"Name": "rauTauTimer",
+                "Type": "unsigned int",
+				"Key":"No"
+				},
+                {
+				"Name": "accessRestrictionData",
+                "Type": "unsigned int",
+				"Key":"No"
+				},
+                {
+				"Name": "imsi",
+                "Type": "DigitRegister15",
+				"Key":"Yes"
+				},
+                {
+				"Name": "mTmsi",
+                "Type": "uint32_t",
+				"Key":"Yes"
+				},
+                {
+				"Name": "msisdn",
+                "Type": "DigitRegister15",
+				"Key":"No"
+				},
+                {
+				"Name": "dwnLnkSeqNo",
+                "Type": "unsigned short",
+				"Key":"No"
+				},
+                {
+				"Name": "upLnkSeqNo",
+                "Type": "unsigned short",
+				"Key":"No"
+				},
+                {
+				"Name": "ueState",
+                "Type": "UE_State_e",
+				"Key":"No"
+				},
+                {
+				"Name": "tai",
+                "Type": "Tai",
+				"Key":"No"
+				},
+                {
+				"Name": "utranCgi",
+                "Type": "Cgi",
+				"Key":"No"
+				},
+                {
+				"Name": "msNetCapab",
+                "Type": "Ms_net_capab",
+				"Key":"No"
+				},
+                {
+				"Name": "ueNetCapab",
+                "Type": "Ue_net_capab",
+				"Key":"No"
+				},
+                {
+				"Name": "ueSecInfo",
+                "Type": "Secinfo",
+				"Key":"No"
+				},
+                {
+				"Name": "ambr",
+                "Type": "Ambr",
+				"Key":"No"
+				},
+                {
+				"Name": "aiaSecInfo",
+                "Type": "E_utran_sec_vector",
+				"Key":"No"
+				}
+                ]
+            },
+			{
+			"BlockName":"MmContext",
+            "BlockType":"Permanent",
+            "Parent":"UEContext",
+            "Children":[],
+            "PoolSize":"8000",
+            "Cardinality":"1",
+            "Data":[
+                {
+				"Name": "mmState",
+                "Type": "EmmState",
+				"Key":"No"
+				}
+				]
+            },
+            {
+			"BlockName":"SessionContext",
+            "BlockType":"Permanent",
+            "Parent":"UEContext",
+            "Children":["BearerContext"],
+            "PoolSize":"8000",
+            "Cardinality":"3",
+            "Data":[
+                {
+				"Name": "sessionId",
+                "Type": "uint8_t",
+				"Key" : "No"
+				},
+				{
+				"Name": "s11SgwCtrlFteid",
+                "Type": "Fteid",
+				"Key":"No"
+				},
+				{
+				"Name": "s5S8PgwCtrlFteid",
+                "Type": "Fteid",
+				"Key":"No"
+				},
+				{
+				"Name": "pdnAddr",
+                "Type": "Paa",
+				"Key":"No"
+				},
+				{
+				"Name": "accessPtName",
+                "Type": "Apn_name",
+				"Key":"No"
+				},
+				{
+				"Name": "apnConfigProfileCtxId",
+                "Type": "unsigned int",
+				"Key":"No"
+				}
+                ]
+            },
+            {
+			"BlockName":"BearerContext",
+            "BlockType":"Permanent",
+            "Parent":"SessionContext",
+            "PoolSize":"8000",
+            "Cardinality":"11",
+            "Data":[
+				{
+				"Name": "s1uSgwUserFteid",
+                "Type": "Fteid",
+				"Key":"No"
+				},
+                {
+				"Name": "s5S8PgwUserFteid",
+				"Type": "Fteid",
+				"Key":"No"
+				},
+                {
+				"Name": "s1uEnbUserFteid",
+				"Type": "Fteid",
+				"Key":"No"
+				},
+                {
+				"Name": "bearerId",
+				"Type": "unsigned char",
+				"Key":"No"
+				}
+                ]
+			},
+			{
+			"BlockName":"MmeProcedureCtxt",
+            "BlockType":"Temporary",
+            "PoolSize":"8000",
+            "Cardinality":"1",
+            "Data":[
+				{
+				"Name": "ctxtType",
+                "Type": "ProcedureType",
+				"Key":"No"
+				},
+				{
+				"Name": "mmeErrorCause",
+                "Type": "MmeErrorCause",
+				"Key":"No"
+				},	
+				{
+				"Name": "attachType",
+                "Type": "AttachType",
+				"Key":"No"
+				},
+				{
+				"Name": "pti",
+                "Type": "uint8_t",
+				"Key":"No"
+				},
+				{
+				"Name": "esmInfoTxRequired",
+                "Type": "bool",
+				"Key":"No"
+				}
+                ]
+			},
+			{
+			"BlockName":"MmeDetachProcedureCtxt",
+            "BlockType":"Temporary",
+            "PoolSize":"8000",
+            "Cardinality":"1",
+            "Data":[
+				{
+				"Name": "detachType",
+                "Type": "DetachType",
+				"Key":"No"
+				},
+				{
+				"Name": "cancellationType",
+                "Type": "CancellationType",
+				"Key":"No"
+				}
+                ]
+			},			
+            {
+			"BlockName":"MmeSvcReqProcedureCtxt",
+            "BlockType":"Temporary",
+            "PoolSize":"8000",
+            "Cardinality":"1",
+            "Data":[
+				{
+				"Name": "pagingTrigger",
+                "Type": "PagingTrigger",
+				"Key":"No"
+				},
+				{
+				"Name": "epsBearerId",
+                "Type": "uint8_t",
+				"Key":"No"
+				},
+				{
+				"Name": "arp",
+                "Type": "Arp",
+				"Key":"No"
+				},
+				{
+				"Name": "ddnSeqNum",
+                "Type": "uint32_t",
+				"Key":"No"
+				}
+			]
+			},
+			{
+			"BlockName":"MmeTauProcedureCtxt",
+            "BlockType":"Temporary",
+            "PoolSize":"8000",
+            "Cardinality":"1",
+            "Data":[
+				{
+				"Name": "s1apEnbUeId",
+                "Type": "int",
+				"Key":"No"
+				},
+                {
+				"Name": "tai",
+                "Type": "Tai",
+				"Key":"No"
+				},				
+				{
+				"Name": "enbFd",
+                "Type": "int",
+				"Key":"No"
+				}
+                ]
+			}
+            ]
+        }
+        ]
+	}
+}
diff --git a/scripts/SMCodeGen/dataModels/generationItem.json b/scripts/SMCodeGen/dataModels/generationItem.json
new file mode 100644
index 0000000..c14504a
--- /dev/null
+++ b/scripts/SMCodeGen/dataModels/generationItem.json
@@ -0,0 +1,118 @@
+{
+    "Model1" :
+    [  
+	    {
+            "appModelKeyword" : "States",
+            "appModelValueDepth" : 2, 
+            "templateFile" : "templates/stateMachineTmpls/state.h.tt",
+            "outputPath" : "output/states/headers",
+            "outputFile": "",
+            "outputFileKey": "Name",
+            "outputFileExt" : ".h",
+            "mode" : "overwrite"
+        },
+        {
+            "appModelKeyword" : "States",
+            "appModelValueDepth" : 2, 
+            "templateFile" : "templates/stateMachineTmpls/state.cpp.tt",
+            "outputPath" : "output/states/cpp",
+            "outputFile": "",
+            "outputFileKey": "Name",
+            "outputFileExt" : ".cpp",
+            "mode" : "overwrite"
+        },
+        {
+            "appModelKeyword" : "Procedures",
+            "appModelValueDepth" : 0, 
+            "templateFile" : "templates/stateMachineTmpls/enum.tt",
+            "outputPath" : "output/enums",
+            "outputFile": "smEnumTypes",
+            "outputFileKey": "",
+            "outputFileExt" : ".h",
+            "mode" : "overwrite"
+        },
+        {
+            "appModelKeyword" : "Actions",
+            "appModelValueDepth" : 0, 
+            "templateFile" : "templates/stateMachineTmpls/actionHandlers.h.tt",
+            "outputPath" : "output/actionHandler/header",
+            "outputFile": "actionHandlers",
+            "outputFileKey": "",
+            "outputFileExt" : ".h",
+            "mode" : "overwrite"
+        },    
+        {
+            "appModelKeyword" : "Procedures",
+            "appModelValueDepth" : 2, 
+            "templateFile" : "templates/stateMachineTmpls/actionHandlers.cpp.tt",
+            "outputPath" : "output/actionHandler/cpp",
+            "outputFile": "ActionHandlers",
+            "outputFileKey": "Name",
+            "outputFileExt" : ".cpp",
+            "mode" : "append"
+        },
+	    {
+    	    "appModelKeyword" : "States",
+            "appModelValueDepth" : 0,
+            "templateFile" : "templates/stateMachineTmpls/stateFactory.cpp.tt",
+            "outputPath" : "output/states/cpp",
+            "outputFile": "stateFactory",
+            "outputFileKey": "",
+            "outputFileExt" : ".cpp",
+            "mode" : "overwrite"
+	    },
+	    {
+    	    "appModelKeyword" : "States",
+            "appModelValueDepth" : 0,
+            "templateFile" : "templates/stateMachineTmpls/stateFactory.h.tt",
+            "outputPath" : "output/states/headers",
+            "outputFile": "stateFactory",
+            "outputFileKey": "",
+            "outputFileExt" : ".h",
+            "mode" : "overwrite"
+	    }
+    ],
+    "Model2" :
+    [
+	    {
+            "appModelKeyword" : "DataBlocks",
+            "appModelValueDepth" : 2,
+            "templateFile" : "templates/ctxtManagerTmpls/blockPoolManager.h.tt",
+            "outputPath" : "output/contextManager/dg/headers",
+            "outputFile": "Manager",
+            "outputFileKey": "BlockName",
+            "outputFileExt" : ".h",
+            "mode" : "overwrite"
+        },
+	    {
+            "appModelKeyword" : "DataBlocks",
+            "appModelValueDepth" : 2,
+            "templateFile" : "templates/ctxtManagerTmpls/blockPoolManager.cpp.tt",
+            "outputPath" : "output/contextManager/dg/cpp",
+            "outputFile": "Manager",
+            "outputFileKey": "BlockName",
+            "outputFileExt" : ".cpp",
+            "mode" : "overwrite"
+        },
+	    {
+            "appModelKeyword" : "DataGroups",
+            "appModelValueDepth" : 2,
+            "templateFile" : "templates/ctxtManagerTmpls/subsDataGroupManager.h.tt",
+            "outputPath" : "output/contextManager/dg/headers",
+            "outputFile": "subsDataGroupManager",
+            "outputFileKey": "",
+            "outputFileExt" : ".h",
+            "mode" : "overwrite"
+        },
+	    {
+            "appModelKeyword" : "DataGroups",
+            "appModelValueDepth" : 2,
+            "templateFile" : "templates/ctxtManagerTmpls/subsDataGroupManager.cpp.tt",
+            "outputPath" : "output/contextManager/dg/cpp",
+            "outputFile": "subsDataGroupManager",
+            "outputFileKey": "",
+            "outputFileExt" : ".cpp",
+            "mode" : "overwrite"
+        }
+    ]
+}
diff --git a/scripts/SMCodeGen/dataModels/stateMachineAppModel.json b/scripts/SMCodeGen/dataModels/stateMachineAppModel.json
new file mode 100644
index 0000000..d72b6d2
--- /dev/null
+++ b/scripts/SMCodeGen/dataModels/stateMachineAppModel.json
@@ -0,0 +1,540 @@
+{
+    "Application":{
+        "Name":"mme",
+        "Procedures":[
+            {
+                "Name":"DEFAULT_MME_PROCEDURE",
+                "States":[
+                    {
+                        "Name":"default_mme_state",
+                        "Events":[
+                            {
+                                "Name":"ATTACH_REQ_FROM_UE",
+                                "Actions":[
+                                    "DEFAULT_ATTACH_REQ_HANDLER"
+                                ],
+                                "NextState":"end_state"
+                            },
+                            {
+                                "Name":"DETACH_REQ_FROM_UE",
+                                "Actions":[
+                                    "DEFAULT_DETACH_REQ_HANDLER"
+                                ],
+                                "NextState":"end_state"
+                            },
+                            {
+                                "Name":"S1_REL_REQ_FROM_UE",
+                                "Actions":[
+                                    "DEFAULT_S1_RELEASE_REQ_HANDLER"
+                                ],
+                                "NextState":"end_state"
+                            },
+                            {
+                                "Name":"DDN_FROM_SGW",
+                                "Actions":[
+                                    "DEFAULT_DDN_HANDLER"
+                                ],
+                                "NextState":"end_state"
+                            },
+                            {
+                                "Name":"SERVICE_REQUEST_FROM_UE",
+                                "Actions":[
+                                    "DEFAULT_SERVICE_REQ_HANDLER"
+                                ],
+                                "NextState":"end_state"
+                            },
+                            {
+                                "Name":"CLR_FROM_HSS",
+                                "Actions":[
+                                    "DEFAULT_CANCEL_LOC_REQ_HANDLER"
+                                ],
+                                "NextState":"end_state"
+                            },
+                            {
+                                "Name":"TAU_REQUEST_FROM_UE",
+                                "Actions":[
+                                    "DEFAULT_TAU_REQ_HANDLER"
+                                ],
+                                "NextState":"end_state"
+                            }
+                        ]
+                    }
+                ]
+            },
+            {
+                "Name":"ATTACH",
+                "States":[
+                    {
+                        "Name":"attach_start",
+                        "Events":[
+                            {
+                                "Name":"VALIDATE_IMSI",
+                                "Actions":[
+                                    "VALIDATE_IMSI_IN_UE_CONTEXT"
+                                ],
+                                "NextState":"attach_wf_imsi_validate_action"
+                            }
+                        ]
+                    },
+                    {
+                        "Name":"attach_wf_imsi_validate_action",
+                        "Events":[
+                            {
+                                "Name":"IMSI_VALIDATION_SUCCESS",
+                                "Actions":[
+                                    "SEND_AIR_TO_HSS"
+                                ],
+                                "NextState":"attach_wf_aia"
+                            },
+                            {
+                                "Name":"IMSI_VALIDATION_FAILURE",
+                                "Actions":[
+                                    "SEND_IDENTITY_REQUEST_TO_UE"
+                                ],
+                                "NextState":"attach_wf_identity_response"
+                            }
+                        ]
+                    },					
+                    {
+                        "Name":"attach_wf_aia",
+                        "Events":[
+                            {
+                                "Name":"AIA_FROM_HSS",
+                                "Actions":[
+                                    "PROCESS_AIA",
+                                    "AUTH_REQ_TO_UE"
+                                ],
+                                "NextState":"attach_wf_auth_resp"
+                            }
+                        ]
+                    },
+                    {
+                        "Name":"attach_wf_identity_response",
+                        "Events":[
+                            {
+                                "Name":"IDENTITY_RESPONSE_FROM_UE",
+                                "Actions":[
+                                    "PROCESS_IDENTITY_RESPONSE",
+                                    "SEND_AIR_TO_HSS"
+                                ],
+                                "NextState":"attach_wf_aia"
+                            }
+                        ]
+                    },
+                    {
+                        "Name":"attach_wf_auth_resp",
+                        "Events":[
+                            {
+                                "Name":"AUTH_RESP_FROM_UE",
+                                "Actions":[
+                                    "AUTH_RESPONSE_VALIDATE"
+                                ],
+                                "NextState":"attach_wf_auth_resp_validate"
+                            }
+                        ]
+                    },
+                    {
+                        "Name":"attach_wf_auth_resp_validate",
+                        "Events":[
+                            {
+                                "Name":"AUTH_RESP_SUCCESS",
+                                "Actions":[
+                                    "SEC_MODE_CMD_TO_UE"
+                                ],
+                                "NextState":"attach_wf_sec_cmp"
+                            },
+                            {
+                                "Name":"AUTH_RESP_SYNC_FAILURE",
+                                "Actions":[
+                                    "SEND_AIR_TO_HSS"
+                                ],
+                                "NextState":"attach_wf_aia"
+                            },
+                            {
+                                "Name":"AUTH_RESP_FAILURE",
+                                "Actions":[
+                                    "SEND_AUTH_REJECT"
+                                ],
+                                "NextState":"end_state"
+                            }
+                        ]
+                    },
+                    {
+                        "Name":"attach_wf_sec_cmp",
+                        "Events":[
+                            {
+                                "Name":"SEC_MODE_RESP_FROM_UE",
+                                "Actions":[
+                                    "PROCESS_SEC_MODE_RESP",
+                                    "CHECK_ESM_INFO_REQ_REQUIRED"
+                                ],
+                                "NextState":"attach_wf_esm_info_check"
+                            }
+                        ]
+                    },
+                    {
+                        "Name":"attach_wf_esm_info_check",
+                        "Events":[
+                            {
+                                "Name":"ESM_INFO_REQUIRED",
+                                "Actions":[
+                                    "SEND_ESM_INFO_REQ_TO_UE"
+                                ],
+                                "NextState":"attach_wf_esm_info_resp"
+                            },
+                            {
+                                "Name":"ESM_INFO_NOT_REQUIRED",
+                                "Actions":[
+                                    "SEND_ULR_TO_HSS"
+                                ],
+                                "NextState":"attach_wf_ula"
+                            }
+                        ]
+                    },
+                    {
+                        "Name":"attach_wf_esm_info_resp",
+                        "Events":[
+                            {
+                                "Name":"ESM_INFO_RESP_FROM_UE",
+                                "Actions":[
+                                    "PROCESS_ESM_INFO_RESP",
+                                    "SEND_ULR_TO_HSS"
+                                ],
+                                "NextState":"attach_wf_ula"
+                            }
+                        ]
+                    },
+                    {
+                        "Name":"attach_wf_ula",
+                        "Events":[
+                            {
+                                "Name":"ULA_FROM_HSS",
+                                "Actions":[
+                                    "PROCESS_ULA",
+                                    "CS_REQ_TO_SGW"
+                                ],
+                                "NextState":"attach_wf_cs_resp"
+                            }
+                        ]
+                    },					
+                    {
+                        "Name":"attach_wf_cs_resp",
+                        "Events":[
+                            {
+                                "Name":"CS_RESP_FROM_SGW",
+                                "Actions":[
+                                    "PROCESS_CS_RESP",
+                                    "SEND_INIT_CTXT_REQ_TO_UE"
+                                ],
+                                "NextState":"attach_wf_init_ctxt_resp_att_cmp"
+                            }
+                        ]
+                    },
+                    {
+                        "Name":"attach_wf_init_ctxt_resp_att_cmp",
+                        "Events":[
+                            {
+                                "Name":"INIT_CTXT_RESP_FROM_UE",
+                                "Actions":[
+                                    "PROCESS_INIT_CTXT_RESP"
+                                ],
+                                "NextState":"attach_wf_att_cmp"
+                            },
+                            {
+                                "Name":"ATT_CMP_FROM_UE",
+                                "Actions":[
+                                    "PROCESS_ATTACH_CMP_FROM_UE"
+                                ],
+                                "NextState":"attach_wf_init_ctxt_resp"
+                            }
+                        ]
+                    },
+                    {
+                        "Name":"attach_wf_init_ctxt_resp",
+                        "Events":[
+                            {
+                                "Name":"INIT_CTXT_RESP_FROM_UE",
+                                "Actions":[
+                                    "PROCESS_INIT_CTXT_RESP",
+                                    "SEND_MB_REQ_TO_SGW"
+                                ],
+                                "NextState":"attach_wf_mb_resp"
+                            }
+                        ]
+                    },
+                    {
+                        "Name":"attach_wf_att_cmp",
+                        "Events":[
+                            {
+                                "Name":"ATT_CMP_FROM_UE",
+                                "Actions":[
+                                    "PROCESS_ATTACH_CMP_FROM_UE",
+                                    "SEND_MB_REQ_TO_SGW"
+                                ],
+                                "NextState":"attach_wf_mb_resp"
+                            }
+                        ]
+                    },
+                    {
+                        "Name":"attach_wf_mb_resp",
+                        "Events":[
+                            {
+                                "Name":"MB_RESP_FROM_SGW",
+                                "Actions":[
+                                    "PROCESS_MB_RESP",
+                                    "ATTACH_DONE"
+                                ],
+                                "NextState":"end_state"
+                            }
+                        ]
+                    }
+                ]
+            },
+            {
+                "Name":"UE_INIT_DETACH",
+                "States":[
+                    {
+                        "Name":"detach_start",
+                        "Events":[
+                            {
+                                "Name":"DETACH_REQ_FROM_UE",
+                                "Actions":[
+                                    "DEL_SESSION_REQ"
+                                ],
+                                "NextState":"detach_wf_del_session_resp"
+                            }
+                        ]
+                    },
+                    {
+                        "Name":"detach_wf_del_session_resp",
+                        "Events":[
+                            {
+                                "Name":"DEL_SESSION_RESP_FROM_SGW",
+                                "Actions":[
+                                    "PROCESS_DEL_SESSION_RESP",
+                                    "DETACH_ACCEPT_TO_UE"
+                                ],
+                                "NextState":"end_state"
+                            }
+                        ]
+                    }
+                ]
+            },
+            {
+                "Name":"S1_RELEASE",
+                "States":[
+                    {
+                        "Name":"s1_release_start",
+                        "Events":[
+                            {
+                                "Name":"S1_REL_REQ_FROM_UE",
+                                "Actions":[
+                                    "SEND_REL_AB_REQ_TO_SGW"
+                                ],
+                                "NextState":"s1_release_wf_release_access_bearer_resp"
+                            }
+                        ]
+                    },
+                    {
+                        "Name":"s1_release_wf_release_access_bearer_resp",
+                        "Events":[
+                            {
+                                "Name":"REL_AB_RESP_FROM_SGW",
+                                "Actions":[
+                                    "PROCESS_REL_AB_RESP_FROM_SGW",
+                                    "SEND_S1_REL_CMD_TO_UE"
+                                ],
+                                "NextState":"s1_release_wf_ue_ctxt_release_comp"
+                            }
+                        ]
+                    },
+                    {
+                        "Name":"s1_release_wf_ue_ctxt_release_comp",
+                        "Events":[
+                            {
+                                "Name":"UE_CTXT_REL_COMP_FROM_ENB",
+                                "Actions":[
+                                    "PROCESS_UE_CTXT_REL_COMP"
+                                ],
+                                "NextState":"end_state"
+                            }
+                        ]
+                    }
+                ]
+            },
+            {
+                "Name":"NETWORK_INIT_DETACH",
+                "States":[
+                    {
+                        "Name":"ni_detach_start",
+                        "Events":[
+                            {
+                                "Name":"CLR_FROM_HSS",
+                                "Actions":[
+                                    "NI_DETACH_REQ_TO_UE",
+                                    "DEL_SESSION_REQ"
+                                ],
+                                "NextState":"ni_detach_wf_det_accpt_del_sess_resp"
+                            }
+                        ]
+                    },
+                    {
+                        "Name":"ni_detach_wf_det_accpt_del_sess_resp",
+                        "Events":[
+                            {
+                                "Name":"DETACH_ACCEPT_FROM_UE",
+                                "Actions":[
+                                    "PROCESS_DETACH_ACCEPT_FROM_UE"
+                                ],
+                                "NextState":"ni_detach_wf_del_sess_resp"
+                            },
+                            {
+                                "Name":"DEL_SESSION_RESP_FROM_SGW",
+                                "Actions":[
+                                    "PROCESS_DEL_SESSION_RESP"
+                                ],
+                                "NextState":"ni_detach_wf_detach_accept"
+                            }
+                        ]
+                    },
+                    {
+                        "Name":"ni_detach_wf_del_sess_resp",
+                        "Events":[
+                            {
+                                "Name":"DEL_SESSION_RESP_FROM_SGW",
+                                "Actions":[
+                                    "PROCESS_DEL_SESSION_RESP",
+                                    "SEND_S1_REL_CMD_TO_UE"
+                                ],
+                                "NextState":"ni_detach_wf_s1_rel_comp"
+                            }
+                        ]
+                    },
+                    {
+                        "Name":"ni_detach_wf_detach_accept",
+                        "Events":[
+                            {
+                                "Name":"DETACH_ACCEPT_FROM_UE",
+                                "Actions":[
+                                    "PROCESS_DETACH_ACCEPT_FROM_UE",
+                                    "SEND_S1_REL_CMD_TO_UE_FOR_DETACH"
+                                ],
+                                "NextState":"ni_detach_wf_s1_rel_comp"
+                            }
+                        ]
+                    },
+                    {
+                        "Name":"ni_detach_wf_s1_rel_comp",
+                        "Events":[
+                            {
+                                "Name":"UE_CTXT_REL_COMP_FROM_ENB",
+                                "Actions":[
+                                    "PROCESS_UE_CTXT_REL_COMP_FOR_DETACH"
+                                ],
+                                "NextState":"end_state"
+                            }
+                        ]
+                    }
+                ]
+            },
+            {
+                "Name":"SERVICE_REQUEST",
+                "States":[
+                    {
+                        "Name":"paging_start",
+                        "Events":[
+                            {
+                                "Name":"DDN_FROM_SGW",
+                                "Actions":[
+                                    "SEND_PAGING_REQ_TO_UE"
+                                ],
+                                "NextState":"paging_wf_service_req"
+                            }
+                        ]
+                    },
+                    {
+                        "Name":"service_request_start",
+                        "Events":[
+                            {
+                                "Name":"SERVICE_REQUEST_FROM_UE",
+                                "Actions":[
+                                    "PROCESS_SERVICE_REQUEST",
+                                    "PERFORM_AUTH_AND_SEC_CHECK"
+                                ],
+                                "NextState":"service_request_wf_auth_and_sec_check_cmp"
+                            }
+                        ]
+                    },
+                    {
+                        "Name":"paging_wf_service_req",
+                        "Events":[
+                            {
+                                "Name":"SERVICE_REQUEST_FROM_UE",
+                                "Actions":[
+                                    "PROCESS_SERVICE_REQUEST",
+                                    "SEND_DDN_ACK_TO_SGW",
+                                    "PERFORM_AUTH_AND_SEC_CHECK"
+                                ],
+                                "NextState":"service_request_wf_auth_and_sec_check_cmp"
+                            }
+                        ]
+                    },
+                    {
+                        "Name":"service_request_wf_auth_and_sec_check_cmp",
+                        "Events":[
+                            {
+                                "Name":"AUTH_AND_SEC_CHECK_COMPLETE",
+                                "Actions":[
+                                    "SEND_INIT_CTXT_REQ_TO_UE_SVC_REQ"
+                                ],
+                                "NextState":"service_request_wf_init_ctxt_resp"
+                            }
+                        ]
+                    },
+                    {
+                        "Name":"service_request_wf_init_ctxt_resp",
+                        "Events":[
+                            {
+                                "Name":"INIT_CTXT_RESP_FROM_UE",
+                                "Actions":[
+                                    "PROCESS_INIT_CTXT_RESP_SVC_REQ",
+                                    "SEND_MB_REQ_TO_SGW_SVC_REQ"
+                                ],
+                                "NextState":"service_request_wf_mb_resp"
+                            }
+                        ]
+                    },
+                    {
+                        "Name":"service_request_wf_mb_resp",
+                        "Events":[
+                            {
+                                "Name":"MB_RESP_FROM_SGW",
+                                "Actions":[
+                                    "PROCESS_MB_RESP_SVC_REQ"
+                                ],
+                                "NextState":"end_state"
+                            }
+                        ]
+                    }
+                ]
+            },
+            {
+                "Name":"TAU",
+                "States":[
+                    {
+                        "Name":"tau_start",
+                        "Events":[
+                            {
+                                "Name":"TAU_REQUEST_FROM_UE",
+                                "Actions":[
+                                    "SEND_TAU_RESPONSE_TO_UE"
+                                ],
+                                "NextState":"end_state"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/scripts/SMCodeGen/templates/ctxtManagerTmpls/blockPoolManager.cpp.tt b/scripts/SMCodeGen/templates/ctxtManagerTmpls/blockPoolManager.cpp.tt
new file mode 100644
index 0000000..f95a5a7
--- /dev/null
+++ b/scripts/SMCodeGen/templates/ctxtManagerTmpls/blockPoolManager.cpp.tt
@@ -0,0 +1,71 @@
+ [%- DataBlock = TemplateInputVar %]
+ [%- USE String %]
+ [%- MACRO CLASSNAME(str) BLOCK %]
+ [%- className =  String.new %]
+ [%- strList =  String.new(str).split("_") %]
+ [%- FOREACH str = strList %]
+ [%-    token = className.append(String.new(str).capital.text()) %]
+ [%- END %]
+ [%- className = className.append("Manager") %]
+ [%- className %]
+ [%- END %]
+ [%- MACRO FILENAME(str) BLOCK %]
+ [%- fileName =  String.new %]
+ [%- str = CLASSNAME(str) %]
+ [%- fileName = fileName.append(str.substr(0,1)).lower %]
+ [%- fileName = fileName.append(str.substr(1)) %]
+ [%- fileName %]
+ [%- END %] 
+ [%- poolMgrClassName = CLASSNAME(DataBlock.BlockName) -%]
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */ 
+/******************************************************************************
+ * [% FILENAME(DataBlock.BlockName) %].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/[% FILENAME(DataBlock.BlockName) %].h"
+
+using namespace cmn::memPool;
+
+namespace mme
+{
+	/******************************************************************************
+	* Constructor
+	******************************************************************************/
+	[%poolMgrClassName%]::[%poolMgrClassName%](int numOfBlocks):poolManager_m(numOfBlocks)
+	{
+	}
+	
+	/******************************************************************************
+	* Destructor
+	******************************************************************************/
+	[%poolMgrClassName%]::~[%poolMgrClassName%]()
+	{
+	}
+	
+	/******************************************************************************
+	* Allocate [% DataBlock.BlockName %] data block
+	******************************************************************************/
+	[% DataBlock.BlockName %]* [%poolMgrClassName%]::allocate[% DataBlock.BlockName %]()
+	{
+		[% DataBlock.BlockName %]* [% DataBlock.BlockName %]_p = poolManager_m.allocate();
+		return [% DataBlock.BlockName %]_p;
+	}
+	
+	/******************************************************************************
+	* Deallocate a [% DataBlock.BlockName %] data block
+	******************************************************************************/
+	void [%poolMgrClassName%]::deallocate[% DataBlock.BlockName %]([% DataBlock.BlockName %]* [% DataBlock.BlockName %]p)
+	{
+		poolManager_m.free( [% DataBlock.BlockName %]p );
+	}
+}
\ No newline at end of file
diff --git a/scripts/SMCodeGen/templates/ctxtManagerTmpls/blockPoolManager.h.tt b/scripts/SMCodeGen/templates/ctxtManagerTmpls/blockPoolManager.h.tt
new file mode 100644
index 0000000..5055d19
--- /dev/null
+++ b/scripts/SMCodeGen/templates/ctxtManagerTmpls/blockPoolManager.h.tt
@@ -0,0 +1,82 @@
+ [%- DataBlock = TemplateInputVar %]
+ [%- USE String %]
+ [%- MACRO CLASSNAME(str) BLOCK %]
+ [%- className =  String.new %]
+ [%- strList =  String.new(str).split("_") %]
+ [%- FOREACH str = strList %]
+ [%-    token = className.append(String.new(str).capital.text()) %]
+ [%- END %]
+ [%- className = className.append("Manager") %]
+ [%- className %]
+ [%- END %]
+ [%- MACRO FILENAME(str) BLOCK %]
+ [%- fileName =  String.new %]
+ [%- str = CLASSNAME(str) %]
+ [%- fileName = fileName.append(str.substr(0,1)).lower %]
+ [%- fileName = fileName.append(str.substr(1)) %]
+ [%- fileName %]
+ [%- END %] 
+ [%- poolMgrClassName = CLASSNAME(DataBlock.BlockName) -%]
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 __[% poolMgrClassName %]__
+#define __[% poolMgrClassName %]__
+/******************************************************
+* [% FILENAME(DataBlock.BlockName) %].h
+ * 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.h.tt>
+ ***************************************/
+#include "memPoolManager.h"
+
+namespace mme
+{
+    class [%DataBlock.BlockName%];
+	class [%poolMgrClassName%]
+	{
+	public:
+		/****************************************
+		* [% poolMgrClassName %]
+		*  constructor
+		****************************************/
+		[%poolMgrClassName%](int numOfBlocks);
+		
+		/****************************************
+		* [% poolMgrClassName %]
+		*    Destructor
+		****************************************/
+		~[%poolMgrClassName%]();
+		
+		/******************************************
+		 * allocate[% DataBlock.BlockName %]
+		 *  allocate [% DataBlock.BlockName %] data block
+		 ******************************************/
+		[% DataBlock.BlockName %]* allocate[% DataBlock.BlockName %]();
+		
+		/******************************************
+		 * deallocate[% DataBlock.BlockName %]
+		 *  deallocate a [% DataBlock.BlockName %] data block
+		 ******************************************/
+		void deallocate[% DataBlock.BlockName %]([% DataBlock.BlockName %]* [% DataBlock.BlockName %]p );
+	
+	private:
+		cmn::memPool::MemPoolManager<[% DataBlock.BlockName %]> poolManager_m;
+	};
+};
+
+#endif
+		
+		
\ No newline at end of file
diff --git a/scripts/SMCodeGen/templates/ctxtManagerTmpls/dataBlocks.cpp.tt b/scripts/SMCodeGen/templates/ctxtManagerTmpls/dataBlocks.cpp.tt
new file mode 100644
index 0000000..18a1626
--- /dev/null
+++ b/scripts/SMCodeGen/templates/ctxtManagerTmpls/dataBlocks.cpp.tt
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+ [%- DataStore = templateIn %]
+ [%- USE String %]
+ [%- MACRO CLASSNAME(str) BLOCK %]
+ [%- className =  String.new %]
+ [%- strList =  String.new(str).split("_") %]
+ [%- FOREACH str = strList %]
+ [%-    token = className.append(String.new(str).capital.text()) %]
+ [%- END %]
+ [%- className %]
+ [%- END %]
+ [%- MACRO REF(str) BLOCK %]
+ [%- primTypeList = [ "int", "short", "uint8_t", "uint16_t", "uint32_t", "unsigned int", "unsigned char", "unsigned short", "bool" ] %]
+ [%- reference = String.new %]
+ [%- reference = '&' %]
+ [%- FOREACH type = primTypeList %]
+ [%- 	IF str == type %]
+ [%-			reference = '' %]
+ [%-		END %]
+ [%- END %]
+ [%- reference %]
+ [%- END %]
+/**************************************
+ *
+ * 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/dataBlocks.cpp.tt>
+ ***************************************/
+#include "mmeBlocks/dataBlocks.h"
+
+namespace mme
+{
+	[%- FOREACH DataGroup = DataStore.DataGroups %]
+	[%- FOREACH DataBlock = DataGroup.DataBlocks %]
+	[%- dataBlockClassName = CLASSNAME(DataBlock.BlockName) %]
+	/******************************************************************************
+	*******************************************************************************
+	*							[% dataBlockClassName %]
+	*******************************************************************************
+	******************************************************************************/
+	
+	/******************************************************************************
+	* Constructor
+	******************************************************************************/
+	[% dataBlockClassName %]::[% dataBlockClassName %]()
+	{
+	}
+	
+	/******************************************************************************
+	* Destructor
+	******************************************************************************/
+	[% dataBlockClassName %]::~[% dataBlockClassName %]()
+	{
+	}
+	
+	[%- FOREACH Data = DataBlock.Data %]
+	/******************************************************************************
+	* sets [% Data.Name %]
+	******************************************************************************/
+	void [% dataBlockClassName %]::set[% Data.Name %]( const [% Data.Type %][% REF(Data.Type) %] [% Data.Name %]_i )
+	{
+		[% Data.Name %]_m = [% Data.Name %]_i;
+	}
+	
+	/******************************************************************************
+	* returns [% Data.Name %]
+	******************************************************************************/	
+	const [% Data.Type %][% REF(Data.Type) %] [% dataBlockClassName %]::get[% Data.Name %]()const
+	{
+		return [% Data.Name %]_m;
+	}
+	[%- END %]
+	
+	[%- FOREACH Child = DataBlock.Children %]
+	/******************************************************************************
+	* sets [% Child %]
+	******************************************************************************/
+	void [% dataBlockClassName %]::set[% Child %]( [% Child %]* [% Child %]p )
+	{
+		[% Child %]_mp = [% Child %]p;
+	}
+	
+	/******************************************************************************
+	* returns [% Child %]
+	******************************************************************************/
+	[% Child %]* [% dataBlockClassName %]::get[% Child %]()
+	{
+		return [% Child %]_mp;
+	}
+[%- END %]
+[%- END %]
+[%- END %]
+} // mme
\ No newline at end of file
diff --git a/scripts/SMCodeGen/templates/ctxtManagerTmpls/dataBlocks.h.tt b/scripts/SMCodeGen/templates/ctxtManagerTmpls/dataBlocks.h.tt
new file mode 100644
index 0000000..51a189d
--- /dev/null
+++ b/scripts/SMCodeGen/templates/ctxtManagerTmpls/dataBlocks.h.tt
@@ -0,0 +1,121 @@
+ [%- DataStore = templateIn %]
+ [%- USE String %]
+ [%- MACRO CLASSNAME(str) BLOCK %]
+ [%- className =  String.new %]
+ [%- strList =  String.new(str).split("_") %]
+ [%- FOREACH str = strList %]
+ [%-    token = className.append(String.new(str).capital.text()) %]
+ [%- END %]
+ [%- className %]
+ [%- END %]
+ [%- MACRO REF(str) BLOCK %]
+ [%- primTypeList = [ "int", "short", "uint8_t", "uint16_t", "uint32_t", "unsigned int", "unsigned char", "unsigned short", "bool" ] %]
+ [%- reference = String.new %]
+ [%- reference = '&' %]
+ [%- FOREACH type = primTypeList %]
+ [%- 	IF str == type %]
+ [%-			reference = '' %]
+ [%-		END %]
+ [%- END %]
+ [%- reference %]
+ [%- END %]
+ /*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 DGM_BLOCKSTRUCTURES_H
+#define DGM_BLOCKSTRUCTURES_H
+/**************************************
+ *
+ * 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/dataBlocks.h.tt>
+ ***************************************/
+#include "permDataBlock.h"
+#include "tempDataBlock.h"
+#include "structs.h"
+
+namespace mme
+{
+	[%- FOREACH DataGroup = DataStore.DataGroups %]
+	[%- FOREACH DataBlock = DataGroup.DataBlocks %]
+	[%- dataBlockClassName = CLASSNAME(DataBlock.BlockName) %]
+	class [% dataBlockClassName %];
+	[%- END %]
+	[%- END %]
+	
+	[%- FOREACH DataGroup = DataStore.DataGroups %]
+	[%- FOREACH DataBlock = DataGroup.DataBlocks %]
+	[%- dataBlockClassName = CLASSNAME(DataBlock.BlockName) %] 
+	class [% dataBlockClassName %]:public SM::[% IF DataBlock.BlockType == 'Permanent' %]PermDataBlock[% ELSE %]TempDataBlock[%- END %]
+	{
+		public:
+	
+			/****************************************
+			* [% dataBlockClassName %]
+			*    constructor
+			****************************************/
+			[% dataBlockClassName %]();
+			
+			/****************************************
+			* ~[% dataBlockClassName %]
+			*    destructor
+			****************************************/
+			~[% dataBlockClassName %]();
+			
+			[%- FOREACH Data = DataBlock.Data %]
+			/****************************************
+			* set[% Data.Name %]
+			*    set [% Data.Name %] to [% dataBlockClassName %]
+			****************************************/
+			void set[% Data.Name %]( const [% Data.Type %][% REF(Data.Type) %] [% Data.Name %]_i );
+			
+			/****************************************
+			* get[% Data.Name %]
+			*    get [% Data.Name %] from [% dataBlockClassName %]
+			****************************************/
+			const [% Data.Type %][% REF(Data.Type) %] get[% Data.Name %]()const;
+			[% END %]
+			
+			[%- FOREACH Child = DataBlock.Children %]
+			/****************************************
+			* set[% Child %]
+			*    set [% Child %] to [% dataBlockClassName %]
+			****************************************/
+			void set[% Child %]( [% Child %]* [% Child %]p ) ;
+			
+			/****************************************
+			* get[% Child %]
+			*    get [% Child %] to [% dataBlockClassName %]
+			****************************************/
+			[% Child %]* get[% Child %]();
+			[% END %]
+		
+		private:
+		
+			[%- FOREACH Data = DataBlock.Data %]
+			[%- DataName = CLASSNAME(Data.Name) %]
+			// DataName
+			[% Data.Type %] [% Data.Name %]_m;
+			[% END %]
+			
+			[%- FOREACH Child = DataBlock.Children %]
+			// [% Child %]
+			[% Child %]* [% Child %]_mp;
+			[% END %]
+	};
+	[% END %]
+	[% END %]
+} // mme
+#endif
\ No newline at end of file
diff --git a/scripts/SMCodeGen/templates/ctxtManagerTmpls/subsDataGroupManager.cpp.tt b/scripts/SMCodeGen/templates/ctxtManagerTmpls/subsDataGroupManager.cpp.tt
new file mode 100644
index 0000000..44b5a2f
--- /dev/null
+++ b/scripts/SMCodeGen/templates/ctxtManagerTmpls/subsDataGroupManager.cpp.tt
@@ -0,0 +1,135 @@
+[%- DataGroup = TemplateInputVar %]
+[%- USE String %]
+[%- MACRO CLASSNAME(str) BLOCK %]
+[%- className =  String.new %]
+[%- strList =  String.new(str).split("_") %]
+[%- FOREACH str = strList %]
+[%-    token = className.append(String.new(str).capital.text()) %]
+[%- END %]
+[%- className = className.append( "Manager" ) %]
+[%- className %]
+[%- END -%]
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+ 
+/**************************************
+ *
+ * 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()
+	{
+		[%- FOREACH DataBlock = DataGroup.DataBlocks %]
+			[% CLASSNAME(DataBlock.BlockName) %]m_p = NULL;
+		[%- END %]
+
+		initialize();
+	}
+	
+	/******************************************************************************
+	* Destructor
+	******************************************************************************/
+	SubsDataGroupManager::~SubsDataGroupManager()
+	{
+		[%- FOREACH DataBlock = DataGroup.DataBlocks %]
+			delete [% CLASSNAME(DataBlock.BlockName) %]m_p;
+		[%- END %]
+	}
+	
+	/******************************************
+	*  Initializes control block and pool managers
+	******************************************/
+	void SubsDataGroupManager::initialize()
+	{
+	    initializeCBStore([% DataGroup.PoolSize %]);
+
+		[%- FOREACH DataBlock = DataGroup.DataBlocks %]
+		[% CLASSNAME(DataBlock.BlockName) %]m_p = new [% CLASSNAME(DataBlock.BlockName) %]([% DataBlock.PoolSize %]);
+		[%- END %]
+	}
+	
+	/******************************************************************************
+	* creates and returns static instance
+	******************************************************************************/
+	SubsDataGroupManager* SubsDataGroupManager::Instance()
+	{
+			static SubsDataGroupManager subDataGroupMgr;
+			return &subDataGroupMgr;
+	}
+
+	[%- FOREACH DataBlock = DataGroup.DataBlocks %]
+	[% DataBlock.BlockName %]* SubsDataGroupManager::get[% DataBlock.BlockName %]()
+	{
+		return [% CLASSNAME(DataBlock.BlockName) %]m_p->allocate[% DataBlock.BlockName %]();
+	}
+
+	void SubsDataGroupManager::delete[% DataBlock.BlockName %]([% DataBlock.BlockName %]* [% DataBlock.BlockName %]p )
+	{
+		[% CLASSNAME(DataBlock.BlockName) %]m_p->deallocate[% DataBlock.BlockName %]( [% DataBlock.BlockName %]p );
+	}
+	[%- END %]
+	
+	[%- FOREACH DataBlock = DataGroup.DataBlocks %]
+		[%- FOREACH Data = DataBlock.Data %]
+			[%- IF Data.Key == 'Yes' %]
+	/******************************************
+	* Add a [% Data.Name %] as key and cb index as value to [% Data.Name %]_cb_id_map
+	******************************************/
+	int SubsDataGroupManager::add[% Data.Name %]key( [% Data.Type %] key, int cb_index )
+	{
+        std::lock_guard<std::mutex> lock([% Data.Name %]_cb_id_map_mutex);
+        
+        int rc = 1;
+        
+		auto itr = [% Data.Name %]_cb_id_map.insert(std::pair<[% Data.Type %], int>( key, cb_index ));
+		if(itr.second == false)
+		{
+			rc = -1;
+		}
+		return rc;
+	}
+	
+	/******************************************
+	* Delete a [% Data.Name %] key from [% Data.Name %]_cb_id_map
+	******************************************/		
+	int SubsDataGroupManager::delete[% Data.Name %]key( [% Data.Type %] key )
+	{
+        std::lock_guard<std::mutex> lock([% Data.Name %]_cb_id_map_mutex);
+ 
+		return [% Data.Name %]_cb_id_map.erase( key );
+	}
+	
+	/******************************************
+	* Find cb with given [% Data.Name %] from [% Data.Name %]_cb_id_map
+	* returns -1 if not found, else cb index
+	******************************************/	
+	int SubsDataGroupManager::findCBWith[% Data.Name %]( [% Data.Type %] key )
+	{
+        std::lock_guard<std::mutex> lock([% Data.Name %]_cb_id_map_mutex);
+        
+		auto itr = [% Data.Name %]_cb_id_map.find( key );
+		if( itr != [% Data.Name %]_cb_id_map.end())
+		{
+			return itr->second;
+		}
+		return -1;
+	}
+		     [%- END %]
+	    [%- END %]
+[%- END %]
+}
\ No newline at end of file
diff --git a/scripts/SMCodeGen/templates/ctxtManagerTmpls/subsDataGroupManager.h.tt b/scripts/SMCodeGen/templates/ctxtManagerTmpls/subsDataGroupManager.h.tt
new file mode 100644
index 0000000..dc34dec
--- /dev/null
+++ b/scripts/SMCodeGen/templates/ctxtManagerTmpls/subsDataGroupManager.h.tt
@@ -0,0 +1,148 @@
+ [%- DataGroup = TemplateInputVar %]
+ [%- USE String %]
+ [%- MACRO CLASSNAME(str) BLOCK %]
+ [%- className =  String.new %]
+ [%- strList =  String.new(str).split("_") %]
+ [%- FOREACH str = strList %]
+ [%-    token = className.append(String.new(str).capital.text()) %]
+ [%- END %]
+ [%- className = className.append( "Manager" ) %]
+ [%- className %]
+ [%- END %]
+ [%- MACRO FILENAME(str) BLOCK %]
+ [%- fileName =  String.new %]
+ [%- str = CLASSNAME(str) %]
+ [%- fileName = fileName.append(str.substr(0,1)).lower %]
+ [%- fileName = fileName.append(str.substr(1)) %]
+ [%- fileName %]
+ [%- END -%]
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 __SUBS_DATAGROUPMANAGER__
+#define __SUBS_DATAGROUPMANAGER__
+/**************************************
+ *
+ * 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.h.tt>
+ ***************************************/
+#include <map>
+#include "dataGroupManager.h"
+#include "contextManager/dataBlocks.h"
+[%- IF DataGroup.DgName == 'SubscriberData' %]
+[%- FOREACH DataBlock = DataGroup.DataBlocks %]
+#include "contextManager/[% FILENAME(DataBlock.BlockName) %].h"
+[%- END %]
+namespace mme
+{	
+	class SubsDataGroupManager:public cmn::DGM::DataGroupManager
+	{
+		public:
+		
+			/******************************************
+			* Instance 
+			*    Creates static instance for the SubsDataGroupManager
+			*******************************************/
+			static SubsDataGroupManager* Instance();
+	
+			/****************************************
+			* SubsDataGroupManager
+			*    Destructor
+			****************************************/
+			virtual ~SubsDataGroupManager();
+			
+			/******************************************
+			* initialize
+			*  Initializes control block and pool managers
+			******************************************/
+			void initialize();
+
+			[%- FOREACH DataBlock = DataGroup.DataBlocks %]
+			/******************************************
+			 * get[% DataBlock.BlockName %]
+			 *  Get [% DataBlock.BlockName %] data block
+			 ******************************************/
+			[% DataBlock.BlockName %]* get[% DataBlock.BlockName %]();
+			
+			/******************************************
+			 * delete[% DataBlock.BlockName %]
+			 *  Delete a [% DataBlock.BlockName %] data block
+			 ******************************************/
+			void delete[% DataBlock.BlockName %]([% DataBlock.BlockName %]* [% DataBlock.BlockName %]p );
+			[%- END %]
+			
+			[%- FOREACH DataBlock = DataGroup.DataBlocks %]
+				[%- FOREACH Data = DataBlock.Data %]
+					[%- IF Data.Key == 'Yes' %]
+			/******************************************
+			* add[% Data.Name %]key
+			* Add a [% Data.Name %] as key and cb index as value to [% Data.Name %]_cb_id_map
+			******************************************/
+			int add[% Data.Name %]key( [% Data.Type %] key, int cb_index );
+			
+			/******************************************
+			* delete[% Data.Name %]key
+			* delete a [% Data.Name %] key from [% Data.Name %]_cb_id_map
+			******************************************/		
+			int delete[% Data.Name %]key( [% Data.Type %] key );
+			
+			/******************************************
+			* findCBWith[% Data.Name %]
+			* Find cb with given [% Data.Name %] from [% Data.Name %]_cb_id_map
+			******************************************/	
+			int findCBWith[% Data.Name %]( [% Data.Type %] key );
+					[%- END %]
+				[%- END %]
+			[%- END %]
+			
+			
+		private:
+			
+			/****************************************
+			* SubsDataGroupManager
+			*    Private constructor
+			****************************************/
+			SubsDataGroupManager();  
+			
+			[%- FOREACH DataBlock = DataGroup.DataBlocks %]
+			/****************************************
+			* [% DataBlock.BlockName %] Pool Manager
+			****************************************/
+			[% CLASSNAME(DataBlock.BlockName) %]* [% CLASSNAME(DataBlock.BlockName) %]m_p;
+			
+			[%- END %]
+			
+			[%- FOREACH DataBlock = DataGroup.DataBlocks %]
+				[%- FOREACH Data = DataBlock.Data %]
+					[%- IF Data.Key == 'Yes' %]
+			/****************************************
+			* [% Data.Name %] Key Map
+			****************************************/
+			std::map<[% Data.Type %],int> [% Data.Name %]_cb_id_map;
+			
+			/****************************************
+			* [% Data.Name %] Key Map
+			****************************************/
+			std::mutex [% Data.Name %]_cb_id_map_mutex;			
+					[%- END %]
+				[%- END %]
+			[%- END %]
+	};
+};
+[% END %]
+
+#endif
\ No newline at end of file
diff --git a/scripts/SMCodeGen/templates/stateMachineTmpls/actionHandlers.cpp.tt b/scripts/SMCodeGen/templates/stateMachineTmpls/actionHandlers.cpp.tt
new file mode 100644
index 0000000..e4a98e2
--- /dev/null
+++ b/scripts/SMCodeGen/templates/stateMachineTmpls/actionHandlers.cpp.tt
@@ -0,0 +1,48 @@
+[%- BLOCK %]
+[%- actionList = [] %]
+[%- PYTHON %]
+procedure = [% TemplateInputVar %]
+actionNames = []
+import utils
+for state in procedure['States']:
+    for event in state['Events']:
+        for action in event['Actions']:
+            rc = utils.searchWordInDir(utils.outputDir, action.lower()) 
+            if rc is False:
+                actionNames.append(action.lower())
+flag =  utils.isFileEmpty(utils.outputDir, utils.outputFileName)
+stash.set('actionList', actionNames)
+stash.set('includeHeader', flag)
+[%- END %]
+[%- END %]
+[%- IF includeHeader == 1 -%]
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+ 
+/******************************************************************************
+ *
+ * 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/actionHandlers.cpp.tt>
+ ******************************************************************************/
+#include "actionHandlers/actionHandlers.h"
+#include "controlBlock.h" 
+
+using namespace mme;
+using namespace SM;
+
+[% END %]
+[%- FOREACH action = actionList -%]
+/***************************************
+* Action handler : [% action %]
+***************************************/
+ActStatus ActionHandlers::[% action %](ControlBlock& cb)
+{
+    return ActStatus::PROCEED;
+}
+
+[% END -%]
diff --git a/scripts/SMCodeGen/templates/stateMachineTmpls/actionHandlers.h.tt b/scripts/SMCodeGen/templates/stateMachineTmpls/actionHandlers.h.tt
new file mode 100644
index 0000000..66fc613
--- /dev/null
+++ b/scripts/SMCodeGen/templates/stateMachineTmpls/actionHandlers.h.tt
@@ -0,0 +1,66 @@
+[%- actions = [] %]
+[%- FOREACH actionList = TemplateInputVar%]
+    [%- FOREACH actionObj = actionList%]
+    [%- actions.push(actionObj) %]
+    [%- END %]
+[%- END %]
+[%- actions = actions.unique.sort %]
+[%- USE String %]
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**************************************
+ * 
+ * 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/actionHandlers.h.tt>
+ **************************************/
+#ifndef ACTIONHANDLERS_H_
+#define ACTIONHANDLERS_H_
+
+#include "smTypes.h"
+
+namespace mme
+{
+    class ActionHandlers
+    {
+
+        /***************************************
+        * Constructor
+        ****************************************/
+        ActionHandlers()
+        {
+        }
+
+        /***************************************
+        * Destructor
+        ****************************************/
+        ~ActionHandlers()
+        {
+        }
+
+        public:
+        [%- FOREACH action = actions %]
+
+        /**********************************************
+        * Action handler : [%String.new(action).lower%]
+        ***********************************************/
+        static SM::ActStatus [%String.new(action).lower%](SM::ControlBlock& cb);                
+        [%-END%]
+    };//ActionHandlers
+};//mme
+
+#endif /* ACTIONHANDLERS_H_ */
\ No newline at end of file
diff --git a/scripts/SMCodeGen/templates/stateMachineTmpls/enum.tt b/scripts/SMCodeGen/templates/stateMachineTmpls/enum.tt
new file mode 100644
index 0000000..dd6c455
--- /dev/null
+++ b/scripts/SMCodeGen/templates/stateMachineTmpls/enum.tt
@@ -0,0 +1,85 @@
+[%- stateList = [] %]
+[%- eventList = [] %]
+[%- actionList = [] %]
+[%- FOREACH ProcedureList = TemplateInputVar %]
+    [%- FOREACH Procedure = ProcedureList %]
+        [%- FOREACH State = Procedure.States %]
+            [%- stateList.push(State.Name) %]
+            [%- FOREACH Event = State.Events %]
+                [%- eventList.push(Event.Name) %]
+                [%- actionList = actionList.merge(Event.Actions) %]
+            [%- END %]
+        [%- END %]
+    [%- END %]
+[%- END %]
+[%- stateList = stateList.unique.sort %]
+[%- eventList = eventList.unique.sort %]
+[%- actionList = actionList.unique.sort -%] 
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 SM_ENUMS_H
+#define SM_ENUMS_H
+/**************************************
+ * 
+ * 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/enum.tt>
+ **************************************/
+ 
+enum State_e
+{
+    [%- FOREACH state = stateList%] 
+    [% state %],[% END %]
+    END_STATE
+};
+
+static constexpr const char* States[] =
+{
+    [%- FOREACH state = stateList%]
+    "[% state %]",[%END%]
+    "END_STATE"
+};
+
+enum Event_e
+{
+    [%- FOREACH event = eventList%]
+    [% event %],[%END%]
+    END_EVENT
+};
+
+static constexpr const char* Events[] =
+{
+    [%- FOREACH event = eventList%]
+    "[% event %]",[%END%]
+    "END_EVENT"
+};
+
+enum Action_e
+{
+    [%- FOREACH actions = actionList%]
+    [% actions %],[% END %]
+    END_ACTION
+};
+
+static constexpr const char* Actions[] =
+{
+    [%- FOREACH action = actionList%]
+    "[% action %]",[%END%]
+    "END_ACTION"
+};
+
+#endif
\ No newline at end of file
diff --git a/scripts/SMCodeGen/templates/stateMachineTmpls/state.cpp.tt b/scripts/SMCodeGen/templates/stateMachineTmpls/state.cpp.tt
new file mode 100644
index 0000000..94e0425
--- /dev/null
+++ b/scripts/SMCodeGen/templates/stateMachineTmpls/state.cpp.tt
@@ -0,0 +1,87 @@
+ [%- State = TemplateInputVar %]
+ [%- USE String %]
+ [%- MACRO CLASSNAME(str) BLOCK %]
+ [%- className =  String.new %]
+ [%- strList =  String.new(str).lower.split("_") %]
+ [%- FOREACH str = strList %]
+ [%-    token = className.append(String.new(str).capital.text()) %]
+ [%- END %]
+ [%- className %]
+ [%- END %] 
+ [%- MACRO FILENAME(str) BLOCK %]
+ [%- fileName =  String.new %]
+ [%- str = CLASSNAME(str) %]
+ [%- fileName = fileName.append(str.substr(0,1)).lower %]
+ [%- fileName = fileName.append(str.substr(1)) %]
+ [%- fileName %]
+ [%- END %] 
+ [%- stateClassName = CLASSNAME(State.Name) %]
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+ 
+/**************************************
+ * [% FILENAME(State.Name) %].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/[% FILENAME(State.Name) %].h"
+[%- FOREACH Event = State.Events %]
+[%- IF Event.NextState != "end_state" %]	
+#include "mmeStates/[% FILENAME(Event.NextState) %].h"
+[%- END %]
+[%- END %]
+
+using namespace mme;
+using namespace SM;
+
+/******************************************************************************
+* Constructor
+******************************************************************************/
+[% stateClassName %]::[% stateClassName %]():State(State_e::[% State.Name %])
+{
+}
+
+/******************************************************************************
+* Destructor
+******************************************************************************/
+[% stateClassName %]::~[% stateClassName %]()
+{
+}
+
+/******************************************************************************
+* creates and returns static instance
+******************************************************************************/
+[% stateClassName %]* [% stateClassName %]::Instance()
+{
+        static [% stateClassName %] state;
+        return &state;
+}
+
+/******************************************************************************
+* initializes eventToActionsMap
+******************************************************************************/
+void [% stateClassName %]::initialize()
+{
+        [%- FOREACH Event = State.Events %]
+        {
+                ActionTable actionTable;
+                [%- FOREACH Action = Event.Actions %]
+                actionTable.addAction(&ActionHandlers::[% String.new(Action).lower %]);
+                [%- END %]
+				[%- IF Event.NextState != "end_state" %]
+                actionTable.setNextState([% CLASSNAME(Event.NextState) %]::Instance());
+                [%- END %]
+                eventToActionsMap.insert(pair<Event_e, ActionTable>(Event_e::[% Event.Name %], actionTable));
+        }
+        [%- END %]
+}
diff --git a/scripts/SMCodeGen/templates/stateMachineTmpls/state.h.tt b/scripts/SMCodeGen/templates/stateMachineTmpls/state.h.tt
new file mode 100644
index 0000000..36feeec
--- /dev/null
+++ b/scripts/SMCodeGen/templates/stateMachineTmpls/state.h.tt
@@ -0,0 +1,79 @@
+ [%- State = TemplateInputVar %]
+ [%- USE String %]
+ [%- MACRO CLASSNAME(str) BLOCK %]
+ [%- className =  String.new %]
+ [%- strList =  String.new(str).lower.split("_") %]
+ [%- FOREACH str = strList %]
+ [%-    token = className.append(String.new(str).capital.text()) %]
+ [%- END %]
+ [%- className %]
+ [%- END %]
+ [%- MACRO FILENAME(str) BLOCK %]
+ [%- fileName =  String.new %]
+ [%- str = CLASSNAME(str) %]
+ [%- fileName = fileName.append(str.substr(0,1)).lower %]
+ [%- fileName = fileName.append(str.substr(1)) %]
+ [%- fileName %]
+ [%- END %] 
+ [%- stateClassName = CLASSNAME(State.Name) -%]
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+ /******************************************************
+ * [% FILENAME(State.Name) %].h
+ * 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.h.tt>
+ ******************************************************/
+ 
+#ifndef __[% stateClassName %]__
+#define __[% stateClassName %]__
+
+#include "state.h"
+
+namespace mme {
+
+	class [% stateClassName %] : public SM::State
+	{
+		public:
+			/******************************************
+			* Instance 
+			*    Creates static instance for the state
+			*******************************************/
+			static [% stateClassName %]* Instance();
+
+			/****************************************
+			* [% stateClassName %]
+			*    Destructor
+			****************************************/
+			~[% stateClassName %]();			
+			
+			/******************************************
+			* initialize
+			*  Initializes action handlers for the state
+			* and next state
+			******************************************/
+			void initialize();
+	
+		private:
+			/****************************************
+			* [% stateClassName %]
+			*    Private constructor
+			****************************************/
+			[% stateClassName %]();  
+	};
+};
+#endif // __[% stateClassName %]__
diff --git a/scripts/SMCodeGen/templates/stateMachineTmpls/stateFactory.cpp.tt b/scripts/SMCodeGen/templates/stateMachineTmpls/stateFactory.cpp.tt
new file mode 100644
index 0000000..74cb717
--- /dev/null
+++ b/scripts/SMCodeGen/templates/stateMachineTmpls/stateFactory.cpp.tt
@@ -0,0 +1,78 @@
+ [%- USE String %]
+ [%- MACRO CLASSNAME(str) BLOCK %]
+ [%- className =  String.new %]
+ [%- strList =  String.new(str).lower.split("_") %]
+ [%- FOREACH str = strList %]
+ [%-    token = className.append(String.new(str).capital.text()) %]
+ [%- END %]
+ [%- className %]
+ [%- END %]
+ [%- MACRO FILENAME(str) BLOCK %]
+ [%- fileName =  String.new %]
+ [%- str = CLASSNAME(str) %]
+ [%- fileName = fileName.append(str.substr(0,1)).lower %]
+ [%- fileName = fileName.append(str.substr(1)) %]
+ [%- fileName %]
+ [%- END %]
+ [%- stateList = [] %]
+ [%- FOREACH StatesArray = TemplateInputVar %]
+    [%- FOREACH State = StatesArray %]
+        [%- stateList.push(State.Name) %]
+    [%- END %]
+ [%- END %]
+ [%- stateList = stateList.unique.sort %]
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+ 
+/**************************************
+ * [% FILENAME(State.Name) %].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"
+[%- FOREACH state = stateList%]
+[%- IF state != "end_state" %]
+#include "mmeStates/[% FILENAME(state) %].h"
+[%- END %]
+[%- END %]    
+
+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()
+{
+    [%- FOREACH state = stateList%]
+	[%- IF state != "end_state" %]
+	[% CLASSNAME(state) %]::Instance()->initialize();
+	[%- END %]
+    [%- END %]
+}
diff --git a/scripts/SMCodeGen/templates/stateMachineTmpls/stateFactory.h.tt b/scripts/SMCodeGen/templates/stateMachineTmpls/stateFactory.h.tt
new file mode 100644
index 0000000..5367e85
--- /dev/null
+++ b/scripts/SMCodeGen/templates/stateMachineTmpls/stateFactory.h.tt
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2019-present, Infosys Limited.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+/**************************************
+ * 
+ * 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.h.tt>
+ **************************************/
+
+#ifndef __StateFactory__
+#define __StateFactory__
+
+namespace mme {
+	class StateFactory {
+            public:
+			/******************************************
+			* Instance
+			*   Creates static instance for the state
+			*******************************************/
+            static StateFactory* Instance();
+
+			/*****************************************
+			* StateFactory
+			*   Destructor
+			*****************************************/
+			~StateFactory();
+
+			/******************************************
+			* initialize
+			*  Initializes action handlers for the state
+			* and next state
+			******************************************/
+             void initialize();
+
+            private:
+			/****************************************
+			* StateFactory
+			*	Private constructor
+			****************************************/
+            StateFactory();
+
+	};
+};
+#endif // __StateFactory__
diff --git a/scripts/SMCodeGen/utils.py b/scripts/SMCodeGen/utils.py
new file mode 100644
index 0000000..49e49cc
--- /dev/null
+++ b/scripts/SMCodeGen/utils.py
@@ -0,0 +1,96 @@
+# 
+# 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.
+# 
+
+import os
+from os import listdir
+from os.path import isfile, join
+
+# Globals
+ttFileName = ''            
+outputDir = ''
+outputFile = ''
+outputFileKeyword = ''
+outputFileExt = ''
+outputFileName = ''
+mode = ''
+
+def WriteFile(dirName, fileName, content, fileMode):
+    filePath = join(dirName, fileName)
+    accessMode = 'w+'
+    if (fileMode == 'append') :
+        accessMode = 'a+'
+    with open(filePath, accessMode) as File:
+        File.write(content)
+    
+def readFile(fileName):
+    if os.path.exists(fileName):
+        with open(fileName, 'r') as file:
+            return file.read()
+    return
+
+def searchWordInDir(path, word):
+    files = [f for f in listdir(path) if isfile(join(path, f))]
+    for i in files:
+        fileContent = open(join(path, i)).read()
+        if word in fileContent:
+            return True
+    return False
+
+
+def searchWordInFile(path, fileName, word):
+    if os.path.exists(join(path, fileName)):
+        with open(join(path, fileName)) as File:
+            fileContent = File.read()
+            if word in fileContent:
+                return True
+    return False
+
+def isFileEmpty(path, fileName):
+    fullPath = join(path, fileName)
+    if os.path.exists(fullPath):
+        if os.stat(fullPath).st_size > 0:
+            return 0
+        else :
+            return 1
+    return 1
+
+def getFileName(str):
+    if (str.find("_") != -1):
+        str = str.lower()
+        tokens = [x.capitalize() for x in str.split("_")]
+        fileName = ''
+        fileName = fileName.join(tokens)
+        return (fileName[0].lower() + fileName[1:])
+
+    return (str[0].lower() + str[1:])
+
+def get_key_values(obj, key):
+    arr = []
+    
+    def extract(obj, arr, key):
+        if isinstance(obj, dict):
+            for k,v in obj.items():
+                if k == key:
+                    arr.append(v)
+                elif isinstance(v, (dict, list)):
+                    extract(v, arr, key)
+        elif isinstance(obj,list):
+            for item in obj:
+                extract(item, arr, key)       
+        return arr
+    
+    results = extract (obj, arr, key)
+    return results
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;
+}
+
+}