From Pascal Quantin:
[obnox/wireshark/wip.git] / epan / dissectors / packet-gsm_a_gm.c
index f77058f29e460e0aef8009b3faeb89e27ef90bd9..b06b62b801db2b30761209ad933c98b41ecbf723 100644 (file)
  *   In association with Telecommunications Research Center
  *   Vienna (ftw.)Betriebs-GmbH within the Project Metawin.
  *
+ * Various updates, enhancements and fixes
+ * Copyright 2009, Gerasimos Dimitriadis <dimeg [AT] intracom.gr>
+ * In association with Intracom Telecom SA
+ *
  * Title               3GPP                    Other
  *
  *   Reference [7]
@@ -29,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$
  *
@@ -59,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>
@@ -68,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"
 
@@ -128,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 }
 };
 
@@ -150,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" },
@@ -159,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" },
@@ -166,11 +178,18 @@ const value_string gsm_gm_elem_strings[] = {
        { 0x00, "Packet Data Protocol Address" },
        { 0x00, "Quality Of Service" },
        { 0x00, "SM Cause" },
+       { 0x00, "SM Cause 2" },
        { 0x00, "Linked TI" },
        { 0x00, "LLC Service Access Point Identifier" },
        { 0x00, "Tear Down Indicator" },
        { 0x00, "Packet Flow Identifier" },
        { 0x00, "Traffic Flow Template" },
+       { 0x00, "Temporary Mobile Group Identity (TMGI)" },
+       { 0x00, "MBMS bearer capabilities" },
+       { 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" },
@@ -178,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 }
 };
@@ -192,7 +212,7 @@ static int hf_gsm_a_dtap_msg_gmm_type = -1;
 static int hf_gsm_a_dtap_msg_sm_type = -1;
 int hf_gsm_a_gm_elem_id = -1;
 static int hf_gsm_a_qos_delay_cls      = -1;
-static int hf_gsm_a_qos_qos_reliability_cls = -1;
+static int hf_gsm_a_qos_reliability_cls = -1;
 static int hf_gsm_a_qos_traffic_cls = -1;
 static int hf_gsm_a_qos_del_order = -1;
 static int hf_gsm_a_qos_del_of_err_sdu = -1;
@@ -210,6 +230,8 @@ static int hf_gsm_a_ptmsi_sig2 =-1;
 static int hf_gsm_a_tft_op_code = -1;
 static int hf_gsm_a_tft_e_bit = -1;
 static int hf_gsm_a_tft_pkt_flt = -1;
+static int hf_gsm_a_tft_pkt_flt_id = -1;
+static int hf_gsm_a_tft_pkt_flt_dir = -1;
 static int hf_gsm_a_sm_ip4_address = -1;
 static int hf_gsm_a_sm_ip4_mask = -1;
 static int hf_gsm_a_sm_ip6_address = -1;
@@ -220,11 +242,14 @@ static int hf_gsm_a_tft_port_low = -1;
 static int hf_gsm_a_tft_port_high = -1;
 static int hf_gsm_a_tft_security = -1;
 static int hf_gsm_a_tft_traffic_mask = -1;
+static int hf_gsm_a_tft_flow_label_type = -1;
+static int hf_gsm_a_tft_param_id = -1;
 static int hf_gsm_a_gm_acc_tech_type = -1;
 static int hf_gsm_a_gm_acc_cap_struct_len = -1;
 static int hf_gsm_a_gm_sms_value = -1;
 static int hf_gsm_a_gm_sm_value = -1;
 static int hf_gsm_a_gm_sm_ext = -1;
+static int hf_gsm_a_gm_link_dir = -1;
 static int hf_gsm_a_gm_cause = -1;
 
 static int hf_gsm_a_gm_fop = -1;
@@ -241,6 +266,18 @@ 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;
 static int hf_gsm_a_gm_apc = -1;
@@ -249,7 +286,114 @@ 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;
+static int hf_gsm_a_qos_prec_class = -1;
+static int hf_gsm_a_qos_traf_handl_prio = -1;
+static int hf_gsm_a_qos_trans_delay = -1;
+static int hf_gsm_a_qos_signalling_ind = -1;
+static int hf_gsm_a_qos_source_stat_desc = -1;
+static int hf_gsm_a_qos_max_bitrate_upl = -1;
+static int hf_gsm_a_qos_max_bitrate_downl = -1;
+static int hf_gsm_a_qos_guar_bitrate_upl = -1;
+static int hf_gsm_a_qos_guar_bitrate_downl = -1;
+static int hf_gsm_a_qos_max_bitrate_upl_ext = -1;
+static int hf_gsm_a_qos_max_bitrate_downl_ext = -1;
+static int hf_gsm_a_qos_guar_bitrate_upl_ext = -1;
+static int hf_gsm_a_qos_guar_bitrate_downl_ext = -1;
+static int hf_gsm_a_sm_cause = -1;
+static int hf_gsm_a_sm_cause_2 = -1;
+static int hf_gsm_a_sm_llc_sapi = -1;
+static int hf_gsm_a_sm_tdi = -1;
+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;
+static int hf_gsm_a_gmm_net_cap_smgprs = -1;
+static int hf_gsm_a_gmm_net_cap_ucs2 = -1;
+static int hf_gsm_a_gmm_net_cap_ss_scr_ind = -1;
+static int hf_gsm_a_gmm_net_cap_solsa = -1;
+static int hf_gsm_a_gmm_net_cap_rev = -1;
+static int hf_gsm_a_gmm_net_cap_pfc = -1;
+static int hf_gsm_a_gmm_net_cap_ext_gea_bits = -1;
+static int hf_gsm_a_gmm_net_cap_gea2 = -1;
+static int hf_gsm_a_gmm_net_cap_gea3 = -1;
+static int hf_gsm_a_gmm_net_cap_gea4 = -1;
+static int hf_gsm_a_gmm_net_cap_gea5 = -1;
+static int hf_gsm_a_gmm_net_cap_gea6 = -1;
+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_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;
@@ -266,6 +410,8 @@ static gint ett_gmm_attach_type = -1;
 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;
 
@@ -273,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 */
 
@@ -291,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);
@@ -311,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,
@@ -324,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);
@@ -334,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" },
@@ -347,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);
@@ -365,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);
@@ -378,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;
@@ -483,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;
@@ -544,13 +691,13 @@ de_gmm_drx_param(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_,
        proto_tree_add_text(tf_tree,
                tvb, curr_offset, 1,
                "Split PG Cycle Code: %s (%u)",
-               str, 
+               str,
                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++;
 
@@ -570,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);
@@ -587,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);
@@ -604,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;
@@ -625,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);
 }
@@ -653,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);
@@ -673,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);
@@ -690,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;
@@ -734,175 +881,175 @@ 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);
 }
 
 /*
- * [7] 10.5.5.12
+ * [9] 10.5.5.12 MS network capability
  */
-guint16
-de_gmm_ms_net_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
-{
-       guint8  oct;
-       guint32 curr_offset;
-       guint   curr_len;
-       guint   gea_val;
+static const true_false_string gsm_a_gmm_net_cap_gea_vals = {
+       "Encryption algorithm available",
+       "Encryption algorithm not available"
+};
 
-       static const gchar *answer_gea[2]={
-               "encryption algorithm not available",
-               "encryption algorithm available" };
+static const true_false_string gsm_a_gmm_net_cap_smdch_vals = {
+       "Mobile station supports mobile terminated point to point SMS via dedicated signalling channels",
+       "Mobile station does not support mobile terminated point to point SMS via dedicated signalling channels"
+};
 
-       static const gchar *answer_smdch[2]={
-               "Mobile station does not support mobile terminated point to point SMS via dedicated signalling channels",
-               "Mobile station supports mobile terminated point to point SMS via dedicated signalling channels" };
+static const true_false_string gsm_a_gmm_net_cap_smgprs_vals = {
+       "Mobile station supports mobile terminated point to point SMS via GPRS packet data channels",
+       "Mobile station does not support mobile terminated point to point SMS via GPRS packet data channels"
+};
 
-       static const gchar *answer_smgprs[2]={
-               "Mobile station does not support mobile terminated point to point SMS via GPRS packet data channels",
-               "Mobile station supports mobile terminated point to point SMS via GPRS packet data channels" };
+static const true_false_string gsm_a_gmm_net_cap_ucs2_vals = {
+       "The ME has no preference between the use of the default alphabet and the use of UCS2",
+       "The ME has a preference for the default alphabet (defined in 3GPP TS 23.038 [8b]) over UCS2"
+};
 
-       static const gchar *answer_ucs2[2]= {
-               "the ME has a preference for the default alphabet (defined in 3GPP TS 23.038 [8b]) over UCS2",
-               "the ME has no preference between the use of the default alphabet and the use of UCS2" };
+static const value_string gsm_a_gmm_net_cap_ss_scr_ind_vals[]={
+       { 0x00, "Default value of phase 1" },
+       { 0x01, "capability of handling of ellipsis notation and phase 2 error handling" },
+       { 0x02, "For future use, interpreted as Capability of handling of ellipsis notation and phase 2 error handling" },
+       { 0x03, "For future use, interpreted as Capability of handling of ellipsis notation and phase 2 error handling" },
+       { 0x00, NULL }
+};
 
-       static const gchar *answer_ssid[4]={
-               "default value of phase 1",
-               "capability of handling of ellipsis notation and phase 2 error handling",
-               "capability of handling of ellipsis notation and phase 2 error handling",
-               "capability of handling of ellipsis notation and phase 2 error handling" };
+static const true_false_string gsm_a_gmm_net_cap_solsa_vals = {
+       "The ME supports SoLSA",
+       "The ME does not support SoLSA"
+};
 
-       static const gchar *answer_solsa[2]={
-               "The ME does not support SoLSA",
-               "The ME supports SoLSA" };
-                       
-       static const gchar *answer_rev[2]={
-               "used by a mobile station not supporting R99 or later versions of the protocol",
-               "used by a mobile station supporting R99 or later versions of the protocol" };
+static const true_false_string gsm_a_gmm_net_cap_rev_vals = {
+       "Used by a mobile station supporting R99 or later versions of the protocol",
+       "Used by a mobile station not supporting R99 or later versions of the protocol"
+};
 
-       static const gchar *answer_pfc[2]={
-               "Mobile station does not support BSS packet flow procedures",
-               "Mobile station does support BSS packet flow procedures" };
+static const true_false_string gsm_a_gmm_net_cap_pfc_vals = {
+       "Mobile station does support BSS packet flow procedures",
+       "Mobile station does not support BSS packet flow procedures"
+};
 
-       static const gchar *answer_lcs[2]={
-               "LCS value added location request notification capability not supported" ,
-               "LCS value added location request notification capability supported" };
+static const true_false_string gsm_a_gmm_net_cap_lcs_vals = {
+       "LCS value added location request notification capability supported",
+       "LCS value added location request notification capability not supported"
+};
 
-       static const gchar *answer_ps_irat[2]={
-               "PS inter-RAT HO to UTRAN Iu mode not supported" ,
-               "PS inter-RAT HO to UTRAN Iu mode supported" };
+static const true_false_string gsm_a_gmm_net_cap_ps_irat_iu_vals = {
+       "PS inter-RAT HO to UTRAN Iu mode supported",
+       "PS inter-RAT HO to UTRAN Iu mode not supported"
+};
 
-       curr_len = len;
-       curr_offset = offset;
+static const true_false_string gsm_a_gmm_net_cap_ps_irat_s1_vals = {
+       "PS inter-RAT HO to E-UTRAN S1 mode supported",
+       "PS inter-RAT HO to E-UTRAN S1 mode not supported"
+};
 
-       if ( curr_len == 0 ){ EXTRANEOUS_DATA_CHECK(len, curr_offset - offset); return(curr_offset - offset); }
-       oct = tvb_get_guint8(tvb, curr_offset);
-       curr_len--;
+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"
+};
 
-       /* bit 8 */
-       proto_tree_add_text(tree,
-               tvb, curr_offset, 1,
-               "GEA1: %s (%u)",
-               answer_gea[oct>>7],
-               oct>>7);
-       oct<<=1;
+static const true_false_string gsm_a_gmm_net_cap_isr_vals = {
+       "The mobile station supports ISR",
+       "The mobile station does not support ISR"
+};
 
-       /* bit 7 */
-       proto_tree_add_text(tree,
-               tvb, curr_offset, 1,
-               "SM capabilities via dedicated channels: %s (%u)",
-               answer_smdch[oct>>7],
-               oct>>7);
-       oct<<=1;
+static const true_false_string gsm_a_gmm_net_cap_srvcc_to_geran_vals = {
+       "SRVCC from UTRAN HSPA or E-UTRAN to GERAN/UTRAN supported",
+       "SRVCC from UTRAN HSPA or E-UTRAN to GERAN/UTRAN not supported"
+};
 
-       /* bit 6 */
-       proto_tree_add_text(tree,
-               tvb, curr_offset, 1,
-               "SM capabilities via GPRS channels: %s (%u)",
-               answer_smgprs[oct>>7],
-               oct>>7);
-       oct<<=1;
+static const true_false_string gsm_a_gmm_net_cap_epc_vals = {
+       "EPC supported",
+       "EPC not supported"
+};
 
-       /* bit 5 */
-       proto_tree_add_text(tree,
-               tvb, curr_offset, 1,
-               "UCS2 support: %s (%u)",
-               answer_ucs2[oct>>7],
-               oct>>7);
-       oct<<=1;
+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"
+};
 
-       /* bit 4 3 */
-       proto_tree_add_text(tree,
-               tvb, curr_offset, 1,
-               "SS Screening Indicator: %s (%u)",
-               answer_ssid[oct>>6],
-               oct>>6);
-       oct<<=2;
+guint16
+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;
+       proto_item      *item;
 
-       /* bit 2 */
-       proto_tree_add_text(tree,
-               tvb, curr_offset, 1,
-               "SoLSA Capability: %s (%u)",
-               answer_solsa[oct>>7],
-               oct>>7);
-       oct<<=1;
+       curr_offset = offset;
+
+       /* bit 8: GEA1 */
+       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, 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, ENC_BIG_ENDIAN);
+
+       /* bit 5: UCS2 support */
+       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, ENC_BIG_ENDIAN);
+
+       /* bit 2: SoLSA Capability */
+       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_solsa, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
 
        /* bit 1 */
-       proto_tree_add_text(tree,
-               tvb, curr_offset, 1,
-               "Revision level indicator: %s (%u)",
-               answer_rev[oct>>7],
-               oct>>7);
+       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);
 
-       if ( curr_len == 0 ){ EXTRANEOUS_DATA_CHECK(len, curr_offset - offset); return(curr_offset - offset); }
-       oct = tvb_get_guint8(tvb, curr_offset);
-       curr_len--;
-
-       proto_tree_add_text(tree,
-               tvb, curr_offset, 1,
-               "PFC feature mode: %s (%u)",
-               answer_pfc[oct>>7],
-               oct>>7);
-       oct<<=1;
+       /* bit 8: PFC feature mode */
+       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_pfc, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
 
-       for( gea_val=2; gea_val<8 ; gea_val++ )
-       {
-               proto_tree_add_text(tree,
-                       tvb, curr_offset, 1,
-                       "GEA%d: %s (%u)", gea_val,
-                       answer_gea[oct>>7],
-                       oct>>7);
-               oct<<=1;
-       }
+       /* 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, 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, 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);
 
-       proto_tree_add_text(tree,
-               tvb, curr_offset, 1,
-               "LCS VA capability: %s (%u)",
-               answer_lcs[oct>>7],
-               oct>>7);
+       /* bit 1: LCS VA capability */
+       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);
 
-    if ( curr_len == 0 ){ EXTRANEOUS_DATA_CHECK(len, curr_offset - offset); return(curr_offset - offset); }
-    oct = tvb_get_guint8(tvb, curr_offset);
-    curr_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, ENC_BIG_ENDIAN);
 
-    proto_tree_add_text(tree,
-                       tvb, curr_offset, 1,
-                       "PS inter-RAT HO to UTRAN Iu mode capability: %s (%u)",
-                       answer_ps_irat[oct & 0x1],       /* XXX: There's only 2 entries in the ..._irat array  */
-                       oct & 0x1);                      /*      so we'll assume that this is a 1 bit value.   */
+       /* 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, ENC_BIG_ENDIAN);
 
+       /* 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);
 
-    proto_tree_add_text(tree,
-                       tvb, curr_offset, 1,
-                       "Spare: (%u)",
-                       oct>>1);
+       /* bit 5: ISR support */
+       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, ENC_BIG_ENDIAN);
+
+       /* bit 3: EPC capability */
+       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_epc, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+
+       /* 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);
+       curr_offset++;
+       EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
 
        return(curr_offset - offset);
 }
@@ -957,14 +1104,167 @@ static const value_string gsm_a_gm_acc_tech_type_vals[] = {
        { 0, NULL }
 };
 
+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;
@@ -974,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;
@@ -1075,7 +1308,8 @@ 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;
                                curr_bits_length = 11;
@@ -1085,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;
                        }
                }
@@ -1104,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;
@@ -1119,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;
@@ -1187,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;
@@ -1229,7 +1465,7 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
                                {
                                        /* 0 GSM P
                                         * 1 GSM E
-                                        * 2 GSM R 
+                                        * 2 GSM R
                                         * 5 GSM 450
                                         * 6 GSM 480
                                         * 7 GSM 850
@@ -1366,7 +1602,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;
-               
+
                        for (i=1; i<= 7 ; i++ )
                        {
                                /*
@@ -1399,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;
@@ -1421,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;
@@ -1443,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;
@@ -1465,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;
@@ -1487,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?
                         */
@@ -1518,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++;
@@ -1539,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;
@@ -1558,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++;
@@ -1579,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;
@@ -1594,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;
@@ -1619,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++;
@@ -1641,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;
@@ -1654,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;
@@ -1670,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++;
@@ -1691,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;
@@ -1710,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;
@@ -1731,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;
@@ -1746,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;
@@ -1771,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++;
@@ -1795,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;
@@ -1818,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;
@@ -1841,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)
-                               {
-                                       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
+                               if ((oct>>(32-bits_needed))==1)
                                {
-                                       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;
@@ -1892,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
                         */
@@ -1941,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;
@@ -1963,17 +2059,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="The ME is Release 98 or older"; break;
-                       case 0x01: str="The ME is Release 99 onwards";  break;
-                       default:   str="This should not happen";
-               }
-
-               proto_tree_add_text(tf_tree,
-                       tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
-                       "Revision Level Indicator: %s (%u)",str,oct>>(32-bits_needed));
+               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;
@@ -1985,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;
@@ -2007,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;
@@ -2029,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;
@@ -2051,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;
@@ -2073,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;
@@ -2092,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;
 
@@ -2111,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
@@ -2194,17 +2232,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="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));
+               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;
@@ -2261,143 +2289,530 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
                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="GERAN Iu mode not supported"; break;
-                       case 0x01: str="GERAN Iu mode supported";     break;
+                       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,
-                       "GERAN Iu Mode Capability: %s (%u)",str,oct>>(32-bits_needed));
-               bit_offset++;
+                       "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;
 
                /*
-                * GMSK/8-PSK Multislot Power Profile
+                * 8-PSK Multislot Power Profile
                 */
-               bits_needed = 1;
+               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)
                {
-                       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
+                        * DTM GPRS High Multi Slot Class
                         */
-                       bits_needed = 2;
+                       bits_needed = 3;
                        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_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;
 
-                       /*
-                        * 8-PSK Multislot Power Profile
-                        */
-                       bits_needed = 2;
+                       bits_needed = 1;
                        GET_DATA;
-
-                       /* analyse bits */
-                       switch ( oct>>(32-bits_needed) )
+                       if ((oct>>(32-bits_needed))==0)
                        {
-                               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";
+                               bit_offset+=bits_needed;
+                               curr_bits_length -= bits_needed;
+                               oct <<= bits_needed;
+                               bits_in_oct -= bits_needed;
                        }
-       
-                       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;
+                       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;
+               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;
 
                /*
-                * we are too long ... so jump over it
+                * Multislot Capability Reduction for Downlink Dual Carrier & Downlink Dual Carrier for DTM Capability
                 */
-               while ( curr_bits_length > 0 )
+               bits_needed = 1;
+               GET_DATA;
+               if ((oct>>(32-bits_needed))==0)
                {
-                       if ( curr_bits_length > 8 )
-                               bits_needed = 8;
-                       else
-                               bits_needed = curr_bits_length;
-                       GET_DATA;
+                       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;
 
-       } while ( 1 );
-
-       curr_offset+= curr_len;
-          
-       EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+                       /*
+                        * Multislot Capability Reduction for Downlink Dual Carrier
+                        */
+                       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;
 
-       return(curr_offset - offset);
-}
+                       /*
+                        * 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;
+               }
 
-/*
- * [9] 10.5.5.14
- */
-static const range_string gmm_cause_vals[] = {
-       { 0x00, 0x01, "Protocol error, unspecified(Not def in v8.6.0)"},
-       { 0x02, 0x02, "IMSI unknown in HLR"},
-       { 0x03, 0x03, "Illegal MS"},
-       { 0x04, 0x04, "IMSI unknown in VLR"}, /* Annex G.1 */
-       { 0x05, 0x05, "IMEI not accepted"}, /* Annex G.1 */
-       { 0x06, 0x06, "Illegal ME"},
-       { 0x07, 0x07, "GPRS services not allowed"},
-       { 0x08, 0x08, "GPRS services and non-GPRS services not allowed"},
-       { 0x09, 0x09, "MS identity cannot be derived by the network"},
-       { 0x0a, 0x0a, "Implicitly detached"},
-       { 0x0b, 0x0b, "PLMN not allowed"},
-       { 0x0c, 0x0c, "Location Area not allowed"},
-       { 0x0d, 0x0d, "Roaming not allowed in this location area"},
-       { 0x0e, 0x0e, "GPRS services not allowed in this PLMN"},
-       { 0x0f, 0x0f, "No Suitable Cells In Location Area"},
-       { 0x10, 0x10, "MSC temporarily not reachable"},
-       { 0x11, 0x11, "Network failure"},
-       { 0x12, 0x13, "Protocol error, unspecified(Not def in v8.6.0)"},
-       { 0x14, 0x14, "MAC failure"},
+               /*
+                * Flexible Timeslot Assignment
+                */
+               bits_needed = 1;
+               GET_DATA;
+               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;
+               /*
+                * 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
+                */
+
+               /*
+                * Enhanced Flexible Timeslot Assignment
+                */
+               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;
+
+                       /*
+                        * Alternative EFTA Multislot Class
+                        */
+                       bits_needed = 4;
+                       GET_DATA;
+                       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;
+                       /*
+                        * EFTA Multislot Capability Reduction for Downlink Dual Carrier
+                        */
+                       bits_needed = 3;
+                       GET_DATA;
+                       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
+                */
+               while ( curr_bits_length > 0 )
+               {
+                       if ( curr_bits_length > 8 )
+                               bits_needed = 8;
+                       else
+                               bits_needed = curr_bits_length;
+                       GET_DATA;
+                       curr_bits_length -= bits_needed;
+                       oct <<= bits_needed;
+                       bits_in_oct -= bits_needed;
+               }
+
+
+       } while ( 1 );
+
+       curr_offset+= curr_len;
+
+       EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
+
+       return(curr_offset - offset);
+}
+
+/*
+ * [9] 10.5.5.14
+ */
+static const range_string gmm_cause_vals[] = {
+       { 0x00, 0x01, "Protocol error, unspecified(Not def in v8.6.0)"},
+       { 0x02, 0x02, "IMSI unknown in HLR"},
+       { 0x03, 0x03, "Illegal MS"},
+       { 0x04, 0x04, "IMSI unknown in VLR"}, /* Annex G.1 */
+       { 0x05, 0x05, "IMEI not accepted"}, /* Annex G.1 */
+       { 0x06, 0x06, "Illegal ME"},
+       { 0x07, 0x07, "GPRS services not allowed"},
+       { 0x08, 0x08, "GPRS services and non-GPRS services not allowed"},
+       { 0x09, 0x09, "MS identity cannot be derived by the network"},
+       { 0x0a, 0x0a, "Implicitly detached"},
+       { 0x0b, 0x0b, "PLMN not allowed"},
+       { 0x0c, 0x0c, "Location Area not allowed"},
+       { 0x0d, 0x0d, "Roaming not allowed in this location area"},
+       { 0x0e, 0x0e, "GPRS services not allowed in this PLMN"},
+       { 0x0f, 0x0f, "No Suitable Cells In Location Area"},
+       { 0x10, 0x10, "MSC temporarily not reachable"},
+       { 0x11, 0x11, "Network failure"},
+       { 0x12, 0x13, "Protocol error, unspecified(Not def in v8.6.0)"},
+       { 0x14, 0x14, "MAC failure"},
        { 0x15, 0x15, "Synch failure"},
        { 0x16, 0x16, "Congestion"},
        { 0x17, 0x17, "GSM authentication unacceptable"},
@@ -2431,7 +2846,7 @@ static const range_string gmm_cause_vals[] = {
        { 0x70, 0xff, "Protocol error, unspecified(Not def in v8.6.0)"},
        { 0, 0, NULL }
 };
-/* NOTE 1 TS 124 008 V8.6.0 (2009-07) 
+/* NOTE 1 TS 124 008 V8.6.0 (2009-07)
        "Any other value received by the mobile station shall be treated as 0110 1111, "Protocol
        error, unspecified". Any other value received by the network shall be treated as
        0110 1111, "Protocol error, unspecified".
@@ -2440,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++;
 
@@ -2459,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;
@@ -2489,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);
+       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;
@@ -2550,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,
@@ -2563,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);
@@ -2574,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);
@@ -2587,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);
@@ -2609,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);
@@ -2665,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);
 }
@@ -2689,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;
@@ -2720,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;
@@ -2731,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");
 
@@ -2739,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;
@@ -2780,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);
 }
@@ -2789,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;
@@ -2831,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;
@@ -2862,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);
@@ -2873,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;
@@ -2914,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;
@@ -2951,10 +3471,11 @@ 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;
-       guint8  oct, i, j;
+       guint   i;
+       guint8  oct, j;
        proto_item  *tf = NULL;
        proto_tree  *tf_tree = NULL;
 
@@ -2986,26 +3507,71 @@ 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;
-       const guint8    *cptr;
        guint8    str[MAX_APN_LENGTH+1];
 
-       cptr = tvb_get_ptr(tvb, offset, len);
-
        curr_offset = offset;
 
        /* init buffer and copy it */
        memset ( str , 0 , MAX_APN_LENGTH );
-       memcpy ( str , cptr , len<MAX_APN_LENGTH?len:MAX_APN_LENGTH );
+       tvb_memcpy(tvb, str, offset, len<MAX_APN_LENGTH?len:MAX_APN_LENGTH);
 
        curr_len = 0;
        while (( curr_len < len ) && ( curr_len < MAX_APN_LENGTH ))
@@ -3021,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);
 }
@@ -3030,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;
@@ -3052,11 +3618,10 @@ de_sm_nsapi(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gcha
 /*
  * [7] 10.5.6.3 Protocol configuration options
  */
-#if 0
 static const value_string gsm_a_sm_pco_ms2net_prot_vals[] = {
-       { 0x01, "P-CSCF Address Request" },
+       { 0x01, "P-CSCF IPv6 Address Request" },
        { 0x02, "IM CN Subsystem Signaling Flag" },
-       { 0x03, "DNS Server Address Request" },
+       { 0x03, "DNS Server IPv6 Address Request" },
        { 0x04, "Not Supported" },
        { 0x05, "MS Support of Network Requested Bearer Control indicator" },
        { 0x06, "Reserved" },
@@ -3065,36 +3630,67 @@ static const value_string gsm_a_sm_pco_ms2net_prot_vals[] = {
        { 0x09, "DSMIPv6 IPv4 Home Agent Address Request" },
        { 0x0a, "IP address allocation via NAS signalling" },
        { 0x0b, "IPv4 address allocation via DHCPv4" },
+       { 0x0c, "P-CSCF IPv4 Address Request" },
+       { 0x0d, "DNS Server IPv4 Address Request" },
+       { 0x0e, "MSISDN Request" },
        { 0, NULL }
 };
 static const value_string gsm_a_sm_pco_net2ms_prot_vals[] = {
-       { 0x01, "P-CSCF Address" },
+       { 0x01, "P-CSCF IPv6 Address" },
        { 0x02, "IM CN Subsystem Signaling Flag" },
-       { 0x03, "DNS Server Address" },
+       { 0x03, "DNS Server IPv6 Address" },
        { 0x04, "Policy Control rejection code" },
        { 0x05, "Selected Bearer Control Mode" },
        { 0x06, "Reserved" },
        { 0x07, "DSMIPv6 Home Agent Address" },
        { 0x08, "DSMIPv6 Home Network Prefix" },
        { 0x09, "DSMIPv6 IPv4 Home Agent Address" },
+       { 0x0a, "Reserved" },
+       { 0x0b, "Reserved" },
+       { 0x0c, "P-CSCF IPv4 Address" },
+       { 0x0d, "DNS Server IPv4 Address" },
+       { 0x0e, "MSISDN" },
        { 0, NULL }
 };
-#endif
-guint16
-de_sm_pco(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
-{
-       guint32 curr_offset;
+
+static const value_string gsm_a_gm_link_dir_vals[] = {
+       { -1, "Unknown" },
+       { 0x0, "MS to network" },
+       { 0x1, "Network to MS" },
+       { 0, NULL }
+};
+
+guint16
+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;
        guint   curr_len;
        guchar  oct;
        struct e_in6_addr ipv6_addr;
+       int     link_dir;
 
        curr_len = len;
        curr_offset = offset;
 
        oct = tvb_get_guint8(tvb, curr_offset);
 
-       proto_tree_add_item(tree, hf_gsm_a_gm_sm_ext, tvb, curr_offset, 1, FALSE);
-       proto_tree_add_text(tree,tvb, curr_offset, 1, "Configuration Protocol: PPP (%u)",oct&0x0f);
+       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, ENC_BIG_ENDIAN);
+       /* Configuration protocol (octet 3)
+        * Bits
+        * 3 2 1
+        * 0 0 0 PPP for use with IP PDP type or IP PDN type (see 3GPP TS 24.301 [120])
+        *
+        * All other values are interpreted as PPP in this version of the protocol.
+        * (3GPP TS 24.008 version 9.4.0 Release 9)
+        */
+       proto_tree_add_text(tree,tvb, curr_offset, 1, "Configuration Protocol: PPP (%u)",oct&0x07);
        curr_len--;
        curr_offset++;
 
@@ -3105,22 +3701,31 @@ de_sm_pco(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add
                tvbuff_t *l3_tvb;
                dissector_handle_t handle = NULL;
 
+               /* Protocol ID 1                    octet 4
+                *                                  octet 5
+                * Length of protocol ID 1 contents octet 6
+                * Protocol ID 1 contents           octet 7
+                */
+
                prot = tvb_get_ntohs(tvb,curr_offset);
-               e_len = tvb_get_guint8(tvb, curr_offset+2);
-               curr_len-=3;
-               curr_offset+=3;
+               proto_tree_add_uint_format(tree, hf_gsm_a_gm_pco_pid, tvb, curr_offset, 2, (guint32)prot,
+                               "Protocol or Container ID: %s (%u)",
+                               link_dir ?
+                                       val_to_str_const((guint32)prot, gsm_a_sm_pco_net2ms_prot_vals, val_to_str_ext_const(prot, &ppp_vals_ext, "Unknown")) :
+                                       val_to_str_const((guint32)prot, gsm_a_sm_pco_ms2net_prot_vals, val_to_str_ext_const(prot, &ppp_vals_ext, "Unknown")),
+                               (guint32)prot);
+
+               curr_len-=2;
+               curr_offset+=2;
+               e_len = tvb_get_guint8(tvb, curr_offset);
+               proto_tree_add_text(tree,tvb, curr_offset, 1, "Length: 0x%02x (%u)", e_len , e_len);
+               curr_len-=1;
+               curr_offset+=1;
 
                switch ( prot )
                {
                        case 0x0001:
                        {
-                               if (e_len == 0) {
-                                       proto_tree_add_text(tree,tvb, curr_offset-3, 2, "Parameter: (%u) P-CSCF Address Request" , prot );
-                               } else {
-                                       proto_tree_add_text(tree,tvb, curr_offset-3, 2, "Parameter: (%u) P-CSCF Address" , prot );
-                               }
-                               proto_tree_add_text(tree,tvb, curr_offset-1, 1, "Length: 0x%02x (%u)", e_len , e_len);
-
                                if (e_len > 0) {
                                        tvb_get_ipv6(tvb, curr_offset, &ipv6_addr);
                                        proto_tree_add_text(tree,
@@ -3130,18 +3735,9 @@ de_sm_pco(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add
                                break;
                        }
                        case 0x0002:
-                               proto_tree_add_text(tree,tvb, curr_offset-3, 2, "Parameter: (%u) IM CN Subsystem Signaling Flag" , prot );
-                               proto_tree_add_text(tree,tvb, curr_offset-1, 1, "Length: 0x%02x (%u)", e_len , e_len);
                                break;
                        case 0x0003:
                        {
-                               if (e_len == 0) {
-                                       proto_tree_add_text(tree,tvb, curr_offset-3, 2, "Parameter: (%u) DNS Server Address Request" , prot );
-                               } else {
-                                       proto_tree_add_text(tree,tvb, curr_offset-3, 2, "Parameter: (%u) DNS Server Address" , prot );
-                               }
-                               proto_tree_add_text(tree,tvb, curr_offset-1, 1, "Length: 0x%02x (%u)", e_len , e_len);
-
                                if (e_len > 0) {
                                        tvb_get_ipv6(tvb, curr_offset, &ipv6_addr);
                                        proto_tree_add_text(tree,
@@ -3151,34 +3747,30 @@ de_sm_pco(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add
                                break;
                        }
                        case 0x0004:
-                               proto_tree_add_text(tree,tvb, curr_offset-3, 2, "Parameter: (%u) Policy Control rejection code" , prot );
-                               proto_tree_add_text(tree,tvb, curr_offset-1, 1, "Length: 0x%02x (%u)", e_len , e_len);
                                oct = tvb_get_guint8(tvb, curr_offset);
                                proto_tree_add_text(tree,tvb, curr_offset, 1, "Reject Code: 0x%02x (%u)", e_len , e_len);
                                break;
                        default:
                        {
-                               handle = dissector_get_port_handle ( gprs_sm_pco_subdissector_table , prot );
+                               handle = dissector_get_uint_handle ( gprs_sm_pco_subdissector_table , prot );
                                if ( handle != NULL )
                                {
-                                       proto_tree_add_text(tree,tvb, curr_offset-3, 2, "Protocol: %s (%u)" ,
-                                       val_to_str(prot, ppp_vals, "Unknown"), prot);
-                                       proto_tree_add_text(tree,tvb, curr_offset-1, 1, "Length: 0x%02x (%u)", e_len , e_len);
                                        /*
                                         * 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
                                {
-                                       proto_tree_add_text(tree,tvb, curr_offset-3, 2, "Protocol/Parameter: (%u) unknown" , prot );
-                                       proto_tree_add_text(tree,tvb, curr_offset-1, 1, "Length: 0x%02x (%u)", e_len , e_len);
                                        /*
                                        * 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);
                                }
                        }
                }
@@ -3188,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);
 }
@@ -3204,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;
@@ -3223,6 +3813,7 @@ de_sm_pdp_addr(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar
 
        if (pdp_type_org == 0 )
        {
+               /* ETSI allocated address */
                switch (pdp_type_num)
                {
                        case 0x00: str="Reserved, used in earlier version of this protocol"; break;
@@ -3232,6 +3823,7 @@ de_sm_pdp_addr(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar
        }
        else if (pdp_type_org == 1)
        {
+               /* IETF allocated addres */
                switch (pdp_type_num)
                {
                        case 0x21: str="IPv4 address"; break;
@@ -3243,7 +3835,7 @@ de_sm_pdp_addr(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar
        else if ((pdp_type_num == 0) && (pdp_type_org == 0x0f))
                str="Empty";
        else
-               str="Not specified";    
+               str="Not specified";
 
        proto_tree_add_text(tree,
                tvb, curr_offset, 1,
@@ -3254,7 +3846,7 @@ de_sm_pdp_addr(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar
                proto_tree_add_text(tree,
                        tvb, curr_offset, 1,
                        "Dynamic addressing");
-
+               curr_offset += 1;
                return(curr_offset - offset);
        }
        else if ( len == 2 )
@@ -3262,40 +3854,39 @@ de_sm_pdp_addr(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar
                proto_tree_add_text(tree,
                        tvb, curr_offset, 1,
                        "No PDP address is included");
-
+               curr_offset += 1;
                return(curr_offset - offset);
        }
 
        curr_offset += 1;
-       if (pdp_type_org == 1)  
+       if (pdp_type_org == 1)
        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);
 }
 
 /*
- * [7] 10.5.6.5 3GPP TS 24.008 version 7.8.0 Release 7
+ * [9] 10.5.6.5 Quality of service
  */
-
 static const value_string gsm_a_qos_delay_cls_vals[] = {
        { 0x00, "Subscribed delay class (in MS to network direction)" },
        { 0x01, "Delay class 1" },
@@ -3384,134 +3975,126 @@ const value_string gsm_a_qos_traff_hdl_pri_vals[] = {
        { 0, NULL }
 };
 
-guint16
-de_sm_qos(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
-{
-       guint32 curr_offset;
-       guint   curr_len;
-       guchar     oct, tmp_oct;
-       const gchar     *str;
-
-       curr_len = len;
-       curr_offset = offset;
-
-       oct = tvb_get_guint8(tvb, curr_offset);
+const range_string gsm_a_qos_peak_thr_vals[] = {
+       { 0x00, 0x00, "Subscribed peak throughput/reserved" },
+       { 0x01, 0x01, "Up to 1 000 octet/s" },
+       { 0x02, 0x02, "Up to 2 000 octet/s" },
+       { 0x03, 0x03, "Up to 4 000 octet/s" },
+       { 0x04, 0x04, "Up to 8 000 octet/s" },
+       { 0x05, 0x05, "Up to 16 000 octet/s" },
+       { 0x06, 0x06, "Up to 32 000 octet/s" },
+       { 0x07, 0x07, "Up to 64 000 octet/s" },
+       { 0x08, 0x08, "Up to 128 000 octet/s" },
+       { 0x09, 0x09, "Up to 256 000 octet/s" },
+       { 0x0a, 0x0e, "Interpreted as Up to 1 000 octet/s" },
+       { 0x0f, 0x0f, "Reserved" },
+       { 0, 0, NULL }
+};
 
-       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_qos_reliability_cls, tvb, curr_offset, 1, FALSE);
+const range_string gsm_a_qos_mean_thr_vals[] = {
+       { 0x00, 0x00, "Subscribed peak throughput/reserved" },
+       { 0x01, 0x01, "100 octet/h" },
+       { 0x02, 0x02, "200 octet/h" },
+       { 0x03, 0x03, "500 octet/h" },
+       { 0x04, 0x04, "1 000 octet/h" },
+       { 0x05, 0x05, "2 000 octet/h" },
+       { 0x06, 0x06, "5 000 octet/h" },
+       { 0x07, 0x07, "10 000 octet/h" },
+       { 0x08, 0x08, "20 000 octet/h" },
+       { 0x09, 0x09, "50 000 octet/h" },
+       { 0x0a, 0x0a, "100 000 octet/h" },
+       { 0x0b, 0x0b, "200 000 octet/h" },
+       { 0x0c, 0x0c, "500 000 octet/h" },
+       { 0x0d, 0x0d, "1 000 000 octet/h" },
+       { 0x0e, 0x0e, "2 000 000 octet/h" },
+       { 0x0f, 0x0f, "5 000 000 octet/h" },
+       { 0x10, 0x10, "10 000 000 octet/h" },
+       { 0x11, 0x11, "20 000 000 octet/h" },
+       { 0x12, 0x12, "50 000 000 octet/h" },
+       { 0x13, 0x1d, "Interpreted as Best effort" },
+       { 0x1e, 0x1e, "Reserved" },
+       { 0x1f, 0x1f, "Best effort" },
+       { 0, 0, NULL }
+};
 
-       curr_offset+= 1;
-       curr_len-= 1;
+const range_string gsm_a_qos_prec_class_vals[] = {
+       { 0x00, 0x00, "Subscribed precedence/reserved" },
+       { 0x01, 0x01, "High priority" },
+       { 0x02, 0x02, "Normal priority" },
+       { 0x03, 0x03, "Low priority" },
+       { 0x04, 0x06, "Interpreted as Normal priority" },
+       { 0x07, 0x07, "Reserved" },
+       { 0, 0, NULL }
+};
 
-       if ( curr_len == 0 )
-       {
-               EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+const true_false_string gsm_a_qos_signalling_ind_value = {
+       "Optimised for signalling traffic",
+       "Not optimised for signalling traffic"
+};
 
-               return(curr_offset - offset);
-       }
+/* Helper function returning the main bitrates in kbps */
+static guint32
+qos_calc_bitrate(guint8 oct)
+{
+       if (oct <= 0x3f)
+               return oct;
+       if (oct <= 0x7f)
+               return 64 + (oct-0x40) * 8;
 
-       oct = tvb_get_guint8(tvb, curr_offset);
+       return 576 + (oct-0x80) * 64;
+}
 
-       switch ( oct>>4 )
-       {
-               case 0x00: str="Subscribed peak throughput/reserved"; break;
-               case 0x01: str="Up to 1 000 octet/s"; break;
-               case 0x02: str="Up to 2 000 octet/s"; break;
-               case 0x03: str="Up to 4 000 octet/s"; break;
-               case 0x04: str="Up to 8 000 octet/s"; break;
-               case 0x05: str="Up to 16 000 octet/s"; break;
-               case 0x06: str="Up to 32 000 octet/s"; break;
-               case 0x07: str="Up to 64 000 octet/s"; break;
-               case 0x08: str="Up to 128 000 octet/s"; break;
-               case 0x09: str="Up to 256 000 octet/s"; break;
-               case 0x0f: str="Reserved"; break;
-               default: str="Up to 1 000 octet/s";
-       }
+/* Helper function returning the extended bitrates in kbps */
+static guint32
+qos_calc_ext_bitrate(guint8 oct)
+{
+       if (oct <= 0x4a)
+               return 8600 + oct * 100;
+       if (oct <= 0xba)
+               return 16000 + (oct-0x4a) * 1000;
 
-       proto_tree_add_text(tree,
-               tvb, curr_offset, 1,
-               "Peak throughput: %s (%u)",str,oct>>4);
+       return 128000 + (oct - 0xba) * 2000;
+}
 
-       switch ( oct&0x7 )
-       {
-               case 0x00: str="Subscribed precedence/reserved"; break;
-               case 0x01: str="High priority"; break;
-               case 0x02: str="Normal priority"; break;
-               case 0x03: str="Low priority"; break;
-               case 0x07: str="Reserved"; break;
-               default: str="Normal priority";
-       }
+guint16
+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;
+       const gchar     *str;
+       guint32 temp32;
 
-       proto_tree_add_text(tree,
-               tvb, curr_offset, 1,
-               "Precedence class: %s (%u)",str,oct&7);
+       curr_offset = offset;
 
+       /* Octet 3 */
+       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;
-       curr_len-= 1;
-
-       if ( curr_len == 0 )
-       {
-               EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
-
-               return(curr_offset - offset);
-       }
 
+       /* Octet 4 */
        oct = tvb_get_guint8(tvb, curr_offset);
-
-       switch ( oct&0x1f )
-       {
-               case 0x00: str="Subscribed peak throughput/reserved"; break;
-               case 0x01: str="100 octet/h"; break;
-               case 0x02: str="200 octet/h"; break;
-               case 0x03: str="500 octet/h"; break;
-               case 0x04: str="1 000 octet/h"; break;
-               case 0x05: str="2 000 octet/h"; break;
-               case 0x06: str="5 000 octet/h"; break;
-               case 0x07: str="10 000 octet/h"; break;
-               case 0x08: str="20 000 octet/h"; break;
-               case 0x09: str="50 000 octet/h"; break;
-               case 0x0a: str="100 000 octet/h"; break;
-               case 0x0b: str="200 000 octet/h"; break;
-               case 0x0c: str="500 000 octet/h"; break;
-               case 0x0d: str="1 000 000 octet/h"; break;
-               case 0x0e: str="2 000 000 octet/h"; break;
-               case 0x0f: str="5 000 000 octet/h"; break;
-               case 0x10: str="10 000 000 octet/h"; break;
-               case 0x11: str="20 000 000 octet/h"; break;
-               case 0x12: str="50 000 000 octet/h"; break;
-               case 0x1e: str="Reserved"; break;
-               case 0x1f: str="Best effort"; break;
-               default: str="Best effort";
-       }
-
-       proto_tree_add_text(tree,
-               tvb, curr_offset, 1,
-               "Mean throughput: %s (%u)",str,oct&0x1f);
-
+       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;
-       curr_len-= 1;
-
-       if ( curr_len == 0 )
-       {
-               EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
 
-               return(curr_offset - offset);
-       }
+       /* Octet 5 */
+       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;
 
-       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);
+       NO_MORE_DATA_CHECK(len);
 
+       /* Octet 6 */
+       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;
-       curr_len-= 1;
 
-       if ( curr_len == 0 )
-       {
-               EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
-
-               return(curr_offset - offset);
-       }
+       NO_MORE_DATA_CHECK(len);
 
+       /* Octet 7 */
        oct = tvb_get_guint8(tvb, curr_offset);
 
        switch ( oct )
@@ -3527,159 +4110,87 @@ de_sm_qos(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add
        if (( oct >= 1 ) && ( oct <= 0x96 ))
                proto_tree_add_text(tree,
                        tvb, curr_offset, 1,
-                       "Maximum SDU size: (%u) %u octets",oct,oct*10);
+                       "Maximum SDU size: %u octets (%u)",oct*10, oct);
        else
                proto_tree_add_text(tree,
                        tvb, curr_offset, 1,
                        "Maximum SDU size: %s (%u)",str, oct);
 
        curr_offset+= 1;
-       curr_len-= 1;
 
-       if ( curr_len == 0 )
-       {
-               EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
-
-               return(curr_offset - offset);
-       }
+       NO_MORE_DATA_CHECK(len);
 
+       /* Octet 8 */
        oct = tvb_get_guint8(tvb, curr_offset);
 
-       switch ( oct )
+       switch (oct)
        {
-               case 0x00: str="Subscribed maximum bit rate for uplink/reserved"; break;
-               case 0xff: str="0kbps"; break;
-               default: str="This should not happen - BUG";
+               case 0x00: str = "Subscribed maximum bit rate for uplink/reserved"; break;
+               case 0xff: str = "0 kbps"; break;
+               default: str = ep_strdup_printf("%u kbps", qos_calc_bitrate(oct));
        }
 
-       if (( oct >= 1 ) && ( oct <= 0x3f ))
-               proto_tree_add_text(tree,
-                       tvb, curr_offset, 1,
-                       "Maximum bit rate for uplink: %ukbps (%u)",oct,oct);
-       else if (( oct >= 0x40 ) && ( oct <= 0x7f ))
-               proto_tree_add_text(tree,
-                       tvb, curr_offset, 1,
-                       "Maximum bit rate for uplink: %ukbps (%u)",(oct-0x40)*8+64,oct); /* - was (oct-0x40)*8  */
-       else if (( oct >= 0x80 ) && ( oct <= 0xfe ))
-               proto_tree_add_text(tree,
-                       tvb, curr_offset, 1,
-                       "Maximum bit rate for uplink: %ukbps (%u)",(oct-0x80)*64+576,oct); /* - was (oct-0x80)*64 */
-       else
-               proto_tree_add_text(tree,
-                       tvb, curr_offset, 1,
-                       "Maximum bit rate for uplink: %s (%u)",str,oct);
-
+       proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_max_bitrate_upl, tvb,
+               curr_offset, 1, oct, "%s (%u)", str, oct);
        curr_offset+= 1;
-       curr_len-= 1;
-
-       if ( curr_len == 0 )
-       {
-               EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
 
-               return(curr_offset - offset);
-       }
+       NO_MORE_DATA_CHECK(len);
 
+       /* Octet 9 */
        oct = tvb_get_guint8(tvb, curr_offset);
 
        switch ( oct )
        {
-               case 0x00: str="Subscribed maximum bit rate for uplink/reserved"; break;
-               case 0xff: str="0kbps"; break;
-               default: str="This should not happen - BUG";
+               case 0x00: str="Subscribed maximum bit rate for downlink/reserved"; break;
+               case 0xff: str="0 kbps"; break;
+               default: str = ep_strdup_printf("%u kbps", qos_calc_bitrate(oct));
        }
 
-       if (( oct >= 1 ) && ( oct <= 0x3f ))
-               proto_tree_add_text(tree,
-                       tvb, curr_offset, 1,
-               "Maximum bit rate for downlink: %ukbps (%u)",oct,oct);
-       else if (( oct >= 0x40 ) && ( oct <= 0x7f ))
-               proto_tree_add_text(tree,
-                       tvb, curr_offset, 1,
-                       "Maximum bit rate for downlink: %ukbps (%u)",(oct-0x40)*8+64,oct);/*same as above*/
-       else if (( oct >= 0x80 ) && ( oct <= 0xfe ))
-               proto_tree_add_text(tree,
-                       tvb, curr_offset, 1,
-                       "Maximum bit rate for downlink: %ukbps (%u)",(oct-0x80)*64+576,oct);/*same as above*/
-       else
-               proto_tree_add_text(tree,
-                       tvb, curr_offset, 1,
-                       "Maximum bit rate for downlink: %s (%u)",str,oct);
-
+       proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_max_bitrate_downl, tvb,
+               curr_offset, 1, oct, "%s (%u)", str, oct);
        curr_offset+= 1;
-       curr_len-= 1;
-
-       if ( curr_len == 0 )
-       {
-               EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
 
-               return(curr_offset - offset);
-       }
+       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;
-       curr_len-= 1;
-
-       if ( curr_len == 0 )
-       {
-               EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
-
-               return(curr_offset - offset);
-       }
+       NO_MORE_DATA_CHECK(len);
 
        /* Octet 11 */
        oct = tvb_get_guint8(tvb, curr_offset);
 
-       switch ( oct>>2 )
+       tmp_oct = oct >> 2;
+       switch (tmp_oct)
        {
                case 0x00: str="Subscribed transfer delay/reserved"; break;
                case 0x3f: str="Reserved"; break;
-               default: str="This should not happen - BUG";
+               default:
+                       if (tmp_oct <= 0x0f)
+                               temp32 = tmp_oct * 10;
+                       else if (tmp_oct <= 0x1f)
+                               temp32 = (tmp_oct - 0x10) * 50 + 200;
+                       else
+                               temp32 = (tmp_oct - 0x20) * 100 + 1000;
+                       str = ep_strdup_printf("%u ms", temp32);
        }
 
-       tmp_oct = oct>>2;
+       proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_trans_delay, tvb,
+               curr_offset, 1, oct, "%s (%u)", str, tmp_oct);
 
-       if (( tmp_oct >= 1 ) && ( tmp_oct <= 0x0f ))
-               proto_tree_add_text(tree,
-                       tvb, curr_offset, 1,
-                       "Transfer Delay: %ums (%u)",(oct>>2)*10,oct>>2);
-       else if (( tmp_oct >= 0x10 ) && ( tmp_oct <= 0x1f ))
-               proto_tree_add_text(tree,
-                       tvb, curr_offset, 1,
-                       "Transfer Delay: %ums (%u)",((oct>>2)-0x10)*50+200,oct>>2);
-       else if (( tmp_oct >= 0x20 ) && ( tmp_oct <= 0x3e ))
-               proto_tree_add_text(tree,
-                       tvb, curr_offset, 1,
-                       "Transfer Delay: %ums (%u)",((oct>>2)-0x20)*100+1000,oct>>2);
+       tmp_oct = oct & 0x03;
+       if (tmp_oct == 0)
+               str = "Subscribed traffic handling priority/reserved";
        else
-               proto_tree_add_text(tree,
-                       tvb, curr_offset, 1,
-                       "Transfer Delay: %s (%u)",str,oct>>2);
+               str = ep_strdup_printf("Priority level %u", tmp_oct);
 
-       switch ( oct&0x03 )
-       {
-               case 0x00: str="Subscribed traffic handling priority/reserved"; break;
-               case 0x01: str="Priority level 1"; break;
-               case 0x02: str="Priority level 2"; break;
-               case 0x03: str="Priority level 3"; break;
-               default: str="This should not happen - BUG";
-       }
-
-       proto_tree_add_text(tree,
-               tvb, curr_offset, 1,
-               "Traffic Handling priority: %s (%u)",str,oct&0x03);
+       proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_traf_handl_prio, tvb,
+               curr_offset, 1, oct, "%s (%u)", str, tmp_oct);
 
        curr_offset+= 1;
-       curr_len-= 1;
-
-       if ( curr_len == 0 )
-       {
-               EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
-
-               return(curr_offset - offset);
-       }
+       NO_MORE_DATA_CHECK(len);
 
        /* Octet 12 */
        oct = tvb_get_guint8(tvb, curr_offset);
@@ -3687,447 +4198,341 @@ de_sm_qos(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add
        switch ( oct )
        {
                case 0x00: str="Subscribed guaranteed bit rate for uplink/reserved"; break;
-               case 0xff: str="0kbps"; break;
-               default: str="This should not happen - BUG";
+               case 0xff: str="0 kbps"; break;
+               default: str = ep_strdup_printf("%u kbps", qos_calc_bitrate(oct));
        }
 
-       if (( oct >= 1 ) && ( oct <= 0x3f ))
-               proto_tree_add_text(tree,
-                       tvb, curr_offset, 1,
-                       "Guaranteed bit rate for uplink: %ukbps (%u)",oct,oct);
-       else if (( oct >= 0x40 ) && ( oct <= 0x7f ))
-               proto_tree_add_text(tree,
-                       tvb, curr_offset, 1,
-                       "Guaranteed bit rate for uplink: %ukbps (%u)",(oct-0x40)*8+64,oct);/*same as for max bit rate*/
-       else if (( oct >= 0x80 ) && ( oct <= 0xfe ))
-               proto_tree_add_text(tree,
-                       tvb, curr_offset, 1,
-                       "Guaranteed bit rate for uplink: %ukbps (%u)",(oct-0x80)*64+576,oct);/*same as for max bit rate*/
-       else
-               proto_tree_add_text(tree,
-                       tvb, curr_offset, 1,
-                       "Guaranteed bit rate for uplink: %s (%u)",str,oct);
+       proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_guar_bitrate_upl, tvb,
+               curr_offset, 1, oct, "%s (%u)", str, oct);
 
        curr_offset+= 1;
-       curr_len-= 1;
-
-       if ( curr_len == 0 )
-       {
-               EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
-
-               return(curr_offset - offset);
-       }
+       NO_MORE_DATA_CHECK(len);
 
+       /* Octet 13 */
        oct = tvb_get_guint8(tvb, curr_offset);
 
        switch ( oct )
        {
-               case 0x00: str="Subscribed guaranteed bit rate for uplink/reserved"; break;
-               case 0xff: str="0kbps"; break;
-               default: str="This should not happen - BUG";
+               case 0x00: str="Subscribed guaranteed bit rate for downlink/reserved"; break;
+               case 0xff: str="0 kbps"; break;
+               default: str = ep_strdup_printf("%u kbps", qos_calc_bitrate(oct));
        }
 
-       if (( oct >= 1 ) && ( oct <= 0x3f ))
-               proto_tree_add_text(tree,
-                       tvb, curr_offset, 1,
-                       "Guaranteed bit rate for downlink: %ukbps (%u)",oct,oct);
-       else if (( oct >= 0x40 ) && ( oct <= 0x7f ))
-               proto_tree_add_text(tree,
-                       tvb, curr_offset, 1,
-                       "Guaranteed bit rate for downlink: %ukbps (%u)",(oct-0x40)*8+64,oct);/*same as above*/
-       else if (( oct >= 0x80 ) && ( oct <= 0xfe ))
-               proto_tree_add_text(tree,
-                       tvb, curr_offset, 1,
-                       "Guaranteed bit rate for downlink: %ukbps (%u)",(oct-0x80)*64+576,oct);/*same as above*/
-       else
-               proto_tree_add_text(tree,
-                       tvb, curr_offset, 1,
-                       "Guaranteed bit rate for downlink: %s (%u)",str,oct);
+       proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_guar_bitrate_downl, tvb,
+               curr_offset, 1, oct, "%s (%u)", str, oct);
 
        curr_offset+= 1;
-       curr_len-= 1;
-
-       if ( curr_len == 0 )
-       {
-               EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
-
-               return(curr_offset - offset);
-       }
+       NO_MORE_DATA_CHECK(len);
 
        /* 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, ENC_BIG_ENDIAN);
+       proto_tree_add_item(tree, hf_gsm_a_qos_signalling_ind, tvb , curr_offset, 1, ENC_BIG_ENDIAN);
 
-       switch ( (oct>>4)&1 )
-       {
-               case 0x00: str="Not optimised for signalling traffic"; break;
-               case 0x01: str="Optimised for signalling traffic"; break;
-               default: str="This should not happen - BUG";
-       }
-
-       proto_tree_add_text(tree,
-               tvb, curr_offset, 1,
-               "Signalling Indication: %s (%u)",str,(oct>>4)&1);
-
-       switch ( oct&7 )
-       {
-               case 0x00: str="unknown"; break;
-               case 0x01: str="speech"; break;
-               default: str="unknown";
-       }
+       tmp_oct = oct & 7;
+       if (tmp_oct == 0x01)
+               str = "speech";
+       else
+               str = "unknown";
 
-       proto_tree_add_text(tree,
-               tvb, curr_offset, 1,
-               "Source Statistics Descriptor: %s (%u)",str,oct&7);
+       proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_source_stat_desc, tvb,
+               curr_offset, 1, oct, "%s (%u)", str, tmp_oct);
 
        curr_offset+= 1;
-       curr_len-= 1;
-
-       if ( curr_len == 0 )
-       {
-               EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
-
-               return(curr_offset - offset);
-       }
+       NO_MORE_DATA_CHECK(len);
 
        /* Octet 15 */
-
        oct = tvb_get_guint8(tvb, curr_offset);
 
-       switch ( oct )
+       if (oct == 0x00)
+               str = "Use the value indicated by the Maximum bit rate for downlink";
+       else
        {
-               case 0x00: str="Use the value indicated by the Maximum bit rate for downlink"; break;
-               default: str="Unspecified";
+               temp32 = qos_calc_ext_bitrate(oct);
+               if (temp32 % 1000 == 0)
+                       str = ep_strdup_printf("%u Mbps", temp32 / 1000);
+               else
+                       str = ep_strdup_printf("%u kbps", temp32);
        }
-
-       if (( oct >= 1 ) && ( oct <= 0x4a ))
-               proto_tree_add_text(tree,
-                       tvb, curr_offset, 1,
-                       "Maximum bit rate for downlink (extended): %ukbps (%u)",oct*100,oct);
-       if (( oct >= 0x4b ) && ( oct <= 0xba ))
-               proto_tree_add_text(tree,
-                       tvb, curr_offset, 1,
-                       "Maximum bit rate for downlink (extended): %uMbps (%u)",16 + oct- 0x4a,oct);
-       if (( oct >= 0xbb ) && ( oct <= 0xfa ))
-               proto_tree_add_text(tree,
-                       tvb, curr_offset, 1,
-                       "Maximum bit rate for downlink (extended): %uMbps (%u)",128 + oct - 0xba * 2,oct);
-       else
-               proto_tree_add_text(tree,
-                       tvb, curr_offset, 1,
-                       "Maximum bit rate for downlink (extended): %s (%u)",str,oct);
+       proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_max_bitrate_downl_ext, tvb,
+               curr_offset, 1, oct, "%s (%u)", str, oct);
 
        curr_offset+= 1;
-       curr_len-= 1;
-
-       if ( curr_len == 0 )
-       {
-               EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
-
-               return(curr_offset - offset);
-       }
+       NO_MORE_DATA_CHECK(len);
 
        /* Octet 16 */
        oct = tvb_get_guint8(tvb, curr_offset);
 
-       switch ( oct )
+       if (oct == 0x00)
+               str = "Use the value indicated by the Guaranteed bit rate for downlink";
+       else
        {
-               case 0x00: str="Use the value indicated by the Guaranteed bit rate for downlink"; break;
-               default: str="Unspecified";
+               temp32 = qos_calc_ext_bitrate(oct);
+               if (temp32 % 1000 == 0)
+                       str = ep_strdup_printf("%u Mbps", temp32 / 1000);
+               else
+                       str = ep_strdup_printf("%u kbps", temp32);
        }
-
-       if (( oct >= 1 ) && ( oct <= 0x4a ))
-               proto_tree_add_text(tree,
-                       tvb, curr_offset, 1,
-                       "Guaranteed bit rate for downlink (extended): %ukbps (%u)",oct*100, oct);
-       if (( oct >= 0x4b ) && ( oct <= 0xba ))
-               proto_tree_add_text(tree,
-                       tvb, curr_offset, 1,
-                       "Guaranteed bit rate for downlink (extended): %uMbps (%u)",16 + oct- 0x4a, oct);
-       if (( oct >= 0xbb ) && ( oct <= 0xfa ))
-               proto_tree_add_text(tree,
-                       tvb, curr_offset, 1,
-                       "Guaranteed bit rate for downlink (extended): %uMbps (%u)",128 + oct - 0xba * 2, oct);
-       else
-               proto_tree_add_text(tree,
-                       tvb, curr_offset, 1,
-                       "Guaranteed bit rate for downlink (extended): %s (%u)",str,oct);
+       proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_guar_bitrate_downl_ext, tvb,
+               curr_offset, 1, oct, "%s (%u)", str, oct);
 
        curr_offset+= 1;
-       curr_len-= 1;
-
-       if ( curr_len == 0 )
-       {
-               EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+       NO_MORE_DATA_CHECK(len);
 
-               return(curr_offset - offset);
-       }
        /* Maximum bit rate for uplink (extended) Octet 17 */
        oct = tvb_get_guint8(tvb, curr_offset);
 
-       switch ( oct )
+       if (oct == 0x00)
+               str = "Use the value indicated by the Maximum bit rate for uplink";
+       else
        {
-               case 0x00: str="Use the value indicated by the Maximum bit rate for uplink"; break;
-               default: str="Unspecified";
+               temp32 = qos_calc_ext_bitrate(oct);
+               if (temp32 % 1000 == 0)
+                       str = ep_strdup_printf("%u Mbps", temp32 / 1000);
+               else
+                       str = ep_strdup_printf("%u kbps", temp32);
        }
-
-       if (( oct >= 1 ) && ( oct <= 0x4a ))
-               proto_tree_add_text(tree,
-                       tvb, curr_offset, 1,
-                       "Maximum bit rate for uplink (extended): %ukbps (%u)",oct*100,oct);
-       if (( oct >= 0x4b ) && ( oct <= 0xba ))
-               proto_tree_add_text(tree,
-                       tvb, curr_offset, 1,
-                       "Maximum bit rate for uplink (extended): %uMbps (%u)",16 + oct- 0x4a,oct);
-       if (( oct >= 0xbb ) && ( oct <= 0xfa ))
-               proto_tree_add_text(tree,
-                       tvb, curr_offset, 1,
-                       "Maximum bit rate for uplink (extended): %uMbps (%u)",128 + oct - 0xba * 2,oct);
-       else
-               proto_tree_add_text(tree,
-                       tvb, curr_offset, 1,
-                       "Maximum bit rate for uplink (extended): %s (%u)",str,oct);
+       proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_max_bitrate_upl_ext, tvb,
+               curr_offset, 1, oct, "%s (%u)", str, oct);
 
        curr_offset+= 1;
-       curr_len-= 1;
-
-       if ( curr_len == 0 )
-       {
-               EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
-
-               return(curr_offset - offset);
-       }
+       NO_MORE_DATA_CHECK(len);
 
        /* Guaranteed bit rate for uplink (extended) Octet 18 */
        oct = tvb_get_guint8(tvb, curr_offset);
 
-       switch ( oct )
+       if (oct == 0x00)
+               str = "Use the value indicated by the Guaranteed bit rate for uplink";
+       else
        {
-               case 0x00: str="Use the value indicated by the Guaranteed bit rate for uplink"; break;
-               default: str="Unspecified";
+               temp32 = qos_calc_ext_bitrate(oct);
+               if (temp32 % 1000 == 0)
+                       str = ep_strdup_printf("%u Mbps", temp32 / 1000);
+               else
+                       str = ep_strdup_printf("%u kbps", temp32);
        }
-
-       if (( oct >= 1 ) && ( oct <= 0x4a ))
-               proto_tree_add_text(tree,
-                       tvb, curr_offset, 1,
-                       "Guaranteed bit rate for uplink (extended): %ukbps (%u)",oct*100,oct);
-       if (( oct >= 0x4b ) && ( oct <= 0xba ))
-               proto_tree_add_text(tree,
-                       tvb, curr_offset, 1,
-                       "Guaranteed bit rate for uplink (extended): %uMbps (%u)",16 + oct- 0x4a,oct);
-       if (( oct >= 0xbb ) && ( oct <= 0xfa ))
-               proto_tree_add_text(tree,
-                       tvb, curr_offset, 1,
-                       "Guaranteed bit rate for uplink (extended): %uMbps (%u)",128 + oct - 0xba * 2,oct);
-       else
-               proto_tree_add_text(tree,
-                       tvb, curr_offset, 1,
-                       "Guaranteed bit rate for uplink (extended): %s (%u)",str,oct);
+       proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_guar_bitrate_upl_ext, tvb,
+               curr_offset, 1, oct, "%s (%u)", str, oct);
 
        curr_offset+= 1;
-       curr_len-= 1;
-       EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+
+       EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
 
        return(curr_offset - offset);
 }
 
 /*
- * [8] 10.5.6.6 SM cause
+ * [9] 10.5.6.6 SM cause
  */
+static const value_string gsm_a_sm_cause_vals[] = {
+       { 0x08, "Operator Determined Barring" },
+       { 0x18, "MBMS bearer capabilities insufficient for the service" },
+       { 0x19, "LLC or SNDCP failure(GSM only)" },
+       { 0x1a, "Insufficient resources" },
+       { 0x1b, "Missing or unknown APN" },
+       { 0x1c, "Unknown PDP address or PDP type" },
+       { 0x1d, "User Authentication failed" },
+       { 0x1e, "Activation rejected by GGSN" },
+       { 0x1f, "Activation rejected, unspecified" },
+       { 0x20, "Service option not supported" },
+       { 0x21, "Requested service option not subscribed" },
+       { 0x22, "Service option temporarily out of order" },
+       { 0x23, "NSAPI already used (not sent)" },
+       { 0x24, "Regular deactivation" },
+       { 0x25, "QoS not accepted" },
+       { 0x26, "Network failure" },
+       { 0x27, "Reactivation required" },
+       { 0x28, "Feature not supported" },
+       { 0x29, "Semantic error in the TFT operation" },
+       { 0x2a, "Syntactical error in the TFT operation" },
+       { 0x2b, "Unknown PDP context" },
+       { 0x2c, "Semantic errors in packet filter(s)" },
+       { 0x2d, "Syntactical errors in packet filter(s)" },
+       { 0x2e, "PDP context without TFT already activated" },
+       { 0x2f, "Multicast group membership time-out" },
+       { 0x2c, "Semantic errors in packet filter(s)" },
+       { 0x2d, "Syntactical errors in packet filter(s)" },
+       { 0x30, "Activation rejected, BCM violation" },
+       { 0x32, "PDP type IPv4 only allowed" },
+       { 0x33, "PDP type IPv6 only allowed" },
+       { 0x34, "Single address bearers only allowed" },
+       { 0x51, "Invalid transaction identifier value" },
+       { 0x5f, "Semantically incorrect message" },
+       { 0x60, "Invalid mandatory information" },
+       { 0x61, "Message type non-existent or not implemented" },
+       { 0x62, "Message type not compatible with the protocol state" },
+       { 0x63, "Information element non-existent or not implemented" },
+       { 0x64, "Conditional IE error" },
+       { 0x65, "Message not compatible with the protocol state" },
+       { 0x6f, "Protocol error, unspecified" },
+       { 0x70, "APN restriction value incompatible with active PDP context" },
+       { 0, NULL }
+};
+
 static guint16
-de_sm_cause(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string, 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;
-       guint32 curr_offset;
        const gchar     *str;
 
-       curr_offset = offset;
+       oct = tvb_get_guint8(tvb, offset);
 
-       oct = tvb_get_guint8(tvb, curr_offset);
+       /* SM Cause can be sent in both directions */
+       str = val_to_str_const(oct, gsm_a_sm_cause_vals,
+                              "Protocol error, unspecified / Service option temporarily out of order");
 
-       switch ( oct )
-       {
-               case 0x08: str="Operator Determined Barring"; break;
-               case 0x18: str="MBMS bearer capabilities insufficient for the service"; break;
-               case 0x19: str="LLC or SNDCP failure(GSM only)"; break;
-               case 0x1a: str="Insufficient resources"; break;
-               case 0x1b: str="Missing or unknown APN"; break;
-               case 0x1c: str="Unknown PDP address or PDP type"; break;
-               case 0x1d: str="User Authentication failed"; break;
-               case 0x1e: str="Activation rejected by GGSN"; break;
-               case 0x1f: str="Activation rejected, unspecified"; break;
-               case 0x20: str="Service option not supported"; break;
-               case 0x21: str="Requested service option not subscribed"; break;
-               case 0x22: str="Service option temporarily out of order"; break;
-               case 0x23: str="NSAPI already used (not sent)"; break;
-               case 0x24: str="Regular deactivation"; break;
-               case 0x25: str="QoS not accepted"; break;
-               case 0x26: str="Network failure"; break;
-               case 0x27: str="Reactivation required"; break;
-               case 0x28: str="Feature not supported"; break;
-               case 0x29: str="Semantic error in the TFT operation"; break;
-               case 0x2a: str="Syntactical error in the TFT operation"; break;
-               case 0x2b: str="Unknown PDP context"; break;
-               case 0x2e: str="PDP context without TFT already activated"; break;
-               case 0x2f: str="Multicast group membership time-out"; break;
-               case 0x2c: str="Semantic errors in packet filter(s)"; break;
-               case 0x2d: str="Syntactical errors in packet filter(s)"; break;
-               case 0x51: str="Invalid transaction identifier value"; break;
-               case 0x5f: str="Semantically incorrect message"; break;
-               case 0x60: str="Invalid mandatory information"; break;
-               case 0x61: str="Message type non-existent or not implemented"; break;
-               case 0x62: str="Message type not compatible with the protocol state"; break;
-               case 0x63: str="Information element non-existent or not implemented"; break;
-               case 0x64: str="Conditional IE error"; break;
-               case 0x65: str="Message not compatible with the protocol state"; break;
-               case 0x6f: str="Protocol error, unspecified"; break;
-               case 0x70: str="APN restriction value incompatible with active PDP context"; break;
-               default: str="Protocol error, unspecified"; break;
-       }
+       proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_cause, tvb,
+                               offset, 1, oct, "%s (%u)", str, oct);
 
-       proto_tree_add_text(tree,
-               tvb, curr_offset, 1,
-               "Cause: %s (%u) %s",
-               str, oct,add_string ? add_string : "");
+       /* no length check possible */
+       return(1);
+}
 
-       curr_offset++;
+/*
+ * [9] 10.5.6.6a SM cause 2
+ */
+static guint16
+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;
 
-       return(curr_offset - offset);
-}
+       oct = tvb_get_guint8(tvb, offset);
+
+       /* SM Cause 2 is sent only in the Network-to-MS direction */
+       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);
+
+       /* no length check possible */
+       return(1);
+}
 /*
  * [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);
 }
 
 /*
- * [7] 10.5.6.9
+ * [9] 10.5.6.9 LLC service access point identifier
  */
+static const value_string gsm_a_sm_llc_sapi_vals[] = {
+       { 0, "LLC SAPI not assigned" },
+       { 3, "SAPI 3" },
+       { 5, "SAPI 5" },
+       { 9, "SAPI 9" },
+       { 11, "SAPI 11" },
+       { 0, NULL }
+};
+
 static guint16
-de_sm_sapi(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string, 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_)
 {
-       guint8  oct;
-       guint32 curr_offset;
-
-       curr_offset = offset;
-
-       oct = tvb_get_guint8(tvb, curr_offset);
-
-       proto_tree_add_text(tree,
-               tvb, curr_offset, 1,
-               "LLC SAPI: 0x%02x (%u) %s",
-               oct&0x0f, oct&0x0f,add_string ? add_string : "");
-
-       curr_offset++;
+       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);
 
-       return(curr_offset - offset);
+       /* no length check possible */
+       return(1);
 }
 
 /*
- * [7] 10.5.6.10
+ * [9] 10.5.6.10 Tear down indicator
  */
+const true_false_string gsm_a_sm_tdi_value = {
+       "Tear down requested",
+       "Tear down not requested"
+};
+
 static guint16
-de_sm_tear_down(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string, 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_)
 {
-       guint8  oct;
-       guint32 curr_offset;
-       static const gchar *str[2] = {
-               "tear down not requested" ,
-               "tear down requested" };
-
-       curr_offset = offset;
-
-       oct = tvb_get_guint8(tvb, curr_offset);
-
-       proto_tree_add_text(tree,
-               tvb, curr_offset, 1,
-               "Tear Down Indicator: %s (%u) %s",
-               str[oct&1],oct&1, add_string ? add_string : "");
-
-       curr_offset++;
+       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);
 
-       return(curr_offset - offset);
+       /* no length check possible */
+       return(1);
 }
 
 /*
- * [7] 10.5.6.11
+ * [9] 10.5.6.11 Packet Flow Identifier
  */
-/* Packet Flow Identifier value (octet 3) */
-static const value_string gsm_a_packet_flow_id_vals[] = {
-       { 0,            "Best Effort"},
-       { 1,            "Signaling"},
-       { 2,            "SMS"},
-       { 3,            "TOM8"},
-       { 4,            "reserved"},
-       { 5,            "reserved"},
-       { 6,            "reserved"},
-       { 7,            "reserved"},
-       { 0,    NULL }
+static const range_string gsm_a_sm_packet_flow_id_vals[] = {
+       { 0x00, 0x00, "Best Effort"},
+       { 0x01, 0x01, "Signaling"},
+       { 0x02, 0x02, "SMS"},
+       { 0x03, 0x03, "TOM8"},
+       { 0x04, 0x07, "Reserved"},
+       { 0x08, 0x7f, "Dynamically assigned"},
+       { 0x00, 0x00, NULL }
 };
+
 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   curr_len;
-       guchar  oct;
+       guint value;
 
-       curr_len = len;
        curr_offset = offset;
+       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++;
 
-       oct = tvb_get_guint8(tvb, curr_offset);
-
-       proto_tree_add_text(tree,
-               tvb, curr_offset, 1,
-               "Packet Flow Identifier: %s (%u)",
-               val_to_str(oct&0x7f, gsm_a_packet_flow_id_vals, "dynamically assigned (%u)"),oct&0x7f);
+    if (add_string)
+        g_snprintf(add_string, string_len, " - %s", rval_to_str(value, gsm_a_sm_packet_flow_id_vals, "Unknown"));
 
-       curr_offset+= curr_len;
-          
-       EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+       EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
 
        return(curr_offset - offset);
 }
@@ -4149,13 +4554,27 @@ static const value_string gsm_a_tft_op_code_vals[] = {
 };
 
 static const true_false_string gsm_a_tft_e_bit  = {
-  "parameters list is included",
-  "parameters list is not included"
+  "Parameters list is included",
+  "Parameters list is not included"
+};
+
+static const value_string gsm_a_tft_pkt_flt_dir_vals[] = {
+       { 0,    "Pre Rel-7 TFT filter"},
+       { 1,    "Downlink only"},
+       { 2,    "Uplink only"},
+       { 3,    "Bidirectional"},
+       { 0,    NULL }
 };
 
+static const value_string gsm_a_tft_param_id_vals[] = {
+       { 1,    "Authorization Token"},
+       { 2,    "Flow Identifier"},
+       { 3,    "Packet Filter Identifier"},
+       { 0,    NULL }
+};
 
-static guint16
-de_sm_tflow_temp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+guint16
+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;
@@ -4169,8 +4588,9 @@ de_sm_tflow_temp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gch
        guchar        count;
        guchar        oct;
        gint          pf_length;
-       gint          pf_identifier;
+       gint          i;
        gint          pack_component_type;
+       gint          param;
 
        curr_len = len;
        curr_offset = offset;
@@ -4184,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--;
@@ -4208,34 +4628,30 @@ de_sm_tflow_temp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gch
                {
                        if ((curr_offset-offset)<1) {
                                proto_tree_add_text(tf_tree,tvb, curr_offset, 1,"Not enough data");
-                               return(curr_offset-offset);
+                               return(len);
                        }
-                       oct = tvb_get_guint8(tvb, curr_offset);
+                       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--;
-
-                       proto_tree_add_text(tf_tree,
-                               tvb, curr_offset-1, 1,
-                               "Packet filter identifier: 0x%02x (%u)",oct,oct );      
+                       count++;
                }
                else                            /* create new, Add packet filters or Replace packet filters */
                {
 
                        if ((curr_offset-offset)<1) {
                                proto_tree_add_text(tf_tree,tvb, curr_offset, 1,"Not enough data");
-                               return(curr_offset-offset);
+                               return(len);
                        }
-                       pf_identifier = tvb_get_guint8(tvb, curr_offset);
+                       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--;
 
-                       proto_tree_add_text(tf_tree,
-                               tvb, curr_offset-1, 1,
-                               "Packet filter identifier: %u (%u)",pf_identifier, pf_identifier);      
-
                        if ((curr_offset-offset)<1) {
                                proto_tree_add_text(tf_tree,tvb, curr_offset, 1,"Not enough data");
-                               return(curr_offset-offset);
+                               return(len);
                        }
                        oct = tvb_get_guint8(tvb, curr_offset);
                        curr_offset++;
@@ -4243,121 +4659,140 @@ 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, 1,
-                               "Packet evaluation precedence: 0x%02x (%u)",oct,oct );  
+                               "Packet evaluation precedence: 0x%02x (%u)",oct,oct );
 
-                       if ((curr_offset-offset)<1) { proto_tree_add_text(tf_tree,tvb, curr_offset, 1,"Not enough data"); return(curr_offset-offset);}
+                       if ((curr_offset-offset)<1) { proto_tree_add_text(tf_tree,tvb, curr_offset, 1,"Not enough data"); return(len);}
                        pf_length = tvb_get_guint8(tvb, curr_offset);
                        curr_offset++;
                        curr_len--;
 
                        proto_tree_add_text(tf_tree,
                                tvb, curr_offset-1, 1,
-                               "Packet filter length: 0x%02x (%u)",pf_length,pf_length );      
+                               "Packet filter length: 0x%02x (%u)",pf_length,pf_length );
                        /* New tree for component */
 
                        /* Dissect Packet filter Component */
                        /* while ( filter_len > 1 ) */
                        /* packet filter component type identifier: */
 
-                       if (pf_length > 0 ){
+                       while (pf_length > 0 ){
                                if ((curr_offset-offset)<1) {
                                        proto_tree_add_text(tf_tree,tvb, curr_offset, 1,"Not enough data");
-                                       return(curr_offset-offset);
+                                       return(len);
                                }
                                pack_component_type = tvb_get_guint8(tvb, curr_offset);
                                curr_offset++;
                                curr_len--;
+                               pf_length--;
 
                                tf=proto_tree_add_text(tf_tree,tvb, curr_offset-1, 1,"Packet filter component type identifier: ");
                                comp_tree = proto_item_add_subtree(tf, ett_sm_tft );
 
                                switch ( pack_component_type ){
-                       
+
                                case 0x10:
-                                       str="IPv4 source address type";
-                                       proto_tree_add_item(comp_tree,hf_gsm_a_sm_ip4_address,tvb,curr_offset,4,FALSE);
+                                       str="IPv4 remote address type";
+                                       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;
                                        break;
 
                                case 0x20:
-                                       str="IPv6 source address type";
-                                       proto_tree_add_item(comp_tree,hf_gsm_a_sm_ip6_address,tvb,curr_offset,16,FALSE);
+                                       str="IPv6 remote address type";
+                                       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;
                                        break;
 
                                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;
                                        break;
 
                                case 0x40:
-                                       str="Single destination port type";
-                                       proto_tree_add_item(comp_tree,hf_gsm_a_tft_port,tvb,curr_offset,2,FALSE);
+                                       str="Single local port type";
+                                       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;
+                                       break;
 
                                case 0x41:
-                                       str="Destination 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_high,tvb,curr_offset,2,FALSE);
-                                       curr_offset+=4;
+                                       str="Local port range type";
+                                       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,ENC_BIG_ENDIAN);
+                                       curr_offset+=2;
                                        curr_len-=4;
+                                       pf_length-=4;
                                        break;
 
                                case 0x50:
-                                       str="Single source port type";
-                                       proto_tree_add_item(comp_tree,hf_gsm_a_tft_port,tvb,curr_offset,2,FALSE);
+                                       str="Single remote port type";
+                                       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;
                                        break;
 
                                case 0x51:
-                                       str="Source 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_high,tvb,curr_offset,2,FALSE);
-                                       curr_offset+=4;
+                                       str="Remote port range type";
+                                       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,ENC_BIG_ENDIAN);
+                                       curr_offset+=2;
                                        curr_len-=4;
+                                       pf_length-=4;
                                        break;
 
                                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;
                                        break;
 
 
                                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_tft_traffic_mask,tvb,curr_offset,1,FALSE);
-                                       curr_offset+=2;
+                                       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,ENC_BIG_ENDIAN);
+                                       curr_offset++;
                                        curr_len-=2;
+                                       pf_length-=2;
                                        break;
 
                                case 0x80:
                                        str="Flow label type";
-                                       proto_tree_add_item(comp_tree,hf_gsm_a_tft_traffic_mask,tvb,curr_offset,1,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;
                                        break;
 
                                default:
                                        str="not specified";
+                                       curr_offset+=pf_length;
+                                       curr_len-=pf_length;
+                                       pf_length=0;
                                }
                                proto_item_append_text(tf, "%s (%u)", str, pack_component_type);
-                               count++;
                        }
+                       count++;
                }
        }
 
@@ -4365,13 +4800,208 @@ de_sm_tflow_temp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gch
         * transferred in addition to the packet filters. If the parameters list is included, the E
         * bit is set to 1; otherwise, the E bit is set to 0.
         */
-       if (e_bit == 1){
-                proto_tree_add_text(tf_tree, tvb, curr_offset, 1, "Note: Possible Authorization Token/Flow Identifier not decoded yet");
+       if ((e_bit == 1) && curr_len) {
+               count = 0;
+               while (curr_len) {
+                       pf_length = tvb_get_guint8(tvb, curr_offset+1);
+                       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, ENC_BIG_ENDIAN);
+                       curr_offset += 2;
+                       curr_len -= 2;
+                       switch (param) {
+                       case 0x01:
+                               proto_tree_add_text(tf_tree, tvb, curr_offset, pf_length, "Authorization token value: 0x%s",
+                                               tvb_bytes_to_str(tvb, curr_offset, pf_length));
+                               break;
+
+                       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, 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, ENC_BIG_ENDIAN));
+                               break;
+
+                       case 0x03:
+                               for (i = 0; i < pf_length; i++) {
+                                       proto_tree_add_text(tf_tree, tvb, curr_offset+i, 1, "Packet filter identifier %d: %d",
+                                                   i, tvb_get_guint8(tvb, curr_offset+i));
+                               }
+                               break;
+
+                       default:
+                               proto_tree_add_text(tf_tree, tvb, curr_offset, pf_length, "Parameter content: 0x%s",
+                                                   tvb_bytes_to_str(tvb, curr_offset, pf_length));
+                               break;
+                       }
+                       curr_offset += pf_length;
+                       curr_len -= pf_length;
+                       count++;
+               }
+       }
+
+       EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
+
+       return(len);
+}
+
+/*
+ * [9] 10.5.6.13 Temporary Mobile Group Identity (TMGI)
+ */
+static guint16
+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, ENC_BIG_ENDIAN);
+       curr_offset += 3;
+
+       NO_MORE_DATA_CHECK(len);
+       curr_offset = dissect_e212_mcc_mnc(tvb, pinfo, tree, curr_offset, TRUE);
+
+       EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
+
+       return(curr_offset - offset);
+}
+
+/*
+ * [9] 10.5.6.14 MBMS bearer capabilities
+ */
+static guint16
+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;
+       const gchar *str;
+
+       curr_offset = offset;
+
+       oct = tvb_get_guint8(tvb, curr_offset);
+
+       switch (oct)
+       {
+               case 0x00: str="Subscribed maximum bit rate for downlink/reserved"; break;
+               case 0xff: str="0 kbps"; break;
+               default: str = ep_strdup_printf("%u kbps", qos_calc_bitrate(oct));
+       }
+
+       proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_max_bitrate_downl, tvb,
+               curr_offset, 1, oct, "%s (%u)", str, oct);
+       curr_offset+= 1;
+
+       NO_MORE_DATA_CHECK(len);
+
+       oct = tvb_get_guint8(tvb, curr_offset);
+
+       if (oct == 0x00)
+               str = "Use the value indicated by the Maximum bit rate for downlink";
+       else
+       {
+               temp32 = qos_calc_ext_bitrate(oct);
+               if (temp32 % 1000 == 0)
+                       str = ep_strdup_printf("%u Mbps", temp32 / 1000);
+               else
+                       str = ep_strdup_printf("%u kbps", temp32);
        }
+       proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_max_bitrate_downl_ext, tvb,
+               curr_offset, 1, oct, "%s (%u)", str, oct);
+
+       curr_offset+= 1;
+
+       EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
+
+       return(curr_offset - offset);
+}
+
+/*
+ * [9] 10.5.6.15 MBMS protocol configuration options
+ */
+static guint16
+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, ENC_BIG_ENDIAN);
+       curr_offset++;
+
+       EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
+
        return(curr_offset - offset);
 }
 
-guint16 (*gm_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len) = {
+/*
+ * [9] 10.5.6.16 Enhanced network service access point identifier
+ */
+static guint16
+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;
+
+       oct = tvb_get_guint8(tvb, offset);
+
+       if(oct < 0x80)
+               str = "Reserved";
+       else if (oct < 0xff)
+                       str = ep_strdup_printf("NSAPI %u for Multimedia Broadcast/Multicast Service (MBMS) Multicast mode", oct);
+               else
+                       str = "Reserved for use by lower layers in the p2p radio bearer allocation message for MBMS Broadcast mode";
+
+
+       proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_enh_nsapi, tvb,
+               offset, 1, oct, "%s (%u)", str, oct);
+
+       /* no length check possible */
+       return(1);
+}
+
+/*
+ * [9] 10.5.6.17 Request type
+ */
+static const value_string gsm_a_sm_req_type_vals[] = {
+       { 0x01, "Initial request" },
+       { 0x02, "Handover" },
+       { 0x03, "Unused. If received, the network shall interpret this as \"Initial request\"." },
+       { 0, NULL }
+};
+
+static guint16
+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, 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);
+}
+
+/*
+ * [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 */
@@ -4390,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 */
@@ -4399,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 */
@@ -4406,11 +5041,18 @@ guint16 (*gm_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint
        de_sm_pdp_addr,         /* Packet Data Protocol Address */
        de_sm_qos,              /* Quality Of Service */
        de_sm_cause,            /* SM Cause */
+       de_sm_cause_2,          /* SM Cause 2 */
        de_sm_linked_ti,        /* Linked TI */
        de_sm_sapi,             /* LLC Service Access Point Identifier */
        de_sm_tear_down,        /* Tear Down Indicator */
        de_sm_pflow_id,         /* Packet Flow Identifier */
        de_sm_tflow_temp,       /* Traffic Flow Template */
+       de_sm_tmgi,             /* Temporary Mobile Group Identity (TMGI) */
+       de_sm_mbms_bearer_cap,  /* MBMS bearer capabilities */
+       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 */
@@ -4418,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 */
 };
 
@@ -4427,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;
@@ -4436,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);
 
@@ -4465,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;
@@ -4481,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);
 
@@ -4519,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;
@@ -4554,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;
@@ -4576,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;
@@ -4607,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;
@@ -4634,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; */
@@ -4664,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;
@@ -4683,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);
 
@@ -4721,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;
@@ -4743,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);
 
@@ -4757,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;
@@ -4772,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;
@@ -4790,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;
@@ -4811,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;
@@ -4843,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;
@@ -4863,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);
 
@@ -4893,39 +5560,55 @@ 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);
 
-/*
- * [7] 9.4.15
- */
-static void
-dtap_gmm_rau_acc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-       guint32 curr_offset;
+       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, packet_info *pinfo, guint32 offset, guint len)
+{
+       guint32 curr_offset;
        guint32 consumed;
        guint   curr_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);
 
@@ -4945,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;
@@ -4961,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;
@@ -4984,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;
@@ -5012,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;
@@ -5032,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" );
 
@@ -5046,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;
@@ -5062,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);
@@ -5080,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;
@@ -5096,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;
@@ -5119,18 +5813,19 @@ 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);
 }
 
 /*
  * [8] 9.5.1 Activate PDP context request
+ * 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;
@@ -5139,11 +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 */
+       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" );
 
@@ -5153,14 +5850,17 @@ dtap_sm_act_pdp_req(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);
+       ELEM_OPT_TV_SHORT(0xA0, GSM_A_PDU_TYPE_GM, DE_REQ_TYPE, NULL);
+
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
- * [8] 9.5.2 Activate PDP context accept
+ * [9] 9.5.2 Activate PDP context accept
+ * 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;
@@ -5169,35 +5869,40 @@ 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*/
+       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);
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       ELEM_OPT_TLV( 0x39 , GSM_A_PDU_TYPE_GM, DE_SM_CAUSE_2, " - SM cause");
+
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
  * [8] 9.5.3 Activate PDP context reject
+ * 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;
@@ -5206,20 +5911,23 @@ 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*/
+       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);
 }
 
 /*
  * [8] 9.5.4 Activate Secondary PDP Context Request
+ * 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;
@@ -5228,11 +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 */
+       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" );
 
@@ -5243,14 +5953,15 @@ 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);
 }
 
 /*
- * [7] 9.5.5
+ * [7] 9.5.5   Activate Secondary PDP Context Accept
+ * 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;
@@ -5259,17 +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*/
+       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
@@ -5278,14 +5991,15 @@ 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);
 }
 
 /*
  * [8] 9.5.6 Activate Secondary PDP Context Reject
+ * 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;
@@ -5294,20 +6008,23 @@ 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*/
+       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);
 }
 
 /*
  * [8] 9.5.7 Request PDP context activation
+ * 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;
@@ -5316,7 +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*/
+       pinfo->link_dir = P2P_DIR_DL;
 
        ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_PD_PRO_ADDR , " - Offered PDP address" );
 
@@ -5324,14 +6043,15 @@ 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);
 }
 
 /*
  * [8] 9.5.8 Request PDP context activation reject
+ * 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;
@@ -5340,20 +6060,23 @@ 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 */
+       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);
 }
 
 /*
  * [8] 9.5.9 Modify PDP context request (Network to MS direction)
+ * 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;
@@ -5362,34 +6085,39 @@ 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 */
+       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);
 }
 
 /*
  * [8] 9.5.10 Modify PDP context request (MS to network direction)
+ * 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;
@@ -5398,7 +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 */
+       pinfo->link_dir = P2P_DIR_UL;
 
        ELEM_OPT_TV( 0x32 , GSM_A_PDU_TYPE_GM, DE_LLC_SAPI , " - Requested LLC SAPI" );
 
@@ -5408,14 +6138,15 @@ 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);
 }
 
 /*
  * [8] 9.5.11 Modify PDP context accept (MS to network direction)
+ * 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;
@@ -5424,18 +6155,21 @@ 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 */
+       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);
 }
 
 /*
  * [8] 9.5.12 Modify PDP context accept (Network to MS direction)
+ * 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;
@@ -5444,7 +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 */
+       pinfo->link_dir = P2P_DIR_DL;
 
        ELEM_OPT_TLV( 0x30 , GSM_A_PDU_TYPE_GM, DE_QOS , " - Negotiated QoS" );
 
@@ -5456,14 +6192,15 @@ 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);
 }
 
 /*
  * [8] 9.5.13 Modify PDP Context Reject
+ * 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;
@@ -5472,20 +6209,24 @@ 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 */
+       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);
 }
 
 /*
  * [8] 9.5.14 Deactivate PDP context request
+ * 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;
@@ -5494,9 +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;
+       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);
 
@@ -5505,14 +6247,15 @@ 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);
 }
 
 /*
  * [8] 9.5.15 Deactivate PDP context accept
+ * 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;
@@ -5521,21 +6264,103 @@ 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;
+       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);
 }
 
 /*
  * [8] 9.5.21 SM Status
+ * 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;
@@ -5544,43 +6369,152 @@ 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;
+       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);
 }
 
 /*
- * [8] 9.5.22 Activate MBMS Context Request
+ * [9] 9.5.22 Activate MBMS Context Request
+ * Direction:                  MS to network
  */
+static void
+dtap_sm_act_mbms_req(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_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, " - Requested MBMS NSAPI");
 
-       /* Requested MBMS NSAPI Enhanced Network service access point identifier 10.5.6.15 M V */
        /* 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, " - 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 );
+
        /* Requested multicast address Packet data protocol address 10.5.6.4 M LV 3 - 19 */
+       ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_PD_PRO_ADDR , " - Requested multicast address" );
+
        /* Access point name Access point name 10.5.6.1 M LV 2 - 101 */
+       ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_ACC_POINT_NAME , NULL );
+
        /* 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_EXPERT(curr_len, 0, pinfo);
+}
 
 /*
- * [8] 9.5.23 Activate MBMS Context Accept
+ * [9] 9.5.23 Activate MBMS Context Accept
+ * Direction:                  network to MS
  */
+static void
+dtap_sm_act_mbms_acc(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_SENT;
+
+       ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_TMGI, NULL);
+
+       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_EXPERT(curr_len, 0, pinfo);
+}
 
 /*
- * [8] 9.5.24 Activate MBMS Context Reject
+ * [9] 9.5.24 Activate MBMS Context Reject
+ * Direction:                  network to MS
  */
+static void
+dtap_sm_act_mbms_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_SENT;
+
+       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_EXPERT(curr_len, 0, pinfo);
+}
 
 /*
- * [8] 9.5.25 Request MBMS Context Activation
+ * [9] 9.5.25 Request MBMS Context Activation
+ * Direction:                  network to MS
  */
+static void
+dtap_sm_req_mbms_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_SENT;
+
+       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" );
+
+       ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_ACC_POINT_NAME , NULL );
+
+       ELEM_OPT_TLV( 0x35 , GSM_A_PDU_TYPE_GM, DE_MBMS_PROT_CONF_OPT , NULL);
+
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
+}
 
 /*
  * [8] 9.5.26 Request MBMS Context Activation Reject
+ * Direction:                  MS to network
  */
+static void
+dtap_sm_req_mbms_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_RECV;
+
+       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_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 */
@@ -5609,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 */
@@ -5631,34 +6565,37 @@ static void (*dtap_msg_sm_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset
        NULL,                                           /* Reserved: was allocated in earlier phases of the protocol */
        NULL,                                           /* Reserved: was allocated in earlier phases of the protocol */
        dtap_sm_status,                         /* SM Status */
-       NULL,                                           /* Activate MBMS Context Request */
-       NULL,                                           /* Activate MBMS Context Accept */
-       NULL,                                           /* Activate MBMS Context Reject */
-       NULL,                                           /* Request MBMS Context Activation */
-       NULL,                                           /* Request MBMS Context Activation Reject */
+       dtap_sm_act_mbms_req,           /* Activate MBMS Context Request */
+       dtap_sm_act_mbms_acc,           /* Activate MBMS Context Accept */
+       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 */
 };
 
-void get_gmm_msg_params(guint8 oct, const gchar **msg_str, int *ett_tree, int *hf_idx, msg_fcn *msg_fcn)
+void get_gmm_msg_params(guint8 oct, const gchar **msg_str, int *ett_tree, int *hf_idx, msg_fcn *dtap_msg_fcn)
 {
        gint                    idx;
 
        *msg_str = match_strval_idx((guint32) (oct & DTAP_GMM_IEI_MASK), gsm_a_dtap_msg_gmm_strings, &idx);
        *ett_tree = ett_gsm_dtap_msg_gmm[idx];
        *hf_idx = hf_gsm_a_dtap_msg_gmm_type;
-       *msg_fcn = dtap_msg_gmm_fcn[idx];
+       *dtap_msg_fcn = dtap_msg_gmm_fcn[idx];
 
        return;
 }
 
-void get_sm_msg_params(guint8 oct, const gchar **msg_str, int *ett_tree, int *hf_idx, msg_fcn *msg_fcn)
+void get_sm_msg_params(guint8 oct, const gchar **msg_str, int *ett_tree, int *hf_idx, msg_fcn *dtap_msg_fcn)
 {
        gint                    idx;
 
        *msg_str = match_strval_idx((guint32) (oct & DTAP_SM_IEI_MASK), gsm_a_dtap_msg_sm_strings, &idx);
        *ett_tree = ett_gsm_dtap_msg_sm[idx];
        *hf_idx = hf_gsm_a_dtap_msg_sm_type;
-       *msg_fcn = dtap_msg_sm_fcn[idx];
+       *dtap_msg_fcn = dtap_msg_sm_fcn[idx];
 
        return;
 }
@@ -5694,7 +6631,7 @@ proto_register_gsm_a_gm(void)
                  FT_UINT8, BASE_DEC, VALS(gsm_a_qos_delay_cls_vals), 0x38,
                  NULL, HFILL }
        },
-       { &hf_gsm_a_qos_qos_reliability_cls,
+       { &hf_gsm_a_qos_reliability_cls,
                { "Reliability class", "gsm_a.qos.delay_cls",
                  FT_UINT8, BASE_DEC, VALS(gsm_a_qos_delay_cls_vals), 0x07,
                  NULL, HFILL }
@@ -5706,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,
@@ -5759,8 +6696,18 @@ proto_register_gsm_a_gm(void)
                  FT_UINT8, BASE_DEC, NULL, 0x0f,
                  NULL, HFILL }
        },
+       { &hf_gsm_a_tft_pkt_flt_dir,
+               { "Packet filter direction", "gsm_a.tft.pkt_flt_dir",
+                 FT_UINT8, BASE_DEC, VALS(gsm_a_tft_pkt_flt_dir_vals), 0x30,
+                 NULL, HFILL }
+       },
+       { &hf_gsm_a_tft_pkt_flt_id,
+               { "Packet filter identifier", "gsm_a.tft.pkt_flt_id",
+                 FT_UINT8, BASE_DEC, NULL, 0x0f,
+                 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 }
        },
@@ -5770,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 }
        },
@@ -5785,7 +6732,7 @@ proto_register_gsm_a_gm(void)
                NULL, HFILL }
        },
        { &hf_gsm_a_tft_port,
-               { "Port", "gsm_a.tft.port", 
+               { "Port", "gsm_a.tft.port",
                  FT_UINT16, BASE_DEC, NULL, 0x0,
                NULL, HFILL }
        },
@@ -5809,6 +6756,16 @@ proto_register_gsm_a_gm(void)
                  FT_UINT8, BASE_HEX, NULL, 0x0,
                NULL, HFILL }
        },
+       { &hf_gsm_a_tft_flow_label_type,
+               { "Flow Label Type", "gsm_a.tft.flow_label_type",
+                 FT_UINT24, BASE_HEX, NULL, 0x0FFFFF,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_tft_param_id,
+               { "Parameter identifier", "gsm_a.tft.param_id",
+                 FT_UINT8, BASE_DEC, VALS(gsm_a_tft_param_id_vals), 0x0,
+                 NULL, HFILL }
+       },
        { &hf_gsm_a_ptmsi_sig,
                { "P-TMSI Signature", "gsm_a.ptmsi_sig",
                  FT_UINT24, BASE_HEX, NULL, 0x0,
@@ -5844,6 +6801,11 @@ proto_register_gsm_a_gm(void)
                  FT_UINT8, BASE_HEX, NULL, 0x80,
                NULL, HFILL }
        },
+       { &hf_gsm_a_gm_link_dir,
+               { "Link direction", "gsm_a.gm.link_dir",
+                 FT_INT32, BASE_DEC, VALS(gsm_a_gm_link_dir_vals), 0x0,
+               NULL, HFILL }
+       },
        { &hf_gsm_a_gm_cause,
                { "gmm Cause", "gsm_a.gm.cause",
                  FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(gmm_cause_vals), 0x0,
@@ -5919,6 +6881,66 @@ 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,
+               NULL, HFILL }
+       },
        { &hf_gsm_a_gm_type_of_identity,
                { "Type of identity", "gsm_a.gm.type_of_identity",
                FT_UINT8, BASE_DEC, VALS(gsm_a_gm_type_of_identity_vals), 0x07,
@@ -5959,15 +6981,545 @@ 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,
                NULL, HFILL }
        },
-       };
+       { &hf_gsm_a_qos_mean_thr,
+               { "Mean throughput", "gsm_a.qos.mean_throughput",
+               FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(gsm_a_qos_mean_thr_vals), 0x1f,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_qos_peak_thr,
+               { "Peak throughput", "gsm_a.qos.peak_throughput",
+               FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(gsm_a_qos_peak_thr_vals), 0xf0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_qos_prec_class,
+               { "Precedence class", "gsm_a.qos.prec_class",
+               FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(gsm_a_qos_prec_class_vals), 0x07,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_qos_traf_handl_prio,
+               { "Traffic handling priority", "gsm_a.qos.traf_handl_prio",
+               FT_UINT8, BASE_DEC, NULL, 0x03,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_qos_trans_delay,
+               { "Transfer delay", "gsm_a.qos.trans_delay",
+               FT_UINT8, BASE_DEC, NULL, 0xfc,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_qos_signalling_ind,
+               { "Signalling indication", "gsm_a.qos.signalling_ind",
+               FT_BOOLEAN, 8, TFS(&gsm_a_qos_signalling_ind_value), 0x10,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_qos_source_stat_desc,
+               { "Source statistics description", "gsm_a.qos.source_stat_desc",
+               FT_UINT8, BASE_DEC, NULL, 0x0f,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_qos_max_bitrate_upl,
+               { "Maximum bitrate for uplink", "gsm_a.qos.max_bitrate_upl",
+                 FT_UINT8, BASE_DEC, NULL, 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_qos_max_bitrate_downl,
+               { "Maximum bitrate for downlink", "gsm_a.qos.max_bitrate_downl",
+                 FT_UINT8, BASE_DEC, NULL, 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_qos_guar_bitrate_upl,
+               { "Guaranteed bitrate for uplink", "gsm_a.qos.guar_bitrate_upl",
+                 FT_UINT8, BASE_DEC, NULL, 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_qos_guar_bitrate_downl,
+               { "Guaranteed bitrate for downlink", "gsm_a.qos.guar_bitrate_downl",
+                 FT_UINT8, BASE_DEC, NULL, 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_qos_max_bitrate_upl_ext,
+               { "Maximum bitrate for uplink (extended)", "gsm_a.qos.max_bitrate_upl_ext",
+                 FT_UINT8, BASE_DEC, NULL, 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_qos_max_bitrate_downl_ext,
+               { "Maximum bitrate for downlink (extended)", "gsm_a.qos.max_bitrate_downl_ext",
+                 FT_UINT8, BASE_DEC, NULL, 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_qos_guar_bitrate_upl_ext,
+               { "Guaranteed bitrate for uplink (extended)", "gsm_a.qos.guar_bitrate_upl_ext",
+                 FT_UINT8, BASE_DEC, NULL, 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_qos_guar_bitrate_downl_ext,
+               { "Guaranteed bitrate for downlink (extended)", "gsm_a.qos.guar_bitrate_downl_ext",
+                 FT_UINT8, BASE_DEC, NULL, 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_sm_cause,
+               { "SM Cause", "gsm_a.sm.cause",
+                 FT_UINT8, BASE_DEC, NULL, 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_sm_cause_2,
+               { "SM Cause 2", "gsm_a.sm.cause_2",
+                 FT_UINT8, BASE_DEC, NULL, 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_sm_llc_sapi,
+               { "LLC SAPI", "gsm_a.sm.llc_sapi",
+               FT_UINT8, BASE_DEC, VALS(gsm_a_sm_llc_sapi_vals), 0x0f,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_sm_tdi,
+               { "Tear Down Indicator (TDI)", "gsm_a.sm.tdi",
+               FT_BOOLEAN, 8, TFS(&gsm_a_sm_tdi_value), 0x01,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_sm_packet_flow_id,
+               { "Packet Flow Identifier (PFI)", "gsm_a.sm.packet_flow_id",
+               FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(gsm_a_sm_packet_flow_id_vals), 0x7f,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gmm_net_cap_gea1,
+               { "GEA/1", "gsm_a.gmm.net_cap.gea1",
+               FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_gea_vals), 0x80,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gmm_net_cap_smdch,
+               { "SM capabilities via dedicated channels", "gsm_a.gmm.net_cap.smdch",
+               FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_smdch_vals), 0x40,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gmm_net_cap_smgprs,
+               { "SM capabilities via GPRS channels", "gsm_a.gmm.net_cap.smgprs",
+               FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_smgprs_vals), 0x20,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gmm_net_cap_ucs2,
+               { "UCS2 support", "gsm_a.gmm.net_cap.ucs2",
+               FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_smgprs_vals), 0x10,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gmm_net_cap_ss_scr_ind,
+               { "SS Screening Indicator", "gsm_a.gmm.net_cap.ss_scr_ind",
+               FT_UINT8, BASE_HEX, VALS(gsm_a_gmm_net_cap_ss_scr_ind_vals), 0x0c,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gmm_net_cap_solsa,
+               { "SoLSA Capability", "gsm_a.gmm.net_cap.solsa",
+               FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_solsa_vals), 0x02,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gmm_net_cap_rev,
+               { "Revision level indicator", "gsm_a.gmm.net_cap.rev",
+               FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_rev_vals), 0x01,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gmm_net_cap_pfc,
+               { "PFC feature mode", "gsm_a.gmm.net_cap.pfc",
+               FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_pfc_vals), 0x80,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gmm_net_cap_ext_gea_bits,
+               { "Extended GEA bits", "gsm_a.gmm.net_cap.ext_gea_bits",
+               FT_UINT8, BASE_HEX, NULL, 0x7e,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gmm_net_cap_gea2,
+               { "GEA/2", "gsm_a.gmm.net_cap.gea2",
+               FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_gea_vals), 0x40,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gmm_net_cap_gea3,
+               { "GEA/3", "gsm_a.gmm.net_cap.gea3",
+               FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_gea_vals), 0x20,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gmm_net_cap_gea4,
+               { "GEA/4", "gsm_a.gmm.net_cap.gea4",
+               FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_gea_vals), 0x10,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gmm_net_cap_gea5,
+               { "GEA/5", "gsm_a.gmm.net_cap.gea5",
+               FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_gea_vals), 0x08,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gmm_net_cap_gea6,
+               { "GEA/6", "gsm_a.gmm.net_cap.gea6",
+               FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_gea_vals), 0x04,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gmm_net_cap_gea7,
+               { "GEA/7", "gsm_a.gmm.net_cap.gea7",
+               FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_gea_vals), 0x02,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gmm_net_cap_lcs,
+               { "LCS VA capability", "gsm_a.gmm.net_cap.lcs",
+               FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_lcs_vals), 0x01,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gmm_net_cap_ps_irat_iu,
+               { "PS inter-RAT HO to UTRAN Iu mode capability", "gsm_a.gmm.net_cap.ps_irat_iu",
+               FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_ps_irat_iu_vals), 0x80,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gmm_net_cap_ps_irat_s1,
+               { "PS inter-RAT HO to E-UTRAN S1 mode capability", "gsm_a.gmm.net_cap.ps_irat_s1",
+               FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_ps_irat_s1_vals), 0x40,
+               NULL, HFILL }
+       },
+       { &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,
+               { "ISR support", "gsm_a.gmm.net_cap.isr",
+               FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_isr_vals), 0x10,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gmm_net_cap_srvcc_to_geran,
+               { "SRVCC to GERAN/UTRAN capability", "gsm_a.gmm.net_cap.srvcc_to_geran",
+               FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_srvcc_to_geran_vals), 0x08,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gmm_net_cap_epc,
+               { "EPC Capability", "gsm_a.gmm.net_cap.epc",
+               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,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_sm_enh_nsapi,
+               { "Enhanced NSAPI", "gsm_a.sm.enh_nsapi",
+                 FT_UINT8, BASE_DEC, NULL, 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_sm_req_type,
+               { "Request type", "gsm_a.sm.req_type",
+                 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_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    16
+#define        NUM_INDIVIDUAL_ELEMS    18
        gint *ett[NUM_INDIVIDUAL_ELEMS +
                  NUM_GSM_DTAP_MSG_GMM + NUM_GSM_DTAP_MSG_SM +
                  NUM_GSM_GM_ELEM];
@@ -5988,6 +7540,8 @@ proto_register_gsm_a_gm(void)
        ett[13] = &ett_gmm_rai;
        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;
 
@@ -6026,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");
 }