From Pascal Quantin:
[obnox/wireshark/wip.git] / epan / dissectors / packet-gsm_a_gm.c
index d7c34325e26d9383025b708d294eb195872f51de..b06b62b801db2b30761209ad933c98b41ecbf723 100644 (file)
@@ -33,7 +33,7 @@
  *   Mobile radio interface Layer 3 specification;
  *   Core network protocols;
  *   Stage 3
- *   (3GPP TS 24.008 version 8.6.0 Release 8)
+ *   (3GPP TS 24.008 version 9.6.0 Release 9)
  *
  * $Id$
  *
@@ -63,6 +63,7 @@
 #include <string.h>
 
 #include <epan/packet.h>
+#include <epan/expert.h>
 #include <epan/prefs.h>
 #include <epan/tap.h>
 #include <epan/asn1.h>
@@ -72,7 +73,6 @@
 #include "packet-ber.h"
 #include "packet-q931.h"
 #include "packet-gsm_a_common.h"
-#include "packet-ipv6.h"
 #include "packet-e212.h"
 #include "packet-ppp.h"
 
@@ -132,6 +132,9 @@ const value_string gsm_a_dtap_msg_sm_strings[] = {
        { 0x58, "Activate MBMS Context Reject" },
        { 0x59, "Request MBMS Context Activation" },
        { 0x5a, "Request MBMS Context Activation Reject" },
+       { 0x5b, "Request Secondary PDP Context Activation" },
+       { 0x5c, "Request Secondary PDP Context Activation Reject" },
+       { 0x5d, "Notification" },
        { 0, NULL }
 };
 
@@ -154,6 +157,7 @@ const value_string gsm_gm_elem_strings[] = {
        { 0x00, "MS Radio Access Capability" },
        { 0x00, "GMM Cause" },
        { 0x00, "Routing Area Identification" },
+       { 0x00, "Routing Area Identification 2" },
        { 0x00, "Update Result" },
        { 0x00, "Update Type" },
        { 0x00, "A&C Reference Number" },
@@ -163,6 +167,10 @@ const value_string gsm_gm_elem_strings[] = {
        { 0x00, "PS LCS Capability" },
        { 0x00, "Network Feature Support" },
        { 0x00, "Inter RAT information container" },
+       { 0x00, "Requested MS information" },
+       { 0x00, "UE network capability" },
+       { 0x00, "E-UTRAN inter RAT information container" },
+       { 0x00, "Voice domain preference and UE's usage setting" },
        /* Session Management Information Elements 10.5.6 */
        { 0x00, "Access Point Name" },
        { 0x00, "Network Service Access Point Identifier" },
@@ -181,6 +189,7 @@ const value_string gsm_gm_elem_strings[] = {
        { 0x00, "MBMS protocol configuration options" },
        { 0x00, "Enhanced network service access point identifier" },
        { 0x00, "Request type" },
+       { 0x00, "Notification indicator" },
        /* GPRS Common Information Elements 10.5.7 */
        { 0x00, "PDP Context Status" },
        { 0x00, "Radio Priority" },
@@ -188,6 +197,7 @@ const value_string gsm_gm_elem_strings[] = {
        { 0x00, "GPRS Timer 2" },
        { 0x00, "Radio Priority 2"},
        { 0x00, "MBMS context status"},
+       { 0x00, "Uplink data status"},
        { 0x00, "Spare Nibble"},
        { 0, NULL }
 };
@@ -256,6 +266,17 @@ static int hf_gsm_a_gm_tmsi_flag = -1;
 static int hf_gsm_a_gm_update_type = -1;
 static int hf_gsm_a_gm_gprs_timer_unit = -1;
 static int hf_gsm_a_gm_gprs_timer_value = -1;
+static int hf_gsm_a_gm_nsapi_5_ul_stat = -1;
+static int hf_gsm_a_gm_nsapi_6_ul_stat = -1;
+static int hf_gsm_a_gm_nsapi_7_ul_stat = -1;
+static int hf_gsm_a_gm_nsapi_8_ul_stat = -1;
+static int hf_gsm_a_gm_nsapi_9_ul_stat = -1;
+static int hf_gsm_a_gm_nsapi_10_ul_stat = -1;
+static int hf_gsm_a_gm_nsapi_11_ul_stat = -1;
+static int hf_gsm_a_gm_nsapi_12_ul_stat = -1;
+static int hf_gsm_a_gm_nsapi_13_ul_stat = -1;
+static int hf_gsm_a_gm_nsapi_14_ul_stat = -1;
+static int hf_gsm_a_gm_nsapi_15_ul_stat = -1;
 static int hf_gsm_a_gm_pco_pid = -1;
 static int hf_gsm_a_gm_type_of_identity = -1;
 static int hf_gsm_a_gm_rac = -1;
@@ -265,6 +286,10 @@ static int hf_gsm_a_gm_otd_b = -1;
 static int hf_gsm_a_gm_gps_a = -1;
 static int hf_gsm_a_gm_gps_b = -1;
 static int hf_gsm_a_gm_gps_c = -1;
+static int hf_gsm_a_gm_req_ms_info_irat = -1;
+static int hf_gsm_a_gm_req_ms_info_irat2 = -1;
+static int hf_gsm_a_gm_ue_usage_setting = -1;
+static int hf_gsm_a_gm_voice_domain_pref_for_eutran = -1;
 static int hf_gsm_a_sm_pdp_type_org = -1;
 static int hf_gsm_a_qos_mean_thr = -1;
 static int hf_gsm_a_qos_peak_thr = -1;
@@ -289,7 +314,62 @@ static int hf_gsm_a_sm_packet_flow_id = -1;
 static int hf_gsm_a_sm_tmgi = -1;
 static int hf_gsm_a_sm_enh_nsapi = -1;
 static int hf_gsm_a_sm_req_type = -1;
+static int hf_gsm_a_sm_notif_ind = -1;
+static int hf_gsm_a_gm_rac_ctrled_early_cm_sending = -1;
+static int hf_gsm_a_gm_rac_pseudo_sync = -1;
+static int hf_gsm_a_gm_rac_vgcs = -1;
+static int hf_gsm_a_gm_rac_vbs = -1;
+static int hf_gsm_a_gm_rac_multislot_capability = -1;
+static int hf_gsm_a_gm_rac_hscsd_multi_slot_class = -1;
+static int hf_gsm_a_gm_rac_gprs_multi_slot_class = -1;
+static int hf_gsm_a_gm_rac_gprs_ext_dyn_alloc_cap = -1;
+static int hf_gsm_a_gm_rac_ecsd_multi_slot_class = -1;
+static int hf_gsm_a_gm_rac_egprs_multi_slot_class = -1;
+static int hf_gsm_a_gm_rac_egprs_ext_dyn_alloc_cap = -1;
+static int hf_gsm_a_gm_rac_dtm_gprs_multi_slot_class = -1;
+static int hf_gsm_a_gm_rac_single_slt_dtm = -1;
+static int hf_gsm_a_gm_rac_dtm_egprs_multi_slot_cls_pres = -1;
+static int hf_gsm_a_gm_rac_dtm_egprs_multi_slot_class = -1;
+static int hf_gsm_a_gm_rac_8psk_pow_cap_pres = -1;
+static int hf_gsm_a_gm_rac_comp_int_meas_cap = -1;
 static int hf_gsm_a_gm_rel_lev_ind = -1;
+static int hf_gsm_a_gm_rac_geran_feat_pkg = -1;
+static int hf_gsm_a_gm_rac_umts_fdd_cap = -1;
+static int hf_gsm_a_gm_rac_umts_384_tdd_ra_cap = -1;
+static int hf_gsm_a_gm_rac_cdma2000_cap = -1;
+static int hf_gsm_a_gm_rac_umts_128_tdd_ra_cap = -1;
+static int hf_gsm_a_gm_rac_mod_based_multi_slot_class_support = -1;
+static int hf_gsm_a_gm_rac_geran_iu_mode_cap = -1;
+static int hf_gsm_a_gm_rac_flo_iu_cap = -1;
+static int hf_gsm_a_gm_rac_mult_tbf_cap = -1;
+static int hf_gsm_a_gm_rac_down_adv_rec_perf = -1;
+static int hf_gsm_a_gm_rac_ext_rlc_mac_ctrl_msg_seg_cap = -1;
+static int hf_gsm_a_gm_rac_dtm_enh_cap = -1;
+static int hf_gsm_a_gm_rac_dtm_gprs_high_multi_slot_class = -1;
+static int hf_gsm_a_gm_rac_dtm_egprs_high_multi_slot_class = -1;
+static int hf_gsm_a_gm_rac_ps_ho_cap = -1;
+static int hf_gsm_a_gm_rac_dtm_ho_cap = -1;
+static int hf_gsm_a_gm_rac_multi_slot_cap_red_down_dual_carrier = -1;
+static int hf_gsm_a_gm_rac_down_dual_carrier_dtm_cap = -1;
+static int hf_gsm_a_gm_rac_flex_ts_assign = -1;
+static int hf_gsm_a_gm_rac_gan_ps_ho_cap = -1;
+static int hf_gsm_a_gm_rac_rlc_non_pers_mode = -1;
+static int hf_gsm_a_gm_rac_reduced_lat_cap = -1;
+static int hf_gsm_a_gm_rac_ul_egprs2 = -1;
+static int hf_gsm_a_gm_rac_dl_egprs2 = -1;
+static int hf_gsm_a_gm_rac_eutra_fdd_support = -1;
+static int hf_gsm_a_gm_rac_eutra_tdd_support = -1;
+static int hf_gsm_a_gm_rac_geran_to_eutra_support_in_geran_ptm = -1;
+static int hf_gsm_a_gm_rac_prio_based_resel_support = -1;
+static int hf_gsm_a_gm_rac_alt_efta_multi_slot_class = -1;
+static int hf_gsm_a_gm_rac_efta_multi_slot_cap_red_down_dual_carrier = -1;
+static int hf_gsm_a_gm_rac_ind_up_layer_pdu_start_cap_for_rlc_um = -1;
+static int hf_gsm_a_gm_rac_emst_cap = -1;
+static int hf_gsm_a_gm_rac_mtti_cap = -1;
+static int hf_gsm_a_gm_rac_utra_csg_cell_report = -1;
+static int hf_gsm_a_gm_rac_eutra_csg_cell_report = -1;
+static int hf_gsm_a_sm_ti_flag = -1;
+static int hf_gsm_a_sm_ext = -1;
 
 static int hf_gsm_a_gmm_net_cap_gea1 = -1;
 static int hf_gsm_a_gmm_net_cap_smdch = -1;
@@ -309,10 +389,11 @@ static int hf_gsm_a_gmm_net_cap_gea7 = -1;
 static int hf_gsm_a_gmm_net_cap_lcs = -1;
 static int hf_gsm_a_gmm_net_cap_ps_irat_iu = -1;
 static int hf_gsm_a_gmm_net_cap_ps_irat_s1 = -1;
-static int hf_gsm_a_gmm_net_cap_csfb = -1;
+static int hf_gsm_a_gmm_net_cap_comb_proc = -1;
 static int hf_gsm_a_gmm_net_cap_isr = -1;
 static int hf_gsm_a_gmm_net_cap_srvcc_to_geran = -1;
 static int hf_gsm_a_gmm_net_cap_epc = -1;
+static int hf_gsm_a_gmm_net_cap_nf = -1;
 
 /* Initialize the subtree pointers */
 static gint ett_tc_component = -1;
@@ -330,6 +411,7 @@ static gint ett_gmm_context_stat = -1;
 static gint ett_gmm_update_type = -1;
 static gint ett_gmm_radio_cap = -1;
 static gint ett_gmm_network_cap = -1;
+static gint ett_gsm_a_gm_msrac_multislot_capability = -1;
 static gint ett_gmm_rai = -1;
 static gint ett_gmm_gprs_timer = -1;
 
@@ -337,6 +419,7 @@ static gint ett_sm_tft = -1;
 
 static dissector_handle_t data_handle;
 static dissector_handle_t rrc_irat_ho_info_handle;
+static dissector_handle_t lte_rrc_ue_eutra_cap_handle;
 
 static dissector_table_t gprs_sm_pco_subdissector_table; /* GPRS SM PCO PPP Protocols */
 
@@ -355,10 +438,10 @@ static const value_string gsm_a_gm_res_of_attach_vals[] = {
 };
 
 static guint16
-de_gmm_attach_res(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gmm_attach_res(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
 {
-       proto_tree_add_item(tree, hf_gsm_a_gm_fop, tvb, offset, 1, FALSE);
-       proto_tree_add_item(tree, hf_gsm_a_gm_res_of_attach, tvb, offset, 1, FALSE);
+       proto_tree_add_item(tree, hf_gsm_a_gm_fop, tvb, offset, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_item(tree, hf_gsm_a_gm_res_of_attach, tvb, offset, 1, ENC_BIG_ENDIAN);
 
        /* no length check possible */
        return(1);
@@ -375,12 +458,12 @@ static const value_string gsm_a_gm_type_of_attach_vals[] = {
 };
 
 static guint16
-de_gmm_attach_type(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gmm_attach_type(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
 {
        proto_item   *tf = NULL;
        proto_tree   *tf_tree = NULL;
 
-       proto_tree_add_bits_item(tree, hf_gsm_a_gm_ciph_key_seq_num, tvb, offset << 3, 4, FALSE);
+       proto_tree_add_bits_item(tree, hf_gsm_a_gm_ciph_key_seq_num, tvb, offset << 3, 4, ENC_BIG_ENDIAN);
 
        tf = proto_tree_add_text(tree,
                tvb, offset, 1,
@@ -388,8 +471,8 @@ de_gmm_attach_type(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U
 
        tf_tree = proto_item_add_subtree(tf, ett_gmm_attach_type );
 
-       proto_tree_add_item(tf_tree, hf_gsm_a_gm_for, tvb, offset, 1, FALSE);
-       proto_tree_add_item(tf_tree, hf_gsm_a_gm_type_of_attach, tvb, offset, 1, FALSE);
+       proto_tree_add_item(tf_tree, hf_gsm_a_gm_for, tvb, offset, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_item(tf_tree, hf_gsm_a_gm_type_of_attach, tvb, offset, 1, ENC_BIG_ENDIAN);
 
        /* no length check possible */
        return(1);
@@ -398,7 +481,7 @@ de_gmm_attach_type(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U
 /*
  * [9] 10.5.5.3 Ciphering algorithm
  */
-static const value_string gsm_a_gm_type_of_ciph_alg_vals[] = {
+const value_string gsm_a_gm_type_of_ciph_alg_vals[] = {
        { 0x00, "ciphering not used" },
        { 0x01, "GPRS Encryption Algorithm GEA/1" },
        { 0x02, "GPRS Encryption Algorithm GEA/2" },
@@ -411,10 +494,10 @@ static const value_string gsm_a_gm_type_of_ciph_alg_vals[] = {
 };
 
 static guint16
-de_gmm_ciph_alg(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gmm_ciph_alg(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
 {
-       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (offset << 3) + 4, 1, FALSE);
-       proto_tree_add_item(tree, hf_gsm_a_gm_type_of_ciph_alg, tvb, offset, 1, FALSE);
+       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (offset << 3) + 4, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_item(tree, hf_gsm_a_gm_type_of_ciph_alg, tvb, offset, 1, ENC_BIG_ENDIAN);
 
        /* no length check possible */
        return(1);
@@ -429,10 +512,10 @@ const true_false_string gsm_a_gm_tmsi_flag_value = {
 };
 
 static guint16
-de_gmm_tmsi_stat(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gmm_tmsi_stat(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
 {
-       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (offset << 3) + 4, 3, FALSE);
-       proto_tree_add_item(tree, hf_gsm_a_gm_tmsi_flag, tvb, offset, 1, FALSE);
+       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (offset << 3) + 4, 3, ENC_BIG_ENDIAN);
+       proto_tree_add_item(tree, hf_gsm_a_gm_tmsi_flag, tvb, offset, 1, ENC_BIG_ENDIAN);
 
        /* no length check possible */
        return(1);
@@ -442,7 +525,7 @@ de_gmm_tmsi_stat(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_,
  * [7] 10.5.5.5
  */
 static guint16
-de_gmm_detach_type(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gmm_detach_type(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
 {
        guint8        oct;
        guint32       curr_offset;
@@ -547,7 +630,7 @@ static const range_string gsm_a_gmm_cn_spec_drs_cycle_len_coef_strings[] = {
        { 0, 0, NULL },
 };
 guint16
-de_gmm_drx_param(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gmm_drx_param(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
 {
        guint8        oct;
        guint32       curr_offset;
@@ -612,9 +695,9 @@ de_gmm_drx_param(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_,
                oct);
 
        curr_offset++;
-       proto_tree_add_item(tf_tree, hf_gsm_a_gmm_cn_spec_drs_cycle_len_coef, tvb, curr_offset, 1, FALSE);
-       proto_tree_add_item(tf_tree, hf_gsm_a_gmm_split_on_ccch, tvb, curr_offset, 1, FALSE);
-       proto_tree_add_item(tf_tree, hf_gsm_a_gmm_non_drx_timer, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_item(tf_tree, hf_gsm_a_gmm_cn_spec_drs_cycle_len_coef, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_item(tf_tree, hf_gsm_a_gmm_split_on_ccch, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_item(tf_tree, hf_gsm_a_gmm_non_drx_timer, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
 
        curr_offset++;
 
@@ -634,14 +717,14 @@ static const range_string gsm_a_gm_force_to_standby_vals[] = {
 };
 
 static guint16
-de_gmm_ftostby(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gmm_ftostby(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
 {
        guint32 bit_offset;
 
        /* IMPORTANT - IT'S ASSUMED THAT THE INFORMATION IS IN THE LOWER NIBBLE */
        bit_offset = (offset << 3) + 4;
-       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 1, FALSE);
-       proto_tree_add_bits_item(tree, hf_gsm_a_gm_force_to_standby, tvb, bit_offset + 1, 3, FALSE);
+       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_bits_item(tree, hf_gsm_a_gm_force_to_standby, tvb, bit_offset + 1, 3, ENC_BIG_ENDIAN);
 
        /* no length check possible */
        return(1);
@@ -651,14 +734,14 @@ de_gmm_ftostby(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, g
  * [9] 10.5.5.7 Force to standby (higher nibble)
  */
 static guint16
-de_gmm_ftostby_h(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gmm_ftostby_h(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
 {
        guint32 bit_offset;
 
        /* IMPORTANT - IT'S ASSUMED THAT THE INFORMATION IS IN THE HIGHER NIBBLE */
        bit_offset = offset << 3;
-       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 1, FALSE);
-       proto_tree_add_bits_item(tree, hf_gsm_a_gm_force_to_standby, tvb, bit_offset + 1, 3, FALSE);
+       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_bits_item(tree, hf_gsm_a_gm_force_to_standby, tvb, bit_offset + 1, 3, ENC_BIG_ENDIAN);
 
        /* no length check possible */
        return(1);
@@ -668,14 +751,14 @@ de_gmm_ftostby_h(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_,
  * [7] 10.5.5.8
  */
 static guint16
-de_gmm_ptmsi_sig(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gmm_ptmsi_sig(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
 {
        guint32       curr_offset;
        proto_item   *curr_item;
 
        curr_offset = offset;
 
-       curr_item= proto_tree_add_item(tree,hf_gsm_a_ptmsi_sig,tvb,curr_offset,3,FALSE);
+       curr_item= proto_tree_add_item(tree,hf_gsm_a_ptmsi_sig,tvb,curr_offset,3,ENC_BIG_ENDIAN);
        proto_item_append_text(curr_item,"%s",add_string ? add_string : "");
 
        curr_offset+=3;
@@ -689,18 +772,18 @@ de_gmm_ptmsi_sig(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_,
  * [7] 10.5.5.8a
  */
 static guint16
-de_gmm_ptmsi_sig2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len _U_)
+de_gmm_ptmsi_sig2(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len _U_)
 {
        guint32       curr_offset;
        proto_item   *curr_item;
 
        curr_offset = offset;
 
-       curr_item= proto_tree_add_item(tree,hf_gsm_a_ptmsi_sig2,tvb,curr_offset,3,FALSE);
+       curr_item= proto_tree_add_item(tree,hf_gsm_a_ptmsi_sig2,tvb,curr_offset,3,ENC_BIG_ENDIAN);
        proto_item_append_text(curr_item,"%s",add_string ? add_string : "");
        curr_offset+=3;
 
-       EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+       EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
 
        return(curr_offset - offset);
 }
@@ -717,10 +800,10 @@ static const value_string gsm_a_gm_type_of_identity_vals[] = {
 };
 
 static guint16
-de_gmm_ident_type2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gmm_ident_type2(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
 {
-       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (offset << 3) + 4, 1, FALSE);
-       proto_tree_add_item(tree, hf_gsm_a_gm_type_of_identity, tvb, offset, 1, FALSE);
+       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (offset << 3) + 4, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_item(tree, hf_gsm_a_gm_type_of_identity, tvb, offset, 1, ENC_BIG_ENDIAN);
 
        /* no length check possible */
        return(1);
@@ -737,14 +820,14 @@ static const range_string gsm_a_gm_imeisv_req_vals[] = {
 };
 
 static guint16
-de_gmm_imeisv_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gmm_imeisv_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
 {
        guint32 bit_offset;
 
        /* IMPORTANT - IT'S ASSUMED THAT THE INFORMATION IS IN THE HIGHER NIBBLE */
        bit_offset = offset << 3;
-       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 1, FALSE);
-       proto_tree_add_bits_item(tree, hf_gsm_a_gm_imeisv_req, tvb, bit_offset + 1, 3, FALSE);
+       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_bits_item(tree, hf_gsm_a_gm_imeisv_req, tvb, bit_offset + 1, 3, ENC_BIG_ENDIAN);
 
        /* no length check possible */
        return(1);
@@ -754,7 +837,7 @@ de_gmm_imeisv_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_
  * [7] 10.5.5.11
  */
 static guint16
-de_gmm_rec_npdu_lst(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+de_gmm_rec_npdu_lst(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
 {
        guint32 curr_offset;
        guint   curr_len;
@@ -798,7 +881,7 @@ de_gmm_rec_npdu_lst(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len,
 
        } while ( curr_len > 1 );
 
-       EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+       EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
 
        return(curr_offset - offset);
 }
@@ -864,9 +947,9 @@ static const true_false_string gsm_a_gmm_net_cap_ps_irat_s1_vals = {
        "PS inter-RAT HO to E-UTRAN S1 mode not supported"
 };
 
-static const true_false_string gsm_a_gmm_net_cap_csfb_vals = {
-       "Mobile station supports CS fallback",
-       "Mobile station does not support CS fallback"
+static const true_false_string gsm_a_gmm_net_cap_comb_proc_vals = {
+       "Mobile station supports EMM combined procedures",
+       "Mobile station does not support EMM combined procedures"
 };
 
 static const true_false_string gsm_a_gmm_net_cap_isr_vals = {
@@ -884,8 +967,13 @@ static const true_false_string gsm_a_gmm_net_cap_epc_vals = {
        "EPC not supported"
 };
 
+static const true_false_string gsm_a_gmm_net_cap_nf_vals = {
+       "Mobile station supports the notification procedure",
+       "Mobile station does not support the notification procedure"
+};
+
 guint16
-de_gmm_ms_net_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+de_gmm_ms_net_cap(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
 {
        guint32 curr_offset;
        proto_tree      *subtree;
@@ -894,71 +982,74 @@ de_gmm_ms_net_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gc
        curr_offset = offset;
 
        /* bit 8: GEA1 */
-       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_gea1, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_gea1, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
 
        /* bit 7: SM capabilities via dedicated channels */
-       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_smdch, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_smdch, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
 
        /* bit 6: SM capabilities via GPRS channels */
-       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_smgprs, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_smgprs, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
 
        /* bit 5: UCS2 support */
-       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_ucs2, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_ucs2, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
 
        /* bits 4 3: SS Screening Indicator */
-       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_ss_scr_ind, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_ss_scr_ind, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
 
        /* bit 2: SoLSA Capability */
-       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_solsa, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_solsa, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
 
        /* bit 1 */
-       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_rev, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_rev, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
 
        curr_offset++;
        NO_MORE_DATA_CHECK(len);
 
        /* bit 8: PFC feature mode */
-       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_pfc, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_pfc, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
 
        /* bits 7 6 5 4 3 2: Extended GEA bits */
-       item = proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_ext_gea_bits, tvb, curr_offset, 1, FALSE);
+       item = proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_ext_gea_bits, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
        subtree = proto_item_add_subtree(item, ett_gmm_network_cap);
-       proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea2, tvb, curr_offset, 1, FALSE);
-       proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea3, tvb, curr_offset, 1, FALSE);
-       proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea4, tvb, curr_offset, 1, FALSE);
-       proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea5, tvb, curr_offset, 1, FALSE);
-       proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea6, tvb, curr_offset, 1, FALSE);
-       proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea7, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea2, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea3, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea4, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea5, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea6, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea7, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
 
        /* bit 1: LCS VA capability */
-       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_lcs, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_lcs, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
 
        curr_offset++;
        NO_MORE_DATA_CHECK(len);
 
        /* bit 8: PS inter-RAT HO to UTRAN Iu mode capability */
-       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_ps_irat_iu, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_ps_irat_iu, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
 
        /* bit 7: PS inter-RAT HO to E-UTRAN S1 mode capability */
-       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_ps_irat_s1, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_ps_irat_s1, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
 
-       /* bit 6: CSFB Capability */
-       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_csfb, tvb, curr_offset, 1, FALSE);
+       /* bit 6: EMM Combined procedures capability */
+       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_comb_proc, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
 
        /* bit 5: ISR support */
-       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_isr, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_isr, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
 
        /* bit 4: SRVCC to GERAN/UTRAN capability */
-       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_srvcc_to_geran, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_srvcc_to_geran, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
 
        /* bit 3: EPC capability */
-       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_epc, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_epc, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
 
-       /* bits 2 1: Spare bits */
-       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3)+6, 2, FALSE);
+       /* bit 3: NF capability */
+       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_nf, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+
+       /* bits 1: Spare bit */
+       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3)+7, 1, ENC_BIG_ENDIAN);
 
        curr_offset++;
-       EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+       EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
 
        return(curr_offset - offset);
 }
@@ -1013,20 +1104,167 @@ static const value_string gsm_a_gm_acc_tech_type_vals[] = {
        { 0, NULL }
 };
 
-static const value_string gsm_a_gm_revision_level_indicator_vals[] = {
-       { 0x00, "The ME is Release '98 or older" },
-       { 0x01, "The ME is Release '99 onwards" },
+static const true_false_string gsm_a_gm_vgcs = {
+       "VGCS capability and notifications wanted",
+       "no VGCS capability or no notifications wanted"
+};
+
+static const true_false_string gsm_a_gm_vbs = {
+       "VBS capability and notifications wanted",
+       "no VBS capability or no notifications wanted"
+};
+
+static const value_string gsm_a_gm_multi_slot_vals[] = {
+       { 0x00, "Not specified" },
+       { 0x01, "Max Rx-Slot/TDMA:1 Max Tx-Slot/TDMA:1 Max-Sum-Slot/TDMA:2 Tta:3 Ttb:2 Tra:4 Trb:2 Type:1" },
+       { 0x02, "Max Rx-Slot/TDMA:2 Max Tx-Slot/TDMA:1 Max-Sum-Slot/TDMA:3 Tta:3 Ttb:2 Tra:3 Trb:1 Type:1" },
+       { 0x03, "Max Rx-Slot/TDMA:2 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:3 Tta:3 Ttb:2 Tra:3 Trb:1 Type:1" },
+       { 0x04, "Max Rx-Slot/TDMA:3 Max Tx-Slot/TDMA:1 Max-Sum-Slot/TDMA:4 Tta:3 Ttb:1 Tra:3 Trb:1 Type:1" },
+       { 0x05, "Max Rx-Slot/TDMA:2 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:4 Tta:3 Ttb:1 Tra:3 Trb:1 Type:1" },
+       { 0x06, "Max Rx-Slot/TDMA:3 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:4 Tta:3 Ttb:1 Tra:3 Trb:1 Type:1" },
+       { 0x07, "Max Rx-Slot/TDMA:3 Max Tx-Slot/TDMA:3 Max-Sum-Slot/TDMA:4 Tta:3 Ttb:1 Tra:3 Trb:1 Type:1" },
+       { 0x08, "Max Rx-Slot/TDMA:4 Max Tx-Slot/TDMA:1 Max-Sum-Slot/TDMA:5 Tta:3 Ttb:1 Tra:2 Trb:1 Type:1" },
+       { 0x09, "Max Rx-Slot/TDMA:3 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:5 Tta:3 Ttb:1 Tra:2 Trb:1 Type:1" },
+       { 0x0a, "Max Rx-Slot/TDMA:4 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:5 Tta:3 Ttb:1 Tra:2 Trb:1 Type:1" },
+       { 0x0b, "Max Rx-Slot/TDMA:4 Max Tx-Slot/TDMA:3 Max-Sum-Slot/TDMA:5 Tta:3 Ttb:1 Tra:2 Trb:1 Type:1" },
+       { 0x0c, "Max Rx-Slot/TDMA:4 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:5 Tta:2 Ttb:1 Tra:2 Trb:1 Type:1" },
+       { 0x0d, "Max Rx-Slot/TDMA:3 Max Tx-Slot/TDMA:3 Max-Sum-Slot/TDMA:NA Tta:NA Ttb:a) Tra:3 Trb:a) Type:2 (a: 1 with frequency hopping, 0 otherwise)" },
+       { 0x0e, "Max Rx-Slot/TDMA:4 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:NA Tta:NA Ttb:a) Tra:3 Trb:a) Type:2 (a: 1 with frequency hopping, 0 otherwise)" },
+       { 0x0f, "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:5 Max-Sum-Slot/TDMA:NA Tta:NA Ttb:a) Tra:3 Trb:a) Type:2 (a: 1 with frequency hopping, 0 otherwise)" },
+       { 0x10, "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:6 Max-Sum-Slot/TDMA:NA Tta:NA Ttb:a) Tra:2 Trb:a) Type:2 (a: 1 with frequency hopping, 0 otherwise)" },
+       { 0x11, "Max Rx-Slot/TDMA:7 Max Tx-Slot/TDMA:7 Max-Sum-Slot/TDMA:NA Tta:NA Ttb:a) Tra:1 Trb:0 Type:2 (a: 1 with frequency hopping, 0 otherwise)" },
+       { 0x12, "Max Rx-Slot/TDMA:8 Max Tx-Slot/TDMA:8 Max-Sum-Slot/TDMA:NA Tta:NA Ttb:0 Tra:0 Trb:0 Type:2" },
+       { 0x13, "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise" },
+       { 0x14, "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:3 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise" },
+       { 0x15, "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise" },
+       { 0x16, "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise" },
+       { 0x17, "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:6 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise" },
+       { 0x18, "Max Rx-Slot/TDMA:8 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise" },
+       { 0x19, "Max Rx-Slot/TDMA:8 Max Tx-Slot/TDMA:3 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise" },
+       { 0x1a, "Max Rx-Slot/TDMA:8 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise" },
+       { 0x1b, "Max Rx-Slot/TDMA:8 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise" },
+       { 0x1c, "Max Rx-Slot/TDMA:8 Max Tx-Slot/TDMA:6 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise" },
+       { 0x1d, "Max Rx-Slot/TDMA:8 Max Tx-Slot/TDMA:8 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise" },
+       { 0x1e, "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:1 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1 Trb:1 Type:1" },
+       { 0x1f, "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1 Trb:1 Type:1" },
+       { 0x20, "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:3 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1 Trb:1 Type:1" },
+       { 0x21, "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1 Trb:1 Type:1" },
+       { 0x22, "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:5 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1 Trb:1 Type:1" },
+       { 0x23, "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:1 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1+to Trb:1 Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))" },
+       { 0x24, "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1+to Trb:1 Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))" },
+       { 0x25, "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:3 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1+to Trb:1 Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))" },
+       { 0x26, "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1+to Trb:1 Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))" },
+       { 0x27, "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:5 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1+to Trb:1 Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))" },
+       { 0x28, "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:1 Max-Sum-Slot/TDMA:7 Tta:1 Ttb:1 Tra:1 Trb:to Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))" },
+       { 0x29, "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:7 Tta:1 Ttb:1 Tra:1 Trb:to Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))" },
+       { 0x2a, "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:3 Max-Sum-Slot/TDMA:7 Tta:1 Ttb:1 Tra:1 Trb:to Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))" },
+       { 0x2b, "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:7 Tta:1 Ttb:1 Tra:1 Trb:to Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))" },
+       { 0x2c, "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:5 Max-Sum-Slot/TDMA:7 Tta:1 Ttb:1 Tra:1 Trb:to Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))" },
+       { 0x2d, "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:6 Max-Sum-Slot/TDMA:7 Tta:1 Ttb:1 Tra:1 Trb:to Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))" },
+       { 0, NULL }
+};
+
+static const value_string gsm_a_gm_dtm_gprs_multi_slot_class_vals[] = {
+       { 0x00, "Unused. If received, the network shall interpret this as Multislot class 5" },
+       { 0x01, "Multislot class 5 supported" },
+       { 0x02, "Multislot class 9 supported" },
+       { 0x03, "Multislot class 11 supported" },
+       { 0, NULL }
+};
+
+static const true_false_string gsm_a_gm_revision_level_indicator = {
+       "The ME is Release '99 onwards",
+       "The ME is Release '98 or older"
+};
 
+static const value_string gsm_a_gm_down_adv_rec_perf_vals[] = {
+       { 0x00, "Downlink Advanced Receiver Performance not supported" },
+       { 0x01, "Downlink Advanced Receiver Performance - phase I supported" },
+       { 0x02, "Downlink Advanced Receiver Performance - phase II supported" },
        { 0, NULL }
 };
+
+static const true_false_string gsm_a_gm_dtm_enh_cap = {
+       "The mobile station supports enhanced DTM CS establishment and enhanced DTM CS release procedures",
+       "The mobile station does not support enhanced DTM CS establishment and enhanced DTM CS release procedures"
+};
+
+static const value_string gsm_a_gm_dtm_gprs_high_multi_slot_class_vals[] = {
+       { 0x00, "Unused. If received, the network shall interpret this as 'Multislot class 31 or 36 supported'" },
+       { 0x01, "Multislot class 31 or 36 supported" },
+       { 0x02, "Multislot class 32 or 37 supported" },
+       { 0x03, "Multislot class 33 or 38 supported" },
+       { 0x04, "Multislot class 41 supported" },
+       { 0x05, "Multislot class 42 supported" },
+       { 0x06, "Multislot class 43 supported" },
+       { 0x07, "Multislot class 44 supported" },
+       { 0, NULL }
+};
+
+static const value_string gsm_a_gm_multi_slot_cap_red_down_dual_carrier_vals[] = {
+       { 0x00, "No reduction" },
+       { 0x01, "The MS supports 1 timeslot fewer than the maximum number of receive timeslots" },
+       { 0x02, "The MS supports 2 timeslots fewer than the maximum number of receive timeslots" },
+       { 0x03, "The MS supports 3 timeslots fewer than the maximum number of receive timeslots" },
+       { 0x04, "The MS supports 4 timeslots fewer than the maximum number of receive timeslots" },
+       { 0x05, "The MS supports 5 timeslots fewer than the maximum number of receive timeslots" },
+       { 0x06, "The MS supports 6 timeslots fewer than the maximum number of receive timeslots" },
+       { 0x07, "Reserved for future use" },
+       { 0, NULL }
+};
+
+static const value_string gsm_a_gm_ul_egprs2_vals[] = {
+       { 0x00, "The mobile station does not support either EGPRS2-A or EGPRS2-B in the uplink" },
+       { 0x01, "The mobile station supports EGPRS2-A in the uplink" },
+       { 0x02, "The mobile station supports both EGPRS2-A and EGPRS2-B in the uplink" },
+       { 0x03, "This value is not used in this release/version of the specifications. If received it shall be interpreted as 'The mobile station supports both EGPRS2-A and EGPRS2-B in the uplink'" },
+       { 0, NULL }
+};
+
+static const value_string gsm_a_gm_dl_egprs2_vals[] = {
+       { 0x00, "The mobile station does not support either EGPRS2-A or EGPRS2-B in the downlink" },
+       { 0x01, "The mobile station supports EGPRS2-A in the downlink" },
+       { 0x02, "The mobile station supports both EGPRS2-A and EGPRS2-B in the downlink" },
+       { 0x03, "This value is not used in this release/version of the specifications. If received it shall be interpreted as 'The mobile station supports both EGPRS2-A and EGPRS2-B in the downlink'" },
+       { 0, NULL }
+};
+
+static const value_string gsm_a_gm_geran_to_eutra_support_in_geran_ptm_vals[] = {
+       { 0x00, "None" },
+       { 0x01, "E-UTRAN Neighbour Cell measurements and MS autonomous cell reselection to E-UTRAN supported" },
+       { 0x02, "CCN towards E-UTRAN, E-UTRAN Neighbour Cell measurement reporting and Network controlled cell reselection to E-UTRAN supported in addition to capabilities indicated by '01'" },
+       { 0x03, "PS Handover to E-UTRAN supported in addition to capabilities indicated by '01' and '10'" },
+       { 0, NULL }
+};
+
+static const value_string gsm_a_gm_alt_efta_multi_slot_class_vals[] = {
+       { 0x00, "No Alternative EFTA multislot class is indicated. Use (DTM) EGPRS (high) multislot class only" },
+       { 0x01, "Alternative EFTA multislot class is Multislot class 19" },
+       { 0x02, "Alternative EFTA multislot class is Multislot class 20" },
+       { 0x03, "Alternative EFTA multislot class is Multislot class 21" },
+       { 0x04, "Alternative EFTA multislot class is Multislot class 22" },
+       { 0x05, "Alternative EFTA multislot class is Multislot class 23" },
+       { 0x06, "Alternative EFTA multislot class is Multislot class 24" },
+       { 0x07, "Alternative EFTA multislot class is Multislot class 25" },
+       { 0x08, "Alternative EFTA multislot class is Multislot class 26" },
+       { 0x09, "Alternative EFTA multislot class is Multislot class 27" },
+       { 0x0a, "Alternative EFTA multislot class is Multislot class 28" },
+       { 0x0b, "Alternative EFTA multislot class is Multislot class 29" },
+       { 0x0c, "Unused" },
+       { 0x0d, "Unused" },
+       { 0x0e, "Unused" },
+       { 0x0f, "Unused" },
+       { 0, NULL }
+};
+
 guint16
-de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
 {
        guint32      curr_offset;
        guint        curr_len;
        int          bit_offset;
-       proto_item  *tf = NULL;
-       proto_tree  *tf_tree = NULL;
+       proto_item  *tf = NULL, *mc_item = NULL;
+       proto_tree  *tf_tree = NULL, *mc_tree = NULL;
        guint32      oct;
        guchar       bits_in_oct;
        guchar       bits_needed;
@@ -1036,73 +1274,6 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
        guchar       acc_type;
        guint        value;
        const gchar *str;
-       /** XXX: AFAIT only the first 32 entries of the following are actually used. Is this a bug someplace ?? */
-       static const gchar *multi_slot_str[64] = {
-               "Not specified", /* 00 */
-               "Max Rx-Slot/TDMA:1 Max Tx-Slot/TDMA:1 Max-Sum-Slot/TDMA:2 Tta:3 Ttb:2 Tra:4 Trb:2 Type:1", /* 01 */
-               "Max Rx-Slot/TDMA:2 Max Tx-Slot/TDMA:1 Max-Sum-Slot/TDMA:3 Tta:3 Ttb:2 Tra:3 Trb:1 Type:1", /* 02 */
-               "Max Rx-Slot/TDMA:2 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:3 Tta:3 Ttb:2 Tra:3 Trb:1 Type:1", /* 03 */
-               "Max Rx-Slot/TDMA:3 Max Tx-Slot/TDMA:1 Max-Sum-Slot/TDMA:4 Tta:3 Ttb:1 Tra:3 Trb:1 Type:1", /* 04 */
-               "Max Rx-Slot/TDMA:2 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:4 Tta:3 Ttb:1 Tra:3 Trb:1 Type:1", /* 05 */
-               "Max Rx-Slot/TDMA:3 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:4 Tta:3 Ttb:1 Tra:3 Trb:1 Type:1", /* 06 */
-               "Max Rx-Slot/TDMA:3 Max Tx-Slot/TDMA:3 Max-Sum-Slot/TDMA:4 Tta:3 Ttb:1 Tra:3 Trb:1 Type:1", /* 07 */
-               "Max Rx-Slot/TDMA:4 Max Tx-Slot/TDMA:1 Max-Sum-Slot/TDMA:5 Tta:3 Ttb:1 Tra:2 Trb:1 Type:1", /* 08 */
-               "Max Rx-Slot/TDMA:3 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:5 Tta:3 Ttb:1 Tra:2 Trb:1 Type:1", /* 09 */
-               "Max Rx-Slot/TDMA:4 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:5 Tta:3 Ttb:1 Tra:2 Trb:1 Type:1", /* 10 */
-               "Max Rx-Slot/TDMA:4 Max Tx-Slot/TDMA:3 Max-Sum-Slot/TDMA:5 Tta:3 Ttb:1 Tra:2 Trb:1 Type:1", /* 11 */
-               "Max Rx-Slot/TDMA:4 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:5 Tta:2 Ttb:1 Tra:2 Trb:1 Type:1", /* 12 */
-               "Max Rx-Slot/TDMA:3 Max Tx-Slot/TDMA:3 Max-Sum-Slot/TDMA:NA Tta:NA Ttb:a) Tra:3 Trb:a) Type:2 (a: 1 with frequency hopping, 0 otherwise)", /* 13 */
-               "Max Rx-Slot/TDMA:4 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:NA Tta:NA Ttb:a) Tra:3 Trb:a) Type:2 (a: 1 with frequency hopping, 0 otherwise)", /* 14 */
-               "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:5 Max-Sum-Slot/TDMA:NA Tta:NA Ttb:a) Tra:3 Trb:a) Type:2 (a: 1 with frequency hopping, 0 otherwise)", /* 15 */
-               "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:6 Max-Sum-Slot/TDMA:NA Tta:NA Ttb:a) Tra:2 Trb:a) Type:2 (a: 1 with frequency hopping, 0 otherwise)", /* 16 */
-               "Max Rx-Slot/TDMA:7 Max Tx-Slot/TDMA:7 Max-Sum-Slot/TDMA:NA Tta:NA Ttb:a) Tra:1 Trb:0 Type:2 (a: 1 with frequency hopping, 0 otherwise)", /* 17 */
-               "Max Rx-Slot/TDMA:8 Max Tx-Slot/TDMA:8 Max-Sum-Slot/TDMA:NA Tta:NA Ttb:0 Tra:0 Trb:0 Type:2", /* 18 */
-               "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise", /* 19 */
-               "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:3 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise", /* 20 */
-               "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise", /* 21 */
-               "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise", /* 22 */
-               "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:6 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise", /* 23 */
-               "Max Rx-Slot/TDMA:8 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise", /* 24 */
-               "Max Rx-Slot/TDMA:8 Max Tx-Slot/TDMA:3 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise", /* 25 */
-               "Max Rx-Slot/TDMA:8 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise", /* 26 */
-               "Max Rx-Slot/TDMA:8 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise", /* 27 */
-               "Max Rx-Slot/TDMA:8 Max Tx-Slot/TDMA:6 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise", /* 28 */
-               "Max Rx-Slot/TDMA:8 Max Tx-Slot/TDMA:8 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise", /* 29 */
-               "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:1 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1 Trb:1 Type:1", /* 30 */
-               "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1 Trb:1 Type:1", /* 31 */
-               "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:3 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1 Trb:1 Type:1", /* 32 */
-               "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1 Trb:1 Type:1", /* 33 */
-               "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:5 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1 Trb:1 Type:1", /* 34 */
-               "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:1 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1+to Trb:1 Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))", /* 35 */
-               "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1+to Trb:1 Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))", /* 36 */
-               "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:3 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1+to Trb:1 Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))", /* 37 */
-               "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1+to Trb:1 Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))", /* 38 */
-               "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:5 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1+to Trb:1 Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))", /* 39 */
-               "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:1 Max-Sum-Slot/TDMA:7 Tta:1 Ttb:1 Tra:1 Trb:to Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))", /* 40 */
-               "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:7 Tta:1 Ttb:1 Tra:1 Trb:to Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))", /* 41 */
-               "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:3 Max-Sum-Slot/TDMA:7 Tta:1 Ttb:1 Tra:1 Trb:to Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))", /* 42 */
-               "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:7 Tta:1 Ttb:1 Tra:1 Trb:to Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))", /* 43 */
-               "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:5 Max-Sum-Slot/TDMA:7 Tta:1 Ttb:1 Tra:1 Trb:to Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))", /* 44 */
-               "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:6 Max-Sum-Slot/TDMA:7 Tta:1 Ttb:1 Tra:1 Trb:to Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))", /* 45 */
-               "Not specified", /* 46 */
-               "Not specified", /* 47 */
-               "Not specified", /* 48 */
-               "Not specified", /* 49 */
-               "Not specified", /* 50 */
-               "Not specified", /* 51 */
-               "Not specified", /* 52 */
-               "Not specified", /* 53 */
-               "Not specified", /* 54 */
-               "Not specified", /* 55 */
-               "Not specified", /* 56 */
-               "Not specified", /* 57 */
-               "Not specified", /* 58 */
-               "Not specified", /* 59 */
-               "Not specified", /* 60 */
-               "Not specified", /* 61 */
-               "Not specified", /* 62 */
-               "Not specified", /* 63 */
-       };
        guint indx = 0;
        guchar dtm_gprs_mslot = 0;
        guchar dtm_egprs_mslot = 4;
@@ -1137,6 +1308,7 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
                                curr_bits_length -= bits_needed;
                                oct <<= bits_needed;
                                bits_in_oct -= bits_needed;
+                               bit_offset++;
 
                                if (( curr_len*8 + bits_in_oct ) < 11 )
                                        break;
@@ -1147,6 +1319,7 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
                                curr_bits_length -= bits_needed;
                                oct <<= bits_needed;
                                bits_in_oct -= bits_needed;
+                               bit_offset++;
                                break;
                        }
                }
@@ -1166,7 +1339,7 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
 
                acc_type = oct>>(32-bits_needed);
 
-               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_acc_tech_type, tvb, bit_offset, 4, FALSE);
+               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_acc_tech_type, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
                bit_offset+=4;
 
                curr_bits_length -= bits_needed;
@@ -1181,7 +1354,8 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
                GET_DATA;
 
                bits_length = curr_bits_length = oct>>(32-bits_needed);
-               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_acc_cap_struct_len, tvb, bit_offset, 7, FALSE);
+
+               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_acc_cap_struct_len, tvb, bit_offset, 7, ENC_BIG_ENDIAN);
                proto_item_set_len(tf, (bits_length>>3)+1);
                /* This is already done - length doesn't contain this field
                 curr_bits_length -= bits_needed;
@@ -1249,7 +1423,7 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
 
                                acc_type = oct>>(32-bits_needed);
 
-                               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_acc_cap_struct_len, tvb, bit_offset, 7, FALSE);
+                               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_acc_cap_struct_len, tvb, bit_offset, 7, ENC_BIG_ENDIAN);
                                bit_offset+=4;
 
                                curr_bits_length -= bits_needed;
@@ -1461,17 +1635,7 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
                bits_needed = 1;
                GET_DATA;
 
-               /* analyse bits */
-               switch ( oct>>(32-bits_needed) )
-               {
-                       case 0x00: str="controlled early Classmark Sending option is not implemented"; break;
-                       case 0x01: str="controlled early Classmark Sending option is implemented";     break;
-                       default:   str="This should not happen";
-               }
-
-               proto_tree_add_text(tf_tree,
-                       tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
-                       "Controlled early Classmark Sending: %s (%u)",str,oct>>(32-bits_needed));
+               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_ctrled_early_cm_sending, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
                bit_offset++;
                curr_bits_length -= bits_needed;
                oct <<= bits_needed;
@@ -1483,17 +1647,7 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
                bits_needed = 1;
                GET_DATA;
 
-               /* analyse bits */
-               switch ( oct>>(32-bits_needed) )
-               {
-                       case 0x00: str="PS capability not present"; break;
-                       case 0x01: str="PS capability present";     break;
-                       default:   str="This should not happen";
-               }
-
-               proto_tree_add_text(tf_tree,
-                       tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
-                       "Pseudo Synchronisation: %s (%u)",str,oct>>(32-bits_needed));
+               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_pseudo_sync, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
                bit_offset++;
                curr_bits_length -= bits_needed;
                oct <<= bits_needed;
@@ -1505,17 +1659,7 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
                bits_needed = 1;
                GET_DATA;
 
-               /* analyse bits */
-               switch ( oct>>(32-bits_needed) )
-               {
-                       case 0x00: str="no VGCS capability or no notifications wanted"; break;
-                       case 0x01: str="VGCS capability and notifications wanted";      break;
-                       default:   str="This should not happen";
-               }
-
-               proto_tree_add_text(tf_tree,
-                       tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
-                       "Voice Group Call Service: %s (%u)",str,oct>>(32-bits_needed));
+               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_vgcs, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
                bit_offset++;
                curr_bits_length -= bits_needed;
                oct <<= bits_needed;
@@ -1527,17 +1671,7 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
                bits_needed = 1;
                GET_DATA;
 
-               /* analyse bits */
-               switch ( oct>>(32-bits_needed) )
-               {
-                       case 0x00: str="no VBS capability or no notifications wanted"; break;
-                       case 0x01: str="VBS capability and notifications wanted";      break;
-                       default:   str="This should not happen";
-               }
-
-               proto_tree_add_text(tf_tree,
-                       tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
-                       "Voice Broadcast Service: %s (%u)",str,oct>>(32-bits_needed));
+               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_vbs, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
                bit_offset++;
                curr_bits_length -= bits_needed;
                oct <<= bits_needed;
@@ -1549,28 +1683,19 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
                bits_needed = 1;
                GET_DATA;
 
-               /* analyse bits */
-               if ((oct>>(32-bits_needed))==0)
-               {
-                       proto_tree_add_text(tf_tree,
-                               tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
-                               "Multislot capability: Same values apply for parameters as in the immediately preceding Access capabilities field within this IE (%u)",oct>>(32-bits_needed));
-                       bit_offset++;
-                       curr_bits_length -= bits_needed;
-                       oct <<= bits_needed;
-                       bits_in_oct -= bits_needed;
-               }
-               else
-               {
-                       proto_tree_add_text(tf_tree,
-                       tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
-                       "Multislot capability: Multislot capability struct available (%u)",oct>>(32-bits_needed));
-                       bit_offset++;
+               value = oct>>(32-bits_needed);
 
-                       curr_bits_length -= bits_needed;
-                       oct <<= bits_needed;
-                       bits_in_oct -= bits_needed;
+               mc_item = proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_multislot_capability, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+               bit_offset++;
+
+               curr_bits_length -= bits_needed;
+               oct <<= bits_needed;
+               bits_in_oct -= bits_needed;
 
+               /* analyse bits */
+               if (value==1)
+               {
+                       mc_tree = proto_item_add_subtree(mc_item, ett_gsm_a_gm_msrac_multislot_capability);
                        /*
                         * HSCSD multislot class?
                         */
@@ -1580,7 +1705,7 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
                        /* analyse bits */
                        if ((oct>>(32-bits_needed))==0)
                        {
-                               proto_tree_add_text(tf_tree,
+                               proto_tree_add_text(mc_tree,
                                        tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
                                        "HSCSD multislot class: Bits are not available (%u)",oct>>(32-bits_needed));
                                bit_offset++;
@@ -1601,10 +1726,7 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
                                bits_needed = 5;
                                GET_DATA;
 
-                               /* analyse bits */
-                               proto_tree_add_text(tf_tree,
-                                       tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
-                                       "HSCSD multislot class: %s (%u)",multi_slot_str[oct>>(32-bits_needed)],oct>>(32-bits_needed));
+                               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_hscsd_multi_slot_class, tvb, bit_offset, 5, ENC_BIG_ENDIAN);
                                bit_offset+=5;
                                curr_bits_length -= bits_needed;
                                oct <<= bits_needed;
@@ -1620,7 +1742,7 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
                        /* analyse bits */
                        if ((oct>>(32-bits_needed))==0)
                        {
-                               proto_tree_add_text(tf_tree,
+                               proto_tree_add_text(mc_tree,
                                        tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
                                        "GPRS multislot class: Bits are not available (%u)",oct>>(32-bits_needed));
                                bit_offset++;
@@ -1641,10 +1763,7 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
                                bits_needed = 5;
                                GET_DATA;
 
-                               /* analyse bits */
-                               proto_tree_add_text(tf_tree,
-                                       tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
-                                       "GPRS multislot class: %s (%u)",multi_slot_str[oct>>(32-bits_needed)],oct>>(32-bits_needed));
+                               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_gprs_multi_slot_class, tvb, bit_offset, 5, ENC_BIG_ENDIAN);
                                bit_offset+=5;
                                curr_bits_length -= bits_needed;
                                oct <<= bits_needed;
@@ -1656,16 +1775,7 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
                                bits_needed = 1;
                                GET_DATA;
 
-                               /* analyse bits */
-                               switch ( oct>>(32-bits_needed) )
-                               {
-                                       case 0x00: str="Extended Dynamic Allocation Capability for GPRS is not implemented"; break;
-                                       case 0x01: str="Extended Dynamic Allocation Capability for GPRS is implemented";     break;
-                                       default:   str="This should not happen";
-                               }
-                               proto_tree_add_text(tf_tree,
-                                       tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
-                                       "GPRS Extended Dynamic Allocation Capability: %s (%u)",str,oct>>(32-bits_needed));
+                               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_gprs_ext_dyn_alloc_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
                                bit_offset++;
                                curr_bits_length -= bits_needed;
                                oct <<= bits_needed;
@@ -1681,7 +1791,7 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
                        /* analyse bits */
                        if ((oct>>(32-bits_needed))==0)
                        {
-                               proto_tree_add_text(tf_tree,
+                               proto_tree_add_text(mc_tree,
                                        tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
                                        "SMS/SM values: Bits are not available (%u)",oct>>(32-bits_needed));
                                bit_offset++;
@@ -1703,7 +1813,7 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
                                GET_DATA;
 
                                /* analyse bits */
-                               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_sms_value, tvb, bit_offset, 4, FALSE);
+                               proto_tree_add_bits_item(mc_tree, hf_gsm_a_gm_sms_value, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
                                bit_offset+=4;
                                curr_bits_length -= bits_needed;
                                oct <<= bits_needed;
@@ -1716,7 +1826,7 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
                                GET_DATA;
 
                                /* analyse bits */
-                               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_sm_value, tvb, bit_offset, 4, FALSE);
+                               proto_tree_add_bits_item(mc_tree, hf_gsm_a_gm_sm_value, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
                                bit_offset+=4;
                                curr_bits_length -= bits_needed;
                                oct <<= bits_needed;
@@ -1732,7 +1842,7 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
                        /* analyse bits */
                        if ((oct>>(32-bits_needed))==0)
                        {
-                               proto_tree_add_text(tf_tree,
+                               proto_tree_add_text(mc_tree,
                                        tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
                                        "ECSD multislot class: Bits are not available (%u)",oct>>(32-bits_needed));
                                bit_offset++;
@@ -1753,10 +1863,7 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
                                bits_needed = 5;
                                GET_DATA;
 
-                               /* analyse bits */
-                               proto_tree_add_text(tf_tree,
-                                       tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
-                                       "ECSD multislot class: %s (%u)",multi_slot_str[oct>>(32-bits_needed)],oct>>(32-bits_needed));
+                               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_ecsd_multi_slot_class, tvb, bit_offset, 5, ENC_BIG_ENDIAN);
                                bit_offset+=5;
                                curr_bits_length -= bits_needed;
                                oct <<= bits_needed;
@@ -1772,7 +1879,7 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
                        /* analyse bits */
                        if ((oct>>(32-bits_needed))==0)
                        {
-                               proto_tree_add_text(tf_tree,
+                               proto_tree_add_text(mc_tree,
                                        tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
                                        "EGPRS multislot class: Bits are not available (%u)",oct>>(32-bits_needed));
                                curr_bits_length -= bits_needed;
@@ -1793,10 +1900,7 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
                                bits_needed = 5;
                                GET_DATA;
 
-                               /* analyse bits */
-                               proto_tree_add_text(tf_tree,
-                               tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
-                               "EGPRS multislot class: %s (%u)",multi_slot_str[oct>>(32-bits_needed)],oct>>(32-bits_needed));
+                               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_egprs_multi_slot_class, tvb, bit_offset, 5, ENC_BIG_ENDIAN);
                                bit_offset+=5;
                                curr_bits_length -= bits_needed;
                                oct <<= bits_needed;
@@ -1808,16 +1912,7 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
                                bits_needed = 1;
                                GET_DATA;
 
-                               /* analyse bits */
-                               switch ( oct>>(32-bits_needed) )
-                               {
-                                       case 0x00: str="Extended Dynamic Allocation Capability for EGPRS is not implemented"; break;
-                                       case 0x01: str="Extended Dynamic Allocation Capability for EGPRS is implemented";     break;
-                                       default:   str="This should not happen";
-                               }
-                               proto_tree_add_text(tf_tree,
-                                       tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
-                                       "EGPRS Extended Dynamic Allocation Capability: %s (%u)",str, oct>>(32-bits_needed));
+                               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_egprs_ext_dyn_alloc_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
                                bit_offset++;
                                curr_bits_length -= bits_needed;
                                oct <<= bits_needed;
@@ -1833,7 +1928,7 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
                        /* analyse bits */
                        if ((oct>>(32-bits_needed))==0)
                        {
-                               proto_tree_add_text(tf_tree,
+                               proto_tree_add_text(mc_tree,
                                        tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
                                        "DTM GPRS Multi Slot Class: Bits are not available (%u)",oct>>(32-bits_needed));
                                bit_offset++;
@@ -1857,18 +1952,7 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
                                /* analyse bits */
                                dtm_gprs_mslot = oct>>(32-bits_needed);
 
-                               switch ( oct>>(32-bits_needed) )
-                               {
-                                       case 0:  str="Unused. If received, the network shall interpret this as Multislot class 5"; break;
-                                       case 1:  str="Multislot class 5 supported";  break;
-                                       case 2:  str="Multislot class 9 supported";  break;
-                                       case 3:  str="Multislot class 11 supported"; break;
-                                       default: str="This should not happen";
-                               }
-
-                               proto_tree_add_text(tf_tree,
-                                       tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
-                                       "DTM GPRS Multi Slot Class: %s (%u)",str,oct>>(32-bits_needed));
+                               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_dtm_gprs_multi_slot_class, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
                                bit_offset+=2;
                                curr_bits_length -= bits_needed;
                                oct <<= bits_needed;
@@ -1880,16 +1964,7 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
                                bits_needed = 1;
                                GET_DATA;
 
-                               /* analyse bits */
-                               switch ( oct>>(32-bits_needed) )
-                               {
-                                       case 0x00: str="Single Slot DTM not supported"; break;
-                                       case 0x01: str="Single Slot DTM supported";     break;
-                                       default:   str="This should not happen";
-                               }
-                               proto_tree_add_text(tf_tree,
-                                       tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
-                                       "Single Slot DTM: %s (%u)",str,oct>>(32-bits_needed));
+                               proto_tree_add_bits_item(mc_tree, hf_gsm_a_gm_rac_single_slt_dtm, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
                                bit_offset++;
                                curr_bits_length -= bits_needed;
                                oct <<= bits_needed;
@@ -1903,43 +1978,21 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
 
                                /* analyse bits */
                                dtm_egprs_mslot = oct>>(32-bits_needed);
+                               proto_tree_add_bits_item(mc_tree, hf_gsm_a_gm_rac_dtm_egprs_multi_slot_cls_pres, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+                               bit_offset++;
+                               curr_bits_length -= bits_needed;
+                               oct <<= bits_needed;
+                               bits_in_oct -= bits_needed;
 
-                               if ((oct>>(32-bits_needed))==0)
+                               if ((oct>>(32-bits_needed))==1)
                                {
-                                       proto_tree_add_text(tf_tree,
-                                               tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
-                                               "DTM EGPRS Multi Slot Class: Bits are not available (%u)",oct>>(32-bits_needed));
-                                       bit_offset++;
-                                       curr_bits_length -= bits_needed;
-                                       oct <<= bits_needed;
-                                       bits_in_oct -= bits_needed;
-                               }
-                               else
-                               {
-                                       curr_bits_length -= bits_needed;
-                                       oct <<= bits_needed;
-                                       bits_in_oct -= bits_needed;
-                                       bit_offset++;
-
                                        /*
                                         * DTM EGPRS Multi Slot Class
                                         */
                                        bits_needed = 2;
                                        GET_DATA;
 
-                                       /* analyse bits */
-                                       switch ( oct>>(32-bits_needed) )
-                                       {
-                                               case 0: str="Unused. If received, the network shall interpret this as Multislot class 5"; break;
-                                               case 1:  str="Multislot class 5 supported";  break;
-                                               case 2:  str="Multislot class 9 supported";  break;
-                                               case 3:  str="Multislot class 11 supported"; break;
-                                               default: str="This should not happen";
-                                       }
-
-                                       proto_tree_add_text(tf_tree,
-                                               tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
-                                               "DTM EGPRS Multi Slot Class: %s (%u)",str,oct>>(32-bits_needed));
+                                       proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_dtm_egprs_multi_slot_class, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
                                        bit_offset+=2;
                                        curr_bits_length -= bits_needed;
                                        oct <<= bits_needed;
@@ -1954,24 +2007,15 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
                bits_needed = 1;
                GET_DATA;
 
+               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_8psk_pow_cap_pres, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+               bit_offset++;
+               curr_bits_length -= bits_needed;
+               oct <<= bits_needed;
+               bits_in_oct -= bits_needed;
+
                /* analyse bits */
-               if ((oct>>(32-bits_needed))==0)
-               {
-                       proto_tree_add_text(tf_tree,
-                               tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
-                               "8PSK Power Capability: Bits are not available (%u)",oct>>(32-bits_needed));
-                       bit_offset++;
-                       curr_bits_length -= bits_needed;
-                       oct <<= bits_needed;
-                       bits_in_oct -= bits_needed;
-               }
-               else
+               if ((oct>>(32-bits_needed))==1)
                {
-                       curr_bits_length -= bits_needed;
-                       oct <<= bits_needed;
-                       bits_in_oct -= bits_needed;
-                       bit_offset++;
-
                        /*
                         * 8PSK Power Capability
                         */
@@ -2003,17 +2047,7 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
                bits_needed = 1;
                GET_DATA;
 
-               /* analyse bits */
-               switch ( oct>>(32-bits_needed) )
-               {
-                       case 0x00: str="COMPACT Interference Measurement Capability is not implemented"; break;
-                       case 0x01: str="COMPACT Interference Measurement Capability is implemented";     break;
-                       default:   str="This should not happen";
-               }
-
-               proto_tree_add_text(tf_tree,
-                       tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
-                       "COMPACT Interference Measurement Capability: %s (%u)", str, oct>>(32-bits_needed));
+               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_comp_int_meas_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
                bit_offset++;
                curr_bits_length -= bits_needed;
                oct <<= bits_needed;
@@ -2025,7 +2059,7 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
                bits_needed = 1;
                GET_DATA;
 
-               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rel_lev_ind, tvb, bit_offset, 1, FALSE);
+               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rel_lev_ind, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
                bit_offset++;
                curr_bits_length -= bits_needed;
                oct <<= bits_needed;
@@ -2037,17 +2071,7 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
                bits_needed = 1;
                GET_DATA;
 
-               /* analyse bits */
-               switch ( oct>>(32-bits_needed) )
-               {
-                       case 0x00: str="UMTS FDD not supported"; break;
-                       case 0x01: str="UMTS FDD supported";     break;
-                       default:   str="This should not happen";
-               }
-
-               proto_tree_add_text(tf_tree,
-                       tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
-                       "UMTS FDD Radio Access Technology Capability: %s (%u)",str,oct>>(32-bits_needed));
+               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_umts_fdd_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
                bit_offset++;
                curr_bits_length -= bits_needed;
                oct <<= bits_needed;
@@ -2059,17 +2083,7 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
                bits_needed = 1;
                GET_DATA;
 
-       /* analyse bits */
-               switch ( oct>>(32-bits_needed) )
-               {
-                       case 0x00: str="UMTS 3.84 Mcps TDD not supported"; break;
-                       case 0x01: str="UMTS 3.84 Mcps TDD supported";     break;
-                       default:   str="This should not happen";
-               }
-
-               proto_tree_add_text(tf_tree,
-                       tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
-                       "UMTS 3.84 Mcps TDD Radio Access Technology Capability: %s (%u)",str,oct>>(32-bits_needed));
+               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_umts_384_tdd_ra_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
                bit_offset++;
                curr_bits_length -= bits_needed;
                oct <<= bits_needed;
@@ -2081,17 +2095,7 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
                bits_needed = 1;
                GET_DATA;
 
-               /* analyse bits */
-               switch ( oct>>(32-bits_needed) )
-               {
-                       case 0x00: str="CDMA 2000 not supported"; break;
-                       case 0x01: str="CDMA 2000 supported";     break;
-                       default:   str="This should not happen";
-               }
-
-               proto_tree_add_text(tf_tree,
-                       tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
-                       "CDMA 2000 Radio Access Technology Capability: %s (%u)",str,oct>>(32-bits_needed));
+               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_cdma2000_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
                bit_offset++;
                curr_bits_length -= bits_needed;
                oct <<= bits_needed;
@@ -2103,17 +2107,7 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
                bits_needed = 1;
                GET_DATA;
 
-               /* analyse bits */
-               switch ( oct>>(32-bits_needed) )
-               {
-                       case 0x00: str="UMTS 1.28 Mcps TDD not supported"; break;
-                       case 0x01: str="UMTS 1.28 Mcps TDD supported";     break;
-                       default:   str="This should not happen";
-               }
-
-               proto_tree_add_text(tf_tree,
-                       tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
-                       "UMTS 1.28 Mcps TDD Radio Access Technology Capability: %s (%u)",str,oct>>(32-bits_needed));
+               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_umts_128_tdd_ra_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
                bit_offset++;
                curr_bits_length -= bits_needed;
                oct <<= bits_needed;
@@ -2125,17 +2119,7 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
                bits_needed = 1;
                GET_DATA;
 
-               /* analyse bits */
-               switch ( oct>>(32-bits_needed) )
-               {
-                       case 0x00: str="GERAN feature package 1 not supported"; break;
-                       case 0x01: str="GERAN feature package 1 supported";     break;
-                       default:   str="This should not happen";
-               }
-
-               proto_tree_add_text(tf_tree,
-               tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
-               "GERAN Feature Package 1: %s (%u)",str,oct>>(32-bits_needed));
+               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_geran_feat_pkg, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
                bit_offset++;
                curr_bits_length -= bits_needed;
                oct <<= bits_needed;
@@ -2144,6 +2128,7 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
                /*
                 * Extended DTM (E)GPRS Multi Slot Class
                 */
+
                bits_needed = 1;
                GET_DATA;
 
@@ -2163,6 +2148,7 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
                        curr_bits_length -= bits_needed;
                        oct <<= bits_needed;
                        bits_in_oct -= bits_needed;
+                       bit_offset++;
 
                        /*
                         * Extended DTM GPRS Multi Slot Class
@@ -2241,167 +2227,543 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
                }
 
                /*
-                * Modulation based multislot class support
+                * Modulation based multislot class support
+                */
+               bits_needed = 1;
+               GET_DATA;
+
+               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_mod_based_multi_slot_class_support, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+               bit_offset++;
+               curr_bits_length -= bits_needed;
+               oct <<= bits_needed;
+               bits_in_oct -= bits_needed;
+
+               /*
+                * High Multislot Capability
+                */
+               bits_needed = 1;
+               GET_DATA;
+
+               /* analyse bits */
+               if ((oct>>(32-bits_needed))==0)
+               {
+                       proto_tree_add_text(tf_tree,
+                               tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
+                               "High Multislot Capability: Bits are not available (%u)",oct>>(32-bits_needed));
+                       bit_offset++;
+                       curr_bits_length -= bits_needed;
+                       oct <<= bits_needed;
+                       bits_in_oct -= bits_needed;
+               }
+               else
+               {
+                       curr_bits_length -= bits_needed;
+                       oct <<= bits_needed;
+                       bits_in_oct -= bits_needed;
+                       bit_offset++;
+
+                       /*
+                        * High Multislot Capability
+                        */
+                       bits_needed = 2;
+                       GET_DATA;
+
+                       /* analyse bits */
+                       proto_tree_add_text(tf_tree,
+                       tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
+                                           "High Multislot Capability: 0x%02x (%u)"
+                                           " - This field effect all other multislot fields."
+                                           " To understand the value please read TS 24.008 5.6.0"
+                                           " Release 5 Chap 10.5.5.12 Page 406",
+                                           oct>>(32-bits_needed),
+                                           oct>>(32-bits_needed));
+                       bit_offset+=2;
+                       curr_bits_length -= bits_needed;
+                       oct <<= bits_needed;
+                       bits_in_oct -= bits_needed;
+               }
+
+               /*
+                * GERAN Iu Mode Capability
+                */
+               bits_needed = 1;
+               GET_DATA;
+
+               value = tvb_get_bits8(tvb, bit_offset, 1);
+               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_geran_iu_mode_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+               bit_offset+=bits_needed;
+               curr_bits_length -= bits_needed;
+               oct <<= bits_needed;
+               bits_in_oct -= bits_needed;
+               if (value)
+               {
+                       /* GERAN Iu Mode Capabilities struct present */
+                       bits_needed = 4;
+                       GET_DATA;
+                       value = tvb_get_bits8(tvb, bit_offset, 4);
+                       bit_offset+=bits_needed;
+                       curr_bits_length -= bits_needed;
+                       oct <<= bits_needed;
+                       bits_in_oct -= bits_needed;
+                       if (value)
+                       {
+                               /*
+                                * FLO Iu Capability
+                                */
+                               bits_needed = 1;
+                               GET_DATA;
+                               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_flo_iu_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+                               bit_offset+=bits_needed;
+                               curr_bits_length -= bits_needed;
+                               oct <<= bits_needed;
+                               bits_in_oct -= bits_needed;
+                               value--;
+                               
+                               /* skip spare bits */
+                               bit_offset+=value;
+                               curr_bits_length -= value;
+                               oct <<= value;
+                               bits_in_oct -= value;
+                       }
+               }
+
+               /*
+                * GMSK Multislot Power Profile
+                */
+               bits_needed = 2;
+               GET_DATA;
+
+               /* analyse bits */
+               switch ( oct>>(32-bits_needed) )
+               {
+                       case 0x00: str="GMSK_MULTISLOT_POWER_PROFILE 0"; break;
+                       case 0x01: str="GMSK_MULTISLOT_POWER_PROFILE 1"; break;
+                       case 0x02: str="GMSK_MULTISLOT_POWER_PROFILE 2"; break;
+                       case 0x03: str="GMSK_MULTISLOT_POWER_PROFILE 3"; break;
+                       default:   str="This should not happen";
+               }
+
+               proto_tree_add_text(tf_tree,
+                       tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
+                       "GMSK Multislot Power Profile: %s (%u)",str,oct>>(32-bits_needed));
+               bit_offset+=2;
+               curr_bits_length -= bits_needed;
+               oct <<= bits_needed;
+               bits_in_oct -= bits_needed;
+
+               /*
+                * 8-PSK Multislot Power Profile
+                */
+               bits_needed = 2;
+               GET_DATA;
+
+               /* analyse bits */
+               switch ( oct>>(32-bits_needed) )
+               {
+                       case 0x00: str="8-PSK_MULTISLOT_POWER_PROFILE 0"; break;
+                       case 0x01: str="8-PSK_MULTISLOT_POWER_PROFILE 1"; break;
+                       case 0x02: str="8-PSK_MULTISLOT_POWER_PROFILE 2"; break;
+                       case 0x03: str="8-PSK_MULTISLOT_POWER_PROFILE 3"; break;
+                       default:   str="This should not happen";
+               }
+
+               proto_tree_add_text(tf_tree,
+               tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
+               "8-PSK Multislot Power Profile: %s (%u)",str,oct>>(32-bits_needed));
+               bit_offset+=2;
+               curr_bits_length -= bits_needed;
+               oct <<= bits_needed;
+               bits_in_oct -= bits_needed;
+
+               /*
+                * Release 6
+                */
+                
+               /*
+                * Multiple TBF Capability
+                */
+               bits_needed = 1;
+               GET_DATA;
+               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_mult_tbf_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+               bit_offset+=bits_needed;
+               curr_bits_length -= bits_needed;
+               oct <<= bits_needed;
+               bits_in_oct -= bits_needed;
+               
+               /*
+                * Downlink Advanced Receiver Performance
+                */
+               bits_needed = 2;
+               GET_DATA;
+               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_down_adv_rec_perf, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
+               bit_offset+=bits_needed;
+               curr_bits_length -= bits_needed;
+               oct <<= bits_needed;
+               bits_in_oct -= bits_needed;
+               
+               /*
+                * Extended RLC/MAC Control Message Segmentation Capability
+                */
+               bits_needed = 1;
+               GET_DATA;
+               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_ext_rlc_mac_ctrl_msg_seg_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+               bit_offset+=bits_needed;
+               curr_bits_length -= bits_needed;
+               oct <<= bits_needed;
+               bits_in_oct -= bits_needed;
+
+               /*
+                * DTM Enhancements Capability
+                */
+               bits_needed = 1;
+               GET_DATA;
+               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_dtm_enh_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+               bit_offset+=bits_needed;
+               curr_bits_length -= bits_needed;
+               oct <<= bits_needed;
+               bits_in_oct -= bits_needed;
+
+               /*
+                * DTM GPRS High Multi Slot Class & DTM EGPRS High Multi Slot Class
+                */
+               bits_needed = 1;
+               GET_DATA;
+               if ((oct>>(32-bits_needed))==0)
+               {
+                       bit_offset+=bits_needed;
+                       curr_bits_length -= bits_needed;
+                       oct <<= bits_needed;
+                       bits_in_oct -= bits_needed;
+               }
+               else
+               {
+                       bit_offset+=bits_needed;
+                       curr_bits_length -= bits_needed;
+                       oct <<= bits_needed;
+                       bits_in_oct -= bits_needed;
+
+                       /*
+                        * DTM GPRS High Multi Slot Class
+                        */
+                       bits_needed = 3;
+                       GET_DATA;
+                       proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_dtm_gprs_high_multi_slot_class, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
+                       bit_offset+=bits_needed;
+                       curr_bits_length -= bits_needed;
+                       oct <<= bits_needed;
+                       bits_in_oct -= bits_needed;
+
+                       bits_needed = 1;
+                       GET_DATA;
+                       if ((oct>>(32-bits_needed))==0)
+                       {
+                               bit_offset+=bits_needed;
+                               curr_bits_length -= bits_needed;
+                               oct <<= bits_needed;
+                               bits_in_oct -= bits_needed;
+                       }
+                       else
+                       {
+                               bit_offset+=bits_needed;
+                               curr_bits_length -= bits_needed;
+                               oct <<= bits_needed;
+                               bits_in_oct -= bits_needed;
+
+                               /*
+                                * DTM EGPRS High Multi Slot Class
+                                */
+                               bits_needed = 3;
+                               GET_DATA;
+                               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_dtm_egprs_high_multi_slot_class, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
+                               bit_offset+=bits_needed;
+                               curr_bits_length -= bits_needed;
+                               oct <<= bits_needed;
+                               bits_in_oct -= bits_needed;
+                       }
+               }
+               
+               /*
+                * PS Handover Capability
+                */
+               bits_needed = 1;
+               GET_DATA;
+               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_ps_ho_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+               bit_offset+=bits_needed;
+               curr_bits_length -= bits_needed;
+               oct <<= bits_needed;
+               bits_in_oct -= bits_needed;
+                       
+               /*
+                * Release 7
+                */
+               /*
+                * DTM Handover Capability
                 */
                bits_needed = 1;
                GET_DATA;
-
-               /* analyse bits */
-               switch ( oct>>(32-bits_needed) )
-               {
-                       case 0x00: str="Modulation based multislot class not supported"; break;
-                       case 0x01: str="Modulation based multislot class supported";     break;
-                       default:   str="This should not happen";
-               }
-
-               proto_tree_add_text(tf_tree,
-                       tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
-                       "Modulation based multislot class support: %s (%u)",str,oct>>(32-bits_needed));
-               bit_offset++;
+               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_dtm_ho_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+               bit_offset+=bits_needed;
                curr_bits_length -= bits_needed;
                oct <<= bits_needed;
                bits_in_oct -= bits_needed;
 
                /*
-                * High Multislot Capability
+                * Multislot Capability Reduction for Downlink Dual Carrier & Downlink Dual Carrier for DTM Capability
                 */
                bits_needed = 1;
                GET_DATA;
-
-               /* analyse bits */
                if ((oct>>(32-bits_needed))==0)
                {
-                       proto_tree_add_text(tf_tree,
-                               tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
-                               "High Multislot Capability: Bits are not available (%u)",oct>>(32-bits_needed));
-                       bit_offset++;
+                       bit_offset+=bits_needed;
                        curr_bits_length -= bits_needed;
                        oct <<= bits_needed;
                        bits_in_oct -= bits_needed;
                }
                else
                {
+                       bit_offset+=bits_needed;
                        curr_bits_length -= bits_needed;
                        oct <<= bits_needed;
                        bits_in_oct -= bits_needed;
-                       bit_offset++;
 
                        /*
-                        * High Multislot Capability
+                        * Multislot Capability Reduction for Downlink Dual Carrier
                         */
-                       bits_needed = 2;
+                       bits_needed = 3;
                        GET_DATA;
+                       proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_multi_slot_cap_red_down_dual_carrier, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
+                       bit_offset+=bits_needed;
+                       curr_bits_length -= bits_needed;
+                       oct <<= bits_needed;
+                       bits_in_oct -= bits_needed;
 
-                       /* analyse bits */
-                       proto_tree_add_text(tf_tree,
-                       tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
-                                           "High Multislot Capability: 0x%02x (%u)"
-                                           " - This field effect all other multislot fields."
-                                           " To understand the value please read TS 24.008 5.6.0"
-                                           " Release 5 Chap 10.5.5.12 Page 406",
-                                           oct>>(32-bits_needed),
-                                           oct>>(32-bits_needed));
-                       bit_offset+=2;
+                       /*
+                        * Downlink Dual Carrier for DTM Capability
+                        */
+                       bits_needed = 1;
+                       GET_DATA;
+                       proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_down_dual_carrier_dtm_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+                       bit_offset+=bits_needed;
                        curr_bits_length -= bits_needed;
                        oct <<= bits_needed;
                        bits_in_oct -= bits_needed;
                }
 
                /*
-                * GERAN Iu Mode Capability
+                * Flexible Timeslot Assignment
                 */
                bits_needed = 1;
                GET_DATA;
-
-               /* analyse bits */
-               switch ( oct>>(32-bits_needed) )
-               {
-                       case 0x00: str="GERAN Iu mode not supported"; break;
-                       case 0x01: str="GERAN Iu mode supported";     break;
-                       default:   str="This should not happen";
-               }
-
-               proto_tree_add_text(tf_tree,
-                       tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
-                       "GERAN Iu Mode Capability: %s (%u)",str,oct>>(32-bits_needed));
-               bit_offset++;
+               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_flex_ts_assign, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+               bit_offset+=bits_needed;
                curr_bits_length -= bits_needed;
                oct <<= bits_needed;
                bits_in_oct -= bits_needed;
-
+               /*
+                * GAN PS Handover Capability
+                */
+               bits_needed = 1;
+               GET_DATA;
+               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_gan_ps_ho_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+               bit_offset+=bits_needed;
+               curr_bits_length -= bits_needed;
+               oct <<= bits_needed;
+               bits_in_oct -= bits_needed;
                /*
-                * GMSK/8-PSK Multislot Power Profile
+                * RLC Non-persistent Mode
                 */
                bits_needed = 1;
                GET_DATA;
+               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_rlc_non_pers_mode, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+               bit_offset+=bits_needed;
+               curr_bits_length -= bits_needed;
+               oct <<= bits_needed;
+               bits_in_oct -= bits_needed;
+               /*
+                * Reduced Latency Capability
+                */
+               bits_needed = 1;
+               GET_DATA;
+               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_reduced_lat_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+               bit_offset+=bits_needed;
+               curr_bits_length -= bits_needed;
+               oct <<= bits_needed;
+               bits_in_oct -= bits_needed;
+               /*
+                * Uplink EGPRS2
+                */
+               bits_needed = 2;
+               GET_DATA;
+               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_ul_egprs2, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
+               bit_offset+=bits_needed;
+               curr_bits_length -= bits_needed;
+               oct <<= bits_needed;
+               bits_in_oct -= bits_needed;
+               /*
+                * Downlink EGPRS2
+                */
+               bits_needed = 2;
+               GET_DATA;
+               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_dl_egprs2, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
+               bit_offset+=bits_needed;
+               curr_bits_length -= bits_needed;
+               oct <<= bits_needed;
+               bits_in_oct -= bits_needed;
+               /*
+                * Release 8
+                */
+               /*
+                * E-UTRA FDD support
+                */
+               bits_needed = 1;
+               GET_DATA;
+               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_eutra_fdd_support, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+               bit_offset+=bits_needed;
+               curr_bits_length -= bits_needed;
+               oct <<= bits_needed;
+               bits_in_oct -= bits_needed;
+               /*
+                * E-UTRA TDD support
+                */
+               bits_needed = 1;
+               GET_DATA;
+               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_eutra_tdd_support, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+               bit_offset+=bits_needed;
+               curr_bits_length -= bits_needed;
+               oct <<= bits_needed;
+               bits_in_oct -= bits_needed;
+               /*
+                * GERAN to E-UTRA support in GERAN packet transfer mode
+                */
+               bits_needed = 2;
+               GET_DATA;
+               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_geran_to_eutra_support_in_geran_ptm, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
+               bit_offset+=bits_needed;
+               curr_bits_length -= bits_needed;
+               oct <<= bits_needed;
+               bits_in_oct -= bits_needed;
+               /*
+                * Priority-based reselection support
+                */
+               bits_needed = 1;
+               GET_DATA;
+               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_prio_based_resel_support, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+               bit_offset+=bits_needed;
+               curr_bits_length -= bits_needed;
+               oct <<= bits_needed;
+               bits_in_oct -= bits_needed;
+               /*
+                * Release 9
+                */
 
-               /* analyse bits */
+               /*
+                * Enhanced Flexible Timeslot Assignment
+                */
+               bits_needed = 1;
+               GET_DATA;
                if ((oct>>(32-bits_needed))==0)
                {
-                       proto_tree_add_text(tf_tree,
-                               tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
-                               "GMSK/8-PSK Multislot Power Profile: Bits are not available (%u)",oct>>(32-bits_needed));
-                       bit_offset++;
+                       bit_offset+=bits_needed;
                        curr_bits_length -= bits_needed;
                        oct <<= bits_needed;
-                       bits_in_oct -= bits_needed;
+                       bits_in_oct -= bits_needed;
                }
                else
                {
+                       bit_offset+=bits_needed;
                        curr_bits_length -= bits_needed;
                        oct <<= bits_needed;
                        bits_in_oct -= bits_needed;
-                       bit_offset++;
 
                        /*
-                        * GMSK Multislot Power Profile
+                        * Alternative EFTA Multislot Class
                         */
-                       bits_needed = 2;
+                       bits_needed = 4;
                        GET_DATA;
-
-                       /* analyse bits */
-                       switch ( oct>>(32-bits_needed) )
-                       {
-                               case 0x00: str="GMSK_MULTISLOT_POWER_PROFILE 0"; break;
-                               case 0x01: str="GMSK_MULTISLOT_POWER_PROFILE 1"; break;
-                               case 0x02: str="GMSK_MULTISLOT_POWER_PROFILE 2"; break;
-                               case 0x03: str="GMSK_MULTISLOT_POWER_PROFILE 3"; break;
-                               default:   str="This should not happen";
-                       }
-
-                       proto_tree_add_text(tf_tree,
-                               tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
-                               "GMSK Multislot Power Profile: %s (%u)",str,oct>>(32-bits_needed));
-                       bit_offset+=2;
+                       proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_alt_efta_multi_slot_class, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
+                       bit_offset+=bits_needed;
                        curr_bits_length -= bits_needed;
                        oct <<= bits_needed;
                        bits_in_oct -= bits_needed;
-
                        /*
-                        * 8-PSK Multislot Power Profile
+                        * EFTA Multislot Capability Reduction for Downlink Dual Carrier
                         */
-                       bits_needed = 2;
+                       bits_needed = 3;
                        GET_DATA;
-
-                       /* analyse bits */
-                       switch ( oct>>(32-bits_needed) )
-                       {
-                               case 0x00: str="8-PSK_MULTISLOT_POWER_PROFILE 0"; break;
-                               case 0x01: str="8-PSK_MULTISLOT_POWER_PROFILE 1"; break;
-                               case 0x02: str="8-PSK_MULTISLOT_POWER_PROFILE 2"; break;
-                               case 0x03: str="8-PSK_MULTISLOT_POWER_PROFILE 3"; break;
-                               default:   str="This should not happen";
-                       }
-
-                       proto_tree_add_text(tf_tree,
-                       tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
-                       "8-PSK Multislot Power Profile: %s (%u)",str,oct>>(32-bits_needed));
-                       bit_offset+=2;
+                       proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_efta_multi_slot_cap_red_down_dual_carrier, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
+                       bit_offset+=bits_needed;
                        curr_bits_length -= bits_needed;
                        oct <<= bits_needed;
                        bits_in_oct -= bits_needed;
-
                }
+               /*
+                * Indication of Upper Layer PDU Start Capability for RLC UM
+                */
+               bits_needed = 1;
+               GET_DATA;
+               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_ind_up_layer_pdu_start_cap_for_rlc_um, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+               bit_offset+=bits_needed;
+               curr_bits_length -= bits_needed;
+               oct <<= bits_needed;
+               bits_in_oct -= bits_needed;
+
+               /*
+                * EMST Capability
+                */
+               bits_needed = 1;
+               GET_DATA;
+               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_emst_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+               bit_offset+=bits_needed;
+               curr_bits_length -= bits_needed;
+               oct <<= bits_needed;
+               bits_in_oct -= bits_needed;
+
+               /*
+                * MTTI Capability
+                */
+               bits_needed = 1;
+               GET_DATA;
+               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_mtti_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+               bit_offset+=bits_needed;
+               curr_bits_length -= bits_needed;
+               oct <<= bits_needed;
+               bits_in_oct -= bits_needed;
+
+               /*
+                * UTRA CSG Cells Reporting
+                */
+               bits_needed = 1;
+               GET_DATA;
+               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_utra_csg_cell_report, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+               bit_offset+=bits_needed;
+               curr_bits_length -= bits_needed;
+               oct <<= bits_needed;
+               bits_in_oct -= bits_needed;
+
+               /*
+                * E-UTRA CSG Cells Reporting
+                */
+               bits_needed = 1;
+               GET_DATA;
+               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_eutra_csg_cell_report, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+               bit_offset+=bits_needed;
+               curr_bits_length -= bits_needed;
+               oct <<= bits_needed;
+               bits_in_oct -= bits_needed;
 
                /*
                 * we are too long ... so jump over it
@@ -2418,11 +2780,12 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
                        bits_in_oct -= bits_needed;
                }
 
+
        } while ( 1 );
 
        curr_offset+= curr_len;
 
-       EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+       EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
 
        return(curr_offset - offset);
 }
@@ -2492,13 +2855,13 @@ static const range_string gmm_cause_vals[] = {
 /* NOTE: The listed reject cause values are defined in annex G. */
 
 static guint16
-de_gmm_cause(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gmm_cause(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
 {
        guint32       curr_offset;
 
        curr_offset = offset;
 
-       proto_tree_add_item(tree, hf_gsm_a_gm_cause, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_item(tree, hf_gsm_a_gm_cause, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
 
        curr_offset++;
 
@@ -2511,7 +2874,7 @@ de_gmm_cause(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gch
  * [7] 10.5.5.15 Routing area identification
  */
 guint16
-de_gmm_rai(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gmm_rai(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
 {
        proto_tree   *subtree;
        proto_item   *item;
@@ -2541,23 +2904,41 @@ de_gmm_rai(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar
                mcc,mnc,lac,rac);
 
        subtree = proto_item_add_subtree(item, ett_gmm_rai);
-       dissect_e212_mcc_mnc(tvb, gsm_a_dtap_pinfo, subtree, offset, TRUE);
+       dissect_e212_mcc_mnc(tvb, pinfo, subtree, offset, TRUE);
 
-       proto_tree_add_item(subtree, hf_gsm_a_lac, tvb, curr_offset+3, 2, FALSE);
-       proto_tree_add_item(subtree, hf_gsm_a_gm_rac, tvb, curr_offset+5, 1, FALSE);
+       proto_tree_add_item(subtree, hf_gsm_a_lac, tvb, curr_offset+3, 2, ENC_BIG_ENDIAN);
+       proto_tree_add_item(subtree, hf_gsm_a_gm_rac, tvb, curr_offset+5, 1, ENC_BIG_ENDIAN);
 
        curr_offset+=6;
+    if (add_string)
+    {
+        if (add_string[0] == '\0')
+        {
+            g_snprintf(add_string, string_len, " - RAI: %x-%x-%u-%u", mcc,mnc,lac,rac);
+        }
+    }
+
 
        /* no length check possible */
 
        return(curr_offset - offset);
 }
 
+/*
+ * [7] 10.5.5.15a Routing area identification 2
+ */
+static guint16
+de_gmm_rai2(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+{
+       /* The routing area identification 2 value is coded as octet 2 to 7 of the Routing area identification information element. */
+       return de_gmm_rai(tvb, tree, pinfo, offset, len, add_string, string_len);
+}
+
 /*
  * [7] 10.5.5.17
  */
 static guint16
-de_gmm_update_res(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gmm_update_res(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
 {
        guint8        oct;
        guint32       curr_offset;
@@ -2602,12 +2983,12 @@ static const value_string gsm_a_gm_update_type_vals[] = {
 };
 
 static guint16
-de_gmm_update_type(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gmm_update_type(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
 {
        proto_item   *tf = NULL;
        proto_tree   *tf_tree = NULL;
 
-       proto_tree_add_bits_item(tree, hf_gsm_a_gm_ciph_key_seq_num, tvb, offset << 3, 4, FALSE);
+       proto_tree_add_bits_item(tree, hf_gsm_a_gm_ciph_key_seq_num, tvb, offset << 3, 4, ENC_BIG_ENDIAN);
 
        tf = proto_tree_add_text(tree,
                tvb, offset, 1,
@@ -2615,8 +2996,8 @@ de_gmm_update_type(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U
 
        tf_tree = proto_item_add_subtree(tf, ett_gmm_update_type );
 
-       proto_tree_add_item(tf_tree, hf_gsm_a_gm_for, tvb, offset, 1, FALSE);
-       proto_tree_add_item(tf_tree, hf_gsm_a_gm_update_type, tvb, offset, 1, FALSE);
+       proto_tree_add_item(tf_tree, hf_gsm_a_gm_for, tvb, offset, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_item(tf_tree, hf_gsm_a_gm_update_type, tvb, offset, 1, ENC_BIG_ENDIAN);
 
        /* no length check possible */
        return(1);
@@ -2626,10 +3007,10 @@ de_gmm_update_type(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U
  * [9] 10.5.5.19 A&C reference number (lower nibble)
  */
 static guint16
-de_gmm_ac_ref_nr(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gmm_ac_ref_nr(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
 {
        /* IMPORTANT - IT'S ASSUMED THAT THE INFORMATION IS IN THE LOWER NIBBLE */
-       proto_tree_add_bits_item(tree, hf_gsm_a_gm_ac_ref_nr, tvb, (offset << 3) + 4, 4, FALSE);
+       proto_tree_add_bits_item(tree, hf_gsm_a_gm_ac_ref_nr, tvb, (offset << 3) + 4, 4, ENC_BIG_ENDIAN);
 
        /* no length check possible */
        return(1);
@@ -2639,10 +3020,10 @@ de_gmm_ac_ref_nr(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_,
  * [9] 10.5.5.19 A&C reference number (higher nibble)
  */
 static guint16
-de_gmm_ac_ref_nr_h(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gmm_ac_ref_nr_h(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
 {
        /* IMPORTANT - IT'S ASSUMED THAT THE INFORMATION IS IN THE HIGHER NIBBLE */
-       proto_tree_add_bits_item(tree, hf_gsm_a_gm_ac_ref_nr, tvb, offset << 3, 4, FALSE);
+       proto_tree_add_bits_item(tree, hf_gsm_a_gm_ac_ref_nr, tvb, offset << 3, 4, ENC_BIG_ENDIAN);
 
        /* no length check possible */
        return(1);
@@ -2661,18 +3042,18 @@ static const value_string gsm_a_gm_serv_type_vals[] = {
 };
 
 static guint16
-de_gmm_service_type(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gmm_service_type(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
 {
        guint32 bit_offset;
 
        bit_offset = offset << 3;
-       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 1, FALSE);
+       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
        bit_offset += 1;
-       proto_tree_add_bits_item(tree, hf_gsm_a_gm_serv_type, tvb, bit_offset, 3, FALSE);
+       proto_tree_add_bits_item(tree, hf_gsm_a_gm_serv_type, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
        bit_offset += 3;
-       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 1, FALSE);
+       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
        bit_offset += 1;
-       proto_tree_add_bits_item(tree, hf_gsm_a_gm_ciph_key_seq_num, tvb, bit_offset, 3, FALSE);
+       proto_tree_add_bits_item(tree, hf_gsm_a_gm_ciph_key_seq_num, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
 
        /* no length check possible */
        return(1);
@@ -2717,22 +3098,22 @@ static const true_false_string gsm_a_gm_gps_c_vals = {
 };
 
 static guint16
-de_gmm_ps_lcs_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gmm_ps_lcs_cap(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
 {
        guint32 curr_offset;
 
        curr_offset = offset;
-       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, curr_offset << 3, 2, FALSE);
-       proto_tree_add_item(tree, hf_gsm_a_gm_apc, tvb, curr_offset, 1, FALSE);
-       proto_tree_add_item(tree, hf_gsm_a_gm_otd_a, tvb, curr_offset, 1, FALSE);
-       proto_tree_add_item(tree, hf_gsm_a_gm_otd_b, tvb, curr_offset, 1, FALSE);
-       proto_tree_add_item(tree, hf_gsm_a_gm_gps_a, tvb, curr_offset, 1, FALSE);
-       proto_tree_add_item(tree, hf_gsm_a_gm_gps_b, tvb, curr_offset, 1, FALSE);
-       proto_tree_add_item(tree, hf_gsm_a_gm_gps_c, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, curr_offset << 3, 2, ENC_BIG_ENDIAN);
+       proto_tree_add_item(tree, hf_gsm_a_gm_apc, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_item(tree, hf_gsm_a_gm_otd_a, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_item(tree, hf_gsm_a_gm_otd_b, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_item(tree, hf_gsm_a_gm_gps_a, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_item(tree, hf_gsm_a_gm_gps_b, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_item(tree, hf_gsm_a_gm_gps_c, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
 
        curr_offset++;
 
-       EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+       EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
 
        return(curr_offset - offset);
 }
@@ -2741,7 +3122,7 @@ de_gmm_ps_lcs_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_
  * [7] 10.5.5.23
  */
 static guint16
-de_gmm_net_feat_supp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gmm_net_feat_supp(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
 {
        guint8  oct;
        guint32 curr_offset;
@@ -2772,7 +3153,7 @@ de_gmm_net_feat_supp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len
 
 /* [7] 10.5.5.24 Inter RAT information container */
 static guint16
-de_gmm_rat_info_container(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+de_gmm_rat_info_container(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
 {
        guint32 curr_offset;
        tvbuff_t *rrc_irat_ho_info_tvb;
@@ -2783,7 +3164,7 @@ de_gmm_rat_info_container(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint
 defined in 3GPP TS 25.331 [23c]. If this field includes padding bits, they are defined in 3GPP TS 25.331 [23c].*/
        rrc_irat_ho_info_tvb = tvb_new_subset(tvb, curr_offset, len, len);
        if (rrc_irat_ho_info_handle)
-               call_dissector(rrc_irat_ho_info_handle, rrc_irat_ho_info_tvb, gsm_a_dtap_pinfo , tree);
+               call_dissector(rrc_irat_ho_info_handle, rrc_irat_ho_info_tvb,pinfo , tree);
        else
                proto_tree_add_text(tree, tvb, curr_offset, len,"INTER RAT HANDOVER INFO - Not decoded");
 
@@ -2791,11 +3172,98 @@ defined in 3GPP TS 25.331 [23c]. If this field includes padding bits, they are d
 
 }
 
+/* [7] 10.5.5.25 Requested MS information */
+static const true_false_string gsm_a_gm_req_ms_info_irat_vals = {
+       "Inter RAT information container IE requested",
+       "Inter RAT information container IE not requested"
+};
+static const true_false_string gsm_a_gm_req_ms_info_irat2_vals = {
+       "E-UTRAN inter RAT information container IE requested",
+       "E-UTRAN inter RAT information container IE not requested"
+};
+
+static guint16
+de_gmm_req_ms_info(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+{
+       guint32 curr_offset;
+       guint32 bit_offset;
+
+       curr_offset = offset;
+       bit_offset = (curr_offset<<3)+4;
+
+       proto_tree_add_bits_item(tree, hf_gsm_a_gm_req_ms_info_irat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+       bit_offset++;
+       proto_tree_add_bits_item(tree, hf_gsm_a_gm_req_ms_info_irat2, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+       bit_offset++;
+       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
+       bit_offset+=2;
+       curr_offset++;
+
+       return len;
+}
+
+/* [7] 10.5.5.26 UE network capability
+ * See subclause 9.9.3.x in 3GPP TS 24.301 [120].
+ */
+
+/* [7] 10.5.5.27 E-UTRAN inter RAT information container */
+static guint16
+de_gmm_eutran_irat_info_container(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+{
+       guint32 curr_offset;
+       tvbuff_t *lte_rrc_ue_eutra_cap_tvb;
+
+       curr_offset = offset;
+
+/* The value part of the E-UTRAN inter RAT information container information element
+   is formatted and coded according to the UE-EUTRA-Capability IE defined in 3GPP TS 36.331 [129]*/
+       lte_rrc_ue_eutra_cap_tvb = tvb_new_subset(tvb, curr_offset, len, len);
+       if (lte_rrc_ue_eutra_cap_handle)
+               call_dissector(lte_rrc_ue_eutra_cap_handle, lte_rrc_ue_eutra_cap_tvb, pinfo, tree);
+       else
+               proto_tree_add_text(tree, tvb, curr_offset, len,"E-UTRAN Inter RAT information container - Not decoded");
+
+       return len;
+}
+
+/* [7] 10.5.5.28 Voice domain preference and UE's usage setting */
+static const true_false_string gsm_a_gm_ue_usage_setting_vals = {
+       "Data centric",
+       "Voice centric"
+};
+static const value_string gsm_a_gm_voice_domain_pref_for_eutran_vals[] = {
+       {0x0,   "CS Voice only"},
+       {0x1,   "IMS PS Voice only"},
+       {0x2,   "CS voice preferred, IMS PS Voice as secondary"},
+       {0x3,   "IMS PS voice preferred, CS Voice as secondary"},
+       {  0,   NULL }
+};
+
+static guint16
+de_gmm_voice_domain_pref(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+{
+       guint32 curr_offset;
+       guint32 bit_offset;
+
+       curr_offset = offset;
+       bit_offset = curr_offset<<3;
+
+       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 5, ENC_BIG_ENDIAN);
+       bit_offset+=5;
+       proto_tree_add_bits_item(tree, hf_gsm_a_gm_ue_usage_setting, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+       bit_offset++;
+       proto_tree_add_bits_item(tree, hf_gsm_a_gm_voice_domain_pref_for_eutran, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
+       bit_offset+=2;
+       curr_offset++;
+
+       return len;
+}
+
 /*
  * [7] 10.5.7.1
  */
 static guint16
-de_gc_context_stat(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gc_context_stat(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
 {
        guint8  oct;
        guint16 pdp_nr;
@@ -2832,7 +3300,7 @@ de_gc_context_stat(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U
 
        curr_offset++;
 
-       EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+       EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
 
        return(curr_offset - offset);
 }
@@ -2841,7 +3309,7 @@ de_gc_context_stat(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U
  * [7] 10.5.7.2
  */
 static guint16
-de_gc_radio_prio(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gc_radio_prio(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
 {
        guint8  oct;
        guint32 curr_offset;
@@ -2883,7 +3351,7 @@ static const value_string gsm_a_gm_gprs_timer_unit_vals[] = {
 };
 
 static guint16
-de_gc_timer(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gc_timer(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
 {
        guint8  oct;
        guint16 val;
@@ -2914,8 +3382,8 @@ de_gc_timer(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gcha
                str);
 
        subtree = proto_item_add_subtree(item, ett_gmm_gprs_timer);
-       proto_tree_add_item(subtree, hf_gsm_a_gm_gprs_timer_unit, tvb, offset, 1, FALSE);
-       proto_tree_add_item(subtree, hf_gsm_a_gm_gprs_timer_value, tvb, offset, 1, FALSE);
+       proto_tree_add_item(subtree, hf_gsm_a_gm_gprs_timer_unit, tvb, offset, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_item(subtree, hf_gsm_a_gm_gprs_timer_value, tvb, offset, 1, ENC_BIG_ENDIAN);
 
        /* no length check possible */
        return(1);
@@ -2925,7 +3393,7 @@ de_gc_timer(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gcha
  * [7] 10.5.7.4
  */
 static guint16
-de_gc_timer2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string, int string_len _U_)
+de_gc_timer2(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string, int string_len _U_)
 {
        guint8  oct;
        guint16 val;
@@ -2966,7 +3434,7 @@ de_gc_timer2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gch
  * [7] 10.5.7.5
  */
 static guint16
-de_gc_radio_prio2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_gc_radio_prio2(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
 {
        guint8  oct;
        guint32 curr_offset;
@@ -3003,10 +3471,10 @@ de_gc_radio_prio2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_
  * [8] 10.5.7.6 MBMS context status
  */
 static guint16
-de_gc_mbms_context_stat(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+de_gc_mbms_context_stat(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
 {
        guint32 curr_offset;
-        guint   i;
+       guint   i;
        guint8  oct, j;
        proto_item  *tf = NULL;
        proto_tree  *tf_tree = NULL;
@@ -3039,13 +3507,61 @@ de_gc_mbms_context_stat(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
 
        return(len);
 }
+
+/*
+ * [8] 10.5.7.7 Uplink data status
+ */
+static const true_false_string gsm_a_gm_nsapi_ul_stat_vals = {
+       "uplink data are pending for the preserved PDP context",
+       "no uplink data are pending for the preserved PDP context or the PDP context is PDP-INACTIVE or is PDP-ACTIVE with a RAB already established"
+};
+
+static guint16
+de_gc_uplink_data_stat(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+{
+       guint32 curr_offset;
+       guint32 bit_offset;
+
+       curr_offset = offset;
+       bit_offset = curr_offset<<3;
+
+       proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_7_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+       bit_offset++;
+       proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_6_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+       bit_offset++;
+       proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_5_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+       bit_offset++;
+       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 5, ENC_BIG_ENDIAN);
+       bit_offset+=5;
+       curr_offset++;
+       proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_15_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+       bit_offset++;
+       proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_14_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+       bit_offset++;
+       proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_13_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+       bit_offset++;
+       proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_12_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+       bit_offset++;
+       proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_11_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+       bit_offset++;
+       proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_10_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+       bit_offset++;
+       proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_9_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+       bit_offset++;
+       proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_8_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+       bit_offset++;
+       curr_offset++;
+
+       return(len);
+}
+
 /*
  * [7] 10.5.6.1
  */
-#define MAX_APN_LENGTH         50
+#define MAX_APN_LENGTH         100
 
 guint16
-de_sm_apn(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len _U_)
+de_sm_apn(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len _U_)
 {
        guint32 curr_offset;
        guint   curr_len;
@@ -3071,7 +3587,7 @@ de_sm_apn(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add
 
        curr_offset+= len;
 
-       EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+       EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
 
        return(curr_offset - offset);
 }
@@ -3080,7 +3596,7 @@ de_sm_apn(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add
  * [7] 10.5.6.2
  */
 static guint16
-de_sm_nsapi(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string, int string_len _U_)
+de_sm_nsapi(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string, int string_len _U_)
 {
        guint8  oct;
        guint32 curr_offset;
@@ -3145,7 +3661,7 @@ static const value_string gsm_a_gm_link_dir_vals[] = {
 };
 
 guint16
-de_sm_pco(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+de_sm_pco(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
 {
        proto_item   *generated_item = NULL;
        guint32 curr_offset;
@@ -3159,13 +3675,13 @@ de_sm_pco(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add
 
        oct = tvb_get_guint8(tvb, curr_offset);
 
-       link_dir = gsm_a_dtap_pinfo->link_dir;
+       link_dir = pinfo->link_dir;
        generated_item =proto_tree_add_int(tree, hf_gsm_a_gm_link_dir, tvb, curr_offset, 0, link_dir);
        PROTO_ITEM_SET_GENERATED(generated_item);
 
 
        /* 1 ext 0 0 0 0 Spare  Configuration protocol */
-       proto_tree_add_item(tree, hf_gsm_a_gm_sm_ext, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_item(tree, hf_gsm_a_gm_sm_ext, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
        /* Configuration protocol (octet 3)
         * Bits
         * 3 2 1
@@ -3243,7 +3759,10 @@ de_sm_pco(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add
                                         * dissect the embedded message
                                         */
                                        l3_tvb = tvb_new_subset(tvb, curr_offset, e_len, e_len);
-                                       call_dissector(handle, l3_tvb ,  gsm_a_dtap_pinfo  , tree );
+                                       /* In this case we do not want the columns updated */
+                                       col_set_writable(pinfo->cinfo, FALSE);
+                                       call_dissector(handle, l3_tvb , pinfo  , tree );
+                                       col_set_writable(pinfo->cinfo, TRUE);
                                }
                                else
                                {
@@ -3251,7 +3770,7 @@ de_sm_pco(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add
                                        * dissect the embedded DATA message
                                        */
                                        l3_tvb = tvb_new_subset(tvb, curr_offset, e_len, e_len);
-                                       call_dissector(data_handle, l3_tvb, gsm_a_dtap_pinfo , tree);
+                                       call_dissector(data_handle, l3_tvb, pinfo , tree);
                                }
                        }
                }
@@ -3261,7 +3780,7 @@ de_sm_pco(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add
        }
        curr_offset+= curr_len;
 
-       EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+       EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
 
        return(curr_offset - offset);
 }
@@ -3277,18 +3796,16 @@ static const value_string gsm_a_sm_pdp_type_org_vals[] = {
 };
 
 static guint16
-de_sm_pdp_addr(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+de_sm_pdp_addr(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
 {
        guint32 curr_offset;
-       guint   curr_len;
        const gchar     *str;
        guchar    pdp_type_org, pdp_type_num;
 
-       curr_len = len;
        curr_offset = offset;
 
-       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset << 3), 4, FALSE);
-       proto_tree_add_item(tree, hf_gsm_a_sm_pdp_type_org, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset << 3), 4, ENC_BIG_ENDIAN);
+       proto_tree_add_item(tree, hf_gsm_a_sm_pdp_type_org, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
 
        pdp_type_org = tvb_get_guint8(tvb, curr_offset) & 0x0f;
        curr_offset += 1;
@@ -3346,23 +3863,23 @@ de_sm_pdp_addr(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar
        switch (pdp_type_num)
        {
                case 0x57:
-                       proto_tree_add_item(tree,hf_gsm_a_sm_ip6_address,tvb,curr_offset,16,FALSE);
+                       proto_tree_add_item(tree,hf_gsm_a_sm_ip6_address,tvb,curr_offset,16,ENC_NA);
                        curr_offset+=16;
                        break;
 
                case 0x8d:
-                       proto_tree_add_item(tree,hf_gsm_a_sm_ip4_address,tvb,curr_offset,4,FALSE);
+                       proto_tree_add_item(tree,hf_gsm_a_sm_ip4_address,tvb,curr_offset,4,ENC_BIG_ENDIAN);
                        curr_offset+=4;
-                       proto_tree_add_item(tree,hf_gsm_a_sm_ip6_address,tvb,curr_offset,16,FALSE);
+                       proto_tree_add_item(tree,hf_gsm_a_sm_ip6_address,tvb,curr_offset,16,ENC_NA);
                        curr_offset+=16;
                        break;
 
                default:
-                       proto_tree_add_item(tree,hf_gsm_a_sm_ip4_address,tvb,curr_offset,4,FALSE);
+                       proto_tree_add_item(tree,hf_gsm_a_sm_ip4_address,tvb,curr_offset,4,ENC_BIG_ENDIAN);
                        curr_offset+=4;
        }
 
-       EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+       EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
 
        return(curr_offset - offset);
 }
@@ -3540,7 +4057,7 @@ qos_calc_ext_bitrate(guint8 oct)
 }
 
 guint16
-de_sm_qos(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+de_sm_qos(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
 {
        guint32 curr_offset;
        guchar     oct, tmp_oct;
@@ -3550,29 +4067,29 @@ de_sm_qos(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add
        curr_offset = offset;
 
        /* Octet 3 */
-       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset << 3), 2, FALSE);
-       proto_tree_add_item(tree, hf_gsm_a_qos_delay_cls, tvb, curr_offset, 1, FALSE);
-       proto_tree_add_item(tree, hf_gsm_a_qos_reliability_cls, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset << 3), 2, ENC_BIG_ENDIAN);
+       proto_tree_add_item(tree, hf_gsm_a_qos_delay_cls, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_item(tree, hf_gsm_a_qos_reliability_cls, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
        curr_offset+= 1;
 
        /* Octet 4 */
        oct = tvb_get_guint8(tvb, curr_offset);
-       proto_tree_add_item(tree, hf_gsm_a_qos_peak_thr, tvb, curr_offset, 1, FALSE);
-       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset << 3) + 4, 1, FALSE);
-       proto_tree_add_item(tree, hf_gsm_a_qos_prec_class, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_item(tree, hf_gsm_a_qos_peak_thr, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset << 3) + 4, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_item(tree, hf_gsm_a_qos_prec_class, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
        curr_offset+= 1;
 
        /* Octet 5 */
-       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset << 3), 3, FALSE);
-       proto_tree_add_item(tree, hf_gsm_a_qos_mean_thr, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset << 3), 3, ENC_BIG_ENDIAN);
+       proto_tree_add_item(tree, hf_gsm_a_qos_mean_thr, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
        curr_offset+= 1;
 
        NO_MORE_DATA_CHECK(len);
 
        /* Octet 6 */
-       proto_tree_add_item(tree, hf_gsm_a_qos_traffic_cls, tvb, curr_offset, 1, FALSE);
-       proto_tree_add_item(tree, hf_gsm_a_qos_del_order, tvb, curr_offset, 1, FALSE);
-       proto_tree_add_item(tree, hf_gsm_a_qos_del_of_err_sdu, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_item(tree, hf_gsm_a_qos_traffic_cls, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_item(tree, hf_gsm_a_qos_del_order, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_item(tree, hf_gsm_a_qos_del_of_err_sdu, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
        curr_offset+= 1;
 
        NO_MORE_DATA_CHECK(len);
@@ -3636,8 +4153,8 @@ de_sm_qos(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add
        NO_MORE_DATA_CHECK(len);
 
        /* Octet 10 */
-       proto_tree_add_item(tree, hf_gsm_a_qos_ber, tvb, curr_offset, 1, FALSE);
-       proto_tree_add_item(tree, hf_gsm_a_qos_sdu_err_rat, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_item(tree, hf_gsm_a_qos_ber, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_item(tree, hf_gsm_a_qos_sdu_err_rat, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
 
        curr_offset+= 1;
        NO_MORE_DATA_CHECK(len);
@@ -3709,8 +4226,8 @@ de_sm_qos(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add
 
        /* Ocet 14 */
        oct = tvb_get_guint8(tvb, curr_offset);
-       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset << 3), 3, FALSE);
-       proto_tree_add_item(tree, hf_gsm_a_qos_signalling_ind, tvb , curr_offset, 1, FALSE);
+       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset << 3), 3, ENC_BIG_ENDIAN);
+       proto_tree_add_item(tree, hf_gsm_a_qos_signalling_ind, tvb , curr_offset, 1, ENC_BIG_ENDIAN);
 
        tmp_oct = oct & 7;
        if (tmp_oct == 0x01)
@@ -3799,7 +4316,7 @@ de_sm_qos(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add
 
        curr_offset+= 1;
 
-       EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+       EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
 
        return(curr_offset - offset);
 }
@@ -3853,17 +4370,16 @@ static const value_string gsm_a_sm_cause_vals[] = {
 };
 
 static guint16
-de_sm_cause(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_sm_cause(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
 {
        guint8  oct;
        const gchar     *str;
 
        oct = tvb_get_guint8(tvb, offset);
-       str = match_strval(oct, gsm_a_sm_cause_vals);
 
        /* SM Cause can be sent in both directions */
-       if (!str)
-               str = "Protocol error, unspecified / Service option temporarily out of order";
+       str = val_to_str_const(oct, gsm_a_sm_cause_vals,
+                              "Protocol error, unspecified / Service option temporarily out of order");
 
        proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_cause, tvb,
                                offset, 1, oct, "%s (%u)", str, oct);
@@ -3876,17 +4392,16 @@ de_sm_cause(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gcha
  * [9] 10.5.6.6a SM cause 2
  */
 static guint16
-de_sm_cause_2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_sm_cause_2(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
 {
        guint8  oct;
        const gchar     *str;
 
        oct = tvb_get_guint8(tvb, offset);
-       str = match_strval(oct, gsm_a_sm_cause_vals);
 
        /* SM Cause 2 is sent only in the Network-to-MS direction */
-       if (!str)
-               str = "Service option temporarily out of order";
+       str = val_to_str_const(oct, gsm_a_sm_cause_vals,
+                              "Service option temporarily out of order");
 
        proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_cause_2, tvb,
                                offset, 1, oct, "%s (%u)", str, oct);
@@ -3897,49 +4412,54 @@ de_sm_cause_2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gc
 /*
  * [7] 10.5.6.7
  */
+
+static const true_false_string gsm_a_sm_ti_flag_vals = {
+       "The message is sent to the side that originates the TI",
+       "The message is sent from the side that originates the TI"
+};
+
 static guint16
-de_sm_linked_ti(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+de_sm_linked_ti(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
 {
        guint32 curr_offset;
        guint   curr_len;
        gchar   oct;
-
-       static const gchar *ti_flag[2]={
-               "The message is sent from the side that originates the TI" ,
-               "The message is sent to the side that originates the TI" };
-
        curr_len = len;
        curr_offset = offset;
 
        oct = tvb_get_guint8(tvb, curr_offset);
 
-       proto_tree_add_text(tree,
-               tvb, curr_offset, 1,
-               "TI flag: %s (%u)",ti_flag[oct>>7],oct>>7);
+       proto_tree_add_item(tree, hf_gsm_a_sm_ti_flag, tvb, offset, 1, ENC_BIG_ENDIAN);
+
+       /* The TI value and the TI flag occupy bits 5 - 7 and bit 8 of the first octet respectively.
+        * The extended TI shall not be used unless TI values of 7 or greater are needed.
+        * Where the extended TI is used, the TI IE includes a second octet. The TI value in the first octet is ignored, and the TI
+        * value is encoded in bits 7-1 of the second octet.
+        */
 
        if ( curr_len > 1 )
        {
+               curr_offset++;
                oct = tvb_get_guint8(tvb, curr_offset);
 
                proto_tree_add_text(tree,
                        tvb, curr_offset, 1,
                        "TI value: 0x%02x (%u)",oct&0x7f,oct&0x7f);
 
-               proto_tree_add_text(tree,
-                       tvb, curr_offset, 1,
-                       "ext: 0x%02x (%u)",oct>>7,oct>>7);
+               proto_tree_add_item(tree, hf_gsm_a_sm_ext, tvb, offset, 1, ENC_BIG_ENDIAN);
 
+               curr_offset++;
        }
        else
        {
                proto_tree_add_text(tree,
                        tvb, curr_offset, 1,
                        "TI value: 0x%02x (%u)",(oct>>4)&7,(oct>>4)&7);
+               curr_offset++;
        }
 
-       curr_offset+= curr_len;
 
-       EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+       EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
 
        return(curr_offset - offset);
 }
@@ -3957,10 +4477,10 @@ static const value_string gsm_a_sm_llc_sapi_vals[] = {
 };
 
 static guint16
-de_sm_sapi(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_sm_sapi(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
 {
-       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, offset << 3, 4, FALSE);
-       proto_tree_add_item(tree, hf_gsm_a_sm_llc_sapi, tvb, offset, 1, FALSE);
+       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, offset << 3, 4, ENC_BIG_ENDIAN);
+       proto_tree_add_item(tree, hf_gsm_a_sm_llc_sapi, tvb, offset, 1, ENC_BIG_ENDIAN);
 
        /* no length check possible */
        return(1);
@@ -3975,10 +4495,10 @@ const true_false_string gsm_a_sm_tdi_value = {
 };
 
 static guint16
-de_sm_tear_down(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_sm_tear_down(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
 {
-       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (offset << 3) + 4, 3, FALSE);
-       proto_tree_add_item(tree, hf_gsm_a_sm_tdi, tvb, offset, 1, FALSE);
+       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (offset << 3) + 4, 3, ENC_BIG_ENDIAN);
+       proto_tree_add_item(tree, hf_gsm_a_sm_tdi, tvb, offset, 1, ENC_BIG_ENDIAN);
 
        /* no length check possible */
        return(1);
@@ -3998,16 +4518,21 @@ static const range_string gsm_a_sm_packet_flow_id_vals[] = {
 };
 
 guint16
-de_sm_pflow_id(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+de_sm_pflow_id(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
 {
        guint32 curr_offset;
+       guint value;
 
        curr_offset = offset;
-       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, curr_offset << 3, 1, FALSE);
-       proto_tree_add_item(tree, hf_gsm_a_sm_packet_flow_id, tvb, curr_offset, 1, FALSE);
+       value = tvb_get_guint8(tvb,curr_offset);
+       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, curr_offset << 3, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_item(tree, hf_gsm_a_sm_packet_flow_id, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
        curr_offset++;
 
-       EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+    if (add_string)
+        g_snprintf(add_string, string_len, " - %s", rval_to_str(value, gsm_a_sm_packet_flow_id_vals, "Unknown"));
+
+       EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
 
        return(curr_offset - offset);
 }
@@ -4049,7 +4574,7 @@ static const value_string gsm_a_tft_param_id_vals[] = {
 };
 
 guint16
-de_sm_tflow_temp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+de_sm_tflow_temp(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
 {
        guint32       curr_offset;
        guint         curr_len;
@@ -4079,9 +4604,9 @@ de_sm_tflow_temp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gch
        pkt_fil_count = oct&0x0f;
        e_bit = (oct>>4)&1;
 
-       proto_tree_add_item(tree,hf_gsm_a_tft_op_code,tvb,curr_offset,1,FALSE);
-       proto_tree_add_item(tree,hf_gsm_a_tft_e_bit,tvb,curr_offset,1,FALSE);
-       proto_tree_add_item(tree,hf_gsm_a_tft_pkt_flt,tvb,curr_offset,1,FALSE);
+       proto_tree_add_item(tree,hf_gsm_a_tft_op_code,tvb,curr_offset,1,ENC_BIG_ENDIAN);
+       proto_tree_add_item(tree,hf_gsm_a_tft_e_bit,tvb,curr_offset,1,ENC_BIG_ENDIAN);
+       proto_tree_add_item(tree,hf_gsm_a_tft_pkt_flt,tvb,curr_offset,1,ENC_BIG_ENDIAN);
 
        curr_offset++;
        curr_len--;
@@ -4105,8 +4630,8 @@ de_sm_tflow_temp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gch
                                proto_tree_add_text(tf_tree,tvb, curr_offset, 1,"Not enough data");
                                return(len);
                        }
-                       proto_tree_add_bits_item(tf_tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3), 4, FALSE);
-                       proto_tree_add_item(tf_tree, hf_gsm_a_tft_pkt_flt_id, tvb, curr_offset, 1, FALSE);
+                       proto_tree_add_bits_item(tf_tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3), 4, ENC_BIG_ENDIAN);
+                       proto_tree_add_item(tf_tree, hf_gsm_a_tft_pkt_flt_id, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
                        curr_offset++;
                        curr_len--;
                        count++;
@@ -4118,9 +4643,9 @@ de_sm_tflow_temp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gch
                                proto_tree_add_text(tf_tree,tvb, curr_offset, 1,"Not enough data");
                                return(len);
                        }
-                       proto_tree_add_bits_item(tf_tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3), 2, FALSE);
-                       proto_tree_add_item(tf_tree, hf_gsm_a_tft_pkt_flt_dir, tvb, curr_offset, 1, FALSE);
-                       proto_tree_add_item(tf_tree, hf_gsm_a_tft_pkt_flt_id, tvb, curr_offset, 1, FALSE);
+                       proto_tree_add_bits_item(tf_tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3), 2, ENC_BIG_ENDIAN);
+                       proto_tree_add_item(tf_tree, hf_gsm_a_tft_pkt_flt_dir, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+                       proto_tree_add_item(tf_tree, hf_gsm_a_tft_pkt_flt_id, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
                        curr_offset++;
                        curr_len--;
 
@@ -4167,10 +4692,10 @@ de_sm_tflow_temp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gch
 
                                case 0x10:
                                        str="IPv4 remote address type";
-                                       proto_tree_add_item(comp_tree,hf_gsm_a_sm_ip4_address,tvb,curr_offset,4,FALSE);
+                                       proto_tree_add_item(comp_tree,hf_gsm_a_sm_ip4_address,tvb,curr_offset,4,ENC_BIG_ENDIAN);
                                        curr_offset+=4;
                                        curr_len-=4;
-                                       proto_tree_add_item(comp_tree,hf_gsm_a_sm_ip4_mask,tvb,curr_offset,4,FALSE);
+                                       proto_tree_add_item(comp_tree,hf_gsm_a_sm_ip4_mask,tvb,curr_offset,4,ENC_BIG_ENDIAN);
                                        curr_offset+=4;
                                        curr_len-=4;
                                        pf_length-=8;
@@ -4178,10 +4703,10 @@ de_sm_tflow_temp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gch
 
                                case 0x20:
                                        str="IPv6 remote address type";
-                                       proto_tree_add_item(comp_tree,hf_gsm_a_sm_ip6_address,tvb,curr_offset,16,FALSE);
+                                       proto_tree_add_item(comp_tree,hf_gsm_a_sm_ip6_address,tvb,curr_offset,16,ENC_NA);
                                        curr_offset+=16;
                                        curr_len-=16;
-                                       proto_tree_add_item(comp_tree,hf_gsm_a_sm_ip6_mask,tvb,curr_offset,16,FALSE);
+                                       proto_tree_add_item(comp_tree,hf_gsm_a_sm_ip6_mask,tvb,curr_offset,16,ENC_NA);
                                        curr_offset+=16;
                                        curr_len-=16;
                                        pf_length-=32;
@@ -4189,7 +4714,7 @@ de_sm_tflow_temp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gch
 
                                case 0x30:
                                        str="Protocol identifier/Next header type";
-                                       proto_tree_add_item(comp_tree,hf_gsm_a_tft_protocol_header,tvb,curr_offset,1,FALSE);
+                                       proto_tree_add_item(comp_tree,hf_gsm_a_tft_protocol_header,tvb,curr_offset,1,ENC_BIG_ENDIAN);
                                        curr_offset+=1;
                                        curr_len-=1;
                                        pf_length-=1;
@@ -4197,7 +4722,7 @@ de_sm_tflow_temp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gch
 
                                case 0x40:
                                        str="Single local port type";
-                                       proto_tree_add_item(comp_tree,hf_gsm_a_tft_port,tvb,curr_offset,2,FALSE);
+                                       proto_tree_add_item(comp_tree,hf_gsm_a_tft_port,tvb,curr_offset,2,ENC_BIG_ENDIAN);
                                        curr_offset+=2;
                                        curr_len-=2;
                                        pf_length-=2;
@@ -4205,9 +4730,9 @@ de_sm_tflow_temp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gch
 
                                case 0x41:
                                        str="Local port range type";
-                                       proto_tree_add_item(comp_tree,hf_gsm_a_tft_port_low,tvb,curr_offset,2,FALSE);
+                                       proto_tree_add_item(comp_tree,hf_gsm_a_tft_port_low,tvb,curr_offset,2,ENC_BIG_ENDIAN);
                                        curr_offset+=2;
-                                       proto_tree_add_item(comp_tree,hf_gsm_a_tft_port_high,tvb,curr_offset,2,FALSE);
+                                       proto_tree_add_item(comp_tree,hf_gsm_a_tft_port_high,tvb,curr_offset,2,ENC_BIG_ENDIAN);
                                        curr_offset+=2;
                                        curr_len-=4;
                                        pf_length-=4;
@@ -4215,7 +4740,7 @@ de_sm_tflow_temp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gch
 
                                case 0x50:
                                        str="Single remote port type";
-                                       proto_tree_add_item(comp_tree,hf_gsm_a_tft_port,tvb,curr_offset,2,FALSE);
+                                       proto_tree_add_item(comp_tree,hf_gsm_a_tft_port,tvb,curr_offset,2,ENC_BIG_ENDIAN);
                                        curr_offset+=2;
                                        curr_len-=2;
                                        pf_length-=2;
@@ -4223,9 +4748,9 @@ de_sm_tflow_temp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gch
 
                                case 0x51:
                                        str="Remote port range type";
-                                       proto_tree_add_item(comp_tree,hf_gsm_a_tft_port_low,tvb,curr_offset,2,FALSE);
+                                       proto_tree_add_item(comp_tree,hf_gsm_a_tft_port_low,tvb,curr_offset,2,ENC_BIG_ENDIAN);
                                        curr_offset+=2;
-                                       proto_tree_add_item(comp_tree,hf_gsm_a_tft_port_high,tvb,curr_offset,2,FALSE);
+                                       proto_tree_add_item(comp_tree,hf_gsm_a_tft_port_high,tvb,curr_offset,2,ENC_BIG_ENDIAN);
                                        curr_offset+=2;
                                        curr_len-=4;
                                        pf_length-=4;
@@ -4233,7 +4758,7 @@ de_sm_tflow_temp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gch
 
                                case 0x60:
                                        str="Security parameter index type";
-                                       proto_tree_add_item(comp_tree,hf_gsm_a_tft_security,tvb,curr_offset,4,FALSE);
+                                       proto_tree_add_item(comp_tree,hf_gsm_a_tft_security,tvb,curr_offset,4,ENC_BIG_ENDIAN);
                                        curr_offset+=4;
                                        curr_len-=4;
                                        pf_length-=4;
@@ -4242,9 +4767,9 @@ de_sm_tflow_temp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gch
 
                                case 0x70:
                                        str="Type of service/Traffic class type";
-                                       proto_tree_add_item(comp_tree,hf_gsm_a_qos_traffic_cls,tvb,curr_offset,1,FALSE);
+                                       proto_tree_add_item(comp_tree,hf_gsm_a_qos_traffic_cls,tvb,curr_offset,1,ENC_BIG_ENDIAN);
                                        curr_offset++;
-                                       proto_tree_add_item(comp_tree,hf_gsm_a_tft_traffic_mask,tvb,curr_offset,1,FALSE);
+                                       proto_tree_add_item(comp_tree,hf_gsm_a_tft_traffic_mask,tvb,curr_offset,1,ENC_BIG_ENDIAN);
                                        curr_offset++;
                                        curr_len-=2;
                                        pf_length-=2;
@@ -4252,8 +4777,8 @@ de_sm_tflow_temp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gch
 
                                case 0x80:
                                        str="Flow label type";
-                                       proto_tree_add_bits_item(comp_tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3), 4, FALSE);
-                                       proto_tree_add_item(comp_tree,hf_gsm_a_tft_flow_label_type,tvb,curr_offset,3,FALSE);
+                                       proto_tree_add_bits_item(comp_tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3), 4, ENC_BIG_ENDIAN);
+                                       proto_tree_add_item(comp_tree,hf_gsm_a_tft_flow_label_type,tvb,curr_offset,3,ENC_BIG_ENDIAN);
                                        curr_offset+=3;
                                        curr_len-=3;
                                        pf_length-=3;
@@ -4282,7 +4807,7 @@ de_sm_tflow_temp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gch
                        tf = proto_tree_add_text(tree, tvb, curr_offset, pf_length+2, "Parameter %d" ,count);
                        tf_tree = proto_item_add_subtree(tf, ett_sm_tft );
                        param = tvb_get_guint8(tvb, curr_offset);
-                       proto_tree_add_item(tf_tree, hf_gsm_a_tft_param_id, tvb, curr_offset, 1, FALSE);
+                       proto_tree_add_item(tf_tree, hf_gsm_a_tft_param_id, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
                        curr_offset += 2;
                        curr_len -= 2;
                        switch (param) {
@@ -4293,9 +4818,9 @@ de_sm_tflow_temp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gch
 
                        case 0x02:
                                proto_tree_add_text(tf_tree, tvb, curr_offset, 2, "Media Component number value: 0x%x",
-                                               tvb_get_bits16(tvb, curr_offset<<3, 16, FALSE));
+                                               tvb_get_bits16(tvb, curr_offset<<3, 16, ENC_BIG_ENDIAN));
                                proto_tree_add_text(tf_tree, tvb, curr_offset+2, 2, "IP flow number: 0x%x",
-                                               tvb_get_bits16(tvb, (curr_offset+2)<<3, 16, FALSE));
+                                               tvb_get_bits16(tvb, (curr_offset+2)<<3, 16, ENC_BIG_ENDIAN));
                                break;
 
                        case 0x03:
@@ -4316,7 +4841,7 @@ de_sm_tflow_temp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gch
                }
        }
 
-       EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+       EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
 
        return(len);
 }
@@ -4325,19 +4850,19 @@ de_sm_tflow_temp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gch
  * [9] 10.5.6.13 Temporary Mobile Group Identity (TMGI)
  */
 static guint16
-de_sm_tmgi(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+de_sm_tmgi(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
 {
        guint32 curr_offset;
 
        curr_offset = offset;
 
-       proto_tree_add_item(tree, hf_gsm_a_sm_tmgi, tvb, curr_offset, 3, FALSE);
+       proto_tree_add_item(tree, hf_gsm_a_sm_tmgi, tvb, curr_offset, 3, ENC_BIG_ENDIAN);
        curr_offset += 3;
 
        NO_MORE_DATA_CHECK(len);
-       curr_offset = dissect_e212_mcc_mnc(tvb, gsm_a_dtap_pinfo, tree, curr_offset, TRUE);
+       curr_offset = dissect_e212_mcc_mnc(tvb, pinfo, tree, curr_offset, TRUE);
 
-       EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+       EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
 
        return(curr_offset - offset);
 }
@@ -4346,7 +4871,7 @@ de_sm_tmgi(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *ad
  * [9] 10.5.6.14 MBMS bearer capabilities
  */
 static guint16
-de_sm_mbms_bearer_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+de_sm_mbms_bearer_cap(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
 {
        guint32 curr_offset, temp32;
        guint8 oct;
@@ -4386,7 +4911,7 @@ de_sm_mbms_bearer_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len
 
        curr_offset+= 1;
 
-       EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+       EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
 
        return(curr_offset - offset);
 }
@@ -4395,15 +4920,15 @@ de_sm_mbms_bearer_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len
  * [9] 10.5.6.15 MBMS protocol configuration options
  */
 static guint16
-de_sm_mbms_prot_conf_opt(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+de_sm_mbms_prot_conf_opt(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
 {
        guint32 curr_offset;
 
        curr_offset = offset;
-       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3), 8, FALSE);
+       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3), 8, ENC_BIG_ENDIAN);
        curr_offset++;
 
-       EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+       EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
 
        return(curr_offset - offset);
 }
@@ -4412,7 +4937,7 @@ de_sm_mbms_prot_conf_opt(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint
  * [9] 10.5.6.16 Enhanced network service access point identifier
  */
 static guint16
-de_sm_enh_nsapi(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_sm_enh_nsapi(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
 {
        guint8  oct;
        const gchar *str;
@@ -4445,16 +4970,38 @@ static const value_string gsm_a_sm_req_type_vals[] = {
 };
 
 static guint16
-de_sm_req_type(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_sm_req_type(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
 {
-       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (offset<<3) + 4, 1, FALSE);
-       proto_tree_add_item(tree, hf_gsm_a_sm_req_type, tvb, offset, 1, FALSE);
+       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (offset<<3) + 4, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_item(tree, hf_gsm_a_sm_req_type, tvb, offset, 1, ENC_BIG_ENDIAN);
 
        /* no length check possible */
        return(1);
 }
 
-guint16 (*gm_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len) = {
+/*
+ * [9] 10.5.6.18 Notification indicator
+ */
+static const value_string gsm_a_sm_notif_ind_vals[] = {
+       { 0x0,  "Reserved"},
+       { 0x1,  "SRVCC handover cancelled, IMS session re-establishment required"},
+       { 0, NULL }
+};
+
+static guint16
+de_sm_notif_ind(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+{
+       guint32 curr_offset;
+
+       curr_offset = offset;
+
+       proto_tree_add_item(tree, hf_gsm_a_sm_notif_ind, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+
+       return(len);
+}
+
+
+guint16 (*gm_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string, int string_len) = {
        /* GPRS Mobility Management Information Elements 10.5.5 */
        de_gmm_attach_res,      /* Attach Result */
        de_gmm_attach_type,     /* Attach Type */
@@ -4473,6 +5020,7 @@ guint16 (*gm_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint
        de_gmm_ms_radio_acc_cap,/* MS Radio Access Capability */
        de_gmm_cause,           /* GMM Cause */
        de_gmm_rai,             /* Routing Area Identification */
+       de_gmm_rai2,    /* Routing Area Identification 2 */
        de_gmm_update_res,      /* Update Result */
        de_gmm_update_type,     /* Update Type */
        de_gmm_ac_ref_nr,       /* A&C Reference Number */
@@ -4482,6 +5030,10 @@ guint16 (*gm_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint
        de_gmm_ps_lcs_cap,      /* PS LCS Capability */
        de_gmm_net_feat_supp,   /* Network Feature Support */
        de_gmm_rat_info_container, /* Inter RAT information container */
+       de_gmm_req_ms_info, /* Requested MS information */
+    NULL, /* UE network capability */
+    de_gmm_eutran_irat_info_container, /* E-UTRAN inter RAT information container */
+    de_gmm_voice_domain_pref, /* Voice domain preference and UE's usage setting */
        /* Session Management Information Elements 10.5.6 */
        de_sm_apn,              /* Access Point Name */
        de_sm_nsapi,            /* Network Service Access Point Identifier */
@@ -4500,6 +5052,7 @@ guint16 (*gm_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint
        de_sm_mbms_prot_conf_opt,       /* MBMS protocol configuration options */
        de_sm_enh_nsapi,        /* Enhanced network service access point identifier */
        de_sm_req_type,         /* Request type */
+       de_sm_notif_ind,        /* Notification indicator */
        /* GPRS Common Information Elements 10.5.7 */
        de_gc_context_stat,     /* PDP Context Status */
        de_gc_radio_prio,       /* Radio Priority */
@@ -4507,6 +5060,7 @@ guint16 (*gm_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint
        de_gc_timer2,           /* GPRS Timer 2 */
        de_gc_radio_prio2,      /* Radio Priority 2 */
        de_gc_mbms_context_stat,/* 10.5.7.6 MBMS context status */
+       de_gc_uplink_data_stat, /* 10.5.7.7 Uplink data status */
        NULL,   /* NONE */
 };
 
@@ -4516,7 +5070,7 @@ guint16 (*gm_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint
  * [7] 9.4.1
  */
 static void
-dtap_gmm_attach_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_attach_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -4525,24 +5079,24 @@ dtap_gmm_attach_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_RECV;
+       pinfo->p2p_dir = P2P_DIR_RECV;
 
        ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_MS_NET_CAP, NULL);
 
        /* Included in attach type
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_COMMON, DE_CIPH_KEY_SEQ_NUM );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_COMMON, DE_CIPH_KEY_SEQ_NUM, NULL);
        curr_offset--;
        curr_len++;
        */
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_ATTACH_TYPE );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_ATTACH_TYPE, NULL);
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_DRX_PARAM );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_DRX_PARAM, NULL);
 
        ELEM_MAND_LV(GSM_A_PDU_TYPE_COMMON, DE_MID , NULL);
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_RAI );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_RAI, " - Old routing area identification");
 
        ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_MS_RAD_ACC_CAP , NULL);
 
@@ -4554,14 +5108,28 @@ dtap_gmm_attach_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
 
        ELEM_OPT_TLV( 0x33 , GSM_A_PDU_TYPE_GM, DE_PS_LCS_CAP , NULL);
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       ELEM_OPT_TLV(0x11, GSM_A_PDU_TYPE_COMMON, DE_MS_CM_2, NULL);
+
+       ELEM_OPT_TLV(0x20, GSM_A_PDU_TYPE_COMMON, DE_MS_CM_3, NULL);
+
+       ELEM_OPT_TLV(0x40, GSM_A_PDU_TYPE_DTAP, DE_SUP_CODEC_LIST, NULL);
+
+       ELEM_OPT_TLV(0x58, NAS_PDU_TYPE_EMM, DE_EMM_UE_NET_CAP, NULL);
+
+       ELEM_OPT_TLV(0x1A, GSM_A_PDU_TYPE_COMMON, DE_MID, " - Additional mobile identity");
+
+       ELEM_OPT_TLV(0x1B, GSM_A_PDU_TYPE_GM, DE_RAI_2, " - Additional old routing area identification");
+
+       ELEM_OPT_TLV(0x5D, GSM_A_PDU_TYPE_GM, DE_VOICE_DOMAIN_PREF, NULL);
+
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
  * [7] 9.4.2
  */
 static void
-dtap_gmm_attach_acc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_attach_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -4570,23 +5138,23 @@ dtap_gmm_attach_acc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_SENT;
+       pinfo->p2p_dir = P2P_DIR_SENT;
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND_H );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND_H, NULL);
        curr_len++;
        curr_offset--;
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_ATTACH_RES );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_ATTACH_RES, NULL);
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER, NULL);
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_RAD_PRIO_2 );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_RAD_PRIO_2, " - Radio priority for TOM8");
        curr_len++;
        curr_offset--;
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_RAD_PRIO );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_RAD_PRIO, " - Radio priority for SMS");
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_RAI );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_RAI, NULL);
 
        ELEM_OPT_TV( 0x19 , GSM_A_PDU_TYPE_GM, DE_P_TMSI_SIG, NULL);
 
@@ -4608,33 +5176,43 @@ dtap_gmm_attach_acc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
 
        ELEM_OPT_TLV( 0x34 , GSM_A_PDU_TYPE_DTAP, DE_EMERGENCY_NUM_LIST , NULL);
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       ELEM_OPT_TV_SHORT( 0xA0 , GSM_A_PDU_TYPE_GM , DE_REQ_MS_INFO , NULL);
+
+       ELEM_OPT_TLV( 0x37 , GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2 , " - T3319" );
+
+       ELEM_OPT_TLV( 0x38 , GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2 , " - T3323" );
+
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
  * [7] 9.4.3
  */
 static void
-dtap_gmm_attach_com(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_attach_com(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
 
        guint32 curr_offset;
-/*    guint32  consumed; */
+       guint32 consumed;
        guint   curr_len;
 
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_RECV;
+       pinfo->p2p_dir = P2P_DIR_RECV;
+
+       ELEM_OPT_TLV(0x27, GSM_A_PDU_TYPE_GM, DE_RAT_INFO_CONTAINER, " - Inter RAT handover information");
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       ELEM_OPT_TLV(0x2B, GSM_A_PDU_TYPE_GM, DE_EUTRAN_IRAT_INFO_CONTAINER, " - E-UTRAN inter RAT handover information");
+
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
  * [7] 9.4.4
  */
 static void
-dtap_gmm_attach_rej(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_attach_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -4643,20 +5221,20 @@ dtap_gmm_attach_rej(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_SENT;
+       pinfo->p2p_dir = P2P_DIR_SENT;
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_GMM_CAUSE );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_GMM_CAUSE, NULL);
 
        ELEM_OPT_TLV( 0x2A , GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2 , " - T3302" );
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
  * [7] 9.4.5
  */
 static void
-dtap_gmm_detach_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_detach_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -4665,29 +5243,29 @@ dtap_gmm_detach_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_SENT;
+       pinfo->p2p_dir = P2P_DIR_SENT;
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND_H );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND_H, NULL);
        /* Force to standy might be wrong - To decode it correct, we need the direction */
        curr_len++;
        curr_offset--;
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_DETACH_TYPE );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_DETACH_TYPE, NULL);
 
        ELEM_OPT_TV( 0x25 , GSM_A_PDU_TYPE_GM, DE_GMM_CAUSE , NULL);
 
        ELEM_OPT_TLV( 0x18 , GSM_A_PDU_TYPE_COMMON, DE_MID , " - P-TMSI" );
 
-       ELEM_OPT_TLV( 0x19 , GSM_A_PDU_TYPE_GM, DE_P_TMSI_SIG , NULL);
+       ELEM_OPT_TLV( 0x19 , GSM_A_PDU_TYPE_GM, DE_P_TMSI_SIG_2 , NULL);
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
  * [7] 9.4.6
  */
 static void
-dtap_gmm_detach_acc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_detach_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -4696,25 +5274,25 @@ dtap_gmm_detach_acc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_RECV;
+       pinfo->p2p_dir = P2P_DIR_RECV;
 
        if ( curr_len != 0 )
        {
-               ELEM_MAND_V(GSM_A_PDU_TYPE_COMMON, DE_SPARE_NIBBLE );
+               ELEM_MAND_V(GSM_A_PDU_TYPE_COMMON, DE_SPARE_NIBBLE, NULL);
                curr_len++;
                curr_offset--;
 
-               ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND );
+               ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND, NULL);
        }
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
  * [7] 9.4.7
  */
 static void
-dtap_gmm_ptmsi_realloc_cmd(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_ptmsi_realloc_cmd(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -4723,28 +5301,28 @@ dtap_gmm_ptmsi_realloc_cmd(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guin
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_SENT;
+       pinfo->p2p_dir = P2P_DIR_SENT;
 
        ELEM_MAND_LV(GSM_A_PDU_TYPE_COMMON, DE_MID , " - Allocated P-TMSI" );
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_RAI );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_RAI, NULL);
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_COMMON, DE_SPARE_NIBBLE );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_COMMON, DE_SPARE_NIBBLE, NULL);
        curr_len++;
        curr_offset--;
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND, NULL);
 
-       ELEM_OPT_TV( 0x19 , GSM_A_PDU_TYPE_COMMON, DE_MID , " - P-TMSI Signature" );
+       ELEM_OPT_TV( 0x19 , GSM_A_PDU_TYPE_GM, DE_P_TMSI_SIG , " - P-TMSI Signature" );
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
  * [7] 9.4.8
  */
 static void
-dtap_gmm_ptmsi_realloc_com(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_ptmsi_realloc_com(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
 /*    guint32  consumed; */
@@ -4753,16 +5331,16 @@ dtap_gmm_ptmsi_realloc_com(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guin
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_RECV;
+       pinfo->p2p_dir = P2P_DIR_RECV;
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
  * [7] 9.4.9
  */
 static void
-dtap_gmm_auth_ciph_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_auth_ciph_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -4772,19 +5350,19 @@ dtap_gmm_auth_ciph_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint le
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_SENT;
+       pinfo->p2p_dir = P2P_DIR_SENT;
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_IMEISV_REQ );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_IMEISV_REQ, NULL);
        curr_offset--;
        curr_len++;
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_CIPH_ALG );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_CIPH_ALG, NULL);
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_AC_REF_NUM_H );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_AC_REF_NUM_H, NULL);
        curr_offset--;
        curr_len++;
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND, NULL);
 
        ELEM_OPT_TV( 0x21 , GSM_A_PDU_TYPE_DTAP, DE_AUTH_PARAM_RAND , NULL);
 
@@ -4810,20 +5388,20 @@ dtap_gmm_auth_ciph_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint le
 
        if ( curr_len == 0  )
        {
-               EXTRANEOUS_DATA_CHECK(curr_len, 0);
+               EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
        return;
        }
 
        ELEM_OPT_TLV( 0x28 , GSM_A_PDU_TYPE_DTAP, DE_AUTH_PARAM_AUTN , NULL);
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
  * [7] 9.4.10
  */
 static void
-dtap_gmm_auth_ciph_resp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_auth_ciph_resp(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -4832,13 +5410,13 @@ dtap_gmm_auth_ciph_resp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_RECV;
+       pinfo->p2p_dir = P2P_DIR_RECV;
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_COMMON, DE_SPARE_NIBBLE );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_COMMON, DE_SPARE_NIBBLE, NULL);
        curr_offset--;
        curr_len++;
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_AC_REF_NUM );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_AC_REF_NUM, NULL);
 
        ELEM_OPT_TV( 0x22 , GSM_A_PDU_TYPE_DTAP, DE_AUTH_RESP_PARAM , NULL);
 
@@ -4846,14 +5424,14 @@ dtap_gmm_auth_ciph_resp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
 
        ELEM_OPT_TLV( 0x29 , GSM_A_PDU_TYPE_DTAP, DE_AUTH_RESP_PARAM_EXT , NULL);
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
  * [7] 9.4.11
  */
 static void
-dtap_gmm_auth_ciph_rej(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_auth_ciph_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint   curr_len;
@@ -4861,16 +5439,16 @@ dtap_gmm_auth_ciph_rej(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint le
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_SENT;
+       pinfo->p2p_dir = P2P_DIR_SENT;
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
  * [7] 9.4.10a
  */
 static void
-dtap_gmm_auth_ciph_fail(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_auth_ciph_fail(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -4879,20 +5457,20 @@ dtap_gmm_auth_ciph_fail(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_RECV;
+       pinfo->p2p_dir = P2P_DIR_RECV;
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_GMM_CAUSE );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_GMM_CAUSE, NULL);
 
        ELEM_OPT_TLV( 0x30 , GSM_A_PDU_TYPE_DTAP, DE_AUTH_FAIL_PARAM , NULL);
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
  * [7] 9.4.12
  */
 static void
-dtap_gmm_ident_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_ident_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint   curr_len;
@@ -4900,30 +5478,30 @@ dtap_gmm_ident_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_SENT;
+       pinfo->p2p_dir = P2P_DIR_SENT;
 
 /*  If the half octect that are about to get decoded is the LAST in the octetstream, the macro will call return BEFORE we get a chance to fix the index. The end result will be that the first half-octet will be decoded but not the last. */
 #if 0
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_ID_TYPE_2 );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_ID_TYPE_2, NULL);
        curr_offset--;
        curr_len++;
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND_H );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND_H, NULL);
 #endif
 
-       elem_v(tvb, tree, GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND_H, curr_offset);
-       elem_v(tvb, tree, GSM_A_PDU_TYPE_GM, DE_ID_TYPE_2, curr_offset);
+       elem_v(tvb, tree, pinfo, GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND_H, curr_offset, NULL);
+       elem_v(tvb, tree, pinfo, GSM_A_PDU_TYPE_GM, DE_ID_TYPE_2, curr_offset, NULL);
 
        curr_offset+=1;
        curr_len-=1;
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
  * [7] 9.4.13
  */
 static void
-dtap_gmm_ident_res(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_ident_res(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -4932,18 +5510,18 @@ dtap_gmm_ident_res(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_RECV;
+       pinfo->p2p_dir = P2P_DIR_RECV;
 
        ELEM_MAND_LV(GSM_A_PDU_TYPE_COMMON, DE_MID , NULL);
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
  * [7] 9.4.14
  */
 static void
-dtap_gmm_rau_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_rau_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -4952,17 +5530,17 @@ dtap_gmm_rau_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_RECV;
+       pinfo->p2p_dir = P2P_DIR_RECV;
 
        /* is included in update type
-       ELEM_MAND_V(GSM_A_PDU_TYPE_COMMON, DE_CIPH_KEY_SEQ_NUM );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_COMMON, DE_CIPH_KEY_SEQ_NUM, NULL);
        curr_offset--;
        curr_len++;
        */
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_UPD_TYPE );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_UPD_TYPE, NULL);
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_RAI );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_RAI, " - Old routing area identification");
 
        ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_MS_RAD_ACC_CAP , NULL);
 
@@ -4982,14 +5560,30 @@ dtap_gmm_rau_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
 
        ELEM_OPT_TLV( 0x33 , GSM_A_PDU_TYPE_GM, DE_PS_LCS_CAP , NULL);
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       ELEM_OPT_TLV(0x35, GSM_A_PDU_TYPE_GM, DE_MBMS_CTX_STATUS, NULL);
+
+       ELEM_OPT_TLV(0x58, NAS_PDU_TYPE_EMM, DE_EMM_UE_NET_CAP, NULL);
+
+       ELEM_OPT_TLV(0x1A, GSM_A_PDU_TYPE_COMMON, DE_MID, " - Additional mobile identity");
+
+       ELEM_OPT_TLV(0x1B, GSM_A_PDU_TYPE_GM, DE_RAI_2, " - Additional old routing area identification");
+
+       ELEM_OPT_TLV(0x11, GSM_A_PDU_TYPE_COMMON, DE_MS_CM_2, NULL);
+
+       ELEM_OPT_TLV(0x20, GSM_A_PDU_TYPE_COMMON, DE_MS_CM_3, NULL);
+
+       ELEM_OPT_TLV(0x40, GSM_A_PDU_TYPE_DTAP, DE_SUP_CODEC_LIST, NULL);
+
+       ELEM_OPT_TLV(0x5D, GSM_A_PDU_TYPE_GM, DE_VOICE_DOMAIN_PREF, NULL);
+
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
  * [7] 9.4.15
  */
 static void
-dtap_gmm_rau_acc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_rau_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -4998,23 +5592,23 @@ dtap_gmm_rau_acc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_SENT;
+       pinfo->p2p_dir = P2P_DIR_SENT;
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_UPD_RES );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_UPD_RES, NULL);
        curr_offset--;
        curr_len++;
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND, NULL);
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER, " - Periodic RA update timer");
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_RAI );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_RAI, NULL);
 
        ELEM_OPT_TV( 0x19 , GSM_A_PDU_TYPE_GM, DE_P_TMSI_SIG , NULL);
 
        ELEM_OPT_TLV( 0x18 , GSM_A_PDU_TYPE_COMMON, DE_MID , " - Allocated P-TMSI");
 
-       ELEM_OPT_TLV( 0x23 , GSM_A_PDU_TYPE_COMMON, DE_MID , NULL);
+       ELEM_OPT_TLV( 0x23 , GSM_A_PDU_TYPE_COMMON, DE_MID , " - MS identity");
 
        ELEM_OPT_TLV( 0x26 , GSM_A_PDU_TYPE_GM, DE_REC_N_PDU_NUM_LIST , NULL);
 
@@ -5034,14 +5628,22 @@ dtap_gmm_rau_acc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
 
        ELEM_OPT_TLV( 0x34 , GSM_A_PDU_TYPE_DTAP, DE_EMERGENCY_NUM_LIST , NULL);
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       ELEM_OPT_TLV(0x35 , GSM_A_PDU_TYPE_GM, DE_MBMS_CTX_STATUS , NULL);
+
+       ELEM_OPT_TV_SHORT(0xA0 , GSM_A_PDU_TYPE_GM , DE_REQ_MS_INFO , NULL);
+
+       ELEM_OPT_TLV(0x37 , GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2 , " - T3319");
+
+       ELEM_OPT_TLV(0x38 , GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2 , " - T3323");
+
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
  * [7] 9.4.16
  */
 static void
-dtap_gmm_rau_com(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_rau_com(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -5050,21 +5652,22 @@ dtap_gmm_rau_com(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_RECV;
+       pinfo->p2p_dir = P2P_DIR_RECV;
        /* [7] 10.5.5.11 */
        ELEM_OPT_TLV( 0x26 , GSM_A_PDU_TYPE_GM, DE_REC_N_PDU_NUM_LIST , NULL);
        /* Inter RAT information container 10.5.5.24 TS 24.008 version 6.8.0 Release 6 */
-       /*TO DO: Implement */
-       ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_RAT_INFO_CONTAINER , NULL);
+       ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_RAT_INFO_CONTAINER , " - Inter RAT handover information");
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       ELEM_OPT_TLV(0x2B, GSM_A_PDU_TYPE_GM, DE_EUTRAN_IRAT_INFO_CONTAINER, " - E-UTRAN inter RAT handover information");
+
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
  * [7] 9.4.17
  */
 static void
-dtap_gmm_rau_rej(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_rau_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -5073,26 +5676,26 @@ dtap_gmm_rau_rej(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_SENT;
+       pinfo->p2p_dir = P2P_DIR_SENT;
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_GMM_CAUSE );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_GMM_CAUSE, NULL);
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_COMMON, DE_SPARE_NIBBLE );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_COMMON, DE_SPARE_NIBBLE, NULL);
        curr_offset--;
        curr_len++;
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND, NULL);
 
        ELEM_OPT_TLV( 0x26 , GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2 , " - T3302" );
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
  * [7] 9.4.18
  */
 static void
-dtap_gmm_status(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_status(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -5101,18 +5704,18 @@ dtap_gmm_status(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+       pinfo->p2p_dir = P2P_DIR_UNKNOWN;
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_GMM_CAUSE );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_GMM_CAUSE, NULL);
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
  * [8] 9.4.19 GMM Information
  */
 static void
-dtap_gmm_information(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_information(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -5121,7 +5724,7 @@ dtap_gmm_information(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_SENT;
+       pinfo->p2p_dir = P2P_DIR_SENT;
 
        ELEM_OPT_TLV( 0x43 , GSM_A_PDU_TYPE_DTAP, DE_NETWORK_NAME , " - Full Name" );
 
@@ -5135,14 +5738,14 @@ dtap_gmm_information(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
 
        ELEM_OPT_TLV( 0x49 , GSM_A_PDU_TYPE_DTAP, DE_DAY_SAVING_TIME , NULL);
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
  * [7] 9.4.20
  */
 static void
-dtap_gmm_service_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_service_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -5151,15 +5754,15 @@ dtap_gmm_service_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_RECV;
+       pinfo->p2p_dir = P2P_DIR_RECV;
 
        /* Is included in SRVC TYPE
-       ELEM_MAND_V(GSM_A_PDU_TYPE_COMMON, DE_CIPH_KEY_SEQ_NUM );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_COMMON, DE_CIPH_KEY_SEQ_NUM, NULL);
        curr_offset--;
        curr_len++;
        */
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SRVC_TYPE );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SRVC_TYPE, NULL);
 
        /* P-TMSI Mobile station identity 10.5.1.4 M LV 6 */
        ELEM_MAND_LV(GSM_A_PDU_TYPE_COMMON, DE_MID, NULL);
@@ -5169,14 +5772,16 @@ dtap_gmm_service_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
        /* MBMS context status 10.5.7.6 TLV 2 - 18 */
        ELEM_OPT_TLV( 0x35 , GSM_A_PDU_TYPE_GM, DE_MBMS_CTX_STATUS , NULL);
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       ELEM_OPT_TLV(0x36, GSM_A_PDU_TYPE_GM, DE_UPLINK_DATA_STATUS, NULL);
+
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
  * [7] 9.4.21
  */
 static void
-dtap_gmm_service_acc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_service_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -5185,21 +5790,21 @@ dtap_gmm_service_acc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_SENT;
+       pinfo->p2p_dir = P2P_DIR_SENT;
 
        ELEM_OPT_TLV( 0x32 , GSM_A_PDU_TYPE_GM, DE_PDP_CONTEXT_STAT , NULL);
 
        /* MBMS context status 10.5.7.6 TLV 2 - 18 */
        ELEM_OPT_TLV( 0x35 , GSM_A_PDU_TYPE_GM, DE_MBMS_CTX_STATUS , NULL);
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
  * [7] 9.4.22
  */
 static void
-dtap_gmm_service_rej(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_service_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -5208,11 +5813,11 @@ dtap_gmm_service_rej(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_SENT;
+       pinfo->p2p_dir = P2P_DIR_SENT;
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_GMM_CAUSE );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_GMM_CAUSE, NULL);
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
@@ -5220,7 +5825,7 @@ dtap_gmm_service_rej(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
  * Direction:                  MS to network
  */
 static void
-dtap_sm_act_pdp_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_act_pdp_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -5229,13 +5834,13 @@ dtap_sm_act_pdp_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+       pinfo->p2p_dir = P2P_DIR_UNKNOWN;
        /* MS to network */
-       gsm_a_dtap_pinfo->link_dir = P2P_DIR_UL;
+       pinfo->link_dir = P2P_DIR_UL;
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_NET_SAPI );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_NET_SAPI, " - Requested NSAPI");
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_LLC_SAPI );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_LLC_SAPI, " - Requested LLC SAPI");
 
        ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_QOS , " - Requested QoS" );
 
@@ -5247,7 +5852,7 @@ dtap_sm_act_pdp_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
 
        ELEM_OPT_TV_SHORT(0xA0, GSM_A_PDU_TYPE_GM, DE_REQ_TYPE, NULL);
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
@@ -5255,7 +5860,7 @@ dtap_sm_act_pdp_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
  * Direction:                  network to MS
  */
 static void
-dtap_sm_act_pdp_acc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_act_pdp_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -5264,32 +5869,32 @@ dtap_sm_act_pdp_acc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+       pinfo->p2p_dir = P2P_DIR_UNKNOWN;
        /* Network to MS*/
-       gsm_a_dtap_pinfo->link_dir = P2P_DIR_DL;
+       pinfo->link_dir = P2P_DIR_DL;
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_LLC_SAPI );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_LLC_SAPI, " - Negotiated LLC SAPI");
 
        ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_QOS , " - Negotiated QoS" );
 
 #if 0
        /* This is done automatically */
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SPARE );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SPARE, NULL);
        curr_offset--;
        curr_len++;
 #endif
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_RAD_PRIO );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_RAD_PRIO, NULL);
 
-       ELEM_OPT_TLV( 0x2B , GSM_A_PDU_TYPE_GM, DE_PD_PRO_ADDR , NULL);
+       ELEM_OPT_TLV( 0x2B , GSM_A_PDU_TYPE_GM, DE_PD_PRO_ADDR , " - PDP address");
 
        ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
 
        ELEM_OPT_TLV( 0x34 , GSM_A_PDU_TYPE_GM, DE_PACKET_FLOW_ID , NULL);
 
-       ELEM_OPT_TLV( 0x39 , GSM_A_PDU_TYPE_GM, DE_SM_CAUSE_2, NULL );
+       ELEM_OPT_TLV( 0x39 , GSM_A_PDU_TYPE_GM, DE_SM_CAUSE_2, " - SM cause");
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
@@ -5297,7 +5902,7 @@ dtap_sm_act_pdp_acc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
  * Direction:                  network to MS
  */
 static void
-dtap_sm_act_pdp_rej(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_act_pdp_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -5306,15 +5911,15 @@ dtap_sm_act_pdp_rej(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+       pinfo->p2p_dir = P2P_DIR_UNKNOWN;
        /* Network to MS*/
-       gsm_a_dtap_pinfo->link_dir = P2P_DIR_DL;
+       pinfo->link_dir = P2P_DIR_DL;
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SM_CAUSE );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SM_CAUSE, NULL);
 
        ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
@@ -5322,7 +5927,7 @@ dtap_sm_act_pdp_rej(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
  * Direction:                  MS to network
  */
 static void
-dtap_sm_act_sec_pdp_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_act_sec_pdp_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -5331,13 +5936,13 @@ dtap_sm_act_sec_pdp_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+       pinfo->p2p_dir = P2P_DIR_UNKNOWN;
        /* MS to Network */
-       gsm_a_dtap_pinfo->link_dir = P2P_DIR_UL;
+       pinfo->link_dir = P2P_DIR_UL;
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_NET_SAPI );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_NET_SAPI, " - Requested NSAPI");
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_LLC_SAPI );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_LLC_SAPI, " - Requested LLC SAPI");
 
        ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_QOS , " - Requested QoS" );
 
@@ -5348,7 +5953,7 @@ dtap_sm_act_sec_pdp_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
 
        ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
@@ -5356,7 +5961,7 @@ dtap_sm_act_sec_pdp_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
  * Direction:                  network to MS
  */
 static void
-dtap_sm_act_sec_pdp_acc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_act_sec_pdp_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -5365,19 +5970,19 @@ dtap_sm_act_sec_pdp_acc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+       pinfo->p2p_dir = P2P_DIR_UNKNOWN;
        /* Network to MS*/
-       gsm_a_dtap_pinfo->link_dir = P2P_DIR_DL;
+       pinfo->link_dir = P2P_DIR_DL;
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_LLC_SAPI );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_LLC_SAPI, " - Negotiated LLC SAPI");
 
        ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_QOS , " - Negotiated QoS" );
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_RAD_PRIO);
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_RAD_PRIO, NULL);
 
 #if 0
        /* This is done automatically */
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SPARE );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SPARE, NULL);
        curr_offset--;
        curr_len++;
 #endif
@@ -5386,7 +5991,7 @@ dtap_sm_act_sec_pdp_acc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
 
        ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
@@ -5394,7 +5999,7 @@ dtap_sm_act_sec_pdp_acc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
  * Direction:                  network to MS
  */
 static void
-dtap_sm_act_sec_pdp_rej(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_act_sec_pdp_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -5403,15 +6008,15 @@ dtap_sm_act_sec_pdp_rej(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+       pinfo->p2p_dir = P2P_DIR_UNKNOWN;
        /* Network to MS*/
-       gsm_a_dtap_pinfo->link_dir = P2P_DIR_DL;
+       pinfo->link_dir = P2P_DIR_DL;
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SM_CAUSE );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SM_CAUSE, NULL);
 
        ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
@@ -5419,7 +6024,7 @@ dtap_sm_act_sec_pdp_rej(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
  * Direction:                  network to MS
  */
 static void
-dtap_sm_req_pdp_act(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_req_pdp_act(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -5428,9 +6033,9 @@ dtap_sm_req_pdp_act(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+       pinfo->p2p_dir = P2P_DIR_UNKNOWN;
        /* Network to MS*/
-       gsm_a_dtap_pinfo->link_dir = P2P_DIR_DL;
+       pinfo->link_dir = P2P_DIR_DL;
 
        ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_PD_PRO_ADDR , " - Offered PDP address" );
 
@@ -5438,7 +6043,7 @@ dtap_sm_req_pdp_act(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
 
        ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
@@ -5446,7 +6051,7 @@ dtap_sm_req_pdp_act(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
  * Direction:                  MS to network
  */
 static void
-dtap_sm_req_pdp_act_rej(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_req_pdp_act_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -5455,15 +6060,15 @@ dtap_sm_req_pdp_act_rej(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+       pinfo->p2p_dir = P2P_DIR_UNKNOWN;
        /* MS to  Network */
-       gsm_a_dtap_pinfo->link_dir = P2P_DIR_UL;
+       pinfo->link_dir = P2P_DIR_UL;
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SM_CAUSE );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SM_CAUSE, NULL);
 
        ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
@@ -5471,7 +6076,7 @@ dtap_sm_req_pdp_act_rej(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
  * Direction:                  network to MS
  */
 static void
-dtap_sm_mod_pdp_req_net(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_mod_pdp_req_net(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -5480,29 +6085,31 @@ dtap_sm_mod_pdp_req_net(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+       pinfo->p2p_dir = P2P_DIR_UNKNOWN;
        /* Network to MS */
-       gsm_a_dtap_pinfo->link_dir = P2P_DIR_DL;
+       pinfo->link_dir = P2P_DIR_DL;
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM,DE_RAD_PRIO);
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM,DE_RAD_PRIO, NULL);
 #if 0
        /* This is done automatically */
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SPARE );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SPARE, NULL);
        curr_offset--;
        curr_len++;
 #endif
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_LLC_SAPI );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_LLC_SAPI, " - Requested LLC SAPI");
 
        ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_QOS , " - New QoS" );
 
-       ELEM_OPT_TLV( 0x2B , GSM_A_PDU_TYPE_GM, DE_PD_PRO_ADDR , NULL);
+       ELEM_OPT_TLV( 0x2B , GSM_A_PDU_TYPE_GM, DE_PD_PRO_ADDR , " - PDP address");
 
        ELEM_OPT_TLV( 0x34 , GSM_A_PDU_TYPE_GM, DE_PACKET_FLOW_ID , NULL);
 
        ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       ELEM_OPT_TLV(0x36 , GSM_A_PDU_TYPE_GM, DE_TRAFFIC_FLOW_TEMPLATE , NULL);
+
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
@@ -5510,7 +6117,7 @@ dtap_sm_mod_pdp_req_net(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
  * Direction:                  MS to network
  */
 static void
-dtap_sm_mod_pdp_req_ms(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_mod_pdp_req_ms(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -5519,9 +6126,9 @@ dtap_sm_mod_pdp_req_ms(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint le
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+       pinfo->p2p_dir = P2P_DIR_UNKNOWN;
        /* MS to Network */
-       gsm_a_dtap_pinfo->link_dir = P2P_DIR_UL;
+       pinfo->link_dir = P2P_DIR_UL;
 
        ELEM_OPT_TV( 0x32 , GSM_A_PDU_TYPE_GM, DE_LLC_SAPI , " - Requested LLC SAPI" );
 
@@ -5531,7 +6138,7 @@ dtap_sm_mod_pdp_req_ms(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint le
 
        ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
@@ -5539,7 +6146,7 @@ dtap_sm_mod_pdp_req_ms(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint le
  * Direction:                  MS to network
  */
 static void
-dtap_sm_mod_pdp_acc_ms(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_mod_pdp_acc_ms(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -5548,13 +6155,13 @@ dtap_sm_mod_pdp_acc_ms(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint le
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+       pinfo->p2p_dir = P2P_DIR_UNKNOWN;
        /* MS to Network */
-       gsm_a_dtap_pinfo->link_dir = P2P_DIR_UL;
+       pinfo->link_dir = P2P_DIR_UL;
 
        ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
@@ -5562,7 +6169,7 @@ dtap_sm_mod_pdp_acc_ms(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint le
  * Direction:                  Network to MS
  */
 static void
-dtap_sm_mod_pdp_acc_net(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_mod_pdp_acc_net(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -5571,9 +6178,9 @@ dtap_sm_mod_pdp_acc_net(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+       pinfo->p2p_dir = P2P_DIR_UNKNOWN;
        /* Network to MS */
-       gsm_a_dtap_pinfo->link_dir = P2P_DIR_DL;
+       pinfo->link_dir = P2P_DIR_DL;
 
        ELEM_OPT_TLV( 0x30 , GSM_A_PDU_TYPE_GM, DE_QOS , " - Negotiated QoS" );
 
@@ -5585,7 +6192,7 @@ dtap_sm_mod_pdp_acc_net(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
 
        ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
@@ -5593,7 +6200,7 @@ dtap_sm_mod_pdp_acc_net(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
  * Direction:                  both
  */
 static void
-dtap_sm_mod_pdp_rej(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_mod_pdp_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -5602,16 +6209,16 @@ dtap_sm_mod_pdp_rej(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+       pinfo->p2p_dir = P2P_DIR_UNKNOWN;
        /* Network or the MS */
-       gsm_a_dtap_pinfo->link_dir = LINK_DIR_UNKNOWN;
+       pinfo->link_dir = LINK_DIR_UNKNOWN;
 
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SM_CAUSE );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SM_CAUSE, NULL);
 
        ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
@@ -5619,7 +6226,7 @@ dtap_sm_mod_pdp_rej(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
  * Direction:                  both
  */
 static void
-dtap_sm_deact_pdp_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_deact_pdp_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -5628,10 +6235,10 @@ dtap_sm_deact_pdp_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_UNKNOWN;
-       gsm_a_dtap_pinfo->link_dir = LINK_DIR_UNKNOWN;
+       pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+       pinfo->link_dir = LINK_DIR_UNKNOWN;
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SM_CAUSE );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SM_CAUSE, NULL);
 
        ELEM_OPT_TV_SHORT( 0x90 , GSM_A_PDU_TYPE_GM , DE_TEAR_DOWN_IND , NULL);
 
@@ -5640,7 +6247,7 @@ dtap_sm_deact_pdp_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len
        /* MBMS context status 10.5.7.6 TLV 2 - 18 */
        ELEM_OPT_TLV( 0x35 , GSM_A_PDU_TYPE_GM, DE_MBMS_CTX_STATUS , NULL);
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
@@ -5648,7 +6255,7 @@ dtap_sm_deact_pdp_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len
  * Direction:                  both
  */
 static void
-dtap_sm_deact_pdp_acc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_deact_pdp_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -5657,15 +6264,95 @@ dtap_sm_deact_pdp_acc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_UNKNOWN;
-       gsm_a_dtap_pinfo->link_dir = LINK_DIR_UNKNOWN;
+       pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+       pinfo->link_dir = LINK_DIR_UNKNOWN;
 
        ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
 
        /* MBMS context status 10.5.7.6 TLV 2 - 18 */
        ELEM_OPT_TLV( 0x35 , GSM_A_PDU_TYPE_GM, DE_MBMS_CTX_STATUS , NULL);
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
+}
+
+/*
+ * [8] 9.5.15a Request Secondary PDP Context Activation
+ * Direction:                  network to MS
+ */
+static void
+dtap_sm_req_sec_pdp_act(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
+{
+       guint32 curr_offset;
+       guint32 consumed;
+       guint   curr_len;
+
+       curr_offset = offset;
+       curr_len = len;
+
+       pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+       pinfo->link_dir = P2P_DIR_DL;
+
+       /* Required QoS Quality of service 10.5.6.5 M LV 13-17 */
+       ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_QOS , " - Required QoS");
+
+       /* Linked TI Linked TI 10.5.6.7 M LV 2-3 */
+       ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_LINKED_TI , NULL);
+
+       /* 36 TFT Traffic Flow Template 10.5.6.12 O TLV 3-257 */
+       ELEM_OPT_TLV(0x36, GSM_A_PDU_TYPE_GM, DE_TRAFFIC_FLOW_TEMPLATE, NULL);
+
+       /* 27 Protocol configuration options Protocol configuration options 10.5.6.3 O TLV 3 - 253 */
+       ELEM_OPT_TLV(0x27, GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT, NULL);
+
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
+}
+
+/*
+ * [8] 9.5.15b Request Secondary PDP Context Activation Reject
+ * Direction:                  MS to network
+ */
+static void
+dtap_sm_req_sec_pdp_act_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
+{
+       guint32 curr_offset;
+       guint32 consumed;
+       guint   curr_len;
+
+       curr_offset = offset;
+       curr_len = len;
+
+       pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+       pinfo->link_dir = P2P_DIR_UL;
+
+       /* SM cause SM cause 10.5.6.6 M V 1 */
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SM_CAUSE, NULL);
+
+       /* 27 Protocol configuration options Protocol configuration options 10.5.6.3 O TLV 3 - 253 */
+       ELEM_OPT_TLV(0x27, GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT, NULL);
+
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
+}
+
+/*
+ * [8] 9.5.16a Notification
+ * Direction:                  network to MS
+ */
+static void
+dtap_sm_notif(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
+{
+       guint32 curr_offset;
+       guint32 consumed;
+       guint   curr_len;
+
+       curr_offset = offset;
+       curr_len = len;
+
+       pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+       pinfo->link_dir = P2P_DIR_DL;
+
+       ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_SM_NOTIF_IND, NULL);
+
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
@@ -5673,7 +6360,7 @@ dtap_sm_deact_pdp_acc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len
  * Direction:                  both
  */
 static void
-dtap_sm_status(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_status(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -5682,12 +6369,12 @@ dtap_sm_status(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_UNKNOWN;
-       gsm_a_dtap_pinfo->link_dir = LINK_DIR_UNKNOWN;
+       pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+       pinfo->link_dir = LINK_DIR_UNKNOWN;
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SM_CAUSE );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SM_CAUSE, NULL);
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
@@ -5695,7 +6382,7 @@ dtap_sm_status(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
  * Direction:                  MS to network
  */
 static void
-dtap_sm_act_mbms_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_act_mbms_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -5704,13 +6391,13 @@ dtap_sm_act_mbms_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_RECV;
+       pinfo->p2p_dir = P2P_DIR_RECV;
 
        /* Requested MBMS NSAPI Enhanced Network service access point identifier 10.5.6.16 M V */
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_ENH_NSAPI );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_ENH_NSAPI, " - Requested MBMS NSAPI");
 
        /* Requested LLC SAPI LLC service access point identifier 10.5.6.9 M V 1 */
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_LLC_SAPI );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_LLC_SAPI, " - Requested LLC SAPI");
 
        /* Supported MBMS bearer capabilities MBMS bearer capabilities 10.5.6.14 M LV 2 - 3 */
        ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_MBMS_BEARER_CAP , NULL );
@@ -5724,7 +6411,7 @@ dtap_sm_act_mbms_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
        /* 35 MBMS protocol configuration options MBMS protocol configuration options 10.5.6.15 O TLV 3 - 253 */
        ELEM_OPT_TLV( 0x35 , GSM_A_PDU_TYPE_GM, DE_MBMS_PROT_CONF_OPT , NULL);
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
@@ -5732,7 +6419,7 @@ dtap_sm_act_mbms_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
  * Direction:                  network to MS
  */
 static void
-dtap_sm_act_mbms_acc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_act_mbms_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -5741,15 +6428,15 @@ dtap_sm_act_mbms_acc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_SENT;
+       pinfo->p2p_dir = P2P_DIR_SENT;
 
        ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_TMGI, NULL);
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_LLC_SAPI );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_LLC_SAPI, " - Negotiated LLC SAPI");
 
        ELEM_OPT_TLV( 0x35 , GSM_A_PDU_TYPE_GM, DE_MBMS_PROT_CONF_OPT , NULL);
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
@@ -5757,7 +6444,7 @@ dtap_sm_act_mbms_acc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
  * Direction:                  network to MS
  */
 static void
-dtap_sm_act_mbms_rej(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_act_mbms_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -5766,13 +6453,13 @@ dtap_sm_act_mbms_rej(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_SENT;
+       pinfo->p2p_dir = P2P_DIR_SENT;
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SM_CAUSE );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SM_CAUSE, NULL);
 
        ELEM_OPT_TLV( 0x35 , GSM_A_PDU_TYPE_GM, DE_MBMS_PROT_CONF_OPT , NULL);
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
@@ -5780,7 +6467,7 @@ dtap_sm_act_mbms_rej(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
  * Direction:                  network to MS
  */
 static void
-dtap_sm_req_mbms_act(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_req_mbms_act(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -5789,9 +6476,9 @@ dtap_sm_req_mbms_act(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_SENT;
+       pinfo->p2p_dir = P2P_DIR_SENT;
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_NET_SAPI );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_NET_SAPI, " - Linked NSAPI");
 
        ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_PD_PRO_ADDR , " - Offered multicast address" );
 
@@ -5799,7 +6486,7 @@ dtap_sm_req_mbms_act(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
 
        ELEM_OPT_TLV( 0x35 , GSM_A_PDU_TYPE_GM, DE_MBMS_PROT_CONF_OPT , NULL);
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
@@ -5807,7 +6494,7 @@ dtap_sm_req_mbms_act(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
  * Direction:                  MS to network
  */
 static void
-dtap_sm_req_mbms_rej(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_req_mbms_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -5816,18 +6503,18 @@ dtap_sm_req_mbms_rej(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_RECV;
+       pinfo->p2p_dir = P2P_DIR_RECV;
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SM_CAUSE );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SM_CAUSE, NULL);
 
        ELEM_OPT_TLV( 0x35 , GSM_A_PDU_TYPE_GM, DE_MBMS_PROT_CONF_OPT , NULL);
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 #define        NUM_GSM_DTAP_MSG_GMM (sizeof(gsm_a_dtap_msg_gmm_strings)/sizeof(value_string))
 static gint ett_gsm_dtap_msg_gmm[NUM_GSM_DTAP_MSG_GMM];
-static void (*dtap_msg_gmm_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len) = {
+static void (*dtap_msg_gmm_fcn[])(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len) = {
        dtap_gmm_attach_req,            /* Attach Request */
        dtap_gmm_attach_acc,            /* Attach Accept */
        dtap_gmm_attach_com,            /* Attach Complete */
@@ -5856,7 +6543,7 @@ static void (*dtap_msg_gmm_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offse
 
 #define        NUM_GSM_DTAP_MSG_SM (sizeof(gsm_a_dtap_msg_sm_strings)/sizeof(value_string))
 static gint ett_gsm_dtap_msg_sm[NUM_GSM_DTAP_MSG_SM];
-static void (*dtap_msg_sm_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len) = {
+static void (*dtap_msg_sm_fcn[])(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len) = {
        dtap_sm_act_pdp_req,            /* Activate PDP Context Request */
        dtap_sm_act_pdp_acc,            /* Activate PDP Context Accept */
        dtap_sm_act_pdp_rej,            /* Activate PDP Context Reject */
@@ -5883,6 +6570,9 @@ static void (*dtap_msg_sm_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset
        dtap_sm_act_mbms_rej,           /* Activate MBMS Context Reject */
        dtap_sm_req_mbms_act,           /* Request MBMS Context Activation */
        dtap_sm_req_mbms_rej,           /* Request MBMS Context Activation Reject */
+       dtap_sm_req_sec_pdp_act,        /* Request Secondary PDP Context Activation */
+       dtap_sm_req_sec_pdp_act_rej,/* Request Secondary PDP Context Activation Reject */
+       dtap_sm_notif,              /* Notification */
        NULL,   /* NONE */
 };
 
@@ -5953,12 +6643,12 @@ proto_register_gsm_a_gm(void)
        },
        { &hf_gsm_a_qos_del_order,
                { "Delivery order", "gsm_a.qos.del_order",
-                 FT_UINT8, BASE_DEC, VALS(gsm_a_qos_traffic_cls_vals), 0x18,
+                 FT_UINT8, BASE_DEC, VALS(gsm_a_qos_del_order_vals), 0x18,
                  NULL, HFILL }
        },
        { &hf_gsm_a_qos_del_of_err_sdu,
                { "Delivery of erroneous SDUs", "gsm_a.qos.del_of_err_sdu",
-                 FT_UINT8, BASE_DEC, VALS(gsm_a_qos_del_of_err_sdu_vals), 0x03,
+                 FT_UINT8, BASE_DEC, VALS(gsm_a_qos_del_of_err_sdu_vals), 0x07,
                  NULL, HFILL }
        },
        { &hf_gsm_a_qos_ber,
@@ -6017,7 +6707,7 @@ proto_register_gsm_a_gm(void)
                  NULL, HFILL }
        },
        { &hf_gsm_a_sm_ip4_address,
-               { "IPv4 adress", "gsm_a.sm.ip4_address",
+               { "IPv4 address", "gsm_a.sm.ip4_address",
                  FT_IPv4, BASE_NONE, NULL, 0x0,
                NULL, HFILL }
        },
@@ -6027,12 +6717,12 @@ proto_register_gsm_a_gm(void)
                NULL, HFILL }
        },
        { &hf_gsm_a_sm_ip6_address,
-               { "IPv6 adress", "gsm_a.sm.ip6_address",
+               { "IPv6 address", "gsm_a.sm.ip6_address",
                  FT_IPv6, BASE_NONE, NULL, 0x0,
                NULL, HFILL }
        },
        { &hf_gsm_a_sm_ip6_mask,
-               { "IPv6 adress mask", "gsm_a.sm.ip6_mask",
+               { "IPv6 address mask", "gsm_a.sm.ip6_mask",
                  FT_IPv6, BASE_NONE, NULL, 0x0,
                NULL, HFILL }
        },
@@ -6191,6 +6881,61 @@ proto_register_gsm_a_gm(void)
                FT_UINT8, BASE_DEC, NULL, 0x1f,
                NULL, HFILL }
        },
+       { &hf_gsm_a_gm_nsapi_5_ul_stat,
+               { "NSAPI(5) uplink status", "gsm_a.gm.nsapi_5_ul_stat",
+               FT_BOOLEAN, 8, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_nsapi_6_ul_stat,
+               { "NSAPI(6) uplink status", "gsm_a.gm.nsapi_6_ul_stat",
+               FT_BOOLEAN, 8, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_nsapi_7_ul_stat,
+               { "NSAPI(7) uplink status", "gsm_a.gm.nsapi_7_ul_stat",
+               FT_BOOLEAN, 8, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_nsapi_8_ul_stat,
+               { "NSAPI(8) uplink status", "gsm_a.gm.nsapi_8_ul_stat",
+               FT_BOOLEAN, 8, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_nsapi_9_ul_stat,
+               { "NSAPI(9) uplink status", "gsm_a.gm.nsapi_9_ul_stat",
+               FT_BOOLEAN, 8, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_nsapi_10_ul_stat,
+               { "NSAPI(10) uplink status", "gsm_a.gm.nsapi_10_ul_stat",
+               FT_BOOLEAN, 8, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_nsapi_11_ul_stat,
+               { "NSAPI(11) uplink status", "gsm_a.gm.nsapi_11_ul_stat",
+               FT_BOOLEAN, 8, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_nsapi_12_ul_stat,
+               { "NSAPI(12) uplink status", "gsm_a.gm.nsapi_12_ul_stat",
+               FT_BOOLEAN, 8, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_nsapi_13_ul_stat,
+               { "NSAPI(13) uplink status", "gsm_a.gm.nsapi_13_ul_stat",
+               FT_BOOLEAN, 8, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_nsapi_14_ul_stat,
+               { "NSAPI(14) uplink status", "gsm_a.gm.nsapi_14_ul_stat",
+               FT_BOOLEAN, 8, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_nsapi_15_ul_stat,
+               { "NSAPI(15) uplink status", "gsm_a.gm.nsapi_15_ul_stat",
+               FT_BOOLEAN, 8, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
+               NULL, HFILL }
+       },
        { &hf_gsm_a_gm_pco_pid,
                { "Protocol or Container ID", "gsm_a.gm.pco_pid",
                FT_UINT16, BASE_DEC, NULL, 0x0,
@@ -6236,6 +6981,26 @@ proto_register_gsm_a_gm(void)
                FT_BOOLEAN, 8, TFS(&gsm_a_gm_gps_c_vals), 0x01,
                NULL, HFILL }
        },
+       { &hf_gsm_a_gm_req_ms_info_irat,
+               { "I-RAT","gsm_a.gm.req_ms_info_irat",
+               FT_BOOLEAN, 8, TFS(&gsm_a_gm_req_ms_info_irat_vals), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_req_ms_info_irat2,
+               { "I-RAT2","gsm_a.gm.req_ms_info_irat2",
+               FT_BOOLEAN, 8, TFS(&gsm_a_gm_req_ms_info_irat2_vals), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_ue_usage_setting,
+               { "UE's usage setting","gsm_a.gm.ue_usage_setting",
+               FT_BOOLEAN, 8, TFS(&gsm_a_gm_ue_usage_setting_vals), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_voice_domain_pref_for_eutran,
+               { "Voice domain preference for E-UTRAN","gsm_a.gm.voice_domain_pref_for_eutran",
+               FT_UINT8, BASE_DEC, VALS(gsm_a_gm_voice_domain_pref_for_eutran_vals), 0x0,
+               NULL, HFILL }
+       },
        { &hf_gsm_a_sm_pdp_type_org,
                { "PDP type organization", "gsm_a.sm.pdp_type_org",
                FT_UINT8, BASE_DEC, VALS(gsm_a_sm_pdp_type_org_vals), 0x0f,
@@ -6431,9 +7196,9 @@ proto_register_gsm_a_gm(void)
                FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_ps_irat_s1_vals), 0x40,
                NULL, HFILL }
        },
-       { &hf_gsm_a_gmm_net_cap_csfb,
-               { "CSFB Capability", "gsm_a.gmm.net_cap.csfb",
-               FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_csfb_vals), 0x20,
+       { &hf_gsm_a_gmm_net_cap_comb_proc,
+               { "EMM Combined procedures capability", "gsm_a.gmm.net_cap.comb_proc",
+               FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_comb_proc_vals), 0x20,
                NULL, HFILL }
        },
        { &hf_gsm_a_gmm_net_cap_isr,
@@ -6451,6 +7216,11 @@ proto_register_gsm_a_gm(void)
                FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_epc_vals), 0x04,
                NULL, HFILL }
        },
+       { &hf_gsm_a_gmm_net_cap_nf,
+               { "NF Capability", "gsm_a.gmm.net_cap.nf",
+               FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_nf_vals), 0x02,
+               NULL, HFILL }
+       },
        { &hf_gsm_a_sm_tmgi,
                { "Temporary Mobile Group Identity (TMGI)", "gsm_a.sm.tmgi",
                  FT_UINT24, BASE_HEX, NULL, 0x0,
@@ -6466,15 +7236,290 @@ proto_register_gsm_a_gm(void)
                  FT_UINT8, BASE_DEC, VALS(gsm_a_sm_req_type_vals), 0x07,
                NULL, HFILL }
        },
+       { &hf_gsm_a_sm_notif_ind,
+               { "Notification indicator value", "gsm_a.sm.notif_ind",
+                 FT_UINT8, BASE_DEC, VALS(gsm_a_sm_notif_ind_vals), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_ctrled_early_cm_sending,
+               { "Controlled early Classmark Sending", "gsm_a.gm.rac.comp_int_meas_cap",
+                  FT_BOOLEAN, 8, TFS(&tfs_implemented_not_implemented), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_pseudo_sync,
+               { "Pseudo Synchronisation", "gsm_a.gm.rac.pseudo_sync",
+                  FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_vgcs,
+               { "Voice Group Call Service", "gsm_a.gm.rac.vgcs",
+                  FT_BOOLEAN, 8, TFS(&gsm_a_gm_vgcs), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_vbs,
+               { "Voice Broadcast Service", "gsm_a.gm.rac.vbs",
+                  FT_BOOLEAN, 8, TFS(&gsm_a_gm_vbs), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_multislot_capability,
+               { "Multislot capability struct", "gsm_a.gm.rac.multislot_capability",
+                  FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_hscsd_multi_slot_class,
+               { "HSCSD multislot class", "gsm_a.gm.rac.hscsd_multi_slot_class",
+                  FT_UINT8, BASE_DEC, VALS(gsm_a_gm_multi_slot_vals), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_gprs_multi_slot_class,
+               { "GPRS multislot class", "gsm_a.gm.rac.gprs_multi_slot_class",
+                  FT_UINT8, BASE_DEC, VALS(gsm_a_gm_multi_slot_vals), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_gprs_ext_dyn_alloc_cap,
+               { "GPRS Extended Dynamic Allocation Capability", "gsm_a.gm.rac.gprs_ext_dyn_alloc_cap",
+                  FT_BOOLEAN, 8, TFS(&tfs_implemented_not_implemented), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_ecsd_multi_slot_class,
+               { "ECSD multislot class", "gsm_a.gm.rac.ecsd_multi_slot_class",
+                  FT_UINT8, BASE_DEC, VALS(gsm_a_gm_multi_slot_vals), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_egprs_multi_slot_class,
+               { "EGPRS multislot class", "gsm_a.gm.rac.egprs_multi_slot_class",
+                  FT_UINT8, BASE_DEC, VALS(gsm_a_gm_multi_slot_vals), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_egprs_ext_dyn_alloc_cap,
+               { "EGPRS Extended Dynamic Allocation Capability", "gsm_a.gm.rac.egprs_ext_dyn_alloc_cap",
+                  FT_BOOLEAN, 8, TFS(&tfs_implemented_not_implemented), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_dtm_gprs_multi_slot_class,
+               { "DTM GPRS Multi Slot Class", "gsm_a.gm.rac.dtm_gprs_multi_slot_class",
+                  FT_UINT8, BASE_DEC, VALS(gsm_a_gm_dtm_gprs_multi_slot_class_vals), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_single_slt_dtm,
+               { "Single Slot DTM", "gsm_a.gm.rac.single_slt_dtm",
+                  FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_dtm_egprs_multi_slot_cls_pres,
+               { "DTM EGPRS Multi Slot Class", "gsm_a.gm.rac.dtm_egprs_multi_slot_cls_pres",
+                  FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_dtm_egprs_multi_slot_class,
+               { "DTM EGPRS Multi Slot Class", "gsm_a.gm.rac.dtm_egprs_multi_slot_class",
+                  FT_UINT8, BASE_DEC, VALS(gsm_a_gm_dtm_gprs_multi_slot_class_vals), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_8psk_pow_cap_pres,
+               { "8PSK Power Capability Bits", "gsm_a.gm.rac.8psk_pow_cap_pres",
+                  FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_comp_int_meas_cap,
+               { "COMPACT Interference Measurement Capability", "gsm_a.gm.rac.comp_int_meas_cap",
+                  FT_BOOLEAN, 8, TFS(&tfs_implemented_not_implemented), 0x0,
+               NULL, HFILL }
+       },
        { &hf_gsm_a_gm_rel_lev_ind,
                { "Revision Level Indicator", "gsm_a.gm.rel_lev_ind",
-                  FT_UINT8, BASE_HEX, VALS(gsm_a_gm_revision_level_indicator_vals), 0x0,
+                  FT_BOOLEAN, 8, TFS(&gsm_a_gm_revision_level_indicator), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_umts_fdd_cap,
+               { "UMTS FDD Radio Access Technology Capability", "gsm_a.gm.rac.umts_fdd_cap",
+                  FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_umts_384_tdd_ra_cap,
+               { "UMTS 3.84 Mcps TDD Radio Access Technology Capability", "gsm_a.gm.rac.umts_384_tdd_ra_cap",
+                  FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_cdma2000_cap,
+               { "CDMA 2000 Radio Access Technology Capability", "gsm_a.gm.rac.cdma2000_cap",
+                  FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_umts_128_tdd_ra_cap,
+               { "UMTS 1.28 Mcps TDD Radio Access Technology Capability", "gsm_a.gm.rac.umts_128_tdd_ra_cap",
+                  FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_geran_feat_pkg,
+               { "GERAN Feature Package 1", "gsm_a.gm.rac.geran_feat_pkg",
+                  FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_mod_based_multi_slot_class_support,
+               { "Modulation based multislot class support", "gsm_a.gm.rac.mod_based_multi_slot_class_support",
+                  FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_geran_iu_mode_cap,
+               { "GERAN Iu mode", "gsm_a.gm.rac.geran_iu_mode_cap",
+                  FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_flo_iu_cap,
+               { "FLO Iu Capability", "gsm_a.gm.rac.flo_iu_cap",
+                  FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_mult_tbf_cap,
+               { "Multiple TBF Capability", "gsm_a.gm.rac.mult_tbf_cap",
+                  FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_down_adv_rec_perf,
+               { "Downlink Advanced Receiver Performance", "gsm_a.gm.rac.down_adv_rec_perf",
+                  FT_UINT8, BASE_DEC, VALS(gsm_a_gm_down_adv_rec_perf_vals), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_ext_rlc_mac_ctrl_msg_seg_cap,
+               { "Extended RLC/MAC Control Message Segmentation Capability", "gsm_a.gm.rac.ext_rlc_mac_ctrl_msg_seg_cap",
+                  FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_dtm_enh_cap,
+               { "DTM Enhancements Capability", "gsm_a.gm.rac.dtm_enh_cap",
+                  FT_BOOLEAN, 8, TFS(&gsm_a_gm_dtm_enh_cap), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_dtm_gprs_high_multi_slot_class,
+               { "DTM GPRS High Multi Slot Class", "gsm_a.gm.rac.dtm_gprs_high_multi_slot_class",
+                  FT_UINT8, BASE_DEC, VALS(gsm_a_gm_dtm_gprs_high_multi_slot_class_vals), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_dtm_egprs_high_multi_slot_class,
+               { "DTM EGPRS High Multi Slot Class", "gsm_a.gm.rac.dtm_egprs_high_multi_slot_class",
+                  FT_UINT8, BASE_DEC, VALS(gsm_a_gm_dtm_gprs_high_multi_slot_class_vals), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_ps_ho_cap,
+               { "PS Handover Capability", "gsm_a.gm.rac.ps_ho_cap",
+                  FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_dtm_ho_cap,
+               { "DTM Handover Capability", "gsm_a.gm.rac.dtm_ho_cap",
+                  FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_multi_slot_cap_red_down_dual_carrier,
+               { "Multislot Capability Reduction for Downlink Dual Carrier", "gsm_a.gm.rac.multi_slot_cap_red_down_dual_carrier",
+                  FT_UINT8, BASE_DEC, VALS(gsm_a_gm_multi_slot_cap_red_down_dual_carrier_vals), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_down_dual_carrier_dtm_cap,
+               { "Downlink Dual Carrier for DTM Capability", "gsm_a.gm.rac.down_dual_carrier_dtm_cap",
+                  FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_flex_ts_assign,
+               { "Flexible Timeslot Assignment", "gsm_a.gm.rac.flex_ts_assign",
+                  FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_gan_ps_ho_cap,
+               { "GAN PS Handover Capability", "gsm_a.gm.rac.gan_ps_ho_cap",
+                  FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_rlc_non_pers_mode,
+               { "RLC Non-persistent Mode", "gsm_a.gm.rac.rlc_non_pers_mode",
+                  FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_reduced_lat_cap,
+               { "Reduced Latency Capability", "gsm_a.gm.rac.reduced_lat_cap",
+                  FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_ul_egprs2,
+               { "Uplink EGPRS2", "gsm_a.gm.rac.ul_egprs2",
+                  FT_UINT8, BASE_DEC, VALS(gsm_a_gm_ul_egprs2_vals), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_dl_egprs2,
+               { "Downlink EGPRS2", "gsm_a.gm.rac.dl_egprs2",
+                  FT_UINT8, BASE_DEC, VALS(gsm_a_gm_dl_egprs2_vals), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_eutra_fdd_support,
+               { "E-UTRA FDD support", "gsm_a.gm.rac.eutra_fdd_support",
+                  FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_eutra_tdd_support,
+               { "E-UTRA TDD support", "gsm_a.gm.rac.eutra_tdd_support",
+                  FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_geran_to_eutra_support_in_geran_ptm,
+               { "GERAN to E-UTRA support in GERAN packet transfer mode", "gsm_a.gm.rac.geran_to_eutra_support_in_geran_ptm",
+                  FT_UINT8, BASE_DEC, VALS(gsm_a_gm_geran_to_eutra_support_in_geran_ptm_vals), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_prio_based_resel_support,
+               { "Priority-based reselection support", "gsm_a.gm.rac.prio_based_resel_support",
+                  FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_alt_efta_multi_slot_class,
+               { "Alternative EFTA Multislot Class", "gsm_a.gm.rac.alt_efta_multi_slot_class",
+                  FT_UINT8, BASE_DEC, VALS(gsm_a_gm_alt_efta_multi_slot_class_vals), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_efta_multi_slot_cap_red_down_dual_carrier,
+               { "EFTA Multislot Capability Reduction for Downlink Dual Carrier", "gsm_a.gm.rac.efta_multi_slot_cap_red_down_dual_carrier",
+                  FT_UINT8, BASE_DEC, VALS(gsm_a_gm_multi_slot_cap_red_down_dual_carrier_vals), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_ind_up_layer_pdu_start_cap_for_rlc_um,
+               { "Indication of Upper Layer PDU Start Capability for RLC UM", "gsm_a.gm.rac.ind_up_layer_pdu_start_cap_for_rlc_um",
+                  FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_emst_cap,
+               { "Enhanced Multiplexing for Single TBF Capability", "gsm_a.gm.rac.emst_cap",
+                  FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_mtti_cap,
+               { "Multiple TTI Capability", "gsm_a.gm.rac.mtti_cap",
+                  FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_utra_csg_cell_report,
+               { "UTRA CSG Cells Reporting", "gsm_a.gm.rac.utra_csg_cell_report",
+                  FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_rac_eutra_csg_cell_report,
+               { "E-UTRA CSG Cells Reporting", "gsm_a.gm.rac.mtti_cap",
+                  FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_sm_ti_flag,
+               { "TI Flag", "gsm_a.sm.ti_flag",
+                  FT_BOOLEAN, 8, TFS(&gsm_a_sm_ti_flag_vals), 0x80,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_sm_ext,
+               { "Extension", "gsm_a.sm.ext",
+                  FT_BOOLEAN, 8, NULL, 0x80,
                NULL, HFILL }
        },
-       };
+};             
 
        /* Setup protocol subtree array */
-#define        NUM_INDIVIDUAL_ELEMS    17
+#define        NUM_INDIVIDUAL_ELEMS    18
        gint *ett[NUM_INDIVIDUAL_ELEMS +
                  NUM_GSM_DTAP_MSG_GMM + NUM_GSM_DTAP_MSG_SM +
                  NUM_GSM_GM_ELEM];
@@ -6496,6 +7541,7 @@ proto_register_gsm_a_gm(void)
        ett[14] = &ett_sm_tft;
        ett[15] = &ett_gmm_gprs_timer;
        ett[16] = &ett_gmm_network_cap;
+       ett[17] = &ett_gsm_a_gm_msrac_multislot_capability;
 
        last_offset = NUM_INDIVIDUAL_ELEMS;
 
@@ -6534,4 +7580,5 @@ proto_reg_handoff_gsm_a_gm(void)
 {
        data_handle = find_dissector("data");
        rrc_irat_ho_info_handle = find_dissector("rrc.irat.irat_ho_info");
+       lte_rrc_ue_eutra_cap_handle = find_dissector("lte-rrc.ue_eutra_cap");
 }