Set the svn:eol-style property on all text files to "native", so that
[obnox/wireshark/wip.git] / packet-sua.c
index 9ec9dba1f49328c4869cd798ea0a78c054394bc6..cd90c4e390b5f98cc36308bf30161db6661fcc5d 100644 (file)
@@ -1,12 +1,11 @@
 /* packet-sua.c
- * Routines for  SS7 SCCP-User Adaptation Layer (SUA) dissection
+ * Routines for SS7 SCCP-User Adaptation Layer (SUA) dissection
  * It is hopefully (needs testing) compilant to
- * http://www.ietf.org/internet-drafts/draft-ietf-sigtran-sua-08.txt
- * and also supports SUA light, a trivial Siemens proprietary version.
+ * http://www.ietf.org/internet-drafts/draft-ietf-sigtran-sua-15.txt
  *
- * Copyright 2000, Michael Tüxen <Michael.Tuexen [AT] siemens.com>
+ * Copyright 2002, 2003 Michael Tuexen <tuexen [AT] fh-muenster.de>
  *
- * $Id: packet-sua.c,v 1.12 2003/01/14 23:53:33 guy Exp $
+ * $Id$
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@ethereal.com>
 # include "config.h"
 #endif
 
-#include <stdio.h>
-#include <stdlib.h>
-
-
-#include <string.h>
-#include <glib.h>
-
 #include <epan/packet.h>
 #include "prefs.h"
 #include "sctpppids.h"
 
+#define NETWORK_BYTE_ORDER     FALSE
+#define ADD_PADDING(x) ((((x) + 3) >> 2) << 2)
 #define SCTP_PORT_SUA          14001
 
 #define RESERVED_1_LENGTH      1
@@ -74,7 +68,6 @@
 #define PARAMETER_VALUE_OFFSET    (PARAMETER_LENGTH_OFFSET + PARAMETER_LENGTH_LENGTH)
 #define PARAMETER_HEADER_OFFSET   PARAMETER_TAG_OFFSET
 
-#define DATA_PARAMETER_TAG                         0x0003
 #define INFO_STRING_PARAMETER_TAG                  0x0004
 #define ROUTING_CONTEXT_PARAMETER_TAG              0x0006
 #define DIAGNOSTIC_INFO_PARAMETER_TAG              0x0007
 #define TRAFFIC_MODE_TYPE_PARAMETER_TAG            0x000b
 #define ERROR_CODE_PARAMETER_TAG                   0x000c
 #define STATUS_PARAMETER_TAG                       0x000d
-#define CONGESTION_LEVEL_PARAMETER_TAG             0x000f
 #define ASP_IDENTIFIER_PARAMETER_TAG               0x0011
 #define AFFECTED_POINT_CODE_PARAMETER_TAG          0x0012
+#define CORRELATION_ID_PARAMETER_TAG               0x0013
+#define REGISTRATION_RESULT_PARAMETER_TAG          0x0014
+#define DEREGISTRATION_RESULT_PARAMETER_TAG        0x0015
+#define REGISTRATION_STATUS_PARAMETER_TAG          0x0016
+#define DEREGISTRATION_STATUS_PARAMETER_TAG        0x0017
+#define LOCAL_ROUTING_KEY_IDENTIFIER_PARAMETER_TAG 0x0018
+
 #define SS7_HOP_COUNTER_PARAMETER_TAG              0x0101
 #define SOURCE_ADDRESS_PARAMETER_TAG               0x0102
 #define DESTINATION_ADDRESS_PARAMETER_TAG          0x0103
 #define RECEIVE_SEQUENCE_NUMBER_PARAMETER_TAG      0x0108
 #define ASP_CAPABILITIES_PARAMETER_TAG             0x0109
 #define CREDIT_PARAMETER_TAG                       0x010a
+#define DATA_PARAMETER_TAG                         0x010b
 #define USER_CAUSE_PARAMETER_TAG                   0x010c
 #define NETWORK_APPEARANCE_PARAMETER_TAG           0x010d
 #define ROUTING_KEY_PARAMETER_TAG                  0x010e
-#define REGISTRATION_RESULT_PARAMETER_TAG          0x010f
-#define DEREGISTRATION_RESULT_PARAMETER_TAG        0x0110
+#define DRN_LABEL_PARAMETER_TAG                    0x010f
+#define TID_LABEL_PARAMETER_TAG                    0x0110
 #define ADDRESS_RANGE_PARAMETER_TAG                0x0111
-#define CORRELATION_ID_PARAMETER_TAG               0x0112
+#define SMI_PARAMETER_TAG                          0x0112
 #define IMPORTANCE_PARAMETER_TAG                   0x0113
 #define MESSAGE_PRIORITY_PARAMETER_TAG             0x0114
 #define PROTOCOL_CLASS_PARAMETER_TAG               0x0115
 #define SEQUENCE_CONTROL_PARAMETER_TAG             0x0116
 #define SEGMENTATION_PARAMETER_TAG                 0x0117
-#define SMI_PARAMETER_TAG                          0x0118
-#define TID_LABEL_PARAMETER_TAG                    0x0119
-#define DRN_LABEL_PARAMETER_TAG                    0x011a
+#define CONGESTION_LEVEL_PARAMETER_TAG             0x0118
+
 #define GLOBAL_TITLE_PARAMETER_TAG                 0x8001
 #define POINT_CODE_PARAMETER_TAG                   0x8002
 #define SUBSYSTEM_NUMBER_PARAMETER_TAG             0x8003
 #define HOSTNAME_PARAMETER_TAG                     0x8005
 #define IPV6_ADDRESS_PARAMETER_TAG                 0x8006
 
-static const value_string sua_parameter_tag_values[] = {
-  { DATA_PARAMETER_TAG,                         "Data" },
+static const value_string parameter_tag_values[] = {
   { INFO_STRING_PARAMETER_TAG,                  "Info String" },
   { ROUTING_CONTEXT_PARAMETER_TAG,              "Routing context" },
-  { DIAGNOSTIC_INFO_PARAMETER_TAG,              "Diagnostic Info" },
+  { DIAGNOSTIC_INFO_PARAMETER_TAG,              "Diagnostic info" },
   { HEARTBEAT_DATA_PARAMETER_TAG,               "Heartbeat data" },
   { TRAFFIC_MODE_TYPE_PARAMETER_TAG,            "Traffic mode type" },
   { ERROR_CODE_PARAMETER_TAG,                   "Error code" },
   { STATUS_PARAMETER_TAG,                       "Status" },
-  { CONGESTION_LEVEL_PARAMETER_TAG,             "Congestion Level" },
-  { ASP_IDENTIFIER_PARAMETER_TAG,               "ASP Identifier" },
-  { AFFECTED_POINT_CODE_PARAMETER_TAG,          "Affected Point Code" },
-  { SS7_HOP_COUNTER_PARAMETER_TAG,              "SS7 Hop Counter" },
-  { SOURCE_ADDRESS_PARAMETER_TAG,               "Source Address" },
-  { DESTINATION_ADDRESS_PARAMETER_TAG,          "Destination Address" },
-  { SOURCE_REFERENCE_NUMBER_PARAMETER_TAG,      "Source Reference Number" },
-  { DESTINATION_REFERENCE_NUMBER_PARAMETER_TAG, "Destination Reference Number" },
-  { SCCP_CAUSE_PARAMETER_TAG,                   "SCCP Cause" },
-  { SEQUENCE_NUMBER_PARAMETER_TAG,              "Sequence Number" },
-  { RECEIVE_SEQUENCE_NUMBER_PARAMETER_TAG,      "Receive Sequence Number" },
-  { ASP_CAPABILITIES_PARAMETER_TAG,             "ASP Capabilities" },
+  { ASP_IDENTIFIER_PARAMETER_TAG,               "ASP identifier" },
+  { AFFECTED_POINT_CODE_PARAMETER_TAG,          "Affected point code" },
+  { CORRELATION_ID_PARAMETER_TAG,               "Correlation ID" },
+  { REGISTRATION_RESULT_PARAMETER_TAG,          "Registration result" },
+  { DEREGISTRATION_RESULT_PARAMETER_TAG,        "Deregistration result" },
+  { REGISTRATION_STATUS_PARAMETER_TAG,          "Registration status" },
+  { DEREGISTRATION_STATUS_PARAMETER_TAG,        "Deregistration status" },
+  { LOCAL_ROUTING_KEY_IDENTIFIER_PARAMETER_TAG, "Local routing key identifier" },
+  { SS7_HOP_COUNTER_PARAMETER_TAG,              "SS7 hop counter" },
+  { SOURCE_ADDRESS_PARAMETER_TAG,               "Source address" },
+  { DESTINATION_ADDRESS_PARAMETER_TAG,          "Destination address" },
+  { SOURCE_REFERENCE_NUMBER_PARAMETER_TAG,      "Source reference number" },
+  { DESTINATION_REFERENCE_NUMBER_PARAMETER_TAG, "Destination reference number" },
+  { SCCP_CAUSE_PARAMETER_TAG,                   "SCCP cause" },
+  { SEQUENCE_NUMBER_PARAMETER_TAG,              "Sequence number" },
+  { RECEIVE_SEQUENCE_NUMBER_PARAMETER_TAG,      "Receive sequence number" },
+  { ASP_CAPABILITIES_PARAMETER_TAG,             "ASP capabilities" },
   { CREDIT_PARAMETER_TAG,                       "Credit" },
+  { DATA_PARAMETER_TAG,                         "Data" },
   { USER_CAUSE_PARAMETER_TAG,                   "User/Cause" },
-  { NETWORK_APPEARANCE_PARAMETER_TAG,           "Network Appearance" },
-  { ROUTING_KEY_PARAMETER_TAG,                  "Routing Key" },
-  { REGISTRATION_RESULT_PARAMETER_TAG,          "Registration Result" },
-  { DEREGISTRATION_RESULT_PARAMETER_TAG,        "Deregistration Result" },
-  { ADDRESS_RANGE_PARAMETER_TAG,                "Address Range" },
-  { CORRELATION_ID_PARAMETER_TAG,               "Correlation ID" },
+  { NETWORK_APPEARANCE_PARAMETER_TAG,           "Network appearance" },
+  { ROUTING_KEY_PARAMETER_TAG,                  "Routing key" },
+  { DRN_LABEL_PARAMETER_TAG,                    "DRN label" },
+  { TID_LABEL_PARAMETER_TAG,                    "TID label" },
+  { ADDRESS_RANGE_PARAMETER_TAG,                "Address range" },
+  { SMI_PARAMETER_TAG,                          "SMI" },
   { IMPORTANCE_PARAMETER_TAG,                   "Importance" },
-  { MESSAGE_PRIORITY_PARAMETER_TAG,             "Message Priority" },
-  { PROTOCOL_CLASS_PARAMETER_TAG,               "Protocol Class" },
-  { SEQUENCE_CONTROL_PARAMETER_TAG,             "Sequence Control" },
+  { MESSAGE_PRIORITY_PARAMETER_TAG,             "Message priority" },
+  { PROTOCOL_CLASS_PARAMETER_TAG,               "Protocol class" },
+  { SEQUENCE_CONTROL_PARAMETER_TAG,             "Sequence control" },
   { SEGMENTATION_PARAMETER_TAG,                 "Segmentation" },
-  { SMI_PARAMETER_TAG,                          "SMI" },
-  { TID_LABEL_PARAMETER_TAG,                    "TID Label" },
-  { DRN_LABEL_PARAMETER_TAG,                    "DRN Label" },
-  { GLOBAL_TITLE_PARAMETER_TAG,                 "Global Title" },
-  { POINT_CODE_PARAMETER_TAG,                   "Point Code" },
-  { SUBSYSTEM_NUMBER_PARAMETER_TAG,             "Subsystem Number" },
-  { IPV4_ADDRESS_PARAMETER_TAG,                 "IPv4 Address" },
+  { CONGESTION_LEVEL_PARAMETER_TAG,             "Congestion level" },
+  { GLOBAL_TITLE_PARAMETER_TAG,                 "Global title" },
+  { POINT_CODE_PARAMETER_TAG,                   "Point code" },
+  { SUBSYSTEM_NUMBER_PARAMETER_TAG,             "Subsystem number" },
+  { IPV4_ADDRESS_PARAMETER_TAG,                 "IPv4 address" },
   { HOSTNAME_PARAMETER_TAG,                     "Hostname" },
-  { IPV6_ADDRESS_PARAMETER_TAG,                 "IPv6 Address" },
+  { IPV6_ADDRESS_PARAMETER_TAG,                 "IPv6 address" },
   { 0,                                          NULL } };
 
 #define PROTOCOL_VERSION_RELEASE_1             1
 
-static const value_string sua_protocol_version_values[] = {
+static const value_string protocol_version_values[] = {
   { PROTOCOL_VERSION_RELEASE_1,  "Release 1" },
   { 0,                           NULL } };
 
@@ -177,7 +179,7 @@ static const value_string sua_protocol_version_values[] = {
 #define MESSAGE_CLASS_CO_MESSAGE          8
 #define MESSAGE_CLASS_RKM_MESSAGE         9
 
-static const value_string sua_message_class_values[] = {
+static const value_string message_class_values[] = {
   { MESSAGE_CLASS_MGMT_MESSAGE,   "Management messages" },
   { MESSAGE_CLASS_SSNM_MESSAGE,   "SS7 signalling network management messages" },
   { MESSAGE_CLASS_ASPSM_MESSAGE,  "ASP state maintenance messages" },
@@ -230,7 +232,7 @@ static const value_string sua_message_class_values[] = {
 #define MESSAGE_TYPE_DEREG_RSP            4
 
 
-static const value_string sua_message_class_type_values[] = {
+static const value_string message_class_type_values[] = {
   { MESSAGE_CLASS_MGMT_MESSAGE  * 256 + MESSAGE_TYPE_ERR,           "Error (ERR)" },
   { MESSAGE_CLASS_MGMT_MESSAGE  * 256 + MESSAGE_TYPE_NTFY,          "Notify (NTFY)" },
   { MESSAGE_CLASS_SSNM_MESSAGE  * 256 + MESSAGE_TYPE_DUNA,          "Destination unavailable (DUNA)" },
@@ -238,6 +240,7 @@ static const value_string sua_message_class_type_values[] = {
   { MESSAGE_CLASS_SSNM_MESSAGE  * 256 + MESSAGE_TYPE_DAUD,          "Destination state audit (DAUD)" },
   { MESSAGE_CLASS_SSNM_MESSAGE  * 256 + MESSAGE_TYPE_SCON,          "SS7 Network congestion state (SCON)" },
   { MESSAGE_CLASS_SSNM_MESSAGE  * 256 + MESSAGE_TYPE_DUPU,          "Destination userpart unavailable (DUPU)" },
+  { MESSAGE_CLASS_SSNM_MESSAGE  * 256 + MESSAGE_TYPE_DRST,          "Destination Restricted (DRST)" },
   { MESSAGE_CLASS_ASPSM_MESSAGE * 256 + MESSAGE_TYPE_UP,            "ASP up (UP)" },
   { MESSAGE_CLASS_ASPSM_MESSAGE * 256 + MESSAGE_TYPE_DOWN,          "ASP down (DOWN)" },
   { MESSAGE_CLASS_ASPSM_MESSAGE * 256 + MESSAGE_TYPE_BEAT,          "Heartbeat (BEAT)" },
@@ -267,7 +270,7 @@ static const value_string sua_message_class_type_values[] = {
   { MESSAGE_CLASS_RKM_MESSAGE   * 256 + MESSAGE_TYPE_DEREG_RSP ,    "Deregistartion Response (DEREG_RSP)" },
   { 0,                           NULL } };
 
-static const value_string sua_message_class_type_acro_values[] = {
+static const value_string message_class_type_acro_values[] = {
   { MESSAGE_CLASS_MGMT_MESSAGE  * 256 + MESSAGE_TYPE_ERR,           "ERR" },
   { MESSAGE_CLASS_MGMT_MESSAGE  * 256 + MESSAGE_TYPE_NTFY,          "NTFY" },
   { MESSAGE_CLASS_SSNM_MESSAGE  * 256 + MESSAGE_TYPE_DUNA,          "DUNA" },
@@ -275,6 +278,7 @@ static const value_string sua_message_class_type_acro_values[] = {
   { MESSAGE_CLASS_SSNM_MESSAGE  * 256 + MESSAGE_TYPE_DAUD,          "DAUD" },
   { MESSAGE_CLASS_SSNM_MESSAGE  * 256 + MESSAGE_TYPE_SCON,          "SCON" },
   { MESSAGE_CLASS_SSNM_MESSAGE  * 256 + MESSAGE_TYPE_DUPU,          "DUPU" },
+  { MESSAGE_CLASS_SSNM_MESSAGE  * 256 + MESSAGE_TYPE_DRST,          "DRST" },
   { MESSAGE_CLASS_ASPSM_MESSAGE * 256 + MESSAGE_TYPE_UP,            "ASP_UP" },
   { MESSAGE_CLASS_ASPSM_MESSAGE * 256 + MESSAGE_TYPE_DOWN,          "ASP_DOWN" },
   { MESSAGE_CLASS_ASPSM_MESSAGE * 256 + MESSAGE_TYPE_BEAT,          "BEAT" },
@@ -305,118 +309,102 @@ static const value_string sua_message_class_type_acro_values[] = {
   { 0,                           NULL } };
 
 /* Initialize the protocol and registered fields */
-static module_t *sua_module;
 static int proto_sua = -1;
-static int hf_sua_version = -1;
-static int hf_sua_reserved = -1;
-static int hf_sua_message_class = -1;
-static int hf_sua_message_type = -1;
-static int hf_sua_message_length = -1;
-static int hf_sua_parameter_tag = -1;
-static int hf_sua_parameter_length = -1;
-static int hf_sua_parameter_value = -1;
-static int hf_sua_parameter_padding = -1;
-static int hf_sua_data_padding = -1;
-static int hf_sua_info_string = -1;
-static int hf_sua_info_string_padding = -1;
-static int hf_sua_routing_context = -1;
-static int hf_sua_diagnostic_information_info = -1;
-static int hf_sua_diagnostic_information_padding = -1;
-static int hf_sua_heartbeat_data = -1;
-static int hf_sua_heartbeat_padding = -1;
-static int hf_sua_traffic_mode_type = -1;
-static int hf_sua_error_code = -1;
-static int hf_sua_status_type = -1;
-static int hf_sua_status_info = -1;
-static int hf_sua_congestion_level = -1;
-static int hf_sua_asp_identifier = -1;
-static int hf_sua_mask = -1;
-static int hf_sua_dpc = -1;
-static int hf_sua_source_address_routing_indicator = -1;
-static int hf_sua_source_address_reserved_bits = -1;
-static int hf_sua_source_address_gt_bit = -1;
-static int hf_sua_source_address_pc_bit = -1;
-static int hf_sua_source_address_ssn_bit = -1;
-static int hf_sua_destination_address_routing_indicator = -1;
-static int hf_sua_destination_address_reserved_bits = -1;
-static int hf_sua_destination_address_gt_bit = -1;
-static int hf_sua_destination_address_pc_bit = -1;
-static int hf_sua_destination_address_ssn_bit = -1;
-static int hf_sua_ss7_hop_counter_counter = -1;
-static int hf_sua_ss7_hop_counter_reserved = -1;
-static int hf_sua_destination_reference_number = -1;
-static int hf_sua_source_reference_number = -1;
-static int hf_sua_cause_reserved = -1;
-static int hf_sua_cause_type = -1;
-static int hf_sua_cause_value = -1;
-static int hf_sua_sequence_number_reserved = -1;
-static int hf_sua_sequence_number_rec_number = -1;
-static int hf_sua_sequence_number_spare_bit = -1;
-static int hf_sua_sequence_number_sent_number = -1;
-static int hf_sua_sequence_number_more_data_bit = -1;
-static int hf_sua_receive_sequence_number_reserved = -1;
-static int hf_sua_receive_sequence_number_number = -1;
-static int hf_sua_receive_sequence_number_spare_bit = -1;
-static int hf_sua_asp_capabilities_reserved = -1;
-static int hf_sua_asp_capabilities_reserved_bits = -1;
-static int hf_sua_asp_capabilities_a_bit =-1;
-static int hf_sua_asp_capabilities_b_bit =-1;
-static int hf_sua_asp_capabilities_c_bit =-1;
-static int hf_sua_asp_capabilities_d_bit =-1;
-static int hf_sua_asp_capabilities_interworking = -1;
-static int hf_sua_credit = -1;
-static int hf_sua_cause = -1;
-static int hf_sua_user = -1;
-static int hf_sua_network_appearance = -1;
-static int hf_sua_routing_key_identifier = -1;
-static int hf_sua_registration_result_routing_key_identifier = -1;
-static int hf_sua_registration_result_status = -1;
-static int hf_sua_registration_result_routing_context = -1;
-static int hf_sua_deregistration_result_status = -1;
-static int hf_sua_deregistration_result_routing_context = -1;
-static int hf_sua_correlation_id = -1;
-static int hf_sua_importance_reserved = -1;
-static int hf_sua_importance = -1;
-static int hf_sua_message_priority_reserved = -1;
-static int hf_sua_message_priority = -1;
-static int hf_sua_protocol_class_reserved = -1;
-static int hf_sua_return_on_error_bit = -1;
-static int hf_sua_protocol_class = -1;
-static int hf_sua_sequence_control = -1;
-static int hf_sua_first_bit = -1;
-static int hf_sua_number_of_remaining_segments = -1;
-static int hf_sua_segmentation_reference = -1;
-static int hf_sua_smi = -1;
-static int hf_sua_smi_reserved = -1;
-static int hf_sua_tid_label_start = -1;
-static int hf_sua_tid_label_end = -1;
-static int hf_sua_tid_label_value = -1;
-static int hf_sua_drn_label_start = -1;
-static int hf_sua_drn_label_end = -1;
-static int hf_sua_drn_label_value = -1;
-static int hf_sua_number_of_digits = -1;
-static int hf_sua_translation_type = -1;
-static int hf_sua_numbering_plan = -1;
-static int hf_sua_nature_of_address = -1;
-static int hf_sua_global_title = -1;
-static int hf_sua_global_title_padding = -1;
-static int hf_sua_point_code_mask = -1;
-static int hf_sua_point_code_dpc = -1;
-static int hf_sua_ssn_reserved = -1;
-static int hf_sua_ssn_number = -1;
-static int hf_sua_ipv4 = -1;
-static int hf_sua_hostname = -1;
-static int hf_sua_hostname_padding = -1;
-static int hf_sua_ipv6 = -1;
-/* Support of Light version starts here */
-static int hf_sua_light_version = -1;
-static int hf_sua_light_spare_1 = -1;
-static int hf_sua_light_message_type = -1;
-static int hf_sua_light_subsystem_number = -1;
-static int hf_sua_light_spare_2 = -1;
-static int hf_sua_light_message_length = -1;
-static int hf_sua_light_error_code = -1;
-/* Support of Light version end here */
+static int hf_version = -1;
+static int hf_reserved = -1;
+static int hf_message_class = -1;
+static int hf_message_type = -1;
+static int hf_message_length = -1;
+static int hf_parameter_tag = -1;
+static int hf_parameter_length = -1;
+static int hf_parameter_value = -1;
+static int hf_parameter_padding = -1;
+static int hf_info_string = -1;
+static int hf_routing_context = -1;
+static int hf_diagnostic_information_info = -1;
+static int hf_heartbeat_data = -1;
+static int hf_traffic_mode_type = -1;
+static int hf_error_code = -1;
+static int hf_status_type = -1;
+static int hf_status_info = -1;
+static int hf_congestion_level = -1;
+static int hf_asp_identifier = -1;
+static int hf_mask = -1;
+static int hf_dpc = -1;
+static int hf_registration_status = -1;
+static int hf_deregistration_status = -1;
+static int hf_local_routing_key_identifier = -1;
+static int hf_source_address_routing_indicator = -1;
+static int hf_source_address_reserved_bits = -1;
+static int hf_source_address_gt_bit = -1;
+static int hf_source_address_pc_bit = -1;
+static int hf_source_address_ssn_bit = -1;
+static int hf_destination_address_routing_indicator = -1;
+static int hf_destination_address_reserved_bits = -1;
+static int hf_destination_address_gt_bit = -1;
+static int hf_destination_address_pc_bit = -1;
+static int hf_destination_address_ssn_bit = -1;
+static int hf_ss7_hop_counter_counter = -1;
+static int hf_ss7_hop_counter_reserved = -1;
+static int hf_destination_reference_number = -1;
+static int hf_source_reference_number = -1;
+static int hf_cause_reserved = -1;
+static int hf_cause_type = -1;
+static int hf_cause_value = -1;
+static int hf_sequence_number_reserved = -1;
+static int hf_sequence_number_rec_number = -1;
+static int hf_sequence_number_spare_bit = -1;
+static int hf_sequence_number_sent_number = -1;
+static int hf_sequence_number_more_data_bit = -1;
+static int hf_receive_sequence_number_reserved = -1;
+static int hf_receive_sequence_number_number = -1;
+static int hf_receive_sequence_number_spare_bit = -1;
+static int hf_asp_capabilities_reserved = -1;
+static int hf_asp_capabilities_reserved_bits = -1;
+static int hf_asp_capabilities_a_bit =-1;
+static int hf_asp_capabilities_b_bit =-1;
+static int hf_asp_capabilities_c_bit =-1;
+static int hf_asp_capabilities_d_bit =-1;
+static int hf_asp_capabilities_interworking = -1;
+static int hf_credit = -1;
+static int hf_data = -1;
+static int hf_cause = -1;
+static int hf_user = -1;
+static int hf_network_appearance = -1;
+static int hf_routing_key_identifier = -1;
+static int hf_correlation_id = -1;
+static int hf_importance_reserved = -1;
+static int hf_importance = -1;
+static int hf_message_priority_reserved = -1;
+static int hf_message_priority = -1;
+static int hf_protocol_class_reserved = -1;
+static int hf_return_on_error_bit = -1;
+static int hf_protocol_class = -1;
+static int hf_sequence_control = -1;
+static int hf_first_bit = -1;
+static int hf_number_of_remaining_segments = -1;
+static int hf_segmentation_reference = -1;
+static int hf_smi = -1;
+static int hf_smi_reserved = -1;
+static int hf_tid_label_start = -1;
+static int hf_tid_label_end = -1;
+static int hf_tid_label_value = -1;
+static int hf_drn_label_start = -1;
+static int hf_drn_label_end = -1;
+static int hf_drn_label_value = -1;
+static int hf_gt_reserved = -1;
+static int hf_gti = -1;
+static int hf_number_of_digits = -1;
+static int hf_translation_type = -1;
+static int hf_numbering_plan = -1;
+static int hf_nature_of_address = -1;
+static int hf_global_title = -1;
+static int hf_point_code_dpc = -1;
+static int hf_ssn_reserved = -1;
+static int hf_ssn_number = -1;
+static int hf_ipv4 = -1;
+static int hf_hostname = -1;
+static int hf_ipv6 = -1;
 
 /* Initialize the subtree pointers */
 static gint ett_sua = -1;
@@ -431,263 +419,134 @@ static gint ett_sua_receive_sequence_number_number = -1;
 static gint ett_sua_return_on_error_bit_and_protocol_class = -1;
 static gint ett_sua_protcol_classes = -1;
 
-/* stuff for supporting multiple versions */
-#define SIEMENS_VERSION   1
-#define IETF_VERSION08    2
-static gint sua_version = IETF_VERSION08;
-
-static dissector_table_t sua_light_dissector_table;
-/* ends here */
+static dissector_handle_t data_handle;
+static dissector_table_t sua_ssn_dissector_table;
 
 static void
-dissect_sua_tlv_list(tvbuff_t *tlv_tvb, proto_tree *sua_tree, gint initial_offset);
-
-static guint
-nr_of_padding_bytes (guint length)
-{
-  guint remainder;
-
-  remainder = length % 4;
-
-  if (remainder == 0)
-    return 0;
-  else
-    return 4 - remainder;
-}
+dissect_parameters(tvbuff_t *tlv_tvb, proto_tree *tree, tvbuff_t **data_tvb, guint8 *source_ssn, guint8 *dest_ssn);
 
 static void
-dissect_sua_common_header(tvbuff_t *common_header_tvb, packet_info *pinfo, proto_tree *sua_tree)
+dissect_common_header(tvbuff_t *common_header_tvb, packet_info *pinfo, proto_tree *sua_tree)
 {
-  guint8  version, message_class, message_type;
-  guint32 message_length;
-  /* Extract the common header */
-  version        = tvb_get_guint8(common_header_tvb, VERSION_OFFSET);
+  guint8  message_class, message_type;
   message_class  = tvb_get_guint8(common_header_tvb, MESSAGE_CLASS_OFFSET);
   message_type   = tvb_get_guint8(common_header_tvb, MESSAGE_TYPE_OFFSET);
-  message_length = tvb_get_ntohl (common_header_tvb, MESSAGE_LENGTH_OFFSET);
 
-  if (check_col(pinfo->cinfo, COL_INFO)) {
-    col_append_str(pinfo->cinfo, COL_INFO, val_to_str(message_class * 256 + message_type, sua_message_class_type_acro_values, "reserved"));
-    col_append_str(pinfo->cinfo, COL_INFO, " ");
-  };
+  if (check_col(pinfo->cinfo, COL_INFO))
+    col_add_fstr(pinfo->cinfo, COL_INFO, "%s ", val_to_str(message_class * 256 + message_type, message_class_type_acro_values, "reserved"));
 
   if (sua_tree) {
     /* add the components of the common header to the protocol tree */
-    proto_tree_add_uint(sua_tree, hf_sua_version,
-                        common_header_tvb, VERSION_OFFSET, VERSION_LENGTH,
-                        version);
-    proto_tree_add_bytes(sua_tree, hf_sua_reserved,
-                                          common_header_tvb, RESERVED_OFFSET, RESERVED_LENGTH,
-                         tvb_get_ptr(common_header_tvb, RESERVED_OFFSET, RESERVED_LENGTH));
-    proto_tree_add_uint(sua_tree, hf_sua_message_class,
-                        common_header_tvb, MESSAGE_CLASS_OFFSET, MESSAGE_CLASS_LENGTH,
-                        message_class);
-    proto_tree_add_uint_format(sua_tree, hf_sua_message_type,
-                               common_header_tvb, MESSAGE_TYPE_OFFSET, MESSAGE_TYPE_LENGTH,
-                               message_type, "Message Type: %s (%u)",
-                                                val_to_str(message_class * 256 + message_type, sua_message_class_type_values, "reserved"), message_type);
-    proto_tree_add_uint(sua_tree, hf_sua_message_length,
-                        common_header_tvb, MESSAGE_LENGTH_OFFSET, MESSAGE_LENGTH_LENGTH,
-                                         message_length);
+    proto_tree_add_item(sua_tree, hf_version,        common_header_tvb, VERSION_OFFSET,        VERSION_LENGTH,        NETWORK_BYTE_ORDER);
+    proto_tree_add_item(sua_tree, hf_reserved,       common_header_tvb, RESERVED_OFFSET,       RESERVED_LENGTH,       NETWORK_BYTE_ORDER);
+    proto_tree_add_item(sua_tree, hf_message_class,  common_header_tvb, MESSAGE_CLASS_OFFSET,  MESSAGE_CLASS_LENGTH,  NETWORK_BYTE_ORDER);
+    proto_tree_add_uint_format(sua_tree, hf_message_type, common_header_tvb, MESSAGE_TYPE_OFFSET, MESSAGE_TYPE_LENGTH, message_type, "Message Type: %s (%u)",
+                                          val_to_str(message_class * 256 + message_type, message_class_type_values, "reserved"), message_type);
+    proto_tree_add_item(sua_tree, hf_message_length, common_header_tvb, MESSAGE_LENGTH_OFFSET, MESSAGE_LENGTH_LENGTH, NETWORK_BYTE_ORDER);
   };
 }
 
-#define DATA_PARAMETER_DATA_OFFSET PARAMETER_VALUE_OFFSET
+#define INFO_STRING_OFFSET PARAMETER_VALUE_OFFSET
 
 static void
-dissect_sua_data_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+dissect_info_string_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
 {
-  guint16 length, data_length, padding_length;
+  guint16 info_string_length;
 
-  length         = tvb_get_ntohs(parameter_tvb, PARAMETER_LENGTH_OFFSET);
-  data_length    = length - PARAMETER_HEADER_LENGTH;
-  padding_length = nr_of_padding_bytes(length);
-
-  proto_tree_add_text(parameter_tree, parameter_tvb, DATA_PARAMETER_DATA_OFFSET, data_length,
-                                 "Data (%u byte%s)", data_length, plurality(data_length, "", "s"));
-
-  if (padding_length > 0)
-    proto_tree_add_bytes(parameter_tree, hf_sua_data_padding,
-                         parameter_tvb, PARAMETER_VALUE_OFFSET + data_length, padding_length,
-                         tvb_get_ptr(parameter_tvb, PARAMETER_VALUE_OFFSET + data_length, padding_length));
-
-  proto_item_set_text(parameter_item, "Data (SS7 message of %u byte%s)",
-                                 data_length, plurality(data_length, "", "s"));
-}
-
-#define INFO_PARAMETER_INFO_STRING_OFFSET PARAMETER_VALUE_OFFSET
-
-static void
-dissect_sua_info_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
-{
-  guint16 length, info_string_length, padding_length;
-  const char *info_string;
-
-  length = tvb_get_ntohs(parameter_tvb, PARAMETER_LENGTH_OFFSET);
-  padding_length = nr_of_padding_bytes(length);
-
-  info_string_length = length - PARAMETER_HEADER_LENGTH;
-  proto_tree_add_item(parameter_tree, hf_sua_info_string,
-                                       parameter_tvb, INFO_PARAMETER_INFO_STRING_OFFSET, info_string_length, FALSE);
-
-  if (padding_length > 0)
-    proto_tree_add_bytes(parameter_tree, hf_sua_info_string_padding,
-                         parameter_tvb, PARAMETER_VALUE_OFFSET + info_string_length, padding_length,
-                         tvb_get_ptr(parameter_tvb, PARAMETER_VALUE_OFFSET + info_string_length, padding_length));
-
-  info_string = (const char *)tvb_get_ptr(parameter_tvb, INFO_PARAMETER_INFO_STRING_OFFSET, info_string_length);
-  proto_item_set_text(parameter_item, "Info String (%.*s)", (int) info_string_length, info_string);
+  info_string_length = tvb_get_ntohs(parameter_tvb, PARAMETER_LENGTH_OFFSET) - PARAMETER_HEADER_LENGTH;
+  proto_tree_add_item(parameter_tree, hf_info_string, parameter_tvb, INFO_STRING_OFFSET, info_string_length, NETWORK_BYTE_ORDER);
+  proto_item_append_text(parameter_item, " (%.*s)", info_string_length,
+                         (const char *)tvb_get_ptr(parameter_tvb, INFO_STRING_OFFSET, info_string_length));
 }
 
 #define ROUTING_CONTEXT_LENGTH 4
 
 static void
-dissect_sua_routing_context_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+dissect_routing_context_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
 {
-  guint16 length, number_of_contexts, context_number;
-  guint32 context;
+  guint16 number_of_contexts, context_number;
   gint context_offset;
 
-  length = tvb_get_ntohs(parameter_tvb, PARAMETER_LENGTH_OFFSET);
-  number_of_contexts = (length - PARAMETER_HEADER_LENGTH) / 4;
-
+  number_of_contexts = (tvb_get_ntohs(parameter_tvb, PARAMETER_LENGTH_OFFSET) - PARAMETER_HEADER_LENGTH) / 4;
   context_offset = PARAMETER_VALUE_OFFSET;
   for(context_number=1; context_number <= number_of_contexts; context_number++) {
-    context = tvb_get_ntohl(parameter_tvb, context_offset);
-    proto_tree_add_uint(parameter_tree, hf_sua_routing_context, parameter_tvb, context_offset, ROUTING_CONTEXT_LENGTH, context);
+    proto_tree_add_item(parameter_tree, hf_routing_context, parameter_tvb, context_offset, ROUTING_CONTEXT_LENGTH, NETWORK_BYTE_ORDER);
     context_offset += ROUTING_CONTEXT_LENGTH;
   };
-
-  proto_item_set_text(parameter_item, "Routing context (%u context%s)",
-                                 number_of_contexts, plurality(number_of_contexts, "", "s"));
+  proto_item_append_text(parameter_item, " (%u context%s)", number_of_contexts, plurality(number_of_contexts, "", "s"));
 }
 
+#define DIAGNOSTIC_INFO_OFFSET PARAMETER_VALUE_OFFSET
+
 static void
-dissect_sua_diagnostic_information_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+dissect_diagnostic_information_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
 {
-  guint16 length, info_length, padding_length;
-
-  length         = tvb_get_ntohs(parameter_tvb, PARAMETER_LENGTH_OFFSET);
-  padding_length = nr_of_padding_bytes(length);
-  info_length    = length - PARAMETER_HEADER_LENGTH;
-
-  proto_tree_add_bytes(parameter_tree, hf_sua_diagnostic_information_info,
-                       parameter_tvb, PARAMETER_VALUE_OFFSET, info_length,
-                       tvb_get_ptr(parameter_tvb, PARAMETER_VALUE_OFFSET, info_length));
-
-  if (padding_length > 0)
-    proto_tree_add_bytes(parameter_tree, hf_sua_diagnostic_information_padding,
-                         parameter_tvb, PARAMETER_VALUE_OFFSET + info_length, padding_length,
-                         tvb_get_ptr(parameter_tvb, PARAMETER_VALUE_OFFSET + info_length, padding_length));
+  guint16 diag_info_length;
 
-  proto_item_set_text(parameter_item, "Diagnostic information (%u byte%s)", info_length, plurality(info_length, "", "s"));
+  diag_info_length = tvb_get_ntohs(parameter_tvb, PARAMETER_LENGTH_OFFSET) - PARAMETER_HEADER_LENGTH;
+  proto_tree_add_item(parameter_tree, hf_diagnostic_information_info, parameter_tvb, DIAGNOSTIC_INFO_OFFSET, diag_info_length, NETWORK_BYTE_ORDER);
+  proto_item_append_text(parameter_item, " (%u byte%s)", diag_info_length, plurality(diag_info_length, "", "s"));
 }
 
+#define HEARTBEAT_DATA_OFFSET PARAMETER_VALUE_OFFSET
+
 static void
-dissect_sua_heartbeat_data_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+dissect_heartbeat_data_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
 {
-  guint16 length, data_length, padding_length;
-
-  length         = tvb_get_ntohs(parameter_tvb, PARAMETER_LENGTH_OFFSET);
-  padding_length = nr_of_padding_bytes(length);
-  data_length    = length - PARAMETER_HEADER_LENGTH;
-
-  proto_tree_add_bytes(parameter_tree, hf_sua_heartbeat_data,
-                       parameter_tvb, PARAMETER_VALUE_OFFSET, data_length,
-                       tvb_get_ptr(parameter_tvb, PARAMETER_VALUE_OFFSET, data_length));
-
-  if (padding_length > 0)
-    proto_tree_add_bytes(parameter_tree, hf_sua_heartbeat_padding,
-                         parameter_tvb, PARAMETER_VALUE_OFFSET + data_length, padding_length,
-                         tvb_get_ptr(parameter_tvb, PARAMETER_VALUE_OFFSET + data_length, padding_length));
+  guint16 heartbeat_data_length;
 
-  proto_item_set_text(parameter_item, "Heartbeat data (%u byte%s)", data_length, plurality(data_length, "", "s"));
+  heartbeat_data_length = tvb_get_ntohs(parameter_tvb, PARAMETER_LENGTH_OFFSET) - PARAMETER_HEADER_LENGTH;
+  proto_tree_add_item(parameter_tree, hf_heartbeat_data, parameter_tvb, HEARTBEAT_DATA_OFFSET, heartbeat_data_length, NETWORK_BYTE_ORDER);
+  proto_item_append_text(parameter_item, " (%u byte%s)", heartbeat_data_length, plurality(heartbeat_data_length, "", "s"));
 }
 
 #define TRAFFIC_MODE_TYPE_OFFSET PARAMETER_VALUE_OFFSET
 #define TRAFFIC_MODE_TYPE_LENGTH 4
 
-#define OVER_RIDE_TYPE           1
-#define LOAD_SHARE_TYPE          2
-#define BROADCAST_TYPE           3
-
-static const value_string sua_traffic_mode_type_values[] = {
-  { OVER_RIDE_TYPE ,                             "Over-ride" },
-  { LOAD_SHARE_TYPE,                             "Load-share" },
-  { BROADCAST_TYPE,                              "Broadcast" },
-  {0,                           NULL } };
+static const value_string traffic_mode_type_values[] = {
+  { 1, "Over-ride" },
+  { 2, "Load-share" },
+  { 3, "Broadcast" },
+  { 0, NULL } };
 
 static void
-dissect_sua_traffic_mode_type_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+dissect_traffic_mode_type_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
 {
-  guint32 traffic_mode_type;
-
-  traffic_mode_type = tvb_get_ntohl(parameter_tvb, TRAFFIC_MODE_TYPE_OFFSET);
-
-  proto_tree_add_uint(parameter_tree, hf_sua_traffic_mode_type,
-                      parameter_tvb, TRAFFIC_MODE_TYPE_OFFSET, TRAFFIC_MODE_TYPE_LENGTH,
-                      traffic_mode_type);
-
-  proto_item_set_text(parameter_item, "Traffic mode type (%s)", val_to_str(traffic_mode_type, sua_traffic_mode_type_values, "unknown"));
+  proto_tree_add_item(parameter_tree, hf_traffic_mode_type, parameter_tvb, TRAFFIC_MODE_TYPE_OFFSET, TRAFFIC_MODE_TYPE_LENGTH, NETWORK_BYTE_ORDER);
+  proto_item_append_text(parameter_item, " (%s)", val_to_str(tvb_get_ntohl(parameter_tvb, TRAFFIC_MODE_TYPE_OFFSET), traffic_mode_type_values, "unknown"));
 }
 
 #define ERROR_CODE_OFFSET PARAMETER_VALUE_OFFSET
 #define ERROR_CODE_LENGTH 4
 
-#define INVALID_VERSION_ERROR_CODE                   0x01
-#define INVALID_INTERFACE_IDENTIFIER_ERROR_CODE      0x02
-#define UNSUPPORTED_MESSAGE_CLASS_ERROR_CODE         0x03
-#define UNSUPPORTED_MESSAGE_TYPE_ERROR_CODE          0x04
-#define UNSUPPORTED_TRAFFIC_HANDLING_MODE_ERROR_CODE 0x05
-#define UNEXPECTED_MESSAGE_ERROR_CODE                0x06
-#define PROTOCOL_ERROR_ERROR_CODE                    0x07
-#define INVALID_STREAM_IDENTIFIER_ERROR_CODE         0x09
-#define REFUSED_ERROR_CODE                           0x0d
-#define ASP_IDENTIFIER_REQUIRED_ERROR_CODE           0x0e
-#define INVALID_ASP_IDENTIFIER_ERROR_CODE            0x0f
-#define INVALID_ROUTING_CONTEXT_ERROR_CODE           0x10
-#define INVALID_PARAMETER_VALUE_ERROR_CODE           0x11
-#define PARAMETER_FIELD_ERROR_CODE                   0x12
-#define UNEXPECTED_PARAMETER_ERROR_CODE              0x13
-#define DESTINATION_STATUS_UNKNOWN_ERROR_CODE        0x14
-#define INVALID_NETWORK_APPEARANCE_ERROR_CODE        0x15
-#define MISSING_PARAMETER_VALUE_ERROR_CODE           0x16
-#define ROUTING_CONTEXT_CHANGE_REFUSED               0x17
-#define INVALID_LOADSHARING_LABEL_ERROR_CODE         0x18
-
-static const value_string sua_error_code_values[] = {
-  { INVALID_VERSION_ERROR_CODE,                   "Invalid version" },
-  { INVALID_INTERFACE_IDENTIFIER_ERROR_CODE,      "Ivalid Interface Identifier" },
-  { UNSUPPORTED_MESSAGE_CLASS_ERROR_CODE,         "Unsupported message class" },
-  { UNSUPPORTED_MESSAGE_TYPE_ERROR_CODE,          "Unsupported message type" },
-  { UNSUPPORTED_TRAFFIC_HANDLING_MODE_ERROR_CODE, "Unsupported traffic handling mode" },
-  { UNEXPECTED_MESSAGE_ERROR_CODE,                "Unexpected message" },
-  { PROTOCOL_ERROR_ERROR_CODE,                    "Protocol error" },
-  { INVALID_STREAM_IDENTIFIER_ERROR_CODE,         "Invalid Stream Identifier" },
-  { REFUSED_ERROR_CODE,                           "Refused - Management Blocking" },
-  { ASP_IDENTIFIER_REQUIRED_ERROR_CODE,           "ASP Identifier Required" },
-  { INVALID_ASP_IDENTIFIER_ERROR_CODE,            "Invalid ASP Identifier" },
-  { INVALID_ROUTING_CONTEXT_ERROR_CODE,           "Invalid Routing Context" },
-  { INVALID_PARAMETER_VALUE_ERROR_CODE,           "Invalid Parameter Value" },
-  { PARAMETER_FIELD_ERROR_CODE,                   "Parameter Field Error" },
-  { UNEXPECTED_PARAMETER_ERROR_CODE,              "Unexpected Parameter" },
-  { DESTINATION_STATUS_UNKNOWN_ERROR_CODE,        "Destination Status Unknown" },
-  { INVALID_NETWORK_APPEARANCE_ERROR_CODE,        "Invalid Netwrok Appearance" },
-  { MISSING_PARAMETER_VALUE_ERROR_CODE,           "Missing Parameter" },
-  { ROUTING_CONTEXT_CHANGE_REFUSED,               "Routing Key Change Refused" },
-  { INVALID_LOADSHARING_LABEL_ERROR_CODE,         "Invalid Loadsharing Label" },
-  { 0,                                            NULL } };
+static const value_string error_code_values[] = {
+  { 0x01, "Invalid version" },
+  { 0x03, "Unsupported message class" },
+  { 0x04, "Unsupported message type" },
+  { 0x05, "Unsupported traffic handling mode" },
+  { 0x06, "Unexpected message" },
+  { 0x07, "Protocol error" },
+  { 0x09, "Invalid stream identifier" },
+  { 0x0d, "Refused - management blocking" },
+  { 0x0e, "ASP identifier required" },
+  { 0x0f, "Invalid ASP identifier" },
+  { 0x11, "Invalid parameter value" },
+  { 0x12, "Parameter field error" },
+  { 0x13, "Unexpected parameter" },
+  { 0x14, "Destination status unknown" },
+  { 0x15, "Invalid network appearance" },
+  { 0x16, "Missing parameter" },
+  { 0x19, "Invalid routing context" },
+  { 0x1a, "No configured AS for ASP" },
+  { 0x1b, "Subsystem status unknown" },
+  { 0,    NULL } };
 
 static void
-dissect_sua_error_code_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+dissect_error_code_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
 {
-  guint32 error_code;
-
-  error_code = tvb_get_ntohl(parameter_tvb, ERROR_CODE_OFFSET);
-  proto_tree_add_uint(parameter_tree, hf_sua_error_code,
-                      parameter_tvb, ERROR_CODE_OFFSET, ERROR_CODE_LENGTH,
-                      error_code);
-  proto_item_set_text(parameter_item, "Error code (%s)", val_to_str(error_code, sua_error_code_values, "unknown"));
+  proto_tree_add_item(parameter_tree, hf_error_code, parameter_tvb, ERROR_CODE_OFFSET, ERROR_CODE_LENGTH, NETWORK_BYTE_ORDER);
+  proto_item_append_text(parameter_item, " (%s)", val_to_str(tvb_get_ntohl(parameter_tvb, ERROR_CODE_OFFSET), error_code_values, "unknown"));
 }
 
 #define STATUS_TYPE_LENGTH 2
@@ -698,10 +557,10 @@ dissect_sua_error_code_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_
 #define AS_STATE_CHANGE_TYPE       1
 #define OTHER_TYPE                 2
 
-static const value_string sua_status_type_values[] = {
+static const value_string status_type_values[] = {
   { AS_STATE_CHANGE_TYPE,            "Application server state change" },
   { OTHER_TYPE,                      "Other" },
-  { 0,                           NULL } };
+  { 0,                               NULL } };
 
 #define RESERVED_INFO              1
 #define AS_INACTIVE_INFO           2
@@ -712,7 +571,7 @@ static const value_string sua_status_type_values[] = {
 #define ALTERNATE_ASP_ACTIVE_INFO  2
 #define ASP_FAILURE                3
 
-static const value_string sua_status_type_info_values[] = {
+static const value_string status_type_info_values[] = {
   { AS_STATE_CHANGE_TYPE * 256 * 256 + RESERVED_INFO,             "Reserved" },
   { AS_STATE_CHANGE_TYPE * 256 * 256 + AS_INACTIVE_INFO,          "Application server inactive" },
   { AS_STATE_CHANGE_TYPE * 256 * 256 + AS_ACTIVE_INFO,            "Application server active" },
@@ -723,58 +582,28 @@ static const value_string sua_status_type_info_values[] = {
   {0,                           NULL } };
 
 static void
-dissect_sua_status_type_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+dissect_status_type_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
 {
   guint16 status_type, status_info;
 
   status_type = tvb_get_ntohs(parameter_tvb, STATUS_TYPE_OFFSET);
   status_info = tvb_get_ntohs(parameter_tvb, STATUS_INFO_OFFSET);
 
-  proto_tree_add_uint(parameter_tree, hf_sua_status_type,
-                      parameter_tvb, STATUS_TYPE_OFFSET, STATUS_TYPE_LENGTH,
-                      status_type);
-  proto_tree_add_uint_format(parameter_tree, hf_sua_status_info,
-                                              parameter_tvb, STATUS_INFO_OFFSET, STATUS_INFO_LENGTH,
-                                              status_info, "Status info: %s (%u)",
-                                              val_to_str(status_type * 256 * 256 + status_info, sua_status_type_info_values, "unknown"), status_info);
-
-  proto_item_set_text(parameter_item, "Status type / ID (%s)",
-                     val_to_str(status_type * 256 * 256 + status_info, sua_status_type_info_values, "unknown status information"));
-}
-
-#define CONGESTION_LEVEL_LENGTH 4
-#define CONGESTION_LEVEL_OFFSET PARAMETER_VALUE_OFFSET
-
-static void
-dissect_sua_congestion_level_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
-{
-  guint32 congestion_level;
-
-  congestion_level = tvb_get_ntohl(parameter_tvb, CONGESTION_LEVEL_OFFSET);
-
-  proto_tree_add_uint(parameter_tree, hf_sua_congestion_level,
-                      parameter_tvb, CONGESTION_LEVEL_OFFSET, CONGESTION_LEVEL_LENGTH,
-                      congestion_level);
-
-  proto_item_set_text(parameter_item, "Congestion Level: %u", congestion_level);
+  proto_tree_add_item(parameter_tree, hf_status_type, parameter_tvb, STATUS_TYPE_OFFSET, STATUS_TYPE_LENGTH, NETWORK_BYTE_ORDER);
+  proto_tree_add_uint_format(parameter_tree, hf_status_info, parameter_tvb, STATUS_INFO_OFFSET, STATUS_INFO_LENGTH,
+                                        status_info, "Status info: %s (%u)", val_to_str(status_type * 256 * 256 + status_info, status_type_info_values, "unknown"), status_info);
 
+  proto_item_append_text(parameter_item, " (%s)", val_to_str(status_type * 256 * 256 + status_info, status_type_info_values, "unknown"));
 }
 
 #define ASP_IDENTIFIER_LENGTH 4
 #define ASP_IDENTIFIER_OFFSET PARAMETER_VALUE_OFFSET
 
 static void
-dissect_sua_asp_identifier_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+dissect_asp_identifier_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
 {
-  guint32 asp_identifier;
-
-  asp_identifier = tvb_get_ntohl(parameter_tvb, ASP_IDENTIFIER_OFFSET);
-
-  proto_tree_add_uint(parameter_tree, hf_sua_asp_identifier,
-                      parameter_tvb, ASP_IDENTIFIER_OFFSET, ASP_IDENTIFIER_LENGTH,
-                      asp_identifier);
-
-  proto_item_set_text(parameter_item, "ASP Identifer: %u", asp_identifier);
+  proto_tree_add_item(parameter_tree, hf_asp_identifier, parameter_tvb, ASP_IDENTIFIER_OFFSET, ASP_IDENTIFIER_LENGTH, NETWORK_BYTE_ORDER);
+  proto_item_append_text(parameter_item, " (%u)", tvb_get_ntohl(parameter_tvb, ASP_IDENTIFIER_OFFSET));
 }
 
 #define AFFECTED_MASK_LENGTH 1
@@ -785,57 +614,112 @@ dissect_sua_asp_identifier_parameter(tvbuff_t *parameter_tvb, proto_tree *parame
 #define AFFECTED_DPC_OFFSET  1
 
 static void
-dissect_sua_affected_destinations_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+dissect_affected_destinations_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
 {
-  guint8  mask;
-  guint16 length, number_of_destinations, destination_number;
-  guint32 dpc;
+  guint16 number_of_destinations, destination_number;
   gint destination_offset;
-  proto_item *destination_item;
-  proto_tree *destination_tree;
-
-  length = tvb_get_ntohs(parameter_tvb, PARAMETER_LENGTH_OFFSET);
-  number_of_destinations= (length - PARAMETER_HEADER_LENGTH) / 4;
 
+  number_of_destinations= (tvb_get_ntohs(parameter_tvb, PARAMETER_LENGTH_OFFSET) - PARAMETER_HEADER_LENGTH) / 4;
   destination_offset = PARAMETER_VALUE_OFFSET;
   for(destination_number=1; destination_number <= number_of_destinations; destination_number++) {
-    mask = tvb_get_guint8(parameter_tvb, destination_offset + AFFECTED_MASK_OFFSET);
-    dpc  = tvb_get_ntoh24(parameter_tvb, destination_offset + AFFECTED_DPC_OFFSET);
-    destination_item = proto_tree_add_text(parameter_tree, parameter_tvb, destination_offset, AFFECTED_DESTINATION_LENGTH, "Affected destination");
-    destination_tree = proto_item_add_subtree(destination_item, ett_sua_affected_destination);
-
-    proto_tree_add_uint(destination_tree, hf_sua_mask,
-                                         parameter_tvb, destination_offset + AFFECTED_MASK_OFFSET, AFFECTED_MASK_LENGTH,
-                                         mask);
-    proto_tree_add_uint(destination_tree, hf_sua_dpc,
-                                         parameter_tvb, destination_offset + AFFECTED_DPC_OFFSET, AFFECTED_DPC_LENGTH,
-                                         dpc);
+    proto_tree_add_item(parameter_tree, hf_mask, parameter_tvb, destination_offset + AFFECTED_MASK_OFFSET, AFFECTED_MASK_LENGTH, NETWORK_BYTE_ORDER);
+    proto_tree_add_item(parameter_tree, hf_dpc,  parameter_tvb, destination_offset + AFFECTED_DPC_OFFSET,  AFFECTED_DPC_LENGTH,  NETWORK_BYTE_ORDER);
     destination_offset += AFFECTED_DESTINATION_LENGTH;
-  };
-  proto_item_set_text(parameter_item, "Affected destination (%u destination%s)",
-                                 number_of_destinations, plurality(number_of_destinations, "", "s"));
+  }
+  proto_item_append_text(parameter_item, " (%u destination%s)", number_of_destinations, plurality(number_of_destinations, "", "s"));
+}
 
+#define CORRELATION_ID_LENGTH 4
+#define CORRELATION_ID_OFFSET PARAMETER_VALUE_OFFSET
+
+static void
+dissect_correlation_id_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+{
+  proto_tree_add_item(parameter_tree, hf_correlation_id, parameter_tvb, CORRELATION_ID_OFFSET, CORRELATION_ID_LENGTH, NETWORK_BYTE_ORDER);
+  proto_item_append_text(parameter_item, " (%u)", tvb_get_ntohl(parameter_tvb, CORRELATION_ID_OFFSET));
 }
 
-#define SS7_HOP_COUNTER_LENGTH 1
-#define SS7_HOP_COUNTER_OFFSET (PARAMETER_VALUE_OFFSET + RESERVED_3_LENGTH)
+static void
+dissect_registration_result_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree)
+{
+  tvbuff_t *parameters_tvb;
+  
+  parameters_tvb = tvb_new_subset(parameter_tvb, PARAMETER_VALUE_OFFSET, -1, -1);
+  dissect_parameters(parameters_tvb, parameter_tree, NULL, NULL, NULL);
+}
+
+static void
+dissect_deregistration_result_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree)
+{
+  tvbuff_t *parameters_tvb;
+  
+  parameters_tvb = tvb_new_subset(parameter_tvb, PARAMETER_VALUE_OFFSET, -1, -1);
+  dissect_parameters(parameters_tvb, parameter_tree, NULL, NULL, NULL);
+}
+
+#define REGISTRATION_STATUS_LENGTH 4
+#define REGISTRATION_STATUS_OFFSET PARAMETER_VALUE_OFFSET
+
+static const value_string registration_status_values[] = {
+  {  0,            "Successfully registered" },
+  {  1,            "Error - unknown" },
+  {  2,            "Error - invalid destination address" },
+  {  3,            "Error - invalid network appearance" },
+  {  4,            "Error - invalid routing key" },
+  {  5,            "Error - permission denied" },
+  {  6,            "Error - cannot support unique routing" },
+  {  7,            "Error - routing key not currently provisioned" },
+  {  8,            "Error - insufficient resources" },
+  {  9,            "Error - unsupported RK parameter field" },
+  { 10,            "Error - unsupported/invalid traffic mode type" },
+  { 11,            "Error - routing key change refused" },
+  {  0,            NULL } };
+
+static void
+dissect_registration_status_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+{
+  proto_tree_add_item(parameter_tree, hf_registration_status, parameter_tvb, REGISTRATION_STATUS_OFFSET, REGISTRATION_STATUS_LENGTH, NETWORK_BYTE_ORDER);
+  proto_item_append_text(parameter_item, " (%s)", val_to_str(tvb_get_ntohl(parameter_tvb, REGISTRATION_STATUS_OFFSET), registration_status_values, "unknown"));
+}
+
+#define DEREGISTRATION_STATUS_LENGTH 4
+#define DEREGISTRATION_STATUS_OFFSET PARAMETER_VALUE_OFFSET
+
+static const value_string deregistration_status_values[] = {
+  {  0,            "Successfully deregistered" },
+  {  1,            "Error - unknown" },
+  {  2,            "Error - invalid routing context" },
+  {  3,            "Error - permission denied" },
+  {  4,            "Error - not registered" },
+  {  5,            "Error - ASP currently active for routing context" },
+  {  0,            NULL } };
 
 static void
-dissect_sua_ss7_hop_counter_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+dissect_deregistration_status_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
 {
-  guint8 hop_counter;
+  proto_tree_add_item(parameter_tree, hf_deregistration_status, parameter_tvb, DEREGISTRATION_STATUS_OFFSET, DEREGISTRATION_STATUS_LENGTH, NETWORK_BYTE_ORDER);
+  proto_item_append_text(parameter_item, " (%s)", val_to_str(tvb_get_ntohl(parameter_tvb, DEREGISTRATION_STATUS_OFFSET), deregistration_status_values, "unknown"));
+}
 
-  hop_counter = tvb_get_guint8(parameter_tvb,  SS7_HOP_COUNTER_OFFSET);
+#define LOCAL_ROUTING_KEY_IDENTIFIER_LENGTH 4
+#define LOCAL_ROUTING_KEY_IDENTIFIER_OFFSET PARAMETER_VALUE_OFFSET
 
-  proto_tree_add_bytes(parameter_tree, hf_sua_ss7_hop_counter_reserved,
-                       parameter_tvb, PARAMETER_VALUE_OFFSET, RESERVED_3_LENGTH,
-                       tvb_get_ptr(parameter_tvb, PARAMETER_VALUE_OFFSET, RESERVED_3_LENGTH));
+static void
+dissect_local_routing_key_identifier_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+{
+  proto_tree_add_item(parameter_tree, hf_local_routing_key_identifier, parameter_tvb, LOCAL_ROUTING_KEY_IDENTIFIER_OFFSET, LOCAL_ROUTING_KEY_IDENTIFIER_LENGTH, NETWORK_BYTE_ORDER);
+  proto_item_append_text(parameter_item, " (%d)", tvb_get_ntohl(parameter_tvb, LOCAL_ROUTING_KEY_IDENTIFIER_OFFSET));
+}
 
-  proto_tree_add_uint(parameter_tree, hf_sua_ss7_hop_counter_counter,
-                      parameter_tvb, SS7_HOP_COUNTER_OFFSET, SS7_HOP_COUNTER_LENGTH,
-                      hop_counter);
+#define SS7_HOP_COUNTER_LENGTH 1
+#define SS7_HOP_COUNTER_OFFSET (PARAMETER_VALUE_OFFSET + RESERVED_3_LENGTH)
 
-  proto_item_set_text(parameter_item, "SS7 Hop Counter (%u)", hop_counter);
+static void
+dissect_ss7_hop_counter_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+{
+  proto_tree_add_item(parameter_tree, hf_ss7_hop_counter_reserved, parameter_tvb, PARAMETER_VALUE_OFFSET, RESERVED_3_LENGTH,      NETWORK_BYTE_ORDER);
+  proto_tree_add_item(parameter_tree, hf_ss7_hop_counter_counter,  parameter_tvb, SS7_HOP_COUNTER_OFFSET, SS7_HOP_COUNTER_LENGTH, NETWORK_BYTE_ORDER);
+  proto_item_append_text(parameter_item, " (%u)", tvb_get_guint8(parameter_tvb,  SS7_HOP_COUNTER_OFFSET));
 }
 
 #define ROUTING_INDICATOR_LENGTH  2
@@ -851,7 +735,7 @@ dissect_sua_ss7_hop_counter_parameter(tvbuff_t *parameter_tvb, proto_tree *param
 #define ROUTE_ON_HOSTNAMEROUTING_INDICATOR      3
 #define ROUTE_ON_SSN_IP_ROUTING_INDICATOR       4
 
-static const value_string sua_routing_indicator_values[] = {
+static const value_string routing_indicator_values[] = {
   { RESERVED_ROUTING_INDICATOR,            "Reserved" },
   { ROUTE_ON_GT_ROUTING_INDICATOR,         "Route on Global Title" },
   { ROUTE_ON_SSN_PC_ROUTING_INDICATOR,     "Route on SSN + PC" },
@@ -865,101 +749,65 @@ static const value_string sua_routing_indicator_values[] = {
 #define ADDRESS_SSN_BITMASK      0x0001
 
 static void
-dissect_sua_source_address_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+dissect_source_address_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, guint8 *ssn)
 {
-  guint16 routing_indicator, address_indicator;
   proto_item *address_indicator_item;
   proto_tree *address_indicator_tree;
+  tvbuff_t *parameters_tvb;
+  
+  if(parameter_tree) {
+    proto_tree_add_item(parameter_tree, hf_source_address_routing_indicator, parameter_tvb, ROUTING_INDICATOR_OFFSET, ROUTING_INDICATOR_LENGTH, NETWORK_BYTE_ORDER);
+    address_indicator_item = proto_tree_add_text(parameter_tree, parameter_tvb, ADDRESS_INDICATOR_OFFSET, ADDRESS_INDICATOR_LENGTH, "Address Indicator");
+    address_indicator_tree = proto_item_add_subtree(address_indicator_item, ett_sua_source_address_indicator);
+    proto_tree_add_item(address_indicator_tree, hf_source_address_reserved_bits, parameter_tvb, ADDRESS_INDICATOR_OFFSET, ADDRESS_INDICATOR_LENGTH, NETWORK_BYTE_ORDER);
+    proto_tree_add_item(address_indicator_tree, hf_source_address_gt_bit,        parameter_tvb, ADDRESS_INDICATOR_OFFSET, ADDRESS_INDICATOR_LENGTH, NETWORK_BYTE_ORDER);
+    proto_tree_add_item(address_indicator_tree, hf_source_address_pc_bit,        parameter_tvb, ADDRESS_INDICATOR_OFFSET, ADDRESS_INDICATOR_LENGTH, NETWORK_BYTE_ORDER);
+    proto_tree_add_item(address_indicator_tree, hf_source_address_ssn_bit,       parameter_tvb, ADDRESS_INDICATOR_OFFSET, ADDRESS_INDICATOR_LENGTH, NETWORK_BYTE_ORDER);
+  }
 
-  routing_indicator = tvb_get_ntohs(parameter_tvb, ROUTING_INDICATOR_OFFSET);
-  address_indicator = tvb_get_ntohs(parameter_tvb, ADDRESS_INDICATOR_OFFSET);
-
-  proto_tree_add_uint(parameter_tree, hf_sua_source_address_routing_indicator,
-                      parameter_tvb, ROUTING_INDICATOR_OFFSET, ROUTING_INDICATOR_LENGTH,
-                      routing_indicator);
-
-  address_indicator_item = proto_tree_add_text(parameter_tree, parameter_tvb, ADDRESS_INDICATOR_OFFSET, ADDRESS_INDICATOR_LENGTH, "Address Indicator");
-  address_indicator_tree = proto_item_add_subtree(address_indicator_item, ett_sua_source_address_indicator);
-  proto_tree_add_uint(address_indicator_tree, hf_sua_source_address_reserved_bits,
-                      parameter_tvb, ADDRESS_INDICATOR_OFFSET, ADDRESS_INDICATOR_LENGTH,
-                      address_indicator);
-  proto_tree_add_boolean(address_indicator_tree, hf_sua_source_address_gt_bit, parameter_tvb,
-                                          ADDRESS_INDICATOR_OFFSET, ADDRESS_INDICATOR_LENGTH, address_indicator);
-  proto_tree_add_boolean(address_indicator_tree, hf_sua_source_address_pc_bit, parameter_tvb,
-                                          ADDRESS_INDICATOR_OFFSET, ADDRESS_INDICATOR_LENGTH, address_indicator);
-  proto_tree_add_boolean(address_indicator_tree, hf_sua_source_address_ssn_bit, parameter_tvb,
-                                          ADDRESS_INDICATOR_OFFSET, ADDRESS_INDICATOR_LENGTH, address_indicator);
-
-  proto_item_set_text(parameter_item, "Source Address");
-
-  /* dissect address parameters */
-  dissect_sua_tlv_list(parameter_tvb, parameter_tree, ADDRESS_PARAMETERS_OFFSET);
+  parameters_tvb = tvb_new_subset(parameter_tvb, ADDRESS_PARAMETERS_OFFSET, -1, -1);
+  dissect_parameters(parameters_tvb, parameter_tree, NULL, ssn, NULL);
 }
 
 static void
-dissect_sua_destination_address_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+dissect_destination_address_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, guint8 *ssn)
 {
-  guint16 routing_indicator, address_indicator;
   proto_item *address_indicator_item;
   proto_tree *address_indicator_tree;
+  tvbuff_t *parameters_tvb;
+
+  if(parameter_tree) {
+    proto_tree_add_item(parameter_tree, hf_destination_address_routing_indicator, parameter_tvb, ROUTING_INDICATOR_OFFSET, ROUTING_INDICATOR_LENGTH, NETWORK_BYTE_ORDER);
+    address_indicator_item = proto_tree_add_text(parameter_tree, parameter_tvb, ADDRESS_INDICATOR_OFFSET, ADDRESS_INDICATOR_LENGTH, "Address Indicator");
+    address_indicator_tree = proto_item_add_subtree(address_indicator_item, ett_sua_destination_address_indicator);
+    proto_tree_add_item(address_indicator_tree, hf_destination_address_reserved_bits, parameter_tvb, ADDRESS_INDICATOR_OFFSET, ADDRESS_INDICATOR_LENGTH, NETWORK_BYTE_ORDER);
+    proto_tree_add_item(address_indicator_tree, hf_destination_address_gt_bit,        parameter_tvb, ADDRESS_INDICATOR_OFFSET, ADDRESS_INDICATOR_LENGTH, NETWORK_BYTE_ORDER);
+    proto_tree_add_item(address_indicator_tree, hf_destination_address_pc_bit,        parameter_tvb, ADDRESS_INDICATOR_OFFSET, ADDRESS_INDICATOR_LENGTH, NETWORK_BYTE_ORDER);
+    proto_tree_add_item(address_indicator_tree, hf_destination_address_ssn_bit,       parameter_tvb, ADDRESS_INDICATOR_OFFSET, ADDRESS_INDICATOR_LENGTH, NETWORK_BYTE_ORDER);
+  }
 
-  routing_indicator = tvb_get_ntohs(parameter_tvb, ROUTING_INDICATOR_OFFSET);
-  address_indicator = tvb_get_ntohs(parameter_tvb, ADDRESS_INDICATOR_OFFSET);
-
-  proto_tree_add_uint(parameter_tree, hf_sua_destination_address_routing_indicator,
-                      parameter_tvb, ROUTING_INDICATOR_OFFSET, ROUTING_INDICATOR_LENGTH,
-                      routing_indicator);
-
-  address_indicator_item = proto_tree_add_text(parameter_tree, parameter_tvb, ADDRESS_INDICATOR_OFFSET, ADDRESS_INDICATOR_LENGTH, "Address Indicator");
-  address_indicator_tree = proto_item_add_subtree(address_indicator_item, ett_sua_destination_address_indicator);
-  proto_tree_add_uint(address_indicator_tree, hf_sua_destination_address_reserved_bits,
-                      parameter_tvb, ADDRESS_INDICATOR_OFFSET, ADDRESS_INDICATOR_LENGTH,
-                      address_indicator);
-  proto_tree_add_boolean(address_indicator_tree, hf_sua_destination_address_gt_bit, parameter_tvb,
-                                          ADDRESS_INDICATOR_OFFSET, ADDRESS_INDICATOR_LENGTH, address_indicator);
-  proto_tree_add_boolean(address_indicator_tree, hf_sua_destination_address_pc_bit, parameter_tvb,
-                                          ADDRESS_INDICATOR_OFFSET, ADDRESS_INDICATOR_LENGTH, address_indicator);
-  proto_tree_add_boolean(address_indicator_tree, hf_sua_destination_address_ssn_bit, parameter_tvb,
-                                          ADDRESS_INDICATOR_OFFSET, ADDRESS_INDICATOR_LENGTH, address_indicator);
-
-  proto_item_set_text(parameter_item, "Destination Address");
-
-  /* dissect address parameters */
-  dissect_sua_tlv_list(parameter_tvb, parameter_tree, ADDRESS_PARAMETERS_OFFSET);
+  parameters_tvb = tvb_new_subset(parameter_tvb, ADDRESS_PARAMETERS_OFFSET, -1, -1);
+  dissect_parameters(parameters_tvb, parameter_tree, NULL, NULL, ssn);
 }
 
 #define SOURCE_REFERENCE_NUMBER_LENGTH 4
 #define SOURCE_REFERENCE_NUMBER_OFFSET PARAMETER_VALUE_OFFSET
 
 static void
-dissect_sua_source_reference_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+dissect_source_reference_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
 {
-  guint32 reference;
-
-  reference = tvb_get_ntohl(parameter_tvb, SOURCE_REFERENCE_NUMBER_OFFSET);
-
-  proto_tree_add_uint(parameter_tree, hf_sua_source_reference_number,
-                      parameter_tvb, SOURCE_REFERENCE_NUMBER_OFFSET, SOURCE_REFERENCE_NUMBER_LENGTH,
-                      reference);
-
-  proto_item_set_text(parameter_item, "Source Reference Number: %u", reference);
+  proto_tree_add_item(parameter_tree, hf_source_reference_number, parameter_tvb, SOURCE_REFERENCE_NUMBER_OFFSET, SOURCE_REFERENCE_NUMBER_LENGTH, NETWORK_BYTE_ORDER);
+  proto_item_append_text(parameter_item, " (%u)", tvb_get_ntohl(parameter_tvb, SOURCE_REFERENCE_NUMBER_OFFSET));
 }
 
 #define DESTINATION_REFERENCE_NUMBER_LENGTH 4
 #define DESTINATION_REFERENCE_NUMBER_OFFSET PARAMETER_VALUE_OFFSET
 
 static void
-dissect_sua_destination_reference_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+dissect_destination_reference_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
 {
-  guint32 reference;
-
-  reference = tvb_get_ntohl(parameter_tvb, DESTINATION_REFERENCE_NUMBER_OFFSET);
-
-  proto_tree_add_uint(parameter_tree, hf_sua_destination_reference_number,
-                      parameter_tvb, DESTINATION_REFERENCE_NUMBER_OFFSET, DESTINATION_REFERENCE_NUMBER_LENGTH,
-                      reference);
-
-  proto_item_set_text(parameter_item, "Destination Reference Number: %u", reference);
+  proto_tree_add_item(parameter_tree, hf_destination_reference_number, parameter_tvb, DESTINATION_REFERENCE_NUMBER_OFFSET, DESTINATION_REFERENCE_NUMBER_LENGTH, NETWORK_BYTE_ORDER);
+  proto_item_append_text(parameter_item, " (%u)", tvb_get_ntohl(parameter_tvb, DESTINATION_REFERENCE_NUMBER_OFFSET));
 }
 
 #define CAUSE_TYPE_LENGTH 1
@@ -968,39 +816,22 @@ dissect_sua_destination_reference_number_parameter(tvbuff_t *parameter_tvb, prot
 #define CAUSE_TYPE_OFFSET  (PARAMETER_VALUE_OFFSET + RESERVED_2_LENGTH)
 #define CAUSE_VALUE_OFFSET (CAUSE_TYPE_OFFSET + CAUSE_TYPE_LENGTH)
 
-#define RETURN_CAUSE_TYPE    0x1
-#define REFUSAL_CAUSE_TYPE   0x2
-#define RELEASE_CAUSE_TYPE   0x3
-#define RESET_CAUSE_TYPE     0x4
-#define ERROR_CAUSE_TYPE     0x5
-
-static const value_string sua_cause_type_values[] = {
-  { RETURN_CAUSE_TYPE,    "Return Cause" },
-  { REFUSAL_CAUSE_TYPE,   "Refusual Cause" },
-  { RELEASE_CAUSE_TYPE,   "Release Cause" },
-  { RESET_CAUSE_TYPE,     "Reset Cause" },
-  { ERROR_CAUSE_TYPE,     "Error cause" },
-  { 0,                    NULL } };
+static const value_string cause_type_values[] = {
+  { 0x1,   "Return Cause" },
+  { 0x2,   "Refusual Cause" },
+  { 0x3,   "Release Cause" },
+  { 0x4,   "Reset Cause" },
+  { 0x5,   "Error cause" },
+  { 0,     NULL } };
 
 static void
-dissect_sua_sccp_cause_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+dissect_sccp_cause_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
 {
-  guint8 type, value;
-
-  type  = tvb_get_guint8(parameter_tvb,  CAUSE_TYPE_OFFSET);
-  value = tvb_get_guint8(parameter_tvb,  CAUSE_VALUE_OFFSET);
-
-  proto_tree_add_bytes(parameter_tree, hf_sua_cause_reserved,
-                       parameter_tvb, PARAMETER_VALUE_OFFSET, RESERVED_2_LENGTH,
-                       tvb_get_ptr(parameter_tvb, PARAMETER_VALUE_OFFSET, RESERVED_2_LENGTH));
-  proto_tree_add_uint(parameter_tree, hf_sua_cause_type,
-                      parameter_tvb, CAUSE_TYPE_OFFSET, CAUSE_TYPE_LENGTH,
-                      type);
-  proto_tree_add_uint(parameter_tree, hf_sua_cause_value,
-                      parameter_tvb, CAUSE_VALUE_OFFSET, CAUSE_VALUE_LENGTH,
-                      value);
-
-  proto_item_set_text(parameter_item, "SCCP Cause (%s)", val_to_str(type, sua_cause_type_values, "unknown"));
+  proto_tree_add_item(parameter_tree, hf_cause_reserved, parameter_tvb, PARAMETER_VALUE_OFFSET, RESERVED_2_LENGTH,  NETWORK_BYTE_ORDER);
+  proto_tree_add_item(parameter_tree, hf_cause_type,     parameter_tvb, CAUSE_TYPE_OFFSET,      CAUSE_TYPE_LENGTH,  NETWORK_BYTE_ORDER);
+  proto_tree_add_item(parameter_tree, hf_cause_value,    parameter_tvb, CAUSE_VALUE_OFFSET,     CAUSE_VALUE_LENGTH, NETWORK_BYTE_ORDER);
+
+  proto_item_append_text(parameter_item, " (%s)", val_to_str(tvb_get_guint8(parameter_tvb,  CAUSE_TYPE_OFFSET), cause_type_values, "unknown"));
 }
 
 #define SEQUENCE_NUMBER_REC_SEQ_LENGTH  1
@@ -1012,79 +843,46 @@ dissect_sua_sccp_cause_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_
 #define SPARE_BIT_MASK     0x01
 #define MORE_DATA_BIT_MASK 0x01
 
-static const true_false_string sua_more_data_bit_value = {
+static const true_false_string more_data_bit_value = {
   "More Data",
   "Not More Data"
 };
 
 static void
-dissect_sua_sequence_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+dissect_sequence_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree)
 {
-  guint8  receive_sequence_number, sent_sequence_number;
   proto_item *sent_sequence_number_item;
   proto_tree *sent_sequence_number_tree;
   proto_item *receive_sequence_number_item;
   proto_tree *receive_sequence_number_tree;
 
-  receive_sequence_number = tvb_get_guint8(parameter_tvb, SEQUENCE_NUMBER_REC_SEQ_OFFSET);
-  sent_sequence_number    = tvb_get_guint8(parameter_tvb, SEQUENCE_NUMBER_SENT_SEQ_OFFSET);
+  proto_tree_add_item(parameter_tree, hf_sequence_number_reserved, parameter_tvb, PARAMETER_VALUE_OFFSET, RESERVED_2_LENGTH, NETWORK_BYTE_ORDER);
 
-  proto_tree_add_bytes(parameter_tree, hf_sua_sequence_number_reserved,
-                       parameter_tvb, PARAMETER_VALUE_OFFSET, RESERVED_2_LENGTH,
-                       tvb_get_ptr(parameter_tvb, PARAMETER_VALUE_OFFSET, RESERVED_2_LENGTH));
-
-  receive_sequence_number_item = proto_tree_add_text(parameter_tree, parameter_tvb,
-                                                     SEQUENCE_NUMBER_REC_SEQ_OFFSET,
-                                                     SEQUENCE_NUMBER_REC_SEQ_LENGTH, "Receive Sequence Number");
+  receive_sequence_number_item = proto_tree_add_text(parameter_tree, parameter_tvb, SEQUENCE_NUMBER_REC_SEQ_OFFSET, SEQUENCE_NUMBER_REC_SEQ_LENGTH, "Receive Sequence Number");
   receive_sequence_number_tree = proto_item_add_subtree(receive_sequence_number_item, ett_sua_sequence_number_rec_number);
-  proto_tree_add_uint(receive_sequence_number_tree, hf_sua_sequence_number_rec_number,
-                      parameter_tvb, SEQUENCE_NUMBER_REC_SEQ_OFFSET, SEQUENCE_NUMBER_REC_SEQ_LENGTH,
-                      receive_sequence_number);
-  proto_tree_add_boolean(receive_sequence_number_tree, hf_sua_sequence_number_more_data_bit,
-                         parameter_tvb, SEQUENCE_NUMBER_REC_SEQ_OFFSET, SEQUENCE_NUMBER_REC_SEQ_LENGTH,
-                         receive_sequence_number);
-
-  sent_sequence_number_item = proto_tree_add_text(parameter_tree, parameter_tvb,
-                                                     SEQUENCE_NUMBER_SENT_SEQ_OFFSET,
-                                                     SEQUENCE_NUMBER_SENT_SEQ_LENGTH, "Sent Sequence Number");
+  proto_tree_add_item(receive_sequence_number_tree, hf_sequence_number_rec_number,    parameter_tvb, SEQUENCE_NUMBER_REC_SEQ_OFFSET, SEQUENCE_NUMBER_REC_SEQ_LENGTH, NETWORK_BYTE_ORDER);
+  proto_tree_add_item(receive_sequence_number_tree, hf_sequence_number_more_data_bit, parameter_tvb, SEQUENCE_NUMBER_REC_SEQ_OFFSET, SEQUENCE_NUMBER_REC_SEQ_LENGTH, NETWORK_BYTE_ORDER);
+
+  sent_sequence_number_item = proto_tree_add_text(parameter_tree, parameter_tvb, SEQUENCE_NUMBER_SENT_SEQ_OFFSET, SEQUENCE_NUMBER_SENT_SEQ_LENGTH, "Sent Sequence Number");
   sent_sequence_number_tree = proto_item_add_subtree(sent_sequence_number_item, ett_sua_sequence_number_sent_number);
-  proto_tree_add_uint(sent_sequence_number_tree, hf_sua_sequence_number_sent_number,
-                      parameter_tvb, SEQUENCE_NUMBER_SENT_SEQ_OFFSET, SEQUENCE_NUMBER_SENT_SEQ_LENGTH,
-                      sent_sequence_number);
-  proto_tree_add_boolean(sent_sequence_number_tree, hf_sua_sequence_number_spare_bit,
-                         parameter_tvb, SEQUENCE_NUMBER_SENT_SEQ_OFFSET, SEQUENCE_NUMBER_SENT_SEQ_LENGTH,
-                         sent_sequence_number);
-
-  proto_item_set_text(parameter_item, "Sequence Number");
+  proto_tree_add_item(sent_sequence_number_tree, hf_sequence_number_sent_number, parameter_tvb, SEQUENCE_NUMBER_SENT_SEQ_OFFSET, SEQUENCE_NUMBER_SENT_SEQ_LENGTH, NETWORK_BYTE_ORDER);
+  proto_tree_add_item(sent_sequence_number_tree, hf_sequence_number_spare_bit,   parameter_tvb, SEQUENCE_NUMBER_SENT_SEQ_OFFSET, SEQUENCE_NUMBER_SENT_SEQ_LENGTH, NETWORK_BYTE_ORDER);
 }
 
 #define RECEIVE_SEQUENCE_NUMBER_REC_SEQ_LENGTH 1
 #define RECEIVE_SEQUENCE_NUMBER_REC_SEQ_OFFSET (PARAMETER_VALUE_OFFSET + RESERVED_3_LENGTH)
 
 static void
-dissect_sua_receive_sequence_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+dissect_receive_sequence_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree)
 {
-  guint8  receive_sequence_number;
   proto_item *receive_sequence_number_item;
   proto_tree *receive_sequence_number_tree;
 
-  receive_sequence_number = tvb_get_guint8(parameter_tvb, RECEIVE_SEQUENCE_NUMBER_REC_SEQ_OFFSET);
-
-  proto_tree_add_bytes(parameter_tree, hf_sua_receive_sequence_number_reserved,
-                       parameter_tvb, PARAMETER_VALUE_OFFSET, RESERVED_3_LENGTH,
-                       tvb_get_ptr(parameter_tvb, PARAMETER_VALUE_OFFSET, RESERVED_3_LENGTH));
-  receive_sequence_number_item = proto_tree_add_text(parameter_tree, parameter_tvb,
-                                                     RECEIVE_SEQUENCE_NUMBER_REC_SEQ_OFFSET,
-                                                     RECEIVE_SEQUENCE_NUMBER_REC_SEQ_LENGTH, "Receive Sequence Number");
+  proto_tree_add_item(parameter_tree, hf_receive_sequence_number_reserved, parameter_tvb, PARAMETER_VALUE_OFFSET, RESERVED_3_LENGTH, NETWORK_BYTE_ORDER);
+  receive_sequence_number_item = proto_tree_add_text(parameter_tree, parameter_tvb, RECEIVE_SEQUENCE_NUMBER_REC_SEQ_OFFSET, RECEIVE_SEQUENCE_NUMBER_REC_SEQ_LENGTH, "Receive Sequence Number");
   receive_sequence_number_tree = proto_item_add_subtree(receive_sequence_number_item, ett_sua_receive_sequence_number_number);
-  proto_tree_add_uint(receive_sequence_number_tree, hf_sua_receive_sequence_number_number,
-                      parameter_tvb, RECEIVE_SEQUENCE_NUMBER_REC_SEQ_OFFSET, RECEIVE_SEQUENCE_NUMBER_REC_SEQ_LENGTH,
-                      receive_sequence_number);
-  proto_tree_add_boolean(receive_sequence_number_tree, hf_sua_receive_sequence_number_spare_bit,
-                         parameter_tvb, RECEIVE_SEQUENCE_NUMBER_REC_SEQ_OFFSET, RECEIVE_SEQUENCE_NUMBER_REC_SEQ_LENGTH,
-                         receive_sequence_number);
-
-  proto_item_set_text(parameter_item, "Receive Sequence Number");
+  proto_tree_add_item(receive_sequence_number_tree, hf_receive_sequence_number_number,    parameter_tvb, RECEIVE_SEQUENCE_NUMBER_REC_SEQ_OFFSET, RECEIVE_SEQUENCE_NUMBER_REC_SEQ_LENGTH, NETWORK_BYTE_ORDER);
+  proto_tree_add_item(receive_sequence_number_tree, hf_receive_sequence_number_spare_bit, parameter_tvb, RECEIVE_SEQUENCE_NUMBER_REC_SEQ_OFFSET, RECEIVE_SEQUENCE_NUMBER_REC_SEQ_LENGTH, NETWORK_BYTE_ORDER);
 }
 
 #define PROTOCOL_CLASSES_LENGTH        1
@@ -1103,299 +901,171 @@ static const true_false_string sua_supported_bit_value = {
   "Unsupported"
 };
 
-#define NO_INTERWORKING      0x0
-#define ASP_SS7_INTERWORKING 0x1
-#define SG_INTERWORKING      0x2
-#define RELAY_INTERWORKING   0x3
-
-static const value_string sua_interworking_values[] = {
-  { NO_INTERWORKING,        "No Interworking with SS7 Networks" },
-  { ASP_SS7_INTERWORKING,   "IP-Signalling Endpoint interworking with with SS7 networks" },
-  { SG_INTERWORKING,        "Signalling Gateway" },
-  { RELAY_INTERWORKING,     "Relay Node Support" },
-  { 0,                      NULL } };
+static const value_string interworking_values[] = {
+  { 0x0,   "No Interworking with SS7 Networks" },
+  { 0x1,   "IP-Signalling Endpoint interworking with with SS7 networks" },
+  { 0x2,   "Signalling Gateway" },
+  { 0x3,   "Relay Node Support" },
+  { 0,     NULL } };
 
 static void
-dissect_sua_asp_capabilities_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+dissect_asp_capabilities_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree)
 {
-  guint8  protocol_classes, interworking;
   proto_item *protocol_classes_item;
   proto_tree *protocol_classes_tree;
 
-  protocol_classes = tvb_get_guint8(parameter_tvb, PROTOCOL_CLASSES_OFFSET);
-  interworking     = tvb_get_guint8(parameter_tvb, INTERWORKING_OFFSET);
-
-  proto_tree_add_bytes(parameter_tree, hf_sua_asp_capabilities_reserved,
-                       parameter_tvb, PARAMETER_VALUE_OFFSET, RESERVED_2_LENGTH,
-                       tvb_get_ptr(parameter_tvb, PARAMETER_VALUE_OFFSET, RESERVED_2_LENGTH));
+  proto_tree_add_item(parameter_tree, hf_asp_capabilities_reserved, parameter_tvb, PARAMETER_VALUE_OFFSET, RESERVED_2_LENGTH, NETWORK_BYTE_ORDER);
   protocol_classes_item = proto_tree_add_text(parameter_tree, parameter_tvb, PROTOCOL_CLASSES_OFFSET, PROTOCOL_CLASSES_LENGTH, "Protocol classes");
   protocol_classes_tree = proto_item_add_subtree(protocol_classes_item, ett_sua_protcol_classes);
-  proto_tree_add_uint(protocol_classes_tree, hf_sua_asp_capabilities_reserved_bits,
-                      parameter_tvb, PROTOCOL_CLASSES_OFFSET, PROTOCOL_CLASSES_LENGTH,
-                      protocol_classes);
-  proto_tree_add_boolean(protocol_classes_tree, hf_sua_asp_capabilities_a_bit, parameter_tvb,
-                                          PROTOCOL_CLASSES_OFFSET, PROTOCOL_CLASSES_LENGTH, protocol_classes);
-  proto_tree_add_boolean(protocol_classes_tree, hf_sua_asp_capabilities_b_bit, parameter_tvb,
-                                          PROTOCOL_CLASSES_OFFSET, PROTOCOL_CLASSES_LENGTH, protocol_classes);
-  proto_tree_add_boolean(protocol_classes_tree, hf_sua_asp_capabilities_c_bit, parameter_tvb,
-                                          PROTOCOL_CLASSES_OFFSET, PROTOCOL_CLASSES_LENGTH, protocol_classes);
-  proto_tree_add_boolean(protocol_classes_tree, hf_sua_asp_capabilities_d_bit, parameter_tvb,
-                                          PROTOCOL_CLASSES_OFFSET, PROTOCOL_CLASSES_LENGTH, protocol_classes);
-
-  proto_tree_add_uint(parameter_tree, hf_sua_asp_capabilities_interworking,
-                      parameter_tvb, INTERWORKING_OFFSET, INTERWORKING_LENGTH,
-                      interworking);
-
-  proto_item_set_text(parameter_item, "ASP Capabilities");
+  proto_tree_add_item(protocol_classes_tree, hf_asp_capabilities_reserved_bits, parameter_tvb, PROTOCOL_CLASSES_OFFSET, PROTOCOL_CLASSES_LENGTH, NETWORK_BYTE_ORDER);
+  proto_tree_add_item(protocol_classes_tree, hf_asp_capabilities_a_bit, parameter_tvb, PROTOCOL_CLASSES_OFFSET, PROTOCOL_CLASSES_LENGTH, NETWORK_BYTE_ORDER);
+  proto_tree_add_item(protocol_classes_tree, hf_asp_capabilities_b_bit, parameter_tvb, PROTOCOL_CLASSES_OFFSET, PROTOCOL_CLASSES_LENGTH, NETWORK_BYTE_ORDER);
+  proto_tree_add_item(protocol_classes_tree, hf_asp_capabilities_c_bit, parameter_tvb, PROTOCOL_CLASSES_OFFSET, PROTOCOL_CLASSES_LENGTH, NETWORK_BYTE_ORDER);
+  proto_tree_add_item(protocol_classes_tree, hf_asp_capabilities_d_bit, parameter_tvb, PROTOCOL_CLASSES_OFFSET, PROTOCOL_CLASSES_LENGTH, NETWORK_BYTE_ORDER);
+  proto_tree_add_item(parameter_tree, hf_asp_capabilities_interworking, parameter_tvb, INTERWORKING_OFFSET, INTERWORKING_LENGTH, NETWORK_BYTE_ORDER);
 }
 
 #define CREDIT_LENGTH 4
 #define CREDIT_OFFSET PARAMETER_VALUE_OFFSET
 
 static void
-dissect_sua_credit_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+dissect_credit_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
 {
-  guint32 credit;
+  proto_tree_add_item(parameter_tree, hf_credit, parameter_tvb, CREDIT_OFFSET, CREDIT_LENGTH, NETWORK_BYTE_ORDER);
+  proto_item_append_text(parameter_item, " (%u)", tvb_get_ntohl(parameter_tvb, CREDIT_OFFSET));
+}
+
+#define DATA_PARAMETER_DATA_OFFSET PARAMETER_VALUE_OFFSET
 
-  credit = tvb_get_ntohl(parameter_tvb, CREDIT_OFFSET);
+static void
+dissect_data_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item, tvbuff_t **data_tvb)
+{
+  guint16 data_length;
 
-  proto_tree_add_uint(parameter_tree, hf_sua_credit,
-                      parameter_tvb, CREDIT_OFFSET, CREDIT_LENGTH,
-                      credit);
+  data_length    = tvb_get_ntohs(parameter_tvb, PARAMETER_LENGTH_OFFSET) - PARAMETER_HEADER_LENGTH;
 
-  proto_item_set_text(parameter_item, "Credit: %u", credit);
+  if(parameter_tree) {
+    proto_tree_add_item(parameter_tree, hf_data, parameter_tvb, DATA_PARAMETER_DATA_OFFSET, data_length, NETWORK_BYTE_ORDER);
+    proto_item_append_text(parameter_item, " (SS7 message of %u byte%s)", data_length, plurality(data_length, "", "s"));
+  }
+  
+  if(data_tvb)
+  {
+    *data_tvb = tvb_new_subset(parameter_tvb, PARAMETER_VALUE_OFFSET, data_length, data_length);
+  }
 }
 
+
 #define CAUSE_LENGTH 2
 #define USER_LENGTH  2
 #define CAUSE_OFFSET PARAMETER_VALUE_OFFSET
 #define USER_OFFSET (CAUSE_OFFSET + CAUSE_LENGTH)
 
-#define UNAVAILABLE_CAUSE    0x0
-#define UNEQUIPPED_CAUSE     0x2
-#define INACCESSABLE_CAUSE   0x3
-
-static const value_string sua_cause_values[] = {
-  { UNAVAILABLE_CAUSE,    "Remote SCCP unavailable, Reason unknown" },
-  { UNEQUIPPED_CAUSE,     "Remote SCCP unequipped" },
-  { INACCESSABLE_CAUSE,   "Remote SCCP inaccessable" },
-  { 0,                    NULL } };
+static const value_string cause_values[] = {
+  { 0x0,  "Remote SCCP unavailable, Reason unknown" },
+  { 0x2,  "Remote SCCP unequipped" },
+  { 0x3,  "Remote SCCP inaccessable" },
+  { 0,    NULL } };
 
 static void
-dissect_sua_user_cause_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+dissect_user_cause_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree)
 {
-  guint16 cause, user;
-
-  cause = tvb_get_ntohs(parameter_tvb, CAUSE_OFFSET);
-  user  = tvb_get_ntohs(parameter_tvb, USER_OFFSET);
-
-  proto_tree_add_uint(parameter_tree, hf_sua_cause,
-                      parameter_tvb, CAUSE_OFFSET, CAUSE_LENGTH,
-                      cause);
-  proto_tree_add_uint(parameter_tree, hf_sua_user,
-                      parameter_tvb, USER_OFFSET, USER_LENGTH,
-                      user);
-
-  proto_item_set_text(parameter_item, "User / Cause");
+  proto_tree_add_item(parameter_tree, hf_cause, parameter_tvb, CAUSE_OFFSET, CAUSE_LENGTH, NETWORK_BYTE_ORDER);
+  proto_tree_add_item(parameter_tree, hf_user,  parameter_tvb, USER_OFFSET,  USER_LENGTH,  NETWORK_BYTE_ORDER);
 }
 
 #define NETWORK_APPEARANCE_LENGTH 4
 #define NETWORK_APPEARANCE_OFFSET PARAMETER_VALUE_OFFSET
 
 static void
-dissect_sua_network_appearance_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+dissect_network_appearance_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
 {
-  guint32 appearance;
-
-  appearance = tvb_get_ntohl(parameter_tvb, NETWORK_APPEARANCE_OFFSET);
-
-  proto_tree_add_uint(parameter_tree, hf_sua_network_appearance,
-                      parameter_tvb, NETWORK_APPEARANCE_OFFSET, NETWORK_APPEARANCE_LENGTH,
-                      appearance);
-
-  proto_item_set_text(parameter_item, "Network Appearance: %u", appearance);
+  proto_tree_add_item(parameter_tree, hf_network_appearance, parameter_tvb, NETWORK_APPEARANCE_OFFSET, NETWORK_APPEARANCE_LENGTH, NETWORK_BYTE_ORDER);
+  proto_item_append_text(parameter_item, " (%u)", tvb_get_ntohl(parameter_tvb, NETWORK_APPEARANCE_OFFSET));
 }
 
-#define IDENTIFIER_LENGTH      4
-#define IDENTIFIER_OFFSET      PARAMETER_VALUE_OFFSET
-#define KEY_PARAMETERS_OFFSET  (IDENTIFIER_OFFSET + IDENTIFIER_LENGTH)
-
 static void
-dissect_sua_routing_key_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+dissect_routing_key_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree)
 {
-  guint32 identifier;
-
-  identifier = tvb_get_ntohl(parameter_tvb, IDENTIFIER_OFFSET);
-
-  proto_tree_add_uint(parameter_tree, hf_sua_routing_key_identifier,
-                      parameter_tvb, IDENTIFIER_OFFSET, IDENTIFIER_LENGTH,
-                      identifier);
+  tvbuff_t *parameters_tvb;
 
-  proto_item_set_text(parameter_item, "Routing Key");
-
-  dissect_sua_tlv_list(parameter_tvb, parameter_tree, KEY_PARAMETERS_OFFSET);
+  parameters_tvb = tvb_new_subset(parameter_tvb, PARAMETER_VALUE_OFFSET, -1, -1);
+  dissect_parameters(parameters_tvb, parameter_tree, NULL, NULL, NULL);
 }
+#define DRN_START_LENGTH 1
+#define DRN_END_LENGTH 1
+#define DRN_VALUE_LENGTH 2
 
-#define LOCAL_ROUTING_KEY_ID_LENGTH         4
-#define REGISTRATION_STATUS_LENGTH          4
-#define REGISTRATION_ROUTING_CONTEXT_LENGTH 4
-#define LOCAL_ROUTING_KEY_OFFSET            PARAMETER_VALUE_OFFSET
-#define REGISTRATION_STATUS_OFFSET          (LOCAL_ROUTING_KEY_OFFSET + LOCAL_ROUTING_KEY_ID_LENGTH)
-#define REGISTRATION_ROUTING_CONTEXT_OFFSET (REGISTRATION_STATUS_OFFSET + REGISTRATION_STATUS_LENGTH)
-
-#define SUCCESSFULLY_REGISTERED_REGISTRATION_STATUS               0x0
-#define UNKNOWN_REGISTRATION_STATUS                               0x1
-#define INVALID_DESTINATION_ADDRESSS_REGISTRATION_STATUS          0x2
-#define INVALID_NETWORK_APPEARANCE_REGISTRATION_STATUS            0x3
-#define INVALID_ROUTING_KEY_REGISTRATION_STATUS                   0x4
-#define PERMISSION_DENIED_REGISTRATION_STATUS                     0x5
-#define CANNOT_SUPPORT_UNIQUE_ROUTING_REGISTRATION_STATUS         0x6
-#define ROUTING_KEY_NOT_PROVISIONED_REGISTRATION_STATUS           0x7
-#define INSUFFICIENT_RESOURCES_REGISTRATION_STATUS                0x8
-#define UNSUPPORTED_RK_PARAMETER_REGISTRATION_FIELD_STATUS        0x9
-#define UNSUPPORTED_INVALID_TRAFFIC_MODE_TYPE_REGISTRATION_STATUS 0xa
-
-static const value_string sua_registration_status_values[] = {
-  { SUCCESSFULLY_REGISTERED_REGISTRATION_STATUS,               "Successfully Registered" },
-  { UNKNOWN_REGISTRATION_STATUS,                               "Error - Unknown" },
-  { INVALID_DESTINATION_ADDRESSS_REGISTRATION_STATUS,          "Error - Invalid Destination Address" },
-  { INVALID_NETWORK_APPEARANCE_REGISTRATION_STATUS,            "Error - Invalid Network Appearance" },
-  { INVALID_ROUTING_KEY_REGISTRATION_STATUS,                   "Error - Invalid Routing Key" },
-  { PERMISSION_DENIED_REGISTRATION_STATUS,                     "Error - Permission Denied" },
-  { CANNOT_SUPPORT_UNIQUE_ROUTING_REGISTRATION_STATUS,         "Error - Cannot Support Unique Routing" },
-  { ROUTING_KEY_NOT_PROVISIONED_REGISTRATION_STATUS,           "Error - Routing Key Not Currently Provisioned" },
-  { INSUFFICIENT_RESOURCES_REGISTRATION_STATUS,                "Error - Insufficient Resources" },
-  { UNSUPPORTED_RK_PARAMETER_REGISTRATION_FIELD_STATUS,        "Error - Unsupported Routing Key Parameter Field" },
-  { UNSUPPORTED_INVALID_TRAFFIC_MODE_TYPE_REGISTRATION_STATUS, "Error - Unsupported / Invalid Traffic Mode Type" },
-  { 0,                                            NULL } };
+#define DRN_START_OFFSET PARAMETER_VALUE_OFFSET
+#define DRN_END_OFFSET   (DRN_START_OFFSET + DRN_START_LENGTH)
+#define DRN_VALUE_OFFSET (DRN_END_OFFSET + DRN_END_LENGTH)
 
 static void
-dissect_sua_registration_result_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+dissect_drn_label_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree)
 {
-  guint32 local_routing_key_identifier, registration_status, routing_context;
-
-  local_routing_key_identifier = tvb_get_ntohl(parameter_tvb, LOCAL_ROUTING_KEY_OFFSET);
-  registration_status = tvb_get_ntohl(parameter_tvb, REGISTRATION_STATUS_OFFSET);
-  routing_context = tvb_get_ntohl(parameter_tvb, REGISTRATION_ROUTING_CONTEXT_OFFSET);
-
-  proto_tree_add_uint(parameter_tree, hf_sua_registration_result_routing_key_identifier,
-                      parameter_tvb, LOCAL_ROUTING_KEY_OFFSET, LOCAL_ROUTING_KEY_ID_LENGTH,
-                      local_routing_key_identifier);
-  proto_tree_add_uint(parameter_tree, hf_sua_registration_result_status,
-                      parameter_tvb, REGISTRATION_STATUS_OFFSET, REGISTRATION_STATUS_LENGTH,
-                      registration_status);
-  proto_tree_add_uint(parameter_tree, hf_sua_registration_result_routing_context,
-                      parameter_tvb, REGISTRATION_ROUTING_CONTEXT_OFFSET, REGISTRATION_ROUTING_CONTEXT_LENGTH,
-                      routing_context);
-
-  proto_item_set_text(parameter_item, "Registration Result: %s", val_to_str(registration_status, sua_registration_status_values, "Unknown"));
+  proto_tree_add_item(parameter_tree, hf_drn_label_start, parameter_tvb, DRN_START_OFFSET, DRN_START_LENGTH, NETWORK_BYTE_ORDER);
+  proto_tree_add_item(parameter_tree, hf_drn_label_end,   parameter_tvb, DRN_END_OFFSET,   DRN_END_LENGTH,   NETWORK_BYTE_ORDER);
+  proto_tree_add_item(parameter_tree, hf_drn_label_value, parameter_tvb, DRN_VALUE_OFFSET, DRN_VALUE_LENGTH, NETWORK_BYTE_ORDER);
 }
 
-#define DEREGISTRATION_ROUTING_CONTEXT_LENGTH 4
-#define DEREGISTRATION_STATUS_LENGTH          4
-
-#define DEREGISTRATION_ROUTING_CONTEXT_OFFSET PARAMETER_VALUE_OFFSET
-#define DEREGISTRATION_STATUS_OFFSET          (DEREGISTRATION_ROUTING_CONTEXT_OFFSET + DEREGISTRATION_ROUTING_CONTEXT_LENGTH)
-
-#define SUCCESSFULLY_DEREGISTERED_DEREGISTRATION_STATUS                0x0
-#define UNKNOWN_DEREGISTRATION_STATUS                                  0x1
-#define INVALID_ROUTING_CONTEXT_DEREGISTRATION_STATUS                  0x2
-#define PERMISSION_DENIED_DEREGISTRATION_STATUS                        0x3
-#define NOT_REGISTERED_DEREGISTRATION_STATUS                           0x4
-#define ASP_CURRENTLY_ACTIVE_FOR_ROUTING_CONTEXT_DEREGISTRATION_STATUS 0x5
+#define TID_START_LENGTH 1
+#define TID_END_LENGTH 1
+#define TID_VALUE_LENGTH 2
 
-static const value_string sua_deregistration_status_values[] = {
-  { SUCCESSFULLY_DEREGISTERED_DEREGISTRATION_STATUS,                "Successfully Deregistered" },
-  { UNKNOWN_DEREGISTRATION_STATUS,                                  "Error - Unknown" },
-  { INVALID_ROUTING_CONTEXT_DEREGISTRATION_STATUS,                  "Error - Invalid Routing Context" },
-  { PERMISSION_DENIED_DEREGISTRATION_STATUS,                        "Error - Permission Denied" },
-  { NOT_REGISTERED_DEREGISTRATION_STATUS,                           "Error - Not Registered" },
-  { ASP_CURRENTLY_ACTIVE_FOR_ROUTING_CONTEXT_DEREGISTRATION_STATUS, "Error - ASP Currently Active for Routing Context" },
-  { 0,                                                              NULL } };
+#define TID_START_OFFSET PARAMETER_VALUE_OFFSET
+#define TID_END_OFFSET   (TID_START_OFFSET + TID_START_LENGTH)
+#define TID_VALUE_OFFSET (TID_END_OFFSET + TID_END_LENGTH)
 
 static void
-dissect_sua_deregistration_result_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+dissect_tid_label_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree)
 {
-  guint32 routing_context, deregistration_status;
-
-  routing_context       = tvb_get_ntohl(parameter_tvb, DEREGISTRATION_ROUTING_CONTEXT_OFFSET);
-  deregistration_status = tvb_get_ntohl(parameter_tvb, DEREGISTRATION_STATUS_OFFSET);
-
-  proto_tree_add_uint(parameter_tree, hf_sua_deregistration_result_routing_context,
-                      parameter_tvb, DEREGISTRATION_ROUTING_CONTEXT_OFFSET, DEREGISTRATION_ROUTING_CONTEXT_LENGTH,
-                      routing_context);
-  proto_tree_add_uint(parameter_tree, hf_sua_deregistration_result_status,
-                      parameter_tvb, REGISTRATION_STATUS_OFFSET, REGISTRATION_STATUS_LENGTH,
-                      deregistration_status);
-
-  proto_item_set_text(parameter_item, "Deregistration Result: %s", val_to_str(deregistration_status, sua_deregistration_status_values, "Unknown"));
+  proto_tree_add_item(parameter_tree, hf_tid_label_start, parameter_tvb, TID_START_OFFSET, TID_START_LENGTH, NETWORK_BYTE_ORDER);
+  proto_tree_add_item(parameter_tree, hf_tid_label_end,   parameter_tvb, TID_END_OFFSET,   TID_END_LENGTH,   NETWORK_BYTE_ORDER);
+  proto_tree_add_item(parameter_tree, hf_tid_label_value, parameter_tvb, TID_VALUE_OFFSET, TID_VALUE_LENGTH, NETWORK_BYTE_ORDER);
 }
 
 #define ADDRESS_RANGE_ADDRESS_PARAMETERS_OFFSET  PARAMETER_VALUE_OFFSET
 
 static void
-dissect_sua_address_range_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+dissect_address_range_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree)
 {
-  proto_item_set_text(parameter_item, "Address Range");
-
-  dissect_sua_tlv_list(parameter_tvb, parameter_tree, ADDRESS_RANGE_ADDRESS_PARAMETERS_OFFSET);
+  tvbuff_t *parameters_tvb;
+  
+  parameters_tvb = tvb_new_subset(parameter_tvb, PARAMETER_VALUE_OFFSET, -1, -1);
+  dissect_parameters(parameters_tvb, parameter_tree, NULL, NULL, NULL);
 }
 
-#define CORRELATION_ID_LENGTH 4
-#define CORRELATION_ID_OFFSET PARAMETER_VALUE_OFFSET
+#define SMI_LENGTH 1
+#define SMI_OFFSET (PARAMETER_VALUE_OFFSET + RESERVED_3_LENGTH)
 
 static void
-dissect_sua_correlation_id_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+dissect_smi_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
 {
-  guint32 correlation_id;
-
-  correlation_id = tvb_get_ntohl(parameter_tvb, CORRELATION_ID_OFFSET);
-
-  proto_tree_add_uint(parameter_tree, hf_sua_correlation_id,
-                      parameter_tvb, CORRELATION_ID_OFFSET, CORRELATION_ID_LENGTH,
-                      correlation_id);
-
-  proto_item_set_text(parameter_item, "Correlation ID: %u", correlation_id);
+  proto_tree_add_item(parameter_tree, hf_smi_reserved, parameter_tvb, PARAMETER_VALUE_OFFSET, RESERVED_3_LENGTH, NETWORK_BYTE_ORDER);
+  proto_tree_add_item(parameter_tree, hf_smi,          parameter_tvb, SMI_OFFSET,             SMI_LENGTH,        NETWORK_BYTE_ORDER);
+  proto_item_append_text(parameter_item, " (%u)", tvb_get_guint8(parameter_tvb,  SMI_OFFSET));
 }
 
 #define IMPORTANCE_LENGTH 1
 #define IMPORTANCE_OFFSET (PARAMETER_VALUE_OFFSET + RESERVED_3_LENGTH)
 
 static void
-dissect_sua_importance_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+dissect_importance_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
 {
-  guint8 importance;
-
-  importance = tvb_get_guint8(parameter_tvb,  IMPORTANCE_OFFSET);
-
-  proto_tree_add_bytes(parameter_tree, hf_sua_importance_reserved,
-                       parameter_tvb, PARAMETER_VALUE_OFFSET, RESERVED_3_LENGTH,
-                       tvb_get_ptr(parameter_tvb, PARAMETER_VALUE_OFFSET, RESERVED_3_LENGTH));
-  proto_tree_add_uint(parameter_tree, hf_sua_importance,
-                      parameter_tvb, IMPORTANCE_OFFSET, IMPORTANCE_LENGTH,
-                      importance);
-
-  proto_item_set_text(parameter_item, "Importance (%u)", importance);
+  proto_tree_add_item(parameter_tree, hf_importance_reserved, parameter_tvb, PARAMETER_VALUE_OFFSET, RESERVED_3_LENGTH, NETWORK_BYTE_ORDER);
+  proto_tree_add_item(parameter_tree, hf_importance,          parameter_tvb, IMPORTANCE_OFFSET,      IMPORTANCE_LENGTH, NETWORK_BYTE_ORDER);
+  proto_item_append_text(parameter_item, " (%u)", tvb_get_guint8(parameter_tvb,  IMPORTANCE_OFFSET));
 }
 
 #define MESSAGE_PRIORITY_LENGTH 1
 #define MESSAGE_PRIORITY_OFFSET (PARAMETER_VALUE_OFFSET + RESERVED_3_LENGTH)
 
 static void
-dissect_sua_message_priority_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+dissect_message_priority_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
 {
-  guint8 priority;
-
-  priority = tvb_get_guint8(parameter_tvb,  MESSAGE_PRIORITY_OFFSET);
-  proto_tree_add_bytes(parameter_tree, hf_sua_message_priority_reserved,
-                       parameter_tvb, PARAMETER_VALUE_OFFSET, RESERVED_3_LENGTH,
-                       tvb_get_ptr(parameter_tvb, PARAMETER_VALUE_OFFSET, RESERVED_3_LENGTH));
-
-  proto_tree_add_uint(parameter_tree, hf_sua_message_priority,
-                      parameter_tvb, MESSAGE_PRIORITY_OFFSET, MESSAGE_PRIORITY_LENGTH,
-                      priority);
-
-  proto_item_set_text(parameter_item, "Message Priority (%u)", priority);
+  proto_tree_add_item(parameter_tree, hf_message_priority_reserved, parameter_tvb, PARAMETER_VALUE_OFFSET,  RESERVED_3_LENGTH,       NETWORK_BYTE_ORDER);
+  proto_tree_add_item(parameter_tree, hf_message_priority,          parameter_tvb, MESSAGE_PRIORITY_OFFSET, MESSAGE_PRIORITY_LENGTH, NETWORK_BYTE_ORDER);
+  proto_item_append_text(parameter_item, " (%u)", tvb_get_guint8(parameter_tvb,  MESSAGE_PRIORITY_OFFSET));
 }
 
 #define PROTOCOL_CLASS_LENGTH         1
@@ -1405,52 +1075,34 @@ dissect_sua_message_priority_parameter(tvbuff_t *parameter_tvb, proto_tree *para
 #define PROTOCOL_CLASS_MASK      0x7f
 
 
-static const true_false_string sua_return_on_error_bit_value = {
+static const true_false_string return_on_error_bit_value = {
   "Return Message On Error",
   "No Special Options"
 };
 
 static void
-dissect_sua_protocol_class_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+dissect_protocol_class_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree)
 {
-  guint8  protocol_class;
   proto_item *protocol_class_item;
   proto_tree *protocol_class_tree;
 
-  protocol_class = tvb_get_guint8(parameter_tvb, PROTOCOL_CLASS_OFFSET);
+  proto_tree_add_item(parameter_tree, hf_protocol_class_reserved, parameter_tvb, PARAMETER_VALUE_OFFSET, RESERVED_3_LENGTH, NETWORK_BYTE_ORDER);
 
-  proto_tree_add_bytes(parameter_tree, hf_sua_protocol_class_reserved,
-                       parameter_tvb, PARAMETER_VALUE_OFFSET, RESERVED_3_LENGTH,
-                       tvb_get_ptr(parameter_tvb, PARAMETER_VALUE_OFFSET, RESERVED_3_LENGTH));
-
-  protocol_class_item = proto_tree_add_text(parameter_tree, parameter_tvb, PROTOCOL_CLASS_OFFSET, PROTOCOL_CLASS_LENGTH,
-                                            "Protocol Class");
+  protocol_class_item = proto_tree_add_text(parameter_tree, parameter_tvb, PROTOCOL_CLASS_OFFSET, PROTOCOL_CLASS_LENGTH, "Protocol Class");
   protocol_class_tree = proto_item_add_subtree(protocol_class_item, ett_sua_return_on_error_bit_and_protocol_class);
 
-  proto_tree_add_boolean(protocol_class_tree, hf_sua_return_on_error_bit, parameter_tvb,
-                                          PROTOCOL_CLASS_OFFSET, PROTOCOL_CLASS_LENGTH, protocol_class);
-  proto_tree_add_uint(protocol_class_tree, hf_sua_protocol_class,
-                      parameter_tvb, PROTOCOL_CLASS_OFFSET, PROTOCOL_CLASS_LENGTH,
-                      protocol_class);
-
-  proto_item_set_text(parameter_item, "Protocol Class");
+  proto_tree_add_item(protocol_class_tree, hf_return_on_error_bit, parameter_tvb, PROTOCOL_CLASS_OFFSET, PROTOCOL_CLASS_LENGTH, NETWORK_BYTE_ORDER);
+  proto_tree_add_item(protocol_class_tree, hf_protocol_class,      parameter_tvb, PROTOCOL_CLASS_OFFSET, PROTOCOL_CLASS_LENGTH, NETWORK_BYTE_ORDER);
 }
 
 #define SEQUENCE_CONTROL_LENGTH 4
 #define SEQUENCE_CONTROL_OFFSET PARAMETER_VALUE_OFFSET
 
 static void
-dissect_sua_sequence_control_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+dissect_sequence_control_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
 {
-  guint32 sequence_control;
-
-  sequence_control = tvb_get_ntohl(parameter_tvb, SEQUENCE_CONTROL_OFFSET);
-
-  proto_tree_add_uint(parameter_tree, hf_sua_sequence_control,
-                      parameter_tvb, SEQUENCE_CONTROL_OFFSET, SEQUENCE_CONTROL_LENGTH,
-                      sequence_control);
-
-  proto_item_set_text(parameter_item, "Sequence Control: %u", sequence_control);
+  proto_tree_add_item(parameter_tree, hf_sequence_control, parameter_tvb, SEQUENCE_CONTROL_OFFSET, SEQUENCE_CONTROL_LENGTH, NETWORK_BYTE_ORDER);
+  proto_item_append_text(parameter_item, " (%u)", tvb_get_ntohl(parameter_tvb, SEQUENCE_CONTROL_OFFSET));
 }
 
 #define FIRST_REMAINING_LENGTH        1
@@ -1461,126 +1113,42 @@ dissect_sua_sequence_control_parameter(tvbuff_t *parameter_tvb, proto_tree *para
 #define FIRST_BIT_MASK 0x80
 #define NUMBER_OF_SEGMENTS_MASK 0x7f
 
-static const true_false_string sua_first_bit_value = {
+static const true_false_string first_bit_value = {
   "First segment",
   "Subsequent segment"
 };
 
 static void
-dissect_sua_segmentation_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+dissect_segmentation_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree)
 {
-  guint8  first_remaining;
-  guint32 segmentation_reference;
   proto_item *first_remaining_item;
   proto_tree *first_remaining_tree;
 
-  first_remaining        = tvb_get_guint8(parameter_tvb, FIRST_REMAINING_OFFSET);
-  segmentation_reference = tvb_get_ntoh24(parameter_tvb, SEGMENTATION_REFERENCE_OFFSET);
-
-  first_remaining_item = proto_tree_add_text(parameter_tree, parameter_tvb, FIRST_REMAINING_OFFSET, FIRST_REMAINING_LENGTH,
-                                                                    "First / Remaining");
+  first_remaining_item = proto_tree_add_text(parameter_tree, parameter_tvb, FIRST_REMAINING_OFFSET, FIRST_REMAINING_LENGTH, "First / Remaining");
   first_remaining_tree = proto_item_add_subtree(first_remaining_item, ett_sua_first_remaining);
-  proto_tree_add_boolean(first_remaining_tree, hf_sua_first_bit, parameter_tvb,
-                                          FIRST_REMAINING_OFFSET, FIRST_REMAINING_LENGTH, first_remaining);
-  proto_tree_add_uint(first_remaining_tree, hf_sua_number_of_remaining_segments,
-                      parameter_tvb, FIRST_REMAINING_OFFSET, FIRST_REMAINING_LENGTH,
-                      first_remaining);
-
-  proto_tree_add_uint(parameter_tree, hf_sua_segmentation_reference,
-                      parameter_tvb, SEGMENTATION_REFERENCE_OFFSET, SEGMENTATION_REFERENCE_LENGTH,
-                      segmentation_reference);
-
-  proto_item_set_text(parameter_item, "Segmentation");
+  proto_tree_add_item(first_remaining_tree, hf_first_bit,                    parameter_tvb, FIRST_REMAINING_OFFSET, FIRST_REMAINING_LENGTH, NETWORK_BYTE_ORDER);
+  proto_tree_add_item(first_remaining_tree, hf_number_of_remaining_segments, parameter_tvb, FIRST_REMAINING_OFFSET, FIRST_REMAINING_LENGTH, NETWORK_BYTE_ORDER);
+  proto_tree_add_item(parameter_tree, hf_segmentation_reference, parameter_tvb, SEGMENTATION_REFERENCE_OFFSET, SEGMENTATION_REFERENCE_LENGTH, NETWORK_BYTE_ORDER);
 }
 
-#define SMI_LENGTH 1
-#define SMI_OFFSET (PARAMETER_VALUE_OFFSET + RESERVED_3_LENGTH)
-
-static void
-dissect_sua_smi_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
-{
-  guint8 smi;
-
-  smi = tvb_get_guint8(parameter_tvb,  SMI_OFFSET);
-
-  proto_tree_add_bytes(parameter_tree, hf_sua_smi_reserved,
-                       parameter_tvb, PARAMETER_VALUE_OFFSET, RESERVED_3_LENGTH,
-                       tvb_get_ptr(parameter_tvb, PARAMETER_VALUE_OFFSET, RESERVED_3_LENGTH));
-  proto_tree_add_uint(parameter_tree, hf_sua_smi,
-                      parameter_tvb, SMI_OFFSET, SMI_LENGTH,
-                      smi);
-
-  proto_item_set_text(parameter_item, "SMI (%u)", smi);
-}
-
-#define TID_START_LENGTH 1
-#define TID_END_LENGTH 1
-#define TID_VALUE_LENGTH 2
-
-#define TID_START_OFFSET PARAMETER_VALUE_OFFSET
-#define TID_END_OFFSET   (TID_START_OFFSET + TID_START_LENGTH)
-#define TID_VALUE_OFFSET (TID_END_OFFSET + TID_END_LENGTH)
-
-static void
-dissect_sua_tid_label_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
-{
-  guint8  start, end;
-  guint16 value;
-
-  start = tvb_get_guint8(parameter_tvb,  TID_START_OFFSET);
-  end   = tvb_get_guint8(parameter_tvb,  TID_END_OFFSET);
-  value = tvb_get_ntohs(parameter_tvb,   TID_VALUE_OFFSET);
-
-  proto_tree_add_uint(parameter_tree, hf_sua_tid_label_start,
-                      parameter_tvb, TID_START_OFFSET, TID_START_LENGTH,
-                      start);
-  proto_tree_add_uint(parameter_tree, hf_sua_tid_label_end,
-                      parameter_tvb, TID_END_OFFSET, TID_END_LENGTH,
-                      end);
-  proto_tree_add_uint(parameter_tree, hf_sua_tid_label_value,
-                      parameter_tvb, TID_VALUE_OFFSET, TID_VALUE_LENGTH,
-                      value);
-
-  proto_item_set_text(parameter_item, "TID Label");
-}
-
-#define DRN_START_LENGTH 1
-#define DRN_END_LENGTH 1
-#define DRN_VALUE_LENGTH 2
-
-#define DRN_START_OFFSET PARAMETER_VALUE_OFFSET
-#define DRN_END_OFFSET   (DRN_START_OFFSET + DRN_START_LENGTH)
-#define DRN_VALUE_OFFSET (DRN_END_OFFSET + DRN_END_LENGTH)
+#define CONGESTION_LEVEL_LENGTH 4
+#define CONGESTION_LEVEL_OFFSET PARAMETER_VALUE_OFFSET
 
 static void
-dissect_sua_drn_label_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+dissect_congestion_level_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
 {
-  guint8  start, end;
-  guint16 value;
-
-  start = tvb_get_guint8(parameter_tvb,  DRN_START_OFFSET);
-  end   = tvb_get_guint8(parameter_tvb,  DRN_END_OFFSET);
-  value = tvb_get_ntohs(parameter_tvb,   DRN_VALUE_OFFSET);
-
-  proto_tree_add_uint(parameter_tree, hf_sua_drn_label_start,
-                      parameter_tvb, DRN_START_OFFSET, DRN_START_LENGTH,
-                      start);
-  proto_tree_add_uint(parameter_tree, hf_sua_drn_label_end,
-                      parameter_tvb, DRN_END_OFFSET, DRN_END_LENGTH,
-                      end);
-  proto_tree_add_uint(parameter_tree, hf_sua_drn_label_value,
-                      parameter_tvb, DRN_VALUE_OFFSET, DRN_VALUE_LENGTH,
-                      value);
-
-  proto_item_set_text(parameter_item, "DRN Label");
+  proto_tree_add_item(parameter_tree, hf_congestion_level, parameter_tvb, CONGESTION_LEVEL_OFFSET, CONGESTION_LEVEL_LENGTH, NETWORK_BYTE_ORDER);
+  proto_item_append_text(parameter_item, " (%u)", tvb_get_ntohl(parameter_tvb, CONGESTION_LEVEL_OFFSET));
 }
 
+#define GTI_LENGTH               1
 #define NO_OF_DIGITS_LENGTH      1
 #define TRANSLATION_TYPE_LENGTH  1
 #define NUMBERING_PLAN_LENGTH    1
 #define NATURE_OF_ADDRESS_LENGTH 1
 
-#define NO_OF_DIGITS_OFFSET      PARAMETER_VALUE_OFFSET
+#define GTI_OFFSET               (PARAMETER_VALUE_OFFSET + RESERVED_3_LENGTH)
+#define NO_OF_DIGITS_OFFSET      (GTI_OFFSET + GTI_LENGTH)
 #define TRANSLATION_TYPE_OFFSET  (NO_OF_DIGITS_OFFSET + NO_OF_DIGITS_LENGTH)
 #define NUMBERING_PLAN_OFFSET    (TRANSLATION_TYPE_OFFSET + TRANSLATION_TYPE_LENGTH)
 #define NATURE_OF_ADDRESS_OFFSET (NUMBERING_PLAN_OFFSET + NUMBERING_PLAN_LENGTH)
@@ -1595,7 +1163,7 @@ dissect_sua_drn_label_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_t
 #define ISDN_MOBILE_NUMBERING_PLAN      7
 #define PRIVATE_NETWORK_NUMBERING_PLAN 14
 
-static const value_string sua_numbering_plan_values[] = {
+static const value_string numbering_plan_values[] = {
   { ISDN_TELEPHONY_NUMBERING_PLAN,  "ISDN/Telephony Numbering Plan (Rec. E.161 and E.164)" },
   { GENERIC_NUMBERING_PLAN,         "Generic Numbering Plan" },
   { DATA_NUMBERING_PLAN,            "Data Numbering Plan (Rec. X.121)" },
@@ -1612,7 +1180,7 @@ static const value_string sua_numbering_plan_values[] = {
 #define NATIONAL_SIGNIFICANT_NUMBER_NATURE_OF_ADDRESS   3
 #define INTERNATION_NUMBER_NATURE_OF_ADDRESS            4
 
-static const value_string sua_nature_of_address_values[] = {
+static const value_string nature_of_address_values[] = {
   { UNKNOWN_NATURE_OF_ADDRESS,                     "Unknown" },
   { SUBSCRIBER_NUMBER_NATURE_OF_ADDRESS,           "Subscriber Number" },
   { RESERVED_FOR_NATIONAL_USE_NATURE_OF_ADDRESS,   "Reserved For National Use" },
@@ -1621,491 +1189,403 @@ static const value_string sua_nature_of_address_values[] = {
   { 0,                                             NULL } };
 
 static void
-dissect_sua_global_title_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+dissect_global_title_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree)
 {
-  guint8  number_of_digits, translation_type, numbering_plan, nature_of_address;
-  guint16 length, global_title_length, padding_length;
-
-  length              = tvb_get_ntohs(parameter_tvb, PARAMETER_LENGTH_OFFSET);
-  global_title_length = length - (PARAMETER_HEADER_LENGTH + NO_OF_DIGITS_LENGTH
-                                                          + TRANSLATION_TYPE_LENGTH
-                                                          + NUMBERING_PLAN_LENGTH
-                                                          + NATURE_OF_ADDRESS_LENGTH);
-  padding_length      = nr_of_padding_bytes(length);
-
-  number_of_digits  = tvb_get_guint8(parameter_tvb, NO_OF_DIGITS_OFFSET);
-  translation_type  = tvb_get_guint8(parameter_tvb, TRANSLATION_TYPE_OFFSET);
-  numbering_plan    = tvb_get_guint8(parameter_tvb, NUMBERING_PLAN_OFFSET);
-  nature_of_address = tvb_get_guint8(parameter_tvb, NATURE_OF_ADDRESS_OFFSET);
-
-  proto_tree_add_uint(parameter_tree, hf_sua_number_of_digits,
-                      parameter_tvb, NO_OF_DIGITS_OFFSET, NO_OF_DIGITS_LENGTH,
-                      number_of_digits);
-  proto_tree_add_uint(parameter_tree, hf_sua_translation_type,
-                      parameter_tvb, TRANSLATION_TYPE_OFFSET, TRANSLATION_TYPE_LENGTH,
-                      translation_type);
-  proto_tree_add_uint(parameter_tree, hf_sua_numbering_plan,
-                      parameter_tvb, NUMBERING_PLAN_OFFSET, NUMBERING_PLAN_LENGTH,
-                      numbering_plan);
-  proto_tree_add_uint(parameter_tree, hf_sua_nature_of_address,
-                      parameter_tvb, NATURE_OF_ADDRESS_OFFSET, NATURE_OF_ADDRESS_LENGTH,
-                      nature_of_address);
-  proto_tree_add_bytes(parameter_tree, hf_sua_global_title,
-                       parameter_tvb, GLOBAL_TITLE_OFFSET, global_title_length,
-                       tvb_get_ptr(parameter_tvb, GLOBAL_TITLE_OFFSET, global_title_length));
-
-  if (padding_length > 0)
-    proto_tree_add_bytes(parameter_tree, hf_sua_global_title_padding,
-                         parameter_tvb, GLOBAL_TITLE_OFFSET + global_title_length, padding_length,
-                         tvb_get_ptr(parameter_tvb, GLOBAL_TITLE_OFFSET + global_title_length, padding_length));
-
-  proto_item_set_text(parameter_item, "Global Title");
-
+  guint16 global_title_length;
+
+  global_title_length = tvb_get_ntohs(parameter_tvb, PARAMETER_LENGTH_OFFSET) - 
+                        (PARAMETER_HEADER_LENGTH + RESERVED_3_LENGTH + GTI_LENGTH + NO_OF_DIGITS_LENGTH + TRANSLATION_TYPE_LENGTH + NUMBERING_PLAN_LENGTH + NATURE_OF_ADDRESS_LENGTH);
+  proto_tree_add_item(parameter_tree, hf_gt_reserved,       parameter_tvb, PARAMETER_VALUE_OFFSET,   RESERVED_3_LENGTH,        NETWORK_BYTE_ORDER);
+  proto_tree_add_item(parameter_tree, hf_gti,               parameter_tvb, GTI_OFFSET,               GTI_LENGTH,               NETWORK_BYTE_ORDER);
+  proto_tree_add_item(parameter_tree, hf_number_of_digits,  parameter_tvb, NO_OF_DIGITS_OFFSET,      NO_OF_DIGITS_LENGTH,      NETWORK_BYTE_ORDER);
+  proto_tree_add_item(parameter_tree, hf_translation_type,  parameter_tvb, TRANSLATION_TYPE_OFFSET,  TRANSLATION_TYPE_LENGTH,  NETWORK_BYTE_ORDER);
+  proto_tree_add_item(parameter_tree, hf_numbering_plan,    parameter_tvb, NUMBERING_PLAN_OFFSET,    NUMBERING_PLAN_LENGTH,    NETWORK_BYTE_ORDER);
+  proto_tree_add_item(parameter_tree, hf_nature_of_address, parameter_tvb, NATURE_OF_ADDRESS_OFFSET, NATURE_OF_ADDRESS_LENGTH, NETWORK_BYTE_ORDER);
+  proto_tree_add_item(parameter_tree, hf_global_title,      parameter_tvb, GLOBAL_TITLE_OFFSET,      global_title_length,      NETWORK_BYTE_ORDER);
 }
 
+#define POINT_CODE_LENGTH 4
+#define POINT_CODE_OFFSET PARAMETER_VALUE_OFFSET
+
 static void
-dissect_sua_point_code_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+dissect_point_code_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
 {
-  guint8  mask;
-  guint32 dpc;
-
-  mask = tvb_get_guint8(parameter_tvb, AFFECTED_MASK_OFFSET);
-  dpc  = tvb_get_ntoh24(parameter_tvb, AFFECTED_DPC_OFFSET);
-
-  proto_tree_add_uint(parameter_tree, hf_sua_point_code_mask,
-                      parameter_tvb, PARAMETER_VALUE_OFFSET + AFFECTED_MASK_OFFSET, AFFECTED_MASK_LENGTH,
-                      mask);
-  proto_tree_add_uint(parameter_tree, hf_sua_point_code_dpc,
-                      parameter_tvb, PARAMETER_VALUE_OFFSET + AFFECTED_DPC_OFFSET, AFFECTED_DPC_LENGTH,
-                      dpc);
-  proto_item_set_text(parameter_item, "Point Code");
-
+  proto_tree_add_item(parameter_tree, hf_point_code_dpc, parameter_tvb, POINT_CODE_OFFSET, POINT_CODE_LENGTH, NETWORK_BYTE_ORDER);
+  proto_item_append_text(parameter_item, " (%u)", tvb_get_ntohl(parameter_tvb, POINT_CODE_OFFSET));
 }
 
 #define SSN_LENGTH 1
 #define SSN_OFFSET (PARAMETER_VALUE_OFFSET + RESERVED_3_LENGTH)
+#define INVALID_SSN 0xff
 
 static void
-dissect_sua_ssn_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+dissect_ssn_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item, guint8 *ssn)
 {
-  guint8 ssn;
-
-  ssn = tvb_get_guint8(parameter_tvb,  SSN_OFFSET);
-
-  proto_tree_add_bytes(parameter_tree, hf_sua_ssn_reserved,
-                       parameter_tvb, PARAMETER_VALUE_OFFSET, RESERVED_3_LENGTH,
-                       tvb_get_ptr(parameter_tvb, PARAMETER_VALUE_OFFSET, RESERVED_3_LENGTH));
-  proto_tree_add_uint(parameter_tree, hf_sua_ssn_number,
-                      parameter_tvb, SSN_OFFSET, SSN_LENGTH,
-                      ssn);
+  *ssn = tvb_get_guint8(parameter_tvb,  SSN_OFFSET);
 
-  proto_item_set_text(parameter_item, "Subsystem number (%u)", ssn);
+  if(parameter_tree) {
+    proto_tree_add_item(parameter_tree, hf_ssn_reserved, parameter_tvb, PARAMETER_VALUE_OFFSET, RESERVED_3_LENGTH, NETWORK_BYTE_ORDER);
+    proto_tree_add_item(parameter_tree, hf_ssn_number,   parameter_tvb, SSN_OFFSET,             SSN_LENGTH,        NETWORK_BYTE_ORDER);
+    proto_item_append_text(parameter_item, " (%u)", *ssn);
+  }
 }
 
 #define IPV4_ADDRESS_LENGTH 4
 #define IPV4_ADDRESS_OFFSET PARAMETER_VALUE_OFFSET
 
 static void
-dissect_sua_ipv4_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+dissect_ipv4_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
 {
-  guint32 ipv4_address;
-
-  tvb_memcpy(parameter_tvb, (guint8 *)&ipv4_address, IPV4_ADDRESS_OFFSET, IPV4_ADDRESS_LENGTH);
-  proto_tree_add_ipv4(parameter_tree, hf_sua_ipv4,
-                                 parameter_tvb, IPV4_ADDRESS_OFFSET, IPV4_ADDRESS_LENGTH,
-                                 ipv4_address);
-  proto_item_set_text(parameter_item, "IPV4 Address");
+  proto_tree_add_item(parameter_tree, hf_ipv4, parameter_tvb, IPV4_ADDRESS_OFFSET, IPV4_ADDRESS_LENGTH, NETWORK_BYTE_ORDER);
+  proto_item_append_text(parameter_item, " (%s)", ip_to_str((const guint8 *)tvb_get_ptr(parameter_tvb, IPV4_ADDRESS_OFFSET, IPV4_ADDRESS_LENGTH)));
 }
 
+#define HOSTNAME_OFFSET PARAMETER_VALUE_OFFSET
+
 static void
-dissect_sua_hostname_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+dissect_hostname_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
 {
-  guint16  length, hostname_length, padding_length;
-  const char *hostname;
-
-  length = tvb_get_ntohs(parameter_tvb, PARAMETER_LENGTH_OFFSET);
-  padding_length = nr_of_padding_bytes(length);
-  hostname_length = length - PARAMETER_HEADER_LENGTH;
-  hostname = (const char *)tvb_get_ptr(parameter_tvb, PARAMETER_VALUE_OFFSET, hostname_length);
-
-  proto_tree_add_string(parameter_tree, hf_sua_hostname, parameter_tvb,
-                                         PARAMETER_VALUE_OFFSET, hostname_length,
-                                         hostname);
-  if (padding_length > 0)
-    proto_tree_add_bytes(parameter_tree, hf_sua_hostname_padding,
-                         parameter_tvb, PARAMETER_VALUE_OFFSET + hostname_length, padding_length,
-                         tvb_get_ptr(parameter_tvb, PARAMETER_VALUE_OFFSET + hostname_length, padding_length));
-
-  proto_item_set_text(parameter_item, "Hostname (%s)", hostname);
+  guint16 hostname_length;
+
+  hostname_length = tvb_get_ntohs(parameter_tvb, PARAMETER_LENGTH_OFFSET) - PARAMETER_HEADER_LENGTH;
+  proto_tree_add_item(parameter_tree, hf_hostname, parameter_tvb, HOSTNAME_OFFSET, hostname_length, NETWORK_BYTE_ORDER);
+  proto_item_append_text(parameter_item, " (%.*s)", hostname_length,
+                         (const char *)tvb_get_ptr(parameter_tvb, HOSTNAME_OFFSET, hostname_length));
 }
 
 #define IPV6_ADDRESS_LENGTH 16
 #define IPV6_ADDRESS_OFFSET PARAMETER_VALUE_OFFSET
 
 static void
-dissect_sua_ipv6_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+dissect_ipv6_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
 {
-  proto_tree_add_ipv6(parameter_tree, hf_sua_ipv6,
-                                 parameter_tvb, IPV6_ADDRESS_OFFSET, IPV6_ADDRESS_LENGTH,
-                                 tvb_get_ptr(parameter_tvb, IPV6_ADDRESS_OFFSET, IPV6_ADDRESS_LENGTH));
-
-  proto_item_set_text(parameter_item, "IPV6 Address");
+  proto_tree_add_item(parameter_tree, hf_ipv6, parameter_tvb, IPV6_ADDRESS_OFFSET, IPV6_ADDRESS_LENGTH, NETWORK_BYTE_ORDER);
+  proto_item_append_text(parameter_item, " (%s)", ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(parameter_tvb, IPV6_ADDRESS_OFFSET, IPV6_ADDRESS_LENGTH)));
 }
 
 static void
-dissect_sua_unknown_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
+dissect_unknown_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
 {
-  guint16 tag, length, parameter_value_length, padding_length;
+  guint16 parameter_value_length;
 
-  tag            = tvb_get_ntohs(parameter_tvb, PARAMETER_TAG_OFFSET);
-  length         = tvb_get_ntohs(parameter_tvb, PARAMETER_LENGTH_OFFSET);
-  padding_length = nr_of_padding_bytes(length);
-
-  parameter_value_length = length - PARAMETER_HEADER_LENGTH;
-
-  proto_tree_add_bytes(parameter_tree, hf_sua_parameter_value,
-                       parameter_tvb, PARAMETER_VALUE_OFFSET, parameter_value_length,
-                       tvb_get_ptr(parameter_tvb, PARAMETER_VALUE_OFFSET, parameter_value_length));
-
-  if (padding_length > 0)
-    proto_tree_add_bytes(parameter_tree, hf_sua_parameter_padding,
-                         parameter_tvb, PARAMETER_VALUE_OFFSET + parameter_value_length, padding_length,
-                         tvb_get_ptr(parameter_tvb, PARAMETER_VALUE_OFFSET + parameter_value_length, padding_length));
-
-  proto_item_set_text(parameter_item, "Parameter with tag %u and %u byte%s value",
-                                 tag, parameter_value_length, plurality(parameter_value_length, "", "s"));
+  parameter_value_length = tvb_get_ntohs(parameter_tvb, PARAMETER_LENGTH_OFFSET) - PARAMETER_HEADER_LENGTH;
+  proto_tree_add_item(parameter_tree, hf_parameter_value, parameter_tvb, PARAMETER_VALUE_OFFSET, parameter_value_length, NETWORK_BYTE_ORDER);
+  proto_item_append_text(parameter_item, "(tag %u and %u byte%s value)", tvb_get_ntohs(parameter_tvb, PARAMETER_TAG_OFFSET), parameter_value_length, plurality(parameter_value_length, "", "s"));
 }
 
 static void
-dissect_sua_parameter(tvbuff_t *parameter_tvb, proto_tree *sua_tree)
+dissect_parameter(tvbuff_t *parameter_tvb, proto_tree *tree, tvbuff_t **data_tvb, guint8 *source_ssn, guint8 *dest_ssn)
 {
-  guint16 tag, length, padding_length, total_length;
+  guint16 tag, length, padding_length;
   proto_item *parameter_item;
   proto_tree *parameter_tree;
+  guint8 ssn = INVALID_SSN;
 
   /* extract tag and length from the parameter */
   tag            = tvb_get_ntohs(parameter_tvb, PARAMETER_TAG_OFFSET);
   length         = tvb_get_ntohs(parameter_tvb, PARAMETER_LENGTH_OFFSET);
+  padding_length = tvb_length(parameter_tvb) - length;
 
-  /* calculate padding and total length */
-  padding_length = nr_of_padding_bytes(length);
-  total_length   = length + padding_length;
-
-  /* create proto_tree stuff */
-  parameter_item   = proto_tree_add_text(sua_tree, parameter_tvb, PARAMETER_HEADER_OFFSET, total_length, "Incomplete parameter");
-  parameter_tree   = proto_item_add_subtree(parameter_item, ett_sua_parameter);
-
-  /* add tag and length to the sua tree */
-  proto_tree_add_uint(parameter_tree, hf_sua_parameter_tag,
-                                 parameter_tvb, PARAMETER_TAG_OFFSET, PARAMETER_TAG_LENGTH,
-                                 tag);
-
-  proto_tree_add_uint(parameter_tree, hf_sua_parameter_length,
-                                 parameter_tvb, PARAMETER_LENGTH_OFFSET, PARAMETER_LENGTH_LENGTH,
-                                 length);
+  if (tree) {
+    /* create proto_tree stuff */
+    parameter_item   = proto_tree_add_text(tree, parameter_tvb, PARAMETER_HEADER_OFFSET, tvb_length(parameter_tvb), val_to_str(tag, parameter_tag_values, "Unknown parameter"));
+    parameter_tree   = proto_item_add_subtree(parameter_item, ett_sua_parameter);
 
+    /* add tag and length to the sua tree */
+    proto_tree_add_item(parameter_tree, hf_parameter_tag,    parameter_tvb, PARAMETER_TAG_OFFSET,    PARAMETER_TAG_LENGTH,    NETWORK_BYTE_ORDER);
+    proto_tree_add_item(parameter_tree, hf_parameter_length, parameter_tvb, PARAMETER_LENGTH_OFFSET, PARAMETER_LENGTH_LENGTH, NETWORK_BYTE_ORDER);
+  } else {
+    parameter_tree = NULL;
+    parameter_item = NULL;
+  }
+/*
+** If no tree, only the data and ssn parameters in the source and destination
+** address need to be dissected. This in order to make dissection of the data
+** possible when there is no tree.
+*/
   switch(tag) {
   case DATA_PARAMETER_TAG:
-    dissect_sua_data_parameter(parameter_tvb, parameter_tree, parameter_item);
+    dissect_data_parameter(parameter_tvb, parameter_tree, parameter_item, data_tvb);
     break;
   case INFO_STRING_PARAMETER_TAG:
-    dissect_sua_info_parameter(parameter_tvb, parameter_tree, parameter_item);
+    if (parameter_tree) {
+      dissect_info_string_parameter(parameter_tvb, parameter_tree, parameter_item);
+    }
     break;
   case ROUTING_CONTEXT_PARAMETER_TAG:
-    dissect_sua_routing_context_parameter(parameter_tvb, parameter_tree, parameter_item);
+    if (parameter_tree) {
+      dissect_routing_context_parameter(parameter_tvb, parameter_tree, parameter_item);
+    }
     break;
   case DIAGNOSTIC_INFO_PARAMETER_TAG:
-    dissect_sua_diagnostic_information_parameter(parameter_tvb, parameter_tree, parameter_item);
+    if (parameter_tree) {
+      dissect_diagnostic_information_parameter(parameter_tvb, parameter_tree, parameter_item);
+    }
     break;
   case HEARTBEAT_DATA_PARAMETER_TAG:
-    dissect_sua_heartbeat_data_parameter(parameter_tvb, parameter_tree, parameter_item);
+    if (parameter_tree) {
+      dissect_heartbeat_data_parameter(parameter_tvb, parameter_tree, parameter_item);
+    }
     break;
   case TRAFFIC_MODE_TYPE_PARAMETER_TAG:
-    dissect_sua_traffic_mode_type_parameter(parameter_tvb, parameter_tree, parameter_item);
+    if (parameter_tree) {
+      dissect_traffic_mode_type_parameter(parameter_tvb, parameter_tree, parameter_item);
+    }
     break;
   case ERROR_CODE_PARAMETER_TAG:
-    dissect_sua_error_code_parameter(parameter_tvb, parameter_tree, parameter_item);
+    if (parameter_tree) {
+      dissect_error_code_parameter(parameter_tvb, parameter_tree, parameter_item);
+    }
     break;
   case STATUS_PARAMETER_TAG:
-    dissect_sua_status_type_parameter(parameter_tvb, parameter_tree, parameter_item);
+    if (parameter_tree) {
+      dissect_status_type_parameter(parameter_tvb, parameter_tree, parameter_item);
+    }
     break;
   case CONGESTION_LEVEL_PARAMETER_TAG:
-    dissect_sua_congestion_level_parameter(parameter_tvb, parameter_tree, parameter_item);
+    if (parameter_tree) {
+      dissect_congestion_level_parameter(parameter_tvb, parameter_tree, parameter_item);
+    }
     break;
   case ASP_IDENTIFIER_PARAMETER_TAG:
-    dissect_sua_asp_identifier_parameter(parameter_tvb, parameter_tree, parameter_item);
+    if (parameter_tree) {
+      dissect_asp_identifier_parameter(parameter_tvb, parameter_tree, parameter_item);
+    }
     break;
   case AFFECTED_POINT_CODE_PARAMETER_TAG:
-    dissect_sua_affected_destinations_parameter(parameter_tvb, parameter_tree, parameter_item);
+    if (parameter_tree) {
+      dissect_affected_destinations_parameter(parameter_tvb, parameter_tree, parameter_item);
+    }
+    break;
+  case REGISTRATION_STATUS_PARAMETER_TAG:
+    if (parameter_tree) {
+      dissect_registration_status_parameter(parameter_tvb, parameter_tree, parameter_item);
+    }
+    break;
+  case DEREGISTRATION_STATUS_PARAMETER_TAG:
+    if (parameter_tree) {
+      dissect_deregistration_status_parameter(parameter_tvb, parameter_tree, parameter_item);
+    }
+    break;
+  case LOCAL_ROUTING_KEY_IDENTIFIER_PARAMETER_TAG:
+    if (parameter_tree) {
+      dissect_local_routing_key_identifier_parameter(parameter_tvb, parameter_tree, parameter_item);
+    }
     break;
   case SS7_HOP_COUNTER_PARAMETER_TAG:
-    dissect_sua_ss7_hop_counter_parameter(parameter_tvb, parameter_tree, parameter_item);
+    if (parameter_tree) {
+      dissect_ss7_hop_counter_parameter(parameter_tvb, parameter_tree, parameter_item);
+    }
     break;
   case SOURCE_ADDRESS_PARAMETER_TAG:
-    dissect_sua_source_address_parameter(parameter_tvb, parameter_tree, parameter_item);
+    dissect_source_address_parameter(parameter_tvb, parameter_tree, source_ssn);
     break;
   case DESTINATION_ADDRESS_PARAMETER_TAG:
-    dissect_sua_destination_address_parameter(parameter_tvb, parameter_tree, parameter_item);
+    dissect_destination_address_parameter(parameter_tvb, parameter_tree, dest_ssn);
     break;
   case SOURCE_REFERENCE_NUMBER_PARAMETER_TAG:
-    dissect_sua_source_reference_number_parameter(parameter_tvb, parameter_tree, parameter_item);
+    if (parameter_tree) {
+      dissect_source_reference_number_parameter(parameter_tvb, parameter_tree, parameter_item);
+    }
     break;
   case DESTINATION_REFERENCE_NUMBER_PARAMETER_TAG:
-    dissect_sua_destination_reference_number_parameter(parameter_tvb, parameter_tree, parameter_item);
+    if (parameter_tree) {
+      dissect_destination_reference_number_parameter(parameter_tvb, parameter_tree, parameter_item);
+    }
     break;
   case SCCP_CAUSE_PARAMETER_TAG:
-    dissect_sua_sccp_cause_parameter(parameter_tvb, parameter_tree, parameter_item);
+    if (parameter_tree) {
+      dissect_sccp_cause_parameter(parameter_tvb, parameter_tree, parameter_item);
+    }
     break;
   case SEQUENCE_NUMBER_PARAMETER_TAG:
-    dissect_sua_sequence_number_parameter(parameter_tvb, parameter_tree, parameter_item);
+    if (parameter_tree) {
+      dissect_sequence_number_parameter(parameter_tvb, parameter_tree);
+    }
     break;
   case RECEIVE_SEQUENCE_NUMBER_PARAMETER_TAG:
-    dissect_sua_receive_sequence_number_parameter(parameter_tvb, parameter_tree, parameter_item);
+    if (parameter_tree) {
+      dissect_receive_sequence_number_parameter(parameter_tvb, parameter_tree);
+    }
     break;
   case ASP_CAPABILITIES_PARAMETER_TAG:
-    dissect_sua_asp_capabilities_parameter(parameter_tvb, parameter_tree, parameter_item);
+    if (parameter_tree) {
+      dissect_asp_capabilities_parameter(parameter_tvb, parameter_tree);
+    }
     break;
   case CREDIT_PARAMETER_TAG:
-    dissect_sua_credit_parameter(parameter_tvb, parameter_tree, parameter_item);
+    if (parameter_tree) {
+      dissect_credit_parameter(parameter_tvb, parameter_tree, parameter_item);
+    }
     break;
   case USER_CAUSE_PARAMETER_TAG:
-    dissect_sua_user_cause_parameter(parameter_tvb, parameter_tree, parameter_item);
+    if (parameter_tree) {
+      dissect_user_cause_parameter(parameter_tvb, parameter_tree);
+    }
     break;
   case NETWORK_APPEARANCE_PARAMETER_TAG:
-    dissect_sua_network_appearance_parameter(parameter_tvb, parameter_tree, parameter_item);
+    if (parameter_tree) {
+      dissect_network_appearance_parameter(parameter_tvb, parameter_tree, parameter_item);
+    }
     break;
   case ROUTING_KEY_PARAMETER_TAG:
-    dissect_sua_routing_key_parameter(parameter_tvb, parameter_tree, parameter_item);
+    if (parameter_tree) {
+      dissect_routing_key_parameter(parameter_tvb, parameter_tree);
+    }
     break;
   case REGISTRATION_RESULT_PARAMETER_TAG:
-    dissect_sua_registration_result_parameter(parameter_tvb, parameter_tree, parameter_item);
+    if (parameter_tree) {
+      dissect_registration_result_parameter(parameter_tvb, parameter_tree);
+    }
     break;
   case DEREGISTRATION_RESULT_PARAMETER_TAG:
-    dissect_sua_deregistration_result_parameter(parameter_tvb, parameter_tree, parameter_item);
+    if (parameter_tree) {
+      dissect_deregistration_result_parameter(parameter_tvb, parameter_tree);
+    }
     break;
   case ADDRESS_RANGE_PARAMETER_TAG:
-    dissect_sua_address_range_parameter(parameter_tvb, parameter_tree, parameter_item);
+    if (parameter_tree) {
+      dissect_address_range_parameter(parameter_tvb, parameter_tree);
+    }
     break;
   case CORRELATION_ID_PARAMETER_TAG:
-    dissect_sua_correlation_id_parameter(parameter_tvb, parameter_tree, parameter_item);
+    if (parameter_tree) {
+      dissect_correlation_id_parameter(parameter_tvb, parameter_tree, parameter_item);
+    }
     break;
   case IMPORTANCE_PARAMETER_TAG:
-    dissect_sua_importance_parameter(parameter_tvb, parameter_tree, parameter_item);
+    if (parameter_tree) {
+      dissect_importance_parameter(parameter_tvb, parameter_tree, parameter_item);
+    }
     break;
   case MESSAGE_PRIORITY_PARAMETER_TAG:
-    dissect_sua_message_priority_parameter(parameter_tvb, parameter_tree, parameter_item);
+    if (parameter_tree) {
+      dissect_message_priority_parameter(parameter_tvb, parameter_tree, parameter_item);
+    }
     break;
   case PROTOCOL_CLASS_PARAMETER_TAG:
-    dissect_sua_protocol_class_parameter(parameter_tvb, parameter_tree, parameter_item);
+    if (parameter_tree) {
+      dissect_protocol_class_parameter(parameter_tvb, parameter_tree);
+    }
     break;
   case SEQUENCE_CONTROL_PARAMETER_TAG:
-    dissect_sua_sequence_control_parameter(parameter_tvb, parameter_tree, parameter_item);
+    if (parameter_tree) {
+      dissect_sequence_control_parameter(parameter_tvb, parameter_tree, parameter_item);
+    }
     break;
   case SEGMENTATION_PARAMETER_TAG:
-    dissect_sua_segmentation_parameter(parameter_tvb, parameter_tree, parameter_item);
+    if (parameter_tree) {
+      dissect_segmentation_parameter(parameter_tvb, parameter_tree);
+    }
     break;
   case SMI_PARAMETER_TAG:
-    dissect_sua_smi_parameter(parameter_tvb, parameter_tree, parameter_item);
+    if (parameter_tree) {
+      dissect_smi_parameter(parameter_tvb, parameter_tree, parameter_item);
+    }
     break;
   case TID_LABEL_PARAMETER_TAG:
-    dissect_sua_tid_label_parameter(parameter_tvb, parameter_tree, parameter_item);
+    if (parameter_tree) {
+      dissect_tid_label_parameter(parameter_tvb, parameter_tree);
+    }
     break;
   case DRN_LABEL_PARAMETER_TAG:
-    dissect_sua_drn_label_parameter(parameter_tvb, parameter_tree, parameter_item);
+    if (parameter_tree) {
+      dissect_drn_label_parameter(parameter_tvb, parameter_tree);
+    }
     break;
   case GLOBAL_TITLE_PARAMETER_TAG:
-    dissect_sua_global_title_parameter(parameter_tvb, parameter_tree, parameter_item);
+    if (parameter_tree) {
+      dissect_global_title_parameter(parameter_tvb, parameter_tree);
+    }
     break;
   case POINT_CODE_PARAMETER_TAG:
-    dissect_sua_point_code_parameter(parameter_tvb, parameter_tree, parameter_item);
+    if (parameter_tree) {
+      dissect_point_code_parameter(parameter_tvb, parameter_tree, parameter_item);
+    }
     break;
   case SUBSYSTEM_NUMBER_PARAMETER_TAG:
-    dissect_sua_ssn_parameter(parameter_tvb, parameter_tree, parameter_item);
+    dissect_ssn_parameter(parameter_tvb, parameter_tree, parameter_item, &ssn);
+    if(source_ssn)
+    {
+        *source_ssn = ssn;
+    }
+    if(dest_ssn)
+    {
+        *dest_ssn = ssn;
+    }
     break;
   case IPV4_ADDRESS_PARAMETER_TAG:
-    dissect_sua_ipv4_parameter(parameter_tvb, parameter_tree, parameter_item);
+    if (parameter_tree) {
+      dissect_ipv4_parameter(parameter_tvb, parameter_tree, parameter_item);
+    }
     break;
   case HOSTNAME_PARAMETER_TAG:
-    dissect_sua_hostname_parameter(parameter_tvb, parameter_tree, parameter_item);
+    if (parameter_tree) {
+      dissect_hostname_parameter(parameter_tvb, parameter_tree, parameter_item);
+    }
     break;
   case IPV6_ADDRESS_PARAMETER_TAG:
-    dissect_sua_ipv6_parameter(parameter_tvb, parameter_tree, parameter_item);
+    if (parameter_tree) {
+      dissect_ipv6_parameter(parameter_tvb, parameter_tree, parameter_item);
+    }
     break;
   default:
-    dissect_sua_unknown_parameter(parameter_tvb, parameter_tree, parameter_item);
+    if (parameter_tree) {
+      dissect_unknown_parameter(parameter_tvb, parameter_tree, parameter_item);
+    }
     break;
   };
+  if (parameter_tree && (padding_length > 0))
+    proto_tree_add_item(parameter_tree, hf_parameter_padding, parameter_tvb, PARAMETER_HEADER_OFFSET + length, padding_length, NETWORK_BYTE_ORDER);
 }
 
 static void
-dissect_sua_tlv_list(tvbuff_t *tlv_tvb, proto_tree *sua_tree, gint initial_offset)
+dissect_parameters(tvbuff_t *parameters_tvb, proto_tree *tree, tvbuff_t **data_tvb, guint8 *source_ssn, guint8 *dest_ssn)
 {
-  gint offset, length, padding_length, total_length;
+  gint offset, length, total_length, remaining_length;
   tvbuff_t *parameter_tvb;
 
-  offset = initial_offset;
-
-  while(tvb_reported_length_remaining(tlv_tvb, offset)) {
-    length         = tvb_get_ntohs(tlv_tvb, offset + PARAMETER_LENGTH_OFFSET);
-    padding_length = nr_of_padding_bytes(length);
-    total_length   = length + padding_length;
+  offset = 0;
+  while((remaining_length = tvb_length_remaining(parameters_tvb, offset))) {
+    length       = tvb_get_ntohs(parameters_tvb, offset + PARAMETER_LENGTH_OFFSET);
+    total_length = ADD_PADDING(length);
+    if (remaining_length >= length)
+      total_length = MIN(total_length, remaining_length);
     /* create a tvb for the parameter including the padding bytes */
-    parameter_tvb    = tvb_new_subset(tlv_tvb, offset, total_length, total_length);
-    dissect_sua_parameter(parameter_tvb, sua_tree);
+    parameter_tvb  = tvb_new_subset(parameters_tvb, offset, total_length, total_length);
+    dissect_parameter(parameter_tvb, tree, data_tvb, source_ssn, dest_ssn);
     /* get rid of the handled parameter */
     offset += total_length;
   }
 }
 
 static void
-dissect_sua_message(tvbuff_t *message_tvb, packet_info *pinfo, proto_tree *sua_tree)
+dissect_sua_message(tvbuff_t *message_tvb, packet_info *pinfo, proto_tree *sua_tree, proto_tree *tree)
 {
   tvbuff_t *common_header_tvb;
+  tvbuff_t *parameters_tvb;
+  tvbuff_t *data_tvb = NULL;
+  guint8 source_ssn = INVALID_SSN;
+  guint8 dest_ssn = INVALID_SSN;
 
   common_header_tvb = tvb_new_subset(message_tvb, COMMON_HEADER_OFFSET, COMMON_HEADER_LENGTH, COMMON_HEADER_LENGTH);
-  dissect_sua_common_header(common_header_tvb, pinfo, sua_tree);
-
-  if (sua_tree)
-    dissect_sua_tlv_list(message_tvb, sua_tree, COMMON_HEADER_LENGTH);
-}
-
-/* Support of Siemens Light Version starts here */
-#define SUAL_VERSION_LENGTH          1
-#define SUAL_SPARE_1_LENGTH          1
-#define SUAL_MESSAGE_TYPE_LENGTH     2
-#define SUAL_SUBSYSTEM_NUMBER_LENGTH 2
-#define SUAL_SPARE_2_LENGTH          2
-#define SUAL_MESSAGE_LENGTH_LENGTH   4
-#define SUAL_COMMON_HEADER_LENGTH   (SUAL_VERSION_LENGTH + SUAL_SPARE_1_LENGTH + SUAL_MESSAGE_TYPE_LENGTH + \
-                                     SUAL_SUBSYSTEM_NUMBER_LENGTH + SUAL_SPARE_2_LENGTH + SUAL_MESSAGE_LENGTH_LENGTH)
-
-#define SUAL_VERSION_OFFSET          0
-#define SUAL_SPARE_1_OFFSET          (SUAL_VERSION_OFFSET + SUAL_VERSION_LENGTH)
-#define SUAL_MESSAGE_TYPE_OFFSET     (SUAL_SPARE_1_OFFSET + SUAL_SPARE_1_LENGTH)
-#define SUAL_SUBSYSTEM_NUMBER_OFFSET (SUAL_MESSAGE_TYPE_OFFSET + SUAL_MESSAGE_TYPE_LENGTH)
-#define SUAL_SPARE_2_OFFSET          (SUAL_SUBSYSTEM_NUMBER_OFFSET + SUAL_SUBSYSTEM_NUMBER_LENGTH)
-#define SUAL_MESSAGE_LENGTH_OFFSET   (SUAL_SPARE_2_OFFSET + SUAL_SPARE_2_LENGTH)
-
-/* SUAL message type coding */
-#define SUAL_MSG_CLDT                     0x0501
-#define SUAL_MSG_CORE                     0x0701
-#define SUAL_MSG_COAK_CC                   0x0702
-#define SUAL_MSG_COAK_CREF                0x0712
-#define SUAL_MSG_RELRE                    0x0703
-#define SUAL_MSG_RELCO                    0x0704
-#define SUAL_MSG_CODT                     0x0707
-#define SUAL_MSG_ERR                      0x0000
-
-static const value_string sua_light_message_type_values[] = {
-  {  SUAL_MSG_CLDT,              "Connectionless Data Transfer (CLDT)"},
-  {  SUAL_MSG_CORE,              "Connection Request (CORE)"},
-  {  SUAL_MSG_COAK_CC,           "Connection Acknowledge (COAK_CC)"},
-  {  SUAL_MSG_COAK_CREF,         "Connection Acknowledge (COAK_CREF)"},
-  {  SUAL_MSG_RELRE,             "Release Request (RELRE)"},
-  {  SUAL_MSG_RELCO,             "Release Complete (RELCO)"},
-  {  SUAL_MSG_CODT,              "Connection Oriented Data Transfer (CODT)"},
-  {  SUAL_MSG_ERR,               "Error (ERR)"},
-  {  0,                          NULL}};
-
-static const value_string sua_light_message_type_acro_values[] = {
-  {  SUAL_MSG_CLDT,              "CLDT"},
-  {  SUAL_MSG_CORE,              "CORE"},
-  {  SUAL_MSG_COAK_CC,           "COAK_CC"},
-  {  SUAL_MSG_COAK_CREF,         "COAK_CREF"},
-  {  SUAL_MSG_RELRE,             "RELRE"},
-  {  SUAL_MSG_RELCO,             "RELCO"},
-  {  SUAL_MSG_CODT,              "CODT"},
-  {  SUAL_MSG_ERR,               "ERR"},
-  {  0,                          NULL}};
-
-
-/* SUAL Error Codes */
-#define SUAL_ERR_INVVERS               0x0001
-#define SUAL_ERR_INVSTRID              0x0005
-#define SUAL_ERR_INVMSGTYP     0x0006
-
-static const value_string sua_light_error_code_values[] = {
-  {  SUAL_ERR_INVVERS,         "Invalid Protocol Version"},
-  {  SUAL_ERR_INVSTRID,                "Invalid Stream Identifier"},
-  {  SUAL_ERR_INVMSGTYP,       "Invalid Message Type"},
-  {  0,                          NULL}};
-
-static void
-dissect_sua_light_common_header(tvbuff_t *common_header_tvb, packet_info *pinfo,
-                                proto_tree *sual_tree, guint16  *subsystem_number)
-{
-  guint8  version, spare_1;
-  guint16 message_type, spare_2;
-  guint32 message_length;
-
-  /* Extract the common header */
-  version           = tvb_get_guint8(common_header_tvb, SUAL_VERSION_OFFSET);
-  spare_1           = tvb_get_guint8(common_header_tvb, SUAL_SPARE_1_OFFSET);
-  message_type      = tvb_get_ntohs(common_header_tvb,  SUAL_MESSAGE_TYPE_OFFSET);
-  *subsystem_number = tvb_get_ntohs(common_header_tvb,  SUAL_SUBSYSTEM_NUMBER_OFFSET);
-  spare_2           = tvb_get_ntohs(common_header_tvb,  SUAL_SPARE_2_OFFSET);
-  message_length    = tvb_get_ntohl(common_header_tvb,  SUAL_MESSAGE_LENGTH_OFFSET);
-
-  if (check_col(pinfo->cinfo, COL_INFO)) {
-    col_append_str(pinfo->cinfo, COL_INFO, val_to_str(message_type, sua_light_message_type_acro_values, "Unknown"));
-    col_append_str(pinfo->cinfo, COL_INFO, " ");
-  };
+  dissect_common_header(common_header_tvb, pinfo, sua_tree);
 
-  if (sual_tree) {
-    /* add the components of the common header to the protocol tree */
-    proto_tree_add_uint(sual_tree, hf_sua_light_version, common_header_tvb, SUAL_VERSION_OFFSET, SUAL_VERSION_LENGTH, version);
-    proto_tree_add_uint(sual_tree, hf_sua_light_spare_1, common_header_tvb, SUAL_SPARE_1_OFFSET, SUAL_SPARE_1_LENGTH, spare_1);
-    proto_tree_add_uint(sual_tree, hf_sua_light_message_type, common_header_tvb, SUAL_MESSAGE_TYPE_OFFSET, SUAL_MESSAGE_TYPE_LENGTH,message_type);
-    proto_tree_add_uint(sual_tree, hf_sua_light_subsystem_number, common_header_tvb, SUAL_SUBSYSTEM_NUMBER_OFFSET, SUAL_SUBSYSTEM_NUMBER_LENGTH, *subsystem_number);
-    proto_tree_add_uint(sual_tree, hf_sua_light_spare_2, common_header_tvb, SUAL_SPARE_2_OFFSET, SUAL_SPARE_2_LENGTH, spare_2);
-    proto_tree_add_uint(sual_tree, hf_sua_light_message_length, common_header_tvb, SUAL_MESSAGE_LENGTH_OFFSET, SUAL_MESSAGE_LENGTH_LENGTH, message_length);
-  };
-}
-
-static void
-dissect_sua_light_payload(tvbuff_t *payload_tvb, packet_info *pinfo,
-                          guint16 subsystem_number, proto_tree *sual_tree, proto_tree *tree)
-{
-  guint                payload_length = tvb_reported_length(payload_tvb);
+  parameters_tvb = tvb_new_subset(message_tvb, COMMON_HEADER_LENGTH, -1, -1);
+  dissect_parameters(parameters_tvb, sua_tree, &data_tvb, &source_ssn, &dest_ssn);
 
-  /* do lookup with the subdissector table */
-  if ( ! dissector_try_port (sua_light_dissector_table, subsystem_number, payload_tvb, pinfo, tree))
+  /* If there was SUA data it could be dissected */
+  if(data_tvb)
   {
-     if (sual_tree)
-       proto_tree_add_text(sual_tree, payload_tvb, 0, -1, "Payload: %u byte%s", payload_length, plurality(payload_length, "", "s"));
-  }
-}
-
-static void
-dissect_sua_light_error_payload(tvbuff_t *payload_tvb, proto_tree *sual_tree)
-{
-    if (sual_tree)
-       proto_tree_add_item(sual_tree, hf_sua_light_error_code, payload_tvb, 0, 2, FALSE);
-}
-
-static void
-dissect_sua_light_message(tvbuff_t *message_tvb, packet_info *pinfo, proto_tree *sual_tree, proto_tree *tree)
-{
-  gint     offset, payload_length;
-  guint16  subsystem_number;
-  guint16  message_type;
-  tvbuff_t *common_header_tvb;
-  tvbuff_t *payload_tvb;
-
-  offset = 0;
-  /* extract and process the common header */
-  common_header_tvb = tvb_new_subset(message_tvb, offset, SUAL_COMMON_HEADER_LENGTH, SUAL_COMMON_HEADER_LENGTH);
-  message_type      = tvb_get_ntohs(common_header_tvb, SUAL_MESSAGE_TYPE_OFFSET);
-  dissect_sua_light_common_header(common_header_tvb, pinfo, sual_tree, &subsystem_number);
-  offset           += SUAL_COMMON_HEADER_LENGTH;
-  payload_length    = tvb_length(message_tvb) - SUAL_COMMON_HEADER_LENGTH;
-  if (payload_length != 0)
-  {
-     payload_tvb = tvb_new_subset(message_tvb, offset, payload_length, payload_length);
-     if (message_type != SUAL_MSG_ERR)
-        dissect_sua_light_payload(payload_tvb, pinfo, subsystem_number, sual_tree, tree);
-     else
-       dissect_sua_light_error_payload(payload_tvb, sual_tree);
+    /* Try subdissectors (if we found a valid SSN on the current message) */
+    if ((dest_ssn == INVALID_SSN ||
+       !dissector_try_port(sua_ssn_dissector_table, dest_ssn, data_tvb, pinfo, tree))
+       && (source_ssn == INVALID_SSN ||
+       !dissector_try_port(sua_ssn_dissector_table, source_ssn, data_tvb, pinfo, tree)))
+    {
+      /* No sub-dissection occured, treat it as raw data */
+      call_dissector(data_handle, data_tvb, pinfo, sua_tree);
+    }
   }
 }
 
@@ -2116,16 +1596,12 @@ dissect_sua(tvbuff_t *message_tvb, packet_info *pinfo, proto_tree *tree)
   proto_tree *sua_tree;
 
   /* make entry in the Protocol column on summary display */
-  switch(sua_version) {
-    case IETF_VERSION08:
-      if (check_col(pinfo->cinfo, COL_PROTOCOL))
-        col_set_str(pinfo->cinfo, COL_PROTOCOL, "SUA");
-      break;
-    case SIEMENS_VERSION:
-      if (check_col(pinfo->cinfo, COL_PROTOCOL))
-        col_set_str(pinfo->cinfo, COL_PROTOCOL, "SUA-Light");
-      break;
-  }
+  if (check_col(pinfo->cinfo, COL_PROTOCOL))
+     col_set_str(pinfo->cinfo, COL_PROTOCOL, "SUA");
+
+  /* Clear entries in Info column on summary display */
+  if (check_col(pinfo->cinfo, COL_INFO))
+     col_clear(pinfo->cinfo, COL_INFO);
 
   /* In the interest of speed, if "tree" is NULL, don't do any work not
      necessary to generate protocol tree items. */
@@ -2138,14 +1614,7 @@ dissect_sua(tvbuff_t *message_tvb, packet_info *pinfo, proto_tree *tree)
   };
 
   /* dissect the message */
-  switch(sua_version) {
-    case IETF_VERSION08:
-        dissect_sua_message(message_tvb, pinfo, sua_tree);
-        break;
-    case SIEMENS_VERSION:
-        dissect_sua_light_message(message_tvb, pinfo, sua_tree, tree);
-        break;
-  }
+  dissect_sua_message(message_tvb, pinfo, sua_tree, tree);
 }
 
 /* Register the protocol with Ethereal */
@@ -2155,551 +1624,101 @@ proto_register_sua(void)
 
   /* Setup list of header fields */
   static hf_register_info hf[] = {
-    { &hf_sua_version,
-      { "Version", "sua.version",
-             FT_UINT8, BASE_DEC, VALS(sua_protocol_version_values), 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_reserved,
-      { "Reserved", "sua.reserved",
-              FT_BYTES, BASE_NONE, NULL, 0x0,
-              "", HFILL }
-    },
-    { &hf_sua_message_class,
-      { "Message Class", "sua.message_class",
-              FT_UINT8, BASE_DEC, VALS(sua_message_class_values), 0x0,
-              "", HFILL }
-    },
-    { &hf_sua_message_type,
-      { "Message Type", "sua.message_type",
-        FT_UINT8, BASE_DEC, NULL, 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_message_length,
-      { "Message Length", "sua.message_length",
-             FT_UINT32, BASE_DEC, NULL, 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_parameter_tag,
-      { "Parameter Tag", "sua.parameter_tag",
-       FT_UINT16, BASE_HEX, VALS(sua_parameter_tag_values), 0x0,
-           "", HFILL }
-    },
-    { &hf_sua_parameter_length,
-      { "Parameter Length", "sua.parameter_length",
-             FT_UINT16, BASE_DEC, NULL, 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_parameter_value,
-      { "Parameter Value", "sua.parameter_value",
-             FT_BYTES, BASE_NONE, NULL, 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_parameter_padding,
-      { "Padding", "sua.parameter_padding",
-             FT_BYTES, BASE_NONE, NULL, 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_data_padding,
-      { "Padding", "sua.data.padding",
-             FT_BYTES, BASE_NONE, NULL, 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_info_string,
-      { "Info string", "sua.info_string.string",
-             FT_STRING, BASE_NONE, NULL, 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_info_string_padding,
-      { "Padding", "sua.info_string.padding",
-             FT_BYTES, BASE_NONE, NULL, 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_routing_context,
-      { "Routing context", "sua.routing_context.context",
-        FT_UINT32, BASE_DEC, NULL, 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_diagnostic_information_info,
-      { "Diagnostic Information", "sua.diagnostic_information.info",
-             FT_BYTES, BASE_NONE, NULL, 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_diagnostic_information_padding,
-      { "Padding", "sua.diagnostic_information.padding",
-             FT_BYTES, BASE_NONE, NULL, 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_heartbeat_data,
-      { "Heratbeat Data", "sua.heartbeat.data",
-             FT_BYTES, BASE_NONE, NULL, 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_heartbeat_padding,
-      { "Padding", "sua.heartbeat.padding",
-             FT_BYTES, BASE_NONE, NULL, 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_traffic_mode_type,
-      { "Traffic mode Type", "sua.traffic_mode_type.type",
-             FT_UINT32, BASE_DEC, VALS(sua_traffic_mode_type_values), 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_error_code,
-      { "Error code", "sua.error_code.code",
-             FT_UINT32, BASE_DEC, VALS(sua_error_code_values), 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_status_type,
-      { "Status type", "sua.status.type",
-           FT_UINT16, BASE_DEC, VALS(sua_status_type_values), 0x0,
-           "", HFILL }
-    },
-    { &hf_sua_status_info,
-      { "Status info", "sua.status.info",
-         FT_UINT16, BASE_DEC, NULL, 0x0,
-         "", HFILL }
-    },
-    { &hf_sua_congestion_level,
-      { "Congestion Level", "sua.congestion_level.level",
-             FT_UINT32, BASE_DEC, NULL, 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_asp_identifier,
-      { "ASP Identifier", "sua.asp_identifier.id",
-             FT_UINT32, BASE_DEC, NULL, 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_mask,
-      { "Mask", "sua.affected_point_code.mask",
-             FT_UINT8, BASE_HEX, NULL, 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_dpc,
-      { "Affected DPC", "sua.affected_pointcode.dpc",
-             FT_UINT24, BASE_DEC, NULL, 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_ss7_hop_counter_counter,
-      { "SS7 Hop Counter", "sua.ss7_hop_counter.counter",
-              FT_UINT8, BASE_DEC, NULL, 0x0,
-              "", HFILL }
-    },
-    { &hf_sua_ss7_hop_counter_reserved,
-      { "Reserved", "sua.ss7_hop_counter.reserved",
-             FT_BYTES, BASE_NONE, NULL, 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_source_address_routing_indicator,
-      { "Routing Indicator", "sua.source_address.routing_indicator",
-             FT_UINT16, BASE_DEC, VALS(sua_routing_indicator_values), 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_source_address_reserved_bits,
-      { "Reserved Bits", "sua.source_address.reserved_bits",
-             FT_UINT16, BASE_DEC, NULL, ADDRESS_RESERVED_BITMASK,
-             "", HFILL }
-    },
-    { &hf_sua_source_address_gt_bit,
-      { "Include GT", "sua.source_address.gt_bit",
-             FT_BOOLEAN, 16, NULL, ADDRESS_GT_BITMASK,
-             "", HFILL }
-    },
-    { &hf_sua_source_address_pc_bit,
-      { "Include PC", "sua.source_address.pc_bit",
-             FT_BOOLEAN, 16, NULL, ADDRESS_PC_BITMASK,
-             "", HFILL }
-    },
-    { &hf_sua_source_address_ssn_bit,
-      { "Include SSN", "sua.source_address.ssn_bit",
-             FT_BOOLEAN, 16, NULL, ADDRESS_SSN_BITMASK,
-             "", HFILL }
-    },
-    { &hf_sua_destination_address_routing_indicator,
-      { "Routing Indicator", "sua.destination_address.routing_indicator",
-             FT_UINT16, BASE_DEC, VALS(sua_routing_indicator_values), 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_destination_address_reserved_bits,
-      { "Reserved Bits", "sua.destination_address.reserved_bits",
-             FT_UINT16, BASE_DEC, NULL, ADDRESS_RESERVED_BITMASK,
-             "", HFILL }
-    },
-    { &hf_sua_destination_address_gt_bit,
-      { "Include GT", "sua.destination_address.gt_bit",
-             FT_BOOLEAN, 16, NULL, ADDRESS_GT_BITMASK,
-             "", HFILL }
-    },
-    { &hf_sua_destination_address_pc_bit,
-      { "Include PC", "sua.destination_address.pc_bit",
-             FT_BOOLEAN, 16, NULL, ADDRESS_PC_BITMASK,
-             "", HFILL }
-    },
-    { &hf_sua_destination_address_ssn_bit,
-      { "Include SSN", "sua.destination_address.ssn_bit",
-             FT_BOOLEAN, 16, NULL, ADDRESS_SSN_BITMASK,
-             "", HFILL }
-    },
-    { &hf_sua_source_reference_number,
-      { "Source Reference Number", "sua.source_reference_number.number",
-             FT_UINT32, BASE_DEC, NULL, 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_destination_reference_number,
-      { "Destination Reference Number", "sua.destination_reference_number",
-             FT_UINT32, BASE_DEC, NULL, 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_cause_reserved,
-      { "Reserved", "sua.sccp_cause.reserved",
-              FT_BYTES, BASE_NONE, NULL, 0x0,
-              "", HFILL }
-    },
-    { &hf_sua_cause_type,
-      { "Cause Type", "sua.sccp_cause.type",
-              FT_UINT8, BASE_HEX, VALS(sua_cause_type_values), 0x0,
-              "", HFILL }
-    },
-    { &hf_sua_cause_value,
-      { "Cause Value", "sua.sccp_cause.value",
-              FT_UINT8, BASE_HEX, NULL, 0x0,
-              "", HFILL }
-    },
-    { &hf_sua_sequence_number_reserved,
-      { "Reserved", "sua.sequence_number.reserved",
-             FT_BYTES, BASE_NONE, NULL, 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_sequence_number_rec_number,
-      { "Receive Sequence Number P(R)", "sua.sequence_number.receive_sequence_number",
-             FT_UINT8, BASE_DEC, NULL, SEQ_NUM_MASK,
-             "", HFILL }
-    },
-    { &hf_sua_sequence_number_more_data_bit,
-      { "More Data Bit", "sua.sequence_number.more_data_bit",
-             FT_BOOLEAN, 8, TFS(&sua_more_data_bit_value), MORE_DATA_BIT_MASK,
-             "", HFILL }
-    },
-    { &hf_sua_sequence_number_sent_number,
-      { "Sent Sequence Number P(S)", "sua.sequence_number.sent_sequence_number",
-             FT_UINT8, BASE_DEC, NULL, SEQ_NUM_MASK,
-             "", HFILL }
-    },
-    { &hf_sua_sequence_number_spare_bit,
-      { "Spare Bit", "sua.sequence_number.spare_bit",
-             FT_BOOLEAN, 8, NULL, SPARE_BIT_MASK,
-             "", HFILL }
-    },
-    { &hf_sua_receive_sequence_number_reserved,
-      { "Reserved", "sua.receive_sequence_number.reserved",
-             FT_BYTES, BASE_NONE, NULL, 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_receive_sequence_number_number,
-      { "Receive Sequence Number P(R)", "sua.receive_sequence_number.number",
-             FT_UINT8, BASE_DEC, NULL, SEQ_NUM_MASK,
-             "", HFILL }
-    },
-    { &hf_sua_receive_sequence_number_spare_bit,
-      { "Spare Bit", "sua.receive_sequence_number.spare_bit",
-             FT_BOOLEAN, 8, NULL, SPARE_BIT_MASK,
-             "", HFILL }
-    },
-    { &hf_sua_asp_capabilities_reserved,
-      { "Reserved", "sua.asp_capabilities.reserved",
-             FT_BYTES, BASE_NONE, NULL, 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_asp_capabilities_reserved_bits,
-      { "Reserved Bits", "sua.asp_capabilities.reserved_bits",
-             FT_UINT8, BASE_HEX, NULL, RESERVED_BITS_MASK,
-             "", HFILL }
-    },
-    { &hf_sua_asp_capabilities_a_bit,
-      { "Protocol Class 3", "sua.asp_capabilities.a_bit",
-             FT_BOOLEAN, 8, TFS(&sua_supported_bit_value), A_BIT_MASK,
-             "", HFILL }
-    },
-    { &hf_sua_asp_capabilities_b_bit,
-      { "Protocol Class 2", "sua.asp_capabilities.b_bit",
-             FT_BOOLEAN, 8, TFS(&sua_supported_bit_value), B_BIT_MASK,
-             "", HFILL }
-    },
-    { &hf_sua_asp_capabilities_c_bit,
-      { "Protocol Class 1", "sua.asp_capabilities.c_bit",
-             FT_BOOLEAN, 8, TFS(&sua_supported_bit_value), C_BIT_MASK,
-             "", HFILL }
-    },
-    { &hf_sua_asp_capabilities_d_bit,
-      { "Protocol Class 0", "sua.asp_capabilities.d_bit",
-             FT_BOOLEAN, 8, TFS(&sua_supported_bit_value), D_BIT_MASK,
-             "", HFILL }
-    },
-    { &hf_sua_asp_capabilities_interworking,
-      { "Interworking", "sua.asp_capabilities.interworking",
-             FT_UINT8, BASE_HEX, VALS(sua_interworking_values), 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_credit,
-      { "Credit", "sua.credit.credit",
-             FT_UINT32, BASE_DEC, NULL, 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_cause,
-      { "Cause", "sua.cause_user.cause",
-             FT_UINT16, BASE_DEC, VALS(sua_cause_values), 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_user,
-      { "User", "sua.cause_user.user",
-             FT_UINT16, BASE_DEC, NULL, 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_network_appearance,
-      { "Network Appearance", "sua.network_appearance.appearance",
-             FT_UINT32, BASE_DEC, NULL, 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_routing_key_identifier,
-      { "Local Routing Key Identifier", "sua.routing_key.identifier",
-             FT_UINT32, BASE_HEX, NULL, 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_registration_result_routing_key_identifier,
-      { "Local Routing Key Identifier", "sua.registration_result.local_routing_key_identifier",
-           FT_UINT32, BASE_DEC, NULL, 0x0,
-           "", HFILL }
-    },
-    { &hf_sua_registration_result_status,
-      { "Registration Status", "sua.registration_result.registration_status",
-           FT_UINT32, BASE_DEC, VALS(sua_registration_status_values), 0x0,
-           "", HFILL }
-    },
-    { &hf_sua_registration_result_routing_context,
-      { "Routing Context", "sua.registration_result.routing_context",
-           FT_UINT32, BASE_DEC, NULL, 0x0,
-           "", HFILL }
-    },
-    { &hf_sua_deregistration_result_status,
-      { "Deregistration Status", "sua.deregistration_result.deregistration_status",
-           FT_UINT32, BASE_DEC, VALS(sua_deregistration_status_values), 0x0,
-           "", HFILL }
-    },
-    { &hf_sua_deregistration_result_routing_context,
-      { "Routing Context", "sua.deregistration_result.routing_context",
-           FT_UINT32, BASE_DEC, NULL, 0x0,
-           "", HFILL }
-    },
-    { &hf_sua_correlation_id,
-      { "Correlation ID", "sua.correlation_id.identifier",
-             FT_UINT32, BASE_DEC, NULL, 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_importance_reserved,
-      { "Reserved", "sua.importance.reserved",
-              FT_BYTES, BASE_NONE, NULL, 0x0,
-              "", HFILL }
-    },
-    { &hf_sua_importance,
-      { "Importance", "sua.importance.inportance",
-              FT_UINT8, BASE_DEC, NULL, 0x0,
-              "", HFILL }
-    },
-    { &hf_sua_message_priority_reserved,
-      { "Reserved", "sua.message_priority.reserved",
-              FT_BYTES, BASE_NONE, NULL, 0x0,
-              "", HFILL }
-    },
-    { &hf_sua_message_priority,
-      { "Message Priority", "sua.message_priority.priority",
-              FT_UINT8, BASE_DEC, NULL, 0x0,
-              "", HFILL }
-    },
-    { &hf_sua_protocol_class_reserved,
-      { "Reserved", "sua.protcol_class.reserved",
-             FT_BYTES, BASE_HEX, NULL, 0x0,
-             "", HFILL }
-    },
-    {&hf_sua_return_on_error_bit,
-     { "Return On Error Bit", "sua.protocol_class.return_on_error_bit",
-       FT_BOOLEAN, 8, TFS(&sua_return_on_error_bit_value), RETURN_ON_ERROR_BIT_MASK,
-       "", HFILL }
-    },
-    {&hf_sua_protocol_class,
-     { "Protocol Class", "sua.protocol_class.class",
-       FT_UINT8, BASE_DEC, NULL, PROTOCOL_CLASS_MASK,
-       "", HFILL }
-    },
-    { &hf_sua_sequence_control,
-      { "Sequence Control", "sua.sequence_control.sequence_control",
-             FT_UINT32, BASE_DEC, NULL, 0x0,
-             "", HFILL }
-    },
-    {&hf_sua_first_bit,
-     { "First Segment Bit", "sua.segmentation.first_bit",
-       FT_BOOLEAN, 8, TFS(&sua_first_bit_value), FIRST_BIT_MASK,
-       "", HFILL }
-    },
-    {&hf_sua_number_of_remaining_segments,
-     { "Number of Remaining Segments", "sua.segmentation.number_of_remaining_segments",
-       FT_UINT8, BASE_DEC, NULL, NUMBER_OF_SEGMENTS_MASK,
-       "", HFILL }
-    },
-    { &hf_sua_segmentation_reference,
-      { "Segmentation Reference", "sua.segmentation.reference",
-             FT_UINT24, BASE_DEC, NULL, 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_smi_reserved,
-      { "Reserved", "sua.smi.reserved",
-              FT_BYTES, BASE_DEC, NULL, 0x0,
-              "", HFILL }
-    },
-    { &hf_sua_smi,
-      { "SMI", "sua.smi.smi",
-              FT_UINT8, BASE_DEC, NULL, 0x0,
-              "", HFILL }
-    },
-    { &hf_sua_tid_label_start,
-      { "Start", "sua.tid_label.start",
-              FT_UINT8, BASE_DEC, NULL, 0x0,
-              "", HFILL }
-    },
-    { &hf_sua_tid_label_end,
-      { "End", "sua.tid_label.end",
-              FT_UINT8, BASE_DEC, NULL, 0x0,
-              "", HFILL }
-    },
-    { &hf_sua_tid_label_value,
-      { "Label Value", "sua.tid_label.value",
-              FT_UINT16, BASE_HEX, NULL, 0x0,
-              "", HFILL }
-    },
-    { &hf_sua_drn_label_start,
-      { "Start", "sua.drn_label.start",
-              FT_UINT8, BASE_DEC, NULL, 0x0,
-              "", HFILL }
-    },
-    { &hf_sua_drn_label_end,
-      { "End", "sua.drn_label.end",
-              FT_UINT8, BASE_DEC, NULL, 0x0,
-              "", HFILL }
-    },
-    { &hf_sua_drn_label_value,
-      { "Label Value", "sua.drn_label.value",
-              FT_UINT16, BASE_HEX, NULL, 0x0,
-              "", HFILL }
-    },
-    { &hf_sua_number_of_digits,
-      { "Number of Digits", "sua.global_title.number_of_digits",
-             FT_UINT8, BASE_DEC, NULL, 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_translation_type,
-      { "Translation Type", "sua.global_title.translation_type",
-             FT_UINT8, BASE_HEX, NULL, 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_numbering_plan,
-      { "Numbering Plan", "sua.global_title.numbering_plan",
-             FT_UINT8, BASE_HEX, VALS(sua_numbering_plan_values), 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_nature_of_address,
-      { "Nature of Address", "sua.global_title.nature_of_address",
-             FT_UINT8, BASE_HEX, VALS(sua_nature_of_address_values), 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_nature_of_address,
-      { "Nature Of Address", "sua.global_title.nature_of_address",
-             FT_UINT8, BASE_HEX, VALS(sua_nature_of_address_values), 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_global_title,
-      { "Global Title", "sua.global_title.signals",
-             FT_BYTES, BASE_NONE, NULL, 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_global_title_padding,
-      { "Padding", "sua.global_title.padding",
-             FT_BYTES, BASE_NONE, NULL, 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_point_code_mask,
-      { "Mask", "sua.point_code.mask",
-             FT_UINT8, BASE_HEX, NULL, 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_point_code_dpc,
-      { "Point Code", "sua.point_code.pc",
-             FT_UINT24, BASE_DEC, NULL, 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_ssn_reserved,
-      { "Reserved", "sua.ssn.reserved",
-             FT_BYTES, BASE_NONE, NULL, 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_ssn_number,
-      { "Subsystem Number", "sua.ssn.number",
-             FT_UINT8, BASE_DEC, NULL, 0x0,
-             "", HFILL }
-    },
-    {&hf_sua_ipv4,
-     { "IP Version 4 address", "sua.ipv4.address",
-       FT_IPv4, BASE_NONE, NULL, 0x0,
-       "", HFILL }
-    },
-    {&hf_sua_hostname,
-     { "Hostname", "sua.hostname.name",
-       FT_STRING, BASE_NONE, NULL, 0x0,
-       "", HFILL }
-    },
-    {&hf_sua_hostname_padding,
-     { "Padding", "sua.hostname.padding",
-       FT_BYTES, BASE_NONE, NULL, 0x0,
-       "", HFILL }
-    },
-    {&hf_sua_ipv6,
-     { "IP Version 6 address", "sua.ipv6.address",
-       FT_IPv6, BASE_NONE, NULL, 0x0,
-       "", HFILL }
-    },
-    { &hf_sua_light_version,
-      { "Version", "sua.light.version",
-             FT_UINT8, BASE_DEC, NULL, 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_light_spare_1,
-      { "Spare", "sua.light.spare_1",
-             FT_UINT8, BASE_HEX, NULL, 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_light_message_type,
-      { "Message Type", "sua.light.message_type",
-             FT_UINT16, BASE_DEC, VALS(sua_light_message_type_values), 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_light_subsystem_number,
-      { "Subsystem number", "sua.light.subsystem_number",
-             FT_UINT16, BASE_DEC, NULL, 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_light_spare_2,
-      { "Spare", "sua.light.spare_2",
-             FT_UINT16, BASE_DEC, NULL, 0x0,
-             "", HFILL }
-    },
-    { &hf_sua_light_message_length,
-      { "Message length", "sua.light.message_length",
-        FT_UINT32, BASE_DEC, NULL, 0x0,
-              "", HFILL }
-    },
-    { &hf_sua_light_error_code,
-      { "Error Code", "sua.light.error_code",
-        FT_UINT16, BASE_HEX, VALS(&sua_light_error_code_values), 0x0,
-             "", HFILL }
-    }
+    { &hf_version,                               { "Version",                      "sua.version",                                   FT_UINT8,   BASE_DEC,  VALS(protocol_version_values),      0x0,                      "", HFILL } },
+    { &hf_reserved,                              { "Reserved",                     "sua.reserved",                                  FT_BYTES,   BASE_NONE, NULL,                               0x0,                      "", HFILL } },
+    { &hf_message_class,                         { "Message Class",                "sua.message_class",                             FT_UINT8,   BASE_DEC,  VALS(message_class_values),         0x0,                      "", HFILL } },
+    { &hf_message_type,                          { "Message Type",                 "sua.message_type",                              FT_UINT8,   BASE_DEC,  NULL,                               0x0,                      "", HFILL } },
+    { &hf_message_length,                        { "Message Length",               "sua.message_length",                            FT_UINT32,  BASE_DEC,  NULL,                               0x0,                      "", HFILL } },
+    { &hf_parameter_tag,                         { "Parameter Tag",                "sua.parameter_tag",                             FT_UINT16,  BASE_HEX,  VALS(parameter_tag_values),         0x0,                      "", HFILL } },
+    { &hf_parameter_length,                      { "Parameter Length",             "sua.parameter_length",                          FT_UINT16,  BASE_DEC,  NULL,                               0x0,                      "", HFILL } },
+    { &hf_parameter_value,                       { "Parameter Value",              "sua.parameter_value",                           FT_BYTES,   BASE_NONE, NULL,                               0x0,                      "", HFILL } },
+    { &hf_parameter_padding,                     { "Padding",                      "sua.parameter_padding",                         FT_BYTES,   BASE_NONE, NULL,                               0x0,                      "", HFILL } },
+    { &hf_info_string,                           { "Info string",                  "sua.info_string",                               FT_STRING,  BASE_NONE, NULL,                               0x0,                      "", HFILL } },
+    { &hf_routing_context,                       { "Routing context",              "sua.routing_context",                           FT_UINT32,  BASE_DEC,  NULL,                               0x0,                      "", HFILL } },
+    { &hf_diagnostic_information_info,           { "Diagnostic Information",       "sua.diagnostic_information",                    FT_BYTES,   BASE_NONE, NULL,                               0x0,                      "", HFILL } },
+    { &hf_heartbeat_data,                        { "Heartbeat Data",               "sua.heartbeat_data",                            FT_BYTES,   BASE_NONE, NULL,                               0x0,                      "", HFILL } },
+    { &hf_traffic_mode_type,                     { "Traffic mode Type",            "sua.traffic_mode_type",                         FT_UINT32,  BASE_DEC,  VALS(traffic_mode_type_values),     0x0,                      "", HFILL } },
+    { &hf_error_code,                            { "Error code",                   "sua.error_code",                                FT_UINT32,  BASE_DEC,  VALS(error_code_values),            0x0,                      "", HFILL } },
+    { &hf_status_type,                           { "Status type",                  "sua.status_type",                               FT_UINT16,  BASE_DEC,  VALS(status_type_values),           0x0,                      "", HFILL } },
+    { &hf_status_info,                           { "Status info",                  "sua.status_info",                               FT_UINT16,  BASE_DEC,  NULL,                               0x0,                      "", HFILL } },
+    { &hf_congestion_level,                      { "Congestion Level",             "sua.congestion_level",                          FT_UINT32,  BASE_DEC,  NULL,                               0x0,                      "", HFILL } },
+    { &hf_asp_identifier,                        { "ASP Identifier",               "sua.asp_identifier",                            FT_UINT32,  BASE_DEC,  NULL,                               0x0,                      "", HFILL } },
+    { &hf_mask,                                  { "Mask",                         "sua.affected_point_code_mask",                  FT_UINT8,   BASE_HEX,  NULL,                               0x0,                      "", HFILL } },
+    { &hf_dpc,                                   { "Affected DPC",                 "sua.affected_pointcode_dpc",                    FT_UINT24,  BASE_DEC,  NULL,                               0x0,                      "", HFILL } },
+    { &hf_registration_status,                   { "Registration status",          "sua.registration_status",                       FT_UINT32,  BASE_DEC,  VALS(registration_status_values),   0x0,                      "", HFILL } },
+    { &hf_deregistration_status,                 { "Deregistration status",        "sua.deregistration_status",                     FT_UINT32,  BASE_DEC,  VALS(deregistration_status_values), 0x0,                      "", HFILL } },
+    { &hf_local_routing_key_identifier,          { "Local routing key identifier", "sua.local_routing_key_identifier",              FT_UINT32,  BASE_DEC,  NULL,                               0x0,                      "", HFILL } },
+    { &hf_source_address_routing_indicator,      { "Routing Indicator",            "sua.source_address_routing_indicator",          FT_UINT16,  BASE_DEC,  VALS(routing_indicator_values),     0x0,                      "", HFILL } },
+    { &hf_source_address_reserved_bits,          { "Reserved Bits",                "sua.source_address_reserved_bits",              FT_UINT16,  BASE_DEC,  NULL,                               ADDRESS_RESERVED_BITMASK, "", HFILL } },
+    { &hf_source_address_gt_bit,                 { "Include GT",                   "sua.source_address_gt_bit",                     FT_BOOLEAN, 16,        NULL,                               ADDRESS_GT_BITMASK,       "", HFILL } },
+    { &hf_source_address_pc_bit,                 { "Include PC",                   "sua.source_address_pc_bit",                     FT_BOOLEAN, 16,        NULL,                               ADDRESS_PC_BITMASK,       "", HFILL } },
+    { &hf_source_address_ssn_bit,                { "Include SSN",                  "sua.source_address_ssn_bit",                    FT_BOOLEAN, 16,        NULL,                               ADDRESS_SSN_BITMASK,      "", HFILL } },
+    { &hf_destination_address_routing_indicator, { "Routing Indicator",            "sua.destination_address_routing_indicator",     FT_UINT16,  BASE_DEC,  VALS(routing_indicator_values),     0x0,                      "", HFILL } },
+    { &hf_destination_address_reserved_bits,     { "Reserved Bits",                "sua.destination_address_reserved_bits",         FT_UINT16,  BASE_DEC,  NULL,                               ADDRESS_RESERVED_BITMASK, "", HFILL } },
+    { &hf_destination_address_gt_bit,            { "Include GT",                   "sua.destination_address_gt_bit",                FT_BOOLEAN, 16,        NULL,                               ADDRESS_GT_BITMASK,       "", HFILL } },
+    { &hf_destination_address_pc_bit,            { "Include PC",                   "sua.destination_address_pc_bit",                FT_BOOLEAN, 16,        NULL,                               ADDRESS_PC_BITMASK,       "", HFILL } },
+    { &hf_destination_address_ssn_bit,           { "Include SSN",                  "sua.destination_address_ssn_bit",               FT_BOOLEAN, 16,        NULL,                               ADDRESS_SSN_BITMASK,      "", HFILL } },
+    { &hf_ss7_hop_counter_counter,               { "SS7 Hop Counter",              "sua.ss7_hop_counter_counter",                   FT_UINT8,   BASE_DEC,  NULL,                               0x0,                      "", HFILL } },
+    { &hf_ss7_hop_counter_reserved,              { "Reserved",                     "sua.ss7_hop_counter_reserved",                  FT_BYTES,   BASE_NONE, NULL,                               0x0,                      "", HFILL } },
+    { &hf_destination_reference_number,          { "Destination Reference Number", "sua.destination_reference_number",              FT_UINT32,  BASE_DEC,  NULL,                               0x0,                      "", HFILL } },
+    { &hf_source_reference_number,               { "Source Reference Number",      "sua.source_reference_number",                   FT_UINT32,  BASE_DEC,  NULL,                               0x0,                      "", HFILL } },
+    { &hf_cause_reserved,                        { "Reserved",                     "sua.sccp_cause_reserved",                       FT_BYTES,   BASE_NONE, NULL,                               0x0,                      "", HFILL } },
+    { &hf_cause_type,                            { "Cause Type",                   "sua.sccp_cause_type",                           FT_UINT8,   BASE_HEX,  VALS(cause_type_values),            0x0,                      "", HFILL } },
+    { &hf_cause_value,                           { "Cause Value",                  "sua.sccp_cause_value",                          FT_UINT8,   BASE_HEX,  NULL,                               0x0,                      "", HFILL } },
+    { &hf_sequence_number_reserved,              { "Reserved",                     "sua.sequence_number_reserved",                  FT_BYTES,   BASE_NONE, NULL,                               0x0,                      "", HFILL } },
+    { &hf_sequence_number_rec_number,            { "Receive Sequence Number P(R)", "sua.sequence_number_receive_sequence_number",   FT_UINT8,   BASE_DEC,  NULL,                               SEQ_NUM_MASK,             "", HFILL } },
+    { &hf_sequence_number_more_data_bit,         { "More Data Bit",                "sua.sequence_number_more_data_bit",             FT_BOOLEAN, 8,         TFS(&more_data_bit_value),          MORE_DATA_BIT_MASK,       "", HFILL } },
+    { &hf_sequence_number_sent_number,           { "Sent Sequence Number P(S)",    "sua.sequence_number_sent_sequence_number",      FT_UINT8,   BASE_DEC,  NULL,                               SEQ_NUM_MASK,             "", HFILL } },
+    { &hf_sequence_number_spare_bit,             { "Spare Bit",                    "sua.sequence_number_spare_bit",                 FT_BOOLEAN, 8,         NULL,                               SPARE_BIT_MASK,           "", HFILL } },
+    { &hf_receive_sequence_number_reserved,      { "Reserved",                     "sua.receive_sequence_number_reserved",          FT_BYTES,   BASE_NONE, NULL,                               0x0,                      "", HFILL } },
+    { &hf_receive_sequence_number_number,        { "Receive Sequence Number P(R)", "sua.receive_sequence_number_number",            FT_UINT8,   BASE_DEC,  NULL,                               SEQ_NUM_MASK,             "", HFILL } },
+    { &hf_receive_sequence_number_spare_bit,     { "Spare Bit",                    "sua.receive_sequence_number_spare_bit",         FT_BOOLEAN, 8,         NULL,                               SPARE_BIT_MASK,           "", HFILL } },
+    { &hf_asp_capabilities_reserved,             { "Reserved",                     "sua.asp_capabilities_reserved",                 FT_BYTES,   BASE_NONE, NULL,                               0x0,                      "", HFILL } },
+    { &hf_asp_capabilities_reserved_bits,        { "Reserved Bits",                "sua.asp_capabilities_reserved_bits",            FT_UINT8,   BASE_HEX,  NULL,                               RESERVED_BITS_MASK,       "", HFILL } },
+    { &hf_asp_capabilities_a_bit,                { "Protocol Class 3",             "sua.asp_capabilities_a_bit",                    FT_BOOLEAN, 8,         TFS(&sua_supported_bit_value),      A_BIT_MASK,               "", HFILL } },
+    { &hf_asp_capabilities_b_bit,                { "Protocol Class 2",             "sua.asp_capabilities_b_bit",                    FT_BOOLEAN, 8,         TFS(&sua_supported_bit_value),      B_BIT_MASK,               "", HFILL } },
+    { &hf_asp_capabilities_c_bit,                { "Protocol Class 1",             "sua.asp_capabilities_c_bit",                    FT_BOOLEAN, 8,         TFS(&sua_supported_bit_value),      C_BIT_MASK,               "", HFILL } },
+    { &hf_asp_capabilities_d_bit,                { "Protocol Class 0",             "sua.asp_capabilities_d_bit",                    FT_BOOLEAN, 8,         TFS(&sua_supported_bit_value),      D_BIT_MASK,               "", HFILL } },
+    { &hf_asp_capabilities_interworking,         { "Interworking",                 "sua.asp_capabilities_interworking",             FT_UINT8,   BASE_HEX,  VALS(interworking_values),          0x0,                      "", HFILL } },
+    { &hf_credit,                                { "Credit",                       "sua.credit",                                    FT_UINT32,  BASE_DEC,  NULL,                               0x0,                      "", HFILL } },
+    { &hf_cause,                                 { "Cause",                        "sua.cause_user_cause",                          FT_UINT16,  BASE_DEC,  VALS(cause_values),                 0x0,                      "", HFILL } },
+    { &hf_user,                                  { "User",                         "sua.cause_user_user",                           FT_UINT16,  BASE_DEC,  NULL,                               0x0,                      "", HFILL } },
+    { &hf_data,                                  { "Data",                         "sua.data",                                      FT_BYTES,   BASE_NONE, NULL,                               0x0,                      "", HFILL } },
+    { &hf_network_appearance,                    { "Network Appearance",           "sua.network_appearance",                        FT_UINT32,  BASE_DEC,  NULL,                               0x0,                      "", HFILL } },
+    { &hf_routing_key_identifier,                { "Local Routing Key Identifier", "sua.routing_key_identifier",                    FT_UINT32,  BASE_HEX,  NULL,                               0x0,                      "", HFILL } },
+    { &hf_correlation_id,                        { "Correlation ID",               "sua.correlation_id",                            FT_UINT32,  BASE_DEC,  NULL,                               0x0,                      "", HFILL } },
+    { &hf_importance_reserved,                   { "Reserved",                     "sua.importance_reserved",                       FT_BYTES,   BASE_NONE, NULL,                               0x0,                      "", HFILL } },
+    { &hf_importance,                            { "Importance",                   "sua.importance_inportance",                     FT_UINT8,   BASE_DEC,  NULL,                               0x0,                      "", HFILL } },
+    { &hf_message_priority_reserved,             { "Reserved",                     "sua.message_priority_reserved",                 FT_BYTES,   BASE_NONE, NULL,                               0x0,                      "", HFILL } },
+    { &hf_message_priority,                      { "Message Priority",             "sua.message_priority_priority",                 FT_UINT8,   BASE_DEC,  NULL,                               0x0,                      "", HFILL } },
+    { &hf_protocol_class_reserved,               { "Reserved",                     "sua.protcol_class_reserved",                    FT_BYTES,   BASE_HEX,  NULL,                               0x0,                      "", HFILL } },
+    { &hf_return_on_error_bit,                   { "Return On Error Bit",          "sua.protocol_class_return_on_error_bit",        FT_BOOLEAN, 8,         TFS(&return_on_error_bit_value),    RETURN_ON_ERROR_BIT_MASK, "", HFILL } },
+    { &hf_protocol_class,                        { "Protocol Class",               "sua.protocol_class_class",                      FT_UINT8,   BASE_DEC,  NULL,                               PROTOCOL_CLASS_MASK,      "", HFILL } },
+    { &hf_sequence_control,                      { "Sequence Control",             "sua.sequence_control_sequence_control",         FT_UINT32,  BASE_DEC,  NULL,                               0x0,                      "", HFILL } },
+    { &hf_first_bit,                             { "First Segment Bit",            "sua.segmentation_first_bit",                    FT_BOOLEAN, 8,         TFS(&first_bit_value),              FIRST_BIT_MASK,           "", HFILL } },
+    { &hf_number_of_remaining_segments,          { "Number of Remaining Segments", "sua.segmentation_number_of_remaining_segments", FT_UINT8,   BASE_DEC,  NULL,                               NUMBER_OF_SEGMENTS_MASK,  "", HFILL } },
+    { &hf_segmentation_reference,                { "Segmentation Reference",       "sua.segmentation_reference",                    FT_UINT24,  BASE_DEC,  NULL,                               0x0,                      "", HFILL } },
+    { &hf_smi_reserved,                          { "Reserved",                     "sua.smi_reserved",                              FT_BYTES,   BASE_DEC,  NULL,                               0x0,                      "", HFILL } },
+    { &hf_smi,                                   { "SMI",                          "sua.smi_smi",                                   FT_UINT8,   BASE_DEC,  NULL,                               0x0,                      "", HFILL } },
+    { &hf_tid_label_start,                       { "Start",                        "sua.tid_label_start",                           FT_UINT8,   BASE_DEC,  NULL,                               0x0,                      "", HFILL } },
+    { &hf_tid_label_end,                         { "End",                          "sua.tid_label_end",                             FT_UINT8,   BASE_DEC,  NULL,                               0x0,                      "", HFILL } },
+    { &hf_tid_label_value,                       { "Label Value",                  "sua.tid_label_value",                           FT_UINT16,  BASE_HEX,  NULL,                               0x0,                      "", HFILL } },
+    { &hf_drn_label_start,                       { "Start",                        "sua.drn_label_start",                           FT_UINT8,   BASE_DEC,  NULL,                               0x0,                      "", HFILL } },
+    { &hf_drn_label_end,                         { "End",                          "sua.drn_label_end",                             FT_UINT8,   BASE_DEC,  NULL,                               0x0,                      "", HFILL } },
+    { &hf_drn_label_value,                       { "Label Value",                  "sua.drn_label_value",                           FT_UINT16,  BASE_HEX,  NULL,                               0x0,                      "", HFILL } },
+    { &hf_gt_reserved,                           { "Reserved",                     "sua.gt_reserved",                               FT_BYTES,   BASE_NONE, NULL,                               0x0,                      "", HFILL } },
+    { &hf_gti,                                   { "GTI",                          "sua.gti",                                       FT_UINT8,   BASE_HEX,  NULL,                               0x0,                      "", HFILL } },
+    { &hf_number_of_digits,                      { "Number of Digits",             "sua.global_title_number_of_digits",             FT_UINT8,   BASE_DEC,  NULL,                               0x0,                      "", HFILL } },
+    { &hf_translation_type,                      { "Translation Type",             "sua.global_title_translation_type",             FT_UINT8,   BASE_HEX,  NULL,                               0x0,                      "", HFILL } },
+    { &hf_numbering_plan,                        { "Numbering Plan",               "sua.global_title_numbering_plan",               FT_UINT8,   BASE_HEX,  VALS(numbering_plan_values),        0x0,                      "", HFILL } },
+    { &hf_nature_of_address,                     { "Nature of Address",            "sua.global_title_nature_of_address",            FT_UINT8,   BASE_HEX,  VALS(nature_of_address_values),     0x0,                      "", HFILL } },
+    { &hf_global_title,                          { "Global Title",                 "sua.global_title_signals",                      FT_BYTES,   BASE_NONE, NULL,                               0x0,                      "", HFILL } },
+    { &hf_point_code_dpc,                        { "Point Code",                   "sua.point_code",                                FT_UINT32,  BASE_DEC,  NULL,                               0x0,                      "", HFILL } },
+    { &hf_ssn_reserved,                          { "Reserved",                     "sua.ssn_reserved",                              FT_BYTES,   BASE_NONE, NULL,                               0x0,                      "", HFILL } },
+    { &hf_ssn_number,                            { "Subsystem Number",             "sua.ssn",                                       FT_UINT8,   BASE_DEC,  NULL,                               0x0,                      "", HFILL } },
+    { &hf_ipv4,                                  { "IP Version 4 address",         "sua.ipv4_address",                              FT_IPv4,    BASE_NONE, NULL,                               0x0,                      "", HFILL } },
+    { &hf_hostname,                              { "Hostname",                     "sua.hostname.name",                             FT_STRING,  BASE_NONE, NULL,                               0x0,                      "", HFILL } },
+    { &hf_ipv6,                                  { "IP Version 6 address",         "sua.ipv6_address",                              FT_IPv6,    BASE_NONE, NULL,                               0x0,                      "", HFILL } },
   };
 
   /* Setup protocol subtree array */
@@ -2716,13 +1735,7 @@ proto_register_sua(void)
     &ett_sua_first_remaining,
     &ett_sua_return_on_error_bit_and_protocol_class
   };
-
-  static enum_val_t sua_options[] = {
-    { "Internet draft 8 version",        IETF_VERSION08 },
-    { "SUA light (Siemens proprietary)", SIEMENS_VERSION },
-    { NULL, 0 }
-  };
-
+  module_t *sua_module;
 
   /* Register the protocol name and description */
   proto_sua = proto_register_protocol("SS7 SCCP-User Adaptation Layer", "SUA", "sua");
@@ -2732,16 +1745,9 @@ proto_register_sua(void)
   proto_register_subtree_array(ett, array_length(ett));
 
   sua_module = prefs_register_protocol(proto_sua, NULL);
-  sua_light_dissector_table = register_dissector_table("sual.subsystem_number",
-                               "SUA Light subsystem number", FT_UINT16,
-                               BASE_DEC);
-
-  prefs_register_enum_preference(sua_module,
-                                "sua_version",
-                                "SUA Version",
-                                "SUA Version",
-                                &sua_version,
-                                sua_options, FALSE);
+  prefs_register_obsolete_preference(sua_module, "sua_version");
+
+  sua_ssn_dissector_table = register_dissector_table("sua.ssn", "SUA SSN", FT_UINT8, BASE_DEC);
 }
 
 void
@@ -2752,4 +1758,6 @@ proto_reg_handoff_sua(void)
   sua_handle = create_dissector_handle(dissect_sua, proto_sua);
   dissector_add("sctp.ppi",  SUA_PAYLOAD_PROTOCOL_ID, sua_handle);
   dissector_add("sctp.port", SCTP_PORT_SUA,           sua_handle);
+
+  data_handle = find_dissector("data");
 }