Initial commit
diff --git a/doc/NS_v7.3.0_CNL113578_FS.pdf b/doc/NS_v7.3.0_CNL113578_FS.pdf
new file mode 100644
index 0000000..0f5ea5f
--- /dev/null
+++ b/doc/NS_v7.3.0_CNL113578_FS.pdf
Binary files differ
diff --git a/doc/NS_v7.3.0_CNL113578_UG.pdf b/doc/NS_v7.3.0_CNL113578_UG.pdf
new file mode 100644
index 0000000..c818f1a
--- /dev/null
+++ b/doc/NS_v7.3.0_CNL113578_UG.pdf
Binary files differ
diff --git a/doc/NS_v7.3_PRI.pdf b/doc/NS_v7.3_PRI.pdf
new file mode 100644
index 0000000..ae5248d
--- /dev/null
+++ b/doc/NS_v7.3_PRI.pdf
Binary files differ
diff --git a/src/NS_Types.ttcn b/src/NS_Types.ttcn
new file mode 100644
index 0000000..4424e10
--- /dev/null
+++ b/src/NS_Types.ttcn
@@ -0,0 +1,464 @@
+///////////////////////////////////////////////////////////////////////////////
+//
+// 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:               NS_Types.ttcn
+//  Rev:                R2A
+//  Prodnr:             CNL 113 578
+//  Updated:            2008-01-22
+//  Contact:            http://ttcn.ericsson.se
+//  Reference:          3GPP TS 48.016 7.3.0
+ 
+module NS_Types
+{    // beginning of module
+
+// This module contains the Base Station System (BSS) Serving GPRS Support
+// Node (SGSN) interface  Network Sevice protocol
+//  48.016 v7.3.0 with attributes for RAW encoding/decoding.
+// 
+                 
+// History:
+// ********
+
+import from General_Types all;
+
+external function enc_PDU_NS(in PDU_NS pdu) return octetstring
+with { extension "prototype(convert)"
+       extension "encode(RAW)"
+     } 
+                
+external function dec_PDU_NS(in octetstring stream) return PDU_NS
+with { extension "prototype(convert)"
+       extension "decode(RAW)"
+     }
+
+type record CauseNS
+{
+OCT1                     iEI, 
+BIT1                     ext,
+LIN1_2                   lengthIndicator,
+OCT1                     cause
+}  with { 
+        variant (lengthIndicator) "LENGTHTO (cause)";
+        variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
+                                             length2,         ext = '0'B;)";
+        variant (ext,lengthIndicator) "FIELDORDER(msb)";
+       }
+
+type record NS_VCI  
+{
+OCT1                     iEI, 
+BIT1                     ext,
+LIN1_2                   lengthIndicator,
+OCT2                     nS_VCI
+} with { 
+        variant (lengthIndicator) "LENGTHTO (nS_VCI)";
+        variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
+                                             length2,         ext = '0'B;)";
+        variant (ext,lengthIndicator) "FIELDORDER(msb)";
+       }
+
+type record NS_PDU  
+{
+OCT1                     iEI, 
+BIT1                     ext,
+LIN1_2                   lengthIndicator,
+octetstring              ns_PDU
+} with { 
+        variant (lengthIndicator) "LENGTHTO (ns_PDU)";
+        variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
+                                             length2,         ext = '0'B;)";
+        variant (ext,lengthIndicator) "FIELDORDER(msb)";
+       }
+ 
+type record BVCI_NS 
+{
+OCT1                     iEI, 
+BIT1                     ext,
+LIN1_2                   lengthIndicator,
+OCT2                     bVCI
+} with { 
+        variant (lengthIndicator) "LENGTHTO (bVCI)";
+        variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
+                                             length2,         ext = '0'B;)";
+        variant (ext,lengthIndicator) "FIELDORDER(msb)";
+       }       
+
+type record ListofIP4Elements 
+{
+OCT1                     iEI, 
+BIT1                     ext,
+LIN1_2                   lengthIndicator,
+IP4_Elements             iP4_Elements
+}  with { 
+        variant (lengthIndicator) "LENGTHTO (iP4_Elements)";
+        variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
+                                             length2,         ext = '0'B;)";
+        variant (ext,lengthIndicator) "FIELDORDER(msb)";
+       }       
+
+type record IP4_Element
+{
+OCT4                     ipAddress,
+OCT2                     uDP_Port,
+OCT1                     signallingWeight,
+OCT1                     dataWeight
+}
+
+type record of IP4_Element IP4_Elements;
+
+type record ListofIP6Elements 
+{
+OCT1                     iEI, 
+BIT1                     ext,
+LIN1_2                   lengthIndicator,
+IP6_Elements             iP6_Elements
+}  with { 
+        variant (lengthIndicator) "LENGTHTO (iP6_Elements)";
+        variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
+                                             length2,         ext = '0'B;)";
+        variant (ext,lengthIndicator) "FIELDORDER(msb)";
+       }       
+
+type record IP6_Element
+{
+OCT16                    ipAddress,
+OCT2                     uDP_Port,
+OCT1                     signallingWeight,
+OCT1                     dataWeight
+}
+
+type record of IP6_Element IP6_Elements;
+
+type record IP_Address_NS
+{
+OCT1                     iEI, 
+OCT1                     addressType,
+IPAddress                ipAddress
+}with {
+  variant (ipAddress) "CROSSTAG
+    (
+      ip4Address,    addressType = '01'O;
+      ip6Address,    addressType = '02'O; 
+    )"
+}; 
+     
+type union IPAddress 
+{
+OCT4                     ip4Address,
+OCT16                    ip6Address
+}
+
+type record EndFlag
+{
+BIT1                     eBIT,
+BIT7                     spare
+}
+
+type record ResetFlag
+{
+OCT1                     iEI, 
+BIT1                     resetBIT,
+BIT7                     spare
+}
+
+type record MaxNumberOfNSVCs
+{
+OCT1                     iEI, 
+OCT2                     maxNumberOfNSVCs 
+}
+
+type record NumberOfIP_Endpoints 
+{
+OCT1                     iEI, 
+OCT2                     numberOfIP_Endpoints 
+}
+
+
+type record NSEI_NS
+{
+OCT1                     iEI, 
+BIT1                     ext,
+LIN1_2                   lengthIndicator,
+OCT2                     nSEI
+} with { 
+        variant (lengthIndicator) "LENGTHTO (nSEI)";
+        variant (lengthIndicator) "CROSSTAG( length1,         ext = '1'B;
+                                             length2,         ext = '0'B;)";
+        variant (ext,lengthIndicator) "FIELDORDER(msb)";
+       }       
+
+type record NS_SDU_ControlBits
+{
+BIT1                     rBit,
+BIT1                     cBit,
+BIT6                     spare
+}
+
+//same type def as LIN2_2a in BSSGP but named differently 
+type union LIN1_2
+{
+integer length1,
+integer length2
+} with {
+        variant (length1) "FIELDLENGTH(7)";
+        variant (length2) "FIELDLENGTH(15)";
+        variant (length2) "BYTEORDER(last)";
+        variant (length1,length2) "FIELDORDER(msb)"
+      }        
+
+
+// PDUs ************************************************************
+
+
+type record PDU_NS_Alive
+{
+OCT1                     nsPduType 
+}
+
+type record PDU_NS_Alive_Ack
+{
+OCT1                     nsPduType
+}
+
+type record PDU_NS_Block
+{
+OCT1                     nsPduType,
+CauseNS                  causeNS,                        //TLV
+NS_VCI                   nS_VCI                          //TLV
+}
+
+type record PDU_NS_Block_Ack
+{
+OCT1                     nsPduType,
+NS_VCI                   nS_VCI                          //TLV
+}
+
+type record PDU_NS_Reset
+{
+OCT1                     nsPduType,
+CauseNS                  causeNS,                        //TLV
+NS_VCI                   nS_VCI,                         //TLV
+NSEI_NS                  nSEI_NS                         //TLV      
+}
+
+type record PDU_NS_Reset_Ack
+{
+OCT1                     nsPduType,
+NS_VCI                   nS_VCI,                         //TLV
+NSEI_NS                  nSEI_NS                         //TLV      
+}
+
+type record PDU_NS_Status
+{
+OCT1                     nsPduType,
+CauseNS                  causeNS,                        //TLV
+NS_VCI                   nS_VCI              optional,   //TLV   
+NS_PDU                   nS_PDU              optional,   //TLV
+BVCI_NS                  bVCI_NS             optional,   //TLV
+ListofIP4Elements        listofIP4Elements   optional,   //TLV
+ListofIP6Elements        listofIP6Elements   optional    //TLV
+} with { 
+  variant "TAG (
+                nS_VCI,                        iEI = '01'O;
+                nS_PDU,                        iEI = '02'O;
+                bVCI_NS,                       iEI = '03'O;
+                listofIP4Elements,             iEI = '05'O;
+		listofIP6Elements,             iEI = '06'O                 
+        )"
+}
+
+type record PDU_NS_Unblock
+{
+OCT1                     nsPduType
+}
+
+type record PDU_NS_Unblock_Ack
+{
+OCT1                     nsPduType
+}
+
+type record PDU_NS_Unitdata
+{
+OCT1                     nsPduType,
+NS_SDU_ControlBits       nS_SDU_ControlBits,              //V
+OCT2                     bVCI,                            //V
+octetstring              nS_SDU                           //V
+// decoder interprets all octets after the 
+// first 4 octets as NS SDU
+}
+
+type record PDU_SNS_Ack
+{
+OCT1                     nsPduType,
+NSEI_NS                  nSEI_NS,                           //TLV
+integer                  transactionID,                     //V
+CauseNS                  causeNS             optional,      //TLV
+IP_Address_NS            iP_Address_NS       optional,      //TV
+ListofIP4Elements        listofIP4Elements   optional,      //TLV
+ListofIP6Elements        listofIP6Elements   optional       //TLV
+} with {
+        variant (transactionID) "FIELDLENGTH(8)";
+        variant "TAG (
+                causeNS,                           iEI = '00'O;
+                iP_Address_NS,                   iEI = '0B'O;
+                listofIP4Elements,          iEI = '05'O;
+                listofIP6Elements,          iEI = '06'O              
+        )"
+}
+
+type record PDU_SNS_Add
+{
+OCT1                     nsPduType,
+NSEI_NS                  nSEI_NS,                          //TLV
+integer                  transactionID,                    //V
+ListofIP4Elements        listofIP4Elements optional,       //TLV
+ListofIP6Elements        listofIP6Elements optional        //TLV
+} with {
+        variant (transactionID) "FIELDLENGTH(8)";
+        variant "TAG (
+                listofIP4Elements,          iEI = '05'O;
+                listofIP6Elements,          iEI = '06'O
+         )"              
+}
+
+type record PDU_SNS_ChangeWeight
+{
+OCT1                     nsPduType,
+NSEI_NS                  nSEI_NS,                         //TLV
+integer                  transactionID,                   //V
+ListofIP4Elements        listofIP4Elements optional,      //TLV
+ListofIP6Elements        listofIP6Elements optional       //TLV
+} with {
+        variant (transactionID) "FIELDLENGTH(8)";
+        variant "TAG (
+                listofIP4Elements,          iEI = '05'O;
+                listofIP6Elements,          iEI = '06'O
+         )" 
+}
+
+type record PDU_SNS_Config
+{
+OCT1                     nsPduType,
+EndFlag                  endFlag,                           //V
+NSEI_NS                  nSEI_NS,                           //TLV
+ListofIP4Elements        listofIP4Elements optional,        //TLV
+ListofIP6Elements        listofIP6Elements optional         //TLV
+} with { 
+      variant "TAG (
+                listofIP4Elements,          iEI = '05'O;
+                listofIP6Elements,          iEI = '06'O
+         )" 
+}
+
+
+
+type record PDU_SNS_Config_Ack
+{
+OCT1                     nsPduType,
+NSEI_NS                  nSEI_NS,                               //TLV
+CauseNS                  causeNS               optional         //TLV
+} with { 
+      variant "TAG (causeNS,                   iEI = '00'O;)"
+}
+
+
+
+type record PDU_SNS_Delete
+{
+OCT1                     nsPduType,
+NSEI_NS                  nSEI_NS,                              //TLV
+integer                  transactionID,                        //V
+IP_Address_NS            iP_Address_NS         optional,       //TV
+ListofIP4Elements        listofIP4Elements     optional,       //TLV
+ListofIP6Elements        listofIP6Elements     optional        //TLV
+} with {
+        variant (transactionID) "FIELDLENGTH(8)";
+        variant "TAG (
+                iP_Address_NS,                        iEI = '0B'O;
+                listofIP4Elements,                iEI = '05'O;
+                listofIP6Elements,               iEI = '06'O
+        )"
+}
+
+type record PDU_SNS_Size
+{
+OCT1                     nsPduType,
+NSEI_NS                  nSEI_NS,                            //TLV
+ResetFlag                resetFlag,                          //TV
+MaxNumberOfNSVCs         maxNumberOfNSVCs,                   //TV
+NumberOfIP_Endpoints     numberOfIP4_Endpoints    optional,  //TV
+NumberOfIP_Endpoints     numberOfIP6_Endpoints    optional   //TV
+} with { 
+      variant "TAG (
+                    numberOfIP4_Endpoints,                   iEI = '08'O;      
+                    numberOfIP6_Endpoints,                   iEI = '09'O;
+      )"  
+}
+
+
+type record PDU_SNS_Size_Ack
+{
+OCT1                     nsPduType,
+NSEI_NS                  nSEI_NS,    
+CauseNS                  causeNS             optional       //TLV
+} with { 
+      variant "TAG (causeNS,                   iEI = '00'O;)"
+}
+
+
+
+type union PDU_NS
+{
+
+PDU_NS_Alive                  pDU_NS_Alive,
+PDU_NS_Alive_Ack              pDU_NS_Alive_Ack,
+PDU_NS_Block                  pDU_NS_Block,
+PDU_NS_Block_Ack              pDU_NS_Block_Ack,
+PDU_NS_Reset                  pDU_NS_Reset,
+PDU_NS_Reset_Ack              pDU_NS_Reset_Ack,
+PDU_NS_Status                 pDU_NS_Status,
+PDU_NS_Unblock                pDU_NS_Unblock,
+PDU_NS_Unblock_Ack            pDU_NS_Unblock_Ack,
+PDU_NS_Unitdata               pDU_NS_Unitdata,
+PDU_SNS_Ack                   pDU_SNS_Ack,
+PDU_SNS_Add                   pDU_SNS_Add,
+PDU_SNS_ChangeWeight          pDU_SNS_ChangeWeight,
+PDU_SNS_Config                pDU_SNS_Config,
+PDU_SNS_Config_Ack            pDU_SNS_Config_Ack,
+PDU_SNS_Delete                pDU_SNS_Delete,
+PDU_SNS_Size                  pDU_SNS_Size,
+PDU_SNS_Size_Ack              pDU_SNS_Size_Ack
+
+} with { variant "TAG (              
+                
+                pDU_NS_Alive,           nsPduType ='0A'O;
+                pDU_NS_Alive_Ack,       nsPduType ='0B'O;
+                pDU_NS_Block,           nsPduType ='04'O;
+                pDU_NS_Block_Ack,       nsPduType ='05'O;
+                pDU_NS_Reset,           nsPduType ='02'O;
+                pDU_NS_Reset_Ack,       nsPduType ='03'O;
+                pDU_NS_Status,          nsPduType ='08'O;
+                pDU_NS_Unblock,         nsPduType ='06'O;
+                pDU_NS_Unblock_Ack,     nsPduType ='07'O;
+                pDU_NS_Unitdata,        nsPduType ='00'O;
+                pDU_SNS_Ack,            nsPduType ='0C'O;
+                pDU_SNS_Add,            nsPduType ='0D'O;
+                pDU_SNS_ChangeWeight,   nsPduType ='0E'O;
+                pDU_SNS_Config,         nsPduType ='0F'O;
+                pDU_SNS_Config_Ack,     nsPduType ='10'O;
+                pDU_SNS_Delete,         nsPduType ='11'O;
+                pDU_SNS_Size,           nsPduType ='12'O;
+                pDU_SNS_Size_Ack,       nsPduType ='13'O
+
+              )"
+}
+
+
+}with{ encode "RAW"} // end of module