Initial commit
diff --git a/GTP_v13.5.0_CNL113843.tpd b/GTP_v13.5.0_CNL113843.tpd
new file mode 100644
index 0000000..03ea332
--- /dev/null
+++ b/GTP_v13.5.0_CNL113843.tpd
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2017 Ericsson
+
+  All rights reserved. This program and the accompanying materials
+  are made available under the terms of the Eclipse Public License v1.0
+  which accompanies this distribution, and is available at
+  http://www.eclipse.org/legal/epl-v10.html
+
+
+   File:               GTP_v13.5.0_CNL113843.tpd
+   Description:        tpd project file
+   Rev:                R2A
+   Prodnr:             CNL 113 843
+
+ -->
+<TITAN_Project_File_Information version="1.0">
+  <ProjectName>GTP_v13.5.0_CNL113843</ProjectName>
+  <ReferencedProjects>
+    <ReferencedProject name="ProtocolModules_Common" projectLocationURI="../COMMON/ProtocolModules_Common.tpd"/>
+  </ReferencedProjects>
+  <Folders>
+    <FolderResource projectRelativePath="src" relativeURI="src"/>
+  </Folders>
+  <Files>
+    <FileResource projectRelativePath="src/GTPC_EncDec.cc" relativeURI="src/GTPC_EncDec.cc"/>
+    <FileResource projectRelativePath="src/GTPC_Types.ttcn" relativeURI="src/GTPC_Types.ttcn"/>
+    <FileResource projectRelativePath="src/GTPU_EncDec.cc" relativeURI="src/GTPU_EncDec.cc"/>
+    <FileResource projectRelativePath="src/GTPU_Types.ttcn" relativeURI="src/GTPU_Types.ttcn"/>
+  </Files>
+  <ActiveConfiguration>Default</ActiveConfiguration>
+  <Configurations>
+    <Configuration name="Default">
+      <ProjectProperties>
+        <MakefileSettings>
+          <generateInternalMakefile>true</generateInternalMakefile>
+          <GNUMake>true</GNUMake>
+          <incrementalDependencyRefresh>true</incrementalDependencyRefresh>
+          <targetExecutable>bin/GTP_v13.5.0_CNL113843</targetExecutable>
+        </MakefileSettings>
+        <LocalBuildSettings>
+          <workingDirectory>bin</workingDirectory>
+        </LocalBuildSettings>
+      </ProjectProperties>
+    </Configuration>
+  </Configurations>
+</TITAN_Project_File_Information>
diff --git a/doc/GTP_v13.5.0_CNL113843_1551.pdf b/doc/GTP_v13.5.0_CNL113843_1551.pdf
new file mode 100644
index 0000000..034a41c
--- /dev/null
+++ b/doc/GTP_v13.5.0_CNL113843_1551.pdf
Binary files differ
diff --git a/doc/GTP_v13.5_PRI.pdf b/doc/GTP_v13.5_PRI.pdf
new file mode 100644
index 0000000..488c8ea
--- /dev/null
+++ b/doc/GTP_v13.5_PRI.pdf
Binary files differ
diff --git a/src/GTPC_EncDec.cc b/src/GTPC_EncDec.cc
new file mode 100644
index 0000000..453319d
--- /dev/null
+++ b/src/GTPC_EncDec.cc
@@ -0,0 +1,215 @@
+///////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (c) 2000-2017 Ericsson Telecom AB
+//
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// which accompanies this distribution, and is available at
+// http://www.eclipse.org/legal/epl-v10.html
+///////////////////////////////////////////////////////////////////////////////
+//
+//  File:               GTPC_EncDec.cc
+//  Rev:                R2A
+//  Prodnr:             CNL 113 843
+//  Contact:            http://ttcn.ericsson.se
+//  Reference:          3GPP TS 29.060 v13.5.0
+
+#include "GTPC_Types.hh"
+
+namespace GTPC__Types {
+
+
+// find the length of the optional part and decode optional part into OPT_PART   
+int find_optpart_length(const unsigned char * opt_part_ptr,GTPC__Header__optional__part& OPT_PART)// pointer to opt part start
+{
+  int opt_part_length = 4; // mandatory minimum length of opt_part  
+  OPT_PART.sequenceNumber() = OCTETSTRING(2,opt_part_ptr);
+  OPT_PART.npduNumber() = OCTETSTRING(1,opt_part_ptr+2);
+  OPT_PART.nextExtHeader() = OCTETSTRING(1,opt_part_ptr+3);
+  OPT_PART.gTPC__extensionHeader__List() = OMIT_VALUE; 
+   
+      int i = 0;    
+      bool opt_part_end = false;
+      while(!opt_part_end) 
+      {                  
+        if (opt_part_ptr[opt_part_length-1] != 0x00) // 0x00 means end of optional part
+            {
+             unsigned char lengthfield = opt_part_ptr[opt_part_length];
+             
+             OPT_PART.gTPC__extensionHeader__List()()[i].lengthfield() = lengthfield;
+             OPT_PART.gTPC__extensionHeader__List()()[i].content() = 
+               OCTETSTRING(4*lengthfield-2,opt_part_ptr + opt_part_length +1);
+             OPT_PART.gTPC__extensionHeader__List()()[i].nextExtHeader() = 
+               OCTETSTRING(1,opt_part_ptr + opt_part_length + 4*lengthfield - 1);
+                   
+             opt_part_length = opt_part_length + 4*lengthfield;
+             i++;
+            }
+        else            
+            {opt_part_end = true;}                         
+      }
+         
+  return  opt_part_length;
+}
+
+
+void dec__PDU__GTPC_no_optional_part(const unsigned char * udp__pdu,const int pl_udp_pdu_length, const SystemUnderTest& pl__SystemUnderTest,PDU__GTPC& pdu)
+{
+  TTCN_Buffer buf;
+  
+ if ((pl__SystemUnderTest == SystemUnderTest::GGSN) || (pl__SystemUnderTest == SystemUnderTest::CGW))
+  // testing GGSN or CGW (not default)
+  {
+    const unsigned char *gtpc_message = (const unsigned char *) udp__pdu;
+    if ((gtpc_message[1] == 0x12) || (gtpc_message[1] == 0x13))  
+    // if updatePDPContextRequest or updatePDPContextResponse message is received from GGSN or C-GW
+    {   
+      unsigned char pn = gtpc_message[0] & 0x01;
+      pdu.pn__bit() = BITSTRING(1,&pn);
+    
+      unsigned char s = (gtpc_message[0] & 0x02) >> 1;
+      pdu.s__bit() =  BITSTRING(1,&s);
+      
+      unsigned char e = (gtpc_message[0] & 0x04) >> 2;
+      pdu.e__bit() = BITSTRING(1,&e);
+
+      unsigned char spare = (gtpc_message[0] & 0x08) >> 3;
+      pdu.spare() = BITSTRING(1,&spare ); 
+        
+      unsigned char pt = (gtpc_message[0] & 0x10) >> 4;
+      pdu.pt() = BITSTRING(1,&pt );  
+        
+      unsigned char version = ((gtpc_message[0] & 0x80) >> 7) |
+                            ((gtpc_message[0] & 0x40) >> 5) |
+                            ((gtpc_message[0] & 0x20) >> 3) ;    
+      pdu.version() =  BITSTRING(3,&version); 
+    
+      pdu.messageType() = OCTETSTRING(1,gtpc_message+1); 
+    
+      pdu.lengthf() = (gtpc_message[2] << 8) + gtpc_message[3];
+    
+      pdu.teid() = OCTETSTRING(4,gtpc_message+4); 
+          
+      pdu.opt__part() = OMIT_VALUE;           
+
+      if (gtpc_message[1] == 0x12) //updatePDPContextRequest
+      {
+        if(pl__SystemUnderTest == SystemUnderTest::GGSN) // from GGSN
+        {
+         UpdatePDPContextRequestGGSN updatePDPContextRequestGGSN;           
+         OCTETSTRING updatePDPContextRequestGGSN_string = OCTETSTRING(pl_udp_pdu_length-8,udp__pdu+8 );      
+         buf.put_os(updatePDPContextRequestGGSN_string);      
+         updatePDPContextRequestGGSN.decode(UpdatePDPContextRequestGGSN_descr_,buf,TTCN_EncDec::CT_RAW);    
+         pdu.gtpc__pdu().updatePDPContextRequest().updatePDPContextRequestGGSN() = updatePDPContextRequestGGSN;
+        } 
+        else   // from CGW
+        {
+         UpdatePDPContextRequestCGW updatePDPContextRequestCGW;
+         OCTETSTRING updatePDPContextRequestCGW_string = OCTETSTRING(pl_udp_pdu_length-8,udp__pdu+8 );       
+         buf.put_os(updatePDPContextRequestCGW_string);        
+         updatePDPContextRequestCGW.decode(UpdatePDPContextRequestCGW_descr_,buf,TTCN_EncDec::CT_RAW);         
+         pdu.gtpc__pdu().updatePDPContextRequest().updatePDPContextRequestCGW() = updatePDPContextRequestCGW;        
+        }  
+      } 
+      else //updatePDPContextResponse  
+      { 
+        if(pl__SystemUnderTest == SystemUnderTest::GGSN) // from GGSN
+        {                  
+         UpdatePDPContextResponseGGSN updatePDPContextResponseGGSN;           
+         OCTETSTRING updatePDPContextResponseGGSN_string = OCTETSTRING(pl_udp_pdu_length-8,udp__pdu+8 );    
+         buf.put_os(updatePDPContextResponseGGSN_string);      
+         updatePDPContextResponseGGSN.decode(UpdatePDPContextResponseGGSN_descr_,buf,TTCN_EncDec::CT_RAW);    
+         pdu.gtpc__pdu().updatePDPContextResponse().updatePDPContextResponseGGSN() = updatePDPContextResponseGGSN;
+        }
+        else   // from CGW
+        {        
+         UpdatePDPContextResponseCGW updatePDPContextResponseCGW;
+         OCTETSTRING updatePDPContextResponseCGW_string = OCTETSTRING(pl_udp_pdu_length-8,udp__pdu+8 );  
+         buf.put_os(updatePDPContextResponseCGW_string);  
+         updatePDPContextResponseCGW.decode(UpdatePDPContextResponseCGW_descr_,buf,TTCN_EncDec::CT_RAW);
+         pdu.gtpc__pdu().updatePDPContextResponse().updatePDPContextResponseCGW() = updatePDPContextResponseCGW;                
+        } 
+      }
+        
+      buf.clear();  
+      return;      
+    }
+    else // if message not equal to updatePDPContextRequest or updatePDPContextResponse is received from GGSN or C-GW
+    {
+      buf.put_s(pl_udp_pdu_length,udp__pdu);
+      pdu.decode(PDU__GTPC_descr_, buf, TTCN_EncDec::CT_RAW);
+      buf.clear(); 
+      return;
+    } 
+  }
+  else  //pl__SystemUnderTest is SGSN or MME (this is default)
+  {
+    buf.put_s(pl_udp_pdu_length,udp__pdu);
+    pdu.decode(PDU__GTPC_descr_, buf, TTCN_EncDec::CT_RAW);
+    buf.clear();  
+    return;
+  }
+}
+
+//////////////////////////////////
+// Decoding function for GTPC__DialoguePDU
+//////////////////////////////////
+
+PDU__GTPC dec__PDU__GTPC(const OCTETSTRING& udp__pdu,const SystemUnderTest& pl__SystemUnderTest)
+{  
+      PDU__GTPC pdu;  
+       
+      const unsigned char *gtpc_message = (const unsigned char *) udp__pdu;
+       
+      int opt_part_length = 0;
+      if  ( gtpc_message[0] & 0x07 ) // opt_part is present 
+      { 
+         GTPC__Header__optional__part    OPT_PART;
+         
+         // find the length of the optional part and decode optional part into OPT_PART                       
+         opt_part_length = find_optpart_length(gtpc_message+8,OPT_PART);                               
+         if(  ((gtpc_message[2] << 8) + gtpc_message[3] - opt_part_length) < 0  )
+           {TTCN_error("Decoding error, lengthf field is shorter that decoded length of opt_part");}  
+                      
+         // build PDU without optional part                  
+         unsigned int gtpc_IEs_length = (gtpc_message[2] << 8) + gtpc_message[3] - opt_part_length;
+         unsigned char gtpcBuf[8 + gtpc_IEs_length];
+         memcpy(gtpcBuf,gtpc_message,8);
+         memcpy(gtpcBuf+8,gtpc_message+8+opt_part_length,gtpc_IEs_length);
+         
+         // substitute dummy bits (indicating there is no optional part)
+         gtpcBuf[0] = gtpcBuf[0] & 0xf8;
+         
+         // substitute dummy length (not including optional part)
+         gtpcBuf[2] = (gtpc_IEs_length & 0xff00) >> 8;
+         gtpcBuf[3] =  gtpc_IEs_length & 0xff;
+
+         // call decoding function                 
+         dec__PDU__GTPC_no_optional_part(gtpcBuf,udp__pdu.lengthof() - opt_part_length,pl__SystemUnderTest,pdu);
+             
+         // put back the original values               
+         unsigned char pn = gtpc_message[0] & 0x01;
+         pdu.pn__bit() = BITSTRING(1,&pn);
+    
+         unsigned char s = (gtpc_message[0] & 0x02) >> 1;
+         pdu.s__bit() =  BITSTRING(1,&s);
+      
+         unsigned char e = (gtpc_message[0] & 0x04) >> 2;
+         pdu.e__bit() = BITSTRING(1,&e);
+         
+         pdu.lengthf() = (gtpc_message[2] << 8) + gtpc_message[3];
+         
+         pdu.opt__part() = OPT_PART;
+                
+         return pdu;                 
+      }   
+      else // opt_part is not present 
+      {       
+         dec__PDU__GTPC_no_optional_part(gtpc_message,udp__pdu.lengthof(),pl__SystemUnderTest,pdu);
+         return pdu;             
+      }                  
+}  // end of function
+
+
+
+}//namespace
diff --git a/src/GTPC_Types.ttcn b/src/GTPC_Types.ttcn
new file mode 100644
index 0000000..1575baa
--- /dev/null
+++ b/src/GTPC_Types.ttcn
@@ -0,0 +1,3957 @@
+///////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (c) 2000-2017 Ericsson Telecom AB
+//
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// which accompanies this distribution, and is available at
+// http://www.eclipse.org/legal/epl-v10.html
+///////////////////////////////////////////////////////////////////////////////
+//
+//  File:               GTPC_Types.ttcn
+//  Rev:                R2A
+//  Prodnr:             CNL 113 843
+//  Contact:            http://ttcn.ericsson.se
+//  Reference:          3GPP TS 29.060 v13.5.0
+ 
+module GTPC_Types {
+
+import from General_Types all;
+
+// external encoding/decoding functions
+external function enc_PDU_GTPC(in PDU_GTPC gtpc_pdu) return octetstring
+with { extension "prototype(convert)"
+       extension "encode(RAW)"
+     }        
+
+external function dec_PDU_GTPC(in octetstring udp_pdu, SystemUnderTest pl_SystemUnderTest := SGSN) return PDU_GTPC
+// for SGSN testing pl_SystemUnderTest is SGSN (default value)
+// for GGSN testing pl_SystemUnderTest is GGSN 
+// for CGW testing pl_SystemUnderTest is CGW 
+// for MME testing pl_SystemUnderTest is MME  
+// in current implementation the decoder behavior is identical for
+// SGSN and MME
+
+// determines SUT, needed for decoding updatePDPContextRequest
+// and updatePDPContextResponse messages
+type enumerated SystemUnderTest{SGSN(0),GGSN(1),CGW(2),MME(3)};
+/////////////////////////////
+// Information Elements
+/////////////////////////////
+//Information Element with an IE Type Extension field - 7.7.0A
+//for future use
+type record IE_Type_Extension {
+ OCT1                    type_gtpc,
+ LIN2_BO_LAST            lengthf, //16 bits
+ IE_Extension_UnionType  iE_Type_Extension
+
+} with {  
+  variant (lengthf) "LENGTHTO(iE_Type_Extension)"; 
+  variant "PRESENCE( type_gtpc = 'EE'O)";
+};
+
+type union IE_Extension_UnionType
+{
+  IE_Extension_Type  iE_Type_Extension
+}
+
+type record IE_Extension_Type
+{
+  OCT2                         elementIdentifier,
+  octetstring                  valueField
+}
+
+
+//Cause - 7.7.1
+type record Cause_gtpc {
+ OCT1                   type_gtpc,
+ OCT1                   causevalue
+} with { variant "PRESENCE( type_gtpc = '01'O)"; };
+
+//IMSI - 7.7.2
+type record IMSI_gtpc {
+ OCT1                   type_gtpc,
+ hexstring              digits length(15),
+ HEX1                   padding
+} with { variant "PRESENCE( type_gtpc = '02'O)"; };
+
+//Routing Area ID - 7.7.3
+// Note : the order of MNC digits is 
+// MNC digit 3, MNC digit 1, MNC digit 2
+type record RoutingAreaIdentity {
+ OCT1                   type_gtpc,
+ hexstring              mcc_digits length(3),
+ hexstring              mnc_digits length(3),
+ OCT2                   lac,
+ OCT1                   rac
+} with { variant "PRESENCE( type_gtpc = '03'O)"; };
+
+//TLLI - 7.7.4
+type record TLLI {
+ OCT1                   type_gtpc,
+ OCT4                   tlli_element
+} with { variant "PRESENCE( type_gtpc = '04'O)"; };
+
+//Packet TMSI - 7.7.5
+type record PacketTMSI {
+ OCT1                   type_gtpc,
+ OCT4                   p_tmsi
+} with { variant "PRESENCE( type_gtpc = '05'O)"; };
+
+//Reordering Required - 7.7.6
+type record ReorderingRequired {
+ OCT1                   type_gtpc,
+ BIT1                   reordreq,
+ BIT7                   spare
+} with { variant "PRESENCE( type_gtpc = '08'O)"; };
+
+//Authentication Triplet - 7.7.7
+type record AuthenticationTriplet_GTPC {
+ OCT1                    type_gtpc,
+ OCT16                   rand,
+ OCT4                    sres,
+ OCT8                    kc
+} with { variant "PRESENCE( type_gtpc = '09'O)"; };
+
+type set of AuthenticationTriplet_GTPC AuthenticationTriplet_GTPC_SetOf;
+
+//MAP Cause - 7.7.8
+type record MAP_Cause {
+ OCT1                    type_gtpc,
+ OCT1                    mapCauseValue
+} with { variant "PRESENCE( type_gtpc = '0B'O)"; };
+
+//PTMSI Signature - 7.7.9
+type record PTMSI_Signature {
+ OCT1                    type_gtpc,
+ OCT3                    ptmsi_Signature
+} with { variant "PRESENCE( type_gtpc = '0C'O)"; };
+
+//MS Validated - 7.7.10
+type record MS_Validated {
+ OCT1                    type_gtpc,
+ BIT1                    msValidated,
+ BIT7                    spare
+} with { variant "PRESENCE( type_gtpc = '0D'O)"; };
+
+//Recovery - 7.7.11
+type record Recovery_gtpc {
+ OCT1                   type_gtpc,
+ OCT1                   restartCounter
+} with { variant "PRESENCE(type_gtpc = '0E'O)";};
+
+//Selection Mode - 7.7.12
+type record SelectionMode {
+ OCT1                   type_gtpc,
+ BIT2                   selectModeValue,
+ BIT6                   spare
+} with { variant "PRESENCE(type_gtpc = '0F'O)"; };
+
+//TEI Data I - 7.7.13
+type record TeidDataI {
+ OCT1                   type_gtpc,
+ OCT4                   teidDataI
+} with { variant "PRESENCE(type_gtpc = '10'O)"; };
+
+//TEI Control Plane - 7.7.14
+type record TeidControlPlane {
+ OCT1                   type_gtpc,
+ OCT4                   teidControlPlane
+} with { variant "PRESENCE(type_gtpc = '11'O)"; };
+
+//TEI Data II - 7.7.15
+type record of TeidDataII TeidDataII_List
+
+type record TeidDataII {
+ OCT1                    type_gtpc,
+ BIT4                    nsapi,
+ BIT4                    unused,
+ OCT4                    teidDataII
+} with { variant "PRESENCE(type_gtpc = '12'O)"; };
+
+//Teardown Ind -7.7.16
+type record TearDownInd {
+ OCT1                    type_gtpc,
+ BIT1                    tdInd,
+ BIT7                    spare
+} with { variant "PRESENCE(type_gtpc = '13'O)"; };
+
+//NSAPI - 7.7.17
+type record NSAPI_GTPC {
+ OCT1                    type_gtpc,
+ BIT4                    nsapi,
+ BIT4                    unused
+} with { variant "PRESENCE(type_gtpc = '14'O)"; };
+
+//RANAP Cause - 7.7.18
+type record RANAPCause {
+ OCT1                    type_gtpc,
+ OCT1                    ranapCause
+} with { variant "PRESENCE(type_gtpc = '15'O)"; };
+
+//RAB Context - 7.7.19
+type record of RABContext RABContext_List;
+
+type record RABContext {
+ OCT1                    type_gtpc,
+ BIT4                    nsapi,
+ BIT4                    spare,
+ OCT2                    dlgtp_u,
+ OCT2                    ulgtp_u,
+ OCT2                    dl_pdcp,
+ OCT2                    ul_pdcp
+} with {variant "PRESENCE( type_gtpc = '16'O)";};
+
+//Radio Priority SMS - 7.7.20
+type record RadioPrioritySMS {
+ OCT1                    type_gtpc,
+ BIT3                    radioprioritySMS,
+ BIT5                    reserved
+} with {variant "PRESENCE( type_gtpc = '17'O)";};
+
+//RadioPriority - 7.7.21
+
+type record of RadioPriority RadioPriority_List;
+
+type record RadioPriority {
+ OCT1                    type_gtpc,
+ BIT3                    radiopriority, 
+ BIT1                    reserved,
+ BIT4                    nsapi
+} with {variant "PRESENCE( type_gtpc = '18'O)";};
+
+//Packet Flow Id - 7.7.22
+type record of PacketFlowID PacketFlowID_List
+
+type record PacketFlowID {
+ OCT1                    type_gtpc,
+ BIT4                    nsapi,
+ BIT4                    reserved,
+ OCT1                    packflowID
+} with {variant "PRESENCE( type_gtpc = '19'O)";};
+
+//Charging Characteristics - 7.7.23
+type record of ChargingCharacteristics_GTPC
+                      ChargingCharacteristics_List_GTPC;
+
+type record ChargingCharacteristics_GTPC {
+ OCT1                    type_gtpc,
+ OCT2                    chargingChar
+} with {variant "PRESENCE( type_gtpc = '1A'O)";};
+
+//Trace Reference - 7.7.24
+type record TraceRef {
+ OCT1                    type_gtpc,
+ OCT2                    trace_ref
+} with {variant "PRESENCE( type_gtpc = '1B'O)";};
+
+//Trace Type - 7.7.25
+type record GTP_TraceType {
+ OCT1                    type_gtpc,
+ OCT2                    trace_type
+} with {variant "PRESENCE( type_gtpc = '1C'O)";};
+
+//MS Not Reachable Reason - 7.7.25A
+type record MSNotReachableReason {
+ OCT1                    type_gtpc,
+ OCT1                    reason_for_absence
+} with {variant "PRESENCE( type_gtpc = '1D'O)";};
+
+//Radio Priority LCS - 7.7.25B
+type record RadioPriorityLCS{
+ OCT1                    type_gtpc,
+ LIN2_BO_LAST            lengthf, //16 bits
+ BIT3                    radioPriorityLCS,
+ BIT5                    reserved
+}  with { variant "PRESENCE( type_gtpc = '96'O)";
+          variant (lengthf) "LENGTHTO(radioPriorityLCS,reserved)"; };
+
+//Charging ID - 7.7.26
+type record ChargingID {
+ OCT1                    type_gtpc,
+ OCT4                    chargingID
+}  with { variant "PRESENCE( type_gtpc = '7F'O)";};
+
+//End User Address ID - 7.7.27
+type record EndUserAddress{
+ OCT1                    type_gtpc,
+ EndUserAddress_types    endUserAddress 
+}  with { variant "PRESENCE( type_gtpc = '80'O)";};
+
+type union EndUserAddress_types {
+ EndUserAddressIPv4          endUserAddressIPv4,
+ EndUserAddressIPv6          endUserAddressIPv6,
+ EndUserAddressPPP           endUserAddressPPP,
+ EndUserAddressIPv4andIPv6   endUserAddressIPv4andIPv6,
+ EndUserAddressOSPIHOS       endUserAddressOSPIHOS
+} with { variant "TAG(endUserAddressIPv4, pdp_typenum = '21'O;
+                      endUserAddressIPv6, pdp_typenum = '57'O;
+                      endUserAddressPPP,  pdp_typenum = '01'O;
+                      endUserAddressIPv4andIPv6, pdp_typenum = '8D'O;
+                      endUserAddressOSPIHOS, OTHERWISE;)" };
+                      
+type record  EndUserAddressIPv4 {
+ LIN2_BO_LAST             lengthf, //16 bits
+ BIT4                     pdp_typeorg,
+ BIT4                     spare, 
+ OCT1                     pdp_typenum,
+ OCT4                     ipv4_address optional 
+} with { variant (lengthf) "LENGTHTO(pdp_typeorg, spare, pdp_typenum, 
+                                     ipv4_address)"; };
+
+type record EndUserAddressIPv6 {
+ LIN2_BO_LAST             lengthf, //16 bits
+ BIT4                     pdp_typeorg,
+ BIT4                     spare,
+ OCT1                     pdp_typenum,
+ OCT16                    ipv6_address optional
+} with { variant (lengthf) "LENGTHTO(pdp_typeorg, spare, pdp_typenum, 
+                                     ipv6_address)"; };
+
+type record  EndUserAddressPPP {
+ LIN2_BO_LAST            lengthf, //16 bits
+ BIT4                    pdp_typeorg,
+ BIT4                    spare,
+ OCT1                    pdp_typenum
+} with { variant (lengthf) "LENGTHTO(pdp_typeorg, spare, pdp_typenum)"; };
+
+type record EndUserAddressIPv4andIPv6 {
+ LIN2_BO_LAST             lengthf, //16 bits
+ BIT4                     pdp_typeorg,
+ BIT4                     spare,
+ OCT1                     pdp_typenum,
+ OCT4                     ipv4_address optional,
+ OCT16                    ipv6_address optional
+} with { variant (lengthf) "LENGTHTO(pdp_typeorg, spare, pdp_typenum,ipv4_address, 
+                                     ipv6_address)"; 
+         variant(ipv4_address) "PRESENCE(lengthf = 6,lengthf = 22)"                                            
+         variant(ipv6_address) "PRESENCE(lengthf = 18,lengthf = 22)"                                      
+};
+
+// ETHECS: specification not found in Technical Specification
+type record  EndUserAddressOSPIHOS {
+ LIN2_BO_LAST            lengthf, //16 bits 
+ BIT4                    pdp_typeorg,
+ BIT4                    spare,
+ OCT1                    pdp_typenum
+} with { variant (lengthf) "LENGTHTO(pdp_typeorg, spare, pdp_typenum)"; };
+
+//MM Context  -  7.7.28
+type record MM_Context {
+ OCT1                    type_gtpc,
+ MM_ContextU             context
+}  with { variant "PRESENCE( type_gtpc = '81'O)";};
+
+type union MM_ContextU {
+ MM_ContextGSM           mmcontGSM,
+ MM_ContextUMTS          mmcontUMTS,
+ MM_ContextGSMUMTS       mmcontGSMUMTS,
+ MM_ContextUMTSReceive   mmcontUMTSReceive
+} with { variant "TAG(mmcontGSM, security = '01'B;
+                      mmcontUMTS, security = '10'B;
+                      mmcontGSMUMTS, security = '11'B;
+                      mmcontUMTSReceive, security = '00'B;)"; };
+
+
+type record  MM_ContextGSM {
+ LIN2_BO_LAST            lengthf,//16 bits
+ BIT3                    cksn,
+ BIT5                    spare,
+ BIT3                    usedCipher,
+ integer                 noofVectors,
+ BIT2                    security, 
+ OCT8                    kc,
+ octetstring             triplet,
+ OCT2                    drx_par,
+ integer                 msNetW_cap_length,
+ octetstring             msNetw_cap optional,
+ LIN2_BO_LAST            containerLength,
+ octetstring             container optional 
+} with { variant (lengthf) "LENGTHTO(cksn, spare, usedCipher, noofVectors,
+                                     security, kc, triplet, drx_par, 
+                                     msNetW_cap_length, msNetw_cap, 
+                                     containerLength, container
+                                     )";
+         variant (msNetW_cap_length) "LENGTHTO(msNetw_cap)";
+         variant (containerLength) "LENGTHTO(container)";
+         variant (noofVectors) "FIELDLENGTH(3)";
+         variant (noofVectors) "LENGTHTO(triplet)";
+         variant (noofVectors) "UNIT(224)";    
+};
+
+type record  MM_ContextUMTS {
+ LIN2_BO_LAST            lengthf,
+ BIT3                    ksi,
+ BIT3                    usedGPRSIntegrityAlgorithm,
+ BIT1                    ugipai,
+ BIT1                    gupii,
+ BIT3                    spare1,
+ integer                 noofVectors ,
+ BIT2                    security,
+ OCT16                   ck,
+ OCT16                   ik,
+ LIN2_BO_LAST            quintupletlength,
+ octetstring             quintuplet,
+ OCT2                    drx_par,
+ integer                 msNetW_cap_length,
+ octetstring             msNetw_cap optional,
+ LIN2_BO_LAST            containerLength,
+ octetstring             container optional
+} with { variant (lengthf) "LENGTHTO(ksi, usedGPRSIntegrityAlgorithm, ugipai, gupii, spare1, noofVectors, security,
+                                     ck, ik, quintupletlength, quintuplet, 
+                                     drx_par, msNetW_cap_length, msNetw_cap,
+                                     containerLength, container
+                                     )";
+         variant (quintupletlength) "LENGTHTO(quintuplet)"; 
+         variant (msNetW_cap_length) "LENGTHTO(msNetw_cap)";
+         variant (containerLength) "LENGTHTO(container)";
+         variant (noofVectors) "FIELDLENGTH(3)"; 
+};
+
+type record  MM_ContextGSMUMTS {
+ LIN2_BO_LAST            lengthf,
+ BIT3                    cksn,
+ BIT5                    spare,
+ BIT3                    usedCipher,
+ integer                 noofVectors,
+ BIT2                    security,
+ OCT8                    kc,
+ LIN2_BO_LAST            quintupletlength,
+ octetstring             quintuplet,
+ OCT2                    drx_par,
+ integer                 msNetW_cap_length,
+ octetstring             msNetw_cap optional,
+ LIN2_BO_LAST            containerLength,
+ octetstring             container optional
+} with { variant (lengthf) "LENGTHTO(cksn, spare, usedCipher, noofVectors,
+                                    security, kc, quintupletlength, quintuplet,
+                                    drx_par, msNetW_cap_length, msNetw_cap,
+                                     containerLength, container
+                                     )";
+         variant (quintupletlength) "LENGTHTO(quintuplet)"; 
+         variant (msNetW_cap_length) "LENGTHTO(msNetw_cap)";
+         variant (containerLength) "LENGTHTO(container)";
+         variant (noofVectors) "FIELDLENGTH(3)"; 
+};
+
+type record  MM_ContextUMTSReceive {
+ LIN2_BO_LAST            lengthf,
+ BIT3                    ksi,
+ BIT3                    usedGPRSIntegrityAlgorithm,
+ BIT1                    ugipai,
+ BIT1                    gupii,
+ BIT3                    usedCipher,
+ integer                 noofVectors,
+ BIT2                    security,
+ OCT16                   ck,
+ OCT16                   ik,
+ LIN2_BO_LAST            quintupletlength,
+ octetstring             quintuplet,
+ OCT2                    drx_par,
+ integer                 msNetW_cap_length,
+ octetstring             msNetw_cap optional,
+ LIN2_BO_LAST            containerLength,
+ octetstring             container optional
+} with { variant (lengthf) "LENGTHTO(ksi,  usedGPRSIntegrityAlgorithm, ugipai, gupii,
+                                     usedCipher, noofVectors,
+                                     security, ck, ik,  quintupletlength,
+                                     quintuplet, drx_par,msNetW_cap_length,
+                                     msNetw_cap, containerLength, container
+                                     )";
+         variant (quintupletlength) "LENGTHTO(quintuplet)"; 
+         variant (msNetW_cap_length) "LENGTHTO(msNetw_cap)";
+         variant (containerLength) "LENGTHTO(container)";
+         variant (noofVectors) "FIELDLENGTH(3)"; 
+};
+         
+//From 9.9.3.34 of 3GPP 24.301 according to Req. Spec. 4/1056-LPA 107 579/1 Rev D 
+type record GTPC_UENetworkCapabilityV
+{
+  BIT8     eEA,
+  BIT7     eIA,  
+  BIT1     spare,  
+  BIT8     uEA      optional,  
+  BIT7     uIA      optional,
+  BIT1     uCS2     optional, 
+  BIT1     spare2   optional,
+  BIT1     vCC      optional,
+  BIT6     spare3   optional,
+  octetstring     spare4 length (0..8) optional
+}
+
+//PDP context - 7.7.29
+type record of PDP_Context_GTPC PDP_Context_GTPC_List;
+
+type record  PDP_Context_GTPC {
+ OCT1                    type_gtpc,
+ LIN2_BO_LAST            lengthf,
+ BIT4                    nsapi,
+ BIT1                    order,
+ BIT1                    asi,
+ BIT1                    vaa,
+ BIT1                    ea,
+ BIT4                    sapi,
+ BIT4                    spare1,
+ integer                 qos_subLength,
+ QualityOfServiceProfile_Value qos_sub,
+ integer                 qos_reqLength,
+ QualityOfServiceProfile_Value qos_req,
+ integer                 qos_negLength,
+ QualityOfServiceProfile_Value qos_neg,
+ OCT2                    snd,
+ OCT2                    snu,
+ OCT1                    sendNPDUnum,
+ OCT1                    receiveNPDUnum,
+ OCT4                    uteidControlPlane,
+ OCT4                    uteidData1,
+ OCT1                    pdpcontext,
+ BIT4                    pdp_typeorg,
+ BIT4                    spare2,
+ OCT1                    pdp_typenum,
+ integer                 pdp_addressLength,
+ octetstring             pdp_address length (0..63),
+ integer                 ggsn_addressControlPlaneLength,
+ octetstring             ggsn_addressControlPlane length (4..16),
+ integer                 ggsn_addressUserPlaneLength,
+ octetstring             ggsn_addressUserPlane length (4..16),
+ integer                 apnLength,
+ octetstring             apn,
+ BIT4                    transactionId ,
+ BIT4                    spare3,
+ OCT1                    transactionID_cont,
+ OCT1                    pdp_typenum2 optional,              
+ LIN1                    pdp_addresslength2 optional,        
+ octetstring             pdp_Address2 length (0..63) optional  
+} with {variant "PRESENCE( type_gtpc = '82'O)";
+        variant (lengthf) "LENGTHTO(nsapi, order, asi, vaa, ea,
+          sapi, spare1, qos_subLength, qos_sub, qos_reqLength, qos_req,
+          qos_negLength, qos_neg, snd, snu, sendNPDUnum, receiveNPDUnum,
+          uteidControlPlane, uteidData1,pdpcontext, pdp_typeorg, spare2,
+          pdp_typenum, pdp_addressLength, pdp_address,
+          ggsn_addressControlPlaneLength, ggsn_addressControlPlane,
+          ggsn_addressUserPlaneLength, ggsn_addressUserPlane, apnLength, apn,
+          transactionId, spare3, transactionID_cont, pdp_typenum2,pdp_addresslength2,pdp_Address2)";
+        variant (qos_subLength) "LENGTHTO(qos_sub)";
+        variant (qos_reqLength) "LENGTHTO(qos_req)"; 
+        variant (qos_negLength) "LENGTHTO(qos_neg)";
+        variant (pdp_addressLength) "LENGTHTO(pdp_address)";
+        variant (ggsn_addressControlPlaneLength) 
+          "LENGTHTO(ggsn_addressControlPlane)";
+        variant (ggsn_addressUserPlaneLength) "LENGTHTO(ggsn_addressUserPlane)";
+        variant (apnLength) "LENGTHTO(apn)"; 	
+        variant (pdp_typenum2,pdp_addresslength2,pdp_Address2) "PRESENCE( ea = '1'B)";
+        variant (pdp_addresslength2) "LENGTHTO(pdp_Address2)";
+	};
+
+//Access Point Name - 7.7.30
+type record  AccessPointName  {
+ OCT1                    type_gtpc,
+ LIN2_BO_LAST            lengthf,
+ octetstring             apn_value
+}with { variant "PRESENCE( type_gtpc = '83'O)";
+        variant (lengthf) "LENGTHTO(apn_value)"; };
+
+//Protocol Configuration Options -  7.7.31
+// 24.008 10.5.6.3
+type record  ProtConfigOptions {
+ OCT1                     type_gtpc,
+ LIN2_BO_LAST             lengthf,
+ BIT3                     configProtocol,
+ BIT4                     spare,
+ BIT1                     extension0,
+ ProtocolIDList           protocols
+} with { variant "PRESENCE( type_gtpc = '84'O)";
+         variant (lengthf) "LENGTHTO(configProtocol, spare, extension0,
+                                     protocols)"; };
+
+type set of ProtocolElement ProtocolIDList;
+
+type record ProtocolElement {
+ OCT2                            protocolID,
+ integer                         lengthProtoID,
+ octetstring                     protoIDContents
+} with { variant (lengthProtoID) "LENGTHTO(protoIDContents)" };
+
+//GSN Address  -  7.7.32
+type record  GSN_Address_GTPC {
+ OCT1                     type_gtpc,
+ LIN2_BO_LAST             lengthf,
+ octetstring              addressf
+} with { variant "PRESENCE( type_gtpc = '85'O)";
+         variant (lengthf) "LENGTHTO(addressf)"; };
+
+//MS International PSTN/ISDN Num.(MSISDN) -  7.7.33
+type record  MSISDN {
+ OCT1                      type_gtpc,
+ LIN2_BO_LAST              lengthf,
+ octetstring               msisdn             
+} with { variant "PRESENCE( type_gtpc = '86'O)";
+         variant (lengthf) "LENGTHTO(msisdn)"; };
+
+type record QoSV_GTPC 
+{
+ BIT3               reliabilityClass,
+ BIT3               delayClass,
+ BIT2               spare1,  // '00'B
+ BIT3               precedenceClass,
+ BIT1               spare2, //'0'B
+ BIT4               peakThroughput,
+ BIT5               meanThroughput,
+ BIT3               spare3, //'000'B
+ BIT3               deliverErroneusSDU            optional, //opt because of V97
+ BIT2               deliveryOrder                 optional, //opt because of V97
+ BIT3               trafficClass                  optional, //opt because of V97
+ OCT1               maxSDUSize                    optional, //opt because of V97
+ OCT1               maxBitrateUplink              optional, //opt because of V97
+ OCT1               maxBitrateDownlink            optional, //opt because of V97
+ BIT4               sduErrorRatio                 optional, //opt because of V97
+ BIT4               residualBER                   optional, //opt because of V97
+ BIT2               trafficHandlingPriority       optional, //opt because of V97
+ BIT6               transferDelay                 optional, //opt because of V97
+ OCT1               guaranteedBitRateUplink       optional, //opt because of V97
+ OCT1               guaranteedBitRateDownlink     optional, //opt because of V97
+ BIT4               sourceStatisticsDescriptor    optional, //opt because of V97
+ BIT1               signallingIndication          optional, //opt because of V97
+ BIT3               spare4                        optional, //opt because of V97
+                    // '000'B
+ OCT1               maxBitrateDownlinkExt         optional, //opt because of V97
+ OCT1               guaranteedBitRateDownlinkExt  optional, //opt because of V97
+ OCT1               maxBitrateUplinkExt           optional, //opt because of V97
+ OCT1               guaranteedBitRateUplinkExt    optional  //opt because of V97
+};
+
+//Quality Of Service Profile -  7.7.34
+type record  QualityOfServiceProfile {
+ OCT1                      type_gtpc,
+ LIN2_BO_LAST              lengthf,
+ OCT1                      allocRetensionPrio,
+ QoSV_GTPC                 qos_ProfileValue 
+} with { variant "PRESENCE( type_gtpc = '87'O)";
+         variant (lengthf) "LENGTHTO(allocRetensionPrio, qos_ProfileValue)";};
+
+type record  QualityOfServiceProfile_Value {
+ OCT1                      allocRetensionPrio,
+ QoSV_GTPC                 qos_ProfileValue 
+} 
+
+//Authentication Quituplet  -   7.7.35
+type record  AuthenticationQuintuplet_GTPC {
+ OCT1                      type_gtpc,
+ LIN2_BO_LAST              lengthf,
+ OCT16                     rand,
+ integer                   xresLength,
+ octetstring               xres,
+ OCT16                     ck,
+ OCT16                     ik,
+ integer                   autnLength,
+ octetstring               autn 
+} with { variant "PRESENCE( type_gtpc = '88'O)";
+         variant (lengthf) "LENGTHTO(rand, xresLength, xres, ck, ik, 
+                                     autnLength, autn)";
+         variant (xresLength) "LENGTHTO(xres)";
+         variant (autnLength) "LENGTHTO(autn)"; };
+
+//Traffic Flow Template (TFT)  -   7.7.36
+// 24.008 10.5.6.12
+type record  TrafficFlowTemplate {
+ OCT1                           type_gtpc,
+ LIN2_BO_LAST                   lengthf,
+ TrafficFlowTemplateV_GTPC      tft               
+} with { variant "PRESENCE( type_gtpc = '89'O)";
+         variant (lengthf) "LENGTHTO(tft)"; };
+
+
+type union TrafficFlowTemplateV_GTPC
+{
+  TrafficFlowTemplateV_CreateAddReplaceTFT_GTPC
+              trafficFlowTemplateV_CreateAddReplaceTFT,
+  TrafficFlowTemplateV_DeletePacketFilter_GTPC
+              trafficFlowTemplateV_DeletePacketFilter,
+  TrafficFlowTemplateV_Delete_Existing_TFT_or_No_TFT_Operation_GTPC
+              trafficFlowTemplateV_Delete_Existing_TFT_or_No_TFT_Operation
+};
+
+
+type record TrafficFlowTemplateV_CreateAddReplaceTFT_GTPC
+{
+  integer                                numberOfPacketFilters,
+  BIT1                                   eBIT,
+  BIT3                                   operationCodeTFT,  //'001'B or
+  PacketFilterList_CreateAddReplaceTFT_GTPC   packetFilterList_CreateAddReplaceTFT,
+  ParametersList_GTPC                         parametersList            optional
+} with {
+  variant "PRESENCE (operationCodeTFT  = '001'B, //  Create New TFT
+                     operationCodeTFT  = '011'B, //  Add packet filters to existing TFT
+                     operationCodeTFT  = '100'B  //  Replace packet filters in existing TFT
+  )";
+  variant(parametersList)       "PRESENCE(eBIT = '1'B)";
+  variant(numberOfPacketFilters)"FIELDLENGTH(4)";
+  variant(numberOfPacketFilters)"LENGTHTO(packetFilterList_CreateAddReplaceTFT)";
+  variant(numberOfPacketFilters)"UNIT(elements)";
+};
+
+
+type record TrafficFlowTemplateV_DeletePacketFilter_GTPC
+{
+  integer                                numberOfPacketFilters,
+  BIT1                                   eBIT,
+  BIT3                                   operationCodeTFT,
+  //'101'B or '011'B or '100'B
+  PacketFilterList_DeletePacketFilter_GTPC    packetFilterList_DeletePacketFilter,
+  ParametersList_GTPC                         parametersList         optional
+} with {
+  variant "PRESENCE (operationCodeTFT = '101'B)"  // Delete packet filters from existing TFT
+  variant(parametersList) "PRESENCE(eBIT = '1'B)";
+  variant(numberOfPacketFilters)"FIELDLENGTH(4)";
+  variant(numberOfPacketFilters)"LENGTHTO(packetFilterList_DeletePacketFilter)";
+  variant  (numberOfPacketFilters)"UNIT(elements)";
+};
+
+
+type record TrafficFlowTemplateV_Delete_Existing_TFT_or_No_TFT_Operation_GTPC
+{
+  BIT4                         numberOfPacketFilters, //'0000'B
+  // numberOfPacketFilters is meaningless here since there is no PacketFilterList
+  BIT1                         eBIT,
+  BIT3                         operationCodeTFT,      // '010'B  or '110'B
+  ParametersList_GTPC               parametersList   optional
+} with {
+  variant "PRESENCE (operationCodeTFT = '010'B,  // delete existing TFT
+                     operationCodeTFT = '110'B   // No TFT Operation
+  )";
+  variant (parametersList) "PRESENCE(eBIT = '1'B)"
+};
+
+
+type record of PacketFilter_GTPC PacketFilterList_CreateAddReplaceTFT_GTPC;
+
+
+type record PacketFilter_GTPC
+{
+  PacketFilterIdentifier_GTPC       identifier,
+  OCT1                         evaluationPrecedence,
+  LIN1                         lengthIndicator,
+  octetstring                  contents
+} with { variant (lengthIndicator) "LENGTHTO (contents)"};
+
+
+type record of PacketFilterIdentifier_GTPC  PacketFilterList_DeletePacketFilter_GTPC;
+
+
+type OCT1  PacketFilterIdentifier_GTPC;
+
+
+type record of Parameter_GTPC ParametersList_GTPC;
+
+
+type record Parameter_GTPC
+{
+  OCT1               parameterIdentifier,
+  LIN1               lengthIndicator,
+  octetstring        contents
+} with { variant (lengthIndicator) "LENGTHTO (contents)"};
+
+
+//Target Identification  -   7.7.37
+type record  TargetIdentification {
+ OCT1                      type_gtpc,        
+ LIN2_BO_LAST              lengthf,
+ HEX1                      mcc1 optional,            
+ HEX1                      mcc2 optional,            
+ HEX1                      mcc3 optional,            
+ HEX1                      mnc3 optional,            
+ HEX1                      mnc1 optional,            
+ HEX1                      mnc2 optional,
+ OCT2                      lac optional,
+ OCT1                      rac optional,
+ OCT2                      rnc_id optional,
+ octetstring               extended_rnc_id optional        
+} with { variant "PRESENCE( type_gtpc = '8A'O)";
+         variant (lengthf) "LENGTHTO(mcc1, mcc2, mcc3, mnc3, mnc1, mnc2,
+                                     lac, rac, rnc_id, extended_rnc_id)"; };
+
+//UTRAN Transparent container  -   7.7.38
+type record  UTRANTransparentContainer {
+ OCT1                      type_gtpc,
+ LIN2_BO_LAST              lengthf,
+ octetstring               transparentfield
+} with { variant "PRESENCE( type_gtpc = '8B'O)";
+         variant (lengthf) "LENGTHTO(transparentfield)";};
+
+//RAB Setup Information  -   7.7.39
+type record of RABSetupInformation RABSetupInformation_List
+
+type record RABSetupInformation{
+ OCT1                       type_gtpc, 
+ LIN2_BO_LAST               lengthf,
+ BIT4                       nsapi,
+ BIT4                       unused,
+ OCT4                       teidData optional,
+ octetstring                rncIpAddress optional
+ } with { variant "PRESENCE( type_gtpc = '8C'O)"; 
+          variant (lengthf) "LENGTHTO(nsapi,unused,teidData,rncIpAddress)";}; 
+
+//Extension Header Type List  -  7.7.40
+type record  ExtensionHeaderTypeList_gtpc {
+ OCT1                       type_gtpc,
+ integer                    lengthf,
+ octetstring                extensionTypesList
+} with { variant "PRESENCE( type_gtpc = '8D'O)"; 
+         variant (lengthf) "LENGTHTO(extensionTypesList)"; };
+
+//Trigger ID  -  7.7.41
+type record  GTP_TriggerID {
+ OCT1                       type_gtpc,
+ LIN2_BO_LAST               lengthf,
+ octetstring                triggerID 
+} with { variant "PRESENCE( type_gtpc = '8E'O)"; 
+         variant (lengthf) "LENGTHTO(triggerID)";};
+
+//OMC Identity  -  7.7.42
+type record  OMCIdentity {
+ OCT1                       type_gtpc,
+ LIN2_BO_LAST               lengthf,
+ octetstring                omcID
+} with { variant "PRESENCE( type_gtpc = '8F'O)";
+         variant (lengthf) "LENGTHTO(omcID)"; };
+
+//BSSGP RAN Information needed for RAN Transparent Container 
+//From BSSGP specification 48.018 v9.3.0 according to CR 8446
+
+type union LIN2_2a_GTPC
+{
+integer length1,
+integer length2
+} with {
+        variant (length1) "FIELDLENGTH(7)";
+        variant (length2) "FIELDLENGTH(15)";
+        variant (length2) "BYTEORDER(last)";
+        variant (length1,length2) "FIELDORDER(msb)";
+      }   
+
+type record  PDU_in_Error_GTPC
+{
+ OCT1                   iEI,
+ BIT1                   ext,
+ LIN2_2a_GTPC           lengthIndicator,
+ octetstring            erroneous_BSSGP_PDU
+} with { 
+        variant (lengthIndicator) "LENGTHTO (erroneous_BSSGP_PDU)";
+        variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
+                                             length2,         ext = '0'B;)";
+        variant (ext,lengthIndicator) "FIELDORDER(msb)";
+       };
+
+type record Cell_Identifier_GTPC
+{
+ OCT1                   iEI,
+ BIT1                   ext,
+ LIN2_2a_GTPC           lengthIndicator,
+ HEX1                   mccDigit1 ,
+ HEX1                   mccDigit2 ,
+ HEX1                   mccDigit3 ,
+ HEX1                   mncDigit3 ,
+ HEX1                   mncDigit1 ,
+ HEX1                   mncDigit2 ,
+ OCT2                   lac,
+ OCT1                   rac,    
+ OCT2                   cI_value
+} with { 
+      variant (lengthIndicator) 
+     "LENGTHTO(mccDigit1,mccDigit2,mccDigit3,mncDigit3,mncDigit1,
+               mncDigit2,lac,rac,cI_value)";
+      variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
+                                           length2,         ext = '0'B;)";
+      variant (ext,lengthIndicator) "FIELDORDER(msb)";
+};
+
+type record Cause_BSSGP_GTPC 
+ {
+ OCT1                   iEI,
+ BIT1                   ext,
+ LIN2_2a_GTPC           lengthIndicator,
+ OCT1                   cause_Value
+ } with { 
+                variant (lengthIndicator) "LENGTHTO (cause_Value)";
+                variant (lengthIndicator) "CROSSTAG( length1,    ext = '1'B;
+                                                     length2,    ext = '0'B;)";
+                variant (ext,lengthIndicator) "FIELDORDER(msb)";
+};
+ 
+//48.018 v9.3.0 11.3.61
+type record RIM_Application_Identity_GTPC
+{
+ OCT1                   iEI,
+ BIT1                   ext,
+ LIN2_2a_GTPC           lengthIndicator,
+ OCT1                   rIMApplicationIdentity
+} with { 
+         variant (lengthIndicator) "LENGTHTO (rIMApplicationIdentity)";        
+         variant (lengthIndicator) "CROSSTAG( length1,        ext = '1'B;
+                                             length2,         ext = '0'B;)";
+        variant (ext,lengthIndicator) "FIELDORDER(msb)";
+};
+
+//48.018 v9.3.0 11.3.62
+type record RIM_Sequence_Number_GTPC
+{
+ OCT1                   iEI,
+ BIT1                   ext,
+ LIN2_2a_GTPC           lengthIndicator,
+ OCT4                   rIMSequenceNumber
+} with { 
+         variant (lengthIndicator) "LENGTHTO (rIMSequenceNumber)";        
+         variant (lengthIndicator) "CROSSTAG( length1,        ext = '1'B;
+                                             length2,         ext = '0'B;)";
+         variant (ext,lengthIndicator) "FIELDORDER(msb)";
+};
+
+//48.018 v9.3.0  Table 11.3.62a.1
+type record RAN_Information_Request_RIM_Container_GTPC
+{
+OCT1                              iEI,
+BIT1                              ext,
+LIN2_2a_GTPC                      lengthIndicator,
+RIM_Application_Identity_GTPC     rIM_Application_Identity,
+RIM_Sequence_Number_GTPC          rIM_Sequence_Number,
+RIM_PDU_Indications_GTPC          rIM_PDU_Indications,
+RIM_Protocol_Version_Number_GTPC  rIM_Protocol_Version_Number optional,
+RAN_Information_Request_Application_Container_GTPC  
+                                        application_Container optional,
+SON_TransferApplicationIdentity   sON_TransferApplicationIdentity optional                                         
+} with { 
+        variant (lengthIndicator) "LENGTHTO (rIM_Application_Identity,
+           rIM_Sequence_Number,rIM_PDU_Indications,rIM_Protocol_Version_Number,
+           application_Container,sON_TransferApplicationIdentity)";        
+        variant (lengthIndicator) "CROSSTAG( length1,        ext = '1'B;
+                                             length2,         ext = '0'B;)";
+        variant (ext,lengthIndicator) "FIELDORDER(msb)"; 
+        variant "TAG (rIM_Protocol_Version_Number,   iEI = '55'O)";               
+        variant (application_Container) "PRESENCE (rIM_Application_Identity.rIMApplicationIdentity = '01'O;)";  
+        variant (application_Container) "PRESENCE (rIM_Application_Identity.rIMApplicationIdentity = '02'O;)";
+        variant (application_Container) "PRESENCE (rIM_Application_Identity.rIMApplicationIdentity = '03'O;)";
+        variant (application_Container) "PRESENCE (rIM_Application_Identity.rIMApplicationIdentity = '04'O;)";
+        variant (application_Container) "PRESENCE (rIM_Application_Identity.rIMApplicationIdentity = '05'O;)";                                
+        variant (application_Container) 
+	 "CROSSTAG 
+	     (nacc,rIM_Application_Identity.rIMApplicationIdentity = '01'O;
+              si3 ,rIM_Application_Identity.rIMApplicationIdentity = '02'O;
+              mBMS,rIM_Application_Identity.rIMApplicationIdentity = '03'O;
+              sON, rIM_Application_Identity.rIMApplicationIdentity = '04'O;
+              uTRA_SI,rIM_Application_Identity.rIMApplicationIdentity = '05'O;
+             )"                                  
+        variant (sON_TransferApplicationIdentity) 
+	 "PRESENCE
+	    (rIM_Application_Identity.rIMApplicationIdentity = '04'O;)";                  
+};
+
+//48.018 v9.3.0 Table 11.3.62a.2
+type record RAN_Information_RIM_Container_GTPC
+{
+OCT1                              iEI,
+BIT1                              ext,
+LIN2_2a_GTPC                      lengthIndicator,  
+RIM_Application_Identity_GTPC     rIM_Application_Identity,
+RIM_Sequence_Number_GTPC          rIM_Sequence_Number,
+RIM_PDU_Indications_GTPC          rIM_PDU_Indications,
+RIM_Protocol_Version_Number_GTPC  rIM_Protocol_Version_Number   optional,
+ApplContainer_or_ApplErrContainer_GTPC 
+                              applContainer_or_ApplErrContainer optional,
+SON_TransferApplicationIdentity   sON_TransferApplicationIdentity optional                              
+}  with { 
+      variant (lengthIndicator) "LENGTHTO (rIM_Application_Identity,
+           rIM_Sequence_Number,rIM_PDU_Indications,rIM_Protocol_Version_Number,
+           applContainer_or_ApplErrContainer,sON_TransferApplicationIdentity)";        
+      variant (lengthIndicator) "CROSSTAG( length1,        ext = '1'B;
+                                           length2,        ext = '0'B;)";
+      variant (ext,lengthIndicator) "FIELDORDER(msb)";
+      variant 
+       "TAG (rIM_Protocol_Version_Number,   iEI = '55'O;)";        
+      variant (applContainer_or_ApplErrContainer) "PRESENCE(rIM_Application_Identity.rIMApplicationIdentity = '01'O;)"; 
+      variant (applContainer_or_ApplErrContainer) "PRESENCE(rIM_Application_Identity.rIMApplicationIdentity = '02'O;)"; 
+      variant (applContainer_or_ApplErrContainer) "PRESENCE(rIM_Application_Identity.rIMApplicationIdentity = '03'O;)"; 
+      variant (applContainer_or_ApplErrContainer) "PRESENCE(rIM_Application_Identity.rIMApplicationIdentity = '04'O;)"; 
+      variant (applContainer_or_ApplErrContainer) "PRESENCE(rIM_Application_Identity.rIMApplicationIdentity = '05'O;)"; 
+      variant (applContainer_or_ApplErrContainer) 
+       "CROSSTAG(nacc,rIM_Application_Identity.rIMApplicationIdentity = '01'O;
+                 si3,rIM_Application_Identity.rIMApplicationIdentity = '02'O;
+                 mBMS,rIM_Application_Identity.rIMApplicationIdentity = '03'O;
+                 sON,rIM_Application_Identity.rIMApplicationIdentity = '04'O;
+                 uTRA_SI,rIM_Application_Identity.rIMApplicationIdentity = '05'O)"; 
+                 
+                       
+      variant (sON_TransferApplicationIdentity) 
+	 "PRESENCE
+	    (rIM_Application_Identity.rIMApplicationIdentity = '04'O;)";                           
+};         
+
+type union ApplContainer_or_ApplErrContainer_GTPC
+{
+ ApplContainer_or_ApplErrContainer_NACC_GTPC       nacc,
+ ApplContainer_or_ApplErrContainer_SI3_GTPC        si3,
+ ApplContainer_or_ApplErrContainer_MBMS_GTPC       mBMS,
+ ApplContainer_or_ApplErrContainer_SON_GTPC        sON,
+ ApplContainer_or_ApplErrContainer_UTRA_SI_GTPC    uTRA_SI
+}
+
+type union ApplContainer_or_ApplErrContainer_NACC_GTPC
+{
+ RAN_Information_Application_Container_NACC_GTPC   application_Container,
+ Application_Error_Container_NACC_GTPC             application_Error_Container
+} with { 
+         variant "TAG (
+                        application_Container,  iEI = '4E'O;
+                        application_Error_Container, iEI = '56'O;)";   
+}
+
+type union ApplContainer_or_ApplErrContainer_SI3_GTPC
+{
+ RAN_Information_Application_Container_SI3_GTPC   application_Container,
+ Application_Error_Container_SI3_GTPC             application_Error_Container
+} with { 
+         variant "TAG (
+                        application_Container,  iEI = '4E'O;
+                        application_Error_Container, iEI = '56'O;)";   
+}
+
+type union ApplContainer_or_ApplErrContainer_MBMS_GTPC
+{
+ RAN_Information_Application_Container_MBMS_GTPC   application_Container,
+ Application_Error_Container_MBMS_GTPC             application_Error_Container
+} with { 
+         variant "TAG (
+                        application_Container,  iEI = '4E'O;
+                        application_Error_Container, iEI = '56'O;)";   
+}
+
+type union ApplContainer_or_ApplErrContainer_SON_GTPC
+{
+ RAN_Information_Application_Container_SON_GTPC   application_Container,
+ Application_Error_Container_SON_GTPC             application_Error_Container
+} with { 
+         variant "TAG (
+                        application_Container,  iEI = '4E'O;
+                        application_Error_Container, iEI = '56'O;)";   
+}
+
+type union ApplContainer_or_ApplErrContainer_UTRA_SI_GTPC
+{
+ RAN_Information_Application_Container_UTRA_SI_GTPC   application_Container,
+ Application_Error_Container_UTRA_SI_GTPC             application_Error_Container
+} with { 
+         variant "TAG (
+                        application_Container,  iEI = '4E'O;
+                        application_Error_Container, iEI = '56'O;)";   
+}
+
+
+//48.018 v9.3.0 Table 11.3.62a.3
+type record RAN_Information_Ack_RIM_Container_GTPC
+{
+OCT1                              iEI,
+BIT1                              ext,
+LIN2_2a_GTPC                      lengthIndicator,  
+RIM_Application_Identity_GTPC     rIM_Application_Identity,
+RIM_Sequence_Number_GTPC          rIM_Sequence_Number,
+RIM_Protocol_Version_Number_GTPC  rIM_Protocol_Version_Number   optional,
+SON_TransferApplicationIdentity   sON_TransferApplicationIdentity optional
+} with { 
+        variant (lengthIndicator) "LENGTHTO (rIM_Application_Identity,
+          rIM_Sequence_Number,rIM_Protocol_Version_Number)";        
+        variant (lengthIndicator) "CROSSTAG( length1,        ext = '1'B;
+                                           length2,         ext = '0'B;)";
+        variant (ext,lengthIndicator) "FIELDORDER(msb)";
+  
+        variant "TAG (rIM_Protocol_Version_Number,   iEI = '55'O;)"; 
+        variant (sON_TransferApplicationIdentity) 
+	 "PRESENCE
+	    (rIM_Application_Identity.rIMApplicationIdentity = '04'O;)";                 
+};
+
+//48.018 v9.3.0 Table 11.3.62a.4
+type record RAN_Information_Error_RIM_Container_GTPC
+{
+OCT1                              iEI,
+BIT1                              ext,
+LIN2_2a_GTPC                      lengthIndicator,  
+RIM_Application_Identity_GTPC     rIM_Application_Identity,
+Cause_BSSGP_GTPC                  rIM_cause,
+RIM_Protocol_Version_Number_GTPC  rIM_Protocol_Version_Number   optional,
+PDU_in_Error_GTPC                 pDU_in_Error,
+SON_TransferApplicationIdentity   sON_TransferApplicationIdentity optional     
+} with { 
+        variant (lengthIndicator) "LENGTHTO (rIM_Application_Identity,
+         rIM_cause,rIM_Protocol_Version_Number,pDU_in_Error)";        
+        variant (lengthIndicator) "CROSSTAG( length1,        ext = '1'B;
+                                           length2,         ext = '0'B;)";
+        variant (ext,lengthIndicator) "FIELDORDER(msb)";
+        variant "TAG (rIM_Protocol_Version_Number,   iEI = '55'O)"; 
+        variant (sON_TransferApplicationIdentity) 
+	 "PRESENCE
+	    (rIM_Application_Identity.rIMApplicationIdentity = '04'O;)";         
+};
+
+//48.018 v9.3.0 Table 11.3.62a.5
+type record RAN_Information_Application_Error_RIM_Container_GTPC
+{
+OCT1                              iEI,
+BIT1                              ext,
+LIN2_2a_GTPC                      lengthIndicator,    
+RIM_Application_Identity_GTPC     rIM_Application_Identity,
+RIM_Sequence_Number_GTPC          rIM_Sequence_Number,
+RIM_PDU_Indications_GTPC          rIM_PDU_Indications,
+RIM_Protocol_Version_Number_GTPC  rIM_Protocol_Version_Number   optional,
+Application_Error_Container_GTPC  application_Error_Container,
+SON_TransferApplicationIdentity   sON_TransferApplicationIdentity optional
+} with { 
+     variant (lengthIndicator) "LENGTHTO (rIM_Application_Identity,
+       rIM_Sequence_Number,rIM_PDU_Indications,rIM_Protocol_Version_Number,  
+       application_Error_Container)";        
+     variant (lengthIndicator) "CROSSTAG( length1,        ext = '1'B;
+                                          length2,         ext = '0'B;)";
+     variant (ext,lengthIndicator) "FIELDORDER(msb)";
+ 
+     variant "TAG (rIM_Protocol_Version_Number,   iEI = '55'O)"; 
+          
+     variant (application_Error_Container)
+      "CROSSTAG (nacc,rIM_Application_Identity.rIMApplicationIdentity = '01'O;
+                 si3,rIM_Application_Identity.rIMApplicationIdentity = '02'O;
+                 mBMS,rIM_Application_Identity.rIMApplicationIdentity = '03'O;
+                 sON,rIM_Application_Identity.rIMApplicationIdentity = '04'O;
+                 uTRA_SI,rIM_Application_Identity.rIMApplicationIdentity = '05'O)"; 
+                        
+     variant (sON_TransferApplicationIdentity) 
+	 "PRESENCE
+	    (rIM_Application_Identity.rIMApplicationIdentity = '04'O;)";        
+};
+
+//48.018 v9.3.0 Table 11.3.64
+type union Application_Error_Container_GTPC
+{
+ Application_Error_Container_NACC_GTPC     nacc,
+ Application_Error_Container_SI3_GTPC      si3,
+ Application_Error_Container_MBMS_GTPC     mBMS,
+ Application_Error_Container_SON_GTPC      sON,
+ Application_Error_Container_UTRA_SI_GTPC  uTRA_SI
+}
+
+//48.018 v9.3.0 Table 11.3.63.1
+type union RAN_Information_Request_Application_Container_GTPC
+{
+ RAN_Information_Request_Application_Container_NACC_GTPC      nacc,
+ RAN_Information_Request_Application_Container_SI3_GTPC       si3, 
+ RAN_Information_Request_Application_Container_MBMS_GTPC      mBMS,
+ RAN_Information_Request_Application_Container_SON_GTPC       sON,
+ RAN_Information_Request_Application_Container_UTRA_SI_GTPC   uTRA_SI
+}
+
+//48.018 v9.3.0 Table 11.3.63.1.1
+type record RAN_Information_Request_Application_Container_NACC_GTPC
+{
+ OCT1                        iEI,
+ BIT1                        ext,
+ LIN2_2a_GTPC                lengthIndicator,
+ Cell_Identifier_GTPC        reporting_Cell_Identifier
+} with { 
+         variant (lengthIndicator) "LENGTHTO (reporting_Cell_Identifier)";     
+         variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
+                                             length2,         ext = '0'B;)";
+         variant (ext,lengthIndicator) "FIELDORDER(msb)";
+};        
+
+//48.018 v9.3.0 Table 11.3.63.1.2
+type record RAN_Information_Request_Application_Container_SI3_GTPC
+{
+ OCT1                        iEI,
+ BIT1                        ext,
+ LIN2_2a_GTPC                lengthIndicator,
+ Cell_Identifier_GTPC        reporting_Cell_Identifier
+} with { 
+         variant (lengthIndicator) "LENGTHTO (reporting_Cell_Identifier)";     
+         variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
+                                             length2,         ext = '0'B;)";
+         variant (ext,lengthIndicator) "FIELDORDER(msb)";
+}
+
+//48.018 v9.3.0 Table 11.3.63.1.3
+type record RAN_Information_Request_Application_Container_MBMS_GTPC
+{
+ OCT1                        iEI,
+ BIT1                        ext,
+ LIN2_2a_GTPC                lengthIndicator,
+ Cell_Identifier_GTPC        reporting_Cell_Identifier
+} with { 
+         variant (lengthIndicator) "LENGTHTO (reporting_Cell_Identifier)";     
+         variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
+                                             length2,         ext = '0'B;)";
+         variant (ext,lengthIndicator) "FIELDORDER(msb)";
+}
+
+//48.018 v9.3.0 Table 11.3.63.1.4
+type record RAN_Information_Request_Application_Container_SON_GTPC
+{
+ OCT1                        iEI,
+ BIT1                        ext,
+ LIN2_2a_GTPC                lengthIndicator,
+ Cell_Identifier_GTPC        reporting_Cell_Identifier,
+ octetstring                 sON_TransferRequestContainer   // 3GPP TS 36.413
+} with { 
+         variant (lengthIndicator) "LENGTHTO (reporting_Cell_Identifier,sON_TransferRequestContainer)";     
+         variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
+                                             length2,         ext = '0'B;)";
+         variant (ext,lengthIndicator) "FIELDORDER(msb)";
+}
+
+//48.018 v9.3.0 Table 11.3.63.1.5
+type record RAN_Information_Request_Application_Container_UTRA_SI_GTPC
+{
+ OCT1                        iEI,
+ BIT1                        ext,
+ LIN2_2a_GTPC                lengthIndicator,
+ Cell_Identifier_GTPC        reporting_Cell_Identifier
+} with { 
+         variant (lengthIndicator) "LENGTHTO (reporting_Cell_Identifier)";     
+         variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
+                                             length2,         ext = '0'B;)";
+         variant (ext,lengthIndicator) "FIELDORDER(msb)";
+}
+
+//48.018 v9.3.0 Table 11.3.108
+type record SON_TransferApplicationIdentity
+{
+ OCT1                        iEI,
+ BIT1                        ext,
+ LIN2_2a_GTPC                lengthIndicator, 
+ octetstring         sON_TransferApplicationIdentityValue  
+}
+
+//48.018 v9.3.0 Table 11.3.63.2.1
+type record RAN_Information_Application_Container_NACC_GTPC
+{
+ OCT1                        iEI,
+ BIT1                        ext,
+ LIN2_2a_GTPC                lengthIndicator,
+ Cell_Identifier_GTPC        reporting_Cell_Identifier,
+ BIT1                        typeBit,
+ BIT7                        number_of_SI_PSI,
+ octetstring                 sI_PSI     // 3GPP TS 44.018, 44.060
+} with { 
+       variant (lengthIndicator) 
+        "LENGTHTO (reporting_Cell_Identifier,typeBit,number_of_SI_PSI,sI_PSI)";
+       variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
+                                            length2,         ext = '0'B;)";
+       variant (ext,lengthIndicator) "FIELDORDER(msb)";
+};        
+
+//48.018 v9.3.0 Table 11.3.63.2.2
+type record RAN_Information_Application_Container_SI3_GTPC
+{
+ OCT1                        iEI,
+ BIT1                        ext,
+ LIN2_2a_GTPC                lengthIndicator,
+ Cell_Identifier_GTPC        reporting_Cell_Identifier,
+ octetstring                 sI3 length (21)       // 3GPP TS 44.018
+} with { 
+       variant (lengthIndicator) 
+        "LENGTHTO (reporting_Cell_Identifier,sI3)";
+       variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
+                                            length2,         ext = '0'B;)";
+       variant (ext,lengthIndicator) "FIELDORDER(msb)"; 
+       variant (sI3)"FIELDLENGTH(21)" ;      
+};        
+
+//48.018 v9.3.0 Table 11.3.63.2.3
+type record RAN_Information_Application_Container_MBMS_GTPC
+{
+ OCT1                        iEI,
+ BIT1                        ext,
+ LIN2_2a_GTPC                lengthIndicator,
+ Cell_Identifier_GTPC        reporting_Cell_Identifier,
+ octetstring                 mBMS_ChannelReport
+} with { 
+       variant (lengthIndicator) 
+        "LENGTHTO (reporting_Cell_Identifier,mBMS_ChannelReport)";
+       variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
+                                            length2,         ext = '0'B;)";
+       variant (ext,lengthIndicator) "FIELDORDER(msb)";          
+};        
+
+//48.018 v9.3.0 Table 11.3.63.2.4
+type record RAN_Information_Application_Container_SON_GTPC
+{
+ OCT1                        iEI,
+ BIT1                        ext,
+ LIN2_2a_GTPC                lengthIndicator,
+ Cell_Identifier_GTPC        reporting_Cell_Identifier,
+ octetstring                 sON_TransferResponseContainer // 3GPP TS 36.413
+
+
+} with { 
+       variant (lengthIndicator) 
+        "LENGTHTO (reporting_Cell_Identifier,sON_TransferResponseContainer)";
+       variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
+                                            length2,         ext = '0'B;)";
+       variant (ext,lengthIndicator) "FIELDORDER(msb)";          
+};        
+
+//48.018 v9.3.0 Table 11.3.63.2.5
+type record RAN_Information_Application_Container_UTRA_SI_GTPC
+{
+ OCT1                        iEI,
+ BIT1                        ext,
+ LIN2_2a_GTPC                lengthIndicator,
+ Cell_Identifier_GTPC        reporting_Cell_Identifier,
+ octetstring                 uTRA_SI_Container   // 3GPP TS25.331
+
+
+} with { 
+       variant (lengthIndicator) 
+        "LENGTHTO (reporting_Cell_Identifier,uTRA_SI_Container)";
+       variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
+                                            length2,         ext = '0'B;)";
+       variant (ext,lengthIndicator) "FIELDORDER(msb)";          
+};        
+
+
+//48.018 v9.3.0 11.3.64.1 
+type record Application_Error_Container_NACC_GTPC
+{
+ OCT1                   iEI,
+ BIT1                   ext,
+ LIN2_2a_GTPC           lengthIndicator,
+ OCT1                   nACC_cause,
+ Application_Container_IE_NACC_GTPC  erroneousApplicationContainer
+} with { 
+       variant (lengthIndicator)
+          "LENGTHTO (nACC_cause,erroneousApplicationContainer)"; 
+       variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
+                                            length2,         ext = '0'B;)";
+       variant (ext,lengthIndicator) "FIELDORDER(msb)";
+};        
+
+type union Application_Container_IE_NACC_GTPC
+{
+RAN_Information_Request_Application_Container_NACC_GTPC 
+                        rAN_Information_Request_Application_Container,
+			
+RAN_Information_Application_Container_NACC_GTPC    
+                        rAN_Information_Application_Container
+}        
+with { 
+         variant "TAG (
+                  rAN_Information_Request_Application_Container,  iEI = '4D'O;
+                  rAN_Information_Application_Container, iEI = '4E'O)";  
+}
+
+
+//48.018 v9.3.0 11.3.64.2 
+type record Application_Error_Container_SI3_GTPC
+{
+ OCT1                   iEI,
+ BIT1                   ext,
+ LIN2_2a_GTPC           lengthIndicator,
+ OCT1                   sI3_cause,
+ Application_Container_IE_SI3_GTPC  erroneousApplicationContainer
+} with { 
+       variant (lengthIndicator)
+          "LENGTHTO (sI3_cause,erroneousApplicationContainer)"; 
+       variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
+                                            length2,         ext = '0'B;)";
+       variant (ext,lengthIndicator) "FIELDORDER(msb)";
+};  
+
+
+type union Application_Container_IE_SI3_GTPC
+{
+RAN_Information_Request_Application_Container_SI3_GTPC 
+                        rAN_Information_Request_Application_Container,
+			
+RAN_Information_Application_Container_SI3_GTPC    
+                        rAN_Information_Application_Container
+}        
+with { 
+         variant "TAG (
+                  rAN_Information_Request_Application_Container,  iEI = '4D'O;
+                  rAN_Information_Application_Container, iEI = '4E'O)";  
+}
+
+//48.018 v9.3.0 11.3.64.3 
+type record Application_Error_Container_MBMS_GTPC
+{
+ OCT1                   iEI,
+ BIT1                   ext,
+ LIN2_2a_GTPC           lengthIndicator,
+ OCT1                   mBMS_cause,
+ Application_Container_IE_MBMS_GTPC  erroneousApplicationContainer
+} with { 
+       variant (lengthIndicator)
+          "LENGTHTO (mBMS_cause,erroneousApplicationContainer)"; 
+       variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
+                                            length2,         ext = '0'B;)";
+       variant (ext,lengthIndicator) "FIELDORDER(msb)";
+};  
+
+
+type union Application_Container_IE_MBMS_GTPC
+{
+RAN_Information_Request_Application_Container_MBMS_GTPC 
+                        rAN_Information_Request_Application_Container,
+			
+RAN_Information_Application_Container_MBMS_GTPC    
+                        rAN_Information_Application_Container
+}        
+with { 
+         variant "TAG (
+                  rAN_Information_Request_Application_Container,  iEI = '4D'O;
+                  rAN_Information_Application_Container, iEI = '4E'O)";  
+}
+
+//48.018 v9.3.0 11.3.64.4 
+type record Application_Error_Container_SON_GTPC
+{
+ OCT1                   iEI,
+ BIT1                   ext,
+ LIN2_2a_GTPC           lengthIndicator,
+ OCT1                   sON_cause,
+ Application_Container_IE_SON_GTPC  erroneousApplicationContainer
+} with { 
+       variant (lengthIndicator)
+          "LENGTHTO (sON_cause,erroneousApplicationContainer)"; 
+       variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
+                                            length2,         ext = '0'B;)";
+       variant (ext,lengthIndicator) "FIELDORDER(msb)";
+};  
+
+
+type union Application_Container_IE_SON_GTPC
+{
+RAN_Information_Request_Application_Container_SON_GTPC 
+                        rAN_Information_Request_Application_Container,
+			
+RAN_Information_Application_Container_SON_GTPC    
+                        rAN_Information_Application_Container
+}        
+with { 
+         variant "TAG (
+                  rAN_Information_Request_Application_Container,  iEI = '4D'O;
+                  rAN_Information_Application_Container, iEI = '4E'O)";  
+}
+
+
+//48.018 v9.3.0 11.3.64.5 
+type record Application_Error_Container_UTRA_SI_GTPC
+{
+ OCT1                   iEI,
+ BIT1                   ext,
+ LIN2_2a_GTPC           lengthIndicator,
+ OCT1                   uTRA_SI_cause,
+ Application_Container_IE_SON_GTPC  erroneousApplicationContainer
+} with { 
+       variant (lengthIndicator)
+          "LENGTHTO (uTRA_SI_cause,erroneousApplicationContainer)"; 
+       variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
+                                            length2,         ext = '0'B;)";
+       variant (ext,lengthIndicator) "FIELDORDER(msb)";
+};  
+
+
+type union Application_Container_IE_UTRA_SI_GTPC
+{
+RAN_Information_Request_Application_Container_UTRA_SI_GTPC 
+                        rAN_Information_Request_Application_Container,
+			
+RAN_Information_Application_Container_UTRA_SI_GTPC    
+                        rAN_Information_Application_Container
+}        
+with { 
+         variant "TAG (
+                  rAN_Information_Request_Application_Container,  iEI = '4D'O;
+                  rAN_Information_Application_Container, iEI = '4E'O)";  
+}
+
+
+//48.018 v9.3.0 11.3.65
+type record RIM_PDU_Indications_GTPC
+{
+ OCT1                   iEI,
+ BIT1                   ext,
+ LIN2_2a_GTPC           lengthIndicator,
+ BIT1                   ack,
+ BIT3                   pDU_Type_Extension,
+ BIT4                   reserved
+} with { 
+        variant (lengthIndicator) "LENGTHTO (ack,pDU_Type_Extension,reserved)";
+        variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
+                                             length2,         ext = '0'B;)";
+        variant (ext,lengthIndicator) "FIELDORDER(msb)";
+};
+
+//48.018 v9.3.0 11.3.67
+type record RIM_Protocol_Version_Number_GTPC
+{
+ OCT1                   iEI,
+ BIT1                   ext,
+ LIN2_2a_GTPC           lengthIndicator,
+ OCT1                   rIMProtocolVersionNumber
+} with { 
+         variant (lengthIndicator) "LENGTHTO (rIMProtocolVersionNumber)";   
+         variant (lengthIndicator) "CROSSTAG( length1,        ext = '1'B;
+                                              length2,        ext = '0'B;)";
+         variant (ext,lengthIndicator) "FIELDORDER(msb)";
+};        
+
+//48.018 v9.3.0  11.3.70
+type record RIM_Routing_Information_GTPC
+{
+ OCT1                   iEI,
+ BIT1                   ext,
+ LIN2_2a_GTPC           lengthIndicator,
+ HEX1                   rIMRoutingAddressDiscriminator,
+ HEX1                   spare,
+ RIM_Routing_Address_GTPC    rIM_Routing_Address 
+}  with { 
+       variant (lengthIndicator) 
+	"LENGTHTO (rIMRoutingAddressDiscriminator,spare,rIM_Routing_Address)"; 
+       variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
+                                             length2,         ext = '0'B;)";
+       variant (ext,lengthIndicator) "FIELDORDER(msb)";
+
+       variant (rIM_Routing_Address) 
+	 "CROSSTAG (cell_Identifier,rIMRoutingAddressDiscriminator = '0'H;
+                    rNCID,          rIMRoutingAddressDiscriminator = '1'H;
+                    eNB_Identifier, rIMRoutingAddressDiscriminator = '2'H;)" 
+};
+
+type record Cell_Identifier_V_GTPC
+{ 
+ HEX1                   mccDigit1,
+ HEX1                   mccDigit2,
+ HEX1                   mccDigit3,
+ HEX1                   mncDigit3,
+ HEX1                   mncDigit1,
+ HEX1                   mncDigit2,
+ OCT2                   lac,
+ OCT1                   rac,    
+ OCT2                   cI_value
+};
+
+type union RIM_Routing_Address_GTPC
+{
+ Cell_Identifier_V_GTPC   cell_Identifier, 
+ RNC_ID_BSSGP_GTPC        rNCID,
+ ENB_Identifier           eNB_Identifier
+ }
+
+type record RNC_ID_BSSGP_GTPC
+{
+ HEX1                   mccDigit1,
+ HEX1                   mccDigit2,
+ HEX1                   mccDigit3,
+ HEX1                   mncDigit3,
+ HEX1                   mncDigit1,
+ HEX1                   mncDigit2,
+ OCT2                   lAC,
+ OCT1                   rAC,
+ HEX1                   spare,
+ integer                rNC_ID
+}  with { 
+          variant (spare,rNC_ID) "FIELDORDER(msb)";
+          variant (rNC_ID) "BYTEORDER(last)";  
+          variant (rNC_ID) "FIELDLENGTH(12)";
+} 
+
+type record ENB_Identifier
+{
+ HEX1                   mccDigit1,
+ HEX1                   mccDigit2,
+ HEX1                   mccDigit3,
+ HEX1                   mncDigit3,
+ HEX1                   mncDigit1,
+ HEX1                   mncDigit2,
+ OCT2                   tAC,
+ octetstring            globalENB_ID
+}
+
+//Note: the following structure is outdated
+/*
+type record GlobalRNC_ID_BSSGP_GTPC
+{
+ HEX1                   mccDigit1,
+ HEX1                   mccDigit2,
+ HEX1                   mccDigit3,
+ HEX1                   mncDigit3,
+ HEX1                   mncDigit1,
+ HEX1                   mncDigit2, 
+
+ integer                rNC_ID
+}  with { 
+          variant (spare,rNC_ID) "FIELDORDER(msb)";
+          variant (rNC_ID) "BYTEORDER(last)";  
+          variant (rNC_ID) "FIELDLENGTH(12)";
+}
+*/
+
+//48.018 v9.3.0  10.6.1
+type record PDU_BSSGP_RAN_INFORMATION_REQUEST_GTPC
+{
+ OCT1			  	   bssgpPduType,
+ RIM_Routing_Information_GTPC  	   destination_Cell_Identifier,
+ RIM_Routing_Information_GTPC  	   source_Cell_Identifier,
+ RAN_Information_Request_RIM_Container_GTPC  rIM_Container
+};
+      
+//48.018 v9.3.0  10.6.2
+type record PDU_BSSGP_RAN_INFORMATION_GTPC
+{
+ OCT1			                bssgpPduType,
+ RIM_Routing_Information_GTPC           destination_Cell_Identifier,
+ RIM_Routing_Information_GTPC           source_Cell_Identifier,
+ RAN_Information_RIM_Container_GTPC     rIM_Container
+};
+
+//48.018 v9.3.0  10.6.3
+type record PDU_BSSGP_RAN_INFORMATION_ACK_GTPC
+{
+ OCT1				   bssgpPduType,
+ RIM_Routing_Information_GTPC	   destination_Cell_Identifier,
+ RIM_Routing_Information_GTPC	   source_Cell_Identifier,
+ RAN_Information_Ack_RIM_Container_GTPC rIM_Container
+};
+
+//48.018 v9.3.0  10.6.4
+type record PDU_BSSGP_RAN_INFORMATION_ERROR_GTPC
+{
+ OCT1			                bssgpPduType,
+ RIM_Routing_Information_GTPC           destination_Cell_Identifier,
+ RIM_Routing_Information_GTPC           source_Cell_Identifier,
+ RAN_Information_Error_RIM_Container_GTPC  rIM_Container
+};
+
+//48.018 v9.3.0  10.6.5
+type record PDU_BSSGP_RAN_INFORMATION_APPLICATION_ERROR_GTPC
+{
+ OCT1			                bssgpPduType,
+ RIM_Routing_Information_GTPC           destination_Cell_Identifier,
+ RIM_Routing_Information_GTPC           source_Cell_Identifier,
+ RAN_Information_Application_Error_RIM_Container_GTPC  rIM_Container
+};
+
+type union RANTransparentContainerField  
+{    
+PDU_BSSGP_RAN_INFORMATION_REQUEST_GTPC       pDU_BSSGP_RAN_INFORMATION_REQUEST,
+PDU_BSSGP_RAN_INFORMATION_GTPC               pDU_BSSGP_RAN_INFORMATION,
+PDU_BSSGP_RAN_INFORMATION_ACK_GTPC           pDU_BSSGP_RAN_INFORMATION_ACK,
+PDU_BSSGP_RAN_INFORMATION_ERROR_GTPC         pDU_BSSGP_RAN_INFORMATION_ERROR,
+PDU_BSSGP_RAN_INFORMATION_APPLICATION_ERROR_GTPC  
+                                  pDU_BSSGP_RAN_INFORMATION_APPLICATION_ERROR
+} with { variant "TAG (        
+  pDU_BSSGP_RAN_INFORMATION_REQUEST,           bssgpPduType ='71'O;
+  pDU_BSSGP_RAN_INFORMATION,       bssgpPduType ='70'O;
+  pDU_BSSGP_RAN_INFORMATION_ACK,   bssgpPduType ='72'O;
+  pDU_BSSGP_RAN_INFORMATION_ERROR, bssgpPduType ='73'O;
+  pDU_BSSGP_RAN_INFORMATION_APPLICATION_ERROR, bssgpPduType ='74'O  
+  )"  
+};
+  
+//RAN Transparent Container 7.7.43
+type record RANTransparentContainer{
+ OCT1                                 type_gtpc,
+ LIN2_BO_LAST                         lengthf,
+ RANTransparentContainerField         rANTransparentContainerField
+} with { variant "PRESENCE( type_gtpc = '90'O)";
+         variant (lengthf) "LENGTHTO(rANTransparentContainerField)"; };
+
+//Charging Gateway Address  - 7.7.44
+type record  ChargingGatewayAddress {
+ OCT1                       type_gtpc,
+ LIN2_BO_LAST               lengthf,
+ iPv4_iPv6_Address          ipv_address
+} with { variant "PRESENCE( type_gtpc = 'FB'O)";
+         variant (lengthf) "LENGTHTO(ipv_address)";};
+
+type union iPv4_iPv6_Address{
+ OCT4                       iPv4_Address,
+ OCT16                      iPv6_Address
+}
+
+//PDP Context Priorization  - 7.7.45
+type record PDPContextPriorization {
+ OCT1                       type_gtpc,
+ LIN2_BO_LAST               lengthf
+} with { variant "PRESENCE( type_gtpc = '91'O)";};
+
+//Addititonal RAB Setup Information  -   7.7.45A
+
+type record of AdditionalRABSetupInformation AdditionalRABSetupInformation_List
+
+type record AdditionalRABSetupInformation {
+ OCT1                       type_gtpc,
+ LIN2_BO_LAST               lengthf,
+ BIT4                       nsapi,
+ BIT4                       unused,
+ OCT4                       teidData optional,
+ octetstring                rncIpAddress optional
+} with {variant "PRESENCE( type_gtpc = '92'O)"; 
+        variant (lengthf) "LENGTHTO(nsapi,unused,teidData,rncIpAddress)"; };
+
+//Private Extension  -  7.7.46
+type record of PrivateExtension_gtpc PrivateExtension_gtpc_List;
+
+type record  PrivateExtension_gtpc {
+ OCT1                       type_gtpc,
+ LIN2_BO_LAST               lengthf,
+ OCT2                       extensionID,
+ octetstring                extensionValue
+} with {variant "PRESENCE( type_gtpc = 'FF'O)"; 
+        variant (lengthf) "LENGTHTO(extensionID, extensionValue)"; };
+
+//SGSN Number - 7.7.47
+type record SGSN_Number {
+ OCT1                       type_gtpc,
+ LIN2_BO_LAST               lengthf,
+ octetstring                sGSN_NumberValue
+} with { variant "PRESENCE( type_gtpc = '93'O)"; 
+         variant (lengthf) "LENGTHTO(sGSN_NumberValue)"; };
+
+//Common Flags - 7.7.48
+type record CommonFlags {
+ OCT1                       type_gtpc,
+ LIN2_BO_LAST               lengthf,
+ BIT1                       prohibitPayloadCompression,
+ BIT1                       mBMS_ServiceType,
+ BIT1                       rAN_ProceduresReady,
+ BIT1                       mBMS_CountingInformation,
+ BIT1                       nO_QoS_Negotiation,
+ BIT1                       nRSN,
+ BIT1                       upgradeQoS_Supported,
+ BIT1                       dualAddressBearerFlag
+} with { variant "PRESENCE( type_gtpc = '94'O)";
+         variant (lengthf) "LENGTHTO(prohibitPayloadCompression,mBMS_ServiceType,
+                                     rAN_ProceduresReady,mBMS_CountingInformation,
+                                     nO_QoS_Negotiation,nRSN,upgradeQoS_Supported,dualAddressBearerFlag)"; }; 
+
+//APN Restriction - 7.7.49
+type record APN_Restriction  {
+ OCT1                       type_gtpc,
+ LIN2_BO_LAST               lengthf,
+ OCT1                       restrictionTypeValue
+} with { variant "PRESENCE( type_gtpc = '95'O)";
+         variant (lengthf) "LENGTHTO(restrictionTypeValue)"; }; 
+  
+// RAT Type  -  7.7.50
+type record RATType {
+ OCT1                       type_gtpc,
+ LIN2_BO_LAST               lengthf,
+ OCT1                       ratTypeValue
+} with { variant "PRESENCE( type_gtpc = '97'O)";
+         variant (lengthf) "LENGTHTO(ratTypeValue)"; }; 
+
+// User Location Information  -  7.7.51
+type record UserLocationInformation {
+ OCT1                       type_gtpc,
+ LIN2_BO_LAST               lengthf,
+ OCT1                       geographicLocationType,
+ GeographicLocation_gtpc    geographicLocation
+} with { variant "PRESENCE( type_gtpc = '98'O)";
+  variant (lengthf) "LENGTHTO(geographicLocationType, geographicLocation)";
+  variant (geographicLocation) "CROSSTAG(geographicLocationCGI, geographicLocationType='00'O;
+                                         geographicLocationSAI, geographicLocationType='01'O;
+                                         geographicLocationRAI, geographicLocationType='02'O)";};
+
+type union GeographicLocation_gtpc {
+  GeographicLocationCGI     geographicLocationCGI,
+  GeographicLocationSAI     geographicLocationSAI,
+  GeographicLocationRAI     geographicLocationRAI
+}
+
+// Figure 7.7.51.2: Geographic Location field for CGI
+type record GeographicLocationCGI {
+ HEX1                       mccDigit1,
+ HEX1                       mccDigit2,
+ HEX1                       mccDigit3,
+ HEX1                       mncDigit3,
+ HEX1                       mncDigit1,
+ HEX1                       mncDigit2,
+ OCT2                       lac,
+ OCT2                       cI_value
+}
+
+// Figure 7.7.51.3: Geographic Location field for SAI
+type record GeographicLocationSAI {
+ HEX1                       mccDigit1,
+ HEX1                       mccDigit2,
+ HEX1                       mccDigit3,
+ HEX1                       mncDigit3,
+ HEX1                       mncDigit1,
+ HEX1                       mncDigit2,
+ OCT2                       lac,
+ OCT2                       sac
+}
+
+// Figure 7.7.51.4: Geographic Location field for RAI
+type record GeographicLocationRAI {
+ HEX1                       mccDigit1,
+ HEX1                       mccDigit2,
+ HEX1                       mccDigit3,
+ HEX1                       mncDigit3,
+ HEX1                       mncDigit1,
+ HEX1                       mncDigit2,
+ OCT2                       lac,
+ OCT2                       rac
+}
+
+// MS Time Zone  -  7.7.52
+type record MS_TimeZone {
+ OCT1                       type_gtpc,
+ LIN2_BO_LAST               lengthf,
+ OCT1                       timeZone,
+ BIT2                       daylightSavingTime,
+ BIT3                       spare1,
+// This bit is proprietary, compared to the 3GPP definition of
+// the Time Zone information element.
+// The new field "SGSN Attempts to Update MS" is described in 
+// the following CPI documentation: GSN CDR Format, 
+// 1/190 83-AXB 250 05/6 Uen A.
+// Web link to CPI: http://cpi2.al.sw.ericsson.se/alex?pr=PDU+PCN
+ BIT1                       sgsnAttempsToUpdateMS,
+ BIT2                       spare2
+} with { variant "PRESENCE( type_gtpc = '99'O)";
+         variant (lengthf) "LENGTHTO(timeZone, daylightSavingTime, spare1,
+                                     sgsnAttempsToUpdateMS, spare2)"; };
+
+// IMEISV - 7.7.53
+type record IMEISV_gtpc {
+ OCT1                      type_gtpc,
+ LIN2_BO_LAST              lengthf,
+ OCT8                      imeisv
+} with { variant "PRESENCE( type_gtpc = '9A'O)";
+         variant (lengthf) "LENGTHTO(imeisv)"; };
+
+// Camel Charging Information Container - 7.7.54
+type record CamelChargingInformationContainer {
+ OCT1                      type_gtpc,
+ LIN2_BO_LAST              lengthf,
+ octetstring               camelInformationPDP_IE
+} with { variant "PRESENCE( type_gtpc = '9B'O)";
+         variant (lengthf) "LENGTHTO(camelInformationPDP_IE)"; };
+
+// MBMS UE Context Container - 7.7.55
+type record of MBMS_UE_ContextContainer MBMS_UE_Context_List;
+
+type record MBMS_UE_ContextContainer {
+ OCT1                    type_gtpc,
+ LIN2_BO_LAST            lengthf,
+ BIT4                    spare1,
+ BIT4                    linkedNSAPI,
+ OCT4                    uteidControlPlane,
+ OCT1                    enhancedNSAPI,
+ BIT4                    pdp_typeorg,
+ BIT4                    spare2,
+ OCT1                    pdp_typenum,
+ integer                 pdp_addressLength,
+ octetstring             pdp_address length (0..63),
+ integer                 ggsn_addressControlPlaneLength,
+ octetstring             ggsn_addressControlPlane length (4..16),
+ integer                 apnLength,
+ octetstring             apn,
+ BIT4                    transactionId,
+ BIT4                    spare3,
+ OCT1                    transactionID
+} with {variant "PRESENCE( type_gtpc = '9C'O)";
+        variant (lengthf) "LENGTHTO(spare1, linkedNSAPI,
+          uteidControlPlane, enhancedNSAPI, pdp_typeorg, spare2,
+          pdp_typenum, pdp_addressLength, pdp_address,
+          ggsn_addressControlPlaneLength, ggsn_addressControlPlane,
+          apnLength, apn, transactionId, spare3, transactionID)";
+        variant (pdp_addressLength) "LENGTHTO(pdp_address)";
+        variant (ggsn_addressControlPlaneLength) 
+          "LENGTHTO(ggsn_addressControlPlane)";
+        variant (apnLength) "LENGTHTO(apn)"; 	
+	};
+
+// Temporary Mobile Group Identity - 7.7.56
+type record TMGI_gtpc {
+ OCT1                       type_gtpc,
+ LIN2_BO_LAST               lengthf,
+ OCT6                       tMGIValue
+} with { variant "PRESENCE( type_gtpc = '9D'O)";
+         variant (lengthf) "LENGTHTO(tMGIValue)"; };
+
+// RIM Routing Address - 7.7.57
+type record RIM_RoutingAddress {
+ OCT1                      type_gtpc,
+ LIN2_BO_LAST              lengthf,
+ octetstring               rIM_RoutingAddressValue
+   //Left as octetstring because GTP spec does not include the RIM Routing 
+   // Address Discriminator and therefore decoding is not possible as in 48.018
+   //CR 544 states that "The RIM Routing Address contains the destination RNC 
+   // Identity from the RAN INFORMATION message when the source is GERAN and 
+   // the target is UTRAN.
+   //The RIM Routing Address contains the destination Cell Identifier from the 
+   // RAN INFORMATION message when the source is GERAN and the target ir GERAN.
+} with { variant "PRESENCE( type_gtpc = '9E'O)";
+         variant (lengthf) "LENGTHTO(rIM_RoutingAddressValue)"; };
+
+//MBMS Protocol Configuration Options - 7.7.58
+type record MBMS_ProtocolConfigurationOptions {
+ OCT1                      type_gtpc,
+ LIN2_BO_LAST              lengthf,
+ octetstring               mBMS_ProtocolConfigurationOptions
+} with { variant "PRESENCE( type_gtpc = '9F'O)";
+         variant (lengthf) "LENGTHTO(mBMS_ProtocolConfigurationOptions)"; };
+
+// MBMS Session Duration - 7.7.59
+type record MBMS_SessionDuration {
+ OCT1                       type_gtpc,
+ LIN2_BO_LAST               lengthf,
+ OCT3                       mBMS_SessionDurationValue
+} with { variant "PRESENCE( type_gtpc = 'A8'O)";
+         variant (lengthf) "LENGTHTO(mBMS_SessionDurationValue)"; };
+
+
+// MBMS Service Area - 7.7.60
+type record MBMS_ServiceArea {
+ OCT1                       type_gtpc, 
+ LIN2_BO_LAST               lengthf,
+ octetstring                mBMS_ServiceAreaValue
+} with { variant "PRESENCE( type_gtpc = 'A0'O)";
+         variant (lengthf) "LENGTHTO(mBMS_ServiceAreaValue)"; };
+
+// Source RNC PDCP context info - 7.7.61
+type record SourceRNC_PDCP_ContextInfo {
+ OCT1                       type_gtpc, 
+ LIN2_BO_LAST               lengthf,
+ octetstring                rRC_Container
+} with { variant "PRESENCE( type_gtpc = 'A1'O)";
+         variant (lengthf) "LENGTHTO(rRC_Container)"; };
+
+// Additional Trace Info - 7.7.62
+type record AdditionalTraceInfo {
+ OCT1                      type_gtpc, 
+ LIN2_BO_LAST              lengthf,
+ OCT3                      traceReference2,
+ OCT2                      traceRecordingSessionReference,
+ OCT1                      triggeringEvents_GGSN,
+ OCT1                      traceDepth,
+ OCT1                      listOfInterfaces_GGSN,
+ OCT1                      traceActivityControl
+} with { variant "PRESENCE( type_gtpc = 'A2'O)";
+         variant (lengthf) "LENGTHTO(traceReference2,
+          traceRecordingSessionReference, triggeringEvents_GGSN,
+          traceDepth, listOfInterfaces_GGSN, traceActivityControl)";
+    };
+
+// Hop Counter - 7.7.63
+type record HopCounter_gtpc {
+ OCT1                      type_gtpc, 
+ LIN2_BO_LAST              lengthf,
+ integer                   hopCounter
+} with { variant "PRESENCE( type_gtpc = 'A3'O)";
+         variant (lengthf) "LENGTHTO(hopCounter)"; };
+
+// Selected PLMN ID - 7.7.64
+type record Selected_PLMN_ID {
+ OCT1                      type_gtpc, 
+ LIN2_BO_LAST              lengthf,
+ OCT3                      selected_PLMN_Identity
+} with { variant "PRESENCE( type_gtpc = 'A4'O)";
+         variant (lengthf) "LENGTHTO(selected_PLMN_Identity)"; };
+
+// MBMS Session Identifier - 7.7.65
+type record MBMS_SessionIdentifier {
+ OCT1                      type_gtpc, 
+ LIN2_BO_LAST              lengthf,
+ OCT1                      mBMS_SessionIdentifier
+} with { variant "PRESENCE( type_gtpc = 'A5'O)";
+         variant (lengthf) "LENGTHTO(mBMS_SessionIdentifier)"; };
+
+// MBMS 2G/3G Indicator - 7.7.66
+type record MBMS_2G_3G_Indicator {
+ OCT1                      type_gtpc, 
+ LIN2_BO_LAST              lengthf,
+ OCT1                      mBMS_2G_3G_Indicator
+} with { variant "PRESENCE( type_gtpc = 'A6'O)";
+         variant (lengthf) "LENGTHTO(mBMS_2G_3G_Indicator)"; };
+
+// Enhanced NSAPI - 7.7.67
+type record Enhanced_NSAPI {
+ OCT1                      type_gtpc, 
+ LIN2_BO_LAST              lengthf,
+ OCT1                      enhanced_NSAPI
+} with { variant "PRESENCE( type_gtpc = 'A7'O)";
+         variant (lengthf) "LENGTHTO(enhanced_NSAPI)"; };
+
+// Additional MBMS Trace Info - 7.7.68
+type record AdditionalMBMSTraceInfo {
+ OCT1                      type_gtpc, 
+ LIN2_BO_LAST              lengthf,
+ OCT3                      traceReference2,
+ OCT2                      traceRecordingSessionReference,
+ OCT2                      triggeringEvents_BM_SC,
+ OCT1                      traceDepth_BM_SC,
+ OCT1                      listOfInterfaces_BM_SC,
+ OCT1                      traceActivityControl_BM_SC
+} with { variant "PRESENCE( type_gtpc = 'A9'O)";
+         variant (lengthf) "LENGTHTO(traceReference2, traceRecordingSessionReference,
+                                     triggeringEvents_BM_SC, traceDepth_BM_SC, 
+                                     listOfInterfaces_BM_SC, traceActivityControl_BM_SC)";
+  };
+
+// MBMS Session Repetition Number - 7.7.69
+type record MBMS_SessionRepetitionNumber {
+ OCT1                      type_gtpc, 
+ LIN2_BO_LAST              lengthf,
+ OCT1                      mBMS_SessionRepetitionNumber
+} with { variant "PRESENCE( type_gtpc = 'AA'O)";
+         variant (lengthf) "LENGTHTO(mBMS_SessionRepetitionNumber)"; };
+
+// MBMS Time To Data Transfer - 7.7.70
+type record MBMS_TimeToDataTransfer {
+ OCT1                      type_gtpc, 
+ LIN2_BO_LAST              lengthf,
+ OCT1                      mBMS_TimeToDataTransfer
+} with { variant "PRESENCE( type_gtpc = 'AB'O)";
+         variant (lengthf) "LENGTHTO(mBMS_TimeToDataTransfer)"; };
+
+// BSS Container - 7.7.72
+type record BSS_Container {
+ OCT1                      type_gtpc, 
+ LIN2_BO_LAST              lengthf,
+ octetstring               bSS_Container  // TODO FIXME: which Container is the BSS Container?
+} with { variant "PRESENCE( type_gtpc = 'AD'O)";
+         variant (lengthf) "LENGTHTO(bSS_Container)"; };
+
+
+// Cell Identification - 7.7.73
+
+// Routing Area identification - from 24.008 10.5.5.15
+type record RoutingAreaIdentificationV_gtpc  
+{  
+ HEX1               mccDigit1,
+ HEX1               mccDigit2,
+ HEX1               mccDigit3,
+ HEX1               mncDigit3,
+ HEX1               mncDigit1,
+ HEX1               mncDigit2,
+ OCT2               lac,
+ OCT1               rac               
+};
+
+type record RNC_Identifier_gtpc {
+ RoutingAreaIdentificationV_gtpc   routingAreaIdentificationV_gtpc, 
+ integer                           rNC_ID,
+ HEX1                              spare
+}  with { 
+          variant (spare,rNC_ID) "FIELDORDER(msb)";
+          variant (rNC_ID) "BYTEORDER(last)";  
+          variant (rNC_ID) "FIELDLENGTH(12)";
+}
+   
+type union Cell_ID_or_RNC_ID {
+ Cell_Identifier_V_GTPC   cell_Identifier,
+ RNC_Identifier_gtpc      rNC_Identifier
+}   
+
+type record Cell_Identification_gtpc {
+ OCT1                      type_gtpc, 
+ LIN2_BO_LAST              lengthf,
+ Cell_Identifier_V_GTPC    targetCell_ID,
+ OCT1                      sourceType,  //0 - Source Cell ID / 1- Source RNC ID in next field
+ Cell_ID_or_RNC_ID         source_Cell_ID_or_RNC_ID  
+} with {variant "PRESENCE( type_gtpc = 'AE'O)"; 
+        variant (lengthf) "LENGTHTO(targetCell_ID,sourceType,source_Cell_ID_or_RNC_ID)"; 
+        variant (source_Cell_ID_or_RNC_ID) "CROSSTAG ( cell_Identifier, sourceType = '00'O;
+                                                     rNC_Identifier, sourceType = '01'O)"; };
+
+// PDU Numbers - 7.7.74
+type record of PDU_Numbers PDU_Numbers_List;
+
+type record PDU_Numbers {
+ OCT1                      type_gtpc, 
+ LIN2_BO_LAST              lengthf,
+ BIT4                      nsapi,
+ BIT4                      spare,
+ OCT2                      dL_GTPU_SequenceNumber,
+ OCT2                      uL_GTPU_SequenceNumber,
+ OCT2                      sendNPDUnum,    
+ OCT2                      receiveNPDUnum  
+} with {variant "PRESENCE( type_gtpc = 'AF'O)"; 
+        variant (lengthf) "LENGTHTO(nsapi, spare, dL_GTPU_SequenceNumber, uL_GTPU_SequenceNumber,
+              sendNPDUnum, receiveNPDUnum)"; };
+
+// BSSGP Cause - 7.7.75
+type record BSSGP_Cause_gtpc {
+ OCT1                      type_gtpc, 
+ LIN2_BO_LAST              lengthf,
+ OCT1                      bSSGP_Cause
+} with { variant "PRESENCE( type_gtpc = 'B0'O)";
+         variant (lengthf) "LENGTHTO(bSSGP_Cause)"; };
+
+// Required MBMS Bearer Capabilities - 7.7.76
+type record RequiredMBMS_BearerCapabilities {
+ OCT1                      type_gtpc, 
+ LIN2_BO_LAST              lengthf,
+ octetstring               reqMBMS_BearerCapValue
+} with { variant "PRESENCE( type_gtpc = 'B1'O)";
+         variant (lengthf) "LENGTHTO(reqMBMS_BearerCapValue)"; }; 
+
+// RIM Routing Address Discriminator 7.7.77
+type record RIM_RoutingAddress_Discriminator {
+ OCT1                      type_gtpc,
+ LIN2_BO_LAST              lengthf,
+ BIT4                      rra_discriminator,
+ BIT4                      spare
+} with { variant "PRESENCE( type_gtpc = 'B2'O)";
+         variant (lengthf) "LENGTHTO(rra_discriminator,spare)"; };
+
+// ListOfSetupPFCs - 7.7.78
+
+// PFC/PFI as defined in BSSGP (48.018 - 11.3.83) which refers to L3 (24.008 - 10.5.6.11)
+type record Single_PFI_gtpc
+{
+  BIT7  pFI_Value,
+  BIT1  spare
+}
+
+type record length (0..11) of Single_PFI_gtpc Multiple_PFIs_gtpc;
+
+type record ListOfSetupPFCsValue_gtpc
+{
+  integer                number_of_PFCs (0..11),   // note: 12 .. 255 are reserved!!!
+  Multiple_PFIs_gtpc     pFIs
+} with 
+{   
+  variant (number_of_PFCs) "UNIT(elements),LENGTHTO(pFIs),FIELDLENGTH(8)";
+}
+
+type record ListOfSetupPFCs_gtpc {
+ OCT1                        type_gtpc, 
+ LIN2_BO_LAST                lengthf,
+ ListOfSetupPFCsValue_gtpc   listOfSetupPFCs    
+} with { variant "PRESENCE( type_gtpc = 'B3'O)";
+         variant (lengthf) "LENGTHTO(listOfSetupPFCs)"; };
+
+// PS Handover XID Parameters 7.7.79
+type record of PS_HandoverXIDParameters PS_HandoverXIDParameters_List;
+
+type record PS_HandoverXIDParameters {
+ OCT1                      type_gtpc, 
+ LIN2_BO_LAST              lengthf,
+ BIT4                      sapi,
+ BIT4                      spare,
+ LIN1                      xID_ParametersLength,
+ XID_Information_GTPC      xID_Parameters optional  
+} with {
+         variant (lengthf) "LENGTHTO(sapi,spare,xID_ParametersLength,xID_Parameters)";
+         variant (xID_ParametersLength) "LENGTHTO(xID_Parameters)";
+         variant "PRESENCE(type_gtpc = 'B4'O)" 
+       };
+
+//The following types are based on types in LLC_Types.ttcn 
+
+type record of XID_GTPC XID_Information_GTPC;
+
+type record XID_GTPC
+{
+  BIT1	             xl,
+  BIT5               typefield,
+  XID_length_GTPC    xID_length,
+  //Header_XID      header_XID,
+  XID_Data_GTPC	     xID_Data      
+} with { 
+  variant (xID_Data) "CROSSTAG( version, 	typefield = '00000'B;
+				     iOV_UI, 	typefield = '00001'B;
+				     iOV_I, 	typefield = '00010'B;
+				     t200, 	typefield = '00011'B;
+				     n200, 	typefield = '00100'B;
+				     n201_U, 	typefield = '00101'B;
+				     n201_I, 	typefield = '00110'B;
+				     mD, 	typefield = '00111'B;
+				     mU, 	typefield = '01000'B;
+				     kD, 	typefield = '01001'B;
+				     kU, 	typefield = '01010'B;
+				     l3param, 	typefield = '01011'B;
+				     reset, 	typefield = '01100'B;
+				     
+					 )";
+  variant  "FIELDORDER(msb)";
+  variant (xID_length) "CROSSTAG( short_len, 	xl = '0'B;
+				                long_len, 	xl = '1'B;)";
+  variant (xID_length) "LENGTHTO (xID_Data)"
+
+  variant (xID_length) "PADDING(yes)" 
+};
+
+type union  XID_length_GTPC
+{
+  integer short_len,
+  integer long_len
+}with {
+  variant (short_len) "FIELDLENGTH(2)";
+  variant (long_len)  "FIELDLENGTH(8)";
+  variant (long_len)  "BYTEORDER(last)";
+  variant (short_len) "FIELDORDER(msb)";
+  variant (long_len)  "FIELDORDER(msb)";
+
+}
+
+type union XID_Data_GTPC
+{
+  Version_GTPC		version,
+  IOV_UI_GTPC		iOV_UI,
+  IOV_I_GTPC		iOV_I,
+  T200_GTPC		t200,
+  N200_GTPC		n200,
+  N201_U_GTPC		n201_U,
+  N201_I_GTPC		n201_I,
+  MD_GTPC		mD,	
+  MU_GTPC		mU,
+  KD_GTPC		kD,
+  KU_GTPC		kU,
+  L3param_GTPC		l3param,
+  Reset_LLC_GTPC	reset    	
+}
+
+type record Version_GTPC
+{
+  integer 	version_value (0..15),
+  BIT4		spare
+
+} with {
+  variant (version_value) "FIELDLENGTH(4)";
+}
+
+type octetstring IOV_UI_GTPC length(4) 
+
+
+type octetstring IOV_I_GTPC length(4)
+ 
+
+type record T200_GTPC
+{
+  BIT4		spare,
+  integer 	t200Value
+} with {
+  variant (t200Value) "FIELDLENGTH(12)";
+  variant (t200Value) "BYTEORDER(last)";
+  variant  "FIELDORDER(msb)";
+};
+
+
+type record N200_GTPC
+{
+  integer 	retransmissions (0..15),
+  BIT4		spare
+} with {
+  variant (retransmissions) "FIELDLENGTH(4)";
+}     
+
+
+type record N201_U_GTPC
+{
+  BIT5		spare,
+  integer 	n201UValue
+} with {
+  variant (n201UValue) "FIELDLENGTH(11)";
+  variant (n201UValue) "BYTEORDER(last)";
+  variant  "FIELDORDER(msb)";
+};
+
+
+type record N201_I_GTPC
+{
+  BIT5		spare,
+  integer 	n201IValue
+}
+with {
+  variant (n201IValue) "FIELDLENGTH(11)";
+  variant (n201IValue) "BYTEORDER(last)";
+  variant  "FIELDORDER(msb)";
+};
+
+type record MD_GTPC
+{
+  BIT1		spare,
+  integer 	mDValue
+} with {
+  variant (mDValue) "FIELDLENGTH(15)";
+  variant (mDValue) "BYTEORDER(last)";
+  variant  "FIELDORDER(msb)";
+};
+
+
+type record MU_GTPC
+{
+  BIT1		spare,
+  integer 	mUValue
+} with {
+  variant (mUValue) "FIELDLENGTH(15)";
+  variant (mUValue) "BYTEORDER(last)";
+  variant  "FIELDORDER(msb)";
+};
+
+type integer KD_GTPC with {variant  "FIELDLENGTH(8)";};	
+
+type integer KU_GTPC with {variant  "FIELDLENGTH(8)";};	
+
+type octetstring L3param_GTPC;
+
+type octetstring Reset_LLC_GTPC length(0);
+// end of types copied from LLC_Types.ttcn
+ 
+     
+//  MS Info Change reporting Action 7.7.80
+type record MS_InfoChangeReportingAction {
+ OCT1                       type_gtpc, 
+ LIN2_BO_LAST               lengthf,
+ OCT1                       actionfield      
+} with { variant "PRESENCE( type_gtpc = 'B5'O)";
+         variant (lengthf) "LENGTHTO(actionfield)"; };
+
+// Direct Tunnel Flags - 7.7.81
+type record DirectTunnelFlags {
+ OCT1                       type_gtpc, 
+ LIN2_BO_LAST               lengthf,
+ BIT1                       dTI,
+ BIT1                       gCSI,  
+ BIT1                       eI,
+ BIT5                       spare
+} with { variant "PRESENCE( type_gtpc = 'B6'O)";
+         variant (lengthf) "LENGTHTO(dTI,gCSI,eI,spare)";};
+
+// Correlation ID - 7.7.82
+type record CorrelationID {
+ OCT1                       type_gtpc, 
+ LIN2_BO_LAST               lengthf,
+ OCT1                       correlationIDValue                  
+} with { variant "PRESENCE( type_gtpc = 'B7'O)";
+         variant (lengthf) "LENGTHTO(correlationIDValue)"; };
+
+// BearerControlMode - 7.7.83
+type record BearerControlMode {
+ OCT1                       type_gtpc, 
+ LIN2_BO_LAST               lengthf,
+ OCT1                       bearerControlModeValue
+} with { variant "PRESENCE( type_gtpc = 'B8'O)";
+         variant (lengthf) "LENGTHTO(bearerControlModeValue)"; };
+   
+// MBMS Flow ID - 7.7.84
+type record MBMS_FlowID {
+ OCT1                      type_gtpc, 
+ LIN2_BO_LAST              lengthf,
+ octetstring               mBMS_FlowIDValue
+} with { variant "PRESENCE( type_gtpc = 'B9'O)";
+         variant (lengthf) "LENGTHTO(mBMS_FlowIDValue)"; };
+
+// MBMS IP Multicast Distribution - 7.7.85
+type record MBMS_IPMulticastDistribution {
+ OCT1                      type_gtpc, 
+ LIN2_BO_LAST              lengthf,
+ OCT4                      commonTEID, 
+ GSNAddress                iPmulticastDistributionAddress,
+ GSNAddress                iPmulticastSourceAddress,
+ OCT1                      mBMS_HCIndicator
+} with { variant "PRESENCE( type_gtpc = 'BA'O)";
+         variant (lengthf) "LENGTHTO(commonTEID,iPmulticastDistributionAddress,
+                                     iPmulticastSourceAddress,mBMS_HCIndicator)"; };
+
+// GSNAddress
+type record  GSNAddress {
+ INT6b                      lengthf,
+ BIT2                       address_type,
+ iPv4_iPv6_Address          ipv_address
+} with { variant (lengthf) "LENGTHTO(ipv_address)";};
+
+// MBMS Distribution Acknowledgement - 7.7.86
+type record MBMS_DistributionAcknowledgement {
+ OCT1                      type_gtpc, 
+ LIN2_BO_LAST              lengthf,
+ BIT2                      distributionIndication,
+ BIT6                      spare
+} with { variant "PRESENCE( type_gtpc = 'BB'O)";
+         variant (lengthf) "LENGTHTO(distributionIndication,spare)"; };
+
+// ReliableInterRATHandoverInfo - 7.7.87 - from 48.018 11.3.107
+type record ReliableInterRATHandoverInfo
+{
+ OCT1                      type_gtpc, 
+ LIN2_BO_LAST              lengthf,
+ BIT1                      reliableInterRATHandoverInfoIndicator,
+ BIT7                      spare           
+} with { variant "PRESENCE( type_gtpc = 'BC'O)";
+         variant (lengthf) "LENGTHTO(reliableInterRATHandoverInfoIndicator,spare)"; };
+
+//7.7.88
+type record RFSP_Index
+{
+ OCT1                      type_gtpc, 
+ LIN2_BO_LAST              lengthf,
+ LIN2_BO_LAST              rFSPIndexValue (1..256)
+} with { variant "PRESENCE( type_gtpc = 'BD'O)";
+         variant (lengthf) "LENGTHTO(rFSPIndexValue)"; };
+
+//7.7.90
+type record of FullyQualifiedDomainName FullyQualifiedDomainName_List;
+
+type record FullyQualifiedDomainName
+{
+ OCT1                      type_gtpc, 
+ LIN2_BO_LAST              lengthf,
+ octetstring               fQDN_Value
+} with { variant "PRESENCE( type_gtpc = 'BE'O)";
+         variant (lengthf) "LENGTHTO(fQDN_Value)"; };
+
+//7.7.91
+type record EvolvedAllocationRetentionPriorityI
+{
+ OCT1                      type_gtpc, 
+ LIN2_BO_LAST              lengthf,
+ BIT1                      pVI,
+ BIT1                      spare1,
+ integer                   pL,
+ BIT1                      pCI,
+ BIT1                      spare2
+} with { variant "PRESENCE( type_gtpc = 'BF'O)";
+         variant (lengthf) "LENGTHTO(pVI,spare1,pL,pCI,spare2)"; 
+         variant (pL) "FIELDLENGTH(4)";};
+
+//7.7.92
+type record of EvolvedAllocationRetentionPriorityII EvolvedAllocationRetentionPriorityII_List
+
+type record EvolvedAllocationRetentionPriorityII
+{
+ OCT1                      type_gtpc, 
+ LIN2_BO_LAST              lengthf,
+ BIT4                      nsapi,
+ BIT4                      unused, 
+ BIT1                      pVI, 
+ BIT1                      spare1,
+ integer                   pL,
+ BIT1                      pCI,
+ BIT1                      spare2 
+} with { variant "PRESENCE( type_gtpc = 'C0'O)";
+         variant (lengthf) "LENGTHTO(nsapi,unused,pVI,spare1,pL,pCI,spare2)"; 
+         variant (pL) "FIELDLENGTH(4)";};
+
+//7.7.93
+type record ExtendedCommonFlags
+{
+ OCT1                      type_gtpc, 
+ LIN2_BO_LAST              lengthf,
+ BIT1                      unauthenticatedIMSI,
+ BIT1                      cCRSI, 
+ BIT1                      cPSR, 
+ BIT1                      retLoc, 
+ BIT1                      vB, 
+ BIT1                      pCRI, 
+ BIT1                      bDWI, 
+ BIT1                      uASI 
+} with { variant "PRESENCE(type_gtpc = 'C1'O)";
+         variant (lengthf) "LENGTHTO(unauthenticatedIMSI,cCRSI,cPSR,retLoc,vB,pCRI,bDWI,uASI)";};
+                  
+//7.7.94 
+type record UserCSGInformation
+{
+ OCT1                      type_gtpc, 
+ LIN2_BO_LAST              lengthf,  
+ HEX1                      mccDigit1,
+ HEX1                      mccDigit2,
+ HEX1                      mccDigit3,
+ HEX1                      mncDigit3,
+ HEX1                      mncDigit1,
+ HEX1                      mncDigit2, 
+ BIT5                      spare1,
+ bitstring                 cSG_ID length(27), // "The coding ... is the responsibility of the operator..."   
+ BIT1                      cMI,               
+ BIT5                      spare2,
+ integer                   accessMode (0..3)
+} with { variant "PRESENCE( type_gtpc = 'C2'O)";
+         variant (lengthf) "LENGTHTO(mccDigit1,mccDigit2,mccDigit3,mncDigit3,
+                            mncDigit1,mncDigit2,spare1,cSG_ID,
+                            cMI,spare2,accessMode)";                             
+         variant (spare1,cSG_ID) "FIELDORDER(msb)";                                              
+         variant (cSG_ID) "FIELDLENGTH(27)";
+         variant (accessMode) "FIELDLENGTH(2)";         
+};
+
+//7.7.95 
+type record CSGInfoReportingAction
+{
+ OCT1                      type_gtpc, 
+ LIN2_BO_LAST              lengthf,  
+ BIT1                      uCCSG,
+ BIT1                      uCSHC,
+ BIT1                      uCUHC,
+ BIT5                      spare
+} with { variant "PRESENCE( type_gtpc = 'C3'O)";
+         variant (lengthf) "LENGTHTO(uCCSG,uCSHC,uCUHC,spare)";         
+};
+
+//7.7.96
+type record CSG_Id
+{
+ OCT1                      type_gtpc, 
+ LIN2_BO_LAST              lengthf, 
+ BIT5                      spare,
+ bitstring                 cSG_ID length(27) // "The coding ... is the responsibility of the operator..."    
+} with { variant "PRESENCE(type_gtpc = 'C4'O)";
+         variant (lengthf) "LENGTHTO(spare,cSG_ID)";      
+         variant (spare,cSG_ID) "FIELDORDER(msb)";   
+         variant (cSG_ID) "FIELDLENGTH(27)";
+};
+
+//7.7.97
+type record CSG_MembershipIndication
+{
+ OCT1                      type_gtpc, 
+ LIN2_BO_LAST              lengthf,
+ BIT1                      cMI_Value,
+ BIT7                      spare 
+} with { variant "PRESENCE(type_gtpc = 'C5'O)";
+         variant (lengthf) "LENGTHTO(cMI_Value,spare)";      
+}
+
+//7.7.98
+type record APN_AMBR 
+{
+ OCT1                      type_gtpc, 
+ LIN2_BO_LAST              lengthf,
+ LIN4_BO_LAST              aPN_AMBR_Uplink,
+ LIN4_BO_LAST              aPN_AMBR_Downlink
+} with { variant "PRESENCE(type_gtpc = 'C6'O)";
+         variant (lengthf) "LENGTHTO(aPN_AMBR_Uplink,aPN_AMBR_Downlink)";      
+}
+
+//7.7.99
+type record UE_Network_Capability {
+  OCT1               type_gtpc,
+  LIN2_BO_LAST       lengthf,
+  octetstring        ue_network_capability
+} with {
+  variant "PRESENCE(type_gtpc = 'C7'O)";
+  variant (lengthf) "LENGTHTO(ue_network_capability)";
+}
+
+//7.7.100
+type record UE_AMBR {
+  OCT1              type_gtpc,
+  LIN2_BO_LAST      lengthf,
+  LIN4_BO_LAST      subscribed_ue_ambr_uplink,
+  LIN4_BO_LAST      subscribed_ue_ambr_downlink,
+  LIN4_BO_LAST      authorized_ue_ambr_uplink optional,
+  LIN4_BO_LAST      authorized_ue_ambr_downlink optional
+} with {
+  variant "PRESENCE(type_gtpc = 'C8'O)";
+  variant (lengthf) "LENGTHTO(subscribed_ue_ambr_uplink,subscribed_ue_ambr_downlink,authorized_ue_ambr_uplink,authorized_ue_ambr_downlink)";
+}
+
+//7.7.101
+type record APN_AMBR_NSAPI {
+  OCT1              type_gtpc,
+  LIN2_BO_LAST      lengthf (9),
+  HEX1              nsapi,
+  HEX1              spare,
+  LIN4_BO_LAST      authorized_apn_ambr_uplink,
+  LIN4_BO_LAST      authorized_apn_ambr_downlink
+} with {
+   variant "PRESENCE(type_gtpc = 'C9'O)";
+   variant (lengthf) "LENGTHTO(spare, nsapi,authorized_apn_ambr_uplink,authorized_apn_ambr_downlink)";
+}
+
+//7.7.102
+type record GGSN_BackOffTime {
+  OCT1              type_gtpc,
+  LIN2_BO_LAST      lengthf,
+  BIT5              timerValue,
+  BIT3              timerUnit,
+  octetstring       explicitly_specified optional
+} with {
+   variant "PRESENCE(type_gtpc = 'CA'O)";
+   variant (lengthf) "LENGTHTO(timerValue, timerUnit, explicitly_specified)";
+}
+
+//7.7.103
+type record SignallingPriorityIndication {
+  OCT1              type_gtpc,
+  LIN2_BO_LAST      lengthf,
+  BIT1              lapi,
+  BIT7              spare,
+  octetstring       explicitly_specified optional
+} with {
+   variant "PRESENCE(type_gtpc = 'CB'O)";
+   variant (lengthf) "LENGTHTO(lapi, spare, explicitly_specified)";
+}
+
+//7.7.104
+type record SignallingPriorityIndication_NSAPI {
+  OCT1              type_gtpc,
+  LIN2_BO_LAST      lengthf,
+  BIT1              nsapi,
+  BIT7              spare1,
+  BIT1              lapi,
+  BIT7              spare2,
+  octetstring       explicitly_specified optional
+} with {
+   variant "PRESENCE(type_gtpc = 'CC'O)";
+   variant (lengthf) "LENGTHTO(nsapi, spare1, lapi, spare2, explicitly_specified)";
+}
+
+//7.7.105   
+type record Higher_Bitrates_Than_16Mbps_Flag {
+  OCT1              type_gtpc,
+  LIN2_BO_LAST      lengthf (1),
+  LIN1              flag
+} with {
+  variant "PRESENCE(type_gtpc = 'CD'O)";
+  variant (lengthf) "LENGTHTO(flag)";
+}
+
+//7.7.106
+// (void)
+
+//7.7.107
+type record SRVCC_MM_Context {
+  OCT1            type_gtpc,
+  LIN2_BO_LAST    lengthf,
+  LIN1            mobile_station_classmark2_len,
+  octetstring     mobile_station_classmark2,
+  LIN1            mobile_station_classmark3_len,
+  octetstring     mobile_station_classmark3,
+  LIN1            supported_codec_list_len,
+  octetstring     supported_codec_list,
+  octetstring     explicitly_specified optional
+} with {
+  variant "PRESENCE(type_gtpc = 'CF'O)";
+  variant (lengthf) "LENGTHTO(mobile_station_classmark2_len, mobile_station_classmark2,
+                              mobile_station_classmark3_len, mobile_station_classmark3,
+                              supported_codec_list_len, supported_codec_list,
+                              explicitly_specified)";
+  variant (mobile_station_classmark2_len) "LENGTHTO(mobile_station_classmark2)";
+  variant (mobile_station_classmark3_len) "LENGTHTO(mobile_station_classmark3)";
+  variant (supported_codec_list_len) "LENGTHTO(supported_codec_list)";
+}
+
+
+//7.7.108
+type record SRVCC_Flags {
+  OCT1            type_gtpc,
+  LIN2_BO_LAST    lengthf,
+  BIT1            ics,
+  BIT7            spare,
+  octetstring     explicitly_specified optional
+} with {
+  variant "PRESENCE(type_gtpc = 'D0'O)";
+  variant (lengthf) "LENGTHTO(ics, spare, explicitly_specified)";
+}
+
+//7.7.109
+type record STN_SR {
+  OCT1            type_gtpc,
+  LIN2_BO_LAST    lengthf,
+  OCT1            nanpi,
+  Digits          digits
+} with {
+  variant "PRESENCE(type_gtpc = 'D1'O)";
+  variant (lengthf) "LENGTHTO(nanpi, digits)"; 
+}
+
+type record of HEX1 Digits;
+
+//7.7.110
+type record C_MSISDN {
+  OCT1            type_gtpc,
+  LIN2_BO_LAST    lengthf,
+  octetstring     msisdn
+} with {
+  variant "PRESENCE(type_gtpc = 'D2'O)";
+  variant (lengthf) "LENGTHTO(msisdn)";
+}
+
+//7.7.111
+type record Extended_RANAP_Cause {
+  OCT1            type_gtpc,
+  LIN2_BO_LAST    lengthf,
+  integer         extended_ranap_cause (1..512),
+  octetstring     explicitly_specified optional
+} with {
+  variant "PRESENCE(type_gtpc = 'D3'O)";
+  variant (lengthf) "LENGTHTO(extended_ranap_cause, explicitly_specified)";  
+  variant (extended_ranap_cause) "FIELDLENGTH(16), COMP(nosign), BYTEORDER(last)"
+}
+
+//7.7.112
+type record ENodeB_ID {
+  OCT1            type_gtpc,
+  LIN2_BO_LAST    lengthf,
+  OCT1            eNodeB_type,
+  ENodeB_IDs      eNodeB_ID 
+} with {
+  variant "PRESENCE(type_gtpc = 'D4'O)";
+  variant (lengthf) "LENGTHTO(eNodeB_type, eNodeB_ID)";
+  variant "CROSSTAG(macroENodeB_ID, eNodeB_type = '00'O;
+               homeENodeB_ID, eNodeB_type = '01'O;)"
+}
+
+type union ENodeB_IDs
+{
+  HomeENodeB_ID homeENodeB_ID,
+  MacroENodeB_ID macroENodeB_ID
+}
+
+type record MacroENodeB_ID
+{
+ HEX1                      mcc1,            
+ HEX1                      mcc2,            
+ HEX1                      mcc3,            
+ HEX1                      mnc3,            
+ HEX1                      mnc1,            
+ HEX1                      mnc2,
+ BIT4                      spare,
+ bitstring                 macroENodeB_ID length(20),
+ OCT2                      tac
+} with {
+  variant (spare,macroENodeB_ID) "FIELDORDER(msb)";                                              
+  variant (macroENodeB_ID) "FIELDLENGTH(20)";
+}
+
+type record HomeENodeB_ID
+{
+ HEX1                      mcc1,            
+ HEX1                      mcc2,            
+ HEX1                      mcc3,            
+ HEX1                      mnc3,            
+ HEX1                      mnc1,            
+ HEX1                      mnc2,
+ BIT4                      spare,
+ bitstring                 homeENodeB_ID length(28),
+ OCT2                      tac
+} with {
+  variant (spare,homeENodeB_ID) "FIELDORDER(msb)";                                              
+  variant (homeENodeB_ID) "FIELDLENGTH(28)";
+}
+
+//7.7.113
+type record SelectionMode_NSAPI {
+  OCT1            type_gtpc,
+  LIN2_BO_LAST    lengthf,
+  BIT4            nsapi,
+  BIT4            spare1,
+  BIT2            selectionMode,
+  BIT6            spare2
+} with {
+  variant "PRESENCE(type_gtpc = 'D5'O)";
+  variant (lengthf) "LENGTHTO(nsapi, spare1, selectionMode, spare2)";
+}
+
+//7.7.114
+type record ULI_Timestamp {
+  OCT1            type_gtpc,
+  LIN2_BO_LAST    lengthf,
+  OCT4            uliTimestampValue,
+  octetstring     explicitly_specified optional
+} with {
+  variant "PRESENCE(type_gtpc = 'D6'O)";
+  variant (lengthf) "LENGTHTO(uliTimestampValue, explicitly_specified)";
+}
+
+//7.7.115
+type record LHN_ID_NSAPI {
+  OCT1            type_gtpc,
+  LIN2_BO_LAST    lengthf,
+  BIT4            nsapi,
+  BIT4            spare,
+  octetstring     lHN_ID optional
+} with {
+  variant "PRESENCE(type_gtpc = 'D7'O)";
+  variant (lengthf) "LENGTHTO(nsapi, spare, lHN_ID)";
+}
+
+//7.7.116
+type record CN_OperatorSelectionEntity {
+  OCT1            type_gtpc,
+  LIN2_BO_LAST    lengthf,
+  BIT2            selectionEntity,
+  BIT6            spare,
+  octetstring     explicitly_specified optional
+} with {
+  variant "PRESENCE(type_gtpc = 'D8'O)";
+  variant (lengthf) "LENGTHTO(selectionEntity, spare, explicitly_specified)";
+}
+
+//7.7.117
+type record UE_UsageType {
+  OCT1            type_gtpc,
+  LIN2_BO_LAST    lengthf,
+  LIN4_BO_LAST    uE_UsageTypeValue
+  } with {
+  variant "PRESENCE(type_gtpc = 'D9'O)";
+  variant (lengthf) "LENGTHTO(uE_UsageTypeValue)";
+}
+
+//7.7.118
+type record ExtendedCommonFlagsII {
+  OCT1            type_gtpc,
+  LIN2_BO_LAST    lengthf,
+  BIT1            pnsi,
+  BIT1            dtci,
+  BIT6            spare,
+  octetstring     explicitly_specified optional
+  } with {
+  variant "PRESENCE(type_gtpc = 'DA'O)";
+  variant (lengthf) "LENGTHTO(pnsi, dtci, spare, explicitly_specified)";
+}
+
+//7.7.119
+type record NodeIdentifier {
+  OCT1            type_gtpc,
+  LIN2_BO_LAST    lengthf,
+  octetstring     nodeIdentifier
+  } with {
+  variant "PRESENCE(type_gtpc = 'DB'O)";
+  variant (lengthf) "LENGTHTO( nodeIdentifier)";
+}
+
+/////////////////////////////
+// Message Type Values
+// 7.1 Table 1
+/////////////////////////////
+type OCT1 MessageType_gtpc;
+
+// 0 For future use. Shall not be sent. If received, shall be treated as an
+// Unknown message
+
+const MessageType_gtpc echoRequest := '01'O;
+const MessageType_gtpc echoResponse := '02'O;
+const MessageType_gtpc versionNotSupported := '03'O;
+
+// 4 - 7: For GTP'
+
+// 8 - 15 for future use.  Shall not be sent. 
+// If received, shall be treated as an Unknown message
+
+const MessageType_gtpc createPDPContextRequest := '10'O;
+const MessageType_gtpc createPDPContextResponse := '11'O;
+const MessageType_gtpc updatePDPContextRequest := '12'O;
+const MessageType_gtpc updatePDPContextResponse := '13'O;
+const MessageType_gtpc deletePDPContextRequest := '14'O; 
+const MessageType_gtpc deletePDPContextResponse := '15'O;
+const MessageType_gtpc initiatePDPContextActivationRequest := '16'O;
+const MessageType_gtpc initiatePDPContextActivationResponse := '17'O;
+
+// 24 - 25 for future use.
+// Shall not be sent. If received, shall be treated as an Unknown message
+
+// 26      for GTP-U only
+
+const MessageType_gtpc pduNotificationRequest := '1B'O;
+const MessageType_gtpc pduNotificationResponse := '1C'O;
+const MessageType_gtpc pduNotificationRejectRequest := '1D'O;
+const MessageType_gtpc pduNotificationRejectResponse := '1E'O;
+
+const MessageType_gtpc supportedExtHeadersNotification := '1F'O;
+const MessageType_gtpc sendRoutingInfoForGPRSRequest := '20'O; 
+const MessageType_gtpc sendRoutingInfoForGPRSResponse := '21'O;
+const MessageType_gtpc failureReportRequest := '22'O;
+const MessageType_gtpc failureReportResponse := '23'O;
+const MessageType_gtpc noteMS_GPRSPresentRequest := '24'O;
+const MessageType_gtpc noteMS_GPRSPresentResponse := '25'O;
+
+// 38 - 47 for future use.  Shall not be sent. 
+// If received, shall be treated as an Unknown message
+
+const MessageType_gtpc identificationRequest := '30'O;  
+const MessageType_gtpc identificationResponse := '31'O;
+const MessageType_gtpc sgsnContextRequest := '32'O;
+const MessageType_gtpc sgsnContextResponse := '33'O;
+const MessageType_gtpc sgsnContextAcknowledge := '34'O;
+const MessageType_gtpc forwardRelocationRequest := '35'O;
+const MessageType_gtpc forwardRelocationResponse := '36'O;
+const MessageType_gtpc forwardRelocationComplete := '37'O;
+const MessageType_gtpc relocationCancelRequest := '38'O;
+const MessageType_gtpc relocationCancelResponse := '39'O;
+const MessageType_gtpc forwardSRNSContext := '3A'O;
+const MessageType_gtpc forwardRelocationCompleteAcknowledge := '3B'O;
+const MessageType_gtpc forwardSRNSContextAcknowledge := '3C'O; 
+const MessageType_gtpc ueRegistrationQueryRequest := '3D'O;
+const MessageType_gtpc ueRegistrationQueryResponse := '3E'O;
+
+// 63 - 69 for future use.  Shall not be sent. If received, shall be treated as
+// an Unknown message
+
+const MessageType_gtpc        rANInformationRelay :=  '46'O;
+
+// 71 -95 for future use.  Shall not be sent. If received, shall be treated as
+//  an Unknown message
+
+const MessageType_gtpc mBMSNotificationRequest := '60'O;
+const MessageType_gtpc mBMSNotificationResponse := '61'O;
+const MessageType_gtpc mBMSNotificationRejectRequest := '62'O;
+const MessageType_gtpc mBMSNotificationRejectResponse := '63'O;
+const MessageType_gtpc createMBMSContextRequest := '64'O;
+const MessageType_gtpc createMBMSContextResponse := '65'O;
+const MessageType_gtpc updateMBMSContextRequest := '66'O;
+const MessageType_gtpc updateMBMSContextResponse := '67'O;
+const MessageType_gtpc deleteMBMSContextRequest := '68'O;
+const MessageType_gtpc deleteMBMSContextResponse := '69'O;
+
+// 106-111 for future use. Shall not be sent. If received, shall be treated as 
+// an Unknown message
+
+const MessageType_gtpc mBMSRegistrationRequest :=  '70'O;
+const MessageType_gtpc mBMSRegistrationResponse :=  '71'O;
+const MessageType_gtpc mBMSDeRegistrationRequest :=  '72'O;
+const MessageType_gtpc mBMSDeRegistrationResponse :=  '73'O;
+
+const MessageType_gtpc mBMSSessionStartRequest :=  '74'O;
+const MessageType_gtpc mBMSSessionStartResponse := '75'O;
+const MessageType_gtpc mBMSSessionStopRequest :=  '76'O;
+const MessageType_gtpc mBMSSessionStopResponse := '77'O;
+
+const MessageType_gtpc mBMSSessionUpdateRequest := '78'O;           
+const MessageType_gtpc mBMSSessionUpdateResponse := '79'O;
+
+// 122 - 127 for future use. Shall not be sent. 
+// If received, shall be treated as an Unknown message
+
+const MessageType_gtpc mS_InfoChangeNotificationRequest := '80'O;
+const MessageType_gtpc mS_InfoChangeNotificationResponse := '81'O                      
+
+// 130 - 239 for future use. Shall not be sent. 
+// If received, shall be treated as an Unknown message
+
+// 240 - 241 not used in GTP-C
+
+// 242 - 254 for future use. Shall not be sent. 
+// If received, shall be treated as an Unknown message
+
+// 255      not used in GTP-C
+
+const MessageType_gtpc g_PDU := 'FF'O;
+
+
+/////////////////////////////
+// GTP-C messages
+/////////////////////////////
+// Echo Request -  7.2.1
+type record EchoRequest {
+  PrivateExtension_gtpc_List private_extension_gtpc optional
+}
+
+// Echo Response     -  7.2.2
+type record EchoResponse    {
+ Recovery_gtpc   recovery,
+ PrivateExtension_gtpc_List private_extension_gtpc optional
+}
+
+// Version Not Supported  -  7.2.3
+type record  VersionNotSupported {
+};
+
+// Supported Extension Headers Notification  - 7.2.4
+type record SupportedExtensionHeadersNotification   {
+ ExtensionHeaderTypeList_gtpc     extensionHeaderTypeList  
+} with {variant ""};
+
+// Create PDP Context Request - 7.3.1
+type record CreatePDPContextRequest   {
+ IMSI_gtpc                       imsi optional,        
+ RoutingAreaIdentity             rai optional,        
+ Recovery_gtpc                   recovery optional,
+ SelectionMode                   selectionMode optional,     
+ TeidDataI                       teidDataI,      
+ TeidControlPlane                teidControlPlane optional,    
+ NSAPI_GTPC                      nsapi,       
+ NSAPI_GTPC                      linked_nsapi optional,      
+ ChargingCharacteristics_GTPC    charging_char optional,       
+ TraceRef                        trace_ref optional,
+ GTP_TraceType                   trace_type optional,
+ EndUserAddress                  endUserAddress optional,    
+ AccessPointName                 accessPointName optional,    
+ ProtConfigOptions               protConfigOptions optional,    
+ GSN_Address_GTPC                sgsn_addr_signalling,     
+ GSN_Address_GTPC                sgsn_addr_traffic,     
+ MSISDN                          msisdn optional,     
+ QualityOfServiceProfile         qualityOfServiceProfile,    
+ TrafficFlowTemplate             tft optional,             
+ GTP_TriggerID                   triggerId optional,
+ OMCIdentity                     omcId optional,
+ CommonFlags                     commonFlags  optional,   
+ APN_Restriction                 aPN_Restriction optional,
+ RATType                         ratType optional, 
+ UserLocationInformation         userLocationInformation optional,
+ MS_TimeZone                     mS_TimeZone optional,
+ IMEISV_gtpc                     imeisv optional,            
+ CamelChargingInformationContainer camelChargingInformationContainer optional,
+ AdditionalTraceInfo             additionalTraceInfo optional,
+ CorrelationID                   correlationID optional,
+ EvolvedAllocationRetentionPriorityI    evolvedAllocationRetentionPriorityI optional,
+ ExtendedCommonFlags                    extendedCommonFlags optional,
+ UserCSGInformation                     userCSGInformation optional, 
+ APN_AMBR                        aPN_AMBR optional,
+ SignallingPriorityIndication    signallingPriorityIndication optional,
+ CN_OperatorSelectionEntity      cN_OperatorSelectionEntity optional,
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+};
+
+// Create PDP Context Response    -  7.3.2
+type record CreatePDPContextResponse {
+ Cause_gtpc                      cause,
+ ReorderingRequired              reorderingRequired optional,
+ Recovery_gtpc                   recovery optional,
+ TeidDataI                       teidDataI optional,   
+ TeidControlPlane                teidControlPlane optional, 
+ NSAPI_GTPC                      nsapi optional,    
+ ChargingID                      chargingID optional,   
+ EndUserAddress                  endUserAddress optional,  
+ ProtConfigOptions               protConfigOptions optional,  
+ GSN_Address_GTPC                ggsn_addr_controlPlane optional, 
+ GSN_Address_GTPC                ggsn_addr_traffic optional,  
+ GSN_Address_GTPC                alt_ggsn_addr_controlPane optional,
+ GSN_Address_GTPC                alt_ggsn_addr_traffic optional,
+ QualityOfServiceProfile         qualityOfServiceProfile optional,   
+ CommonFlags                     commonFlags  optional,  
+ APN_Restriction                 aPN_Restriction optional,
+ MS_InfoChangeReportingAction    mS_InfoChangeReportingAction optional, 
+ BearerControlMode               bearerControlMode optional, 
+ EvolvedAllocationRetentionPriorityI    evolvedAllocationRetentionPriorityI optional,
+ ExtendedCommonFlags             extendedCommonFlag optional,
+ CSGInfoReportingAction          csg_information_reporting_action optional,
+ APN_AMBR                        aPN_AMBR optional,
+ GGSN_BackOffTime                gGSN_BackOffTime optional,
+ PrivateExtension_gtpc_List      private_extension_gtpc optional 
+};
+  
+
+// Update PDP Context Request -   7.3.3
+type union UpdatePDPContextRequest {
+ UpdatePDPContextRequestSGSN    updatePDPContextRequestSGSN,
+ UpdatePDPContextRequestGGSN    updatePDPContextRequestGGSN,
+ UpdatePDPContextRequestCGW     updatePDPContextRequestCGW
+};
+
+//from SGSN
+type record UpdatePDPContextRequestSGSN   {
+ IMSI_gtpc                       imsi optional,          
+ RoutingAreaIdentity             rai optional,
+ Recovery_gtpc                   recovery optional,
+ TeidDataI                       teidDataI,     
+ TeidControlPlane                teidControlPlane optional,
+ NSAPI_GTPC                      nsapi, 
+ TraceRef                        trace_ref optional,
+ GTP_TraceType                   trace_type optional,
+ ProtConfigOptions               protConfigOptions optional, 
+ GSN_Address_GTPC                sgsn_addr_controlPlane, 
+ GSN_Address_GTPC                sgsn_addr_traffic,
+ GSN_Address_GTPC                alt_ggsn_addr_controlPane optional,
+ GSN_Address_GTPC                alt_ggsn_addr_traffic optional,
+ QualityOfServiceProfile         qualityOfServiceProfile,
+ TrafficFlowTemplate             tft optional, 
+ GTP_TriggerID                   triggerId optional,
+ OMCIdentity                     omcId optional,
+ CommonFlags                     commonFlags  optional,
+ RATType                         ratType optional,
+ UserLocationInformation         userLocationInformation optional,
+ MS_TimeZone                     mS_TimeZone optional,
+ AdditionalTraceInfo             additionalTraceInfo optional,
+ DirectTunnelFlags               directTunnelFlags optional, 
+ EvolvedAllocationRetentionPriorityI    evolvedAllocationRetentionPriorityI optional, 
+ ExtendedCommonFlags             extendedCommonFlags optional, 
+ UserCSGInformation              userCSGInformation optional, 
+ APN_AMBR                        aPN_AMBR optional,
+ SignallingPriorityIndication    signallingPriorityIndication optional,
+ CN_OperatorSelectionEntity      cN_OperatorSelectionEntity optional,
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+}; 
+
+//from GGSN
+type record UpdatePDPContextRequestGGSN   {
+ IMSI_gtpc                       imsi optional,      
+ Recovery_gtpc                   recovery optional,
+ NSAPI_GTPC                      nsapi,
+ EndUserAddress                  endUserAddress optional, 
+ ProtConfigOptions               protConfigOptions optional,
+ QualityOfServiceProfile         qualityOfServiceProfile optional,
+ TrafficFlowTemplate             tft optional,  
+ CommonFlags                     commonFlags optional,
+ APN_Restriction                 aPN_Restriction optional,
+ MS_InfoChangeReportingAction    mS_InfoChangeReportingAction optional,   
+ DirectTunnelFlags               directTunnelFlags optional,
+ BearerControlMode               bearerControlMode optional, 
+ EvolvedAllocationRetentionPriorityI    evolvedAllocationRetentionPriorityI optional, 
+ ExtendedCommonFlags             extendedCommonFlags optional, 
+ CSGInfoReportingAction                 cSGInfoReportingAction optional, 
+ APN_AMBR                        aPN_AMBR optional, 
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+};
+
+//from CGW
+type record UpdatePDPContextRequestCGW   {
+ IMSI_gtpc                       imsi optional,      
+ Recovery_gtpc                   recovery optional,
+ NSAPI_GTPC                      nsapi,
+ EndUserAddress                  endUserAddress optional, 
+ ProtConfigOptions               protConfigOptions optional,
+ QualityOfServiceProfile         qualityOfServiceProfile optional,
+ TrafficFlowTemplate             tft optional,  
+ CommonFlags                     commonFlags optional,
+ APN_Restriction                 aPN_Restriction optional,
+ MS_InfoChangeReportingAction    mS_InfoChangeReportingAction optional,  
+ DirectTunnelFlags               directTunnelFlags optional,
+ BearerControlMode               bearerControlMode optional,
+ EvolvedAllocationRetentionPriorityI    evolvedAllocationRetentionPriorityI optional,
+ CSGInfoReportingAction                 cSGInfoReportingAction optional, 
+ APN_AMBR                        aPN_AMBR optional,  
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+};
+
+// Update PDP Context Response  -   7.3.4
+type union UpdatePDPContextResponse {
+ UpdatePDPContextResponseSGSN updatePDPContextResponseSGSN,
+ UpdatePDPContextResponseGGSN updatePDPContextResponseGGSN,
+ UpdatePDPContextResponseCGW  updatePDPContextResponseCGW 
+};
+
+//from GGSN
+type record  UpdatePDPContextResponseGGSN    {
+ Cause_gtpc                      cause,
+ Recovery_gtpc                   recovery optional,
+ TeidDataI                       teidDataI optional, 
+ TeidControlPlane                teidControlPlane optional,
+ ChargingID                      chargingID optional,
+ ProtConfigOptions               protConfigOptions optional,
+ GSN_Address_GTPC                ggsn_addr_controlPlane optional,
+ GSN_Address_GTPC                ggsn_addr_traffic optional,
+ GSN_Address_GTPC                alt_ggsn_addr_controlPane optional,
+ GSN_Address_GTPC                alt_ggsn_addr_traffic optional,
+ QualityOfServiceProfile         qualityOfServiceProfile optional,  
+ CommonFlags                     commonFlags optional,
+ APN_Restriction                 aPN_Restriction optional, 
+ MS_InfoChangeReportingAction    mS_InfoChangeReportingAction optional, 
+ BearerControlMode               bearerControlMode optional, 
+ EvolvedAllocationRetentionPriorityI    evolvedAllocationRetentionPriorityI optional,
+ CSGInfoReportingAction          csg_information_reporting_action optional, 
+ APN_AMBR                        aPN_AMBR optional,   
+ PrivateExtension_gtpc_List      private_extension_gtpc optional 
+};
+
+//from CGW
+type record  UpdatePDPContextResponseCGW    {
+ Cause_gtpc                      cause,
+ Recovery_gtpc                   recovery optional,
+ TeidDataI                       teidDataI optional, 
+ TeidControlPlane                teidControlPlane optional,
+ ChargingID                      chargingID optional,
+ ProtConfigOptions               protConfigOptions optional,
+ GSN_Address_GTPC                ggsn_addr_controlPlane optional,
+ GSN_Address_GTPC                ggsn_addr_traffic optional,
+ GSN_Address_GTPC                alt_ggsn_addr_controlPane optional,
+ GSN_Address_GTPC                alt_ggsn_addr_traffic optional,
+ QualityOfServiceProfile         qualityOfServiceProfile optional,
+ CommonFlags                     commonFlags optional,
+ APN_Restriction                 aPN_Restriction optional, 
+ MS_InfoChangeReportingAction    mS_InfoChangeReportingAction optional,
+ BearerControlMode               bearerControlMode optional, 
+ EvolvedAllocationRetentionPriorityI    evolvedAllocationRetentionPriorityI optional,  
+ APN_AMBR                        aPN_AMBR optional,  
+ ChargingGatewayAddress          chargingGatewayAddress optional,
+ ChargingGatewayAddress          alt_chargingGatewayAddress optional,  
+ PrivateExtension_gtpc_List      private_extension_gtpc optional 
+};
+
+//from SGSN
+type record UpdatePDPContextResponseSGSN    {
+ Cause_gtpc                      cause,
+ Recovery_gtpc                   recovery optional,
+ TeidDataI                       teidDataI optional,
+ ProtConfigOptions               protConfigOptions optional,
+ GSN_Address_GTPC                sgsn_addr_traffic optional,
+ QualityOfServiceProfile         qualityOfServiceProfile optional, 
+ UserLocationInformation         userLocationInformation optional,  
+ MS_TimeZone                     mS_TimeZone optional, 
+ DirectTunnelFlags               directTunnelFlags optional, 
+ EvolvedAllocationRetentionPriorityI    evolvedAllocationRetentionPriorityI optional, 
+ APN_AMBR                        aPN_AMBR optional,   
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+};
+
+
+// Delete PDP Context Request   -   7.3.5 
+type record DeletePDPContextRequest   {
+ Cause_gtpc                      cause optional,
+ TearDownInd                     tearDownIndicator optional,
+ NSAPI_GTPC                      nsapi,          
+ ProtConfigOptions               protConfigOptions optional,     
+ UserLocationInformation         userLocationInformation optional,  
+ MS_TimeZone                     mS_TimeZone optional, 
+ ExtendedCommonFlags             extendedCommonFlags optional,
+ ULI_Timestamp                   uLI_Timestamp optional,
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+};
+
+// Delete PDP Context Response  - 7.3.6
+type record DeletePDPContextResponse    {
+ Cause_gtpc                      cause,
+ ProtConfigOptions               protConfigOptions optional,
+ UserLocationInformation         userLocationInformation optional,
+ MS_TimeZone                     mS_TimeZone optional,
+ ULI_Timestamp                   uLI_Timestamp optional,
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+};
+ 
+// PDU Notification Request  -   7.3.8 
+type record PDU_NotificationRequest     {
+ IMSI_gtpc                       imsi,
+ TeidControlPlane                teidControlPlane,
+ EndUserAddress                  endUserAddress,
+ AccessPointName                 accessPointName,
+ ProtConfigOptions               protConfigOptions optional,
+ GSN_Address_GTPC                ggsn_addr_controlPlane,
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+};
+
+// PDU Notification Response   -    7.3.9
+type record PDU_NotificationResponse   {
+ Cause_gtpc                      cause,
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+} 
+
+// PDU  Notification Reject Request  -   7.3.10
+type record PDU_NotificationRejectRequest    {
+ Cause_gtpc                      cause,
+ TeidControlPlane                teidControlPlane,
+ EndUserAddress                  endUserAddress,
+ AccessPointName                 accessPointName,
+ ProtConfigOptions               protConfigOptions optional,
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+};
+
+// PDU Notification Reject Response  -    7.3.11
+type record PDU_NotificationRejectResponse   {
+ Cause_gtpc                      cause,
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+}
+
+// Initiate PDP Context Activation Request 7.3.12
+type record InitiatePDPContextActivationRequest
+{
+ NSAPI_GTPC                      linkedNSAPI,
+ ProtConfigOptions               protConfigOptions optional,
+ QualityOfServiceProfile         qualityOfServiceProfile, 
+ TrafficFlowTemplate             tft optional,
+ CorrelationID                   correlationID,  
+ EvolvedAllocationRetentionPriorityI    evolvedAllocationRetentionPriorityI optional,  
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+};
+
+// Initiate PDP Context Activation Response 7.3.13
+type record InitiatePDPContextActivationResponse
+{
+ Cause_gtpc                      cause,
+ ProtConfigOptions               protConfigOptions optional,
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+};
+
+// Send Routeing Information for GPRS Request  -  7.4.1
+type record SendRouteingInformationForGPRSRequest    {
+ IMSI_gtpc                       imsi,
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+}
+
+// Send Routeing Information for GPRS Response - 7.4.2
+type record SendRouteingInformationForGPRSResponse     {
+ Cause_gtpc                      cause,
+ IMSI_gtpc                       imsi,
+ MAP_Cause                       map_Cause optional,
+ MSNotReachableReason            mS_not_ReachableReason optional,
+ GSN_Address_GTPC                gsn_Address optional,
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+};
+
+// Failure Report Request - 7.4.3
+type record FailureReportRequest     {
+ IMSI_gtpc                       imsi,
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+}
+
+// Failure Report Response - 7.4.4
+type record FailureReportResponse    {
+ Cause_gtpc                      cause,
+ MAP_Cause                       map_Cause optional,
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+};
+
+// Note MS GPRS Present Request - 7.4.5 
+type record NoteMS_GPRSPresentRequest    {
+ IMSI_gtpc                       imsi,
+ GSN_Address_GTPC                gsn_Address,
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+}
+
+// Note MS GPRS Present Response - 7.4.6 
+type record NoteMS_GPRSPresentResponse    {
+  Cause_gtpc                     cause,
+  PrivateExtension_gtpc_List     private_extension_gtpc optional
+}
+
+// Identification Request - 7.5.1
+type record IdentificationRequest   {
+ RoutingAreaIdentity             routingAreaIdentity,
+ PacketTMSI                      packetTMSI,
+ PTMSI_Signature                 ptmsi_Signature optional,
+ GSN_Address_GTPC                sgsn_addr_controlPlane optional,
+ HopCounter_gtpc                 hopCounter optional,
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+};
+
+// Identification Response - 7.5.2
+type record IdentificationResponse    {
+ Cause_gtpc                      cause,
+ IMSI_gtpc                       imsi optional,
+ AuthenticationTriplet_GTPC_SetOf authenticationTriplet optional,
+ AuthenticationQuintuplet_GTPC   authenticationQuintuplet optional,
+ AuthenticationQuintuplet_GTPC   authenticationQuintuplet2 optional,
+ AuthenticationQuintuplet_GTPC   authenticationQuintuplet3 optional,
+ AuthenticationQuintuplet_GTPC   authenticationQuintuplet4 optional,
+ AuthenticationQuintuplet_GTPC   authenticationQuintuplet5 optional,
+ UE_UsageType                    uE_UsageType optional,
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+};
+
+// SGSN Context Request - 7.5.3
+type record SGSN_ContextRequest   {
+ IMSI_gtpc                       imsi optional,
+ RoutingAreaIdentity             routingAreaIdentity ,
+ TLLI                            tlli optional,
+ PacketTMSI                      packetTMSI optional,
+ PTMSI_Signature                 ptmsi_Signature optional,
+ MS_Validated                    ms_Validated optional,
+ TeidControlPlane                teidControlPlane,
+ GSN_Address_GTPC                sgsn_addr_controlPlane,
+ GSN_Address_GTPC                alternative_sgsn_addr_controlPlane optional,
+ SGSN_Number                     sGSN_Number optional,
+ RATType                         ratType optional,  
+ HopCounter_gtpc                 hopCounter optional,
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+};
+
+// SGSN Context Response - 7.5.4
+ type record SGSN_ContextResponse
+{
+ Cause_gtpc                      cause,
+ IMSI_gtpc                       imsi optional,
+ TeidControlPlane                teidControlPlane optional,
+ RABContext_List                 rabContext optional,
+ RadioPrioritySMS                radioPrioritySMS optional,
+ RadioPriority_List              radioPriority optional,
+ PacketFlowID_List               packetFlowID optional,
+ ChargingCharacteristics_List_GTPC charging_char optional,
+ MM_Context                      mm_Context optional,
+ PDP_Context_GTPC_List           pdp_Context optional,
+ GSN_Address_GTPC                sgsn_addr_controlPlane optional,
+ PDPContextPriorization          pdpContextPriorization optional, 
+ RadioPriorityLCS                radioPriority_LCS optional, 
+ MBMS_UE_Context_List            mBMS_UE_Context optional,   
+ RFSP_Index                      subscribedRFSP_Index optional,
+ RFSP_Index                      rFSP_IndexInUse optional, 
+ FullyQualifiedDomainName_List   colocatedGGSN_PGW_FQDN optional,  
+ EvolvedAllocationRetentionPriorityII_List   evolvedAllocationRetentionPriorityII optional, 
+ ExtendedCommonFlags             extendedCommonFlags optional,
+ UE_Network_Capability           ue_network_capability optional,
+ UE_AMBR                         ue_ambr optional,
+ APN_AMBR_NSAPI                  apn_ambr_nsapi optional,
+ SignallingPriorityIndication_NSAPI signallingPriorityIndication_nsapi optional,
+ Higher_Bitrates_Than_16Mbps_Flag    higher_bitrates_than_16mbps_flag optional,
+ SelectionMode_NSAPI             selectionMode_nsapi optional,
+ LHN_ID_NSAPI                    localHomeNetworkID_nsapi optional,
+ UE_UsageType                    uE_UsageType optional,
+ ExtendedCommonFlagsII           extendedCommonFlagsII optional,
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+}; 
+
+
+// SGSN Context Acknowledge - 7.5.5
+type record SGSN_ContextAcknowledge {
+ Cause_gtpc                      cause,
+ TeidDataII_List                 teidDataII optional,
+ GSN_Address_GTPC                sgsn_AddressForUserTraffic optional,
+ SGSN_Number                     sgsn_Number optional,
+ NodeIdentifier                  nodeIdentifier  optional,
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+};
+
+// Forward Relocation Request - 7.5.6
+type record ForwardRelocationRequest {
+ IMSI_gtpc                       imsi optional,
+ TeidControlPlane                teidControlPlane,
+ RANAPCause                      ranapCause,
+ PacketFlowID_List               packetFlowID optional,  
+ ChargingCharacteristics_List_GTPC charging_char optional,
+ MM_Context                      mmContext,
+ PDP_Context_GTPC_List           pdpContext optional,
+ GSN_Address_GTPC                sgsn_addr_controlPlane,
+ TargetIdentification            targetId,
+ UTRANTransparentContainer       transpContainer,
+ PDPContextPriorization          pdpContextPriorization optional,
+ MBMS_UE_Context_List            mBMS_UE_Context optional,
+ Selected_PLMN_ID                selected_PLMN_ID optional,
+ BSS_Container                   bSS_Container optional,
+ Cell_Identification_gtpc        cell_Identification optional,
+ BSSGP_Cause_gtpc                bSSGP_Cause_gtpc optional,
+ PS_HandoverXIDParameters_List   pS_HandoverXIDParameters optional,
+ DirectTunnelFlags               directTunnelFlags optional, 
+ ReliableInterRATHandoverInfo    reliableInterRATHandoverInfo optional,
+ RFSP_Index                      subscribedRFSP_Index optional,
+ RFSP_Index                      rFSP_IndexInUse optional,
+ FullyQualifiedDomainName_List   colocatedGGSN_PGW_FQDN optional,
+ EvolvedAllocationRetentionPriorityII_List    evolvedAllocationRetentionPriorityII optional,
+ ExtendedCommonFlags             extendedCommonFlags optional,
+ CSG_Id                          cSG_Id optional, 
+ CSG_MembershipIndication        cSG_MembershipIndication optional,
+ UE_Network_Capability           ue_network_capability optional,
+ UE_AMBR                         ue_ambr optional,
+ APN_AMBR_NSAPI                  apn_ambr_nsapi optional,              
+ SignallingPriorityIndication_NSAPI signallingPriorityIndication_nsapi optional,
+ Higher_Bitrates_Than_16Mbps_Flag   higher_bitrates_than_16mbps_flag optional,
+ SRVCC_MM_Context                srvcc_mm_context optional,
+ SRVCC_Flags                     srvcc_flags optional,
+ STN_SR                          stn_sr optional,
+ C_MSISDN                        c_msisdn optional,
+ Extended_RANAP_Cause            extended_ranap_cause optional,
+ ENodeB_ID                       eNodeB_ID optional,
+ SelectionMode_NSAPI             selectionMode_nsapi optional,
+ UE_UsageType                    uE_UsageType optional,
+ ExtendedCommonFlagsII           extendedCommonFlagsII optional,
+ PrivateExtension_gtpc_List      private_extension_gtpc optional //to be compatible with GTP 9.11.0
+};
+
+
+
+
+// Forward Relocation Response - 7.5.7
+type record ForwardRelocationResponse {
+ Cause_gtpc                      cause,
+ TeidControlPlane                teidControlPlane optional,
+ TeidDataII_List                 teidDataII optional,
+ RANAPCause                      ranapCause optional,
+ GSN_Address_GTPC                sgsn_addr_controlPlane optional,
+ GSN_Address_GTPC                sgsn_addr_traffic optional,  
+ UTRANTransparentContainer       transpContainer optional,
+ RABSetupInformation_List        rabSetupInfo optional,
+ AdditionalRABSetupInformation_List additionalRABSetupInfo optional,
+ SGSN_Number                     sGSN_Number optional,
+ BSS_Container                   bSS_Container optional,
+ BSSGP_Cause_gtpc                bSSGP_Cause_gtpc optional,
+ ListOfSetupPFCs_gtpc            listOfSetupPFCs_gtpc optional,
+ Extended_RANAP_Cause            extended_ranap_cause optional,   
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+};
+
+// Forward Relocation Complete - 7.5.8
+type record ForwardRelocationComplete {
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+}
+
+// Relocation Cancel Request - 7.5.9
+type record RelocationCancelRequest {
+ IMSI_gtpc                       imsi optional,
+ IMEISV_gtpc                     imeisv_gtpc optional,
+ ExtendedCommonFlags             extended_common_flags optional,
+ Extended_RANAP_Cause            extended_ranap_cause optional,
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+}
+
+// Relocation Cancel Response - 7.5.10
+type record RelocationCancelResponse {
+ Cause_gtpc                      cause,
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+}
+
+// Forward Relocation Complete Acknowledge - 7.5.11
+type record ForwardRelocationCompleteAcknowledge {
+ Cause_gtpc                      cause,
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+}
+
+// 60 Forward SRNS Context Acknowledge - 7.5.12
+type record ForwardSRNSContextAcknowledge {
+ Cause_gtpc                      cause,
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+}
+
+// Forward SRNS Context - 7.5.13
+type record ForwardSRNSContext {
+ RABContext_List                 rabContext,
+ SourceRNC_PDCP_ContextInfo      sourceRNC_PDCP_ContextInfo optional,
+ PDU_Numbers_List                pDU_Numbers optional,
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+};
+
+// RAN InformationRelay - 7.5.14.1
+type record RANInformationRelay{
+ RANTransparentContainer         transparentContainer,
+ RIM_RoutingAddress              rIM_RoutingAddress optional,
+ RIM_RoutingAddress_Discriminator rIM_RoutingAddress_Discriminator optional,
+ PrivateExtension_gtpc_List       private_extension_gtpc optional
+};
+
+// UE Registration Query Request - 7.5.15
+type record UERegistrationQueryRequest {
+ IMSI_gtpc                       imsi,
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+}
+
+// UE Registration Query Response - 7.5.16
+type record UERegistrationQueryResponse {
+ Cause_gtpc                      cause,
+ IMSI_gtpc                       imsi,
+ Selected_PLMN_ID                selected_PLMN_ID optional,
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+}
+
+// MBMS Notification Request - 7.5A.1.1
+type record MBMSNotificationRequest
+{
+ IMSI_gtpc                          imsi,
+ TeidControlPlane                   teidControlPlane,
+ NSAPI_GTPC                         nsapi,          
+ EndUserAddress                     endUserAddress,
+ AccessPointName                    accessPointName,
+ GSN_Address_GTPC                   ggsn_addr_controlPlane,
+ MBMS_ProtocolConfigurationOptions  mBMS_ProtocolConfigurationOptions optional,
+ PrivateExtension_gtpc_List         private_extension_gtpc optional
+};
+
+// MBMS Notification Response - 7.5A.1.2
+type record MBMSNotificationResponse
+{
+ Cause_gtpc                         cause,
+ PrivateExtension_gtpc_List         private_extension_gtpc optional
+}
+
+// MBMS Notification Reject Request - 7.5A.1.3
+type record MBMSNotificationRejectRequest
+{
+ Cause_gtpc                         cause,
+ TeidControlPlane                   teidControlPlane,
+ NSAPI_GTPC                         nsapi,          
+ EndUserAddress                     endUserAddress,
+ AccessPointName                    accessPointName,
+ GSN_Address_GTPC                   sgsn_addr_controlPlane optional, 
+ PrivateExtension_gtpc_List         private_extension_gtpc optional
+};
+
+// MBMS Notification Reject Response - 7.5A.1.4
+type record MBMSNotificationRejectResponse
+{
+ Cause_gtpc                         cause,
+ PrivateExtension_gtpc_List         private_extension_gtpc optional
+}
+
+// Create MBMS Context Request - 7.5A.1.5
+type record CreateMBMSContextRequest
+{
+ IMSI_gtpc                       imsi optional,
+ RoutingAreaIdentity             rai,
+ Recovery_gtpc                   recovery optional,
+ SelectionMode                   selectionMode optional,     
+ TeidControlPlane                teidControlPlane optional,
+ TraceRef                        trace_ref optional,
+ GTP_TraceType                   trace_type optional,
+ EndUserAddress                  endUserAddress,
+ AccessPointName                 accessPointName,
+ GSN_Address_GTPC                sGSNAddressForSignalling,
+ MSISDN                          msisdn optional,     
+ GTP_TriggerID                   triggerId optional,
+ OMCIdentity                     omcId optional,
+ RATType                         ratType optional,
+ UserLocationInformation         userLocationInformation optional,
+ MS_TimeZone                     mS_TimeZone optional,
+ IMEISV_gtpc                     imeisv optional,            
+ MBMS_ProtocolConfigurationOptions  mBMS_ProtocolConfigurationOptions optional,
+ AdditionalTraceInfo             additionalTraceInfo optional,
+ Enhanced_NSAPI                  enhanced_NSAPI,
+ AdditionalMBMSTraceInfo         additionalMBMSTraceInfo optional,
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+};
+
+// Create MBMS Context Response - 7.5A.1.6
+type record CreateMBMSContextResponse
+{
+ Cause_gtpc                      cause,
+ Recovery_gtpc                   recovery optional,
+ TeidControlPlane                teidControlPlane optional,
+ ChargingID                      chargingID optional,
+ GSN_Address_GTPC                ggsn_addr_controlPlane optional,
+ GSN_Address_GTPC                alternative_ggsn_addr_controlPlane optional, 
+ MBMS_ProtocolConfigurationOptions  mBMS_ProtocolConfigurationOptions optional,
+ ChargingGatewayAddress          chargingGatewayAddress optional,  
+ ChargingGatewayAddress          alt_chargingGatewayAddress optional,  
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+};
+
+// Update MBMS Context Request - 7.5A.1.7
+type record UpdateMBMSContextRequest
+{
+ RoutingAreaIdentity             rai,
+ Recovery_gtpc                   recovery optional,
+ TeidControlPlane                teidControlPlane optional,
+ TraceRef                        trace_ref optional,
+ GTP_TraceType                   trace_type optional,
+ GSN_Address_GTPC                sgsn_addr_controlPlane,
+ GSN_Address_GTPC                alternative_sgsn_addr_controlPlane optional,
+ GTP_TriggerID                   triggerId optional,
+ OMCIdentity                     omcId optional,
+ RATType                         ratType optional,
+ UserLocationInformation         userLocationInformation optional,
+ MS_TimeZone                     mS_TimeZone optional,
+ AdditionalTraceInfo             additionalTraceInfo optional,
+ Enhanced_NSAPI                  enhanced_NSAPI,
+ AdditionalMBMSTraceInfo         additionalMBMSTraceInfo optional,
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+};
+
+// Update MBMS Context Response - 7.5A.1.8
+type record UpdateMBMSContextResponse
+{
+ Cause_gtpc                      cause,
+ Recovery_gtpc                   recovery optional,
+ TeidControlPlane                teidControlPlane optional,
+ ChargingID                      chargingID optional,
+ GSN_Address_GTPC                ggsn_addr_controlPlane optional,
+ GSN_Address_GTPC                alternative_ggsn_addr_controlPlane optional,
+ ChargingGatewayAddress          chargingGatewayAddress optional,
+ ChargingGatewayAddress          alt_chargingGatewayAddress optional,
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+};
+
+// Delete MBMS Context Request - 7.5A.1.9
+type record DeleteMBMSContextRequest
+{
+ IMSI_gtpc                       imsi optional,
+ TeidControlPlane                teidControlPlane optional,
+ EndUserAddress                  endUserAddress optional,
+ AccessPointName                 accessPointName optional,
+ MBMS_ProtocolConfigurationOptions  mBMS_ProtocolConfigurationOptions optional,
+ Enhanced_NSAPI                  enhanced_NSAPI optional,
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+};
+
+// Delete MBMS Context Response - 7.5A.1.10
+type record DeleteMBMSContextResponse
+{
+ Cause_gtpc                         cause,
+ MBMS_ProtocolConfigurationOptions  mBMS_ProtocolConfigurationOptions optional,
+ PrivateExtension_gtpc_List         private_extension_gtpc optional
+};
+
+// MBMS Registration Request - 7.5A.2.1
+type record MBMSRegistrationRequest_gtpc
+{
+ TeidControlPlane                teidControlPlane optional,
+ EndUserAddress                  endUserAddress,
+ AccessPointName                 accessPointName,
+ GSN_Address_GTPC                sgsn_addr_controlPlane optional,
+ GSN_Address_GTPC                alternative_sgsn_addr_controlPlane optional,
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+};
+
+// MBMS Registration Response - 7.5A.2.2
+type record MBMSRegistrationResponse_gtpc
+{
+ Cause_gtpc                      cause,
+ TeidControlPlane                teidControlPlane optional, 
+ GSN_Address_GTPC                ggsn_addr_controlPlane optional, 
+ TMGI_gtpc                       tMGI optional,
+ RequiredMBMS_BearerCapabilities reqMBMS_BearerCapabilities optional, 
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+};
+
+// MBMS De-registration Request - 7.5A.2.3
+type record MBMSDeRegistrationRequest
+{
+ EndUserAddress                  endUserAddress,
+ AccessPointName                 accessPointName,
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+} 
+
+// MBMS De-Registration Response - 7.5A.2.4
+type record MBMSDeRegistrationResponse
+{
+ Cause_gtpc                      cause,
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+}
+
+
+// MBMS Session Start Request 7.5A.2.5
+type record MBMSSessionStartRequest
+{
+ Recovery_gtpc                   recovery optional,
+ TeidControlPlane                teidControlPlane optional,
+ EndUserAddress                  endUserAddress,
+ AccessPointName                 accessPointName,
+ GSN_Address_GTPC                ggsn_addr_controlPlane optional,
+ GSN_Address_GTPC                alternative_ggsn_addr_controlPlane optional, 
+ QualityOfServiceProfile         qualityOfServiceProfile,
+ CommonFlags                     commonFlags,
+ TMGI_gtpc                       tMGI,
+ MBMS_ServiceArea                mBMS_ServiceArea,
+ MBMS_SessionIdentifier          mBMS_SessionIdentifier optional,
+ MBMS_2G_3G_Indicator            mBMS_2G_3G_Indicator,
+ MBMS_SessionDuration            mBMS_SessionDuration,
+ MBMS_SessionRepetitionNumber    mBMS_SessionRepetitionNumber optional,
+ MBMS_TimeToDataTransfer         mBMS_TimeToDataTransfer,
+ MBMS_FlowID                     mBMS_FlowID optional,
+ MBMS_IPMulticastDistribution    mBMS_IPMulticastDistribution optional,
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+};
+
+// 117 MBMS Session Start Response 7.5A.2.6
+type record MBMSSessionStartResponse_gtpc
+{
+ Cause_gtpc                      cause,
+ Recovery_gtpc                   recovery optional,
+ TeidDataI                       teidDataI optional,
+ TeidControlPlane                teidControlPlane optional,
+ GSN_Address_GTPC                sgsn_addr_controlPlane optional,
+ GSN_Address_GTPC                sgsn_addr_traffic optional,
+ GSN_Address_GTPC                alt_sgsn_addr_traffic optional,
+ MBMS_DistributionAcknowledgement mBMS_DistributionAcknowledgement optional,
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+};
+
+// MBMS Session Stop Request - 7.5A.2.7
+type record MBMSSessionStopRequest
+{
+ EndUserAddress                  endUserAddress,
+ AccessPointName                 accessPointName,
+ MBMS_FlowID                     mBMS_FlowID optional,
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+};
+
+// MBMS Session Stop Response - 7.5A.2.8
+type record MBMSSessionStopResponse_gtpc 
+{
+ Cause_gtpc                      cause,
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+}
+
+// MBMS Session Update Request - 7.5A.2.9
+type record MBMSSessionUpdateRequest
+{
+ TeidControlPlane                teidControlPlane optional,
+ EndUserAddress                  endUserAddress,
+ AccessPointName                 accessPointName, 
+ GSN_Address_GTPC                ggsn_addr_controlPlane optional,  
+ TMGI_gtpc                       tMGI, 
+ MBMS_ServiceArea                mBMS_ServiceArea, 
+ MBMS_SessionIdentifier          mBMS_SessionIdentifier optional,
+ MBMS_SessionDuration            mBMS_SessionDuration, 
+ MBMS_SessionRepetitionNumber    mBMS_SessionRepetitionNumber optional,
+ MBMS_FlowID                     mBMS_FlowID optional,
+ PrivateExtension_gtpc_List      private_extension_gtpc optional  
+};                     
+
+// MBMS Session Update Response - 7.5A.2.10
+type record MBMSSessionUpdateResponse
+{
+ Cause_gtpc                      cause,
+ TeidDataI                       teidDataI optional,
+ TeidControlPlane                teidControlPlane optional,
+ GSN_Address_GTPC                sgsn_addr_DataI  optional,
+ GSN_Address_GTPC                sgsn_addr_controlPlane optional,
+ PrivateExtension_gtpc_List      private_extension_gtpc optional
+};                     
+
+// MS Info Change Notification Request 7.5B.1.1
+type record MS_InfoChangeNotificationRequest
+{
+ IMSI_gtpc                       imsi optional,
+ NSAPI_GTPC                      linkedNSAPI optional,
+ RATType                         ratType,
+ UserLocationInformation         userLocationInformation optional,
+ IMEISV_gtpc                     imeisv_gtpc optional,
+ ExtendedCommonFlags             extended_common_flags optional,  
+ UserCSGInformation              userCSGInformation optional,   
+ PrivateExtension_gtpc_List      private_extension_gtpc optional   
+};
+  
+// MS Info Change Notification Response 7.5B.1.2
+type record MS_InfoChangeNotificationResponse
+{
+ Cause_gtpc                      cause,
+ IMSI_gtpc                       imsi optional,
+ NSAPI_GTPC                      linkedNSAPI optional,
+ IMEISV_gtpc                     imeisv_gtpc optional, 
+ MS_InfoChangeReportingAction    mS_InfoChangeReportingAction optional, 
+ CSGInfoReportingAction          cSGInfoReportingAction optional,  
+ PrivateExtension_gtpc_List      private_extension_gtpc optional     
+};
+
+type union GTPC_PDUs {
+ EchoRequest                             echoRequest,
+ EchoResponse                            echoResponse,
+ VersionNotSupported                     versionNotSupported,
+ CreatePDPContextRequest                 createPDPContextRequest,
+ CreatePDPContextResponse                createPDPContextResponse,
+ UpdatePDPContextRequest                 updatePDPContextRequest,
+ UpdatePDPContextResponse                updatePDPContextResponse,
+ DeletePDPContextRequest                 deletePDPContextRequest,
+ DeletePDPContextResponse                deletePDPContextResponse, 
+ PDU_NotificationRequest                 pdu_NotificationRequest,
+ PDU_NotificationResponse                pdu_NotificationResponse,
+ PDU_NotificationRejectRequest           pdu_NotificationRejectRequest,
+ PDU_NotificationRejectResponse          pdu_NotificationRejectResponse,
+ InitiatePDPContextActivationRequest     initiatePDPContextActivationRequest,
+ InitiatePDPContextActivationResponse    initiatePDPContextActivationResponse, 
+ SupportedExtensionHeadersNotification   supportedExtensionHeadersNotification,
+ SendRouteingInformationForGPRSRequest   sendRouteingInformationForGPRSRequest,
+ SendRouteingInformationForGPRSResponse  sendRouteingInformationForGPRSResponse,
+ FailureReportRequest                    failureReportRequest,
+ FailureReportResponse                   failureReportResponse,
+ NoteMS_GPRSPresentRequest               noteMS_GPRSPresentRequest,
+ NoteMS_GPRSPresentResponse              noteMS_GPRSPresentResponse,
+ IdentificationRequest                   identificationRequest,
+ IdentificationResponse                  identificationResponse,
+ SGSN_ContextRequest                     sgsn_ContextRequest,
+ SGSN_ContextResponse                    sgsn_ContextResponse,
+ SGSN_ContextAcknowledge                 sgsn_ContextAcknowledge,
+ ForwardRelocationRequest                forwardRelocationRequest,
+ ForwardRelocationResponse               forwardRelocationResponse,
+ ForwardRelocationComplete               forwardRelocationComplete,
+ RelocationCancelRequest                 relocationCancelRequest,
+ RelocationCancelResponse                relocationCancelResponse,
+ ForwardSRNSContext                      forwardSRNSContext,
+ ForwardRelocationCompleteAcknowledge    forwardRelocationCompleteAcknowledge,
+ ForwardSRNSContextAcknowledge           forwardSRNSContextAcknowledge,
+ UERegistrationQueryRequest              uERegistrationQueryRequest,
+ UERegistrationQueryResponse             uERegistrationQueryResponse,
+ RANInformationRelay                     ranInformationRelay,
+ MBMSNotificationRequest                 mBMSNotificationRequest,
+ MBMSNotificationResponse                mBMSNotificationResponse,
+ MBMSNotificationRejectRequest           mBMSNotificationRejectRequest,
+ MBMSNotificationRejectResponse          mBMSNotificationRejectResponse,
+ CreateMBMSContextRequest                createMBMSContextRequest,
+ CreateMBMSContextResponse               createMBMSContextResponse,
+ UpdateMBMSContextRequest                updateMBMSContextRequest,
+ UpdateMBMSContextResponse               updateMBMSContextResponse,
+ DeleteMBMSContextRequest                deleteMBMSContextRequest,
+ DeleteMBMSContextResponse               deleteMBMSContextResponse,
+ MBMSRegistrationRequest_gtpc            mBMSRegistrationRequest,
+ MBMSRegistrationResponse_gtpc           mBMSRegistrationResponse,
+ MBMSDeRegistrationRequest               mBMSDeRegistrationRequest,
+ MBMSDeRegistrationResponse              mBMSDeRegistrationResponse,
+ MBMSSessionStartRequest                 mBMSSessionStartRequest,
+ MBMSSessionStartResponse_gtpc           mBMSSessionStartResponse,
+ MBMSSessionStopRequest                  mBMSSessionStopRequest,
+ MBMSSessionStopResponse_gtpc            mBMSSessionStopResponse,
+ MBMSSessionUpdateRequest                mBMSSessionUpdateRequest,
+ MBMSSessionUpdateResponse               mBMSSessionUpdateResponse, 
+ MS_InfoChangeNotificationRequest        mS_InfoChangeNotificationRequest,
+ MS_InfoChangeNotificationResponse       mS_InfoChangeNotificationResponse 
+} with { variant ""};
+
+
+/////////////////////////////
+// PDU definition
+/////////////////////////////
+type record PDU_GTPC {
+ BIT1                           pn_bit,
+ BIT1                           s_bit,
+ BIT1                           e_bit,
+ BIT1                           spare,
+ BIT1                           pt,
+ BIT3                           version,
+ OCT1                           messageType,
+ LIN2_BO_LAST                   lengthf,
+ OCT4                           teid,
+ GTPC_Header_optional_part      opt_part optional,
+ GTPC_PDUs                      gtpc_pdu
+} with { 
+    variant (lengthf) "LENGTHTO(opt_part, gtpc_pdu)";
+    variant (opt_part) "PRESENCE({pn_bit = '1'B, s_bit = '1'B, e_bit = '1'B})";
+    variant (gtpc_pdu) "CROSSTAG( echoRequest, messageType = '01'O;
+           echoResponse, messageType = '02'O;
+           versionNotSupported, messageType = '03'O;
+           createPDPContextRequest, messageType = '10'O;
+           createPDPContextResponse, messageType = '11'O;
+           updatePDPContextRequest, messageType = '12'O;
+           updatePDPContextResponse, messageType = '13'O;
+           deletePDPContextRequest, messageType = '14'O;
+           deletePDPContextResponse, messageType = '15'O; 
+           initiatePDPContextActivationRequest, messageType = '16'O;           
+           initiatePDPContextActivationResponse, messageType = '17'O;                     
+           pdu_NotificationRequest, messageType = '1B'O;
+           pdu_NotificationResponse, messageType = '1C'O;
+           pdu_NotificationRejectRequest, messageType = '1D'O;
+           pdu_NotificationRejectResponse, messageType = '1E'O;
+           supportedExtensionHeadersNotification, messageType ='1F'O;
+           sendRouteingInformationForGPRSRequest, messageType = '20'O;
+           sendRouteingInformationForGPRSResponse, messageType = '21'O;
+           failureReportRequest, messageType = '22'O; 
+           failureReportResponse, messageType = '23'O;
+           noteMS_GPRSPresentRequest, messageType = '24'O;
+           noteMS_GPRSPresentResponse, messageType = '25'O;
+           identificationRequest, messageType = '30'O;
+           identificationResponse, messageType = '31'O;
+           sgsn_ContextRequest, messageType = '32'O;
+           sgsn_ContextResponse, messageType = '33'O;
+           sgsn_ContextAcknowledge, messageType = '34'O;
+           forwardRelocationRequest, messageType = '35'O;
+           forwardRelocationResponse, messageType = '36'O;
+           forwardRelocationComplete, messageType = '37'O; 
+           relocationCancelRequest, messageType = '38'O;
+           relocationCancelResponse, messageType = '39'O; 
+           forwardSRNSContext, messageType = '3A'O; 
+           forwardRelocationCompleteAcknowledge, messageType = '3B'O; 
+           forwardSRNSContextAcknowledge, messageType = '3C'O;
+           uERegistrationQueryRequest, messageType = '3D'O;
+           uERegistrationQueryResponse, messageType = '3F'O;
+           ranInformationRelay, messageType = '46'O;
+           mBMSNotificationRequest, messageType = '60'O;
+           mBMSNotificationResponse, messageType = '61'O;
+           mBMSNotificationRejectRequest, messageType = '62'O;
+           mBMSNotificationRejectResponse, messageType = '63'O;
+           createMBMSContextRequest, messageType = '64'O;
+           createMBMSContextResponse, messageType = '65'O;
+           updateMBMSContextRequest, messageType = '66'O;
+           updateMBMSContextResponse, messageType = '67'O;
+           deleteMBMSContextRequest, messageType = '68'O;
+           deleteMBMSContextResponse, messageType = '69'O;
+           mBMSRegistrationRequest, messageType = '70'O;
+           mBMSRegistrationResponse, messageType = '71'O;
+           mBMSDeRegistrationRequest, messageType = '72'O;
+           mBMSDeRegistrationResponse, messageType = '73'O;
+           mBMSSessionStartRequest, messageType = '74'O;
+           mBMSSessionStartResponse, messageType = '75'O;
+           mBMSSessionStopRequest, messageType = '76'O;
+           mBMSSessionStopResponse, messageType = '77'O;
+           mBMSSessionUpdateRequest, messageType = '78'O;           
+           mBMSSessionUpdateResponse, messageType = '79'O;
+           mS_InfoChangeNotificationRequest, messageType = '80'O;
+           mS_InfoChangeNotificationResponse, messageType = '81'O                      
+           )";
+};
+
+type record GTPC_Header_optional_part {
+ OCT2                       sequenceNumber,
+ OCT1                       npduNumber,
+ OCT1                       nextExtHeader,
+ GTPC_ExtensionHeader_List  gTPC_extensionHeader_List optional
+} 
+
+type record of GTPC_ExtensionHeader GTPC_ExtensionHeader_List;
+
+type record GTPC_ExtensionHeader {
+ integer               lengthfield, 
+ octetstring           content,
+ octetstring           nextExtHeader  length(1)
+} with { variant (lengthfield) "LENGTHTO(lengthfield,content,nextExtHeader)";
+         variant (lengthfield) "UNIT(32)";
+};
+
+}//end of module
+with {
+extension "version R2A"
+encode "RAW"
+}
+
diff --git a/src/GTPU_EncDec.cc b/src/GTPU_EncDec.cc
new file mode 100644
index 0000000..703f2b1
--- /dev/null
+++ b/src/GTPU_EncDec.cc
@@ -0,0 +1,118 @@
+///////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (c) 2000-2017 Ericsson Telecom AB
+//
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// which accompanies this distribution, and is available at
+// http://www.eclipse.org/legal/epl-v10.html
+///////////////////////////////////////////////////////////////////////////////
+//
+//  File:               GTPU_EncDec.cc
+//  Rev:                R2A
+//  Prodnr:             CNL 113 843
+//  Contact:            http://ttcn.ericsson.se
+//  Reference:          3GPP TS 29.060 v13.5.0
+
+#include "GTPU_Types.hh"
+
+namespace GTPU__Types {
+
+// find the length of the optional part and decode optional part into OPT_PART   
+int find_optpart_length(const unsigned char * opt_part_ptr,GTPU__Header__optional__part& OPT_PART)// pointer to opt part start
+{
+  int opt_part_length = 4; // mandatory minimum length of opt_part  
+  OPT_PART.sequenceNumber() = OCTETSTRING(2,opt_part_ptr);
+  OPT_PART.npduNumber() = OCTETSTRING(1,opt_part_ptr+2);
+  OPT_PART.nextExtHeader() = OCTETSTRING(1,opt_part_ptr+3);
+  OPT_PART.gTPU__extensionHeader__List() = OMIT_VALUE; 
+   
+      int i = 0;    
+      bool opt_part_end = false;
+      while(!opt_part_end) 
+      {                  
+        if (opt_part_ptr[opt_part_length-1] != 0x00) // 0x00 means end of optional part
+            {
+             unsigned char lengthfield = opt_part_ptr[opt_part_length];
+             
+             OPT_PART.gTPU__extensionHeader__List()()[i].lengthfield() = lengthfield;
+             OPT_PART.gTPU__extensionHeader__List()()[i].content() = 
+               OCTETSTRING(4*lengthfield-2,opt_part_ptr + opt_part_length +1);
+             OPT_PART.gTPU__extensionHeader__List()()[i].nextExtHeader() = 
+               OCTETSTRING(1,opt_part_ptr + opt_part_length + 4*lengthfield - 1);
+                   
+             opt_part_length = opt_part_length + 4*lengthfield;
+             i++;
+            }
+        else            
+            {opt_part_end = true;}                         
+      }
+       
+  return  opt_part_length;
+}
+
+//////////////////////////////////
+// Decoding function for GTPC__DialoguePDU
+//////////////////////////////////
+PDU__GTPU dec__PDU__GTPU(const OCTETSTRING& udp__pdu)
+{
+  TTCN_Buffer buf;
+  PDU__GTPU pdu;  
+       
+      const unsigned char *gtpu_message = (const unsigned char *) udp__pdu;
+       
+      int opt_part_length = 0;
+      if  ( gtpu_message[0] & 0x07 ) // opt_part is present 
+      { 
+         GTPU__Header__optional__part    OPT_PART;
+         
+         // find the length of the optional part and decode optional part into OPT_PART                       
+         opt_part_length = find_optpart_length(gtpu_message+8,OPT_PART); 
+         if(  ((gtpu_message[2] << 8) + gtpu_message[3] - opt_part_length) < 0  )
+           {TTCN_error("Decoding error, lengthf field is shorter that decoded length of opt_part");};         
+                                                             
+         // build PDU without optional part 
+         unsigned int gtpu_IEs_length = (gtpu_message[2] << 8) + gtpu_message[3] - opt_part_length;
+         unsigned char gtpuBuf[8 + gtpu_IEs_length];
+         memcpy(gtpuBuf,gtpu_message,8);
+         memcpy(gtpuBuf+8,gtpu_message+8+opt_part_length,gtpu_IEs_length);
+         
+         // substitute dummy bits (indicating there is no optional part)
+         gtpuBuf[0] = gtpuBuf[0] & 0xf8;
+         
+         // substitute dummy length (not including optional part)
+         gtpuBuf[2] = (gtpu_IEs_length & 0xff00) >> 8;
+         gtpuBuf[3] =  gtpu_IEs_length & 0xff;
+         
+         // RAW decoding
+         buf.put_s(8 + gtpu_IEs_length,gtpuBuf);        
+         pdu.decode(PDU__GTPU_descr_, buf, TTCN_EncDec::CT_RAW);
+         buf.clear(); 
+         
+         // put back the original values               
+         unsigned char pn = gtpu_message[0] & 0x01;
+         pdu.pn__bit() = BITSTRING(1,&pn);
+    
+         unsigned char s = (gtpu_message[0] & 0x02) >> 1;
+         pdu.s__bit() =  BITSTRING(1,&s);
+      
+         unsigned char e = (gtpu_message[0] & 0x04) >> 2;
+         pdu.e__bit() = BITSTRING(1,&e);
+         
+         pdu.lengthf() = (gtpu_message[2] << 8) + gtpu_message[3];
+         
+         pdu.opt__part() = OPT_PART;
+                
+         return pdu;                 
+      }   
+      else // opt_part is not present 
+      {
+         buf.put_os(udp__pdu);
+         pdu.decode(PDU__GTPU_descr_, buf, TTCN_EncDec::CT_RAW);
+         buf.clear(); 
+         return pdu;             
+      }                  
+}  // end of function
+
+
+}//namespace
diff --git a/src/GTPU_Types.ttcn b/src/GTPU_Types.ttcn
new file mode 100644
index 0000000..6b3879a
--- /dev/null
+++ b/src/GTPU_Types.ttcn
@@ -0,0 +1,188 @@
+///////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (c) 2000-2017 Ericsson Telecom AB
+//
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// which accompanies this distribution, and is available at
+// http://www.eclipse.org/legal/epl-v10.html
+///////////////////////////////////////////////////////////////////////////////
+//
+//  File:               GTPU_Types.ttcn
+//  Rev:                R2A
+//  Prodnr:             CNL 113 843
+//  Contact:            http://ttcn.ericsson.se
+//  Reference:          3GPP TS 29.060 v13.5.0, 3GPP TS 29.281 v13.2.0
+//
+//  This module contains the GTP-U (General Packet Radio Servive Protocol
+//   Tunnelling Protocol - User Plane)
+
+module GTPU_Types {
+
+import from General_Types all;
+
+// external encoding/decoding functions
+external function enc_PDU_GTPU(in PDU_GTPU gtpu_pdu) return octetstring
+with { extension "prototype(convert)"
+       extension "encode(RAW)"
+}
+
+external function dec_PDU_GTPU(in octetstring udp_pdu) return PDU_GTPU
+
+external function dec_PDU_GTPU_ext(in octetstring udp_pdu) return PDU_GTPU_ext
+with { extension "prototype(convert)"
+       extension "decode(RAW)"
+}
+
+
+     	
+//////////////////////////
+// IE definition
+//////////////////////////
+//Private Extension - 7.7.46
+type record of PrivateExtension_gtpu PrivateExtension_gtpu_List;
+
+type record PrivateExtension_gtpu {
+  OCT1             type_gtpu,
+  LIN2_BO_LAST     lengthf,
+  OCT2             extensionID,
+  octetstring      extensionValue
+} with { variant "PRESENCE( type_gtpu = 'FF'O)"; 
+         variant (lengthf) "LENGTHTO(extensionID, extensionValue)";};
+
+//Recovery - 7.7.11
+type record Recovery_gtpu {
+  OCT1           type_gtpu,
+  OCT1           restartCounter 
+};
+
+//Extension Header Type List - 7.7.40
+type record ExtensionHeaderTypeList_gtpu {
+  OCT1             type_gtpu,
+  integer          lengthf,
+  octetstring      extensionTypesList 
+} with { variant (lengthf) "LENGTHTO(extensionTypesList)"; }
+
+//Tunnel Endpoint Identifier Data I - 7.7.13
+type record TeidDataI_gtpu {
+  OCT1  type_gtpu,
+  OCT4  teidDataI 
+};
+
+//GSN Address - 7.7.32
+type record GSNAddress_gtpu
+{
+  OCT1            type_gtpu,
+  LIN2_BO_LAST	  lengthf,
+  octetstring     gSNAddressValue
+} with {variant (lengthf) "LENGTHTO(gSNAddressValue)";};
+
+//////////////////////////
+// Message definition
+//////////////////////////
+// Echo Request - 7.2.1
+type record EchoRequest_IEs {
+  PrivateExtension_gtpu_List  private_extension_gtpu  optional
+} 
+
+// Echo Response - 7.2.2
+type record EchoResponse_IEs {
+  Recovery_gtpu  	  recovery_gtpu,
+  PrivateExtension_gtpu_List   private_extension_gtpu  optional
+} 
+  
+//Error Indication -  3GPP TS 29.281 v13.2.0 - 7.3.1
+type record ErrorIndication_IEs {
+  TeidDataI_gtpu   	  teidDataI_gtpu,
+  GSNAddress_gtpu         gSNAddress_gtpu,
+  PrivateExtension_gtpu_List   private_extension_gtpu  optional
+}
+
+//Supported Extension Headers Notification - 7.2.4
+type record SupportedExtensionHeadersNotification_IEs {
+  ExtensionHeaderTypeList_gtpu extensionHeaderTypeList_gtpu
+};
+
+// 3GPP TS 29.281 v9.3.0 - 7.3.2
+type record EndMarker_IEs{
+  PrivateExtension_gtpu_List  private_extension_gtpu  optional
+} 
+
+//G PDU - 9.3.1
+type record G_PDU_IEs {
+  octetstring  data
+};
+
+
+type union GTPU_IEs {
+  EchoRequest_IEs                             echoRequest_IEs,
+  EchoResponse_IEs                            echoResponse_IEs,
+  ErrorIndication_IEs                         errorIndication_IEs,
+  SupportedExtensionHeadersNotification_IEs   suppExtHeadersNotif_IEs,
+  EndMarker_IEs                               endMarker_IEs,
+  G_PDU_IEs                                   g_PDU_IEs
+};
+
+
+//////////////////////////
+// Extension Header definition
+//////////////////////////
+type record GTPU_ExtensionHeader {
+  integer		lengthfield,
+  octetstring 		content,
+  OCT1            nextExtHeader
+} with {
+         variant (lengthfield) "LENGTHTO(lengthfield,content,nextExtHeader)";
+         variant (lengthfield) "UNIT(32)";        
+       }
+
+type record of GTPU_ExtensionHeader GTPU_ExtensionHeader_List;
+
+type record GTPU_Header_optional_part {
+  OCT2                       sequenceNumber,
+  OCT1                       npduNumber,
+  OCT1                       nextExtHeader,
+  GTPU_ExtensionHeader_List  gTPU_extensionHeader_List optional
+} 
+   
+
+//////////////////////////
+// PDU definition
+//////////////////////////
+type record PDU_GTPU {
+  BIT1             pn_bit,
+  BIT1             s_bit,
+  BIT1             e_bit,
+  BIT1             spare,
+  BIT1             pt,
+  BIT3             version,
+  OCT1             messageType,
+  LIN2_BO_LAST     lengthf,
+  OCT4             teid,
+  GTPU_Header_optional_part opt_part optional,
+  GTPU_IEs         gtpu_IEs
+} with { 
+    variant (lengthf)  "LENGTHTO(opt_part, gtpu_IEs)";
+    variant (opt_part) "PRESENCE({pn_bit = '1'B, s_bit = '1'B, e_bit = '1'B})";
+    variant (gtpu_IEs) "CROSSTAG( echoRequest_IEs,     messageType = '01'O;
+                                  echoResponse_IEs,    messageType = '02'O;
+                                  errorIndication_IEs, messageType = '1A'O;
+                                  suppExtHeadersNotif_IEs, messageType = '1F'O;
+                                  endMarker_IEs,       messageType = 'FE'O;
+                                  g_PDU_IEs,           messageType = 'FF'O)";
+       };
+
+
+type record PDU_GTPU_ext {
+  PDU_GTPU gtpu_pdu,
+  octetstring extraOctets
+} with {
+  variant "" ;
+};
+
+}//end of module
+with {
+extension "version R2A"
+encode "RAW"
+}
+