Bill Meier:
[metze/wireshark/wip.git] / epan / dissectors / packet-gsm_map.c
index 6000992a3027ae183999328c7927b9ee13d0b955..4bac6a9e80fcf97025ef8e89009becbc7f30497e 100644 (file)
@@ -5,6 +5,7 @@
 
 /* Input file: packet-gsm_map-template.c */
 
+#line 1 "packet-gsm_map-template.c"
 /* packet-gsm_map-template.c
  * Routines for GSM MobileApplication packet dissection
  * Copyright 2004 - 2005 , Anders Broman <anders.broman [AT] ericsson.com>
@@ -44,6 +45,7 @@
 #include <epan/prefs.h>
 #include <epan/conversation.h>
 #include <epan/tap.h>
+#include <epan/emem.h>
 
 #include <stdio.h>
 #include <string.h>
@@ -52,6 +54,7 @@
 #include "packet-q931.h"
 #include "packet-gsm_map.h"
 #include "packet-gsm_a.h"
+#include "packet-tcap.h"
 
 #define PNAME  "GSM Mobile Application"
 #define PSNAME "GSM_MAP"
 
 /* Initialize the protocol and registered fields */
 int proto_gsm_map = -1;
-static int hf_gsm_map_invokeCmd = -1;             /* Opcode */
-static int hf_gsm_map_invokeid = -1;              /* INTEGER */
-static int hf_gsm_map_absent = -1;                /* NULL */
-static int hf_gsm_map_invokeId = -1;              /* InvokeId */
-static int hf_gsm_map_invoke = -1;                /* InvokePDU */
-static int hf_gsm_map_returnResult = -1;          /* InvokePDU */
+/*
+static int hf_gsm_map_invokeCmd = -1;             / Opcode /
+static int hf_gsm_map_invokeid = -1;              / INTEGER /
+static int hf_gsm_map_absent = -1;                / NULL /
+static int hf_gsm_map_invokeId = -1;              / InvokeId /
+static int hf_gsm_map_invoke = -1;                / InvokePDU /
+static int hf_gsm_map_returnResult = -1;          / InvokePDU /
 static int hf_gsm_map_returnResult_result = -1;
 static int hf_gsm_map_returnError_result = -1;
 static int hf_gsm_map_returnError = -1;
 static int hf_gsm_map_local_errorCode = -1;
 static int hf_gsm_map_global_errorCode_oid = -1;
 static int hf_gsm_map_global_errorCode = -1;
+*/
 static int hf_gsm_map_SendAuthenticationInfoArg = -1;
 static int hf_gsm_map_SendAuthenticationInfoRes = -1;
 static int hf_gsm_mapSendEndSignal = -1;
@@ -98,7 +103,31 @@ static int hf_gsm_map_ietf_pdp_type_number = -1;
 
 
 /*--- Included file: packet-gsm_map-hf.c ---*/
-
+#line 1 "packet-gsm_map-hf.c"
+static int hf_gsm_map_Component_PDU = -1;         /* Component */
+static int hf_gsm_map_invoke = -1;                /* Invoke */
+static int hf_gsm_map_returnResultLast = -1;      /* ReturnResult */
+static int hf_gsm_map_returnError = -1;           /* ReturnError */
+static int hf_gsm_map_reject = -1;                /* Reject */
+static int hf_gsm_map_invokeID = -1;              /* InvokeIdType */
+static int hf_gsm_map_linkedID = -1;              /* InvokeIdType */
+static int hf_gsm_map_opCode = -1;                /* OPERATION */
+static int hf_gsm_map_invokeparameter = -1;       /* InvokeParameter */
+static int hf_gsm_map_resultretres = -1;          /* T_resultretres */
+static int hf_gsm_map_returnparameter = -1;       /* ReturnResultParameter */
+static int hf_gsm_map_errorCode = -1;             /* ERROR */
+static int hf_gsm_map_parameter = -1;             /* ReturnErrorParameter */
+static int hf_gsm_map_invokeIDRej = -1;           /* T_invokeIDRej */
+static int hf_gsm_map_derivable = -1;             /* InvokeIdType */
+static int hf_gsm_map_not_derivable = -1;         /* NULL */
+static int hf_gsm_map_problem = -1;               /* T_problem */
+static int hf_gsm_map_generalProblem = -1;        /* GeneralProblem */
+static int hf_gsm_map_invokeProblem = -1;         /* InvokeProblem */
+static int hf_gsm_map_returnResultProblem = -1;   /* ReturnResultProblem */
+static int hf_gsm_map_returnErrorProblem = -1;    /* ReturnErrorProblem */
+static int hf_gsm_map_localValue = -1;            /* OperationLocalvalue */
+static int hf_gsm_map_globalValue = -1;           /* OBJECT_IDENTIFIER */
+static int hf_gsm_map_localValue1 = -1;           /* LocalErrorcode */
 static int hf_gsm_map_protocolId = -1;            /* ProtocolId */
 static int hf_gsm_map_signalInfo = -1;            /* SignalInfo */
 static int hf_gsm_map_extensionContainer = -1;    /* ExtensionContainer */
@@ -132,6 +161,7 @@ static int hf_gsm_map_slr_Arg_PCS_Extensions = -1;  /* SLR_Arg_PCS_Extensions */
 static int hf_gsm_map_na_ESRK_Request = -1;       /* NULL */
 static int hf_gsm_map_identity = -1;              /* Identity */
 static int hf_gsm_map_cancellationType = -1;      /* CancellationType */
+static int hf_gsm_map_imsi_WithLMSI = -1;         /* IMSI_WithLMSI */
 static int hf_gsm_map_sgsn_Number = -1;           /* ISDN_AddressString */
 static int hf_gsm_map_freezeTMSI = -1;            /* NULL */
 static int hf_gsm_map_freezeP_TMSI = -1;          /* NULL */
@@ -455,7 +485,6 @@ static int hf_gsm_map_ext_ProtocolId = -1;        /* Ext_ProtocolId */
 static int hf_gsm_map_accessNetworkProtocolId = -1;  /* AccessNetworkProtocolId */
 static int hf_gsm_map_longsignalInfo = -1;        /* LongSignalInfo */
 static int hf_gsm_map_suppress_T_CSI = -1;        /* NULL */
-static int hf_gsm_map_imsi_WithLMSI = -1;         /* IMSI_WithLMSI */
 static int hf_gsm_map_HLR_List_item = -1;         /* HLR_Id */
 static int hf_gsm_map_SS_List_item = -1;          /* SS_Code */
 static int hf_gsm_map_naea_PreferredCIC = -1;     /* NAEA_CIC */
@@ -768,25 +797,25 @@ static int hf_gsm_map_securityParametersIndex = -1;  /* SecurityParametersIndex
 static int hf_gsm_map_originalComponentIdentifier = -1;  /* OriginalComponentIdentifier */
 static int hf_gsm_map_initialisationVector = -1;  /* InitialisationVector */
 static int hf_gsm_map_operationCode = -1;         /* OperationCode */
-static int hf_gsm_map_errorCode = -1;             /* ErrorCode */
+static int hf_gsm_map_errorCode1 = -1;            /* ErrorCode */
 static int hf_gsm_map_userInfo = -1;              /* NULL */
-static int hf_gsm_map_localValue = -1;            /* INTEGER */
-static int hf_gsm_map_globalValue = -1;           /* OBJECT_IDENTIFIER */
+static int hf_gsm_map_localValue2 = -1;           /* INTEGER */
 static int hf_gsm_map_networkResource = -1;       /* NetworkResource */
 static int hf_gsm_map_extensibleSystemFailureParam = -1;  /* T_extensibleSystemFailureParam */
 static int hf_gsm_map_unknownSubscriberDiagnostic = -1;  /* T_unknownSubscriberDiagnostic */
 static int hf_gsm_map_roamingNotAllowedCause = -1;  /* T_roamingNotAllowedCause */
-static int hf_gsm_map_absentSubscriberReason = -1;  /* T_absentSubscriberReason */
+static int hf_gsm_map_absentSubscriberReason = -1;  /* AbsentSubscriberReason */
 static int hf_gsm_map_ccbs_Busy = -1;             /* NULL */
+static int hf_gsm_map_gprsConnectionSuspended = -1;  /* NULL */
 static int hf_gsm_map_callBarringCause = -1;      /* CallBarringCause */
-static int hf_gsm_map_extensibleCallBarredParam = -1;  /* T_extensibleCallBarredParam */
+static int hf_gsm_map_extensibleCallBarredParam = -1;  /* ExtensibleCallBarredParam */
 static int hf_gsm_map_unauthorisedMessageOriginator = -1;  /* NULL */
-static int hf_gsm_map_cug_RejectCause = -1;       /* T_cug_RejectCause */
-static int hf_gsm_map_gprsConnectionSuspended = -1;  /* NULL */
-static int hf_gsm_map_sm_EnumeratedDeliveryFailureCause = -1;  /* T_sm_EnumeratedDeliveryFailureCause */
-static int hf_gsm_map_diagnosticInfo = -1;        /* OCTET_STRING_SIZE_1_200 */
+static int hf_gsm_map_cug_RejectCause = -1;       /* CUG_RejectCause */
+static int hf_gsm_map_cug_RejectCause1 = -1;      /* T_cug_RejectCause */
+static int hf_gsm_map_sm_EnumeratedDeliveryFailureCause = -1;  /* SM_EnumeratedDeliveryFailureCause */
+static int hf_gsm_map_diagnosticInfo = -1;        /* SignalInfo */
 static int hf_gsm_map_unauthorizedLCSClient_Diagnostic = -1;  /* T_unauthorizedLCSClient_Diagnostic */
-static int hf_gsm_map_positionMethodFailure_Diagnostic = -1;  /* T_positionMethodFailure_Diagnostic */
+static int hf_gsm_map_positionMethodFailure_Diagnostic = -1;  /* PositionMethodFailure_Diagnostic */
 static int hf_gsm_map_pcsExtensions = -1;         /* PcsExtensions */
 /* named bits */
 static int hf_gsm_map_SupportedCamelPhases_phase1 = -1;
@@ -895,7 +924,7 @@ static int hf_gsm_map_SupportedGADShapes_ellipsoidPointWithAltitudeAndUncertaint
 static int hf_gsm_map_SupportedGADShapes_ellipsoidArc = -1;
 
 /*--- End of included file: packet-gsm_map-hf.c ---*/
-
+#line 97 "packet-gsm_map-template.c"
 
 /* Initialize the subtree pointers */
 static gint ett_gsm_map = -1;
@@ -909,7 +938,17 @@ static gint ett_gsm_map_GSMMAPPDU = -1;
 
 
 /*--- Included file: packet-gsm_map-ett.c ---*/
-
+#line 1 "packet-gsm_map-ett.c"
+static gint ett_gsm_map_Component = -1;
+static gint ett_gsm_map_Invoke = -1;
+static gint ett_gsm_map_ReturnResult = -1;
+static gint ett_gsm_map_T_resultretres = -1;
+static gint ett_gsm_map_ReturnError = -1;
+static gint ett_gsm_map_Reject = -1;
+static gint ett_gsm_map_T_invokeIDRej = -1;
+static gint ett_gsm_map_T_problem = -1;
+static gint ett_gsm_map_OPERATION = -1;
+static gint ett_gsm_map_ERROR = -1;
 static gint ett_gsm_map_Bss_APDU = -1;
 static gint ett_gsm_map_SupportedCamelPhases = -1;
 static gint ett_gsm_map_UpdateLocationArg = -1;
@@ -924,6 +963,7 @@ static gint ett_gsm_map_SLR_ArgExtensionContainer = -1;
 static gint ett_gsm_map_PcsExtensions = -1;
 static gint ett_gsm_map_SLR_Arg_PCS_Extensions = -1;
 static gint ett_gsm_map_CancelLocationArg = -1;
+static gint ett_gsm_map_CancelLocationArgV2 = -1;
 static gint ett_gsm_map_CancelLocationRes = -1;
 static gint ett_gsm_map_PurgeMSArg = -1;
 static gint ett_gsm_map_PurgeMSRes = -1;
@@ -1249,6 +1289,7 @@ static gint ett_gsm_map_T_extensibleSystemFailureParam = -1;
 static gint ett_gsm_map_DataMissingParam = -1;
 static gint ett_gsm_map_UnexpectedDataParam = -1;
 static gint ett_gsm_map_FacilityNotSupParam = -1;
+static gint ett_gsm_map_OR_NotAllowedParam = -1;
 static gint ett_gsm_map_IncompatibleTerminalParam = -1;
 static gint ett_gsm_map_ResourceLimitationParam = -1;
 static gint ett_gsm_map_UnknownSubscriberParam = -1;
@@ -1264,29 +1305,39 @@ static gint ett_gsm_map_NoRoamingNbParam = -1;
 static gint ett_gsm_map_AbsentSubscriberParam = -1;
 static gint ett_gsm_map_BusySubscriberParam = -1;
 static gint ett_gsm_map_NoSubscriberReplyParam = -1;
-static gint ett_gsm_map_CallBarredParam = -1;
-static gint ett_gsm_map_T_extensibleCallBarredParam = -1;
+static gint ett_gsm_map_ForwardingViolationParam = -1;
 static gint ett_gsm_map_ForwardingFailedParam = -1;
+static gint ett_gsm_map_ATI_NotAllowedParam = -1;
+static gint ett_gsm_map_ATSI_NotAllowedParam = -1;
+static gint ett_gsm_map_ATM_NotAllowedParam = -1;
+static gint ett_gsm_map_IllegalSS_OperationParam = -1;
+static gint ett_gsm_map_SS_NotAvailableParam = -1;
+static gint ett_gsm_map_SS_SubscriptionViolationParam = -1;
+static gint ett_gsm_map_InformationNotAvailableParam = -1;
+static gint ett_gsm_map_SubBusyForMT_SMS_Param = -1;
+static gint ett_gsm_map_CallBarredParam = -1;
+static gint ett_gsm_map_ExtensibleCallBarredParam = -1;
+static gint ett_gsm_map_CUG_RejectParam = -1;
 static gint ett_gsm_map_Or_NotAllowedParam = -1;
-static gint ett_gsm_map_ForwardingViolationParam = -1;
 static gint ett_gsm_map_Cug_RejectParam = -1;
-static gint ett_gsm_map_Ati_NotAllowedParam = -1;
 static gint ett_gsm_map_NoGroupCallNbParam = -1;
 static gint ett_gsm_map_SS_IncompatibilityCause = -1;
 static gint ett_gsm_map_ShortTermDenialParam = -1;
 static gint ett_gsm_map_LongTermDenialParam = -1;
-static gint ett_gsm_map_SubBusyForMT_SMS_Param = -1;
-static gint ett_gsm_map_Sm_DeliveryFailureCause = -1;
+static gint ett_gsm_map_SM_DeliveryFailureCause = -1;
 static gint ett_gsm_map_MessageWaitListFullParam = -1;
 static gint ett_gsm_map_AbsentSubscriberSM_Param = -1;
 static gint ett_gsm_map_UnauthorizedRequestingNetwork_Param = -1;
 static gint ett_gsm_map_UnauthorizedLCSClient_Param = -1;
 static gint ett_gsm_map_PositionMethodFailure_Param = -1;
 static gint ett_gsm_map_UnknownOrUnreachableLCSClient_Param = -1;
+static gint ett_gsm_map_MM_EventNotSupported_Param = -1;
+static gint ett_gsm_map_TargetCellOutsideGCA_Param = -1;
+static gint ett_gsm_map_SecureTransportErrorParam = -1;
 static gint ett_gsm_map_ExtensionContainer = -1;
 
 /*--- End of included file: packet-gsm_map-ett.c ---*/
-
+#line 109 "packet-gsm_map-template.c"
 
 static dissector_table_t       sms_dissector_table;    /* SMS TPDU */
 static dissector_handle_t data_handle;
@@ -1298,13 +1349,19 @@ static range_t *ssn_range;
 dissector_handle_t     map_handle;
 
 /* Global variables */
-
+static guint32 opcode=0;
+static guint32 errorCode;
 static proto_tree *top_tree;
 static int application_context_version;
 gint protocolId;
 gint AccessNetworkProtocolId;
 static int gsm_map_tap = -1;
 
+/* Forward declarations */
+static int dissect_invokeData(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset);
+static int dissect_returnResultData(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset);
+static int dissect_returnErrorData(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset);
+
 
 char*
 unpack_digits(tvbuff_t *tvb, int offset){
@@ -1316,14 +1373,13 @@ unpack_digits(tvbuff_t *tvb, int offset){
 
        length = tvb_length(tvb);
        if (length < offset)
-               return NULL;
-       length = length - offset;
-       digit_str = g_malloc(length*2+1);
+               return "";
+       digit_str = ep_alloc((length - offset)*2+1);
 
        while ( offset < length ){
 
                octet = tvb_get_guint8(tvb,offset);
-               digit_str[i] = ((octet & 0x0f) + 0x30);
+               digit_str[i] = ((octet & 0x0f) + '0');
                i++;
 
                /*
@@ -1334,7 +1390,7 @@ unpack_digits(tvbuff_t *tvb, int offset){
                if (octet == 0x0f)      /* odd number bytes - hit filler */
                        break;
 
-               digit_str[i] = ((octet & 0x0f) + 0x30);
+               digit_str[i] = ((octet & 0x0f) + '0');
                i++;
                offset++;
 
@@ -1346,449 +1402,391 @@ unpack_digits(tvbuff_t *tvb, int offset){
 
 
 /*--- Included file: packet-gsm_map-fn.c ---*/
-
+#line 1 "packet-gsm_map-fn.c"
 /*--- Fields for imported types ---*/
 
 
 
-static const value_string gsm_map_ProtocolId_vals[] = {
-  {   1, "gsm-0408" },
-  {   2, "gsm-0806" },
-  {   3, "gsm-BSSMAP" },
-  {   4, "ets-300102-1" },
-  { 0, NULL }
-};
-
 
 static int
-dissect_gsm_map_ProtocolId(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+dissect_gsm_map_InvokeIdType(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
   offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
-                                  &protocolId);
+                                  NULL);
 
   return offset;
 }
-static int dissect_protocolId(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ProtocolId(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_protocolId);
+static int dissect_invokeID(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_InvokeIdType(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_invokeID);
+}
+static int dissect_linkedID_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_InvokeIdType(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_linkedID);
+}
+static int dissect_derivable(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_InvokeIdType(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_derivable);
 }
 
 
-
-static int
-dissect_gsm_map_SignalInfo(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
-
- tvbuff_t      *parameter_tvb;
- guint8                octet;
- guint8                length;
- tvbuff_t      *next_tvb;
+static const value_string gsm_map_OperationLocalvalue_vals[] = {
+  {   2, "updateLocation" },
+  {   3, "cancelLocation" },
+  {   4, "provideRoamingNumber" },
+  {   5, "noteSubscriberDataModified" },
+  {   6, "resumeCallHandling" },
+  {   7, "insertSubscriberData" },
+  {   8, "deleteSubscriberData" },
+  {   9, "sendParameters" },
+  {  10, "registerSS" },
+  {  11, "eraseSS" },
+  {  12, "activateSS" },
+  {  13, "deactivateSS" },
+  {  14, "interrogateSS" },
+  {  15, "authenticationFailureReport" },
+  {  17, "registerPassword" },
+  {  18, "getPassword" },
+  {  19, "processUnstructuredSS-Data" },
+  {  20, "releaseResources" },
+  {  22, "sendRoutingInfo" },
+  {  23, "updateGprsLocation" },
+  {  24, "sendRoutingInfoForGprs" },
+  {  25, "failureReport" },
+  {  26, "noteMsPresentForGprs" },
+  {  28, "performHandover" },
+  {  29, "sendEndSignal" },
+  {  30, "performSubsequentHandover" },
+  {  31, "provideSIWFSNumber" },
+  {  32, "sIWFSSignallingModify" },
+  {  33, "processAccessSignalling" },
+  {  34, "forwardAccessSignalling" },
+  {  35, "noteInternalHandover" },
+  {  37, "reset" },
+  {  38, "forwardCheckSS" },
+  {  39, "prepareGroupCall" },
+  {  40, "sendGroupCallEndSignal" },
+  {  41, "processGroupCallSignalling" },
+  {  42, "forwardGroupCallSignalling" },
+  {  43, "checkIMEI" },
+  {  44, "mt-forwardSM" },
+  {  45, "sendRoutingInfoForSM" },
+  {  46, "mo-forwardSM" },
+  {  47, "reportSM-DeliveryStatus" },
+  {  48, "noteSubscriberPresent" },
+  {  49, "alertServiceCentreWithoutResult" },
+  {  50, "activateTraceMode" },
+  {  51, "deactivateTraceMode" },
+  {  52, "traceSubscriberActivity" },
+  {  54, "beginSubscriberActivity" },
+  {  55, "sendIdentification" },
+  {  56, "sendAuthenticationInfo" },
+  {  57, "restoreData" },
+  {  58, "sendIMSI" },
+  {  59, "processUnstructuredSS-Request" },
+  {  60, "unstructuredSS-Request" },
+  {  61, "unstructuredSS-Notify" },
+  {  62, "anyTimeSubscriptionInterrogation" },
+  {  63, "informServiceCentre" },
+  {  64, "alertServiceCentre" },
+  {  65, "anyTimeModification" },
+  {  66, "readyForSM" },
+  {  67, "purgeMS" },
+  {  68, "prepareHandover" },
+  {  69, "prepareSubsequentHandover" },
+  {  70, "provideSubscriberInfo" },
+  {  71, "anyTimeInterrogation" },
+  {  72, "ss-InvocationNotification" },
+  {  73, "setReportingState" },
+  {  74, "statusReport" },
+  {  75, "remoteUserFree" },
+  {  76, "registerCC-Entry" },
+  {  77, "eraseCC-Entry" },
+  {  78, "secureTransportClass1" },
+  {  79, "secureTransportClass2" },
+  {  80, "secureTransportClass3" },
+  {  81, "secureTransportClass4" },
+  {  83, "provideSubscriberLocation" },
+  {  85, "sendRoutingInfoForLCS" },
+  {  86, "subscriberLocationReport" },
+  {  87, "ist-Alert" },
+  {  88, "ist-Command" },
+  {  89, "noteMM-Event" },
+  { 0, NULL }
+};
 
 
-  offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
-                                       &parameter_tvb);
+static int
+dissect_gsm_map_OperationLocalvalue(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+#line 137 "gsmmap.cnf"
 
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  &opcode);
+  if (check_col(pinfo->cinfo, COL_INFO)){
+    col_append_fstr(pinfo->cinfo, COL_INFO, val_to_str(opcode, gsm_map_opr_code_strings, "Unknown GSM-MAP (%u)"));
+  }
 
- if (!parameter_tvb)
-       return offset;
- switch (protocolId){
-       /* gsm-0408 */
-       case 1:
-               break;
-       /* gsm-0806 */
-       case 2:
-               break;
-       /* gsm-BSSMAP TODO Is it correct to stripp off tw first octets here?*/
-       case 3:
-               octet = tvb_get_guint8(parameter_tvb,0);
-               length = tvb_get_guint8(parameter_tvb,1);
-               if ( octet == 0) {/* DISCRIMINATION TS 48 006 */
-                       next_tvb = tvb_new_subset(parameter_tvb, 2, -1, -1);
-                       dissect_bssmap(next_tvb, pinfo, tree);
-               }
-               break;
-       /* ets-300102-1 (~Q.931 ) */
-       case 4:
-               octet = tvb_get_guint8(parameter_tvb,0);
-               length = tvb_get_guint8(parameter_tvb,1);
-               if ( octet == 4 )
-                       dissect_q931_bearer_capability_ie(parameter_tvb, 2, length, tree);
-               break;
-       default:
-               break;
-}
 
 
   return offset;
 }
-static int dissect_signalInfo(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_SignalInfo(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_signalInfo);
+static int dissect_localValue(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_OperationLocalvalue(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_localValue);
 }
 
 
 
 static int
 dissect_gsm_map_OBJECT_IDENTIFIER(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
-  offset = dissect_ber_object_identifier(implicit_tag, pinfo, tree, tvb, offset, hf_index,
-                                            NULL);
+  offset = dissect_ber_object_identifier(implicit_tag, pinfo, tree, tvb, offset, hf_index, NULL);
 
   return offset;
 }
+static int dissect_globalValue(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_OBJECT_IDENTIFIER(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_globalValue);
+}
 static int dissect_extId(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
   return dissect_gsm_map_OBJECT_IDENTIFIER(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_extId);
 }
-static int dissect_globalValue(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_OBJECT_IDENTIFIER(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_globalValue);
+
+
+static const value_string gsm_map_OPERATION_vals[] = {
+  {   0, "localValue" },
+  {   1, "globalValue" },
+  { 0, NULL }
+};
+
+static const ber_choice_t OPERATION_choice[] = {
+  {   0, BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_localValue },
+  {   1, BER_CLASS_UNI, BER_UNI_TAG_OID, BER_FLAGS_NOOWNTAG, dissect_globalValue },
+  { 0, 0, 0, 0, NULL }
+};
+
+static int
+dissect_gsm_map_OPERATION(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_choice(pinfo, tree, tvb, offset,
+                                 OPERATION_choice, hf_index, ett_gsm_map_OPERATION,
+                                 NULL);
+
+  return offset;
+}
+static int dissect_opCode(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_OPERATION(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_opCode);
 }
 
 
 
 static int
-dissect_gsm_map_T_extType(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+dissect_gsm_map_InvokeParameter(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+#line 124 "gsmmap.cnf"
+       offset = dissect_invokeData(pinfo, tree, tvb, offset);
 
-  proto_tree_add_text(tree, tvb, offset, -1, "Extension Data");
-  call_dissector(data_handle, tvb, pinfo, tree);       
-  offset = tvb_length_remaining(tvb,offset);           
 
 
   return offset;
 }
-static int dissect_extType(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_T_extType(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_extType);
+static int dissect_invokeparameter(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_InvokeParameter(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_invokeparameter);
 }
 
 
-static const ber_sequence_t PrivateExtension_sequence[] = {
-  { BER_CLASS_UNI, BER_UNI_TAG_OID, BER_FLAGS_NOOWNTAG, dissect_extId },
-  { BER_CLASS_ANY, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_extType },
+static const ber_sequence_t Invoke_sequence[] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_invokeID },
+  { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_linkedID_impl },
+  { BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_opCode },
+  { BER_CLASS_ANY, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_invokeparameter },
   { 0, 0, 0, NULL }
 };
 
 static int
-dissect_gsm_map_PrivateExtension(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+dissect_gsm_map_Invoke(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
   offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
-                                   PrivateExtension_sequence, hf_index, ett_gsm_map_PrivateExtension);
+                                   Invoke_sequence, hf_index, ett_gsm_map_Invoke);
 
   return offset;
 }
-static int dissect_PrivateExtensionList_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_PrivateExtension(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_PrivateExtensionList_item);
+static int dissect_invoke_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_Invoke(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_invoke);
 }
 
 
-static const ber_sequence_t PrivateExtensionList_sequence_of[1] = {
-  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_PrivateExtensionList_item },
-};
 
 static int
-dissect_gsm_map_PrivateExtensionList(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
-  offset = dissect_ber_sequence_of(implicit_tag, pinfo, tree, tvb, offset,
-                                      PrivateExtensionList_sequence_of, hf_index, ett_gsm_map_PrivateExtensionList);
+dissect_gsm_map_ReturnResultParameter(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+#line 127 "gsmmap.cnf"
+       offset = dissect_returnResultData(pinfo, tree, tvb, offset);
+
+
 
   return offset;
 }
-static int dissect_privateExtensionList_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_PrivateExtensionList(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_privateExtensionList);
+static int dissect_returnparameter(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ReturnResultParameter(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_returnparameter);
 }
 
 
-static const ber_sequence_t PcsExtensions_sequence[] = {
+static const ber_sequence_t T_resultretres_sequence[] = {
+  { BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_opCode },
+  { BER_CLASS_ANY, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_returnparameter },
   { 0, 0, 0, NULL }
 };
 
 static int
-dissect_gsm_map_PcsExtensions(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+dissect_gsm_map_T_resultretres(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
   offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
-                                   PcsExtensions_sequence, hf_index, ett_gsm_map_PcsExtensions);
+                                   T_resultretres_sequence, hf_index, ett_gsm_map_T_resultretres);
 
   return offset;
 }
-static int dissect_pcsExtensions_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_PcsExtensions(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_pcsExtensions);
+static int dissect_resultretres(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_T_resultretres(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_resultretres);
 }
 
 
-static const ber_sequence_t ExtensionContainer_sequence[] = {
-  { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_privateExtensionList_impl },
-  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_pcsExtensions_impl },
+static const ber_sequence_t ReturnResult_sequence[] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_invokeID },
+  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_resultretres },
   { 0, 0, 0, NULL }
 };
 
-int
-dissect_gsm_map_ExtensionContainer(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+static int
+dissect_gsm_map_ReturnResult(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
   offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
-                                   ExtensionContainer_sequence, hf_index, ett_gsm_map_ExtensionContainer);
+                                   ReturnResult_sequence, hf_index, ett_gsm_map_ReturnResult);
 
   return offset;
 }
-static int dissect_extensionContainer(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ExtensionContainer(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_extensionContainer);
-}
-static int dissect_extensionContainer_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ExtensionContainer(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_extensionContainer);
+static int dissect_returnResultLast_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ReturnResult(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_returnResultLast);
 }
 
 
-static const ber_sequence_t Bss_APDU_sequence[] = {
-  { BER_CLASS_UNI, BER_UNI_TAG_ENUMERATED, BER_FLAGS_NOOWNTAG, dissect_protocolId },
-  { BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_NOOWNTAG, dissect_signalInfo },
-  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_extensionContainer },
-  { 0, 0, 0, NULL }
+static const value_string gsm_map_LocalErrorcode_vals[] = {
+  {  34, "systemFailure" },
+  {  35, "dataMissing" },
+  {  36, "unexpectedDataValue" },
+  {  21, "facilityNotSupported" },
+  {  28, "incompatibleTerminal" },
+  {  51, "resourceLimitation" },
+  {   1, "unknownSubscriber" },
+  {  44, "numberChanged" },
+  {   3, "unknownMSC" },
+  {   5, "unidentifiedSubscriber" },
+  {   7, "unknownEquipment" },
+  {   8, "roamingNotAllowed" },
+  {   9, "illegalSubscriber" },
+  {  12, "illegalEquipment" },
+  {  10, "bearerServiceNotProvisioned" },
+  {  11, "teleserviceNotProvisioned" },
+  {  25, "noHandoverNumberAvailable" },
+  {  26, "subsequentHandoverFailure" },
+  {  42, "targetCellOutsideGroupCallArea" },
+  {  40, "tracingBufferFull" },
+  {  39, "noRoamingNumberAvailable" },
+  {  27, "absentSubscriber" },
+  {  45, "busySubscriber" },
+  {  46, "noSubscriberReply" },
+  {  13, "callBarred" },
+  {  14, "forwardingViolation" },
+  {  47, "forwardingFailed" },
+  {  15, "cug-Reject" },
+  {  48, "or-NotAllowed" },
+  {  49, "ati-NotAllowed" },
+  {  60, "atsi-NotAllowed" },
+  {  61, "atm-NotAllowed" },
+  {  62, "informationNotAvailabl" },
+  {  16, "illegalSS-Operation" },
+  {  17, "ss-ErrorStatus" },
+  {  18, "ss-NotAvailable" },
+  {  19, "ss-SubscriptionViolatio" },
+  {  20, "ss-Incompatibility" },
+  {  71, "unknownAlphabe" },
+  {  72, "ussd-Busy" },
+  {  37, "pw-RegistrationFailur" },
+  {  38, "negativePW-Check" },
+  {  43, "numberOfPW-AttemptsViolation" },
+  {  29, "shortTermDenial" },
+  {  30, "longTermDenial" },
+  {  31, "subscriberBusyForMT-SMS" },
+  {  32, "sm-DeliveryFailure" },
+  {  33, "messageWaitingListFull" },
+  {   6, "absentSubscriberSM" },
+  {  50, "noGroupCallNumberAvailable" },
+  {  52, "unauthorizedRequestingNetwork" },
+  {  53, "unauthorizedLCSClient" },
+  {  54, "positionMethodFailure" },
+  {  58, "unknownOrUnreachableLCSClient" },
+  {  59, "mm-EventNotSupported" },
+  {   4, "secureTransportError" },
+  { 0, NULL }
 };
 
+
 static int
-dissect_gsm_map_Bss_APDU(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
-  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
-                                   Bss_APDU_sequence, hf_index, ett_gsm_map_Bss_APDU);
+dissect_gsm_map_LocalErrorcode(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  &errorCode);
 
   return offset;
 }
-static int dissect_bss_APDU(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_Bss_APDU(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_bss_APDU);
+static int dissect_localValue1(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_LocalErrorcode(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_localValue1);
 }
 
 
+static const value_string gsm_map_ERROR_vals[] = {
+  {   0, "localValue" },
+  {   1, "globalValue" },
+  { 0, NULL }
+};
+
+static const ber_choice_t ERROR_choice[] = {
+  {   0, BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_localValue1 },
+  {   1, BER_CLASS_UNI, BER_UNI_TAG_OID, BER_FLAGS_NOOWNTAG, dissect_globalValue },
+  { 0, 0, 0, 0, NULL }
+};
 
 static int
-dissect_gsm_map_SignalInfo2(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
-  offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
-                                       NULL);
+dissect_gsm_map_ERROR(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_choice(pinfo, tree, tvb, offset,
+                                 ERROR_choice, hf_index, ett_gsm_map_ERROR,
+                                 NULL);
 
   return offset;
 }
+static int dissect_errorCode(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ERROR(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_errorCode);
+}
 
 
-static const asn_namedbit SupportedCamelPhases_bits[] = {
-  {  0, &hf_gsm_map_SupportedCamelPhases_phase1, -1, -1, "phase1", NULL },
-  {  1, &hf_gsm_map_SupportedCamelPhases_phase2, -1, -1, "phase2", NULL },
-  {  2, &hf_gsm_map_SupportedCamelPhases_phase3, -1, -1, "phase3", NULL },
-  {  3, &hf_gsm_map_SupportedCamelPhases_phase4, -1, -1, "phase4", NULL },
-  { 0, NULL, 0, 0, NULL, NULL }
-};
 
 static int
-dissect_gsm_map_SupportedCamelPhases(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
-  offset = dissect_ber_bitstring(implicit_tag, pinfo, tree, tvb, offset,
-                                    SupportedCamelPhases_bits, hf_index, ett_gsm_map_SupportedCamelPhases,
-                                    NULL);
-
-  return offset;
-}
-static int dissect_supportedCamelPhases(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_SupportedCamelPhases(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_supportedCamelPhases);
-}
-static int dissect_supportedCamelPhases_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_SupportedCamelPhases(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_supportedCamelPhases);
-}
-static int dissect_supportedCamelPhasesInVMSC_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_SupportedCamelPhases(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_supportedCamelPhasesInVMSC);
-}
-static int dissect_supportedCamelPhasesInInterrogatingNode_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_SupportedCamelPhases(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_supportedCamelPhasesInInterrogatingNode);
-}
-static int dissect_supportedVLR_CAMEL_Phases_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_SupportedCamelPhases(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_supportedVLR_CAMEL_Phases);
-}
-static int dissect_supportedSGSN_CAMEL_Phases_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_SupportedCamelPhases(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_supportedSGSN_CAMEL_Phases);
-}
-static int dissect_supportedCAMELPhases_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_SupportedCamelPhases(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_supportedCAMELPhases);
-}
-
-
-
-static int
-dissect_gsm_map_IMSI(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
-
- tvbuff_t      *parameter_tvb;
- char          *digit_str;
-
-   offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
-                                       &parameter_tvb);
-
-
- if (!parameter_tvb)
-       return offset;
-
- digit_str = unpack_digits(parameter_tvb, 0);
-
- proto_tree_add_string(tree, hf_gsm_map_imsi_digits, parameter_tvb, 0, -1, digit_str);
- if (digit_str)
-       g_free(digit_str);
-
-
-
-  return offset;
-}
-static int dissect_imsi(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_IMSI(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_imsi);
-}
-static int dissect_imsi_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_IMSI(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_imsi);
-}
-
-
-
-int
-dissect_gsm_map_ISDN_AddressString(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
-
- tvbuff_t      *parameter_tvb;
- char          *digit_str;
-
-  offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
-                                       &parameter_tvb);
-
-
- if (!parameter_tvb)
-       return offset;
-
- proto_tree_add_item(tree, hf_gsm_map_extension, parameter_tvb, 0,1,FALSE);
- proto_tree_add_item(tree, hf_gsm_map_nature_of_number, parameter_tvb, 0,1,FALSE);
- proto_tree_add_item(tree, hf_gsm_map_number_plan, parameter_tvb, 0,1,FALSE);
-
- digit_str = unpack_digits(parameter_tvb, 1);
-
- proto_tree_add_string(tree, hf_gsm_map_isdn_address_digits, parameter_tvb, 1, -1, digit_str);
- if (digit_str)
-       g_free(digit_str);
-
- pinfo->p2p_dir = P2P_DIR_RECV;
+dissect_gsm_map_ReturnErrorParameter(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+#line 130 "gsmmap.cnf"
+       offset = dissect_returnErrorData(pinfo, tree, tvb, offset);
 
 
 
   return offset;
 }
-static int dissect_msc_Number(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ISDN_AddressString(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_msc_Number);
-}
-static int dissect_msc_Number_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_msc_Number);
-}
-static int dissect_vlr_Number(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ISDN_AddressString(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_vlr_Number);
-}
-static int dissect_vlr_Number_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_vlr_Number);
-}
-static int dissect_hlr_Number(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ISDN_AddressString(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_hlr_Number);
-}
-static int dissect_sgsn_Number(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ISDN_AddressString(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_sgsn_Number);
-}
-static int dissect_sgsn_Number_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_sgsn_Number);
-}
-static int dissect_handoverNumber(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ISDN_AddressString(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_handoverNumber);
-}
-static int dissect_handoverNumber_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_handoverNumber);
-}
-static int dissect_targetMSC_Number(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ISDN_AddressString(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_targetMSC_Number);
-}
-static int dissect_targetMSC_Number_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_targetMSC_Number);
-}
-static int dissect_gsmSCF_Address(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ISDN_AddressString(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_gsmSCF_Address);
-}
-static int dissect_gsmSCF_Address_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_gsmSCF_Address);
-}
-static int dissect_msisdn(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ISDN_AddressString(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_msisdn);
-}
-static int dissect_msisdn_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_msisdn);
-}
-static int dissect_GMLC_List_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ISDN_AddressString(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_GMLC_List_item);
-}
-static int dissect_dialledNumber(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ISDN_AddressString(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_dialledNumber);
-}
-static int dissect_forwardedToNumber_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_forwardedToNumber);
-}
-static int dissect_DestinationNumberList_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ISDN_AddressString(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_DestinationNumberList_item);
-}
-static int dissect_gmsc_OrGsmSCF_Address_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_gmsc_OrGsmSCF_Address);
-}
-static int dissect_vmsc_Address_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_vmsc_Address);
-}
-static int dissect_externalAddress_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_externalAddress);
-}
-static int dissect_roamingNumber(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ISDN_AddressString(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_roamingNumber);
-}
-static int dissect_vlr_number_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_vlr_number);
-}
-static int dissect_gmsc_Address_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_gmsc_Address);
-}
-static int dissect_b_Subscriber_Address_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_b_Subscriber_Address);
-}
-static int dissect_sIWFSNumber_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_sIWFSNumber);
-}
-static int dissect_msrn(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ISDN_AddressString(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_msrn);
-}
-static int dissect_translatedB_Number(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ISDN_AddressString(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_translatedB_Number);
-}
-static int dissect_translatedB_Number_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_translatedB_Number);
-}
-static int dissect_networkNode_Number(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ISDN_AddressString(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_networkNode_Number);
-}
-static int dissect_networkNode_Number_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_networkNode_Number);
-}
-static int dissect_b_subscriberNumber_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_b_subscriberNumber);
-}
-static int dissect_groupCallNumber(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ISDN_AddressString(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_groupCallNumber);
-}
-static int dissect_ggsn_Number_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_ggsn_Number);
-}
-static int dissect_mlc_Number(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ISDN_AddressString(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_mlc_Number);
-}
-static int dissect_mlcNumber_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_mlcNumber);
-}
-static int dissect_na_ESRD_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_na_ESRD);
-}
-static int dissect_na_ESRK_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_na_ESRK);
+static int dissect_parameter(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ReturnErrorParameter(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_parameter);
 }
 
 
+static const ber_sequence_t ReturnError_sequence[] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_invokeID },
+  { BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_errorCode },
+  { BER_CLASS_ANY, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_parameter },
+  { 0, 0, 0, NULL }
+};
 
 static int
-dissect_gsm_map_LMSI(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
-  offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
-                                       NULL);
+dissect_gsm_map_ReturnError(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   ReturnError_sequence, hf_index, ett_gsm_map_ReturnError);
 
   return offset;
 }
-static int dissect_lmsi(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_LMSI(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_lmsi);
-}
-static int dissect_lmsi_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_LMSI(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_lmsi);
+static int dissect_returnError_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ReturnError(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_returnError);
 }
 
 
@@ -1799,6 +1797,9 @@ dissect_gsm_map_NULL(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packe
 
   return offset;
 }
+static int dissect_not_derivable(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_not_derivable);
+}
 static int dissect_informPreviousNetworkEntity_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
   return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_informPreviousNetworkEntity);
 }
@@ -1997,134 +1998,751 @@ static int dissect_ps_AttachedNotReachableForPaging_impl(packet_info *pinfo, pro
 static int dissect_ps_AttachedReachableForPaging_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
   return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_ps_AttachedReachableForPaging);
 }
-static int dissect_pdp_ContextActive_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_pdp_ContextActive);
+static int dissect_pdp_ContextActive_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_pdp_ContextActive);
+}
+static int dissect_cug_OutgoingAccess(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_cug_OutgoingAccess);
+}
+static int dissect_orNotSupportedInGMSC_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_orNotSupportedInGMSC);
+}
+static int dissect_allInformationSent(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_allInformationSent);
+}
+static int dissect_allInformationSent_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_allInformationSent);
+}
+static int dissect_uusCFInteraction_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_uusCFInteraction);
+}
+static int dissect_replaceB_Number_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_replaceB_Number);
+}
+static int dissect_gprsSupportIndicator_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_gprsSupportIndicator);
+}
+static int dissect_gprsNodeIndicator_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_gprsNodeIndicator);
+}
+static int dissect_noSM_RP_OA_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_noSM_RP_OA);
+}
+static int dissect_noSM_RP_DA_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_noSM_RP_DA);
+}
+static int dissect_moreMessagesToSend(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_moreMessagesToSend);
+}
+static int dissect_deliveryOutcomeIndicator_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_deliveryOutcomeIndicator);
+}
+static int dissect_alertReasonIndicator(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_alertReasonIndicator);
+}
+static int dissect_locationInformation_flg_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_locationInformation_flg);
+}
+static int dissect_subscriberState_flg_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_subscriberState_flg);
+}
+static int dissect_currentLocation_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_currentLocation);
+}
+static int dissect_imei_flg_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_imei_flg);
+}
+static int dissect_ms_classmark_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_ms_classmark);
+}
+static int dissect_mnpRequestedInfo_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_mnpRequestedInfo);
+}
+static int dissect_odb_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_odb);
+}
+static int dissect_supportedVLR_CAMEL_Phases_flg_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_supportedVLR_CAMEL_Phases_flg);
+}
+static int dissect_supportedSGSN_CAMEL_Phases_flg_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_supportedSGSN_CAMEL_Phases_flg);
+}
+static int dissect_tif_CSI_NotificationToCSE_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_tif_CSI_NotificationToCSE);
+}
+static int dissect_uplinkFree_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_uplinkFree);
+}
+static int dissect_uplinkRequest_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_uplinkRequest);
+}
+static int dissect_uplinkReleaseIndication_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_uplinkReleaseIndication);
+}
+static int dissect_releaseGroupCall_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_releaseGroupCall);
+}
+static int dissect_uplinkRequestAck_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_uplinkRequestAck);
+}
+static int dissect_uplinkRejectCommand_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_uplinkRejectCommand);
+}
+static int dissect_uplinkSeizedCommand_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_uplinkSeizedCommand);
+}
+static int dissect_uplinkReleaseCommand_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_uplinkReleaseCommand);
+}
+static int dissect_ps_LCS_NotSupportedByUE_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_ps_LCS_NotSupportedByUE);
+}
+static int dissect_gprsEnhancementsSupportIndicator_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_gprsEnhancementsSupportIndicator);
+}
+static int dissect_smsCallBarringSupportIndicator_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_smsCallBarringSupportIndicator);
+}
+static int dissect_privacyOverride_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_privacyOverride);
+}
+static int dissect_verticalCoordinateRequest_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_verticalCoordinateRequest);
+}
+static int dissect_deferredmt_lrResponseIndicator_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_deferredmt_lrResponseIndicator);
+}
+static int dissect_pseudonymIndicator_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_pseudonymIndicator);
+}
+static int dissect_userInfo_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_userInfo);
+}
+static int dissect_ccbs_Busy_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_ccbs_Busy);
+}
+static int dissect_gprsConnectionSuspended(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_gprsConnectionSuspended);
+}
+static int dissect_unauthorisedMessageOriginator(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_NULL(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_unauthorisedMessageOriginator);
+}
+
+
+static const value_string gsm_map_T_invokeIDRej_vals[] = {
+  {   0, "derivable" },
+  {   1, "not-derivable" },
+  { 0, NULL }
+};
+
+static const ber_choice_t T_invokeIDRej_choice[] = {
+  {   0, BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_derivable },
+  {   1, BER_CLASS_UNI, BER_UNI_TAG_NULL, BER_FLAGS_NOOWNTAG, dissect_not_derivable },
+  { 0, 0, 0, 0, NULL }
+};
+
+static int
+dissect_gsm_map_T_invokeIDRej(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_choice(pinfo, tree, tvb, offset,
+                                 T_invokeIDRej_choice, hf_index, ett_gsm_map_T_invokeIDRej,
+                                 NULL);
+
+  return offset;
+}
+static int dissect_invokeIDRej(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_T_invokeIDRej(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_invokeIDRej);
+}
+
+
+static const value_string gsm_map_GeneralProblem_vals[] = {
+  {   0, "unrecognizedComponent" },
+  {   1, "mistypedComponent" },
+  {   2, "badlyStructuredComponent" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_gsm_map_GeneralProblem(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+static int dissect_generalProblem_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_GeneralProblem(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_generalProblem);
+}
+
+
+static const value_string gsm_map_InvokeProblem_vals[] = {
+  {   0, "duplicateInvokeID" },
+  {   1, "unrecognizedOperation" },
+  {   2, "mistypedParameter" },
+  {   3, "resourceLimitation" },
+  {   4, "initiatingRelease" },
+  {   5, "unrecognizedLinkedID" },
+  {   6, "linkedResponseUnexpected" },
+  {   7, "unexpectedLinkedOperation" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_gsm_map_InvokeProblem(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+static int dissect_invokeProblem_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_InvokeProblem(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_invokeProblem);
+}
+
+
+static const value_string gsm_map_ReturnResultProblem_vals[] = {
+  {   0, "unrecognizedInvokeID" },
+  {   1, "returnResultUnexpected" },
+  {   2, "mistypedParameter" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_gsm_map_ReturnResultProblem(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+static int dissect_returnResultProblem_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ReturnResultProblem(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_returnResultProblem);
+}
+
+
+static const value_string gsm_map_ReturnErrorProblem_vals[] = {
+  {   0, "unrecognizedInvokeID" },
+  {   1, "returnErrorUnexpected" },
+  {   2, "unrecognizedError" },
+  {   3, "unexpectedError" },
+  {   4, "mistypedParameter" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_gsm_map_ReturnErrorProblem(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+static int dissect_returnErrorProblem_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ReturnErrorProblem(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_returnErrorProblem);
+}
+
+
+static const value_string gsm_map_T_problem_vals[] = {
+  {   0, "generalProblem" },
+  {   1, "invokeProblem" },
+  {   2, "returnResultProblem" },
+  {   3, "returnErrorProblem" },
+  { 0, NULL }
+};
+
+static const ber_choice_t T_problem_choice[] = {
+  {   0, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_generalProblem_impl },
+  {   1, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_invokeProblem_impl },
+  {   2, BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_returnResultProblem_impl },
+  {   3, BER_CLASS_CON, 3, BER_FLAGS_IMPLTAG, dissect_returnErrorProblem_impl },
+  { 0, 0, 0, 0, NULL }
+};
+
+static int
+dissect_gsm_map_T_problem(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_choice(pinfo, tree, tvb, offset,
+                                 T_problem_choice, hf_index, ett_gsm_map_T_problem,
+                                 NULL);
+
+  return offset;
+}
+static int dissect_problem(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_T_problem(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_problem);
+}
+
+
+static const ber_sequence_t Reject_sequence[] = {
+  { BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_invokeIDRej },
+  { BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_problem },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_gsm_map_Reject(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   Reject_sequence, hf_index, ett_gsm_map_Reject);
+
+  return offset;
+}
+static int dissect_reject_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_Reject(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_reject);
+}
+
+
+static const value_string gsm_map_Component_vals[] = {
+  {   1, "invoke" },
+  {   2, "returnResultLast" },
+  {   3, "returnError" },
+  {   4, "reject" },
+  { 0, NULL }
+};
+
+static const ber_choice_t Component_choice[] = {
+  {   1, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_invoke_impl },
+  {   2, BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_returnResultLast_impl },
+  {   3, BER_CLASS_CON, 3, BER_FLAGS_IMPLTAG, dissect_returnError_impl },
+  {   4, BER_CLASS_CON, 4, BER_FLAGS_IMPLTAG, dissect_reject_impl },
+  { 0, 0, 0, 0, NULL }
+};
+
+static int
+dissect_gsm_map_Component(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_choice(pinfo, tree, tvb, offset,
+                                 Component_choice, hf_index, ett_gsm_map_Component,
+                                 NULL);
+
+  return offset;
+}
+
+
+static const value_string gsm_map_ProtocolId_vals[] = {
+  {   1, "gsm-0408" },
+  {   2, "gsm-0806" },
+  {   3, "gsm-BSSMAP" },
+  {   4, "ets-300102-1" },
+  { 0, NULL }
+};
+
+
+static int
+dissect_gsm_map_ProtocolId(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  &protocolId);
+
+  return offset;
+}
+static int dissect_protocolId(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ProtocolId(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_protocolId);
+}
+
+
+
+static int
+dissect_gsm_map_SignalInfo(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+#line 333 "gsmmap.cnf"
+
+ tvbuff_t      *parameter_tvb;
+ guint8                octet;
+ guint8                length;
+ tvbuff_t      *next_tvb;
+
+
+  offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                       &parameter_tvb);
+
+
+ if (!parameter_tvb)
+       return offset;
+ switch (protocolId){
+       /* gsm-0408 */
+       case 1:
+               break;
+       /* gsm-0806 */
+       case 2:
+               break;
+       /* gsm-BSSMAP TODO Is it correct to stripp off two first octets here?*/
+       case 3:
+               octet = tvb_get_guint8(parameter_tvb,0);
+               length = tvb_get_guint8(parameter_tvb,1);
+               if ( octet == 0) {/* DISCRIMINATION TS 48 006 */
+                       next_tvb = tvb_new_subset(parameter_tvb, 2, -1, -1);
+                       dissect_bssmap(next_tvb, pinfo, tree);
+               }
+               break;
+       /* ets-300102-1 (~Q.931 ) */
+       case 4:
+               octet = tvb_get_guint8(parameter_tvb,0);
+               length = tvb_get_guint8(parameter_tvb,1);
+               if ( octet == 4 )
+                       dissect_q931_bearer_capability_ie(parameter_tvb, 2, length, tree);
+               break;
+       default:
+               break;
+}
+
+
+
+  return offset;
+}
+static int dissect_signalInfo(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_SignalInfo(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_signalInfo);
+}
+static int dissect_diagnosticInfo(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_SignalInfo(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_diagnosticInfo);
+}
+
+
+
+static int
+dissect_gsm_map_T_extType(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+#line 408 "gsmmap.cnf"
+
+  proto_tree_add_text(tree, tvb, offset, -1, "Extension Data");
+  call_dissector(data_handle, tvb, pinfo, tree);       
+  offset = tvb_length_remaining(tvb,offset);           
+
+
+
+  return offset;
+}
+static int dissect_extType(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_T_extType(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_extType);
+}
+
+
+static const ber_sequence_t PrivateExtension_sequence[] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_OID, BER_FLAGS_NOOWNTAG, dissect_extId },
+  { BER_CLASS_ANY, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_extType },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_gsm_map_PrivateExtension(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   PrivateExtension_sequence, hf_index, ett_gsm_map_PrivateExtension);
+
+  return offset;
+}
+static int dissect_PrivateExtensionList_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_PrivateExtension(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_PrivateExtensionList_item);
+}
+
+
+static const ber_sequence_t PrivateExtensionList_sequence_of[1] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_PrivateExtensionList_item },
+};
+
+static int
+dissect_gsm_map_PrivateExtensionList(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence_of(implicit_tag, pinfo, tree, tvb, offset,
+                                      PrivateExtensionList_sequence_of, hf_index, ett_gsm_map_PrivateExtensionList);
+
+  return offset;
+}
+static int dissect_privateExtensionList_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_PrivateExtensionList(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_privateExtensionList);
+}
+
+
+static const ber_sequence_t PcsExtensions_sequence[] = {
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_gsm_map_PcsExtensions(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   PcsExtensions_sequence, hf_index, ett_gsm_map_PcsExtensions);
+
+  return offset;
+}
+static int dissect_pcsExtensions_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_PcsExtensions(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_pcsExtensions);
+}
+
+
+static const ber_sequence_t ExtensionContainer_sequence[] = {
+  { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_privateExtensionList_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_pcsExtensions_impl },
+  { 0, 0, 0, NULL }
+};
+
+int
+dissect_gsm_map_ExtensionContainer(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   ExtensionContainer_sequence, hf_index, ett_gsm_map_ExtensionContainer);
+
+  return offset;
+}
+static int dissect_extensionContainer(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ExtensionContainer(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_extensionContainer);
+}
+static int dissect_extensionContainer_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ExtensionContainer(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_extensionContainer);
+}
+
+
+static const ber_sequence_t Bss_APDU_sequence[] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_ENUMERATED, BER_FLAGS_NOOWNTAG, dissect_protocolId },
+  { BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_NOOWNTAG, dissect_signalInfo },
+  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_extensionContainer },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_gsm_map_Bss_APDU(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   Bss_APDU_sequence, hf_index, ett_gsm_map_Bss_APDU);
+
+  return offset;
+}
+static int dissect_bss_APDU(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_Bss_APDU(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_bss_APDU);
+}
+
+
+
+static int
+dissect_gsm_map_SignalInfo2(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                       NULL);
+
+  return offset;
+}
+
+
+static const asn_namedbit SupportedCamelPhases_bits[] = {
+  {  0, &hf_gsm_map_SupportedCamelPhases_phase1, -1, -1, "phase1", NULL },
+  {  1, &hf_gsm_map_SupportedCamelPhases_phase2, -1, -1, "phase2", NULL },
+  {  2, &hf_gsm_map_SupportedCamelPhases_phase3, -1, -1, "phase3", NULL },
+  {  3, &hf_gsm_map_SupportedCamelPhases_phase4, -1, -1, "phase4", NULL },
+  { 0, NULL, 0, 0, NULL, NULL }
+};
+
+int
+dissect_gsm_map_SupportedCamelPhases(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_bitstring(implicit_tag, pinfo, tree, tvb, offset,
+                                    SupportedCamelPhases_bits, hf_index, ett_gsm_map_SupportedCamelPhases,
+                                    NULL);
+
+  return offset;
+}
+static int dissect_supportedCamelPhases(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_SupportedCamelPhases(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_supportedCamelPhases);
+}
+static int dissect_supportedCamelPhases_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_SupportedCamelPhases(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_supportedCamelPhases);
+}
+static int dissect_supportedCamelPhasesInVMSC_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_SupportedCamelPhases(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_supportedCamelPhasesInVMSC);
+}
+static int dissect_supportedCamelPhasesInInterrogatingNode_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_SupportedCamelPhases(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_supportedCamelPhasesInInterrogatingNode);
+}
+static int dissect_supportedVLR_CAMEL_Phases_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_SupportedCamelPhases(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_supportedVLR_CAMEL_Phases);
+}
+static int dissect_supportedSGSN_CAMEL_Phases_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_SupportedCamelPhases(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_supportedSGSN_CAMEL_Phases);
+}
+static int dissect_supportedCAMELPhases_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_SupportedCamelPhases(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_supportedCAMELPhases);
+}
+
+
+
+int
+dissect_gsm_map_IMSI(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+#line 171 "gsmmap.cnf"
+
+ tvbuff_t      *parameter_tvb;
+ char          *digit_str;
+
+   offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                       &parameter_tvb);
+
+
+ if (!parameter_tvb)
+       return offset;
+
+ digit_str = unpack_digits(parameter_tvb, 0);
+
+ proto_tree_add_string(tree, hf_gsm_map_imsi_digits, parameter_tvb, 0, -1, digit_str);
+
+
+
+
+  return offset;
+}
+static int dissect_imsi(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_IMSI(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_imsi);
+}
+static int dissect_imsi_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_IMSI(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_imsi);
+}
+
+
+
+int
+dissect_gsm_map_ISDN_AddressString(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+#line 218 "gsmmap.cnf"
+
+ tvbuff_t      *parameter_tvb;
+ char          *digit_str;
+
+  offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                       &parameter_tvb);
+
+
+ if (!parameter_tvb)
+       return offset;
+
+ proto_tree_add_item(tree, hf_gsm_map_extension, parameter_tvb, 0,1,FALSE);
+ proto_tree_add_item(tree, hf_gsm_map_nature_of_number, parameter_tvb, 0,1,FALSE);
+ proto_tree_add_item(tree, hf_gsm_map_number_plan, parameter_tvb, 0,1,FALSE);
+
+ digit_str = unpack_digits(parameter_tvb, 1);
+
+ proto_tree_add_string(tree, hf_gsm_map_isdn_address_digits, parameter_tvb, 1, -1, digit_str);
+
+ pinfo->p2p_dir = P2P_DIR_RECV;
+
+
+
+
+  return offset;
 }
-static int dissect_cug_OutgoingAccess(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_cug_OutgoingAccess);
+static int dissect_msc_Number(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ISDN_AddressString(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_msc_Number);
 }
-static int dissect_orNotSupportedInGMSC_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_orNotSupportedInGMSC);
+static int dissect_msc_Number_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_msc_Number);
 }
-static int dissect_allInformationSent(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_allInformationSent);
+static int dissect_vlr_Number(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ISDN_AddressString(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_vlr_Number);
 }
-static int dissect_allInformationSent_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_allInformationSent);
+static int dissect_vlr_Number_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_vlr_Number);
 }
-static int dissect_uusCFInteraction_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_uusCFInteraction);
+static int dissect_hlr_Number(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ISDN_AddressString(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_hlr_Number);
 }
-static int dissect_replaceB_Number_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_replaceB_Number);
+static int dissect_sgsn_Number(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ISDN_AddressString(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_sgsn_Number);
 }
-static int dissect_gprsSupportIndicator_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_gprsSupportIndicator);
+static int dissect_sgsn_Number_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_sgsn_Number);
 }
-static int dissect_gprsNodeIndicator_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_gprsNodeIndicator);
+static int dissect_handoverNumber(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ISDN_AddressString(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_handoverNumber);
 }
-static int dissect_noSM_RP_OA_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_noSM_RP_OA);
+static int dissect_handoverNumber_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_handoverNumber);
 }
-static int dissect_noSM_RP_DA_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_noSM_RP_DA);
+static int dissect_targetMSC_Number(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ISDN_AddressString(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_targetMSC_Number);
 }
-static int dissect_moreMessagesToSend(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_moreMessagesToSend);
+static int dissect_targetMSC_Number_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_targetMSC_Number);
 }
-static int dissect_deliveryOutcomeIndicator_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_deliveryOutcomeIndicator);
+static int dissect_gsmSCF_Address(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ISDN_AddressString(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_gsmSCF_Address);
 }
-static int dissect_alertReasonIndicator(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_alertReasonIndicator);
+static int dissect_gsmSCF_Address_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_gsmSCF_Address);
 }
-static int dissect_locationInformation_flg_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_locationInformation_flg);
+static int dissect_msisdn(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ISDN_AddressString(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_msisdn);
 }
-static int dissect_subscriberState_flg_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_subscriberState_flg);
+static int dissect_msisdn_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_msisdn);
 }
-static int dissect_currentLocation_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_currentLocation);
+static int dissect_GMLC_List_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ISDN_AddressString(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_GMLC_List_item);
 }
-static int dissect_imei_flg_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_imei_flg);
+static int dissect_dialledNumber(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ISDN_AddressString(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_dialledNumber);
 }
-static int dissect_ms_classmark_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_ms_classmark);
+static int dissect_forwardedToNumber_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_forwardedToNumber);
 }
-static int dissect_mnpRequestedInfo_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_mnpRequestedInfo);
+static int dissect_DestinationNumberList_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ISDN_AddressString(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_DestinationNumberList_item);
 }
-static int dissect_odb_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_odb);
+static int dissect_gmsc_OrGsmSCF_Address_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_gmsc_OrGsmSCF_Address);
 }
-static int dissect_supportedVLR_CAMEL_Phases_flg_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_supportedVLR_CAMEL_Phases_flg);
+static int dissect_vmsc_Address_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_vmsc_Address);
 }
-static int dissect_supportedSGSN_CAMEL_Phases_flg_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_supportedSGSN_CAMEL_Phases_flg);
+static int dissect_externalAddress_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_externalAddress);
 }
-static int dissect_tif_CSI_NotificationToCSE_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_tif_CSI_NotificationToCSE);
+static int dissect_roamingNumber(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ISDN_AddressString(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_roamingNumber);
 }
-static int dissect_uplinkFree_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_uplinkFree);
+static int dissect_vlr_number_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_vlr_number);
 }
-static int dissect_uplinkRequest_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_uplinkRequest);
+static int dissect_gmsc_Address_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_gmsc_Address);
 }
-static int dissect_uplinkReleaseIndication_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_uplinkReleaseIndication);
+static int dissect_b_Subscriber_Address_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_b_Subscriber_Address);
 }
-static int dissect_releaseGroupCall_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_releaseGroupCall);
+static int dissect_sIWFSNumber_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_sIWFSNumber);
 }
-static int dissect_uplinkRequestAck_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_uplinkRequestAck);
+static int dissect_msrn(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ISDN_AddressString(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_msrn);
 }
-static int dissect_uplinkRejectCommand_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_uplinkRejectCommand);
+static int dissect_translatedB_Number(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ISDN_AddressString(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_translatedB_Number);
 }
-static int dissect_uplinkSeizedCommand_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_uplinkSeizedCommand);
+static int dissect_translatedB_Number_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_translatedB_Number);
 }
-static int dissect_uplinkReleaseCommand_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_uplinkReleaseCommand);
+static int dissect_networkNode_Number(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ISDN_AddressString(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_networkNode_Number);
 }
-static int dissect_ps_LCS_NotSupportedByUE_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_ps_LCS_NotSupportedByUE);
+static int dissect_networkNode_Number_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_networkNode_Number);
 }
-static int dissect_gprsEnhancementsSupportIndicator_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_gprsEnhancementsSupportIndicator);
+static int dissect_b_subscriberNumber_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_b_subscriberNumber);
 }
-static int dissect_smsCallBarringSupportIndicator_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_smsCallBarringSupportIndicator);
+static int dissect_groupCallNumber(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ISDN_AddressString(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_groupCallNumber);
 }
-static int dissect_privacyOverride_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_privacyOverride);
+static int dissect_ggsn_Number_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_ggsn_Number);
 }
-static int dissect_verticalCoordinateRequest_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_verticalCoordinateRequest);
+static int dissect_mlc_Number(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ISDN_AddressString(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_mlc_Number);
 }
-static int dissect_deferredmt_lrResponseIndicator_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_deferredmt_lrResponseIndicator);
+static int dissect_mlcNumber_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_mlcNumber);
 }
-static int dissect_pseudonymIndicator_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_pseudonymIndicator);
+static int dissect_na_ESRD_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_na_ESRD);
 }
-static int dissect_userInfo_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_userInfo);
+static int dissect_na_ESRK_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ISDN_AddressString(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_na_ESRK);
 }
-static int dissect_ccbs_Busy_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_ccbs_Busy);
+
+
+
+static int
+dissect_gsm_map_LMSI(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                       NULL);
+
+  return offset;
 }
-static int dissect_unauthorisedMessageOriginator_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_unauthorisedMessageOriginator);
+static int dissect_lmsi(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_LMSI(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_lmsi);
 }
-static int dissect_gprsConnectionSuspended(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_gprsConnectionSuspended);
+static int dissect_lmsi_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_LMSI(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_lmsi);
 }
 
 
@@ -2326,7 +2944,7 @@ dissect_gsm_map_TBCD_STRING(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset
 
 
 
-static int
+int
 dissect_gsm_map_IMEI(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
   offset = dissect_gsm_map_TBCD_STRING(implicit_tag, tvb, offset, pinfo, tree, hf_index);
 
@@ -2549,6 +3167,28 @@ dissect_gsm_map_CancelLocationArg(gboolean implicit_tag _U_, tvbuff_t *tvb, int
 }
 
 
+static const value_string gsm_map_CancelLocationArgV2_vals[] = {
+  {   0, "imsi" },
+  {   1, "imsi-WithLMSI" },
+  { 0, NULL }
+};
+
+static const ber_choice_t CancelLocationArgV2_choice[] = {
+  {   0, BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_NOOWNTAG, dissect_imsi },
+  {   1, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_imsi_WithLMSI },
+  { 0, 0, 0, 0, NULL }
+};
+
+static int
+dissect_gsm_map_CancelLocationArgV2(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_choice(pinfo, tree, tvb, offset,
+                                 CancelLocationArgV2_choice, hf_index, ett_gsm_map_CancelLocationArgV2,
+                                 NULL);
+
+  return offset;
+}
+
+
 static const ber_sequence_t CancelLocationRes_sequence[] = {
   { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_extensionContainer },
   { 0, 0, 0, NULL }
@@ -3047,6 +3687,7 @@ static int dissect_accessNetworkProtocolId(packet_info *pinfo, proto_tree *tree,
 
 static int
 dissect_gsm_map_LongSignalInfo(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+#line 377 "gsmmap.cnf"
 
  tvbuff_t      *parameter_tvb;
  guint8                octet;
@@ -3079,6 +3720,7 @@ dissect_gsm_map_LongSignalInfo(gboolean implicit_tag _U_, tvbuff_t *tvb, int off
 
  }
 
+
   return offset;
 }
 static int dissect_longsignalInfo(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
@@ -4592,7 +5234,7 @@ static int dissect_SS_EventList_item(packet_info *pinfo, proto_tree *tree, tvbuf
 }
 
 
-static const value_string gsm_map_Ext_BasicServiceCode_vals[] = {
+const value_string gsm_map_Ext_BasicServiceCode_vals[] = {
   {   2, "ext-BearerService" },
   {   3, "ext-Teleservice" },
   { 0, NULL }
@@ -4604,7 +5246,7 @@ static const ber_choice_t Ext_BasicServiceCode_choice[] = {
   { 0, 0, 0, 0, NULL }
 };
 
-static int
+int
 dissect_gsm_map_Ext_BasicServiceCode(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
   offset = dissect_ber_choice(pinfo, tree, tvb, offset,
                                  Ext_BasicServiceCode_choice, hf_index, ett_gsm_map_Ext_BasicServiceCode,
@@ -4644,6 +5286,7 @@ static int dissect_BasicServiceCriteria_item(packet_info *pinfo, proto_tree *tre
 
 static int
 dissect_gsm_map_Ext_SS_Status(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+#line 295 "gsmmap.cnf"
  /* Note Ext-SS-Status can have more than one byte */
 
  tvbuff_t      *parameter_tvb;
@@ -4668,6 +5311,7 @@ dissect_gsm_map_Ext_SS_Status(gboolean implicit_tag _U_, tvbuff_t *tvb, int offs
 
 
 
+
   return offset;
 }
 static int dissect_ext_ss_Status(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
@@ -4709,12 +5353,14 @@ static int
 dissect_gsm_map_T_forwardingOptions(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
   offset = dissect_gsm_map_Ext_ForwOptions(implicit_tag, tvb, offset, pinfo, tree, hf_index);
 
+#line 421 "gsmmap.cnf"
 
        proto_tree_add_item(tree, hf_gsm_map_notification_to_forwarding_party, tvb, 0,1,FALSE);
        proto_tree_add_item(tree, hf_gsm_map_redirecting_presentation, tvb, 0,1,FALSE);
        proto_tree_add_item(tree, hf_gsm_map_notification_to_calling_party, tvb, 0,1,FALSE);
        proto_tree_add_item(tree, hf_gsm_map_forwarding_reason, tvb, 0,1,FALSE);
 
+
   return offset;
 }
 static int dissect_ext_forwardingOptions_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
@@ -4738,6 +5384,7 @@ static int dissect_ext_noReplyConditionTime_impl(packet_info *pinfo, proto_tree
 
 int
 dissect_gsm_map_AddressString(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+#line 245 "gsmmap.cnf"
 
  tvbuff_t      *parameter_tvb;
  char          *digit_str;
@@ -4756,8 +5403,7 @@ dissect_gsm_map_AddressString(gboolean implicit_tag _U_, tvbuff_t *tvb, int offs
  digit_str = unpack_digits(parameter_tvb, 1);
 
  proto_tree_add_string(tree, hf_gsm_map_address_digits, parameter_tvb, 1, -1, digit_str);
- if (digit_str)
-       g_free(digit_str);
+
 
 
   return offset;
@@ -4918,7 +5564,7 @@ static int dissect_preferentialCUG_Indicator(packet_info *pinfo, proto_tree *tre
 
 
 
-static int
+int
 dissect_gsm_map_CUG_Interlock(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
   offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
                                        NULL);
@@ -5059,7 +5705,7 @@ static const ber_sequence_t CUG_Info_sequence[] = {
   { 0, 0, 0, NULL }
 };
 
-static int
+int
 dissect_gsm_map_CUG_Info(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
   offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
                                    CUG_Info_sequence, hf_index, ett_gsm_map_CUG_Info);
@@ -6136,6 +6782,7 @@ static int dissect_pdp_ContextIdentifier_impl(packet_info *pinfo, proto_tree *tr
 
 static int
 dissect_gsm_map_PDP_Type(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+#line 432 "gsmmap.cnf"
        guint8 pdp_type_org;
        tvbuff_t        *parameter_tvb;
 
@@ -6160,6 +6807,7 @@ dissect_gsm_map_PDP_Type(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, p
        }
 
 
+
   return offset;
 }
 static int dissect_pdp_Type_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
@@ -6181,8 +6829,9 @@ static int dissect_pdp_Address_impl(packet_info *pinfo, proto_tree *tree, tvbuff
 
 
 
-static int
+int
 dissect_gsm_map_QoS_Subscribed(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+#line 458 "gsmmap.cnf"
 
        tvbuff_t        *parameter_tvb;
 
@@ -6196,6 +6845,7 @@ dissect_gsm_map_QoS_Subscribed(gboolean implicit_tag _U_, tvbuff_t *tvb, int off
        de_sm_qos(parameter_tvb, tree, 0, 3, NULL,0);
 
 
+
   return offset;
 }
 static int dissect_qos_Subscribed_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
@@ -6226,8 +6876,9 @@ static int dissect_lcsAPN_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *t
 
 
 
-static int
+int
 dissect_gsm_map_Ext_QoS_Subscribed(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+#line 473 "gsmmap.cnf"
 
        tvbuff_t        *parameter_tvb;
 
@@ -6241,6 +6892,7 @@ dissect_gsm_map_Ext_QoS_Subscribed(gboolean implicit_tag _U_, tvbuff_t *tvb, int
        de_sm_qos(parameter_tvb, tree, 0, 9, NULL, 0);
 
 
+
   return offset;
 }
 static int dissect_ext_QoS_Subscribed_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
@@ -6274,7 +6926,7 @@ static int dissect_pdp_ChargingCharacteristics_impl(packet_info *pinfo, proto_tr
 
 
 
-static int
+int
 dissect_gsm_map_Ext2_QoS_Subscribed(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
   offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
                                        NULL);
@@ -6396,7 +7048,7 @@ static int dissect_lsaOnlyAccessIndicator_impl(packet_info *pinfo, proto_tree *t
 
 
 
-static int
+int
 dissect_gsm_map_LSAIdentity(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
   offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
                                        NULL);
@@ -7328,6 +7980,7 @@ dissect_gsm_map_DeleteSubscriberDataRes(gboolean implicit_tag _U_, tvbuff_t *tvb
 
 int
 dissect_gsm_map_SS_Status(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+#line 268 "gsmmap.cnf"
 
  tvbuff_t      *parameter_tvb;
  guint8                octet;
@@ -7351,6 +8004,7 @@ dissect_gsm_map_SS_Status(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset,
 
 
 
+
   return offset;
 }
 static int dissect_ss_Status(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
@@ -7455,11 +8109,13 @@ dissect_gsm_map_ForwardingOptions(gboolean implicit_tag _U_, tvbuff_t *tvb, int
   offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
                                        NULL);
 
+#line 415 "gsmmap.cnf"
 
        proto_tree_add_item(tree, hf_gsm_map_notification_to_forwarding_party, tvb, 0,1,FALSE);
        proto_tree_add_item(tree, hf_gsm_map_redirecting_presentation, tvb, 0,1,FALSE);
        proto_tree_add_item(tree, hf_gsm_map_notification_to_calling_party, tvb, 0,1,FALSE);
        proto_tree_add_item(tree, hf_gsm_map_forwarding_reason, tvb, 0,1,FALSE);
+
   return offset;
 }
 static int dissect_forwardingOptions_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
@@ -8190,7 +8846,7 @@ static int dissect_ageOfLocationEstimate_impl(packet_info *pinfo, proto_tree *tr
 
 
 
-static int
+int
 dissect_gsm_map_GeographicalInformation(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
   offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
                                        NULL);
@@ -8219,7 +8875,7 @@ static int dissect_locationNumber_impl(packet_info *pinfo, proto_tree *tree, tvb
 
 
 
-static int
+int
 dissect_gsm_map_CellGlobalIdOrServiceAreaIdFixedLength(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
   offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
                                        NULL);
@@ -8293,7 +8949,7 @@ static const ber_sequence_t LocationInformation_sequence[] = {
   { 0, 0, 0, NULL }
 };
 
-static int
+int
 dissect_gsm_map_LocationInformation(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
   offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
                                    LocationInformation_sequence, hf_index, ett_gsm_map_LocationInformation);
@@ -8305,7 +8961,7 @@ static int dissect_locationInformation_impl(packet_info *pinfo, proto_tree *tree
 }
 
 
-static const value_string gsm_map_SubscriberState_vals[] = {
+const value_string gsm_map_SubscriberState_vals[] = {
   {   0, "assumedIdle" },
   {   1, "camelBusy" },
   {   2, "notProvidedFromVLR" },
@@ -8319,7 +8975,7 @@ static const ber_choice_t SubscriberState_choice[] = {
   { 0, 0, 0, 0, NULL }
 };
 
-static int
+int
 dissect_gsm_map_SubscriberState(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
   offset = dissect_ber_choice(pinfo, tree, tvb, offset,
                                  SubscriberState_choice, hf_index, ett_gsm_map_SubscriberState,
@@ -8333,7 +8989,7 @@ static int dissect_subscriberState(packet_info *pinfo, proto_tree *tree, tvbuff_
 
 
 
-static int
+int
 dissect_gsm_map_RAIdentity(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
   offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
                                        NULL);
@@ -8417,7 +9073,7 @@ static int dissect_teid_ForIu_impl(packet_info *pinfo, proto_tree *tree, tvbuff_
 
 
 
-static int
+int
 dissect_gsm_map_GPRSChargingID(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
   offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
                                        NULL);
@@ -8542,7 +9198,7 @@ static int dissect_ps_SubscriberState_impl(packet_info *pinfo, proto_tree *tree,
 
 
 
-static int
+int
 dissect_gsm_map_MS_Classmark2(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
   offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
                                        NULL);
@@ -8975,7 +9631,7 @@ static const ber_sequence_t UU_Data_sequence[] = {
   { 0, 0, 0, NULL }
 };
 
-static int
+int
 dissect_gsm_map_UU_Data(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
   offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
                                    UU_Data_sequence, hf_index, ett_gsm_map_UU_Data);
@@ -9406,7 +10062,7 @@ dissect_gsm_map_IST_CommandRes(gboolean implicit_tag _U_, tvbuff_t *tvb, int off
 
 
 static const ber_sequence_t ReleaseResourcesArg_sequence[] = {
-  { BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_NOOWNTAG, dissect_msrn },
+  { BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_msrn },
   { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_extensionContainer },
   { 0, 0, 0, NULL }
 };
@@ -9960,6 +10616,7 @@ dissect_gsm_map_EraseCC_EntryRes(gboolean implicit_tag _U_, tvbuff_t *tvb, int o
 
 static int
 dissect_gsm_map_ServiceCentreAddress(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+#line 193 "gsmmap.cnf"
 
  tvbuff_t      *parameter_tvb;
  char          *digit_str;
@@ -9978,11 +10635,10 @@ dissect_gsm_map_ServiceCentreAddress(gboolean implicit_tag _U_, tvbuff_t *tvb, i
  digit_str = unpack_digits(parameter_tvb, 1);
 
  proto_tree_add_string(tree, hf_gsm_map_servicecentreaddress_digits, parameter_tvb, 1, -1, digit_str);
- if (digit_str)
-       g_free(digit_str);
  pinfo->p2p_dir = P2P_DIR_SENT;
 
 
+
   return offset;
 }
 static int dissect_serviceCentreAddress(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
@@ -10166,6 +10822,7 @@ static int dissect_sm_RP_OA(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb,
 
 static int
 dissect_gsm_map_Sm_RP_UI(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+#line 152 "gsmmap.cnf"
 
   tvbuff_t     *tpdu_tvb;
        
@@ -10181,6 +10838,7 @@ dissect_gsm_map_Sm_RP_UI(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, p
 
     dissector_try_port(sms_dissector_table, 0, tpdu_tvb, pinfo, top_tree);
 
+
   return offset;
 }
 static int dissect_sm_RP_UI(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
@@ -10844,7 +11502,7 @@ static const asn_namedbit OfferedCamel4Functionalities_bits[] = {
   { 0, NULL, 0, 0, NULL, NULL }
 };
 
-static int
+int
 dissect_gsm_map_OfferedCamel4Functionalities(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
   offset = dissect_ber_bitstring(implicit_tag, pinfo, tree, tvb, offset,
                                     OfferedCamel4Functionalities_bits, hf_index, ett_gsm_map_OfferedCamel4Functionalities,
@@ -12413,8 +13071,8 @@ dissect_gsm_map_INTEGER(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, pa
 
   return offset;
 }
-static int dissect_localValue(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_INTEGER(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_localValue);
+static int dissect_localValue2(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_INTEGER(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_localValue2);
 }
 
 
@@ -12425,7 +13083,7 @@ static const value_string gsm_map_OperationCode_vals[] = {
 };
 
 static const ber_choice_t OperationCode_choice[] = {
-  {   0, BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_localValue },
+  {   0, BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_localValue2 },
   {   1, BER_CLASS_UNI, BER_UNI_TAG_OID, BER_FLAGS_NOOWNTAG, dissect_globalValue },
   { 0, 0, 0, 0, NULL }
 };
@@ -12450,7 +13108,7 @@ static const value_string gsm_map_ErrorCode_vals[] = {
 };
 
 static const ber_choice_t ErrorCode_choice[] = {
-  {   0, BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_localValue },
+  {   0, BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_localValue2 },
   {   1, BER_CLASS_UNI, BER_UNI_TAG_OID, BER_FLAGS_NOOWNTAG, dissect_globalValue },
   { 0, 0, 0, 0, NULL }
 };
@@ -12463,8 +13121,8 @@ dissect_gsm_map_ErrorCode(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset,
 
   return offset;
 }
-static int dissect_errorCode_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ErrorCode(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_errorCode);
+static int dissect_errorCode1_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_ErrorCode(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_errorCode1);
 }
 
 
@@ -12477,7 +13135,7 @@ static const value_string gsm_map_OriginalComponentIdentifier_vals[] = {
 
 static const ber_choice_t OriginalComponentIdentifier_choice[] = {
   {   0, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_operationCode_impl },
-  {   1, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_errorCode_impl },
+  {   1, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_errorCode1_impl },
   {   2, BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_userInfo_impl },
   { 0, 0, 0, 0, NULL }
 };
@@ -12677,6 +13335,20 @@ dissect_gsm_map_FacilityNotSupParam(gboolean implicit_tag _U_, tvbuff_t *tvb, in
 }
 
 
+static const ber_sequence_t OR_NotAllowedParam_sequence[] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_extensionContainer },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_gsm_map_OR_NotAllowedParam(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   OR_NotAllowedParam_sequence, hf_index, ett_gsm_map_OR_NotAllowedParam);
+
+  return offset;
+}
+
+
 static const ber_sequence_t IncompatibleTerminalParam_sequence[] = {
   { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_extensionContainer },
   { 0, 0, 0, NULL }
@@ -12885,29 +13557,30 @@ dissect_gsm_map_NoRoamingNbParam(gboolean implicit_tag _U_, tvbuff_t *tvb, int o
 }
 
 
-static const value_string gsm_map_T_absentSubscriberReason_vals[] = {
+static const value_string gsm_map_AbsentSubscriberReason_vals[] = {
   {   0, "imsiDetach" },
   {   1, "restrictedArea" },
   {   2, "noPageResponse" },
+  {   3, "purgedMS" },
   { 0, NULL }
 };
 
 
 static int
-dissect_gsm_map_T_absentSubscriberReason(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+dissect_gsm_map_AbsentSubscriberReason(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
   offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
                                   NULL);
 
   return offset;
 }
-static int dissect_absentSubscriberReason_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_T_absentSubscriberReason(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_absentSubscriberReason);
+static int dissect_absentSubscriberReason(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_AbsentSubscriberReason(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_absentSubscriberReason);
 }
 
 
 static const ber_sequence_t AbsentSubscriberParam_sequence[] = {
   { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_extensionContainer },
-  { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_absentSubscriberReason_impl },
+  { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL, dissect_absentSubscriberReason },
   { 0, 0, 0, NULL }
 };
 
@@ -12950,6 +13623,147 @@ dissect_gsm_map_NoSubscriberReplyParam(gboolean implicit_tag _U_, tvbuff_t *tvb,
 }
 
 
+static const ber_sequence_t ForwardingViolationParam_sequence[] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_extensionContainer },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_gsm_map_ForwardingViolationParam(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   ForwardingViolationParam_sequence, hf_index, ett_gsm_map_ForwardingViolationParam);
+
+  return offset;
+}
+
+
+static const ber_sequence_t ForwardingFailedParam_sequence[] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_extensionContainer },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_gsm_map_ForwardingFailedParam(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   ForwardingFailedParam_sequence, hf_index, ett_gsm_map_ForwardingFailedParam);
+
+  return offset;
+}
+
+
+static const ber_sequence_t ATI_NotAllowedParam_sequence[] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_extensionContainer },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_gsm_map_ATI_NotAllowedParam(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   ATI_NotAllowedParam_sequence, hf_index, ett_gsm_map_ATI_NotAllowedParam);
+
+  return offset;
+}
+
+
+static const ber_sequence_t ATSI_NotAllowedParam_sequence[] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_extensionContainer },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_gsm_map_ATSI_NotAllowedParam(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   ATSI_NotAllowedParam_sequence, hf_index, ett_gsm_map_ATSI_NotAllowedParam);
+
+  return offset;
+}
+
+
+static const ber_sequence_t ATM_NotAllowedParam_sequence[] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_extensionContainer },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_gsm_map_ATM_NotAllowedParam(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   ATM_NotAllowedParam_sequence, hf_index, ett_gsm_map_ATM_NotAllowedParam);
+
+  return offset;
+}
+
+
+static const ber_sequence_t IllegalSS_OperationParam_sequence[] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_extensionContainer },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_gsm_map_IllegalSS_OperationParam(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   IllegalSS_OperationParam_sequence, hf_index, ett_gsm_map_IllegalSS_OperationParam);
+
+  return offset;
+}
+
+
+static const ber_sequence_t SS_NotAvailableParam_sequence[] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_extensionContainer },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_gsm_map_SS_NotAvailableParam(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   SS_NotAvailableParam_sequence, hf_index, ett_gsm_map_SS_NotAvailableParam);
+
+  return offset;
+}
+
+
+static const ber_sequence_t SS_SubscriptionViolationParam_sequence[] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_extensionContainer },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_gsm_map_SS_SubscriptionViolationParam(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   SS_SubscriptionViolationParam_sequence, hf_index, ett_gsm_map_SS_SubscriptionViolationParam);
+
+  return offset;
+}
+
+
+static const ber_sequence_t InformationNotAvailableParam_sequence[] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_extensionContainer },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_gsm_map_InformationNotAvailableParam(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   InformationNotAvailableParam_sequence, hf_index, ett_gsm_map_InformationNotAvailableParam);
+
+  return offset;
+}
+
+
+static const ber_sequence_t SubBusyForMT_SMS_Param_sequence[] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_extensionContainer },
+  { BER_CLASS_UNI, BER_UNI_TAG_NULL, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_gprsConnectionSuspended },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_gsm_map_SubBusyForMT_SMS_Param(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   SubBusyForMT_SMS_Param_sequence, hf_index, ett_gsm_map_SubBusyForMT_SMS_Param);
+
+  return offset;
+}
+
+
 static const value_string gsm_map_CallBarringCause_vals[] = {
   {   0, "barringServiceActive" },
   {   1, "operatorBarring" },
@@ -12969,22 +13783,22 @@ static int dissect_callBarringCause(packet_info *pinfo, proto_tree *tree, tvbuff
 }
 
 
-static const ber_sequence_t T_extensibleCallBarredParam_sequence[] = {
+static const ber_sequence_t ExtensibleCallBarredParam_sequence[] = {
   { BER_CLASS_UNI, BER_UNI_TAG_ENUMERATED, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_callBarringCause },
   { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_extensionContainer },
-  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_unauthorisedMessageOriginator_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL, dissect_unauthorisedMessageOriginator },
   { 0, 0, 0, NULL }
 };
 
 static int
-dissect_gsm_map_T_extensibleCallBarredParam(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+dissect_gsm_map_ExtensibleCallBarredParam(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
   offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
-                                   T_extensibleCallBarredParam_sequence, hf_index, ett_gsm_map_T_extensibleCallBarredParam);
+                                   ExtensibleCallBarredParam_sequence, hf_index, ett_gsm_map_ExtensibleCallBarredParam);
 
   return offset;
 }
 static int dissect_extensibleCallBarredParam(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_T_extensibleCallBarredParam(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_extensibleCallBarredParam);
+  return dissect_gsm_map_ExtensibleCallBarredParam(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_extensibleCallBarredParam);
 }
 
 
@@ -13010,43 +13824,51 @@ dissect_gsm_map_CallBarredParam(gboolean implicit_tag _U_, tvbuff_t *tvb, int of
 }
 
 
-static const ber_sequence_t ForwardingFailedParam_sequence[] = {
-  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_extensionContainer },
-  { 0, 0, 0, NULL }
+static const value_string gsm_map_CUG_RejectCause_vals[] = {
+  {   0, "incomingCallsBarredWithinCUG" },
+  {   1, "subscriberNotMemberOfCUG" },
+  {   5, "requestedBasicServiceViolatesCUG-Constraints" },
+  {   7, "calledPartySS-InteractionViolation" },
+  { 0, NULL }
 };
 
+
 static int
-dissect_gsm_map_ForwardingFailedParam(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
-  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
-                                   ForwardingFailedParam_sequence, hf_index, ett_gsm_map_ForwardingFailedParam);
+dissect_gsm_map_CUG_RejectCause(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
 
   return offset;
 }
+static int dissect_cug_RejectCause(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_CUG_RejectCause(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_cug_RejectCause);
+}
 
 
-static const ber_sequence_t Or_NotAllowedParam_sequence[] = {
+static const ber_sequence_t CUG_RejectParam_sequence[] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_ENUMERATED, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_cug_RejectCause },
   { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_extensionContainer },
   { 0, 0, 0, NULL }
 };
 
 static int
-dissect_gsm_map_Or_NotAllowedParam(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+dissect_gsm_map_CUG_RejectParam(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
   offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
-                                   Or_NotAllowedParam_sequence, hf_index, ett_gsm_map_Or_NotAllowedParam);
+                                   CUG_RejectParam_sequence, hf_index, ett_gsm_map_CUG_RejectParam);
 
   return offset;
 }
 
 
-static const ber_sequence_t ForwardingViolationParam_sequence[] = {
+static const ber_sequence_t Or_NotAllowedParam_sequence[] = {
   { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_extensionContainer },
   { 0, 0, 0, NULL }
 };
 
 static int
-dissect_gsm_map_ForwardingViolationParam(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+dissect_gsm_map_Or_NotAllowedParam(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
   offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
-                                   ForwardingViolationParam_sequence, hf_index, ett_gsm_map_ForwardingViolationParam);
+                                   Or_NotAllowedParam_sequence, hf_index, ett_gsm_map_Or_NotAllowedParam);
 
   return offset;
 }
@@ -13068,13 +13890,13 @@ dissect_gsm_map_T_cug_RejectCause(gboolean implicit_tag _U_, tvbuff_t *tvb, int
 
   return offset;
 }
-static int dissect_cug_RejectCause(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_T_cug_RejectCause(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_cug_RejectCause);
+static int dissect_cug_RejectCause1(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_T_cug_RejectCause(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_cug_RejectCause1);
 }
 
 
 static const ber_sequence_t Cug_RejectParam_sequence[] = {
-  { BER_CLASS_UNI, BER_UNI_TAG_ENUMERATED, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_cug_RejectCause },
+  { BER_CLASS_UNI, BER_UNI_TAG_ENUMERATED, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_cug_RejectCause1 },
   { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_extensionContainer },
   { 0, 0, 0, NULL }
 };
@@ -13088,20 +13910,6 @@ dissect_gsm_map_Cug_RejectParam(gboolean implicit_tag _U_, tvbuff_t *tvb, int of
 }
 
 
-static const ber_sequence_t Ati_NotAllowedParam_sequence[] = {
-  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_extensionContainer },
-  { 0, 0, 0, NULL }
-};
-
-static int
-dissect_gsm_map_Ati_NotAllowedParam(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
-  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
-                                   Ati_NotAllowedParam_sequence, hf_index, ett_gsm_map_Ati_NotAllowedParam);
-
-  return offset;
-}
-
-
 static const ber_sequence_t NoGroupCallNbParam_sequence[] = {
   { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_extensionContainer },
   { 0, 0, 0, NULL }
@@ -13132,7 +13940,7 @@ dissect_gsm_map_SS_IncompatibilityCause(gboolean implicit_tag _U_, tvbuff_t *tvb
 }
 
 
-static const value_string gsm_map_Pw_RegistrationFailureCause_vals[] = {
+static const value_string gsm_map_PW_RegistrationFailureCause_vals[] = {
   {   0, "undetermined" },
   {   1, "invalidFormat" },
   {   2, "newPasswordsMismatch" },
@@ -13141,7 +13949,7 @@ static const value_string gsm_map_Pw_RegistrationFailureCause_vals[] = {
 
 
 static int
-dissect_gsm_map_Pw_RegistrationFailureCause(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+dissect_gsm_map_PW_RegistrationFailureCause(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
   offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
                                   NULL);
 
@@ -13175,22 +13983,7 @@ dissect_gsm_map_LongTermDenialParam(gboolean implicit_tag _U_, tvbuff_t *tvb, in
 }
 
 
-static const ber_sequence_t SubBusyForMT_SMS_Param_sequence[] = {
-  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_extensionContainer },
-  { BER_CLASS_UNI, BER_UNI_TAG_NULL, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_gprsConnectionSuspended },
-  { 0, 0, 0, NULL }
-};
-
-static int
-dissect_gsm_map_SubBusyForMT_SMS_Param(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
-  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
-                                   SubBusyForMT_SMS_Param_sequence, hf_index, ett_gsm_map_SubBusyForMT_SMS_Param);
-
-  return offset;
-}
-
-
-static const value_string gsm_map_T_sm_EnumeratedDeliveryFailureCause_vals[] = {
+static const value_string gsm_map_SM_EnumeratedDeliveryFailureCause_vals[] = {
   {   0, "memoryCapacityExceeded" },
   {   1, "equipmentProtocolError" },
   {   2, "equipmentNotSM-Equipped" },
@@ -13203,31 +13996,18 @@ static const value_string gsm_map_T_sm_EnumeratedDeliveryFailureCause_vals[] = {
 
 
 static int
-dissect_gsm_map_T_sm_EnumeratedDeliveryFailureCause(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+dissect_gsm_map_SM_EnumeratedDeliveryFailureCause(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
   offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
                                   NULL);
 
   return offset;
 }
 static int dissect_sm_EnumeratedDeliveryFailureCause(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_T_sm_EnumeratedDeliveryFailureCause(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_sm_EnumeratedDeliveryFailureCause);
-}
-
-
-
-static int
-dissect_gsm_map_OCTET_STRING_SIZE_1_200(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
-  offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
-                                       NULL);
-
-  return offset;
-}
-static int dissect_diagnosticInfo(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_OCTET_STRING_SIZE_1_200(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_diagnosticInfo);
+  return dissect_gsm_map_SM_EnumeratedDeliveryFailureCause(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_sm_EnumeratedDeliveryFailureCause);
 }
 
 
-static const ber_sequence_t Sm_DeliveryFailureCause_sequence[] = {
+static const ber_sequence_t SM_DeliveryFailureCause_sequence[] = {
   { BER_CLASS_UNI, BER_UNI_TAG_ENUMERATED, BER_FLAGS_NOOWNTAG, dissect_sm_EnumeratedDeliveryFailureCause },
   { BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_diagnosticInfo },
   { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_extensionContainer },
@@ -13235,9 +14015,9 @@ static const ber_sequence_t Sm_DeliveryFailureCause_sequence[] = {
 };
 
 static int
-dissect_gsm_map_Sm_DeliveryFailureCause(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+dissect_gsm_map_SM_DeliveryFailureCause(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
   offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
-                                   Sm_DeliveryFailureCause_sequence, hf_index, ett_gsm_map_Sm_DeliveryFailureCause);
+                                   SM_DeliveryFailureCause_sequence, hf_index, ett_gsm_map_SM_DeliveryFailureCause);
 
   return offset;
 }
@@ -13324,7 +14104,7 @@ dissect_gsm_map_UnauthorizedLCSClient_Param(gboolean implicit_tag _U_, tvbuff_t
 }
 
 
-static const value_string gsm_map_T_positionMethodFailure_Diagnostic_vals[] = {
+static const value_string gsm_map_PositionMethodFailure_Diagnostic_vals[] = {
   {   0, "congestion" },
   {   1, "insufficientResources" },
   {   2, "insufficientMeasurementData" },
@@ -13337,50 +14117,99 @@ static const value_string gsm_map_T_positionMethodFailure_Diagnostic_vals[] = {
   { 0, NULL }
 };
 
-
+
+static int
+dissect_gsm_map_PositionMethodFailure_Diagnostic(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
+                                  NULL);
+
+  return offset;
+}
+static int dissect_positionMethodFailure_Diagnostic_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+  return dissect_gsm_map_PositionMethodFailure_Diagnostic(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_positionMethodFailure_Diagnostic);
+}
+
+
+static const ber_sequence_t PositionMethodFailure_Param_sequence[] = {
+  { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_positionMethodFailure_Diagnostic_impl },
+  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_extensionContainer_impl },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_gsm_map_PositionMethodFailure_Param(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   PositionMethodFailure_Param_sequence, hf_index, ett_gsm_map_PositionMethodFailure_Param);
+
+  return offset;
+}
+
+
+static const ber_sequence_t UnknownOrUnreachableLCSClient_Param_sequence[] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_extensionContainer },
+  { 0, 0, 0, NULL }
+};
+
+static int
+dissect_gsm_map_UnknownOrUnreachableLCSClient_Param(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   UnknownOrUnreachableLCSClient_Param_sequence, hf_index, ett_gsm_map_UnknownOrUnreachableLCSClient_Param);
+
+  return offset;
+}
+
+
+static const ber_sequence_t MM_EventNotSupported_Param_sequence[] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_extensionContainer },
+  { 0, 0, 0, NULL }
+};
+
 static int
-dissect_gsm_map_T_positionMethodFailure_Diagnostic(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
-  offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
-                                  NULL);
+dissect_gsm_map_MM_EventNotSupported_Param(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
+                                   MM_EventNotSupported_Param_sequence, hf_index, ett_gsm_map_MM_EventNotSupported_Param);
 
   return offset;
 }
-static int dissect_positionMethodFailure_Diagnostic_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_T_positionMethodFailure_Diagnostic(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_positionMethodFailure_Diagnostic);
-}
 
 
-static const ber_sequence_t PositionMethodFailure_Param_sequence[] = {
-  { BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_positionMethodFailure_Diagnostic_impl },
-  { BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_extensionContainer_impl },
+static const ber_sequence_t TargetCellOutsideGCA_Param_sequence[] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_extensionContainer },
   { 0, 0, 0, NULL }
 };
 
 static int
-dissect_gsm_map_PositionMethodFailure_Param(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+dissect_gsm_map_TargetCellOutsideGCA_Param(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
   offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
-                                   PositionMethodFailure_Param_sequence, hf_index, ett_gsm_map_PositionMethodFailure_Param);
+                                   TargetCellOutsideGCA_Param_sequence, hf_index, ett_gsm_map_TargetCellOutsideGCA_Param);
 
   return offset;
 }
 
 
-static const ber_sequence_t UnknownOrUnreachableLCSClient_Param_sequence[] = {
-  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_extensionContainer },
+static const ber_sequence_t SecureTransportErrorParam_sequence[] = {
+  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_securityHeader },
+  { BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_protectedPayload },
   { 0, 0, 0, NULL }
 };
 
 static int
-dissect_gsm_map_UnknownOrUnreachableLCSClient_Param(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
+dissect_gsm_map_SecureTransportErrorParam(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_) {
   offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
-                                   UnknownOrUnreachableLCSClient_Param_sequence, hf_index, ett_gsm_map_UnknownOrUnreachableLCSClient_Param);
+                                   SecureTransportErrorParam_sequence, hf_index, ett_gsm_map_SecureTransportErrorParam);
 
   return offset;
 }
 
+/*--- PDUs ---*/
+
+static void dissect_Component_PDU(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) {
+  dissect_gsm_map_Component(FALSE, tvb, 0, pinfo, tree, hf_gsm_map_Component_PDU);
+}
 
-/*--- End of included file: packet-gsm_map-fn.c ---*/
 
+/*--- End of included file: packet-gsm_map-fn.c ---*/
+#line 172 "packet-gsm_map-template.c"
 
 const value_string gsm_map_opr_code_strings[] = {
   {   2, "updateLocation" },
@@ -13579,7 +14408,6 @@ static const true_false_string gsm_map_Ss_Status_a_values = {
   "not Active"
 };
 
-static guint32 opcode=0;
 
 static int
 dissect_gsm_map_Opcode(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index) {
@@ -13606,7 +14434,7 @@ static int dissect_invokeData(packet_info *pinfo, proto_tree *tree, tvbuff_t *tv
                offset = offset +2;
                offset=dissect_gsm_map_CancelLocationArg(TRUE, tvb, offset, pinfo, tree, -1);
        }else{
-    offset=dissect_gsm_map_CancelLocationArg(FALSE, tvb, offset, pinfo, tree, -1);
+    offset=dissect_gsm_map_CancelLocationArgV2(FALSE, tvb, offset, pinfo, tree, -1);
        }
     break;
   case  4: /*provideRoamingNumber*/
@@ -13969,7 +14797,7 @@ static int dissect_returnResultData(packet_info *pinfo, proto_tree *tree, tvbuff
     break;
   case 55: /*sendIdentification
                        * In newer versions IMSI and authenticationSetList is OPTIONAL and two new parameters added
-                       * however if the tag (3) is stripped of it should work wit the 'new' def.(?) 
+                       * however if the tag (3) is stripped of it should work with the 'new' def.(?) 
                        */
        octet = tvb_get_guint8(tvb,0) & 0xf;
        if ( octet == 3){ /* This is a V3 message ??? */
@@ -14080,155 +14908,158 @@ static int dissect_returnResultData(packet_info *pinfo, proto_tree *tree, tvbuff
   return offset;
 }
 
-static int 
-dissect_invokeCmd(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_Opcode(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_invokeCmd);
-}
-
-static int dissect_invokeid(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_ber_integer(FALSE, pinfo, tree, tvb, offset, hf_gsm_map_invokeid, NULL);
-}
-
-
-static const value_string InvokeId_vals[] = {
-  {   0, "invokeid" },
-  {   1, "absent" },
-  { 0, NULL }
-};
-
-static int dissect_absent(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_NULL(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_absent);
-}
-
-
-static const ber_choice_t InvokeId_choice[] = {
-  {   0, BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_invokeid },
-  {   1, BER_CLASS_UNI, BER_UNI_TAG_NULL, BER_FLAGS_NOOWNTAG, dissect_absent },
-  { 0, 0, 0, 0, NULL }
-};
-
-static int
-dissect_gsm_map_InvokeId(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index) {
-  offset = dissect_ber_choice(pinfo, tree, tvb, offset,
-                              InvokeId_choice, hf_index, ett_gsm_map_InvokeId, NULL);
-
-  return offset;
-}
-static int dissect_invokeId(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_InvokeId(FALSE, tvb, offset, pinfo, tree, hf_gsm_map_invokeId);
-}
-
-static const ber_sequence_t InvokePDU_sequence[] = {
-  { BER_CLASS_UNI, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_invokeId },
-  { BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_invokeCmd },
-  { BER_CLASS_UNI, -1/*depends on Cmd*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_invokeData },
-  { 0, 0, 0, NULL }
-};
-
-static int
-dissect_gsm_map_InvokePDU(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index) {
-  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
-                                InvokePDU_sequence, hf_index, ett_gsm_map_InvokePDU);
-
-  return offset;
-}
-static int dissect_invoke_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_InvokePDU(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_invoke);
-}
-
-static const ber_sequence_t ReturnResult_result_sequence[] = {
-  { BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_invokeCmd },
-  { BER_CLASS_UNI, -1/*depends on Cmd*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_returnResultData },
-  { 0, 0, 0, NULL }
-};
-static int
-dissect_returnResult_result(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  offset = dissect_ber_sequence(FALSE, pinfo, tree, tvb, offset,
-                                ReturnResult_result_sequence, hf_gsm_map_returnResult_result, ett_gsm_map_ReturnResult_result);
-
-  return offset;
-}
-
-static const ber_sequence_t ReturnResultPDU_sequence[] = {
-  { BER_CLASS_UNI, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_invokeId },
-  { BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_returnResult_result },
-  { 0, 0, 0, NULL }
-};
-
-static int
-dissect_gsm_map_returnResultPDU(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index) {
-  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
-                                ReturnResultPDU_sequence, hf_index, ett_gsm_map_ReturnResultPDU);
-
-  return offset;
-}
-static int dissect_returnResult_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_returnResultPDU(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_returnResult);
-}
-
-static int
-dissect_local_errorCode(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_ber_integer(FALSE, pinfo, tree, tvb, offset, hf_gsm_map_local_errorCode, NULL);
-}
-
-static int
-dissect_global_errorCode(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  offset =  dissect_ber_object_identifier(FALSE, pinfo, tree, tvb, offset,
-                                         hf_gsm_map_global_errorCode_oid, NULL);
-  return dissect_ber_integer(FALSE, pinfo, tree, tvb, offset, hf_gsm_map_global_errorCode, NULL);
-}
-static const ber_choice_t ReturnError_result_choice[] = {
-  {   0, BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_local_errorCode },
-  {   1, BER_CLASS_UNI, BER_UNI_TAG_OID, BER_FLAGS_NOOWNTAG, dissect_global_errorCode },
-  {   0, 0, 0, 0, NULL }
-};
-
-
-static int
-dissect_ReturnError_result(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-
-  offset = dissect_ber_choice(pinfo, tree, tvb, offset,
-                              ReturnError_result_choice, hf_gsm_map_returnError_result, ett_gsm_map_ReturnError_result, NULL);
-
-  return offset;
-}
-
-static const ber_sequence_t ReturnErrorPDU_sequence[] = {
-  { BER_CLASS_UNI, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_invokeId },
-  { BER_CLASS_UNI, -1/*choice*/,BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_ReturnError_result },
-  { 0, 0, 0, NULL }
-};
 
-static int
-dissect_gsm_map_ReturnErrorPDU(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index) {
-  offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
-                                ReturnErrorPDU_sequence, hf_index, ett_gsm_map_ReturnErrorPDU);
 
+static int dissect_returnErrorData(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
+       
+  switch(errorCode){
+  case 1: /* UnknownSubscriberParam */
+         offset=dissect_gsm_map_UnknownSubscriberParam(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 4: /* SecureTransportErrorParam */
+         offset=dissect_gsm_map_SecureTransportErrorParam(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 5: /* UnidentifiedSubParam */
+         offset=dissect_gsm_map_UnidentifiedSubParam(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 6: /* AbsentSubscriberSM-Param */
+         offset=dissect_gsm_map_AbsentSubscriberSM_Param(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 8: /* RoamingNotAllowedParam */
+         offset=dissect_gsm_map_RoamingNotAllowedParam(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 9: /* IllegalSubscriberParam */
+         offset=dissect_gsm_map_IllegalSubscriberParam(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 10: /* BearerServNotProvParam */
+         offset=dissect_gsm_map_BearerServNotProvParam(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 11: /* TeleservNotProvParam */
+         offset=dissect_gsm_map_TeleservNotProvParam(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 12: /* IllegalEquipmentParam */
+         offset=dissect_gsm_map_IllegalEquipmentParam(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 13: /* CallBarredParam */
+         offset=dissect_gsm_map_CallBarredParam(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 14: /* ForwardingViolationParam */
+         offset=dissect_gsm_map_ForwardingViolationParam(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 15: /* CUG-RejectParam */
+         offset=dissect_gsm_map_CUG_RejectParam(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 16: /* IllegalSS-OperationParam */
+         offset=dissect_gsm_map_IllegalSS_OperationParam(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 18: /* SS-NotAvailableParam */
+         offset=dissect_gsm_map_SS_NotAvailableParam(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 19: /* SS-SubscriptionViolationParam */
+         offset=dissect_gsm_map_SS_SubscriptionViolationParam(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 20: /* SS-IncompatibilityCause */
+         offset=dissect_gsm_map_SS_IncompatibilityCause(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 21: /* FacilityNotSupParam */
+         offset=dissect_gsm_map_FacilityNotSupParam(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 27: /* AbsentSubscriberParam */
+         offset=dissect_gsm_map_AbsentSubscriberParam(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 28: /* IncompatibleTerminalParam */
+         offset=dissect_gsm_map_IncompatibleTerminalParam(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 29: /* ShortTermDenialParam */
+         offset=dissect_gsm_map_ShortTermDenialParam(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 30: /* LongTermDenialParam */
+         offset=dissect_gsm_map_LongTermDenialParam(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 31: /* SubBusyForMT-SMS-Param */
+         offset=dissect_gsm_map_SubBusyForMT_SMS_Param(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 32: /* SM-DeliveryFailureCause */
+         offset=dissect_gsm_map_SM_DeliveryFailureCause(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 33: /* MessageWaitListFullParam */
+         offset=dissect_gsm_map_MessageWaitListFullParam(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 34: /* SystemFailureParam */
+         offset=dissect_gsm_map_SystemFailureParam(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 35: /* DataMissingParam */
+         offset=dissect_gsm_map_DataMissingParam(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 36: /* UnexpectedDataParam */
+         offset=dissect_gsm_map_UnexpectedDataParam(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 37: /* PW-RegistrationFailureCause */
+         offset=dissect_gsm_map_PW_RegistrationFailureCause(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 39: /* NoRoamingNbParam */
+         offset=dissect_gsm_map_NoRoamingNbParam(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 40: /* TracingBufferFullParam */
+         offset=dissect_gsm_map_TracingBufferFullParam(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 42: /* TargetCellOutsideGCA-Param */
+         offset=dissect_gsm_map_TargetCellOutsideGCA_Param(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 44: /* NumberChangedParam */
+         offset=dissect_gsm_map_NumberChangedParam(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 45: /* BusySubscriberParam */
+         offset=dissect_gsm_map_BusySubscriberParam(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 46: /* NoSubscriberReplyParam */
+         offset=dissect_gsm_map_NoSubscriberReplyParam(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 47: /* ForwardingFailedParam */
+         offset=dissect_gsm_map_ForwardingFailedParam(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 48: /* OR-NotAllowedParam */
+         offset=dissect_gsm_map_OR_NotAllowedParam(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 49: /* ATI-NotAllowedParam */
+         offset=dissect_gsm_map_ATI_NotAllowedParam(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 50: /* NoGroupCallNbParam */
+         offset=dissect_gsm_map_NoGroupCallNbParam(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 51: /* ResourceLimitationParam */
+         offset=dissect_gsm_map_ResourceLimitationParam(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 52: /* UnauthorizedRequestingNetwork-Param */
+         offset=dissect_gsm_map_UnauthorizedRequestingNetwork_Param(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 53: /* UnauthorizedLCSClient-Param */
+         offset=dissect_gsm_map_UnauthorizedLCSClient_Param(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 54: /* PositionMethodFailure-Param */
+         offset=dissect_gsm_map_PositionMethodFailure_Param(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 58: /* UnknownOrUnreachableLCSClient-Param */
+         offset=dissect_gsm_map_UnknownOrUnreachableLCSClient_Param(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 59: /* MM-EventNotSupported-Param */
+         offset=dissect_gsm_map_MM_EventNotSupported_Param(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 60: /* ATSI-NotAllowedParam */
+         offset=dissect_gsm_map_ATSI_NotAllowedParam(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 61: /* ATM-NotAllowedParam */
+         offset=dissect_gsm_map_ATM_NotAllowedParam(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  case 62: /* InformationNotAvailableParam */
+         offset=dissect_gsm_map_InformationNotAvailableParam(FALSE, tvb, offset, pinfo, tree, -1);
+         break;
+  default:
+         proto_tree_add_text(tree, tvb, offset, -1, "Unknown returnErrorData blob");
+         break;
+  }
   return offset;
 }
-static int dissect_returnError_impl(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
-  return dissect_gsm_map_ReturnErrorPDU(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_returnError);
-}
-
-
-static const value_string GSMMAPPDU_vals[] = {
-  {   1, "Invoke " },
-  {   2, "ReturnResult " },
-  {   3, "ReturnError " },
-  {   4, "Reject " },
-  { 0, NULL }
-};
-
-static const ber_choice_t GSMMAPPDU_choice[] = {
-  {   1, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_invoke_impl },
-  {   2, BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_returnResult_impl },
-  {   3, BER_CLASS_CON, 3, BER_FLAGS_IMPLTAG, dissect_returnError_impl },
-#ifdef REMOVED
-  {   4, BER_CLASS_CON, 4, BER_FLAGS_IMPLTAG, dissect_reject_impl },
-#endif
-  { 0, 0, 0, 0, NULL }
-};
-
 static guint8 gsmmap_pdu_type = 0;
 static guint8 gsm_map_pdu_size = 0;
 
@@ -14251,12 +15082,14 @@ dissect_gsm_map_GSMMAPPDU(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset,
   gsm_map_pdu_size = tvb_get_guint8(tvb, offset+1)+2;
 
   if (check_col(pinfo->cinfo, COL_INFO)){
-    col_set_str(pinfo->cinfo, COL_INFO, val_to_str(gsmmap_pdu_type, GSMMAPPDU_vals, "Unknown GSM-MAP PDU (%u)"));
+    col_set_str(pinfo->cinfo, COL_INFO, val_to_str(gsmmap_pdu_type, gsm_map_Component_vals, "Unknown GSM-MAP PDU (%u)"));
   }
-
+  offset = dissect_gsm_map_Component(FALSE, tvb, 0, pinfo, tree, hf_gsm_map_Component_PDU);
+  return offset;
+/*
   offset = dissect_ber_choice(pinfo, tree, tvb, offset,
                               GSMMAPPDU_choice, hf_index, ett_gsm_map_GSMMAPPDU, NULL);
-
+*/
 
   return offset;
 }
@@ -14280,7 +15113,7 @@ dissect_gsm_map(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
     }
 
     top_tree = parent_tree;
-    dissector_add("tcap.itu_ssn",pinfo->match_port, map_handle);
+
     /* create display subtree for the protocol */
     if(parent_tree){
         item = proto_tree_add_item(parent_tree, proto_gsm_map, tvb, 0, -1, FALSE);
@@ -14567,14 +15400,14 @@ static const value_string chargingcharacteristics_values[] = {
 static void range_delete_callback(guint32 ssn)
 {
     if (ssn) {
-       dissector_delete("tcap.itu_ssn", ssn, map_handle);
+       delete_itu_tcap_subdissector(ssn, map_handle);
     }
 }
 
 static void range_add_callback(guint32 ssn)
 {
     if (ssn) {
-       dissector_add("tcap.itu_ssn", ssn, map_handle);
+       add_itu_tcap_subdissector(ssn, map_handle);
     }
 }
 
@@ -14666,6 +15499,7 @@ void proto_register_gsm_map(void) {
 
   /* List of fields */
   static hf_register_info hf[] = {
+         /*
     { &hf_gsm_map_invokeCmd,
       { "invokeCmd", "gsm_map.invokeCmd",
         FT_UINT32, BASE_DEC, VALS(gsm_map_opr_code_strings), 0,
@@ -14682,22 +15516,6 @@ void proto_register_gsm_map(void) {
       { "invokeId", "gsm_map.invokeId",
         FT_UINT32, BASE_DEC, VALS(InvokeId_vals), 0,
         "InvokePDU/invokeId", HFILL }},
-       { &hf_gsm_map_SendAuthenticationInfoArg,
-      { "SendAuthenticationInfoArg", "gsm_map.SendAuthenticationInfoArg",
-        FT_BYTES, BASE_NONE, NULL, 0,
-        "SendAuthenticationInfoArg", HFILL }},
-       { &hf_gsm_map_SendAuthenticationInfoRes,
-      { "SendAuthenticationInfoRes", "gsm_map.SendAuthenticationInfoRes",
-        FT_BYTES, BASE_NONE, NULL, 0,
-        "SendAuthenticationInfoRes", HFILL }},
-    { &hf_gsm_map_currentPassword,
-      { "currentPassword", "gsm_map.currentPassword",
-        FT_STRING, BASE_NONE, NULL, 0,
-        "", HFILL }},
-       { &hf_gsm_mapSendEndSignal,
-      { "mapSendEndSignalArg", "gsm_map.mapsendendsignalarg",
-        FT_BYTES, BASE_NONE, NULL, 0,
-        "mapSendEndSignalArg", HFILL }},
     { &hf_gsm_map_invoke,
       { "invoke", "gsm_map.invoke",
         FT_NONE, BASE_NONE, NULL, 0,
@@ -14724,7 +15542,7 @@ void proto_register_gsm_map(void) {
         "localerrorCode", HFILL }},
        {&hf_gsm_map_global_errorCode_oid,
       { "Global Error Code OID", "gsm_map.hlobalerrorCodeoid",
-        FT_BYTES, BASE_NONE, NULL, 0,
+        FT_STRING, BASE_NONE, NULL, 0,
         "globalerrorCodeoid", HFILL }},
        {&hf_gsm_map_global_errorCode,
       { "Global Error Code", "gsm_map.globalerrorCode",
@@ -14734,6 +15552,24 @@ void proto_register_gsm_map(void) {
       { "Password", "gsm_map.password",
         FT_UINT8, BASE_DEC, VALS(gsm_map_GetPasswordArg_vals), 0,
         "Password", HFILL }},
+
+               */
+       { &hf_gsm_map_SendAuthenticationInfoArg,
+      { "SendAuthenticationInfoArg", "gsm_map.SendAuthenticationInfoArg",
+        FT_BYTES, BASE_NONE, NULL, 0,
+        "SendAuthenticationInfoArg", HFILL }},
+       { &hf_gsm_map_SendAuthenticationInfoRes,
+      { "SendAuthenticationInfoRes", "gsm_map.SendAuthenticationInfoRes",
+        FT_BYTES, BASE_NONE, NULL, 0,
+        "SendAuthenticationInfoRes", HFILL }},
+    { &hf_gsm_map_currentPassword,
+      { "currentPassword", "gsm_map.currentPassword",
+        FT_STRING, BASE_NONE, NULL, 0,
+        "", HFILL }},
+       { &hf_gsm_mapSendEndSignal,
+      { "mapSendEndSignalArg", "gsm_map.mapsendendsignalarg",
+        FT_BYTES, BASE_NONE, NULL, 0,
+        "mapSendEndSignalArg", HFILL }},
     { &hf_gsm_map_extension,
       { "Extension", "gsm_map.extension",
         FT_BOOLEAN, 8, TFS(&gsm_map_extension_value), 0x80,
@@ -14747,11 +15583,11 @@ void proto_register_gsm_map(void) {
         FT_UINT8, BASE_HEX, VALS(gsm_map_number_plan_values), 0x0f,
         "Number plan", HFILL }},
        { &hf_gsm_map_isdn_address_digits,
-      { "ISDN Address digits", "gsm_map.isdn.adress.digits",
+      { "ISDN Address digits", "gsm_map.isdn.address.digits",
         FT_STRING, BASE_NONE, NULL, 0,
         "ISDN Address digits", HFILL }},
        { &hf_gsm_map_address_digits,
-      { "Address digits", "gsm_map.adress.digits",
+      { "Address digits", "gsm_map.address.digits",
         FT_STRING, BASE_NONE, NULL, 0,
         "Address digits", HFILL }},
        { &hf_gsm_map_servicecentreaddress_digits,
@@ -14814,7 +15650,103 @@ void proto_register_gsm_map(void) {
 
 
 /*--- Included file: packet-gsm_map-hfarr.c ---*/
-
+#line 1 "packet-gsm_map-hfarr.c"
+    { &hf_gsm_map_Component_PDU,
+      { "Component", "gsm_map.Component",
+        FT_UINT32, BASE_DEC, VALS(gsm_map_Component_vals), 0,
+        "Component", HFILL }},
+    { &hf_gsm_map_invoke,
+      { "invoke", "gsm_map.invoke",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "Component/invoke", HFILL }},
+    { &hf_gsm_map_returnResultLast,
+      { "returnResultLast", "gsm_map.returnResultLast",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "Component/returnResultLast", HFILL }},
+    { &hf_gsm_map_returnError,
+      { "returnError", "gsm_map.returnError",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "Component/returnError", HFILL }},
+    { &hf_gsm_map_reject,
+      { "reject", "gsm_map.reject",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "Component/reject", HFILL }},
+    { &hf_gsm_map_invokeID,
+      { "invokeID", "gsm_map.invokeID",
+        FT_INT32, BASE_DEC, NULL, 0,
+        "", HFILL }},
+    { &hf_gsm_map_linkedID,
+      { "linkedID", "gsm_map.linkedID",
+        FT_INT32, BASE_DEC, NULL, 0,
+        "Invoke/linkedID", HFILL }},
+    { &hf_gsm_map_opCode,
+      { "opCode", "gsm_map.opCode",
+        FT_UINT32, BASE_DEC, VALS(gsm_map_OPERATION_vals), 0,
+        "", HFILL }},
+    { &hf_gsm_map_invokeparameter,
+      { "invokeparameter", "gsm_map.invokeparameter",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "Invoke/invokeparameter", HFILL }},
+    { &hf_gsm_map_resultretres,
+      { "resultretres", "gsm_map.resultretres",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "ReturnResult/resultretres", HFILL }},
+    { &hf_gsm_map_returnparameter,
+      { "returnparameter", "gsm_map.returnparameter",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "ReturnResult/resultretres/returnparameter", HFILL }},
+    { &hf_gsm_map_errorCode,
+      { "errorCode", "gsm_map.errorCode",
+        FT_UINT32, BASE_DEC, VALS(gsm_map_ERROR_vals), 0,
+        "ReturnError/errorCode", HFILL }},
+    { &hf_gsm_map_parameter,
+      { "parameter", "gsm_map.parameter",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "ReturnError/parameter", HFILL }},
+    { &hf_gsm_map_invokeIDRej,
+      { "invokeIDRej", "gsm_map.invokeIDRej",
+        FT_UINT32, BASE_DEC, VALS(gsm_map_T_invokeIDRej_vals), 0,
+        "Reject/invokeIDRej", HFILL }},
+    { &hf_gsm_map_derivable,
+      { "derivable", "gsm_map.derivable",
+        FT_INT32, BASE_DEC, NULL, 0,
+        "Reject/invokeIDRej/derivable", HFILL }},
+    { &hf_gsm_map_not_derivable,
+      { "not-derivable", "gsm_map.not_derivable",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "Reject/invokeIDRej/not-derivable", HFILL }},
+    { &hf_gsm_map_problem,
+      { "problem", "gsm_map.problem",
+        FT_UINT32, BASE_DEC, VALS(gsm_map_T_problem_vals), 0,
+        "Reject/problem", HFILL }},
+    { &hf_gsm_map_generalProblem,
+      { "generalProblem", "gsm_map.generalProblem",
+        FT_INT32, BASE_DEC, VALS(gsm_map_GeneralProblem_vals), 0,
+        "Reject/problem/generalProblem", HFILL }},
+    { &hf_gsm_map_invokeProblem,
+      { "invokeProblem", "gsm_map.invokeProblem",
+        FT_INT32, BASE_DEC, VALS(gsm_map_InvokeProblem_vals), 0,
+        "Reject/problem/invokeProblem", HFILL }},
+    { &hf_gsm_map_returnResultProblem,
+      { "returnResultProblem", "gsm_map.returnResultProblem",
+        FT_INT32, BASE_DEC, VALS(gsm_map_ReturnResultProblem_vals), 0,
+        "Reject/problem/returnResultProblem", HFILL }},
+    { &hf_gsm_map_returnErrorProblem,
+      { "returnErrorProblem", "gsm_map.returnErrorProblem",
+        FT_INT32, BASE_DEC, VALS(gsm_map_ReturnErrorProblem_vals), 0,
+        "Reject/problem/returnErrorProblem", HFILL }},
+    { &hf_gsm_map_localValue,
+      { "localValue", "gsm_map.localValue",
+        FT_INT32, BASE_DEC, VALS(gsm_map_OperationLocalvalue_vals), 0,
+        "OPERATION/localValue", HFILL }},
+    { &hf_gsm_map_globalValue,
+      { "globalValue", "gsm_map.globalValue",
+        FT_OID, BASE_NONE, NULL, 0,
+        "", HFILL }},
+    { &hf_gsm_map_localValue1,
+      { "localValue", "gsm_map.localValue",
+        FT_INT32, BASE_DEC, VALS(gsm_map_LocalErrorcode_vals), 0,
+        "ERROR/localValue", HFILL }},
     { &hf_gsm_map_protocolId,
       { "protocolId", "gsm_map.protocolId",
         FT_UINT32, BASE_DEC, VALS(gsm_map_ProtocolId_vals), 0,
@@ -14921,7 +15853,7 @@ void proto_register_gsm_map(void) {
         "PrivateExtensionList/_item", HFILL }},
     { &hf_gsm_map_extId,
       { "extId", "gsm_map.extId",
-        FT_STRING, BASE_NONE, NULL, 0,
+        FT_OID, BASE_NONE, NULL, 0,
         "PrivateExtension/extId", HFILL }},
     { &hf_gsm_map_extType,
       { "extType", "gsm_map.extType",
@@ -14947,6 +15879,10 @@ void proto_register_gsm_map(void) {
       { "cancellationType", "gsm_map.cancellationType",
         FT_UINT32, BASE_DEC, VALS(gsm_map_CancellationType_vals), 0,
         "CancelLocationArg/cancellationType", HFILL }},
+    { &hf_gsm_map_imsi_WithLMSI,
+      { "imsi-WithLMSI", "gsm_map.imsi_WithLMSI",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "", HFILL }},
     { &hf_gsm_map_sgsn_Number,
       { "sgsn-Number", "gsm_map.sgsn_Number",
         FT_BYTES, BASE_HEX, NULL, 0,
@@ -16239,10 +17175,6 @@ void proto_register_gsm_map(void) {
       { "suppress-T-CSI", "gsm_map.suppress_T_CSI",
         FT_NONE, BASE_NONE, NULL, 0,
         "CamelInfo/suppress-T-CSI", HFILL }},
-    { &hf_gsm_map_imsi_WithLMSI,
-      { "imsi-WithLMSI", "gsm_map.imsi_WithLMSI",
-        FT_NONE, BASE_NONE, NULL, 0,
-        "Identity/imsi-WithLMSI", HFILL }},
     { &hf_gsm_map_HLR_List_item,
       { "Item", "gsm_map.HLR_List_item",
         FT_BYTES, BASE_HEX, NULL, 0,
@@ -17491,7 +18423,7 @@ void proto_register_gsm_map(void) {
       { "operationCode", "gsm_map.operationCode",
         FT_UINT32, BASE_DEC, VALS(gsm_map_OperationCode_vals), 0,
         "OriginalComponentIdentifier/operationCode", HFILL }},
-    { &hf_gsm_map_errorCode,
+    { &hf_gsm_map_errorCode1,
       { "errorCode", "gsm_map.errorCode",
         FT_UINT32, BASE_DEC, VALS(gsm_map_ErrorCode_vals), 0,
         "OriginalComponentIdentifier/errorCode", HFILL }},
@@ -17499,14 +18431,10 @@ void proto_register_gsm_map(void) {
       { "userInfo", "gsm_map.userInfo",
         FT_NONE, BASE_NONE, NULL, 0,
         "OriginalComponentIdentifier/userInfo", HFILL }},
-    { &hf_gsm_map_localValue,
+    { &hf_gsm_map_localValue2,
       { "localValue", "gsm_map.localValue",
         FT_INT32, BASE_DEC, NULL, 0,
         "", HFILL }},
-    { &hf_gsm_map_globalValue,
-      { "globalValue", "gsm_map.globalValue",
-        FT_STRING, BASE_NONE, NULL, 0,
-        "", HFILL }},
     { &hf_gsm_map_networkResource,
       { "networkResource", "gsm_map.networkResource",
         FT_UINT32, BASE_DEC, VALS(gsm_map_NetworkResource_vals), 0,
@@ -17525,12 +18453,16 @@ void proto_register_gsm_map(void) {
         "RoamingNotAllowedParam/roamingNotAllowedCause", HFILL }},
     { &hf_gsm_map_absentSubscriberReason,
       { "absentSubscriberReason", "gsm_map.absentSubscriberReason",
-        FT_UINT32, BASE_DEC, VALS(gsm_map_T_absentSubscriberReason_vals), 0,
+        FT_UINT32, BASE_DEC, VALS(gsm_map_AbsentSubscriberReason_vals), 0,
         "AbsentSubscriberParam/absentSubscriberReason", HFILL }},
     { &hf_gsm_map_ccbs_Busy,
       { "ccbs-Busy", "gsm_map.ccbs_Busy",
         FT_NONE, BASE_NONE, NULL, 0,
         "BusySubscriberParam/ccbs-Busy", HFILL }},
+    { &hf_gsm_map_gprsConnectionSuspended,
+      { "gprsConnectionSuspended", "gsm_map.gprsConnectionSuspended",
+        FT_NONE, BASE_NONE, NULL, 0,
+        "SubBusyForMT-SMS-Param/gprsConnectionSuspended", HFILL }},
     { &hf_gsm_map_callBarringCause,
       { "callBarringCause", "gsm_map.callBarringCause",
         FT_UINT32, BASE_DEC, VALS(gsm_map_CallBarringCause_vals), 0,
@@ -17542,30 +18474,30 @@ void proto_register_gsm_map(void) {
     { &hf_gsm_map_unauthorisedMessageOriginator,
       { "unauthorisedMessageOriginator", "gsm_map.unauthorisedMessageOriginator",
         FT_NONE, BASE_NONE, NULL, 0,
-        "CallBarredParam/extensibleCallBarredParam/unauthorisedMessageOriginator", HFILL }},
+        "ExtensibleCallBarredParam/unauthorisedMessageOriginator", HFILL }},
     { &hf_gsm_map_cug_RejectCause,
+      { "cug-RejectCause", "gsm_map.cug_RejectCause",
+        FT_UINT32, BASE_DEC, VALS(gsm_map_CUG_RejectCause_vals), 0,
+        "CUG-RejectParam/cug-RejectCause", HFILL }},
+    { &hf_gsm_map_cug_RejectCause1,
       { "cug-RejectCause", "gsm_map.cug_RejectCause",
         FT_UINT32, BASE_DEC, VALS(gsm_map_T_cug_RejectCause_vals), 0,
         "Cug-RejectParam/cug-RejectCause", HFILL }},
-    { &hf_gsm_map_gprsConnectionSuspended,
-      { "gprsConnectionSuspended", "gsm_map.gprsConnectionSuspended",
-        FT_NONE, BASE_NONE, NULL, 0,
-        "SubBusyForMT-SMS-Param/gprsConnectionSuspended", HFILL }},
     { &hf_gsm_map_sm_EnumeratedDeliveryFailureCause,
       { "sm-EnumeratedDeliveryFailureCause", "gsm_map.sm_EnumeratedDeliveryFailureCause",
-        FT_UINT32, BASE_DEC, VALS(gsm_map_T_sm_EnumeratedDeliveryFailureCause_vals), 0,
-        "Sm-DeliveryFailureCause/sm-EnumeratedDeliveryFailureCause", HFILL }},
+        FT_UINT32, BASE_DEC, VALS(gsm_map_SM_EnumeratedDeliveryFailureCause_vals), 0,
+        "SM-DeliveryFailureCause/sm-EnumeratedDeliveryFailureCause", HFILL }},
     { &hf_gsm_map_diagnosticInfo,
       { "diagnosticInfo", "gsm_map.diagnosticInfo",
         FT_BYTES, BASE_HEX, NULL, 0,
-        "Sm-DeliveryFailureCause/diagnosticInfo", HFILL }},
+        "SM-DeliveryFailureCause/diagnosticInfo", HFILL }},
     { &hf_gsm_map_unauthorizedLCSClient_Diagnostic,
       { "unauthorizedLCSClient-Diagnostic", "gsm_map.unauthorizedLCSClient_Diagnostic",
         FT_UINT32, BASE_DEC, VALS(gsm_map_T_unauthorizedLCSClient_Diagnostic_vals), 0,
         "UnauthorizedLCSClient-Param/unauthorizedLCSClient-Diagnostic", HFILL }},
     { &hf_gsm_map_positionMethodFailure_Diagnostic,
       { "positionMethodFailure-Diagnostic", "gsm_map.positionMethodFailure_Diagnostic",
-        FT_UINT32, BASE_DEC, VALS(gsm_map_T_positionMethodFailure_Diagnostic_vals), 0,
+        FT_UINT32, BASE_DEC, VALS(gsm_map_PositionMethodFailure_Diagnostic_vals), 0,
         "PositionMethodFailure-Param/positionMethodFailure-Diagnostic", HFILL }},
     { &hf_gsm_map_pcsExtensions,
       { "pcsExtensions", "gsm_map.pcsExtensions",
@@ -17989,7 +18921,7 @@ void proto_register_gsm_map(void) {
         "", HFILL }},
 
 /*--- End of included file: packet-gsm_map-hfarr.c ---*/
-
+#line 1611 "packet-gsm_map-template.c"
   };
 
   /* List of subtrees */
@@ -18004,7 +18936,17 @@ void proto_register_gsm_map(void) {
     &ett_gsm_map_GSMMAPPDU,
 
 /*--- Included file: packet-gsm_map-ettarr.c ---*/
-
+#line 1 "packet-gsm_map-ettarr.c"
+    &ett_gsm_map_Component,
+    &ett_gsm_map_Invoke,
+    &ett_gsm_map_ReturnResult,
+    &ett_gsm_map_T_resultretres,
+    &ett_gsm_map_ReturnError,
+    &ett_gsm_map_Reject,
+    &ett_gsm_map_T_invokeIDRej,
+    &ett_gsm_map_T_problem,
+    &ett_gsm_map_OPERATION,
+    &ett_gsm_map_ERROR,
     &ett_gsm_map_Bss_APDU,
     &ett_gsm_map_SupportedCamelPhases,
     &ett_gsm_map_UpdateLocationArg,
@@ -18019,6 +18961,7 @@ void proto_register_gsm_map(void) {
     &ett_gsm_map_PcsExtensions,
     &ett_gsm_map_SLR_Arg_PCS_Extensions,
     &ett_gsm_map_CancelLocationArg,
+    &ett_gsm_map_CancelLocationArgV2,
     &ett_gsm_map_CancelLocationRes,
     &ett_gsm_map_PurgeMSArg,
     &ett_gsm_map_PurgeMSRes,
@@ -18344,6 +19287,7 @@ void proto_register_gsm_map(void) {
     &ett_gsm_map_DataMissingParam,
     &ett_gsm_map_UnexpectedDataParam,
     &ett_gsm_map_FacilityNotSupParam,
+    &ett_gsm_map_OR_NotAllowedParam,
     &ett_gsm_map_IncompatibleTerminalParam,
     &ett_gsm_map_ResourceLimitationParam,
     &ett_gsm_map_UnknownSubscriberParam,
@@ -18359,29 +19303,39 @@ void proto_register_gsm_map(void) {
     &ett_gsm_map_AbsentSubscriberParam,
     &ett_gsm_map_BusySubscriberParam,
     &ett_gsm_map_NoSubscriberReplyParam,
-    &ett_gsm_map_CallBarredParam,
-    &ett_gsm_map_T_extensibleCallBarredParam,
+    &ett_gsm_map_ForwardingViolationParam,
     &ett_gsm_map_ForwardingFailedParam,
+    &ett_gsm_map_ATI_NotAllowedParam,
+    &ett_gsm_map_ATSI_NotAllowedParam,
+    &ett_gsm_map_ATM_NotAllowedParam,
+    &ett_gsm_map_IllegalSS_OperationParam,
+    &ett_gsm_map_SS_NotAvailableParam,
+    &ett_gsm_map_SS_SubscriptionViolationParam,
+    &ett_gsm_map_InformationNotAvailableParam,
+    &ett_gsm_map_SubBusyForMT_SMS_Param,
+    &ett_gsm_map_CallBarredParam,
+    &ett_gsm_map_ExtensibleCallBarredParam,
+    &ett_gsm_map_CUG_RejectParam,
     &ett_gsm_map_Or_NotAllowedParam,
-    &ett_gsm_map_ForwardingViolationParam,
     &ett_gsm_map_Cug_RejectParam,
-    &ett_gsm_map_Ati_NotAllowedParam,
     &ett_gsm_map_NoGroupCallNbParam,
     &ett_gsm_map_SS_IncompatibilityCause,
     &ett_gsm_map_ShortTermDenialParam,
     &ett_gsm_map_LongTermDenialParam,
-    &ett_gsm_map_SubBusyForMT_SMS_Param,
-    &ett_gsm_map_Sm_DeliveryFailureCause,
+    &ett_gsm_map_SM_DeliveryFailureCause,
     &ett_gsm_map_MessageWaitListFullParam,
     &ett_gsm_map_AbsentSubscriberSM_Param,
     &ett_gsm_map_UnauthorizedRequestingNetwork_Param,
     &ett_gsm_map_UnauthorizedLCSClient_Param,
     &ett_gsm_map_PositionMethodFailure_Param,
     &ett_gsm_map_UnknownOrUnreachableLCSClient_Param,
+    &ett_gsm_map_MM_EventNotSupported_Param,
+    &ett_gsm_map_TargetCellOutsideGCA_Param,
+    &ett_gsm_map_SecureTransportErrorParam,
     &ett_gsm_map_ExtensionContainer,
 
 /*--- End of included file: packet-gsm_map-ettarr.c ---*/
-
+#line 1624 "packet-gsm_map-template.c"
   };
 
   /* Register protocol */