From Pascal Quantin:
[obnox/wireshark/wip.git] / epan / dissectors / packet-gsm_a_gm.c
index fb5100f91b56c93ce9519d948c8e168656fd3a10..b06b62b801db2b30761209ad933c98b41ecbf723 100644 (file)
@@ -33,7 +33,7 @@
  *   Mobile radio interface Layer 3 specification;
  *   Core network protocols;
  *   Stage 3
- *   (3GPP TS 24.008 version 8.6.0 Release 8)
+ *   (3GPP TS 24.008 version 9.6.0 Release 9)
  *
  * $Id$
  *
@@ -63,6 +63,7 @@
 #include <string.h>
 
 #include <epan/packet.h>
+#include <epan/expert.h>
 #include <epan/prefs.h>
 #include <epan/tap.h>
 #include <epan/asn1.h>
@@ -72,7 +73,6 @@
 #include "packet-ber.h"
 #include "packet-q931.h"
 #include "packet-gsm_a_common.h"
-#include "packet-ipv6.h"
 #include "packet-e212.h"
 #include "packet-ppp.h"
 
@@ -132,6 +132,9 @@ const value_string gsm_a_dtap_msg_sm_strings[] = {
        { 0x58, "Activate MBMS Context Reject" },
        { 0x59, "Request MBMS Context Activation" },
        { 0x5a, "Request MBMS Context Activation Reject" },
+       { 0x5b, "Request Secondary PDP Context Activation" },
+       { 0x5c, "Request Secondary PDP Context Activation Reject" },
+       { 0x5d, "Notification" },
        { 0, NULL }
 };
 
@@ -154,6 +157,7 @@ const value_string gsm_gm_elem_strings[] = {
        { 0x00, "MS Radio Access Capability" },
        { 0x00, "GMM Cause" },
        { 0x00, "Routing Area Identification" },
+       { 0x00, "Routing Area Identification 2" },
        { 0x00, "Update Result" },
        { 0x00, "Update Type" },
        { 0x00, "A&C Reference Number" },
@@ -163,6 +167,10 @@ const value_string gsm_gm_elem_strings[] = {
        { 0x00, "PS LCS Capability" },
        { 0x00, "Network Feature Support" },
        { 0x00, "Inter RAT information container" },
+       { 0x00, "Requested MS information" },
+       { 0x00, "UE network capability" },
+       { 0x00, "E-UTRAN inter RAT information container" },
+       { 0x00, "Voice domain preference and UE's usage setting" },
        /* Session Management Information Elements 10.5.6 */
        { 0x00, "Access Point Name" },
        { 0x00, "Network Service Access Point Identifier" },
@@ -176,6 +184,12 @@ const value_string gsm_gm_elem_strings[] = {
        { 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" },
@@ -183,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 }
 };
@@ -215,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;
@@ -225,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;
@@ -246,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;
@@ -254,6 +286,10 @@ static int hf_gsm_a_gm_otd_b = -1;
 static int hf_gsm_a_gm_gps_a = -1;
 static int hf_gsm_a_gm_gps_b = -1;
 static int hf_gsm_a_gm_gps_c = -1;
+static int hf_gsm_a_gm_req_ms_info_irat = -1;
+static int hf_gsm_a_gm_req_ms_info_irat2 = -1;
+static int hf_gsm_a_gm_ue_usage_setting = -1;
+static int hf_gsm_a_gm_voice_domain_pref_for_eutran = -1;
 static int hf_gsm_a_sm_pdp_type_org = -1;
 static int hf_gsm_a_qos_mean_thr = -1;
 static int hf_gsm_a_qos_peak_thr = -1;
@@ -275,6 +311,65 @@ 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;
@@ -294,10 +389,11 @@ static int hf_gsm_a_gmm_net_cap_gea7 = -1;
 static int hf_gsm_a_gmm_net_cap_lcs = -1;
 static int hf_gsm_a_gmm_net_cap_ps_irat_iu = -1;
 static int hf_gsm_a_gmm_net_cap_ps_irat_s1 = -1;
-static int hf_gsm_a_gmm_net_cap_csfb = -1;
+static int hf_gsm_a_gmm_net_cap_comb_proc = -1;
 static int hf_gsm_a_gmm_net_cap_isr = -1;
 static int hf_gsm_a_gmm_net_cap_srvcc_to_geran = -1;
 static int hf_gsm_a_gmm_net_cap_epc = -1;
+static int hf_gsm_a_gmm_net_cap_nf = -1;
 
 /* Initialize the subtree pointers */
 static gint ett_tc_component = -1;
@@ -315,6 +411,7 @@ static gint ett_gmm_context_stat = -1;
 static gint ett_gmm_update_type = -1;
 static gint ett_gmm_radio_cap = -1;
 static gint ett_gmm_network_cap = -1;
+static gint ett_gsm_a_gm_msrac_multislot_capability = -1;
 static gint ett_gmm_rai = -1;
 static gint ett_gmm_gprs_timer = -1;
 
@@ -322,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 */
 
@@ -340,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);
@@ -360,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,
@@ -373,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);
@@ -383,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" },
@@ -396,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);
@@ -414,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);
@@ -427,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;
@@ -532,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;
@@ -593,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++;
 
@@ -619,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);
@@ -636,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);
@@ -653,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;
@@ -674,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);
 }
@@ -702,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);
@@ -722,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);
@@ -739,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;
@@ -783,7 +881,7 @@ de_gmm_rec_npdu_lst(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len,
 
        } while ( curr_len > 1 );
 
-       EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+       EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
 
        return(curr_offset - offset);
 }
@@ -849,9 +947,9 @@ static const true_false_string gsm_a_gmm_net_cap_ps_irat_s1_vals = {
        "PS inter-RAT HO to E-UTRAN S1 mode not supported"
 };
 
-static const true_false_string gsm_a_gmm_net_cap_csfb_vals = {
-       "Mobile station supports CS fallback",
-       "Mobile station does not support CS fallback"
+static const true_false_string gsm_a_gmm_net_cap_comb_proc_vals = {
+       "Mobile station supports EMM combined procedures",
+       "Mobile station does not support EMM combined procedures"
 };
 
 static const true_false_string gsm_a_gmm_net_cap_isr_vals = {
@@ -869,81 +967,89 @@ static const true_false_string gsm_a_gmm_net_cap_epc_vals = {
        "EPC not supported"
 };
 
+static const true_false_string gsm_a_gmm_net_cap_nf_vals = {
+       "Mobile station supports the notification procedure",
+       "Mobile station does not support the notification procedure"
+};
+
 guint16
-de_gmm_ms_net_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+de_gmm_ms_net_cap(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
 {
        guint32 curr_offset;
        proto_tree      *subtree;
        proto_item      *item;
 
        curr_offset = offset;
-       
+
        /* bit 8: GEA1 */
-       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_gea1, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_gea1, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
 
        /* bit 7: SM capabilities via dedicated channels */
-       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_smdch, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_smdch, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
 
        /* bit 6: SM capabilities via GPRS channels */
-       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_smgprs, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_smgprs, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
 
        /* bit 5: UCS2 support */
-       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_ucs2, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_ucs2, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
 
        /* bits 4 3: SS Screening Indicator */
-       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_ss_scr_ind, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_ss_scr_ind, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
 
        /* bit 2: SoLSA Capability */
-       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_solsa, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_solsa, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
 
        /* bit 1 */
-       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_rev, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_rev, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
 
        curr_offset++;
        NO_MORE_DATA_CHECK(len);
 
        /* bit 8: PFC feature mode */
-       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_pfc, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_pfc, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
 
        /* bits 7 6 5 4 3 2: Extended GEA bits */
-       item = proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_ext_gea_bits, tvb, curr_offset, 1, FALSE);
+       item = proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_ext_gea_bits, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
        subtree = proto_item_add_subtree(item, ett_gmm_network_cap);
-       proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea2, tvb, curr_offset, 1, FALSE);
-       proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea3, tvb, curr_offset, 1, FALSE);
-       proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea4, tvb, curr_offset, 1, FALSE);
-       proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea5, tvb, curr_offset, 1, FALSE);
-       proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea6, tvb, curr_offset, 1, FALSE);
-       proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea7, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea2, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea3, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea4, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea5, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea6, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea7, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
 
-       /* bit 1: LCS VA capability */  
-       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_lcs, tvb, curr_offset, 1, FALSE);
+       /* 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);
 
        /* bit 8: PS inter-RAT HO to UTRAN Iu mode capability */
-       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_ps_irat_iu, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_ps_irat_iu, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
 
        /* bit 7: PS inter-RAT HO to E-UTRAN S1 mode capability */
-       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_ps_irat_s1, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_ps_irat_s1, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
 
-       /* bit 6: CSFB Capability */
-       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_csfb, tvb, curr_offset, 1, FALSE);
+       /* bit 6: EMM Combined procedures capability */
+       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_comb_proc, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
 
        /* bit 5: ISR support */
-       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_isr, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_isr, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
 
        /* bit 4: SRVCC to GERAN/UTRAN capability */
-       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_srvcc_to_geran, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_srvcc_to_geran, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
 
        /* bit 3: EPC capability */
-       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_epc, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_epc, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+
+       /* bit 3: NF capability */
+       proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_nf, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
 
-       /* bits 2 1: Spare bits */
-       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3)+6, 2, FALSE);
+       /* bits 1: Spare bit */
+       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3)+7, 1, ENC_BIG_ENDIAN);
 
        curr_offset++;
-    EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+       EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
 
        return(curr_offset - offset);
 }
@@ -998,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;
@@ -1015,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;
@@ -1116,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;
@@ -1126,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;
                        }
                }
@@ -1145,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;
@@ -1160,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;
@@ -1228,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;
@@ -1270,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
@@ -1407,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++ )
                        {
                                /*
@@ -1440,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;
@@ -1462,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;
@@ -1484,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;
@@ -1506,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;
@@ -1528,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?
                         */
@@ -1559,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++;
@@ -1580,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;
@@ -1599,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++;
@@ -1620,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;
@@ -1635,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;
@@ -1660,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++;
@@ -1682,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;
@@ -1695,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;
@@ -1711,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++;
@@ -1732,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;
@@ -1751,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;
@@ -1772,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;
@@ -1787,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;
@@ -1812,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++;
@@ -1836,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;
@@ -1859,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;
@@ -1882,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;
@@ -1933,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
                         */
@@ -1982,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;
@@ -2004,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;
@@ -2026,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;
@@ -2048,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;
@@ -2070,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;
@@ -2092,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;
@@ -2114,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;
@@ -2133,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;
 
@@ -2152,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
@@ -2235,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;
@@ -2302,95 +2289,481 @@ 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) )
+               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)
                {
-                       case 0x00: str="GERAN Iu mode not supported"; break;
-                       case 0x01: str="GERAN Iu mode supported";     break;
+                       /* GERAN Iu Mode Capabilities struct present */
+                       bits_needed = 4;
+                       GET_DATA;
+                       value = tvb_get_bits8(tvb, bit_offset, 4);
+                       bit_offset+=bits_needed;
+                       curr_bits_length -= bits_needed;
+                       oct <<= bits_needed;
+                       bits_in_oct -= bits_needed;
+                       if (value)
+                       {
+                               /*
+                                * FLO Iu Capability
+                                */
+                               bits_needed = 1;
+                               GET_DATA;
+                               proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_flo_iu_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
+                               bit_offset+=bits_needed;
+                               curr_bits_length -= bits_needed;
+                               oct <<= bits_needed;
+                               bits_in_oct -= bits_needed;
+                               value--;
+                               
+                               /* skip spare bits */
+                               bit_offset+=value;
+                               curr_bits_length -= value;
+                               oct <<= value;
+                               bits_in_oct -= value;
+                       }
+               }
+
+               /*
+                * GMSK Multislot Power Profile
+                */
+               bits_needed = 2;
+               GET_DATA;
+
+               /* analyse bits */
+               switch ( oct>>(32-bits_needed) )
+               {
+                       case 0x00: str="GMSK_MULTISLOT_POWER_PROFILE 0"; break;
+                       case 0x01: str="GMSK_MULTISLOT_POWER_PROFILE 1"; break;
+                       case 0x02: str="GMSK_MULTISLOT_POWER_PROFILE 2"; break;
+                       case 0x03: str="GMSK_MULTISLOT_POWER_PROFILE 3"; break;
                        default:   str="This should not happen";
                }
 
                proto_tree_add_text(tf_tree,
                        tvb, curr_offset-1-add_ocetets, 1+add_ocetets,
-                       "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;
+                       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;
 
-                       /* analyse bits */
-                       switch ( oct>>(32-bits_needed) )
+                       bits_needed = 1;
+                       GET_DATA;
+                       if ((oct>>(32-bits_needed))==0)
                        {
-                               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";
+                               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,
-                               "GMSK Multislot Power Profile: %s (%u)",str,oct>>(32-bits_needed));
-                       bit_offset+=2;
+                       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;
+
+               /*
+                * Multislot Capability Reduction for Downlink Dual Carrier & Downlink Dual Carrier for DTM Capability
+                */
+               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;
 
                        /*
-                        * 8-PSK Multislot Power Profile
+                        * Multislot Capability Reduction for Downlink Dual Carrier
                         */
-                       bits_needed = 2;
+                       bits_needed = 3;
                        GET_DATA;
+                       proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_multi_slot_cap_red_down_dual_carrier, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
+                       bit_offset+=bits_needed;
+                       curr_bits_length -= bits_needed;
+                       oct <<= bits_needed;
+                       bits_in_oct -= bits_needed;
 
-                       /* analyse bits */
-                       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;
+                       /*
+                        * 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;
+               }
+
+               /*
+                * 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
@@ -2407,11 +2780,12 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint l
                        bits_in_oct -= bits_needed;
                }
 
+
        } while ( 1 );
 
        curr_offset+= curr_len;
-          
-       EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+
+       EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
 
        return(curr_offset - offset);
 }
@@ -2472,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".
@@ -2481,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++;
 
@@ -2500,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;
@@ -2530,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;
@@ -2591,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,
@@ -2604,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);
@@ -2615,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);
@@ -2628,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);
@@ -2650,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);
@@ -2706,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);
 }
@@ -2730,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;
@@ -2746,45 +3138,132 @@ de_gmm_net_feat_supp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len
                default: str="LCS-MOLR via PS domain supported";
        }
 
-       proto_tree_add_text(tree,
-               tvb, curr_offset, 1,
-               "Network Feature Support: %s (%u)",
-               str,
-               (oct>>3)&1);
+       proto_tree_add_text(tree,
+               tvb, curr_offset, 1,
+               "Network Feature Support: %s (%u)",
+               str,
+               (oct>>3)&1);
+
+       curr_offset++;
+
+       /* no length check possible */
+
+       return(curr_offset - offset);
+}
+
+/* [7] 10.5.5.24 Inter RAT information container */
+static guint16
+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;
+
+       curr_offset = offset;
+
+/* The value part of the Inter RAT information container information element is the INTER RAT HANDOVER INFO as
+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,pinfo , tree);
+       else
+               proto_tree_add_text(tree, tvb, curr_offset, len,"INTER RAT HANDOVER INFO - Not decoded");
+
+       return len;
+
+}
+
+/* [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++;
 
-       /* no length check possible */
-
-       return(curr_offset - offset);
+       return len;
 }
 
-/* [7] 10.5.5.24 Inter RAT information container */
+/* [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_rat_info_container(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+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 *rrc_irat_ho_info_tvb;
+       tvbuff_t *lte_rrc_ue_eutra_cap_tvb;
 
        curr_offset = offset;
 
-/* The value part of the Inter RAT information container information element is the INTER RAT HANDOVER INFO as
-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);
+/* 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,"INTER RAT HANDOVER INFO - Not decoded");
+               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;
@@ -2821,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);
 }
@@ -2830,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;
@@ -2872,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;
@@ -2903,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);
@@ -2914,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;
@@ -2955,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;
@@ -2992,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;
 
@@ -3027,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 ))
@@ -3062,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);
 }
@@ -3071,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;
@@ -3093,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" },
@@ -3106,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
+
+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, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+de_sm_pco(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
 {
+       proto_item   *generated_item = NULL;
        guint32 curr_offset;
        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++;
 
@@ -3146,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,
@@ -3171,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,
@@ -3192,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);
                                }
                        }
                }
@@ -3229,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);
 }
@@ -3245,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;
@@ -3264,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;
@@ -3273,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;
@@ -3284,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,
@@ -3295,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 )
@@ -3303,32 +3854,32 @@ 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);
 }
@@ -3506,7 +4057,7 @@ qos_calc_ext_bitrate(guint8 oct)
 }
 
 guint16
-de_sm_qos(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+de_sm_qos(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
 {
        guint32 curr_offset;
        guchar     oct, tmp_oct;
@@ -3516,29 +4067,29 @@ de_sm_qos(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add
        curr_offset = offset;
 
        /* Octet 3 */
-       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset << 3), 2, FALSE);
-       proto_tree_add_item(tree, hf_gsm_a_qos_delay_cls, tvb, curr_offset, 1, FALSE);
-       proto_tree_add_item(tree, hf_gsm_a_qos_reliability_cls, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset << 3), 2, ENC_BIG_ENDIAN);
+       proto_tree_add_item(tree, hf_gsm_a_qos_delay_cls, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_item(tree, hf_gsm_a_qos_reliability_cls, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
        curr_offset+= 1;
 
        /* Octet 4 */
        oct = tvb_get_guint8(tvb, curr_offset);
-       proto_tree_add_item(tree, hf_gsm_a_qos_peak_thr, tvb, curr_offset, 1, FALSE);
-       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset << 3) + 4, 1, FALSE);
-       proto_tree_add_item(tree, hf_gsm_a_qos_prec_class, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_item(tree, hf_gsm_a_qos_peak_thr, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset << 3) + 4, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_item(tree, hf_gsm_a_qos_prec_class, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
        curr_offset+= 1;
 
        /* Octet 5 */
-       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset << 3), 3, FALSE);
-       proto_tree_add_item(tree, hf_gsm_a_qos_mean_thr, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset << 3), 3, ENC_BIG_ENDIAN);
+       proto_tree_add_item(tree, hf_gsm_a_qos_mean_thr, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
        curr_offset+= 1;
 
        NO_MORE_DATA_CHECK(len);
 
        /* Octet 6 */
-       proto_tree_add_item(tree, hf_gsm_a_qos_traffic_cls, tvb, curr_offset, 1, FALSE);
-       proto_tree_add_item(tree, hf_gsm_a_qos_del_order, tvb, curr_offset, 1, FALSE);
-       proto_tree_add_item(tree, hf_gsm_a_qos_del_of_err_sdu, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_item(tree, hf_gsm_a_qos_traffic_cls, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_item(tree, hf_gsm_a_qos_del_order, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_item(tree, hf_gsm_a_qos_del_of_err_sdu, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
        curr_offset+= 1;
 
        NO_MORE_DATA_CHECK(len);
@@ -3579,7 +4130,7 @@ de_sm_qos(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add
                default: str = ep_strdup_printf("%u kbps", qos_calc_bitrate(oct));
        }
 
-       proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_max_bitrate_upl, tvb, 
+       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;
 
@@ -3595,15 +4146,15 @@ de_sm_qos(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add
                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, 
+       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);
 
        /* Octet 10 */
-       proto_tree_add_item(tree, hf_gsm_a_qos_ber, tvb, curr_offset, 1, FALSE);
-       proto_tree_add_item(tree, hf_gsm_a_qos_sdu_err_rat, tvb, curr_offset, 1, FALSE);
+       proto_tree_add_item(tree, hf_gsm_a_qos_ber, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_item(tree, hf_gsm_a_qos_sdu_err_rat, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
 
        curr_offset+= 1;
        NO_MORE_DATA_CHECK(len);
@@ -3626,7 +4177,7 @@ de_sm_qos(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add
                        str = ep_strdup_printf("%u ms", temp32);
        }
 
-       proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_trans_delay, tvb, 
+       proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_trans_delay, tvb,
                curr_offset, 1, oct, "%s (%u)", str, tmp_oct);
 
        tmp_oct = oct & 0x03;
@@ -3635,7 +4186,7 @@ de_sm_qos(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add
        else
                str = ep_strdup_printf("Priority level %u", tmp_oct);
 
-       proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_traf_handl_prio, tvb, 
+       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;
@@ -3651,7 +4202,7 @@ de_sm_qos(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add
                default: str = ep_strdup_printf("%u kbps", qos_calc_bitrate(oct));
        }
 
-       proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_guar_bitrate_upl, tvb, 
+       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;
@@ -3667,7 +4218,7 @@ de_sm_qos(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add
                default: str = ep_strdup_printf("%u kbps", qos_calc_bitrate(oct));
        }
 
-       proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_guar_bitrate_downl, tvb, 
+       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;
@@ -3675,8 +4226,8 @@ de_sm_qos(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add
 
        /* Ocet 14 */
        oct = tvb_get_guint8(tvb, curr_offset);
-       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset << 3), 3, FALSE);
-       proto_tree_add_item(tree, hf_gsm_a_qos_signalling_ind, tvb , curr_offset, 1, FALSE);
+       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset << 3), 3, ENC_BIG_ENDIAN);
+       proto_tree_add_item(tree, hf_gsm_a_qos_signalling_ind, tvb , curr_offset, 1, ENC_BIG_ENDIAN);
 
        tmp_oct = oct & 7;
        if (tmp_oct == 0x01)
@@ -3684,7 +4235,7 @@ de_sm_qos(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add
        else
                str = "unknown";
 
-       proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_source_stat_desc, tvb, 
+       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;
@@ -3703,7 +4254,7 @@ de_sm_qos(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add
                else
                        str = ep_strdup_printf("%u kbps", temp32);
        }
-       proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_max_bitrate_downl_ext, tvb, 
+       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;
@@ -3722,7 +4273,7 @@ de_sm_qos(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add
                else
                        str = ep_strdup_printf("%u kbps", temp32);
        }
-       proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_guar_bitrate_downl_ext, tvb, 
+       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;
@@ -3741,7 +4292,7 @@ de_sm_qos(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add
                else
                        str = ep_strdup_printf("%u kbps", temp32);
        }
-       proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_max_bitrate_upl_ext, tvb, 
+       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;
@@ -3760,12 +4311,12 @@ de_sm_qos(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add
                else
                        str = ep_strdup_printf("%u kbps", temp32);
        }
-       proto_tree_add_uint_format_value(tree, hf_gsm_a_qos_guar_bitrate_upl_ext, tvb, 
+       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;
 
-       EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+       EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
 
        return(curr_offset - offset);
 }
@@ -3819,17 +4370,16 @@ static const value_string gsm_a_sm_cause_vals[] = {
 };
 
 static guint16
-de_sm_cause(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_sm_cause(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
 {
        guint8  oct;
        const gchar     *str;
 
        oct = tvb_get_guint8(tvb, offset);
-       str = match_strval(oct, gsm_a_sm_cause_vals);
 
        /* SM Cause can be sent in both directions */
-       if (!str)
-               str = "Protocol error, unspecified / Service option temporarily out of order";
+       str = val_to_str_const(oct, gsm_a_sm_cause_vals,
+                              "Protocol error, unspecified / Service option temporarily out of order");
 
        proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_cause, tvb,
                                offset, 1, oct, "%s (%u)", str, oct);
@@ -3842,17 +4392,16 @@ de_sm_cause(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gcha
  * [9] 10.5.6.6a SM cause 2
  */
 static guint16
-de_sm_cause_2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_sm_cause_2(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
 {
        guint8  oct;
        const gchar     *str;
 
        oct = tvb_get_guint8(tvb, offset);
-       str = match_strval(oct, gsm_a_sm_cause_vals);
 
        /* SM Cause 2 is sent only in the Network-to-MS direction */
-       if (!str)
-               str = "Service option temporarily out of order";
+       str = val_to_str_const(oct, gsm_a_sm_cause_vals,
+                              "Service option temporarily out of order");
 
        proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_cause_2, tvb,
                                offset, 1, oct, "%s (%u)", str, oct);
@@ -3863,49 +4412,54 @@ de_sm_cause_2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gc
 /*
  * [7] 10.5.6.7
  */
+
+static const true_false_string gsm_a_sm_ti_flag_vals = {
+       "The message is sent to the side that originates the TI",
+       "The message is sent from the side that originates the TI"
+};
+
 static guint16
-de_sm_linked_ti(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+de_sm_linked_ti(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
 {
        guint32 curr_offset;
        guint   curr_len;
        gchar   oct;
-
-       static const gchar *ti_flag[2]={
-               "The message is sent from the side that originates the TI" ,
-               "The message is sent to the side that originates the TI" };
-
        curr_len = len;
        curr_offset = offset;
 
        oct = tvb_get_guint8(tvb, curr_offset);
 
-       proto_tree_add_text(tree,
-               tvb, curr_offset, 1,
-               "TI flag: %s (%u)",ti_flag[oct>>7],oct>>7);
+       proto_tree_add_item(tree, hf_gsm_a_sm_ti_flag, tvb, offset, 1, ENC_BIG_ENDIAN);
+
+       /* The TI value and the TI flag occupy bits 5 - 7 and bit 8 of the first octet respectively.
+        * The extended TI shall not be used unless TI values of 7 or greater are needed.
+        * Where the extended TI is used, the TI IE includes a second octet. The TI value in the first octet is ignored, and the TI
+        * value is encoded in bits 7-1 of the second octet.
+        */
 
        if ( curr_len > 1 )
        {
+               curr_offset++;
                oct = tvb_get_guint8(tvb, curr_offset);
 
                proto_tree_add_text(tree,
                        tvb, curr_offset, 1,
                        "TI value: 0x%02x (%u)",oct&0x7f,oct&0x7f);
 
-               proto_tree_add_text(tree,
-                       tvb, curr_offset, 1,
-                       "ext: 0x%02x (%u)",oct>>7,oct>>7);
+               proto_tree_add_item(tree, hf_gsm_a_sm_ext, tvb, offset, 1, ENC_BIG_ENDIAN);
 
+               curr_offset++;
        }
        else
        {
                proto_tree_add_text(tree,
                        tvb, curr_offset, 1,
                        "TI value: 0x%02x (%u)",(oct>>4)&7,(oct>>4)&7);
+               curr_offset++;
        }
 
-       curr_offset+= curr_len;
-          
-       EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+
+       EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
 
        return(curr_offset - offset);
 }
@@ -3923,10 +4477,10 @@ static const value_string gsm_a_sm_llc_sapi_vals[] = {
 };
 
 static guint16
-de_sm_sapi(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_sm_sapi(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
 {
-       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, offset << 3, 4, FALSE);
-       proto_tree_add_item(tree, hf_gsm_a_sm_llc_sapi, tvb, offset, 1, FALSE);
+       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, offset << 3, 4, ENC_BIG_ENDIAN);
+       proto_tree_add_item(tree, hf_gsm_a_sm_llc_sapi, tvb, offset, 1, ENC_BIG_ENDIAN);
 
        /* no length check possible */
        return(1);
@@ -3941,10 +4495,10 @@ const true_false_string gsm_a_sm_tdi_value = {
 };
 
 static guint16
-de_sm_tear_down(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
+de_sm_tear_down(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
 {
-       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (offset << 3) + 4, 3, FALSE);
-       proto_tree_add_item(tree, hf_gsm_a_sm_tdi, tvb, offset, 1, FALSE);
+       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (offset << 3) + 4, 3, ENC_BIG_ENDIAN);
+       proto_tree_add_item(tree, hf_gsm_a_sm_tdi, tvb, offset, 1, ENC_BIG_ENDIAN);
 
        /* no length check possible */
        return(1);
@@ -3964,15 +4518,21 @@ static const range_string gsm_a_sm_packet_flow_id_vals[] = {
 };
 
 guint16
-de_sm_pflow_id(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+de_sm_pflow_id(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
 {
        guint32 curr_offset;
-       
+       guint value;
+
        curr_offset = offset;
-       proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, offset << 3, 1, FALSE);
-       proto_tree_add_item(tree, hf_gsm_a_sm_packet_flow_id, tvb, offset, 1, FALSE);
-          
-       EXTRANEOUS_DATA_CHECK(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++;
+
+    if (add_string)
+        g_snprintf(add_string, string_len, " - %s", rval_to_str(value, gsm_a_sm_packet_flow_id_vals, "Unknown"));
+
+       EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo);
 
        return(curr_offset - offset);
 }
@@ -3994,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 guint16
-de_sm_tflow_temp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
+static const value_string gsm_a_tft_param_id_vals[] = {
+       { 1,    "Authorization Token"},
+       { 2,    "Flow Identifier"},
+       { 3,    "Packet Filter Identifier"},
+       { 0,    NULL }
+};
+
+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;
@@ -4014,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;
@@ -4029,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--;
@@ -4053,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++;
@@ -4088,135 +4659,349 @@ 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="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,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,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_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;
 
-                               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;
-                                       curr_len-=4;
-                                       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++;
+               }
+       }
+
+       /* The parameters list contains a variable number of parameters that might need to be
+        * 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) && 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);
+}
+
+/*
+ * [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);
 
-                               case 0x60:
-                                       str="Security parameter index type";
-                                       proto_tree_add_item(comp_tree,hf_gsm_a_tft_security,tvb,curr_offset,4,FALSE);
-                                       curr_offset+=4;
-                                       curr_len-=4;
-                                       break;
+       /* 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 }
+};
 
-                               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;
-                                       curr_len-=2;
-                                       break;
+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;
 
-                               case 0x80:
-                                       str="Flow label type";
-                                       proto_tree_add_item(comp_tree,hf_gsm_a_tft_traffic_mask,tvb,curr_offset,1,FALSE);
-                                       curr_offset+=3;
-                                       curr_len-=3;
-                                       break;
+       curr_offset = offset;
 
-                               default:
-                                       str="not specified";
-                               }
-                               proto_item_append_text(tf, "%s (%u)", str, pack_component_type);
-                               count++;
-                       }
-               }
-       }
+       proto_tree_add_item(tree, hf_gsm_a_sm_notif_ind, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
 
-       /* The parameters list contains a variable number of parameters that might need to be
-        * 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");
-       }
-       return(curr_offset - offset);
+       return(len);
 }
 
-guint16 (*gm_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_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 */
@@ -4235,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 */
@@ -4244,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 */
@@ -4257,6 +5047,12 @@ guint16 (*gm_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint
        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 */
@@ -4264,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 */
 };
 
@@ -4273,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;
@@ -4282,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);
 
@@ -4311,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;
@@ -4327,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);
 
@@ -4365,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;
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       ELEM_OPT_TLV(0x27, GSM_A_PDU_TYPE_GM, DE_RAT_INFO_CONTAINER, " - Inter RAT handover information");
+
+       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;
@@ -4400,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;
@@ -4422,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;
@@ -4453,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;
@@ -4480,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; */
@@ -4510,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;
@@ -4529,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);
 
@@ -4567,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;
@@ -4589,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);
 
@@ -4603,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;
@@ -4618,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;
@@ -4636,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;
@@ -4657,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;
@@ -4689,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;
@@ -4709,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);
 
@@ -4739,14 +5560,30 @@ dtap_gmm_rau_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
 
        ELEM_OPT_TLV( 0x33 , GSM_A_PDU_TYPE_GM, DE_PS_LCS_CAP , NULL);
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       ELEM_OPT_TLV(0x35, GSM_A_PDU_TYPE_GM, DE_MBMS_CTX_STATUS, NULL);
+
+       ELEM_OPT_TLV(0x58, NAS_PDU_TYPE_EMM, DE_EMM_UE_NET_CAP, NULL);
+
+       ELEM_OPT_TLV(0x1A, GSM_A_PDU_TYPE_COMMON, DE_MID, " - Additional mobile identity");
+
+       ELEM_OPT_TLV(0x1B, GSM_A_PDU_TYPE_GM, DE_RAI_2, " - Additional old routing area identification");
+
+       ELEM_OPT_TLV(0x11, GSM_A_PDU_TYPE_COMMON, DE_MS_CM_2, NULL);
+
+       ELEM_OPT_TLV(0x20, GSM_A_PDU_TYPE_COMMON, DE_MS_CM_3, NULL);
+
+       ELEM_OPT_TLV(0x40, GSM_A_PDU_TYPE_DTAP, DE_SUP_CODEC_LIST, NULL);
+
+       ELEM_OPT_TLV(0x5D, GSM_A_PDU_TYPE_GM, DE_VOICE_DOMAIN_PREF, NULL);
+
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
  * [7] 9.4.15
  */
 static void
-dtap_gmm_rau_acc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_gmm_rau_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -4755,23 +5592,23 @@ dtap_gmm_rau_acc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
        curr_offset = offset;
        curr_len = len;
 
-       gsm_a_dtap_pinfo->p2p_dir = P2P_DIR_SENT;
+       pinfo->p2p_dir = P2P_DIR_SENT;
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_UPD_RES );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_UPD_RES, NULL);
        curr_offset--;
        curr_len++;
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND, NULL);
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER, " - Periodic RA update timer");
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_RAI );
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_RAI, NULL);
 
        ELEM_OPT_TV( 0x19 , GSM_A_PDU_TYPE_GM, DE_P_TMSI_SIG , NULL);
 
        ELEM_OPT_TLV( 0x18 , GSM_A_PDU_TYPE_COMMON, DE_MID , " - Allocated P-TMSI");
 
-       ELEM_OPT_TLV( 0x23 , GSM_A_PDU_TYPE_COMMON, DE_MID , NULL);
+       ELEM_OPT_TLV( 0x23 , GSM_A_PDU_TYPE_COMMON, DE_MID , " - MS identity");
 
        ELEM_OPT_TLV( 0x26 , GSM_A_PDU_TYPE_GM, DE_REC_N_PDU_NUM_LIST , NULL);
 
@@ -4791,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;
@@ -4807,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");
+
+       ELEM_OPT_TLV(0x2B, GSM_A_PDU_TYPE_GM, DE_EUTRAN_IRAT_INFO_CONTAINER, " - E-UTRAN inter RAT handover information");
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       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;
@@ -4830,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;
@@ -4858,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;
@@ -4878,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" );
 
@@ -4892,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;
@@ -4908,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);
@@ -4926,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;
@@ -4942,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;
@@ -4965,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;
@@ -4985,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" );
 
@@ -4999,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);
 }
 
 /*
  * [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;
@@ -5015,37 +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);
 
-       ELEM_OPT_TLV( 0x39 , GSM_A_PDU_TYPE_GM, DE_SM_CAUSE_2, NULL );
+       ELEM_OPT_TLV( 0x39 , GSM_A_PDU_TYPE_GM, DE_SM_CAUSE_2, " - SM cause");
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
  * [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;
@@ -5054,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;
@@ -5076,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" );
 
@@ -5091,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;
@@ -5107,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
@@ -5126,14 +5991,242 @@ 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, 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;
+       /* Network to MS*/
+       pinfo->link_dir = P2P_DIR_DL;
+
+       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_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, 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;
+       /* Network to MS*/
+       pinfo->link_dir = P2P_DIR_DL;
+
+       ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_PD_PRO_ADDR , " - Offered PDP address" );
+
+       ELEM_OPT_TLV( 0x28 , GSM_A_PDU_TYPE_GM, DE_ACC_POINT_NAME , NULL);
+
+       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.8 Request PDP context activation reject
+ * Direction:                  MS to network
+ */
+static void
+dtap_sm_req_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;
+       /* MS to  Network */
+       pinfo->link_dir = P2P_DIR_UL;
+
+       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_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, 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;
+       /* Network to MS */
+       pinfo->link_dir = P2P_DIR_DL;
+
+       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, NULL);
+       curr_offset--;
+       curr_len++;
+#endif
+
+       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 , " - 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);
+
+       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, 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;
+       /* MS to Network */
+       pinfo->link_dir = P2P_DIR_UL;
+
+       ELEM_OPT_TV( 0x32 , GSM_A_PDU_TYPE_GM, DE_LLC_SAPI , " - Requested LLC SAPI" );
+
+       ELEM_OPT_TLV( 0x30 , GSM_A_PDU_TYPE_GM, DE_QOS , " - Requested new QoS" );
+
+       ELEM_OPT_TLV( 0x31 , GSM_A_PDU_TYPE_GM, DE_TRAFFIC_FLOW_TEMPLATE , " - New TFT" );
+
+       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.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, 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;
+       /* 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_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, 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;
+       /* Network to MS */
+       pinfo->link_dir = P2P_DIR_DL;
+
+       ELEM_OPT_TLV( 0x30 , GSM_A_PDU_TYPE_GM, DE_QOS , " - Negotiated QoS" );
+
+       ELEM_OPT_TV( 0x32 , GSM_A_PDU_TYPE_GM, DE_LLC_SAPI , " - Negotiated LLC SAPI" );
+
+       ELEM_OPT_TV_SHORT ( 0x80 , GSM_A_PDU_TYPE_GM , DE_RAD_PRIO , " - New radio priority" );
+
+       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_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, 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;
+       /* Network or the MS */
+       pinfo->link_dir = LINK_DIR_UNKNOWN;
+
+
+       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_EXPERT(curr_len, 0, pinfo);
+}
+
+/*
+ * [8] 9.5.14 Deactivate PDP context request
+ * Direction:                  both
  */
 static void
-dtap_sm_act_sec_pdp_rej(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;
@@ -5142,20 +6235,27 @@ 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;
+       pinfo->link_dir = LINK_DIR_UNKNOWN;
+
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SM_CAUSE, NULL);
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SM_CAUSE );
+       ELEM_OPT_TV_SHORT( 0x90 , GSM_A_PDU_TYPE_GM , DE_TEAR_DOWN_IND , NULL);
 
        ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       /* 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_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
- * [8] 9.5.7 Request PDP context activation
+ * [8] 9.5.15 Deactivate PDP context accept
+ * Direction:                  both
  */
 static void
-dtap_sm_req_pdp_act(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;
@@ -5164,22 +6264,23 @@ 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;
-
-       ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_PD_PRO_ADDR , " - Offered PDP address" );
-
-       ELEM_OPT_TLV( 0x28 , GSM_A_PDU_TYPE_GM, DE_ACC_POINT_NAME , NULL);
+       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);
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       /* 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_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
- * [8] 9.5.8 Request PDP context activation reject
+ * [8] 9.5.15a Request Secondary PDP Context Activation
+ * Direction:                  network to MS
  */
 static void
-dtap_sm_req_pdp_act_rej(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_req_sec_pdp_act(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -5188,20 +6289,30 @@ 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;
+       pinfo->link_dir = P2P_DIR_DL;
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SM_CAUSE );
+       /* 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");
 
-       ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
+       /* Linked TI Linked TI 10.5.6.7 M LV 2-3 */
+       ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_LINKED_TI , NULL);
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       /* 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.9 Modify PDP context request (Network to MS direction)
+ * [8] 9.5.15b Request Secondary PDP Context Activation Reject
+ * Direction:                  MS to network
  */
 static void
-dtap_sm_mod_pdp_req_net(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+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;
@@ -5210,34 +6321,24 @@ 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;
-
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM,DE_RAD_PRIO);
-#if 0
-       /* This is done automatically */
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SPARE );
-       curr_offset--;
-       curr_len++;
-#endif
-
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_LLC_SAPI );
-
-       ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_QOS , " - New QoS" );
+       pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+       pinfo->link_dir = P2P_DIR_UL;
 
-       ELEM_OPT_TLV( 0x2B , GSM_A_PDU_TYPE_GM, DE_PD_PRO_ADDR , NULL);
+       /* SM cause SM cause 10.5.6.6 M V 1 */
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SM_CAUSE, NULL);
 
-       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);
+       /* 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(curr_len, 0);
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
- * [8] 9.5.10 Modify PDP context request (MS to network direction)
+ * [8] 9.5.16a Notification
+ * Direction:                  network to MS
  */
 static void
-dtap_sm_mod_pdp_req_ms(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_notif(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -5246,24 +6347,20 @@ 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;
-
-       ELEM_OPT_TV( 0x32 , GSM_A_PDU_TYPE_GM, DE_LLC_SAPI , " - Requested LLC SAPI" );
-
-       ELEM_OPT_TLV( 0x30 , GSM_A_PDU_TYPE_GM, DE_QOS , " - Requested new QoS" );
-
-       ELEM_OPT_TLV( 0x31 , GSM_A_PDU_TYPE_GM, DE_TRAFFIC_FLOW_TEMPLATE , " - New TFT" );
+       pinfo->p2p_dir = P2P_DIR_UNKNOWN;
+       pinfo->link_dir = P2P_DIR_DL;
 
-       ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
+       ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_SM_NOTIF_IND, 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)
+ * [8] 9.5.21 SM Status
+ * Direction:                  both
  */
 static void
-dtap_sm_mod_pdp_acc_ms(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;
@@ -5272,18 +6369,20 @@ 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;
+       pinfo->link_dir = LINK_DIR_UNKNOWN;
 
-       ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
+       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.12 Modify PDP context accept (Network to MS direction)
+ * [9] 9.5.22 Activate MBMS Context Request
+ * Direction:                  MS to network
  */
 static void
-dtap_sm_mod_pdp_acc_net(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_act_mbms_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -5292,26 +6391,35 @@ 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_RECV;
 
-       ELEM_OPT_TLV( 0x30 , GSM_A_PDU_TYPE_GM, DE_QOS , " - Negotiated QoS" );
+       /* 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");
 
-       ELEM_OPT_TV( 0x32 , GSM_A_PDU_TYPE_GM, DE_LLC_SAPI , " - Negotiated LLC SAPI" );
+       /* 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");
 
-       ELEM_OPT_TV_SHORT ( 0x80 , GSM_A_PDU_TYPE_GM , DE_RAD_PRIO , " - New radio priority" );
+       /* 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 );
 
-       ELEM_OPT_TLV( 0x34 , GSM_A_PDU_TYPE_GM, DE_PACKET_FLOW_ID , 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" );
 
-       ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
+       /* 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 );
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       /* 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.13 Modify PDP Context Reject
+ * [9] 9.5.23 Activate MBMS Context Accept
+ * Direction:                  network to MS
  */
 static void
-dtap_sm_mod_pdp_rej(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_act_mbms_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -5320,20 +6428,23 @@ 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_SENT;
 
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SM_CAUSE );
+       ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_TMGI, NULL);
 
-       ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_LLC_SAPI, " - Negotiated LLC SAPI");
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       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.14 Deactivate PDP context request
+ * [9] 9.5.24 Activate MBMS Context Reject
+ * Direction:                  network to MS
  */
 static void
-dtap_sm_deact_pdp_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_act_mbms_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -5342,25 +6453,21 @@ 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;
-
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SM_CAUSE );
-
-       ELEM_OPT_TV_SHORT( 0x90 , GSM_A_PDU_TYPE_GM , DE_TEAR_DOWN_IND , NULL);
+       pinfo->p2p_dir = P2P_DIR_SENT;
 
-       ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SM_CAUSE, 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);
+       ELEM_OPT_TLV( 0x35 , GSM_A_PDU_TYPE_GM, DE_MBMS_PROT_CONF_OPT , NULL);
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo);
 }
 
 /*
- * [8] 9.5.15 Deactivate PDP context accept
+ * [9] 9.5.25 Request MBMS Context Activation
+ * Direction:                  network to MS
  */
 static void
-dtap_sm_deact_pdp_acc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_req_mbms_act(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -5369,21 +6476,25 @@ 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_SENT;
 
-       ELEM_OPT_TLV( 0x27 , GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT , NULL);
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_NET_SAPI, " - Linked NSAPI");
 
-       /* MBMS context status 10.5.7.6 TLV 2 - 18 */
-       ELEM_OPT_TLV( 0x35 , GSM_A_PDU_TYPE_GM, DE_MBMS_CTX_STATUS , NULL);
+       ELEM_MAND_LV(GSM_A_PDU_TYPE_GM, DE_PD_PRO_ADDR , " - Offered multicast address" );
 
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
+       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.21 SM Status
+ * [8] 9.5.26 Request MBMS Context Activation Reject
+ * Direction:                  MS to network
  */
 static void
-dtap_sm_status(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
+dtap_sm_req_mbms_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
 {
        guint32 curr_offset;
        guint32 consumed;
@@ -5392,43 +6503,18 @@ 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;
-
-       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SM_CAUSE );
-
-       EXTRANEOUS_DATA_CHECK(curr_len, 0);
-}
-
-/*
- * [8] 9.5.22 Activate MBMS Context Request
- */
-
-       /* 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 */
-       /* Supported MBMS bearer capabilities MBMS bearer capabilities 10.5.6.14 M LV 2 - 3 */
-       /* Requested multicast address Packet data protocol address 10.5.6.4 M LV 3 - 19 */
-       /* Access point name Access point name 10.5.6.1 M LV 2 - 101 */
-       /* 35 MBMS protocol configuration options MBMS protocol configuration options 10.5.6.15 O TLV 3 - 253 */
-
-/*
- * [8] 9.5.23 Activate MBMS Context Accept
- */
+       pinfo->p2p_dir = P2P_DIR_RECV;
 
-/*
- * [8] 9.5.24 Activate MBMS Context Reject
- */
+       ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_SM_CAUSE, NULL);
 
-/*
- * [8] 9.5.25 Request MBMS Context Activation
- */
+       ELEM_OPT_TLV( 0x35 , GSM_A_PDU_TYPE_GM, DE_MBMS_PROT_CONF_OPT , NULL);
 
-/*
- * [8] 9.5.26 Request MBMS Context Activation Reject
- */
+       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 */
@@ -5457,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 */
@@ -5479,11 +6565,14 @@ 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 */
 };
 
@@ -5554,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,
@@ -5607,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 }
        },
@@ -5618,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 }
        },
@@ -5633,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 }
        },
@@ -5657,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,
@@ -5692,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,
@@ -5767,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,
@@ -5807,6 +6981,26 @@ proto_register_gsm_a_gm(void)
                FT_BOOLEAN, 8, TFS(&gsm_a_gm_gps_c_vals), 0x01,
                NULL, HFILL }
        },
+       { &hf_gsm_a_gm_req_ms_info_irat,
+               { "I-RAT","gsm_a.gm.req_ms_info_irat",
+               FT_BOOLEAN, 8, TFS(&gsm_a_gm_req_ms_info_irat_vals), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_req_ms_info_irat2,
+               { "I-RAT2","gsm_a.gm.req_ms_info_irat2",
+               FT_BOOLEAN, 8, TFS(&gsm_a_gm_req_ms_info_irat2_vals), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_ue_usage_setting,
+               { "UE's usage setting","gsm_a.gm.ue_usage_setting",
+               FT_BOOLEAN, 8, TFS(&gsm_a_gm_ue_usage_setting_vals), 0x0,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_gm_voice_domain_pref_for_eutran,
+               { "Voice domain preference for E-UTRAN","gsm_a.gm.voice_domain_pref_for_eutran",
+               FT_UINT8, BASE_DEC, VALS(gsm_a_gm_voice_domain_pref_for_eutran_vals), 0x0,
+               NULL, HFILL }
+       },
        { &hf_gsm_a_sm_pdp_type_org,
                { "PDP type organization", "gsm_a.sm.pdp_type_org",
                FT_UINT8, BASE_DEC, VALS(gsm_a_sm_pdp_type_org_vals), 0x0f,
@@ -6002,9 +7196,9 @@ proto_register_gsm_a_gm(void)
                FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_ps_irat_s1_vals), 0x40,
                NULL, HFILL }
        },
-       { &hf_gsm_a_gmm_net_cap_csfb,
-               { "CSFB Capability", "gsm_a.gmm.net_cap.csfb",
-               FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_csfb_vals), 0x20,
+       { &hf_gsm_a_gmm_net_cap_comb_proc,
+               { "EMM Combined procedures capability", "gsm_a.gmm.net_cap.comb_proc",
+               FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_comb_proc_vals), 0x20,
                NULL, HFILL }
        },
        { &hf_gsm_a_gmm_net_cap_isr,
@@ -6022,10 +7216,310 @@ proto_register_gsm_a_gm(void)
                FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_epc_vals), 0x04,
                NULL, HFILL }
        },
-       };
+       { &hf_gsm_a_gmm_net_cap_nf,
+               { "NF Capability", "gsm_a.gmm.net_cap.nf",
+               FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_nf_vals), 0x02,
+               NULL, HFILL }
+       },
+       { &hf_gsm_a_sm_tmgi,
+               { "Temporary Mobile Group Identity (TMGI)", "gsm_a.sm.tmgi",
+                 FT_UINT24, BASE_HEX, NULL, 0x0,
+               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    17
+#define        NUM_INDIVIDUAL_ELEMS    18
        gint *ett[NUM_INDIVIDUAL_ELEMS +
                  NUM_GSM_DTAP_MSG_GMM + NUM_GSM_DTAP_MSG_SM +
                  NUM_GSM_GM_ELEM];
@@ -6047,6 +7541,7 @@ proto_register_gsm_a_gm(void)
        ett[14] = &ett_sm_tft;
        ett[15] = &ett_gmm_gprs_timer;
        ett[16] = &ett_gmm_network_cap;
+       ett[17] = &ett_gsm_a_gm_msrac_multislot_capability;
 
        last_offset = NUM_INDIVIDUAL_ELEMS;
 
@@ -6085,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");
 }