Put the value(s) of a parameter into the top-level item for that
[obnox/wireshark/wip.git] / packet-gsm_a.c
index e650ef8dbdcd6c67ed40817f0a101d1598f8ac52..a2b47b77b6097578edbf56bbb3dd368a8d20e391 100644 (file)
@@ -38,7 +38,7 @@
  *   Formats and coding
  *   (3GPP TS 24.080 version 4.3.0 Release 4)
  *
- * $Id: packet-gsm_a.c,v 1.3 2003/10/30 19:39:33 guy Exp $
+ * $Id: packet-gsm_a.c,v 1.12 2004/03/19 07:54:57 guy Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@ethereal.com>
 
 #include <stdio.h>
 #include <stdlib.h>
-#include <gmodule.h>
-
-#ifdef HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-
-#ifdef HAVE_NETINET_IN_H
-# include <netinet/in.h>
-#endif
 
 #include <string.h>
 
 #include "epan/packet.h"
 #include "prefs.h"
+#include "tap.h"
+#include "asn1.h"
 
+#include "packet-tcap.h"
 #include "packet-bssap.h"
+#include "packet-gsm_ss.h"
+#include "packet-gsm_a.h"
 
 /* PROTOTYPES/FORWARDS */
 
-static const value_string gsm_bssmap_msg_strings[] = {
+const value_string gsm_a_bssmap_msg_strings[] = {
     { 0x01,    "Assignment Request" },
     { 0x02,    "Assignment Complete" },
     { 0x03,    "Assignment Failure" },
@@ -162,7 +158,7 @@ static const value_string gsm_bssmap_msg_strings[] = {
     { 0, NULL },
 };
 
-static const value_string gsm_dtap_msg_mm_strings[] = {
+const value_string gsm_a_dtap_msg_mm_strings[] = {
     { 0x01,    "IMSI Detach Indication" },
     { 0x02,    "Location Updating Accept" },
     { 0x04,    "Location Updating Reject" },
@@ -189,7 +185,7 @@ static const value_string gsm_dtap_msg_mm_strings[] = {
     { 0, NULL },
 };
 
-static const value_string gsm_dtap_msg_rr_strings[] = {
+const value_string gsm_a_dtap_msg_rr_strings[] = {
     { 0x3c,    "RR Initialisation Request" },
     { 0x3b,    "Additional Assignment" },
     { 0x3f,    "Immediate Assignment" },
@@ -287,7 +283,7 @@ static const value_string gsm_dtap_msg_rr_strings[] = {
     { 0, NULL },
 };
 
-static const value_string gsm_dtap_msg_cc_strings[] = {
+const value_string gsm_a_dtap_msg_cc_strings[] = {
     { 0x01,    "Alerting" },
     { 0x08,    "Call Confirmed" },
     { 0x02,    "Call Proceeding" },
@@ -326,7 +322,7 @@ static const value_string gsm_dtap_msg_cc_strings[] = {
     { 0, NULL },
 };
 
-static const value_string gsm_dtap_msg_gmm_strings[] = {
+const value_string gsm_a_dtap_msg_gmm_strings[] = {
     { 0x01,    "Attach Request" },
     { 0x02,    "Attach Accept" },
     { 0x03,    "Attach Complete" },
@@ -353,14 +349,14 @@ static const value_string gsm_dtap_msg_gmm_strings[] = {
     { 0, NULL },
 };
 
-static const value_string gsm_dtap_msg_sms_strings[] = {
+const value_string gsm_a_dtap_msg_sms_strings[] = {
     { 0x01,    "CP-DATA" },
     { 0x04,    "CP-ACK" },
     { 0x10,    "CP-ERROR" },
     { 0, NULL },
 };
 
-static const value_string gsm_dtap_msg_sm_strings[] = {
+const value_string gsm_a_dtap_msg_sm_strings[] = {
     { 0x41,    "Activate PDP Context Request" },
     { 0x42,    "Activate PDP Context Accept" },
     { 0x43,    "Activate PDP Context Reject" },
@@ -385,7 +381,7 @@ static const value_string gsm_dtap_msg_sm_strings[] = {
     { 0, NULL },
 };
 
-static const value_string gsm_dtap_msg_ss_strings[] = {
+const value_string gsm_a_dtap_msg_ss_strings[] = {
     { 0x2a,    "Release Complete" },
     { 0x3a,    "Facility" },
     { 0x3b,    "Register" },
@@ -605,7 +601,7 @@ static const value_string gsm_dtap_elem_strings[] = {
     { 0, NULL },
 };
 
-static const gchar *pd_str[] = {
+const gchar *gsm_a_pd_str[] = {
     "Group Call Control",
     "Broadcast Call Control",
     "Reserved: was allocated in earlier phases of the protocol",
@@ -665,6 +661,8 @@ static int proto_a_bssmap = -1;
 static int proto_a_dtap = -1;
 static int proto_a_rp = -1;
 
+static int gsm_a_tap = -1;
+
 static int hf_gsm_a_none = -1;
 static int hf_gsm_a_bssmap_msg_type = -1;
 static int hf_gsm_a_dtap_msg_mm_type = -1;
@@ -689,6 +687,8 @@ static int hf_gsm_a_cell_lac = -1;
 static int hf_gsm_a_dlci_cc = -1;
 static int hf_gsm_a_dlci_spare = -1;
 static int hf_gsm_a_dlci_sapi = -1;
+static int hf_gsm_a_bssmap_cause = -1;
+static int hf_gsm_a_dtap_cause = -1;
 
 /* Initialize the subtree pointers */
 static gint ett_bssmap_msg = -1;
@@ -701,6 +701,28 @@ static gint ett_cm_srvc_type = -1;
 static gint ett_gsm_enc_info = -1;
 static gint ett_cell_list = -1;
 static gint ett_dlci = -1;
+static gint ett_bc_oct_3a = -1;
+static gint ett_bc_oct_4 = -1;
+static gint ett_bc_oct_5 = -1;
+static gint ett_bc_oct_5a = -1;
+static gint ett_bc_oct_5b = -1;
+static gint ett_bc_oct_6 = -1;
+static gint ett_bc_oct_6a = -1;
+static gint ett_bc_oct_6b = -1;
+static gint ett_bc_oct_6c = -1;
+static gint ett_bc_oct_6d = -1;
+static gint ett_bc_oct_6e = -1;
+static gint ett_bc_oct_6f = -1;
+static gint ett_bc_oct_6g = -1;
+static gint ett_bc_oct_7 = -1;
+
+static gint ett_tc_component = -1;
+static gint ett_tc_invoke_id = -1;
+static gint ett_tc_linked_id = -1;
+static gint ett_tc_opr_code = -1;
+static gint ett_tc_err_code = -1;
+static gint ett_tc_prob_code = -1;
+static gint ett_tc_sequence = -1;
 
 static char a_bigbuf[1024];
 static gchar a_add_string[1024];
@@ -714,11 +736,6 @@ static dissector_table_t sms_dissector_table;      /* SMS TPDU */
 static packet_info *g_pinfo;
 static proto_tree *g_tree;
 
-/*
- * current RP message type
- */
-static gint gsm_a_rp_type;
-
 /*
  * this should be set on a per message basis, if possible
  */
@@ -802,53 +819,6 @@ my_dgt_tbcd_unpack(
     return(cnt);
 }
 
-/* Generate, into "buf", a string showing the bits of a bitfield.
- * Return a pointer to the character after that string.
- */
-static char *
-my_decode_bitfield_value(char *buf, guint32 val, guint32 mask, int width)
-{
-    int                i;
-    guint32    bit;
-    char       *p;
-
-    i = 0;
-    p = buf;
-    bit = 1 << (width - 1);
-
-    for (;;)
-    {
-       if (mask & bit)
-       {
-           /* This bit is part of the field.  Show its value. */
-           if (val & bit)
-           {
-               *p++ = '1';
-           }
-           else
-           {
-               *p++ = '0';
-           }
-       }
-       else
-       {
-           /* This bit is not part of the field. */
-           *p++ = '.';
-       }
-
-       bit >>= 1;
-       i++;
-
-       if (i >= width) break;
-
-       if (i % 4 == 0) *p++ = ' ';
-    }
-
-    *p = '\0';
-
-    return(p);
-}
-
 static gchar *
 my_match_strval(guint32 val, const value_string *vs, gint *idx)
 {
@@ -1060,7 +1030,7 @@ typedef enum
     BE_RET_ERR_REQ,     /* Return Error Request */
     BE_RET_ERR_CAUSE,   /* Return Error Cause */
     BE_SEG,     /* Segmentation */
-    BE_NONE,   /* NONE */
+    BE_NONE    /* NONE */
 }
 bssmap_elem_idx_t;
 
@@ -1081,23 +1051,23 @@ be_cic(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_st
 
     value = tvb_get_ntohs(tvb, curr_offset);
 
-    my_decode_bitfield_value(a_bigbuf, value, 0xffe0, 16);
+    other_decode_bitfield_value(a_bigbuf, value, 0xffe0, 16);
     proto_tree_add_text(tree,
        tvb, curr_offset, 2,
-       "%s :  PCM Multiplexer: %d",
+       "%s :  PCM Multiplexer: %u",
        a_bigbuf,
        (value & 0xffe0) >> 5);
 
-    my_decode_bitfield_value(a_bigbuf, value, 0x001f, 16);
+    other_decode_bitfield_value(a_bigbuf, value, 0x001f, 16);
     proto_tree_add_text(tree,
        tvb, curr_offset, 2,
-       "%s :  Timeslot: %d",
+       "%s :  Timeslot: %u",
        a_bigbuf,
        value & 0x001f);
 
     curr_offset += 2;
 
-    sprintf(add_string, " - (%1$d) (0x%1$04x)", value);
+    sprintf(add_string, " - (%u) (0x%04x)", value, value);
 
     /* no length check possible */
 
@@ -1119,7 +1089,7 @@ be_cause(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_
 
     oct = tvb_get_guint8(tvb, curr_offset);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Extension: %s",
@@ -1147,14 +1117,14 @@ be_cause(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_
                break;
            }
 
-           my_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
+           other_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
            proto_tree_add_text(tree,
                tvb, curr_offset, 1,
                "%s :  Cause Class: %s",
                a_bigbuf,
                str);
 
-           my_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+           other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
            proto_tree_add_text(tree,
                tvb, curr_offset, 1,
                "%s :  National Cause",
@@ -1173,16 +1143,16 @@ be_cause(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_
        {
            value = tvb_get_guint8(tvb, curr_offset + 1);
 
-           my_decode_bitfield_value(a_bigbuf, oct, 0x7f, 8);
+           other_decode_bitfield_value(a_bigbuf, oct, 0x7f, 8);
            proto_tree_add_text(tree,
                tvb, curr_offset, 1,
-               "%s :  Cause (MSB): %d",
+               "%s :  Cause (MSB): %u",
                a_bigbuf,
                ((oct & 0x7f) << 8) | value);
 
            curr_offset++;
 
-           my_decode_bitfield_value(a_bigbuf, value, 0xff, 8);
+           other_decode_bitfield_value(a_bigbuf, value, 0xff, 8);
            proto_tree_add_text(tree, tvb, curr_offset, 1,
                "%s :  Cause (LSB)",
                a_bigbuf);
@@ -1256,17 +1226,17 @@ be_cause(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_
            break;
        }
 
-       my_decode_bitfield_value(a_bigbuf, oct, 0x7f, 8);
-       proto_tree_add_text(tree,
-           tvb, curr_offset, 1,
-           "%s :  Cause: (%d) %s",
+       other_decode_bitfield_value(a_bigbuf, oct, 0x7f, 8);
+       proto_tree_add_uint_format(tree, hf_gsm_a_bssmap_cause,
+           tvb, curr_offset, 1, oct & 0x7f,
+           "%s :  Cause: (%u) %s",
            a_bigbuf,
            oct & 0x7f,
            str);
 
        curr_offset++;
 
-       sprintf(add_string, " - (%d) %s", oct & 0x7f, str);
+       sprintf(add_string, " - (%u) %s", oct & 0x7f, str);
     }
 
     EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
@@ -1314,18 +1284,18 @@ be_l3_header_info(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gc
 
     oct = tvb_get_guint8(tvb, curr_offset);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Spare",
        a_bigbuf);
 
-    my_decode_bitfield_value(a_bigbuf, oct, DTAP_PD_MASK, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, DTAP_PD_MASK, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Protocol Discriminator: %s",
        a_bigbuf,
-       pd_str[oct & DTAP_PD_MASK]);
+       gsm_a_pd_str[oct & DTAP_PD_MASK]);
 
     curr_offset++;
 
@@ -1333,23 +1303,23 @@ be_l3_header_info(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gc
 
     oct = tvb_get_guint8(tvb, curr_offset);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Spare",
        a_bigbuf);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  TI flag: %s",
        a_bigbuf,
        ((oct & 0x08) ?  "allocated by receiver" : "allocated by sender"));
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
-       "%s :  TIO: %d",
+       "%s :  TIO: %u",
        a_bigbuf,
        oct & 0x07);
 
@@ -1381,10 +1351,10 @@ be_enc_info(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *a
 
     do
     {
-       my_decode_bitfield_value(a_bigbuf, oct, mask, 8);
+       other_decode_bitfield_value(a_bigbuf, oct, mask, 8);
        proto_tree_add_text(tree,
            tvb, curr_offset, 1,
-           "%s :  GSM A5/%d: %spermitted",
+           "%s :  GSM A5/%u: %spermitted",
            a_bigbuf,
            alg_id,
            (mask & oct) ? "" : "not ");
@@ -1394,7 +1364,7 @@ be_enc_info(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *a
     }
     while (mask != 0x01);
 
-    my_decode_bitfield_value(a_bigbuf, oct, mask, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, mask, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  No encryption: %spermitted",
@@ -1432,7 +1402,7 @@ be_chan_type(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *
 
     oct = tvb_get_guint8(tvb, curr_offset);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Spare",
@@ -1449,7 +1419,7 @@ be_chan_type(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *
        break;
     }
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Speech/Data Indicator: %s",
@@ -1496,7 +1466,7 @@ be_chan_type(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *
        {
            oct = tvb_get_guint8(tvb, curr_offset);
 
-           my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+           other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
            proto_tree_add_text(tree,
                tvb, curr_offset, 1,
                "%s :  Extension: %s",
@@ -1518,7 +1488,7 @@ be_chan_type(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *
                break;
            }
 
-           my_decode_bitfield_value(a_bigbuf, oct, 0x7f, 8);
+           other_decode_bitfield_value(a_bigbuf, oct, 0x7f, 8);
            proto_tree_add_text(tree,
                tvb, curr_offset, 1,
                "%s :  Speech version identifier: %s",
@@ -1567,7 +1537,7 @@ be_chan_type(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *
        {
            proto_tree_add_text(tree,
                tvb, curr_offset, 1,
-               "Channel Rate and Type: Max channels %d, %s",
+               "Channel Rate and Type: Max channels %u, %s",
                num_chan,
                str);
        }
@@ -1585,14 +1555,14 @@ be_chan_type(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *
 
        oct = tvb_get_guint8(tvb, curr_offset);
 
-       my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+       other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
        proto_tree_add_text(tree,
            tvb, curr_offset, 1,
            "%s :  Extension: %s",
            a_bigbuf,
            (oct & 0x80) ? "extended" : "not extended");
 
-       my_decode_bitfield_value(a_bigbuf, oct, 0x40, 8);
+       other_decode_bitfield_value(a_bigbuf, oct, 0x40, 8);
        proto_tree_add_text(tree,
            tvb, curr_offset, 1,
            "%s :  %sTransparent service",
@@ -1672,7 +1642,7 @@ be_chan_type(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *
            }
        }
 
-       my_decode_bitfield_value(a_bigbuf, oct, 0x3f, 8);
+       other_decode_bitfield_value(a_bigbuf, oct, 0x3f, 8);
        proto_tree_add_text(tree,
            tvb, curr_offset, 1,
            "%s :  Rate: %s",
@@ -1685,14 +1655,14 @@ be_chan_type(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *
 
        oct = tvb_get_guint8(tvb, curr_offset);
 
-       my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+       other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
        proto_tree_add_text(tree,
            tvb, curr_offset, 1,
            "%s :  Extension: %s",
            a_bigbuf,
            (oct & 0x80) ? "extended" : "not extended");
 
-       my_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
+       other_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
        proto_tree_add_text(tree,
            tvb, curr_offset, 1,
            "%s :  Spare",
@@ -1700,27 +1670,27 @@ be_chan_type(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *
 
        if (num_chan == 0)
        {
-           my_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+           other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
            proto_tree_add_text(tree,
                tvb, curr_offset, 1,
                "%s :  14.5 kbit/s (TCH/F14.4) %sallowed",
                a_bigbuf,
                (oct & 0x08) ? "" : "not ");
 
-           my_decode_bitfield_value(a_bigbuf, oct, 0x04, 8);
+           other_decode_bitfield_value(a_bigbuf, oct, 0x04, 8);
            proto_tree_add_text(tree,
                tvb, curr_offset, 1,
                "%s :  Spare",
                a_bigbuf);
 
-           my_decode_bitfield_value(a_bigbuf, oct, 0x02, 8);
+           other_decode_bitfield_value(a_bigbuf, oct, 0x02, 8);
            proto_tree_add_text(tree,
                tvb, curr_offset, 1,
                "%s :  12.0 kbit/s (TCH F/9.6) %sallowed",
                a_bigbuf,
                (oct & 0x02) ? "" : "not ");
 
-           my_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
+           other_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
            proto_tree_add_text(tree,
                tvb, curr_offset, 1,
                "%s :  6.0 kbit/s (TCH F/4.8) %sallowed",
@@ -1729,27 +1699,27 @@ be_chan_type(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *
        }
        else
        {
-           my_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+           other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
            proto_tree_add_text(tree,
                tvb, curr_offset, 1,
                "%s :  14.5/14.4 kbit/s (TCH/F14.4) %sallowed",
                a_bigbuf,
                (oct & 0x08) ? "" : "not ");
 
-           my_decode_bitfield_value(a_bigbuf, oct, 0x04, 8);
+           other_decode_bitfield_value(a_bigbuf, oct, 0x04, 8);
            proto_tree_add_text(tree,
                tvb, curr_offset, 1,
                "%s :  Spare",
                a_bigbuf);
 
-           my_decode_bitfield_value(a_bigbuf, oct, 0x02, 8);
+           other_decode_bitfield_value(a_bigbuf, oct, 0x02, 8);
            proto_tree_add_text(tree,
                tvb, curr_offset, 1,
                "%s :  12.0/9.6 kbit/s (TCH F/9.6) %sallowed",
                a_bigbuf,
                (oct & 0x02) ? "" : "not ");
 
-           my_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
+           other_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
            proto_tree_add_text(tree,
                tvb, curr_offset, 1,
                "%s :  6.0/4.8 kbit/s (TCH F/4.8) %sallowed",
@@ -1880,11 +1850,11 @@ be_cell_id_aux(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar
 
        if (add_string[0] == '\0')
        {
-           sprintf(add_string, " - CI (%d)", value);
+           sprintf(add_string, " - CI (%u)", value);
        }
        else
        {
-           sprintf(add_string, "%s/CI (%d)", add_string, value);
+           sprintf(add_string, "%s/CI (%u)", add_string, value);
        }
        break;
 
@@ -1913,7 +1883,7 @@ be_cell_id(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *ad
 
     oct = tvb_get_guint8(tvb, curr_offset);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Spare",
@@ -1930,10 +1900,10 @@ be_cell_id(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *ad
        str = cell_disc_str[disc];
     }
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
-       "%s :  Cell Identification Discriminator: (%d) %s",
+       "%s :  Cell Identification Discriminator: (%u) %s",
        a_bigbuf,
        disc,
        str);
@@ -1965,13 +1935,13 @@ be_prio(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_s
 
     oct = tvb_get_guint8(tvb, curr_offset);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Spare",
        a_bigbuf);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x40, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x40, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Preemption Capability Indicator (PCI): this allocation request %s preempt an existing connection",
@@ -1987,24 +1957,24 @@ be_prio(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_s
        break;
     }
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x3c, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x3c, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
-       "%s :  Priority Level: (%d) %s",
+       "%s :  Priority Level: (%u) %s",
        a_bigbuf,
        (oct & 0x3c) >> 2,
        str);
 
-    sprintf(add_string, " - (%d)", (oct & 0x3c) >> 2);
+    sprintf(add_string, " - (%u)", (oct & 0x3c) >> 2);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x02, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x02, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Queuing Allowed Indicator (QA): queuing %sallowed",
        a_bigbuf,
        (oct & 0x02) ? "" : "not ");
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Preemption Vulnerability Indicator (PVI): this connection %s be preempted by another allocation request",
@@ -2096,13 +2066,13 @@ be_down_dtx_flag(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gch
 
     oct = tvb_get_guint8(tvb, curr_offset);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0xfe, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0xfe, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Spare",
        a_bigbuf);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  BSS is %s to activate DTX in the downlink direction",
@@ -2135,7 +2105,7 @@ be_cell_id_list(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gcha
 
     oct = tvb_get_guint8(tvb, curr_offset);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Spare",
@@ -2152,10 +2122,10 @@ be_cell_id_list(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gcha
        str = cell_disc_str[disc];
     }
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
-       "%s :  Cell Identification Discriminator: (%d) %s",
+       "%s :  Cell Identification Discriminator: (%u) %s",
        a_bigbuf,
        disc,
        str);
@@ -2170,7 +2140,7 @@ be_cell_id_list(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gcha
        item =
            proto_tree_add_text(tree,
                tvb, curr_offset, -1,
-               "Cell %d",
+               "Cell %u",
                num_cells + 1);
 
        subtree = proto_item_add_subtree(item, ett_cell_list);
@@ -2192,7 +2162,7 @@ be_cell_id_list(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gcha
     }
     while ((len - (curr_offset - offset)) > 0);
 
-    sprintf(add_string, " - %d cell%s",
+    sprintf(add_string, " - %u cell%s",
        num_cells, plurality(num_cells, "", "s"));
 
     EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
@@ -2230,7 +2200,7 @@ be_chosen_chan(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar
        break;
     }
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Channel mode: %s",
@@ -2255,7 +2225,7 @@ be_chosen_chan(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar
        break;
     }
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Channel: %s",
@@ -2284,13 +2254,13 @@ be_ciph_resp_mode(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gc
 
     oct = tvb_get_guint8(tvb, curr_offset);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0xfe, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0xfe, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Spare",
        a_bigbuf);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  IMEISV must %sbe included by the mobile station",
@@ -2349,7 +2319,7 @@ be_for_ind(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *ad
 
     oct = tvb_get_guint8(tvb, curr_offset);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Spare",
@@ -2364,7 +2334,7 @@ be_for_ind(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *ad
        break;
     }
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  %s",
@@ -2452,13 +2422,13 @@ be_cct_pool(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *a
 
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
-       "Circuit pool number: %d%s",
+       "Circuit pool number: %u%s",
        oct,
        str);
 
     curr_offset++;
 
-    sprintf(add_string, " - (%d)", oct);
+    sprintf(add_string, " - (%u)", oct);
 
     /* no length check possible */
 
@@ -2494,7 +2464,7 @@ be_curr_chan_1(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar
        break;
     }
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Channel Mode: %s",
@@ -2518,10 +2488,10 @@ be_curr_chan_1(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar
        break;
     }
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
-       "%s :  Channel: (%d) %s",
+       "%s :  Channel: (%u) %s",
        a_bigbuf,
        oct & 0x0f,
        str);
@@ -2548,20 +2518,20 @@ be_que_ind(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *ad
 
     oct = tvb_get_guint8(tvb, curr_offset);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0xfc, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0xfc, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Spare",
        a_bigbuf);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x02, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x02, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  qri: it is recommended %sto allow queuing",
        a_bigbuf,
        (oct & 0x02) ? "" : "not ");
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Spare",
@@ -2590,7 +2560,7 @@ be_speech_ver(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar
 
     oct = tvb_get_guint8(tvb, curr_offset);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Spare",
@@ -2612,7 +2582,7 @@ be_speech_ver(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar
        break;
     }
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x7f, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x7f, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Speech version identifier: %s",
@@ -2774,7 +2744,7 @@ typedef enum
     DE_RAD_PRIO,       /* Radio Priority */
     DE_GPRS_TIMER,     /* GPRS Timer */
     DE_GPRS_TIMER_2,   /* GPRS Timer 2 */
-    DE_NONE,   /* NONE */
+    DE_NONE    /* NONE */
 }
 dtap_elem_idx_t;
 
@@ -2842,7 +2812,7 @@ de_lai(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_st
 
     proto_tree_add_text(subtree,
        tvb, curr_offset, 2,
-       "Location Area Code (LAC): 0x%04x (%d)",
+       "Location Area Code (LAC): 0x%04x (%u)",
        value,
        value);
 
@@ -2875,20 +2845,20 @@ de_mid(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_st
     switch (oct & 0x07)
     {
     case 0:    /* No Identity */
-       my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+       other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
        proto_tree_add_text(tree,
            tvb, curr_offset, 1,
            "%s :  Unused",
            a_bigbuf);
 
-       my_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+       other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
        proto_tree_add_text(tree,
            tvb, curr_offset, 1,
            "%s :  Odd/Even Indicator: %s",
            a_bigbuf,
            (oct & 0x08) ? "ODD" : "EVEN");
 
-       my_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+       other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
        proto_tree_add_text(tree,
            tvb, curr_offset, 1,
            "%s :  Type of Identity: No Identity Code",
@@ -2913,7 +2883,7 @@ de_mid(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_st
 
     case 1:    /* IMSI */
 
-       my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+       other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
        proto_tree_add_text(tree,
            tvb, curr_offset, 1,
            "%s :  Identity Digit 1: %c",
@@ -2922,14 +2892,14 @@ de_mid(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_st
 
        odd = oct & 0x08;
 
-       my_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+       other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
        proto_tree_add_text(tree,
            tvb, curr_offset, 1,
            "%s :  Odd/Even Indicator: %s",
            a_bigbuf,
            odd ? "ODD" : "EVEN");
 
-       my_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+       other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
        proto_tree_add_text(tree,
            tvb, curr_offset, 1,
            "%s :  Type of Identity: %s",
@@ -2962,7 +2932,7 @@ de_mid(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_st
        {
            oct = tvb_get_guint8(tvb, curr_offset - 1);
 
-           my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+           other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
            proto_tree_add_text(tree,
                tvb, curr_offset - 1, 1,
                "%s :  Filler",
@@ -2971,21 +2941,21 @@ de_mid(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_st
        break;
 
     case 2:    /* IMEI */
-       my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+       other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
        proto_tree_add_text(tree,
            tvb, curr_offset, 1,
            "%s :  Identity Digit 1: %c",
            a_bigbuf,
            Dgt_msid.out[(oct & 0xf0) >> 4]);
 
-       my_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+       other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
        proto_tree_add_text(tree,
            tvb, curr_offset, 1,
            "%s :  Odd/Even Indicator: %s",
            a_bigbuf,
            (oct & 0x08) ? "ODD" : "EVEN");
 
-       my_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+       other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
        proto_tree_add_text(tree,
            tvb, curr_offset, 1,
            "%s :  Type of Identity: IMEI",
@@ -3013,20 +2983,20 @@ de_mid(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_st
        break;
 
     case 4:    /* TMSI/P-TMSI */
-       my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+       other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
        proto_tree_add_text(tree,
            tvb, curr_offset, 1,
            "%s :  Unused",
            a_bigbuf);
 
-       my_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+       other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
        proto_tree_add_text(tree,
            tvb, curr_offset, 1,
            "%s :  Odd/Even Indicator: %s",
            a_bigbuf,
            (oct & 0x08) ? "ODD" : "EVEN");
 
-       my_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+       other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
        proto_tree_add_text(tree,
            tvb, curr_offset, 1,
            "%s :  Type of Identity: TMSI/P-TMSI",
@@ -3085,7 +3055,7 @@ de_ms_cm_1(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *ad
 
     subtree = proto_item_add_subtree(item, ett_gsm_dtap_elem[DE_MS_CM_1]);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
     proto_tree_add_text(subtree,
        tvb, curr_offset, 1,
        "%s :  Spare",
@@ -3101,21 +3071,21 @@ de_ms_cm_1(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *ad
        break;
     }
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x60, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x60, 8);
     proto_tree_add_text(subtree,
        tvb, curr_offset, 1,
        "%s :  Revision Level: %s",
        a_bigbuf,
        str);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x10, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x10, 8);
     proto_tree_add_text(subtree,
        tvb, curr_offset, 1,
        "%s :  ES IND: Controlled Early Classmark Sending is %simplemented",
        a_bigbuf,
        (oct & 0x10) ? "" : "not ");
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
     proto_tree_add_text(subtree,
        tvb, curr_offset, 1,
        "%s :  A5/1: encryption algorithm A5/1 %savailable",
@@ -3134,7 +3104,7 @@ de_ms_cm_1(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *ad
        break;
     }
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
     proto_tree_add_text(subtree,
        tvb, curr_offset, 1,
        "%s :  RF power capability: %s",
@@ -3163,7 +3133,7 @@ de_ms_cm_2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *ad
 
     oct = tvb_get_guint8(tvb, curr_offset);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Spare",
@@ -3179,21 +3149,21 @@ de_ms_cm_2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *ad
        break;
     }
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x60, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x60, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Revision Level: %s",
        a_bigbuf,
        str);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x10, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x10, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  ES IND: Controlled Early Classmark Sending is %simplemented",
        a_bigbuf,
        (oct & 0x10) ? "" : "not ");
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  A5/1: encryption algorithm A5/1 %savailable",
@@ -3212,7 +3182,7 @@ de_ms_cm_2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *ad
        break;
     }
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  RF power capability: %s",
@@ -3225,13 +3195,13 @@ de_ms_cm_2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *ad
 
     oct = tvb_get_guint8(tvb, curr_offset);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Spare",
        a_bigbuf);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x40, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x40, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  PS capability (pseudo-synchronization capability): %spresent",
@@ -3247,21 +3217,21 @@ de_ms_cm_2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *ad
        break;
     }
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x30, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x30, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  SS Screening Indicator: %s",
        a_bigbuf,
        str);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  SM capability (MT SMS pt to pt capability): MS %s MT SMS",
        a_bigbuf,
        (oct & 0x08) ? "supports" : "does not support");
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x04, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x04, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  VBS notification reception: %s",
@@ -3269,7 +3239,7 @@ de_ms_cm_2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *ad
        (oct & 0x04) ?  "VBS capability and notifications wanted" :
            "no VBS capability or no notifications wanted");
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x02, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x02, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  VGCS notification reception: %s",
@@ -3277,7 +3247,7 @@ de_ms_cm_2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *ad
        (oct & 0x02) ?  "VGCS capability and notifications wanted" :
            "no VGCS capability or no notifications wanted");
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  FC Frequency Capability",
@@ -3289,7 +3259,7 @@ de_ms_cm_2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *ad
 
     oct = tvb_get_guint8(tvb, curr_offset);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  CM3: %s",
@@ -3298,20 +3268,20 @@ de_ms_cm_2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *ad
            "The MS supports options that are indicated in classmark 3 IE" :
            "The MS does not support any options that are indicated in CM3");
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x40, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x40, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Spare",
        a_bigbuf);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x20, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x20, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  LCS VA capability: LCS value added location request notification capability %ssupported",
        a_bigbuf,
        (oct & 0x20) ? "" : "not ");
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x10, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x10, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  UCS2 treatment: %s",
@@ -3320,14 +3290,14 @@ de_ms_cm_2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *ad
            "the ME has no preference between the use of the default alphabet and the use of UCS2" :
            "the ME has a preference for the default alphabet (defined in 3GPP TS 03.38) over UCS2");
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  SoLSA: the ME %s SoLSA",
        a_bigbuf,
        (oct & 0x08) ? "supports" : "does not support");
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x04, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x04, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  CMSP (CM Service Prompt): %s",
@@ -3336,14 +3306,14 @@ de_ms_cm_2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *ad
            "'Network initiated MO CM connection request' supported for at least one CM protocol" :
            "'Network initiated MO CM connection request' not supported");
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x02, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x02, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  A5/3: encryption algorithm A5/3 %savailable",
        a_bigbuf,
        (oct & 0x02) ? "" : "not ");
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  A5/2: encryption algorithm A5/2 %savailable",
@@ -3374,21 +3344,21 @@ de_d_gb_call_ref(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gch
 
     value = tvb_get_ntohl(tvb, curr_offset);
 
-    my_decode_bitfield_value(a_bigbuf, value, 0xffffffe0, 32);
+    other_decode_bitfield_value(a_bigbuf, value, 0xffffffe0, 32);
     proto_tree_add_text(tree, tvb, curr_offset, 4,
-       "%s :  Group or Broadcast call reference: %d (0x%04x)",
+       "%s :  Group or Broadcast call reference: %u (0x%04x)",
        a_bigbuf,
        (value & 0xffffffe0) >> 5,
        (value & 0xffffffe0) >> 5);
 
-    my_decode_bitfield_value(a_bigbuf, value, 0x00000010, 32);
+    other_decode_bitfield_value(a_bigbuf, value, 0x00000010, 32);
     proto_tree_add_text(tree, tvb, curr_offset, 4,
        "%s :  SF Service Flag: %s",
        a_bigbuf,
        (value & 0x00000010) ?
            "VGCS (Group call reference)" : "VBS (Broadcast call reference)");
 
-    my_decode_bitfield_value(a_bigbuf, value, 0x00000008, 32);
+    other_decode_bitfield_value(a_bigbuf, value, 0x00000008, 32);
     proto_tree_add_text(tree, tvb, curr_offset, 4,
        "%s :  AF Acknowledgement Flag: acknowledgment is %srequired",
        a_bigbuf,
@@ -3408,7 +3378,7 @@ de_d_gb_call_ref(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gch
        break;
     }
 
-    my_decode_bitfield_value(a_bigbuf, value, 0x00000007, 32);
+    other_decode_bitfield_value(a_bigbuf, value, 0x00000007, 32);
     proto_tree_add_text(tree, tvb, curr_offset, 4,
        "%s :  Call Priority: %s",
        a_bigbuf,
@@ -3418,12 +3388,12 @@ de_d_gb_call_ref(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gch
 
     oct = tvb_get_guint8(tvb, curr_offset);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
     proto_tree_add_text(tree, tvb, curr_offset, 1,
        "%s :  Ciphering Information",
        a_bigbuf);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
     proto_tree_add_text(tree, tvb, curr_offset, 1,
        "%s :  Spare",
        a_bigbuf);
@@ -3460,7 +3430,7 @@ de_pd_sapi(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *ad
 
     subtree = proto_item_add_subtree(item, ett_gsm_dtap_elem[DE_PD_SAPI]);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0xc0, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0xc0, 8);
     proto_tree_add_text(subtree, tvb, curr_offset, 1,
        "%s :  Spare",
        a_bigbuf);
@@ -3474,17 +3444,17 @@ de_pd_sapi(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *ad
        break;
     }
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x30, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x30, 8);
     proto_tree_add_text(subtree, tvb, curr_offset, 1,
        "%s :  SAPI (Sevice Access Point Identifier): %s",
        a_bigbuf,
        str);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
     proto_tree_add_text(subtree, tvb, curr_offset, 1,
        "%s :  PD (Protocol Discriminator): %s",
        a_bigbuf,
-       pd_str[oct & 0x0f]);
+       gsm_a_pd_str[oct & 0x0f]);
 
     curr_offset++;
 
@@ -3509,7 +3479,7 @@ de_prio(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_s
 
     oct = tvb_get_guint8(tvb, curr_offset);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Spare",
@@ -3529,7 +3499,7 @@ de_prio(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_s
        break;
     }
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  %s",
@@ -3569,7 +3539,7 @@ de_plmn_list(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *
 
        proto_tree_add_text(tree,
            tvb, curr_offset, 3,
-           "PLMN[%d]  Mobile Country Code (MCC): %s, Mobile Network Code (MNC): %s",
+           "PLMN[%u]  Mobile Country Code (MCC): %s, Mobile Network Code (MNC): %s",
            num_plmn + 1,
            mcc,
            mnc);
@@ -3579,7 +3549,7 @@ de_plmn_list(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *
        num_plmn++;
     }
 
-    sprintf(add_string, " - %d PLMN%s",
+    sprintf(add_string, " - %u PLMN%s",
        num_plmn, plurality(num_plmn, "", "s"));
 
     EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
@@ -3629,7 +3599,7 @@ de_rr_cause(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *a
 
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
-       "RR Cause value: 0x%02x (%d) %s",
+       "RR Cause value: 0x%02x (%u) %s",
        oct,
        oct,
        str);
@@ -3778,7 +3748,7 @@ de_network_name(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gcha
 
     oct = tvb_get_guint8(tvb, curr_offset);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Extension",
@@ -3793,14 +3763,14 @@ de_network_name(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gcha
        break;
     }
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Coding Scheme: %s",
        a_bigbuf,
        str);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Add CI: The MS should %s",
@@ -3823,7 +3793,7 @@ de_network_name(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gcha
        break;
     }
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Number of spare bits in last octet: %s",
@@ -3904,7 +3874,7 @@ de_rej_cause(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *
 
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
-       "Reject Cause value: 0x%02x (%d) %s",
+       "Reject Cause value: 0x%02x (%u) %s",
        oct,
        oct,
        str);
@@ -3933,7 +3903,7 @@ de_time_zone(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *
 
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
-       "Time Zone: 0x%02x (%d)",
+       "Time Zone: 0x%02x (%u)",
        oct,
        oct);
 
@@ -3963,7 +3933,7 @@ de_time_zone_time(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gc
 
     proto_tree_add_text(tree,
        tvb, curr_offset, 3,
-       "Year %d%d, Month %d%d, Day %d%d",
+       "Year %u%u, Month %u%u, Day %u%u",
        oct & 0x0f,
        (oct & 0xf0) >> 4,
        oct2 & 0x0f,
@@ -3979,7 +3949,7 @@ de_time_zone_time(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gc
 
     proto_tree_add_text(tree,
        tvb, curr_offset, 3,
-       "Hour %d%d, Minutes %d%d, Seconds %d%d",
+       "Hour %u%u, Minutes %u%u, Seconds %u%u",
        oct & 0x0f,
        (oct & 0xf0) >> 4,
        oct2 & 0x0f,
@@ -3993,7 +3963,7 @@ de_time_zone_time(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gc
 
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
-       "Time Zone: 0x%02x (%d)",
+       "Time Zone: 0x%02x (%u)",
        oct,
        oct);
 
@@ -4041,7 +4011,7 @@ de_day_saving_time(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, g
 
     oct = tvb_get_guint8(tvb, curr_offset);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0xfc, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0xfc, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Spare",
@@ -4057,7 +4027,7 @@ de_day_saving_time(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, g
        break;
     }
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x03, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x03, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  %s",
@@ -4086,13 +4056,13 @@ de_aux_states(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar
 
     oct = tvb_get_guint8(tvb, curr_offset);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Extension",
        a_bigbuf);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Spare",
@@ -4108,7 +4078,7 @@ de_aux_states(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar
        break;
     }
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x0c, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x0c, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Hold auxiliary state: %s",
@@ -4125,7 +4095,7 @@ de_aux_states(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar
        break;
     }
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x03, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x03, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Multi party auxiliary state: %s",
@@ -4140,574 +4110,2223 @@ de_aux_states(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar
 }
 
 /*
- * [3] 10.5.4.5a
+ * [3] 10.5.4.5
  */
 static guint8
-de_cc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
+de_bearer_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
 {
     guint8     oct;
+    guint8     itc;
+    gboolean   extended;
     guint32    curr_offset;
+    guint32    saved_offset;
+    proto_tree *subtree;
+    proto_item *item;
+    gchar      *str;
+
+#define        DE_BC_ITC_SPEECH        0x00
+#define        DE_BC_ITC_UDI           0x01
+#define        DE_BC_ITC_EX_PLMN       0x02
+#define        DE_BC_ITC_FASC_G3       0x03
+#define        DE_BC_ITC_OTHER_ITC     0x05
+#define        DE_BC_ITC_RSVD_NET      0x07
 
-    add_string = add_string;
     curr_offset = offset;
 
     oct = tvb_get_guint8(tvb, curr_offset);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+    /* octet 3 */
 
-    switch ((oct & 0xf0) >> 4)
+    /*
+     * warning, bearer cap uses extended values that
+     * are reversed from other parameters!
+     */
+    extended = (oct & 0x80) ? FALSE : TRUE;
+    itc = oct & 0x07;
+
+    other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+    proto_tree_add_text(tree,
+       tvb, curr_offset, 1,
+       "%s :  Extension: %s",
+       a_bigbuf,
+       extended ? "extended" : "not extended");
+
+    switch (is_uplink)
     {
-    case 0:
-       proto_tree_add_text(tree,
-           tvb, curr_offset, 1,
-           "%s :  Maximum number of supported bearers: 1",
-           a_bigbuf);
+    case IS_UPLINK_FALSE:
+       str = "Spare";
+       break;
+
+    case IS_UPLINK_TRUE:
+       /*
+        * depends on Information transfer capability
+        */
+       switch (itc)
+       {
+       case DE_BC_ITC_SPEECH:
+           if (extended)
+           {
+               switch ((oct & 0x60) >> 5)
+               {
+               case 1: str = "MS supports at least full rate speech version 1 but does not support half rate speech version 1"; break;
+               case 2: str = "MS supports at least full rate speech version 1 and half rate speech version 1. MS has a greater preference for half rate speech version 1 than for full rate speech version 1"; break;
+               case 3: str = "MS supports at least full rate speech version 1 and half rate speech version 1. MS has a greater preference for full rate speech version 1 than for half rate speech version 1"; break;
+               default:
+                   str = "Reserved";
+                   break;
+               }
+               break;
+           }
+           else
+           {
+               switch ((oct & 0x60) >> 5)
+               {
+               case 1: str = "Full rate support only MS/fullrate speech version 1 supported"; break;
+               case 2: str = "Dual rate support MS/half rate speech version 1 preferred, full rate speech version 1 also supported"; break;
+               case 3: str = "Dual rate support MS/full rate speech version 1 preferred, half rate speech version 1 also supported"; break;
+               default:
+                   str = "Reserved";
+                   break;
+               }
+               break;
+           }
+           break;
+
+       default:
+           switch ((oct & 0x60) >> 5)
+           {
+           case 1: str = "Full rate support only MS"; break;
+           case 2: str = "Dual rate support MS/half rate preferred"; break;
+           case 3: str = "Dual rate support MS/full rate preferred"; break;
+           default:
+               str = "Reserved";
+               break;
+           }
+           break;
+       }
        break;
 
     default:
-       proto_tree_add_text(tree,
-           tvb, curr_offset, 1,
-           "%s :  Maximum number of supported bearers: %d",
-           a_bigbuf,
-           (oct & 0xf0) >> 4);
+       str = "(dissect problem)";
        break;
     }
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x0c, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x60, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
-       "%s :  Spare",
-       a_bigbuf);
+       "%s :  Radio channel requirement: %s",
+       a_bigbuf,
+       str);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x02, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x10, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
-       "%s :  PCP: the mobile station %s the Prolonged Clearing Procedure",
+       "%s :  Coding standard: %s",
        a_bigbuf,
-       (oct & 0x02) ? "supports" : "does not support");
+       (oct & 0x10) ? "reserved" : "GSM standardized coding");
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
-       "%s :  DTMF: %s",
+       "%s :  Transfer mode: %s",
        a_bigbuf,
-       (oct & 0x01) ?
-           "the mobile station supports DTMF as specified in subclause 5.5.7 of TS 24.008" :
-           "reserved for earlier versions of the protocol");
+       (oct & 0x08) ? "packet" : "circuit");
+
+    switch (itc)
+    {
+    case DE_BC_ITC_SPEECH: str = "Speech"; break;
+    case DE_BC_ITC_UDI: str = "Unrestricted digital information"; break;
+    case DE_BC_ITC_EX_PLMN: str = "3.1 kHz audio, ex PLMN"; break;
+    case DE_BC_ITC_FASC_G3: str = "Facsimile group 3"; break;
+    case DE_BC_ITC_OTHER_ITC: str = "Other ITC (See Octet 5a)"; break;
+    case DE_BC_ITC_RSVD_NET: str = "Reserved, to be used in the network"; break;
+    default:
+       str = "Reserved";
+       break;
+    }
+
+    other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+    proto_tree_add_text(tree,
+       tvb, curr_offset, 1,
+       "%s :  Information transfer capability: %s",
+       a_bigbuf,
+       str);
+
+    sprintf(add_string, " - (%s)", str);
 
     curr_offset++;
 
     NO_MORE_DATA_CHECK(len);
 
-    oct = tvb_get_guint8(tvb, curr_offset);
+    switch (itc)
+    {
+    case DE_BC_ITC_SPEECH:
+       /* octets 3a */
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
-    proto_tree_add_text(tree,
-       tvb, curr_offset, 1,
-       "%s :  Spare",
-       a_bigbuf);
+       item =
+           proto_tree_add_text(tree,
+               tvb, curr_offset, -1,
+               "Octets 3a - Speech Versions");
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
-    proto_tree_add_text(tree,
-       tvb, curr_offset, 1,
-       "%s :  Maximum number of speech bearers: %d",
-       a_bigbuf,
-       oct & 0x0f);
+       subtree = proto_item_add_subtree(item, ett_bc_oct_3a);
 
-    curr_offset++;
+       saved_offset = curr_offset;
 
-    EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+       do
+       {
+           oct = tvb_get_guint8(tvb, curr_offset);
 
-    return(curr_offset - offset);
-}
+           extended = (oct & 0x80) ? FALSE : TRUE;
 
-/*
- * [3] 10.5.4.6
- */
-static guint8
-de_call_state(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
-{
-    guint8     oct;
-    guint32    curr_offset;
-    proto_tree *subtree;
-    proto_item *item;
-    gchar      *str;
+           other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+           proto_tree_add_text(subtree,
+               tvb, curr_offset, 1,
+               "%s :  Extension: %s",
+               a_bigbuf,
+               extended ? "extended" : "not extended");
 
-    len = len;
-    add_string = add_string;
-    curr_offset = offset;
+           other_decode_bitfield_value(a_bigbuf, oct, 0x40, 8);
+           proto_tree_add_text(subtree,
+               tvb, curr_offset, 1,
+               "%s :  Coding: octet used for %s",
+               a_bigbuf,
+               (oct & 0x40) ? "other extension of octet 3" :
+                   "extension of information transfer capability");
 
-    oct = tvb_get_guint8(tvb, curr_offset);
+           other_decode_bitfield_value(a_bigbuf, oct, 0x30, 8);
+           proto_tree_add_text(subtree,
+               tvb, curr_offset, 1,
+               "%s :  Spare",
+               a_bigbuf);
 
-    item =
-       proto_tree_add_text(tree,
-           tvb, curr_offset, 1,
-           gsm_dtap_elem_strings[DE_CALL_STATE].strptr);
+           switch (oct & 0x0f)
+           {
+           case 0: str = "GSM full rate speech version 1"; break;
+           case 2: str = "GSM full rate speech version 2"; break;
+           case 4: str = "GSM full rate speech version 3"; break;
+           case 1: str = "GSM half rate speech version 1"; break;
+           case 5: str = "GSM half rate speech version 3"; break;
+           default:
+               str = "Speech version TBD";
+               break;
+           }
 
-    subtree = proto_item_add_subtree(item, ett_gsm_dtap_elem[DE_CALL_STATE]);
+           other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+           proto_tree_add_text(subtree,
+               tvb, curr_offset, 1,
+               "%s :  Speech version indication: %s",
+               a_bigbuf,
+               str);
 
-    switch ((oct & 0xc0) >> 6)
-    {
-    case 0: str = "Coding as specified in ITU-T Rec. Q.931"; break;
-    case 1: str = "Reserved for other international standards"; break;
-    case 2: str = "National standard"; break;
-    default:
-       str = "Standard defined for the GSM PLMNS";
-       break;
-    }
+           curr_offset++;
+       }
+       while (extended &&
+           ((len - (curr_offset - offset)) > 0));
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0xc0, 8);
-    proto_tree_add_text(subtree,
-       tvb, curr_offset, 1,
-       "%s :  Coding standard: %s",
-       a_bigbuf,
-       str);
+       proto_item_set_len(item, curr_offset - saved_offset);
+       break;
 
-    switch (oct & 0x3f)
-    {
-    case 0x00: str = "UO - null                                 NO - null"; break;
-    case 0x02: str = "U0.1- MM connection pending               N0.1- MM connection pending"; break;
-    case 0x22: str = "U0.2- CC prompt present                   N0.2- CC connection pending"; break;
-    case 0x23: str = "U0.3- Wait for network information        N0.3- Network answer pending"; break;
-    case 0x24: str = "U0.4- CC-Establishment present            N0.4- CC-Establishment present"; break;
-    case 0x25: str = "U0.5- CC-Establishment confirmed          N0.5- CC-Establishment confirmed"; break;
-    case 0x26: str = "U0.6- Recall present                      N0.6- Recall present"; break;
-    case 0x01: str = "U1 - call initiated                       N1 - call initiated"; break;
-    case 0x03: str = "U3 - mobile originating call proceeding   N3 - mobile originating call proceeding"; break;
-    case 0x04: str = "U4 - call delivered                       N4 - call delivered"; break;
-    case 0x06: str = "U6 - call present                         N6 - call present"; break;
-    case 0x07: str = "U7 - call received                        N7 - call received"; break;
-    case 0x08: str = "U8 - connect request                      N8 - connect request"; break;
-    case 0x09: str = "U9 - mobile terminating call confirmed    N9 - mobile terminating call confirmed"; break;
-    case 0x0a: str = "U10- active                               N10- active"; break;
-    case 0x0b: str = "U11- disconnect request"; break;
-    case 0x0c: str = "U12- disconnect indication                N12-disconnect indication"; break;
-    case 0x13: str = "U19- release request                      N19- release request"; break;
-    case 0x1a: str = "U26- mobile originating modify            N26- mobile originating modify"; break;
-    case 0x1b: str = "U27- mobile terminating modify            N27- mobile terminating modify"; break;
-    case 0x1c: str = "                                          N28- connect indication"; break;
     default:
-       str = "Unknown";
-       break;
-    }
+       /* octet 4 */
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x3f, 8);
-    proto_tree_add_text(subtree,
-       tvb, curr_offset, 1,
-       "%s :  Call state value: %s",
-       a_bigbuf,
-       str);
+       item =
+           proto_tree_add_text(tree,
+               tvb, curr_offset, 1,
+               "Octet 4");
 
-    curr_offset++;
+       subtree = proto_item_add_subtree(item, ett_bc_oct_4);
 
-    /* no length check possible */
+       oct = tvb_get_guint8(tvb, curr_offset);
 
-    return(curr_offset - offset);
-}
+       extended = (oct & 0x80) ? FALSE : TRUE;
 
-/*
- * [3] 10.5.4.7
- */
-static guint8
-de_cld_party_bcd_num(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
-{
-    guint8     oct;
-    guint8     ton;
-    guint8     *poctets;
-    guint32    curr_offset;
-    gchar      *str;
+       other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Extension: %s",
+           a_bigbuf,
+           extended ? "extended" : "not extended");
 
-    curr_offset = offset;
+       other_decode_bitfield_value(a_bigbuf, oct, 0x40, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Compression: data compression %s%s",
+           a_bigbuf,
+           (oct & 0x40) ? "" : "not ",
+           is_uplink ? "allowed" : "possible");
 
-    oct = tvb_get_guint8(tvb, curr_offset);
+       switch ((oct & 0x30) >> 4)
+       {
+       case 0x00: str = "Service data unit integrity"; break;
+       case 0x03: str = "Unstructured"; break;
+       default:
+           str = "Reserved";
+           break;
+       }
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
-    proto_tree_add_text(tree,
+       other_decode_bitfield_value(a_bigbuf, oct, 0x30, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Structure: %s",
+           a_bigbuf,
+           str);
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Duplex mode: %s",
+           a_bigbuf,
+           (oct & 0x08) ? "Full" : "Half");
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x04, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Configuration: %s",
+           a_bigbuf,
+           (oct & 0x04) ? "Reserved" : "Point-to-point");
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x02, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  NIRR: %s",
+           a_bigbuf,
+           (oct & 0x02) ?
+               "Data up to and including 4.8 kb/s, full rate, non-transparent, 6 kb/s radio interface rate is requested" :
+               "No meaning is associated with this value");
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Establishment: %s",
+           a_bigbuf,
+           (oct & 0x01) ? "Reserved" : "Demand");
+
+       curr_offset++;
+
+       NO_MORE_DATA_CHECK(len);
+
+       /* octet 5 */
+
+       item =
+           proto_tree_add_text(tree,
+               tvb, curr_offset, 1,
+               "Octet 5");
+
+       subtree = proto_item_add_subtree(item, ett_bc_oct_5);
+
+       oct = tvb_get_guint8(tvb, curr_offset);
+
+       extended = (oct & 0x80) ? FALSE : TRUE;
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Extension: %s",
+           a_bigbuf,
+           extended ? "extended" : "not extended");
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x60, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Access Identity: %s",
+           a_bigbuf,
+           (oct & 0x60) ? "Reserved" : "Octet identifier");
+
+       switch ((oct & 0x18) >> 3)
+       {
+       case 0x00: str = "No rate adaption"; break;
+       case 0x01: str = "V.110, I.460/X.30 rate adaptation"; break;
+       case 0x02: str = "ITU-T X.31 flag stuffing"; break;
+       default:
+           str = "Other rate adaption (see octet 5a)"; break;
+           break;
+       }
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x18, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Rate Adaption: %s",
+           a_bigbuf,
+           str);
+
+       switch (oct & 0x07)
+       {
+       case 0x01: str = "I.440/450"; break;
+       case 0x02: str = "Reserved: was allocated in earlier phases of the protocol"; break;
+       case 0x03: str = "Reserved: was allocated in earlier phases of the protocol"; break;
+       case 0x04: str = "Reserved: was allocated in earlier phases of the protocol"; break;
+       case 0x05: str = "Reserved: was allocated in earlier phases of the protocol"; break;
+       case 0x06: str = "Reserved: was allocated in earlier phases of the protocol"; break;
+       default:
+           str = "Reserved"; break;
+           break;
+       }
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Signalling Access Protocol: %s",
+           a_bigbuf,
+           str);
+
+       curr_offset++;
+
+       NO_MORE_DATA_CHECK(len);
+
+       if (!extended) goto bc_octet_6;
+
+       /* octet 5a */
+
+       item =
+           proto_tree_add_text(tree,
+               tvb, curr_offset, 1,
+               "Octet 5a");
+
+       subtree = proto_item_add_subtree(item, ett_bc_oct_5a);
+
+       oct = tvb_get_guint8(tvb, curr_offset);
+
+       extended = (oct & 0x80) ? FALSE : TRUE;
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Extension: %s",
+           a_bigbuf,
+           extended ? "extended" : "not extended");
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x60, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Other ITC: %s",
+           a_bigbuf,
+           (oct & 0x60) ? "Reserved" : "Restricted digital information");
+
+       switch ((oct & 0x18) >> 3)
+       {
+       case 0x00: str = "V.120"; break;
+       case 0x01: str = "H.223 & H.245"; break;
+       case 0x02: str = "PIAFS"; break;
+       default:
+           str = "Reserved";
+           break;
+       }
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x18, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Other Rate Adaption: %s",
+           a_bigbuf,
+           str);
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Spare",
+           a_bigbuf);
+
+       curr_offset++;
+
+       NO_MORE_DATA_CHECK(len);
+
+       if (!extended) goto bc_octet_6;
+
+       /* octet 5b */
+
+       item =
+           proto_tree_add_text(tree,
+               tvb, curr_offset, 1,
+               "Octet 5b");
+
+       subtree = proto_item_add_subtree(item, ett_bc_oct_5b);
+
+       extended = (oct & 0x80) ? FALSE : TRUE;
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Extension: %s",
+           a_bigbuf,
+           extended ? "extended" : "not extended");
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x40, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Rate Adaption Header: %sincluded",
+           a_bigbuf,
+           (oct & 0x40) ? "" : "not ");
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x20, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Multiple frame establishment support in data link: %s",
+           a_bigbuf,
+           (oct & 0x20) ? "Supported" : "Not supported, only UI frames allowed");
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x10, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Mode of operation: %s",
+           a_bigbuf,
+           (oct & 0x10) ? "Protocol sensitive" : "Bit transparent");
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Logical link identifier negotiation: %s",
+           a_bigbuf,
+           (oct & 0x08) ? "Full protocol negotiation" : "Default, LLI=256 only");
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x04, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Assignor/Assignee: Message originator is '%s'",
+           a_bigbuf,
+           (oct & 0x04) ? "assignor only" : "default assignee");
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x02, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  In band/Out of band negotiation: Negotiation is done %s",
+           a_bigbuf,
+           (oct & 0x02) ?
+               "with USER INFORMATION messages on a temporary signalling connection" :
+               "in-band using logical link zero");
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Spare",
+           a_bigbuf);
+
+       curr_offset++;
+
+       NO_MORE_DATA_CHECK(len);
+
+bc_octet_6:
+
+       /* octet 6 */
+
+       item =
+           proto_tree_add_text(tree,
+               tvb, curr_offset, 1,
+               "Octet 6");
+
+       subtree = proto_item_add_subtree(item, ett_bc_oct_6);
+
+       extended = (oct & 0x80) ? FALSE : TRUE;
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Extension: %s",
+           a_bigbuf,
+           extended ? "extended" : "not extended");
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x60, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Layer 1 Identity: %s",
+           a_bigbuf,
+           ((oct & 0x60) == 0x20) ? "Octet identifier" : "Reserved");
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x1e, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  User information layer 1 protocol: %s",
+           a_bigbuf,
+           (oct & 0x1e) ? "Reserved" : "Default layer 1 protocol");
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Synchronous/asynchronous: %s",
+           a_bigbuf,
+           (oct & 0x01) ? "Asynchronous" : "Synchronous");
+
+       curr_offset++;
+
+       NO_MORE_DATA_CHECK(len);
+
+       if (!extended) goto bc_octet_7;
+
+       /* octet 6a */
+
+       item =
+           proto_tree_add_text(tree,
+               tvb, curr_offset, 1,
+               "Octet 6a");
+
+       subtree = proto_item_add_subtree(item, ett_bc_oct_6a);
+
+       extended = (oct & 0x80) ? FALSE : TRUE;
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Extension: %s",
+           a_bigbuf,
+           extended ? "extended" : "not extended");
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x40, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Number of Stop Bits: %s",
+           a_bigbuf,
+           (oct & 0x40) ? "2" : "1");
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x20, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Negotiation: %s",
+           a_bigbuf,
+           (oct & 0x20) ? "Reserved" : "In-band negotiation not possible");
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x10, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Number of data bits excluding parity bit if present: %s",
+           a_bigbuf,
+           (oct & 0x10) ? "8" : "7");
+
+       switch (oct & 0x0f)
+       {
+       case 0x01: str = "0.3 kbit/s Recommendation X.1 and V.110"; break;
+       case 0x02: str = "1.2 kbit/s Recommendation X.1 and V.110"; break;
+       case 0x03: str = "2.4 kbit/s Recommendation X.1 and V.110"; break;
+       case 0x04: str = "4.8 kbit/s Recommendation X.1 and V.110"; break;
+       case 0x05: str = "9.6 kbit/s Recommendation X.1 and V.110"; break;
+       case 0x06: str = "12.0 kbit/s transparent (non compliance with X.1 and V.110)"; break;
+       case 0x07: str = "Reserved: was allocated in earlier phases of the protocol"; break;
+       default:
+           str = "Reserved";
+           break;
+       }
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  User rate: %s",
+           a_bigbuf,
+           str);
+
+       curr_offset++;
+
+       NO_MORE_DATA_CHECK(len);
+
+       if (!extended) goto bc_octet_7;
+
+       /* octet 6b */
+
+       item =
+           proto_tree_add_text(tree,
+               tvb, curr_offset, 1,
+               "Octet 6b");
+
+       subtree = proto_item_add_subtree(item, ett_bc_oct_6b);
+
+       extended = (oct & 0x80) ? FALSE : TRUE;
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Extension: %s",
+           a_bigbuf,
+           extended ? "extended" : "not extended");
+
+       switch ((oct & 0x60) >> 5)
+       {
+       case 0x02: str = "8 kbit/s"; break;
+       case 0x03: str = "16 kbit/s"; break;
+       default:
+           str = "Reserved";
+           break;
+       }
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x60, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  V.110/X.30 rate adaptation Intermediate rate: %s",
+           a_bigbuf,
+           str);
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x10, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Network independent clock (NIC) on transmission (Tx): %s to send data with network independent clock",
+           a_bigbuf,
+           (oct & 0x10) ? "requires" : "does not require");
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Network independent clock (NIC) on reception (Rx): %s accept data with network independent clock",
+           a_bigbuf,
+           (oct & 0x08) ? "can" : "cannot");
+
+       switch (oct & 0x07)
+       {
+       case 0x00: str = "Odd"; break;
+       case 0x02: str = "Even"; break;
+       case 0x03: str = "None"; break;
+       case 0x04: str = "Forced to 0"; break;
+       case 0x05: str = "Forced to 1"; break;
+       default:
+           str = "Reserved";
+           break;
+       }
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Parity information: %s",
+           a_bigbuf,
+           str);
+
+       curr_offset++;
+
+       NO_MORE_DATA_CHECK(len);
+
+       if (!extended) goto bc_octet_7;
+
+       /* octet 6c */
+
+       item =
+           proto_tree_add_text(tree,
+               tvb, curr_offset, 1,
+               "Octet 6c");
+
+       subtree = proto_item_add_subtree(item, ett_bc_oct_6c);
+
+       extended = (oct & 0x80) ? FALSE : TRUE;
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Extension: %s",
+           a_bigbuf,
+           extended ? "extended" : "not extended");
+
+       switch ((oct & 0x60) >> 5)
+       {
+       case 0x01: str = "Non transparent (RLP)"; break;
+       case 0x02: str = "Both, transparent preferred"; break;
+       case 0x03: str = "Both, non transparent preferred"; break;
+       default:
+           str = "Transparent";
+           break;
+       }
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x60, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Connection element: %s",
+           a_bigbuf,
+           str);
+
+       switch (oct & 0x1f)
+       {
+       case 0x00: str = "None"; break;
+       case 0x01: str = "V.21"; break;
+       case 0x02: str = "V.22"; break;
+       case 0x03: str = "V.22 bis"; break;
+       case 0x04: str = "Reserved: was allocated in earlier phases of the protocol"; break;
+       case 0x05: str = "V.26 ter"; break;
+       case 0x06: str = "V.32"; break;
+       case 0x07: str = "Modem for undefined interface"; break;
+       case 0x08: str = "Autobauding type 1"; break;
+       default:
+           str = "Reserved";
+           break;
+       }
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x1f, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Modem type: %s",
+           a_bigbuf,
+           str);
+
+       curr_offset++;
+
+       NO_MORE_DATA_CHECK(len);
+
+       if (!extended) goto bc_octet_7;
+
+       /* octet 6d */
+
+       item =
+           proto_tree_add_text(tree,
+               tvb, curr_offset, 1,
+               "Octet 6d");
+
+       subtree = proto_item_add_subtree(item, ett_bc_oct_6d);
+
+       extended = (oct & 0x80) ? FALSE : TRUE;
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Extension: %s",
+           a_bigbuf,
+           extended ? "extended" : "not extended");
+
+       switch ((oct & 0x60) >> 5)
+       {
+       case 0x00: str = "No other modem type specified in this field"; break;
+       case 0x02: str = "V.34"; break;
+       default:
+           str = "Reserved";
+           break;
+       }
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x60, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Other modem type: %s",
+           a_bigbuf,
+           str);
+
+       switch (oct & 0x1f)
+       {
+       case 0x00: str = "Fixed network user rate not applicable/No meaning is associated with this value"; break;
+       case 0x01: str = "9.6 kbit/s Recommendation X.1 and V.110"; break;
+       case 0x02: str = "14.4 kbit/s Recommendation X.1 and V.110"; break;
+       case 0x03: str = "19.2 kbit/s Recommendation X.1 and V.110"; break;
+       case 0x04: str = "28.8 kbit/s Recommendation X.1 and V.110"; break;
+       case 0x05: str = "38.4 kbit/s Recommendation X.1 and V.110"; break;
+       case 0x06: str = "48.0 kbit/s Recommendation X.1 and V.110(synch)"; break;
+       case 0x07: str = "56.0 kbit/s Recommendation X.1 and V.110(synch) /bit transparent"; break;
+       case 0x08: str = "64.0 kbit/s bit transparent"; break;
+       case 0x09: str = "33.6 kbit/s bit transparent"; break;
+       case 0x0a: str = "32.0 kbit/s Recommendation I.460"; break;
+       case 0x0b: str = "31.2 kbit/s Recommendation V.34"; break;
+       default:
+           str = "Reserved";
+           break;
+       }
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x1f, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Fixed network user rate: %s",
+           a_bigbuf,
+           str);
+
+       curr_offset++;
+
+       NO_MORE_DATA_CHECK(len);
+
+       if (!extended) goto bc_octet_7;
+
+       /* octet 6e */
+
+       item =
+           proto_tree_add_text(tree,
+               tvb, curr_offset, 1,
+               "Octet 6e");
+
+       subtree = proto_item_add_subtree(item, ett_bc_oct_6e);
+
+       extended = (oct & 0x80) ? FALSE : TRUE;
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Extension: %s",
+           a_bigbuf,
+           extended ? "extended" : "not extended");
+
+       if (is_uplink == IS_UPLINK_TRUE)
+       {
+           other_decode_bitfield_value(a_bigbuf, oct, 0x40, 8);
+           proto_tree_add_text(subtree,
+               tvb, curr_offset, 1,
+               "%s :  Acceptable channel codings: TCH/F14.4 %sacceptable",
+               a_bigbuf,
+               (oct & 0x40) ? "" : "not ");
+
+           other_decode_bitfield_value(a_bigbuf, oct, 0x20, 8);
+           proto_tree_add_text(subtree,
+               tvb, curr_offset, 1,
+               "%s :  Acceptable channel codings: Spare",
+               a_bigbuf);
+
+           other_decode_bitfield_value(a_bigbuf, oct, 0x10, 8);
+           proto_tree_add_text(subtree,
+               tvb, curr_offset, 1,
+               "%s :  Acceptable channel codings: TCH/F9.6 %sacceptable",
+               a_bigbuf,
+               (oct & 0x10) ? "" : "not ");
+
+           other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+           proto_tree_add_text(subtree,
+               tvb, curr_offset, 1,
+               "%s :  Acceptable channel codings: TCH/F4.8 %sacceptable",
+               a_bigbuf,
+               (oct & 0x08) ? "" : "not ");
+
+           other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+           proto_tree_add_text(subtree,
+               tvb, curr_offset, 1,
+               "%s :  Maximum number of traffic channels: %u TCH",
+               a_bigbuf,
+               (oct & 0x07) + 1);
+       }
+       else
+       {
+           other_decode_bitfield_value(a_bigbuf, oct, 0x78, 8);
+           proto_tree_add_text(subtree,
+               tvb, curr_offset, 1,
+               "%s :  Acceptable channel codings: Spare",
+               a_bigbuf);
+
+           other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+           proto_tree_add_text(subtree,
+               tvb, curr_offset, 1,
+               "%s :  Maximum number of traffic channels: Spare",
+               a_bigbuf);
+       }
+
+       curr_offset++;
+
+       NO_MORE_DATA_CHECK(len);
+
+       if (!extended) goto bc_octet_7;
+
+       /* octet 6f */
+
+       item =
+           proto_tree_add_text(tree,
+               tvb, curr_offset, 1,
+               "Octet 6f");
+
+       subtree = proto_item_add_subtree(item, ett_bc_oct_6f);
+
+       extended = (oct & 0x80) ? FALSE : TRUE;
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Extension: %s",
+           a_bigbuf,
+           extended ? "extended" : "not extended");
+
+       switch ((oct & 0x70) >> 4)
+       {
+       case 0x00: str = "not allowed/required/applicable"; break;
+       case 0x01: str = "up to 1 TCH/F allowed/may be requested"; break;
+       case 0x02: str = "up to 2 TCH/F allowed/may be requested"; break;
+       case 0x03: str = "up to 3 TCH/F allowed/may be requested"; break;
+       case 0x04: str = "up to 4 TCH/F allowed/may be requested"; break;
+       default:
+           str = "up to 4 TCH/F may be requested";
+           break;
+       }
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  UIMI, User initiated modification indication: %s",
+           a_bigbuf,
+           str);
+
+       if (is_uplink == IS_UPLINK_TRUE)
+       {
+           switch (oct & 0x0f)
+           {
+           case 0x00: str = "Air interface user rate not applicable/No meaning associated with this value"; break;
+           case 0x01: str = "9.6 kbit/s"; break;
+           case 0x02: str = "14.4 kbit/s"; break;
+           case 0x03: str = "19.2 kbit/s"; break;
+           case 0x05: str = "28.8 kbit/s"; break;
+           case 0x06: str = "38.4 kbit/s"; break;
+           case 0x07: str = "43.2 kbit/s"; break;
+           case 0x08: str = "57.6 kbit/s"; break;
+           case 0x09: str = "interpreted by the network as 38.4 kbit/s in this version of the protocol"; break;
+           case 0x0a: str = "interpreted by the network as 38.4 kbit/s in this version of the protocol"; break;
+           case 0x0b: str = "interpreted by the network as 38.4 kbit/s in this version of the protocol"; break;
+           case 0x0c: str = "interpreted by the network as 38.4 kbit/s in this version of the protocol"; break;
+           default:
+               str = "Reserved";
+               break;
+           }
+
+           other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+           proto_tree_add_text(subtree,
+               tvb, curr_offset, 1,
+               "%s :  Wanted air interface user rate: %s",
+               a_bigbuf,
+               str);
+       }
+       else
+       {
+           other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+           proto_tree_add_text(subtree,
+               tvb, curr_offset, 1,
+               "%s :  Wanted air interface user rate: Spare",
+               a_bigbuf);
+       }
+
+       curr_offset++;
+
+       NO_MORE_DATA_CHECK(len);
+
+       if (!extended) goto bc_octet_7;
+
+       /* octet 6g */
+
+       item =
+           proto_tree_add_text(tree,
+               tvb, curr_offset, 1,
+               "Octet 6g");
+
+       subtree = proto_item_add_subtree(item, ett_bc_oct_6g);
+
+       extended = (oct & 0x80) ? FALSE : TRUE;
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Extension: %s",
+           a_bigbuf,
+           extended ? "extended" : "not extended");
+
+       if (is_uplink == IS_UPLINK_TRUE)
+       {
+           other_decode_bitfield_value(a_bigbuf, oct, 0x40, 8);
+           proto_tree_add_text(subtree,
+               tvb, curr_offset, 1,
+               "%s :  Acceptable channel codings extended: TCH/F28.8 %sacceptable",
+               a_bigbuf,
+               (oct & 0x40) ? "" : "not ");
+
+           other_decode_bitfield_value(a_bigbuf, oct, 0x20, 8);
+           proto_tree_add_text(subtree,
+               tvb, curr_offset, 1,
+               "%s :  Acceptable channel codings extended: TCH/F32.0 %sacceptable",
+               a_bigbuf,
+               (oct & 0x20) ? "" : "not ");
+
+           other_decode_bitfield_value(a_bigbuf, oct, 0x10, 8);
+           proto_tree_add_text(subtree,
+               tvb, curr_offset, 1,
+               "%s :  Acceptable channel codings extended: TCH/F43.2 %sacceptable",
+               a_bigbuf,
+               (oct & 0x10) ? "" : "not ");
+
+           other_decode_bitfield_value(a_bigbuf, oct, 0x10, 8);
+           proto_tree_add_text(subtree,
+               tvb, curr_offset, 1,
+               "%s :  Acceptable channel codings extended: TCH/F43.2 %sacceptable",
+               a_bigbuf,
+               (oct & 0x10) ? "" : "not ");
+
+           switch ((oct & 0x0c) >> 2)
+           {
+           case 0: str = "Channel coding symmetry preferred"; break;
+           case 2: str = "Downlink biased channel coding asymmetry is preferred"; break;
+           case 1: str = "Uplink biased channel coding asymmetry is preferred"; break;
+           default:
+               str = "Unused, treat as Channel coding symmetry preferred";
+               break;
+           }
+
+           other_decode_bitfield_value(a_bigbuf, oct, 0x0c, 8);
+           proto_tree_add_text(subtree,
+               tvb, curr_offset, 1,
+               "%s :  Channel Coding Asymmetry Indication: %s",
+               a_bigbuf,
+               str);
+       }
+       else
+       {
+           other_decode_bitfield_value(a_bigbuf, oct, 0x7c, 8);
+           proto_tree_add_text(subtree,
+               tvb, curr_offset, 1,
+               "%s :  EDGE Channel Codings: Spare",
+               a_bigbuf);
+       }
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x03, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Spare",
+           a_bigbuf);
+
+       curr_offset++;
+
+       NO_MORE_DATA_CHECK(len);
+
+bc_octet_7:
+
+       /* octet 7 */
+
+       item =
+           proto_tree_add_text(tree,
+               tvb, curr_offset, 1,
+               "Octet 7");
+
+       subtree = proto_item_add_subtree(item, ett_bc_oct_7);
+
+       extended = (oct & 0x80) ? FALSE : TRUE;
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Extension: %s",
+           a_bigbuf,
+           extended ? "extended" : "not extended");
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x60, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  Layer 2 Identity: %s",
+           a_bigbuf,
+           ((oct & 0x60) == 0x40) ? "Octet identifier" : "Reserved");
+
+       switch (oct & 0x1f)
+       {
+       case 0x06: str = "Reserved: was allocated in earlier phases of the protocol"; break;
+       case 0x08: str = "ISO 6429, codeset 0 (DC1/DC3)"; break;
+       case 0x09: str = "Reserved: was allocated but never used in earlier phases of the protocol"; break;
+       case 0x0a: str = "Videotex profile 1"; break;
+       case 0x0c: str = "COPnoFlCt (Character oriented Protocol with no Flow Control mechanism)"; break;
+       case 0x0d: str = "Reserved: was allocated in earlier phases of the protocol"; break;
+       default:
+           str = "Reserved";
+           break;
+       }
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x1f, 8);
+       proto_tree_add_text(subtree,
+           tvb, curr_offset, 1,
+           "%s :  User information layer 2 protocol: %s",
+           a_bigbuf,
+           str);
+       break;
+    }
+
+    EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+
+    return(curr_offset - offset);
+}
+
+/*
+ * [3] 10.5.4.5a
+ */
+static guint8
+de_cc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
+{
+    guint8     oct;
+    guint32    curr_offset;
+
+    add_string = add_string;
+    curr_offset = offset;
+
+    oct = tvb_get_guint8(tvb, curr_offset);
+
+    other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+
+    switch ((oct & 0xf0) >> 4)
+    {
+    case 0:
+       proto_tree_add_text(tree,
+           tvb, curr_offset, 1,
+           "%s :  Maximum number of supported bearers: 1",
+           a_bigbuf);
+       break;
+
+    default:
+       proto_tree_add_text(tree,
+           tvb, curr_offset, 1,
+           "%s :  Maximum number of supported bearers: %u",
+           a_bigbuf,
+           (oct & 0xf0) >> 4);
+       break;
+    }
+
+    other_decode_bitfield_value(a_bigbuf, oct, 0x0c, 8);
+    proto_tree_add_text(tree,
+       tvb, curr_offset, 1,
+       "%s :  Spare",
+       a_bigbuf);
+
+    other_decode_bitfield_value(a_bigbuf, oct, 0x02, 8);
+    proto_tree_add_text(tree,
+       tvb, curr_offset, 1,
+       "%s :  PCP: the mobile station %s the Prolonged Clearing Procedure",
+       a_bigbuf,
+       (oct & 0x02) ? "supports" : "does not support");
+
+    other_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
+    proto_tree_add_text(tree,
+       tvb, curr_offset, 1,
+       "%s :  DTMF: %s",
+       a_bigbuf,
+       (oct & 0x01) ?
+           "the mobile station supports DTMF as specified in subclause 5.5.7 of TS 24.008" :
+           "reserved for earlier versions of the protocol");
+
+    curr_offset++;
+
+    NO_MORE_DATA_CHECK(len);
+
+    oct = tvb_get_guint8(tvb, curr_offset);
+
+    other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+    proto_tree_add_text(tree,
+       tvb, curr_offset, 1,
+       "%s :  Spare",
+       a_bigbuf);
+
+    other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+    proto_tree_add_text(tree,
+       tvb, curr_offset, 1,
+       "%s :  Maximum number of speech bearers: %u",
+       a_bigbuf,
+       oct & 0x0f);
+
+    curr_offset++;
+
+    EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+
+    return(curr_offset - offset);
+}
+
+/*
+ * [3] 10.5.4.6
+ */
+static guint8
+de_call_state(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
+{
+    guint8     oct;
+    guint32    curr_offset;
+    proto_tree *subtree;
+    proto_item *item;
+    gchar      *str;
+
+    len = len;
+    add_string = add_string;
+    curr_offset = offset;
+
+    oct = tvb_get_guint8(tvb, curr_offset);
+
+    item =
+       proto_tree_add_text(tree,
+           tvb, curr_offset, 1,
+           gsm_dtap_elem_strings[DE_CALL_STATE].strptr);
+
+    subtree = proto_item_add_subtree(item, ett_gsm_dtap_elem[DE_CALL_STATE]);
+
+    switch ((oct & 0xc0) >> 6)
+    {
+    case 0: str = "Coding as specified in ITU-T Rec. Q.931"; break;
+    case 1: str = "Reserved for other international standards"; break;
+    case 2: str = "National standard"; break;
+    default:
+       str = "Standard defined for the GSM PLMNS";
+       break;
+    }
+
+    other_decode_bitfield_value(a_bigbuf, oct, 0xc0, 8);
+    proto_tree_add_text(subtree,
+       tvb, curr_offset, 1,
+       "%s :  Coding standard: %s",
+       a_bigbuf,
+       str);
+
+    switch (oct & 0x3f)
+    {
+    case 0x00: str = "UO - null                                 NO - null"; break;
+    case 0x02: str = "U0.1- MM connection pending               N0.1- MM connection pending"; break;
+    case 0x22: str = "U0.2- CC prompt present                   N0.2- CC connection pending"; break;
+    case 0x23: str = "U0.3- Wait for network information        N0.3- Network answer pending"; break;
+    case 0x24: str = "U0.4- CC-Establishment present            N0.4- CC-Establishment present"; break;
+    case 0x25: str = "U0.5- CC-Establishment confirmed          N0.5- CC-Establishment confirmed"; break;
+    case 0x26: str = "U0.6- Recall present                      N0.6- Recall present"; break;
+    case 0x01: str = "U1 - call initiated                       N1 - call initiated"; break;
+    case 0x03: str = "U3 - mobile originating call proceeding   N3 - mobile originating call proceeding"; break;
+    case 0x04: str = "U4 - call delivered                       N4 - call delivered"; break;
+    case 0x06: str = "U6 - call present                         N6 - call present"; break;
+    case 0x07: str = "U7 - call received                        N7 - call received"; break;
+    case 0x08: str = "U8 - connect request                      N8 - connect request"; break;
+    case 0x09: str = "U9 - mobile terminating call confirmed    N9 - mobile terminating call confirmed"; break;
+    case 0x0a: str = "U10- active                               N10- active"; break;
+    case 0x0b: str = "U11- disconnect request"; break;
+    case 0x0c: str = "U12- disconnect indication                N12-disconnect indication"; break;
+    case 0x13: str = "U19- release request                      N19- release request"; break;
+    case 0x1a: str = "U26- mobile originating modify            N26- mobile originating modify"; break;
+    case 0x1b: str = "U27- mobile terminating modify            N27- mobile terminating modify"; break;
+    case 0x1c: str = "                                          N28- connect indication"; break;
+    default:
+       str = "Unknown";
+       break;
+    }
+
+    other_decode_bitfield_value(a_bigbuf, oct, 0x3f, 8);
+    proto_tree_add_text(subtree,
+       tvb, curr_offset, 1,
+       "%s :  Call state value: %s",
+       a_bigbuf,
+       str);
+
+    curr_offset++;
+
+    /* no length check possible */
+
+    return(curr_offset - offset);
+}
+
+/*
+ * [3] 10.5.4.7
+ */
+static guint8
+de_cld_party_bcd_num(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
+{
+    guint8     oct;
+    guint8     ton;
+    guint8     *poctets;
+    guint32    curr_offset;
+    gchar      *str;
+
+    curr_offset = offset;
+
+    oct = tvb_get_guint8(tvb, curr_offset);
+
+    other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+    proto_tree_add_text(tree,
+       tvb, curr_offset, 1,
+       "%s :  Extension",
+       a_bigbuf);
+
+    ton = (oct & 0x70) >> 4;
+    switch (ton)
+    {
+    case 0: str = "Unknown"; break;
+    case 1: str = "International number"; break;
+    case 2: str = "National number"; break;
+    case 3: str = "Network specific number"; break;
+    case 4: str = "Dedicated access, short code"; break;
+    case 7: str = "Reserved for extension"; break;
+    default:
+       str = "Reserved";
+       break;
+    }
+
+    other_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
+    proto_tree_add_text(tree,
+       tvb, curr_offset, 1,
+       "%s :  Type of number: %s",
+       a_bigbuf,
+       str);
+
+    if ((ton == 0) ||
+       (ton == 1) ||
+       (ton == 2) ||
+       (ton == 4))
+    {
+       switch (oct & 0x0f)
+       {
+       case 0: str = "Unknown"; break;
+       case 1: str = "ISDN/telephony numbering plan (Rec. E.164/E.163)"; break;
+       case 3: str = "Data numbering plan (Recommendation X.121)"; break;
+       case 4: str = "Telex numbering plan (Recommendation F.69)"; break;
+       case 8: str = "National numbering plan"; break;
+       case 9: str = "Private numbering plan"; break;
+       case 11: str = "Reserved for CTS (see 3GPP TS 44.056)"; break;
+       case 15: str = "Reserved for extension"; break;
+       default:
+           str = "Reserved";
+           break;
+       }
+    }
+    else
+    {
+       str = "not applicable";
+    }
+
+    other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+    proto_tree_add_text(tree,
+       tvb, curr_offset, 1,
+       "%s :  Numbering plan identification: %s",
+       a_bigbuf,
+       str);
+
+    curr_offset++;
+
+    NO_MORE_DATA_CHECK(len);
+
+    poctets = tvb_get_string(tvb, curr_offset, len - (curr_offset - offset));
+
+    my_dgt_tbcd_unpack(a_bigbuf, poctets, len - (curr_offset - offset),
+       &Dgt_mbcd);
+    g_free(poctets);
+
+    proto_tree_add_string_format(tree, hf_gsm_a_cld_party_bcd_num,
+       tvb, curr_offset, len - (curr_offset - offset),
+       a_bigbuf,
+       "BCD Digits: %s",
+       a_bigbuf);
+
+    curr_offset += len - (curr_offset - offset);
+
+    sprintf(add_string, " - (%s)", a_bigbuf);
+
+    EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+
+    return(curr_offset - offset);
+}
+
+/*
+ * [3] 10.5.4.8
+ */
+static guint8
+de_cld_party_sub_addr(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
+{
+    guint8     oct;
+    guint32    curr_offset;
+    gchar      *str;
+
+    add_string = add_string;
+    curr_offset = offset;
+
+    oct = tvb_get_guint8(tvb, curr_offset);
+
+    other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+    proto_tree_add_text(tree,
+       tvb, curr_offset, 1,
+       "%s :  Extension",
+       a_bigbuf);
+
+    switch ((oct & 0x70) >> 4)
+    {
+    case 0: str = "NSAP (X.213/ISO 8348 AD2)"; break;
+    case 2: str = "User specified"; break;
+    default:
+       str = "Reserved";
+       break;
+    }
+
+    other_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
+    proto_tree_add_text(tree,
+       tvb, curr_offset, 1,
+       "%s :  Type of subaddress: %s",
+       a_bigbuf,
+       str);
+
+    other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+    proto_tree_add_text(tree,
+       tvb, curr_offset, 1,
+       "%s :  Odd/Even indicator: %s",
+       a_bigbuf,
+       (oct & 0x08) ?
+           "odd number of address signals" : "even number of address signals");
+
+    other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+    proto_tree_add_text(tree,
+       tvb, curr_offset, 1,
+       "%s :  Spare",
+       a_bigbuf);
+
+    curr_offset++;
+
+    NO_MORE_DATA_CHECK(len);
+
+    proto_tree_add_text(tree,
+       tvb, curr_offset, len - (curr_offset - offset),
+       "Subaddress information");
+
+    curr_offset += len - (curr_offset - offset);
+
+    EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+
+    return(curr_offset - offset);
+}
+
+/*
+ * [3] 10.5.4.9
+ */
+static guint8
+de_clg_party_bcd_num(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
+{
+    guint8     oct;
+    guint8     ton;
+    guint8     *poctets;
+    guint32    curr_offset;
+    gchar      *str;
+
+    curr_offset = offset;
+
+    oct = tvb_get_guint8(tvb, curr_offset);
+
+    other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+    proto_tree_add_text(tree,
+       tvb, curr_offset, 1,
+       "%s :  Extension",
+       a_bigbuf);
+
+    ton = (oct & 0x70) >> 4;
+    switch (ton)
+    {
+    case 0: str = "Unknown"; break;
+    case 1: str = "International number"; break;
+    case 2: str = "National number"; break;
+    case 3: str = "Network specific number"; break;
+    case 4: str = "Dedicated access, short code"; break;
+    case 7: str = "Reserved for extension"; break;
+    default:
+       str = "Reserved";
+       break;
+    }
+
+    other_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
+    proto_tree_add_text(tree,
+       tvb, curr_offset, 1,
+       "%s :  Type of number: %s",
+       a_bigbuf,
+       str);
+
+    if ((ton == 0) ||
+       (ton == 1) ||
+       (ton == 2) ||
+       (ton == 4))
+    {
+       switch (oct & 0x0f)
+       {
+       case 0: str = "Unknown"; break;
+       case 1: str = "ISDN/telephony numbering plan (Rec. E.164/E.163)"; break;
+       case 3: str = "Data numbering plan (Recommendation X.121)"; break;
+       case 4: str = "Telex numbering plan (Recommendation F.69)"; break;
+       case 8: str = "National numbering plan"; break;
+       case 9: str = "Private numbering plan"; break;
+       case 11: str = "Reserved for CTS (see 3GPP TS 44.056)"; break;
+       case 15: str = "Reserved for extension"; break;
+       default:
+           str = "Reserved";
+           break;
+       }
+    }
+    else
+    {
+       str = "not applicable";
+    }
+
+    other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+    proto_tree_add_text(tree,
+       tvb, curr_offset, 1,
+       "%s :  Numbering plan identification: %s",
+       a_bigbuf,
+       str);
+
+    curr_offset++;
+
+    oct = tvb_get_guint8(tvb, curr_offset);
+
+    other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+    proto_tree_add_text(tree,
+       tvb, curr_offset, 1,
+       "%s :  Extension",
+       a_bigbuf);
+
+    switch ((oct & 0x60) >> 5)
+    {
+    case 0: str = "Presentation allowed"; break;
+    case 1: str = "Presentation restricted"; break;
+    case 2: str = "Number not available due to interworking"; break;
+    default:
+       str = "Reserved";
+       break;
+    }
+
+    other_decode_bitfield_value(a_bigbuf, oct, 0x60, 8);
+    proto_tree_add_text(tree,
+       tvb, curr_offset, 1,
+       "%s :  Presentation indicator: %s",
+       a_bigbuf,
+       str);
+
+    other_decode_bitfield_value(a_bigbuf, oct, 0x1c, 8);
+    proto_tree_add_text(tree,
+       tvb, curr_offset, 1,
+       "%s :  Spare",
+       a_bigbuf);
+
+    switch (oct & 0x03)
+    {
+    case 0: str = "User-provided, not screened"; break;
+    case 1: str = "User-provided, verified and passed"; break;
+    case 2: str = "User-provided, verified and failed"; break;
+    default:
+       str = "Network provided";
+       break;
+    }
+
+    other_decode_bitfield_value(a_bigbuf, oct, 0x03, 8);
+    proto_tree_add_text(tree,
+       tvb, curr_offset, 1,
+       "%s :  Screening indicator: %s",
+       a_bigbuf,
+       str);
+
+    curr_offset++;
+
+    NO_MORE_DATA_CHECK(len);
+
+    poctets = tvb_get_string(tvb, curr_offset, len - (curr_offset - offset));
+
+    my_dgt_tbcd_unpack(a_bigbuf, poctets, len - (curr_offset - offset),
+       &Dgt_mbcd);
+    g_free(poctets);
+
+    proto_tree_add_string_format(tree, hf_gsm_a_clg_party_bcd_num,
+       tvb, curr_offset, len - (curr_offset - offset),
+       a_bigbuf,
+       "BCD Digits: %s",
+       a_bigbuf);
+
+    curr_offset += len - (curr_offset - offset);
+
+    sprintf(add_string, " - (%s)", a_bigbuf);
+
+    EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+
+    return(curr_offset - offset);
+}
+
+/*
+ * [3] 10.5.4.10
+ */
+static guint8
+de_clg_party_sub_addr(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
+{
+    guint8     oct;
+    guint32    curr_offset;
+    gchar      *str;
+
+    add_string = add_string;
+    curr_offset = offset;
+
+    oct = tvb_get_guint8(tvb, curr_offset);
+
+    other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+    proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Extension",
        a_bigbuf);
 
-    ton = (oct & 0x70) >> 4;
-    switch (ton)
+    switch ((oct & 0x70) >> 4)
     {
-    case 0: str = "Unknown"; break;
-    case 1: str = "International number"; break;
-    case 2: str = "National number"; break;
-    case 3: str = "Network specific number"; break;
-    case 4: str = "Dedicated access, short code"; break;
-    case 7: str = "Reserved for extension"; break;
+    case 0: str = "NSAP (X.213/ISO 8348 AD2)"; break;
+    case 2: str = "User specified"; break;
     default:
        str = "Reserved";
        break;
     }
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
-       "%s :  Type of number: %s",
+       "%s :  Type of subaddress: %s",
        a_bigbuf,
        str);
 
-    if ((ton == 0) ||
-       (ton == 1) ||
-       (ton == 2) ||
-       (ton == 4))
+    other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+    proto_tree_add_text(tree,
+       tvb, curr_offset, 1,
+       "%s :  Odd/Even indicator: %s",
+       a_bigbuf,
+       (oct & 0x08) ?
+           "odd number of address signals" : "even number of address signals");
+
+    other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+    proto_tree_add_text(tree,
+       tvb, curr_offset, 1,
+       "%s :  Spare",
+       a_bigbuf);
+
+    curr_offset++;
+
+    NO_MORE_DATA_CHECK(len);
+
+    proto_tree_add_text(tree,
+       tvb, curr_offset, len - (curr_offset - offset),
+       "Subaddress information");
+
+    curr_offset += len - (curr_offset - offset);
+
+    EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+
+    return(curr_offset - offset);
+}
+
+/*
+ * [3] 10.5.4.11
+ */
+static guint8
+de_cause(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
+{
+    guint8     oct;
+    guint8     cause;
+    guint32    curr_offset;
+    gchar      *str;
+
+    curr_offset = offset;
+
+    oct = tvb_get_guint8(tvb, curr_offset);
+
+    other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+    proto_tree_add_text(tree,
+       tvb, curr_offset, 1,
+       "%s :  Extension: %s",
+       a_bigbuf,
+       (oct & 0x80) ? "not extended" : "extended");
+
+    switch ((oct & 0x60) >> 5)
     {
-       switch (oct & 0x0f)
-       {
-       case 0: str = "Unknown"; break;
-       case 1: str = "ISDN/telephony numbering plan (Rec. E.164/E.163)"; break;
-       case 3: str = "Data numbering plan (Recommendation X.121)"; break;
-       case 4: str = "Telex numbering plan (Recommendation F.69)"; break;
-       case 8: str = "National numbering plan"; break;
-       case 9: str = "Private numbering plan"; break;
-       case 11: str = "Reserved for CTS (see 3GPP TS 44.056)"; break;
-       case 15: str = "Reserved for extension"; break;
-       default:
-           str = "Reserved";
-           break;
-       }
+    case 0: str = "Coding as specified in ITU-T Rec. Q.931"; break;
+    case 1: str = "Reserved for other international standards"; break;
+    case 2: str = "National standard"; break;
+    default:
+       str = "Standard defined for the GSM PLMNS";
+       break;
     }
-    else
+
+    other_decode_bitfield_value(a_bigbuf, oct, 0x60, 8);
+    proto_tree_add_text(tree,
+       tvb, curr_offset, 1,
+       "%s :  Coding standard: %s",
+       a_bigbuf,
+       str);
+
+    other_decode_bitfield_value(a_bigbuf, oct, 0x10, 8);
+    proto_tree_add_text(tree,
+       tvb, curr_offset, 1,
+       "%s :  Spare",
+       a_bigbuf);
+
+    switch (oct & 0x0f)
     {
-       str = "not applicable";
+    case 0: str = "User"; break;
+    case 1: str = "Private network serving the local user"; break;
+    case 2: str = "Public network serving the local user"; break;
+    case 3: str = "Transit network"; break;
+    case 4: str = "Public network serving the remote user"; break;
+    case 5: str = "Private network serving the remote user"; break;
+    case 7: str = "International network"; break;
+    case 10: str = "Network beyond interworking point"; break;
+    default:
+       str = "Reserved";
+       break;
+    }
+
+    other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+    proto_tree_add_text(tree,
+       tvb, curr_offset, 1,
+       "%s :  Location: %s",
+       a_bigbuf,
+       str);
+
+    curr_offset++;
+
+    oct = tvb_get_guint8(tvb, curr_offset);
+
+    if (!(oct & 0x80))
+    {
+       other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+       proto_tree_add_text(tree,
+           tvb, curr_offset, 1,
+           "%s :  Extension",
+           a_bigbuf);
+
+       other_decode_bitfield_value(a_bigbuf, oct, 0x7f, 8);
+       proto_tree_add_text(tree,
+           tvb, curr_offset, 1,
+           "%s :  Recommendation",
+           a_bigbuf);
+
+       curr_offset++;
+
+       oct = tvb_get_guint8(tvb, curr_offset);
+    }
+
+    other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+    proto_tree_add_text(tree,
+       tvb, curr_offset, 1,
+       "%s :  Extension",
+       a_bigbuf);
+
+    cause = oct & 0x7f;
+    switch (cause)
+    {
+    case 1: str = "Unassigned (unallocated) number"; break;
+    case 3: str = "No route to destination"; break;
+    case 6: str = "Channel unacceptable"; break;
+    case 8: str = "Operator determined barring"; break;
+    case 16: str = "Normal call clearing"; break;
+    case 17: str = "User busy"; break;
+    case 18: str = "No user responding"; break;
+    case 19: str = "User alerting, no answer"; break;
+    case 21: str = "Call rejected"; break;
+    case 22: str = "Number changed"; break;
+    case 25: str = "Pre-emption"; break;
+    case 26: str = "Non selected user clearing"; break;
+    case 27: str = "Destination out of order"; break;
+    case 28: str = "Invalid number format (incomplete number)"; break;
+    case 29: str = "Facility rejected"; break;
+    case 30: str = "Response to STATUS ENQUIRY"; break;
+    case 31: str = "Normal, unspecified"; break;
+    case 34: str = "No circuit/channel available"; break;
+    case 38: str = "Network out of order"; break;
+    case 41: str = "Temporary failure"; break;
+    case 42: str = "Switching equipment congestion"; break;
+    case 43: str = "Access information discarded"; break;
+    case 44: str = "requested circuit/channel not available"; break;
+    case 47: str = "Resources unavailable, unspecified"; break;
+    case 49: str = "Quality of service unavailable"; break;
+    case 50: str = "Requested facility not subscribed"; break;
+    case 55: str = "Incoming calls barred within the CUG"; break;
+    case 57: str = "Bearer capability not authorized"; break;
+    case 58: str = "Bearer capability not presently available"; break;
+    case 63: str = "Service or option not available, unspecified"; break;
+    case 65: str = "Bearer service not implemented"; break;
+    case 68: str = "ACM equal to or greater than ACMmax"; break;
+    case 69: str = "Requested facility not implemented"; break;
+    case 70: str = "Only restricted digital information bearer capability is available"; break;
+    case 79: str = "Service or option not implemented, unspecified"; break;
+    case 81: str = "Invalid transaction identifier value"; break;
+    case 87: str = "User not member of CUG"; break;
+    case 88: str = "Incompatible destination"; break;
+    case 91: str = "Invalid transit network selection"; break;
+    case 95: str = "Semantically incorrect message"; break;
+    case 96: str = "Invalid mandatory information"; break;
+    case 97: str = "Message type non-existent or not implemented"; break;
+    case 98: str = "Message type not compatible with protocol state"; break;
+    case 99: str = "Information element non-existent or not implemented"; break;
+    case 100: str = "Conditional IE error"; break;
+    case 101: str = "Message not compatible with protocol state"; break;
+    case 102: str = "Recovery on timer expiry"; break;
+    case 111: str = "Protocol error, unspecified"; break;
+    case 127: str = "Interworking, unspecified"; break;
+    default:
+       if (cause <= 31) { str = "Treat as Normal, unspecified"; }
+       else if ((cause >= 32) && (cause <= 47)) { str = "Treat as Resources unavailable, unspecified"; }
+       else if ((cause >= 48) && (cause <= 63)) { str = "Treat as Service or option not available, unspecified"; }
+       else if ((cause >= 64) && (cause <= 79)) { str = "Treat as Service or option not implemented, unspecified"; }
+       else if ((cause >= 80) && (cause <= 95)) { str = "Treat as Semantically incorrect message"; }
+       else if ((cause >= 96) && (cause <= 111)) { str = "Treat as Protocol error, unspecified"; }
+       else if ((cause >= 112) && (cause <= 127)) { str = "Treat as Interworking, unspecified"; }
+       break;
     }
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
-    proto_tree_add_text(tree,
-       tvb, curr_offset, 1,
-       "%s :  Numbering plan identification: %s",
+    other_decode_bitfield_value(a_bigbuf, oct, 0x7f, 8);
+    proto_tree_add_uint_format(tree, hf_gsm_a_dtap_cause,
+       tvb, curr_offset, 1, cause,
+       "%s :  Cause: (%u) %s",
        a_bigbuf,
+       cause,
        str);
 
     curr_offset++;
 
-    NO_MORE_DATA_CHECK(len);
-
-    poctets = tvb_get_string(tvb, curr_offset, len - (curr_offset - offset));
+    sprintf(add_string, " - (%u) %s", cause, str);
 
-    my_dgt_tbcd_unpack(a_bigbuf, poctets, len - (curr_offset - offset),
-       &Dgt_mbcd);
-    g_free(poctets);
+    NO_MORE_DATA_CHECK(len);
 
-    proto_tree_add_string_format(tree, hf_gsm_a_cld_party_bcd_num,
+    proto_tree_add_text(tree,
        tvb, curr_offset, len - (curr_offset - offset),
-       a_bigbuf,
-       "BCD Digits: %s",
-       a_bigbuf);
+       "Diagnostics");
 
     curr_offset += len - (curr_offset - offset);
 
-    sprintf(add_string, " - (%s)", a_bigbuf);
-
     EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
 
     return(curr_offset - offset);
 }
 
-/*
- * [3] 10.5.4.8
+
+#define        GSM_A_TC_START_SUBTREE(_Gtree, _Gsaved_offset, _Gtag, _Gstr1, _Gett, _Gdef_len_p, _Glen_p, _Gsubtree_p) \
+    { \
+       guint           _len_offset; \
+       proto_item      *_item; \
+ \
+       _len_offset = asn1->offset; \
+       asn1_length_decode(asn1, _Gdef_len_p, _Glen_p); \
+ \
+       _item = \
+           proto_tree_add_text(_Gtree, asn1->tvb, _Gsaved_offset, -1, _Gstr1); \
+ \
+       _Gsubtree_p = proto_item_add_subtree(_item, _Gett); \
+ \
+       proto_tree_add_text(_Gsubtree_p, asn1->tvb, \
+           _Gsaved_offset, _len_offset - _Gsaved_offset, "Tag: 0x%02x", _Gtag); \
+ \
+       if (*_Gdef_len_p) \
+       { \
+           proto_tree_add_text(_Gsubtree_p, asn1->tvb, \
+               _len_offset, asn1->offset - _len_offset, "Length: %d", *_Glen_p); \
+       } \
+       else \
+       { \
+           proto_tree_add_text(_Gsubtree_p, asn1->tvb, \
+               _len_offset, asn1->offset - _len_offset, "Length: Indefinite"); \
+ \
+           *_Glen_p = tcap_find_eoc(asn1); \
+       } \
+ \
+       proto_item_set_len(_item, (asn1->offset - _Gsaved_offset) + *_Glen_p + \
+           (*_Gdef_len_p ? 0 : TCAP_EOC_LEN)); \
+    }
+
+/*
+ * [6] 3.6
  */
 static guint8
-de_cld_party_sub_addr(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
+de_facility(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
 {
-    guint8     oct;
-    guint32    curr_offset;
+    ASN1_SCK   asn1_real, *asn1;
+    proto_item *item;
+    proto_tree *subtree, *temp_subtree, *seq_subtree;
+    guint      saved_offset, comp_saved_offset, comp_len_offset, comp_data_offset;
+    guint      comp_len, temp_len;
+    gboolean   def_len[3];
+    guint      comp_tag, tag;
     gchar      *str;
+    gint32     int_val;
 
     add_string = add_string;
-    curr_offset = offset;
 
-    oct = tvb_get_guint8(tvb, curr_offset);
+    asn1 = &asn1_real;
+    asn1_open(asn1, tvb, offset);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
-    proto_tree_add_text(tree,
-       tvb, curr_offset, 1,
-       "%s :  Extension",
-       a_bigbuf);
+    /* call next dissector for EACH component */
 
-    switch ((oct & 0x70) >> 4)
+    while ((len - (asn1->offset - offset)) > 0)
     {
-    case 0: str = "NSAP (X.213/ISO 8348 AD2)"; break;
-    case 2: str = "User specified"; break;
-    default:
-       str = "Reserved";
-       break;
-    }
+       comp_saved_offset = asn1->offset;
+       saved_offset = asn1->offset;
+       asn1_id_decode1(asn1, &comp_tag);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
-    proto_tree_add_text(tree,
-       tvb, curr_offset, 1,
-       "%s :  Type of subaddress: %s",
-       a_bigbuf,
-       str);
+       comp_len_offset = asn1->offset;
+       comp_len = 0;
+       def_len[0] = FALSE;
+       asn1_length_decode(asn1, &def_len[0], &comp_len);
+       comp_data_offset = asn1->offset;
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
-    proto_tree_add_text(tree,
-       tvb, curr_offset, 1,
-       "%s :  Odd/Even indicator: %s",
-       a_bigbuf,
-       (oct & 0x08) ?
-           "odd number of address signals" : "even number of address signals");
+       if (def_len[0])
+       {
+           temp_len = comp_len + (asn1->offset - saved_offset);
+       }
+       else
+       {
+           comp_len = tcap_find_eoc(asn1);
+           temp_len = comp_len + (asn1->offset - saved_offset) + TCAP_EOC_LEN;
+       }
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
-    proto_tree_add_text(tree,
-       tvb, curr_offset, 1,
-       "%s :  Spare",
-       a_bigbuf);
+       item =
+           proto_tree_add_text(tree, asn1->tvb, comp_saved_offset, temp_len, "Component");
 
-    curr_offset++;
+       subtree = proto_item_add_subtree(item, ett_tc_component);
 
-    NO_MORE_DATA_CHECK(len);
+       str = match_strval((guint32) comp_tag, tcap_component_type_str);
 
-    proto_tree_add_text(tree,
-       tvb, curr_offset, len - (curr_offset - offset),
-       "Subaddress information");
+       if (str == NULL)
+       {
+           proto_tree_add_text(subtree, asn1->tvb, comp_saved_offset, temp_len,
+               "Unknown component type tag, ignoring component");
 
-    curr_offset += len - (curr_offset - offset);
+           asn1->offset = comp_saved_offset + temp_len;
+           continue;
+       }
 
-    EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+       proto_tree_add_text(subtree, asn1->tvb, comp_saved_offset,
+           comp_len_offset - comp_saved_offset,
+           "%s Type Tag: 0x%02x", str, comp_tag);
 
-    return(curr_offset - offset);
-}
+       if (def_len[0])
+       {
+           proto_tree_add_text(subtree, asn1->tvb,
+               comp_len_offset, asn1->offset - comp_len_offset, "Length: %d", comp_len);
+       }
+       else
+       {
+           proto_tree_add_text(subtree, asn1->tvb,
+               comp_len_offset, asn1->offset - comp_len_offset, "Length: Indefinite");
+       }
 
-/*
- * [3] 10.5.4.9
- */
-static guint8
-de_clg_party_bcd_num(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
-{
-    guint8     oct;
-    guint8     ton;
-    guint8     *poctets;
-    guint32    curr_offset;
-    gchar      *str;
+       saved_offset = asn1->offset;
+       asn1_id_decode1(asn1, &tag);
 
-    curr_offset = offset;
+       GSM_A_TC_START_SUBTREE(subtree, saved_offset, tag, "Invoke ID",
+           ett_tc_invoke_id, &def_len[1], &temp_len, temp_subtree);
 
-    oct = tvb_get_guint8(tvb, curr_offset);
+       if (temp_len > 0)
+       {
+           saved_offset = asn1->offset;
+           asn1_int32_value_decode(asn1, temp_len, &int_val);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
-    proto_tree_add_text(tree,
-       tvb, curr_offset, 1,
-       "%s :  Extension",
-       a_bigbuf);
+           proto_tree_add_text(temp_subtree, asn1->tvb,
+               saved_offset, temp_len, "Invoke ID: %d", int_val);
+       }
 
-    ton = (oct & 0x70) >> 4;
-    switch (ton)
-    {
-    case 0: str = "Unknown"; break;
-    case 1: str = "International number"; break;
-    case 2: str = "National number"; break;
-    case 3: str = "Network specific number"; break;
-    case 4: str = "Dedicated access, short code"; break;
-    case 7: str = "Reserved for extension"; break;
-    default:
-       str = "Reserved";
-       break;
-    }
+       if (!def_len[1])
+       {
+           saved_offset = asn1->offset;
+           asn1_eoc_decode(asn1, -1);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
-    proto_tree_add_text(tree,
-       tvb, curr_offset, 1,
-       "%s :  Type of number: %s",
-       a_bigbuf,
-       str);
+           proto_tree_add_text(subtree, asn1->tvb,
+               saved_offset, asn1->offset - saved_offset, "End of Contents");
+       }
 
-    if ((ton == 0) ||
-       (ton == 1) ||
-       (ton == 2) ||
-       (ton == 4))
-    {
-       switch (oct & 0x0f)
+       switch (comp_tag)
        {
-       case 0: str = "Unknown"; break;
-       case 1: str = "ISDN/telephony numbering plan (Rec. E.164/E.163)"; break;
-       case 3: str = "Data numbering plan (Recommendation X.121)"; break;
-       case 4: str = "Telex numbering plan (Recommendation F.69)"; break;
-       case 8: str = "National numbering plan"; break;
-       case 9: str = "Private numbering plan"; break;
-       case 11: str = "Reserved for CTS (see 3GPP TS 44.056)"; break;
-       case 15: str = "Reserved for extension"; break;
-       default:
-           str = "Reserved";
+       case TCAP_COMP_INVOKE:
+           saved_offset = asn1->offset;
+           asn1_id_decode1(asn1, &tag);
+
+           if (tag == TCAP_LINKED_ID_TAG)
+           {
+               GSM_A_TC_START_SUBTREE(subtree, saved_offset, tag, "Linked ID",
+                   ett_tc_linked_id, &def_len[1], &temp_len, temp_subtree);
+
+               if (temp_len > 0)
+               {
+                   saved_offset = asn1->offset;
+                   asn1_int32_value_decode(asn1, temp_len, &int_val);
+
+                   proto_tree_add_text(temp_subtree, asn1->tvb,
+                       saved_offset, temp_len, "Linked ID: %d", int_val);
+               }
+
+               if (!def_len[1])
+               {
+                   saved_offset = asn1->offset;
+                   asn1_eoc_decode(asn1, -1);
+
+                   proto_tree_add_text(subtree, asn1->tvb,
+                       saved_offset, asn1->offset - saved_offset, "End of Contents");
+               }
+
+               saved_offset = asn1->offset;
+               asn1_id_decode1(asn1, &tag);
+           }
+
+           GSM_A_TC_START_SUBTREE(subtree, saved_offset, tag, "Operation Code",
+               ett_tc_opr_code, &def_len[1], &temp_len, temp_subtree);
+
+           if (temp_len > 0)
+           {
+               saved_offset = asn1->offset;
+               asn1_int32_value_decode(asn1, temp_len, &int_val);
+
+               str = match_strval(int_val, gsm_ss_opr_code_strings);
+
+               proto_tree_add_text(temp_subtree, asn1->tvb,
+                   saved_offset, temp_len, "Operation Code: %s (%d)",
+                   (str == NULL) ? "Unknown Operation Code" : str,
+                   int_val);
+           }
+
+           if (!def_len[1])
+           {
+               saved_offset = asn1->offset;
+               asn1_eoc_decode(asn1, -1);
+
+               proto_tree_add_text(subtree, asn1->tvb,
+                   saved_offset, asn1->offset - saved_offset, "End of Contents");
+           }
+
+           if ((comp_len - (asn1->offset - comp_data_offset)) > 0)
+           {
+               gsm_ss_dissect(asn1, subtree,
+                   comp_len - (asn1->offset - comp_data_offset), int_val, comp_tag);
+           }
            break;
-       }
-    }
-    else
-    {
-       str = "not applicable";
-    }
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
-    proto_tree_add_text(tree,
-       tvb, curr_offset, 1,
-       "%s :  Numbering plan identification: %s",
-       a_bigbuf,
-       str);
+       case TCAP_COMP_RRL:
+           if ((len - (asn1->offset - offset)) > 0)
+           {
+               saved_offset = asn1->offset;
+               asn1_id_decode1(asn1, &tag);
 
-    curr_offset++;
+               GSM_A_TC_START_SUBTREE(subtree, saved_offset, tag, "Sequence",
+                   ett_tc_sequence, &def_len[1], &temp_len, seq_subtree);
 
-    oct = tvb_get_guint8(tvb, curr_offset);
+               saved_offset = asn1->offset;
+               asn1_id_decode1(asn1, &tag);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
-    proto_tree_add_text(tree,
-       tvb, curr_offset, 1,
-       "%s :  Extension",
-       a_bigbuf);
+               GSM_A_TC_START_SUBTREE(seq_subtree, saved_offset, tag, "Operation Code",
+                   ett_tc_opr_code, &def_len[2], &temp_len, temp_subtree);
 
-    switch ((oct & 0x60) >> 5)
-    {
-    case 0: str = "Presentation allowed"; break;
-    case 1: str = "Presentation restricted"; break;
-    case 2: str = "Number not available due to interworking"; break;
-    default:
-       str = "Reserved";
-       break;
-    }
+               if (temp_len > 0)
+               {
+                   saved_offset = asn1->offset;
+                   asn1_int32_value_decode(asn1, temp_len, &int_val);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x60, 8);
-    proto_tree_add_text(tree,
-       tvb, curr_offset, 1,
-       "%s :  Presentation indicator: %s",
-       a_bigbuf,
-       str);
+                   str = match_strval(int_val, gsm_ss_opr_code_strings);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x1c, 8);
-    proto_tree_add_text(tree,
-       tvb, curr_offset, 1,
-       "%s :  Spare",
-       a_bigbuf);
+                   proto_tree_add_text(temp_subtree, asn1->tvb,
+                       saved_offset, temp_len, "Operation Code: %s (%d)",
+                       (str == NULL) ? "Unknown Operation Code" : str,
+                       int_val);
+               }
 
-    switch (oct & 0x03)
-    {
-    case 0: str = "User-provided, not screened"; break;
-    case 1: str = "User-provided, verified and passed"; break;
-    case 2: str = "User-provided, verified and failed"; break;
-    default:
-       str = "Network provided";
-       break;
-    }
+               if (!def_len[2])
+               {
+                   saved_offset = asn1->offset;
+                   asn1_eoc_decode(asn1, -1);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x03, 8);
-    proto_tree_add_text(tree,
-       tvb, curr_offset, 1,
-       "%s :  Screening indicator: %s",
-       a_bigbuf,
-       str);
+                   proto_tree_add_text(subtree, asn1->tvb,
+                       saved_offset, asn1->offset - saved_offset, "End of Contents");
+               }
+
+               if ((comp_len - (asn1->offset - comp_data_offset)) > 0)
+               {
+                   gsm_ss_dissect(asn1, seq_subtree,
+                       comp_len - (asn1->offset - comp_data_offset), int_val, comp_tag);
+               }
+
+               if (!def_len[1])
+               {
+                   saved_offset = asn1->offset;
+                   asn1_eoc_decode(asn1, -1);
+
+                   proto_tree_add_text(subtree, asn1->tvb,
+                       saved_offset, asn1->offset - saved_offset, "End of Contents");
+               }
+           }
+           break;
+
+       case TCAP_COMP_RE:
+           saved_offset = asn1->offset;
+           asn1_id_decode1(asn1, &tag);
+
+           GSM_A_TC_START_SUBTREE(subtree, saved_offset, tag, "Error Code",
+               ett_tc_err_code, &def_len[1], &temp_len, temp_subtree);
+
+           if (temp_len > 0)
+           {
+               proto_tree_add_text(temp_subtree, asn1->tvb,
+                   asn1->offset, temp_len, "Error Code");
+
+               asn1->offset += temp_len;
+           }
+
+           if (!def_len[1])
+           {
+               saved_offset = asn1->offset;
+               asn1_eoc_decode(asn1, -1);
+
+               proto_tree_add_text(subtree, asn1->tvb,
+                   saved_offset, asn1->offset - saved_offset, "End of Contents");
+           }
+
+           if ((comp_len - (asn1->offset - comp_data_offset)) > 0)
+           {
+               /*
+                * XXX need conversations to determine 'opr_code'
+                */
+               gsm_ss_dissect(asn1, subtree,
+                   comp_len - (asn1->offset - comp_data_offset), 0, comp_tag);
+           }
+           break;
 
-    curr_offset++;
+       case TCAP_COMP_REJECT:
+           saved_offset = asn1->offset;
+           asn1_id_decode1(asn1, &tag);
 
-    NO_MORE_DATA_CHECK(len);
+           GSM_A_TC_START_SUBTREE(subtree, saved_offset, tag, "Problem Code",
+               ett_tc_prob_code, &def_len[1], &temp_len, temp_subtree);
 
-    poctets = tvb_get_string(tvb, curr_offset, len - (curr_offset - offset));
+           if (temp_len > 0)
+           {
+               proto_tree_add_text(temp_subtree, asn1->tvb,
+                   asn1->offset, temp_len, "Problem Code");
 
-    my_dgt_tbcd_unpack(a_bigbuf, poctets, len - (curr_offset - offset),
-       &Dgt_mbcd);
-    g_free(poctets);
+               asn1->offset += temp_len;
+           }
 
-    proto_tree_add_string_format(tree, hf_gsm_a_clg_party_bcd_num,
-       tvb, curr_offset, len - (curr_offset - offset),
-       a_bigbuf,
-       "BCD Digits: %s",
-       a_bigbuf);
+           if (!def_len[1])
+           {
+               saved_offset = asn1->offset;
+               asn1_eoc_decode(asn1, -1);
 
-    curr_offset += len - (curr_offset - offset);
+               proto_tree_add_text(subtree, asn1->tvb,
+                   saved_offset, asn1->offset - saved_offset, "End of Contents");
+           }
+           break;
+       }
 
-    sprintf(add_string, " - (%s)", a_bigbuf);
+       if (!def_len[0])
+       {
+           saved_offset = asn1->offset;
+           asn1_eoc_decode(asn1, -1);
 
-    EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+           proto_tree_add_text(subtree, asn1->tvb,
+               saved_offset, asn1->offset - saved_offset, "End of Contents");
+       }
+    }
 
-    return(curr_offset - offset);
+    return(len);
 }
 
 /*
- * [3] 10.5.4.10
+ * [3] 10.5.4.17
  */
 static guint8
-de_clg_party_sub_addr(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
+de_keypad_facility(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
 {
     guint8     oct;
     guint32    curr_offset;
-    gchar      *str;
 
-    add_string = add_string;
+    len = len;
     curr_offset = offset;
 
     oct = tvb_get_guint8(tvb, curr_offset);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
-       "%s :  Extension",
+       "%s :  Spare",
        a_bigbuf);
 
-    switch ((oct & 0x70) >> 4)
-    {
-    case 0: str = "NSAP (X.213/ISO 8348 AD2)"; break;
-    case 2: str = "User specified"; break;
-    default:
-       str = "Reserved";
-       break;
-    }
-
-    my_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
-    proto_tree_add_text(tree,
-       tvb, curr_offset, 1,
-       "%s :  Type of subaddress: %s",
-       a_bigbuf,
-       str);
-
-    my_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x7f, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
-       "%s :  Odd/Even indicator: %s",
+       "%s :  Keypad information: %c",
        a_bigbuf,
-       (oct & 0x08) ?
-           "odd number of address signals" : "even number of address signals");
-
-    my_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
-    proto_tree_add_text(tree,
-       tvb, curr_offset, 1,
-       "%s :  Spare",
-       a_bigbuf);
+       oct & 0x7f);
 
     curr_offset++;
 
-    NO_MORE_DATA_CHECK(len);
-
-    proto_tree_add_text(tree,
-       tvb, curr_offset, len - (curr_offset - offset),
-       "Subaddress information");
-
-    curr_offset += len - (curr_offset - offset);
+    sprintf(add_string, " - %c", oct & 0x7f);
 
-    EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+    /* no length check possible */
 
     return(curr_offset - offset);
 }
 
 /*
- * [3] 10.5.4.11
+ * [3] 10.5.4.21
  */
 static guint8
-de_cause(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
+de_prog_ind(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
 {
     guint8     oct;
-    guint8     cause;
     guint32    curr_offset;
     gchar      *str;
 
+    len = len;
     curr_offset = offset;
 
     oct = tvb_get_guint8(tvb, curr_offset);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Extension: %s",
        a_bigbuf,
-       (oct & 0x80) ? "not extended" : "extended");
+       (oct & 0x80) ? "extended" : "not extended");
 
     switch ((oct & 0x60) >> 5)
     {
@@ -4719,14 +6338,14 @@ de_cause(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_
        break;
     }
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x60, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x60, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Coding standard: %s",
        a_bigbuf,
        str);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x10, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x10, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Spare",
@@ -4737,17 +6356,15 @@ de_cause(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_
     case 0: str = "User"; break;
     case 1: str = "Private network serving the local user"; break;
     case 2: str = "Public network serving the local user"; break;
-    case 3: str = "Transit network"; break;
     case 4: str = "Public network serving the remote user"; break;
     case 5: str = "Private network serving the remote user"; break;
-    case 7: str = "International network"; break;
     case 10: str = "Network beyond interworking point"; break;
     default:
        str = "Reserved";
        break;
     }
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Location: %s",
@@ -4758,162 +6375,40 @@ de_cause(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_
 
     oct = tvb_get_guint8(tvb, curr_offset);
 
-    if (!(oct & 0x80))
-    {
-       my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
-       proto_tree_add_text(tree,
-           tvb, curr_offset, 1,
-           "%s :  Extension",
-           a_bigbuf);
-
-       my_decode_bitfield_value(a_bigbuf, oct, 0x7f, 8);
-       proto_tree_add_text(tree,
-           tvb, curr_offset, 1,
-           "%s :  Recommendation",
-           a_bigbuf);
-
-       curr_offset++;
-
-       oct = tvb_get_guint8(tvb, curr_offset);
-    }
-
-    my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
-    proto_tree_add_text(tree,
-       tvb, curr_offset, 1,
-       "%s :  Extension",
-       a_bigbuf);
-
-    cause = oct & 0x7f;
-    switch (cause)
-    {
-    case 1: str = "Unassigned (unallocated) number"; break;
-    case 3: str = "No route to destination"; break;
-    case 6: str = "Channel unacceptable"; break;
-    case 8: str = "Operator determined barring"; break;
-    case 16: str = "Normal call clearing"; break;
-    case 17: str = "User busy"; break;
-    case 18: str = "No user responding"; break;
-    case 19: str = "User alerting, no answer"; break;
-    case 21: str = "Call rejected"; break;
-    case 22: str = "Number changed"; break;
-    case 25: str = "Pre-emption"; break;
-    case 26: str = "Non selected user clearing"; break;
-    case 27: str = "Destination out of order"; break;
-    case 28: str = "Invalid number format (incomplete number)"; break;
-    case 29: str = "Facility rejected"; break;
-    case 30: str = "Response to STATUS ENQUIRY"; break;
-    case 31: str = "Normal, unspecified"; break;
-    case 34: str = "No circuit/channel available"; break;
-    case 38: str = "Network out of order"; break;
-    case 41: str = "Temporary failure"; break;
-    case 42: str = "Switching equipment congestion"; break;
-    case 43: str = "Access information discarded"; break;
-    case 44: str = "requested circuit/channel not available"; break;
-    case 47: str = "Resources unavailable, unspecified"; break;
-    case 49: str = "Quality of service unavailable"; break;
-    case 50: str = "Requested facility not subscribed"; break;
-    case 55: str = "Incoming calls barred within the CUG"; break;
-    case 57: str = "Bearer capability not authorized"; break;
-    case 58: str = "Bearer capability not presently available"; break;
-    case 63: str = "Service or option not available, unspecified"; break;
-    case 65: str = "Bearer service not implemented"; break;
-    case 68: str = "ACM equal to or greater than ACMmax"; break;
-    case 69: str = "Requested facility not implemented"; break;
-    case 70: str = "Only restricted digital information bearer capability is available"; break;
-    case 79: str = "Service or option not implemented, unspecified"; break;
-    case 81: str = "Invalid transaction identifier value"; break;
-    case 87: str = "User not member of CUG"; break;
-    case 88: str = "Incompatible destination"; break;
-    case 91: str = "Invalid transit network selection"; break;
-    case 95: str = "Semantically incorrect message"; break;
-    case 96: str = "Invalid mandatory information"; break;
-    case 97: str = "Message type non-existent or not implemented"; break;
-    case 98: str = "Message type not compatible with protocol state"; break;
-    case 99: str = "Information element non-existent or not implemented"; break;
-    case 100: str = "Conditional IE error"; break;
-    case 101: str = "Message not compatible with protocol state"; break;
-    case 102: str = "Recovery on timer expiry"; break;
-    case 111: str = "Protocol error, unspecified"; break;
-    case 127: str = "Interworking, unspecified"; break;
-    default:
-       if (cause <= 31) { str = "Treat as Normal, unspecified"; }
-       else if ((cause >= 32) && (cause <= 47)) { str = "Treat as Resources unavailable, unspecified"; }
-       else if ((cause >= 48) && (cause <= 63)) { str = "Treat as Service or option not available, unspecified"; }
-       else if ((cause >= 64) && (cause <= 79)) { str = "Treat as Service or option not implemented, unspecified"; }
-       else if ((cause >= 80) && (cause <= 95)) { str = "Treat as Semantically incorrect message"; }
-       else if ((cause >= 96) && (cause <= 111)) { str = "Treat as Protocol error, unspecified"; }
-       else if ((cause >= 112) && (cause <= 127)) { str = "Treat as Interworking, unspecified"; }
-       break;
-    }
-
-    my_decode_bitfield_value(a_bigbuf, oct, 0x7f, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
-       "%s :  Cause: (%d) %s",
+       "%s :  Extension: %s",
        a_bigbuf,
-       cause,
-       str);
-
-    curr_offset++;
-
-    sprintf(add_string, " - (%d) %s", cause, str);
-
-    NO_MORE_DATA_CHECK(len);
-
-    proto_tree_add_text(tree,
-       tvb, curr_offset, len - (curr_offset - offset),
-       "Diagnostics");
-
-    curr_offset += len - (curr_offset - offset);
-
-    EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
-
-    return(curr_offset - offset);
-}
-
-/*
- * [3] 10.5.4.17
- */
-static guint8
-de_keypad_facility(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
-{
-    guint8     oct;
-    guint32    curr_offset;
-    gchar      *str;
-
-    len = len;
-    curr_offset = offset;
-
-    oct = tvb_get_guint8(tvb, curr_offset);
-
-    my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
-    proto_tree_add_text(tree,
-       tvb, curr_offset, 1,
-       "%s :  Spare",
-       a_bigbuf);
+       (oct & 0x80) ? "extended" : "not extended");
 
-    switch ((oct & 0x60) >> 5)
+    switch (oct & 0x7f)
     {
-    case 0: str = "Coding as specified in ITU-T Rec. Q.931"; break;
-    case 1: str = "Reserved for other international standards"; break;
-    case 2: str = "National standard"; break;
+    case 1: str = "Call is not end-to-end PLMN/ISDN, further call progress information may be available in-band"; break;
+    case 2: str = "Destination address in non-PLMN/ISDN"; break;
+    case 3: str = "Origination address in non-PLMN/ISDN"; break;
+    case 4: str = "Call has returned to the PLMN/ISDN"; break;
+    case 8: str = "In-band information or appropriate pattern now available"; break;
+    case 32: str = "Call is end-to-end PLMN/ISDN"; break;
+    case 64: str = "Queueing"; break;
     default:
-       str = "Standard defined for the GSM PLMNS";
+       str = "Unspecific";
        break;
     }
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x7f, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x7f, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
-       "%s :  Keypad information: %c",
+       "%s :  Progress Description: %s (%d)",
        a_bigbuf,
+       str,
        oct & 0x7f);
 
-    curr_offset++;
+    sprintf(add_string, " - %d", oct & 0x7f);
 
-    sprintf(add_string, " - %c", oct & 0x7f);
+    curr_offset++;
 
-    /* no length check possible */
+    EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
 
     return(curr_offset - offset);
 }
@@ -4944,7 +6439,7 @@ de_repeat_ind(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar
        break;
     }
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  %s",
@@ -5056,13 +6551,13 @@ de_cp_cause(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *a
 
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
-       "Cause: (%d) %s",
+       "Cause: (%u) %s",
        oct,
        str);
 
     curr_offset++;
 
-    sprintf(add_string, " - (%d) %s", oct, str);
+    sprintf(add_string, " - (%u) %s", oct, str);
 
     /* no length check possible */
 
@@ -5086,7 +6581,7 @@ de_rp_message_ref(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gc
 
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
-       "RP-Message Reference: 0x%02x (%d)",
+       "RP-Message Reference: 0x%02x (%u)",
        oct,
        oct);
 
@@ -5135,7 +6630,7 @@ de_rp_user_data(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gcha
      */
     tpdu_tvb = tvb_new_subset(tvb, curr_offset, len, len);
 
-    dissector_try_port(sms_dissector_table, gsm_a_rp_type, tpdu_tvb, g_pinfo, g_tree);
+    dissector_try_port(sms_dissector_table, 0, tpdu_tvb, g_pinfo, g_tree);
 
     curr_offset += len;
 
@@ -5158,7 +6653,7 @@ de_rp_cause(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *a
 
     oct = tvb_get_guint8(tvb, curr_offset);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Extension: %s",
@@ -5196,17 +6691,17 @@ de_rp_cause(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *a
        break;
     }
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x7f, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x7f, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
-       "%s :  Cause: (%d) %s",
+       "%s :  Cause: (%u) %s",
        a_bigbuf,
        oct & 0x7f,
        str);
 
     curr_offset++;
 
-    sprintf(add_string, " - (%d) %s", oct & 0x7f, str);
+    sprintf(add_string, " - (%u) %s", oct & 0x7f, str);
 
     NO_MORE_DATA_CHECK(len);
 
@@ -5336,7 +6831,7 @@ static guint8 (*dtap_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset
     de_day_saving_time,        /* Daylight Saving Time */
     /* Call Control Information Elements 10.5.4 */
     de_aux_states,     /* Auxiliary States */
-    NULL,      /* Bearer Capability */
+    de_bearer_cap,     /* Bearer Capability */
     de_cc_cap, /* Call Control Capabilities */
     de_call_state,     /* Call State */
     de_cld_party_bcd_num,      /* Called Party BCD Number */
@@ -5349,13 +6844,13 @@ static guint8 (*dtap_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset
     NULL /* handled inline */, /* Congestion Level */
     NULL,      /* Connected Number */
     NULL,      /* Connected Subaddress */
-    NULL,      /* Facility */
+    de_facility,       /* Facility */
     NULL,      /* High Layer Compatibility */
     de_keypad_facility,        /* Keypad Facility */
     NULL,      /* Low Layer Compatibility */
     NULL,      /* More Data */
     NULL,      /* Notification Indicator */
-    NULL,      /* Progress Indicator */
+    de_prog_ind,       /* Progress Indicator */
     NULL,      /* Recall type $(CCBS)$ */
     NULL,      /* Redirecting Party BCD Number */
     NULL,      /* Redirecting Party Subaddress */
@@ -5439,7 +6934,7 @@ static guint8 (*dtap_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset
     default: \
        proto_tree_add_text(tree, \
            tvb, curr_offset, -1, \
-           "Unknown PDU type (%d)", SEV_pdu_type); \
+           "Unknown PDU type (%u)", SEV_pdu_type); \
        return(consumed); \
     }
 
@@ -5624,7 +7119,7 @@ elem_tv_short(tvbuff_t *tvb, proto_tree *tree, guint8 iei, gint pdu_type, int id
 
        subtree = proto_item_add_subtree(item, elem_ett[idx]);
 
-       my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+       other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
        proto_tree_add_text(subtree,
            tvb, curr_offset, 1,
            "%s :  Element ID",
@@ -5798,7 +7293,7 @@ elem_v(tvbuff_t *tvb, proto_tree *tree, gint pdu_type, int idx, guint32 offset)
 
 #define ELEM_MAND_TLV(EMT_iei, EMT_pdu_type, EMT_elem_idx, EMT_elem_name_addition) \
 {\
-    if ((consumed = elem_tlv(tvb, tree, EMT_iei, EMT_pdu_type, EMT_elem_idx, curr_offset, curr_len, EMT_elem_name_addition)) > 0) \
+    if ((consumed = elem_tlv(tvb, tree, (guint8) EMT_iei, EMT_pdu_type, EMT_elem_idx, curr_offset, curr_len, EMT_elem_name_addition)) > 0) \
     { \
        curr_offset += consumed; \
        curr_len -= consumed; \
@@ -5819,7 +7314,7 @@ elem_v(tvbuff_t *tvb, proto_tree *tree, gint pdu_type, int idx, guint32 offset)
 
 #define ELEM_OPT_TLV(EOT_iei, EOT_pdu_type, EOT_elem_idx, EOT_elem_name_addition) \
 {\
-    if ((consumed = elem_tlv(tvb, tree, EOT_iei, EOT_pdu_type, EOT_elem_idx, curr_offset, curr_len, EOT_elem_name_addition)) > 0) \
+    if ((consumed = elem_tlv(tvb, tree, (guint8) EOT_iei, EOT_pdu_type, EOT_elem_idx, curr_offset, curr_len, EOT_elem_name_addition)) > 0) \
     { \
        curr_offset += consumed; \
        curr_len -= consumed; \
@@ -5829,7 +7324,7 @@ elem_v(tvbuff_t *tvb, proto_tree *tree, gint pdu_type, int idx, guint32 offset)
 
 #define ELEM_MAND_TV(EMT_iei, EMT_pdu_type, EMT_elem_idx, EMT_elem_name_addition) \
 {\
-    if ((consumed = elem_tv(tvb, tree, EMT_iei, EMT_pdu_type, EMT_elem_idx, curr_offset, EMT_elem_name_addition)) > 0) \
+    if ((consumed = elem_tv(tvb, tree, (guint8) EMT_iei, EMT_pdu_type, EMT_elem_idx, curr_offset, EMT_elem_name_addition)) > 0) \
     { \
        curr_offset += consumed; \
        curr_len -= consumed; \
@@ -5850,7 +7345,7 @@ elem_v(tvbuff_t *tvb, proto_tree *tree, gint pdu_type, int idx, guint32 offset)
 
 #define ELEM_OPT_TV(EOT_iei, EOT_pdu_type, EOT_elem_idx, EOT_elem_name_addition) \
 {\
-    if ((consumed = elem_tv(tvb, tree, EOT_iei, EOT_pdu_type, EOT_elem_idx, curr_offset, EOT_elem_name_addition)) > 0) \
+    if ((consumed = elem_tv(tvb, tree, (guint8) EOT_iei, EOT_pdu_type, EOT_elem_idx, curr_offset, EOT_elem_name_addition)) > 0) \
     { \
        curr_offset += consumed; \
        curr_len -= consumed; \
@@ -5870,7 +7365,7 @@ elem_v(tvbuff_t *tvb, proto_tree *tree, gint pdu_type, int idx, guint32 offset)
 
 #define ELEM_OPT_T(EOT_iei, EOT_pdu_type, EOT_elem_idx, EOT_elem_name_addition) \
 {\
-    if ((consumed = elem_t(tvb, tree, EOT_iei, EOT_pdu_type, EOT_elem_idx, curr_offset, EOT_elem_name_addition)) > 0) \
+    if ((consumed = elem_t(tvb, tree, (guint8) EOT_iei, EOT_pdu_type, EOT_elem_idx, curr_offset, EOT_elem_name_addition)) > 0) \
     { \
        curr_offset += consumed; \
        curr_len -= consumed; \
@@ -6919,7 +8414,7 @@ bssmap_conn_oriented(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
     EXTRANEOUS_DATA_CHECK(curr_len, 0);
 }
 
-#define        NUM_GSM_BSSMAP_MSG (sizeof(gsm_bssmap_msg_strings)/sizeof(value_string))
+#define        NUM_GSM_BSSMAP_MSG (sizeof(gsm_a_bssmap_msg_strings)/sizeof(value_string))
 static gint ett_gsm_bssmap_msg[NUM_GSM_BSSMAP_MSG];
 static void (*bssmap_msg_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len) = {
     bssmap_ass_req,    /* Assignment Request */
@@ -7022,7 +8517,7 @@ dtap_mm_auth_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
      */
     oct = tvb_get_guint8(tvb, curr_offset);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Spare",
@@ -7035,13 +8530,13 @@ dtap_mm_auth_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
 
     subtree = proto_item_add_subtree(item, ett_gsm_dtap_elem[DE_CIPH_KEY_SEQ_NUM]);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
     proto_tree_add_text(subtree,
        tvb, curr_offset, 1,
        "%s :  Spare",
        a_bigbuf);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
 
     switch (oct & 0x07)
     {
@@ -7055,7 +8550,7 @@ dtap_mm_auth_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
     default:
        proto_tree_add_text(subtree,
            tvb, curr_offset, 1,
-           "%s :  Ciphering Key Sequence Number: %d",
+           "%s :  Ciphering Key Sequence Number: %u",
            a_bigbuf,
            oct & 0x07);
        break;
@@ -7140,7 +8635,7 @@ dtap_mm_cm_reestab_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint le
      */
     oct = tvb_get_guint8(tvb, curr_offset);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Spare",
@@ -7153,13 +8648,13 @@ dtap_mm_cm_reestab_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint le
 
     subtree = proto_item_add_subtree(item, ett_gsm_dtap_elem[DE_CIPH_KEY_SEQ_NUM]);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
     proto_tree_add_text(subtree,
        tvb, curr_offset, 1,
        "%s :  Spare",
        a_bigbuf);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
 
     switch (oct & 0x07)
     {
@@ -7173,7 +8668,7 @@ dtap_mm_cm_reestab_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint le
     default:
        proto_tree_add_text(subtree,
            tvb, curr_offset, 1,
-           "%s :  Ciphering Key Sequence Number: %d",
+           "%s :  Ciphering Key Sequence Number: %u",
            a_bigbuf,
            oct & 0x07);
        break;
@@ -7284,13 +8779,13 @@ dtap_mm_cm_srvc_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
 
     subtree = proto_item_add_subtree(item, ett_gsm_dtap_elem[DE_CIPH_KEY_SEQ_NUM]);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
     proto_tree_add_text(subtree,
        tvb, curr_offset, 1,
        "%s :  Spare",
        a_bigbuf);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
 
     switch ((oct & 0x70) >> 4)
     {
@@ -7304,7 +8799,7 @@ dtap_mm_cm_srvc_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
     default:
        proto_tree_add_text(subtree,
            tvb, curr_offset, 1,
-           "%s :  Ciphering Key Sequence Number: %d",
+           "%s :  Ciphering Key Sequence Number: %u",
            a_bigbuf,
            (oct & 0x70) >> 4);
        break;
@@ -7331,10 +8826,10 @@ dtap_mm_cm_srvc_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
        break;
     }
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
     proto_tree_add_text(subtree,
        tvb, curr_offset, 1,
-       "%s :  Service Type: (%d) %s",
+       "%s :  Service Type: (%u) %s",
        a_bigbuf,
        oct & 0x0f,
        str);
@@ -7376,7 +8871,7 @@ dtap_mm_id_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
      */
     oct = tvb_get_guint8(tvb, curr_offset);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Spare",
@@ -7389,7 +8884,7 @@ dtap_mm_id_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
 
     subtree = proto_item_add_subtree(item, ett_gsm_dtap_elem[DE_ID_TYPE]);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
     proto_tree_add_text(subtree,
        tvb, curr_offset, 1,
        "%s :  Spare",
@@ -7406,7 +8901,7 @@ dtap_mm_id_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
        break;
     }
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
     proto_tree_add_text(subtree,
        tvb, curr_offset, 1,
        "%s :  Type of identity: %s",
@@ -7540,13 +9035,13 @@ dtap_mm_loc_upd_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
 
     subtree = proto_item_add_subtree(item, ett_gsm_dtap_elem[DE_CIPH_KEY_SEQ_NUM]);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
     proto_tree_add_text(subtree,
        tvb, curr_offset, 1,
        "%s :  Spare",
        a_bigbuf);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
 
     switch ((oct & 0x70) >> 4)
     {
@@ -7560,7 +9055,7 @@ dtap_mm_loc_upd_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
     default:
        proto_tree_add_text(subtree,
            tvb, curr_offset, 1,
-           "%s :  Ciphering Key Sequence Number: %d",
+           "%s :  Ciphering Key Sequence Number: %u",
            a_bigbuf,
            (oct & 0x70) >> 4);
        break;
@@ -7573,14 +9068,14 @@ dtap_mm_loc_upd_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
 
     subtree = proto_item_add_subtree(item, ett_gsm_dtap_elem[DE_LOC_UPD_TYPE]);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
     proto_tree_add_text(subtree,
        tvb, curr_offset, 1,
        "%s :  Follow-On Request (FOR): %s",
        a_bigbuf,
        (oct & 0x08) ? "Follow-on request pending" : "No follow-on request pending");
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x04, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x04, 8);
     proto_tree_add_text(subtree,
        tvb, curr_offset, 1,
        "%s :  Spare",
@@ -7596,7 +9091,7 @@ dtap_mm_loc_upd_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
        break;
     }
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x03, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x03, 8);
     proto_tree_add_text(subtree,
        tvb, curr_offset, 1,
        "%s :  Updating Type: %s",
@@ -7716,7 +9211,7 @@ dtap_rr_paging_resp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
      */
     oct = tvb_get_guint8(tvb, curr_offset);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Spare",
@@ -7729,13 +9224,13 @@ dtap_rr_paging_resp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
 
     subtree = proto_item_add_subtree(item, ett_gsm_dtap_elem[DE_CIPH_KEY_SEQ_NUM]);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
     proto_tree_add_text(subtree,
        tvb, curr_offset, 1,
        "%s :  Spare",
        a_bigbuf);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
 
     switch (oct & 0x07)
     {
@@ -7749,7 +9244,7 @@ dtap_rr_paging_resp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
     default:
        proto_tree_add_text(subtree,
            tvb, curr_offset, 1,
-           "%s :  Ciphering Key Sequence Number: %d",
+           "%s :  Ciphering Key Sequence Number: %u",
            a_bigbuf,
            oct & 0x07);
        break;
@@ -7903,7 +9398,7 @@ dtap_cc_congestion_control(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guin
      */
     oct = tvb_get_guint8(tvb, curr_offset);
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
     proto_tree_add_text(tree,
        tvb, curr_offset, 1,
        "%s :  Spare",
@@ -7925,7 +9420,7 @@ dtap_cc_congestion_control(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guin
        break;
     }
 
-    my_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+    other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
     proto_tree_add_text(subtree,
        tvb, curr_offset, 1,
        "%s :  Congestion level: %s",
@@ -8790,7 +10285,7 @@ rp_error_ms_n(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
     EXTRANEOUS_DATA_CHECK(curr_len, 0);
 }
 
-#define        NUM_GSM_DTAP_MSG_MM (sizeof(gsm_dtap_msg_mm_strings)/sizeof(value_string))
+#define        NUM_GSM_DTAP_MSG_MM (sizeof(gsm_a_dtap_msg_mm_strings)/sizeof(value_string))
 static gint ett_gsm_dtap_msg_mm[NUM_GSM_DTAP_MSG_MM];
 static void (*dtap_msg_mm_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len) = {
     dtap_mm_imsi_det_ind,      /* IMSI Detach Indication */
@@ -8819,7 +10314,7 @@ static void (*dtap_msg_mm_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset
     NULL,      /* NONE */
 };
 
-#define        NUM_GSM_DTAP_MSG_RR (sizeof(gsm_dtap_msg_rr_strings)/sizeof(value_string))
+#define        NUM_GSM_DTAP_MSG_RR (sizeof(gsm_a_dtap_msg_rr_strings)/sizeof(value_string))
 static gint ett_gsm_dtap_msg_rr[NUM_GSM_DTAP_MSG_RR];
 static void (*dtap_msg_rr_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len) = {
     NULL,      /* RR Initialisation Request */
@@ -8919,7 +10414,7 @@ static void (*dtap_msg_rr_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset
     NULL,      /* NONE */
 };
 
-#define        NUM_GSM_DTAP_MSG_CC (sizeof(gsm_dtap_msg_cc_strings)/sizeof(value_string))
+#define        NUM_GSM_DTAP_MSG_CC (sizeof(gsm_a_dtap_msg_cc_strings)/sizeof(value_string))
 static gint ett_gsm_dtap_msg_cc[NUM_GSM_DTAP_MSG_CC];
 static void (*dtap_msg_cc_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len) = {
     dtap_cc_alerting,  /* Alerting */
@@ -8960,7 +10455,7 @@ static void (*dtap_msg_cc_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset
     NULL,      /* NONE */
 };
 
-#define        NUM_GSM_DTAP_MSG_GMM (sizeof(gsm_dtap_msg_gmm_strings)/sizeof(value_string))
+#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) = {
     NULL,      /* Attach Request */
@@ -8989,7 +10484,7 @@ static void (*dtap_msg_gmm_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offse
     NULL,      /* NONE */
 };
 
-#define        NUM_GSM_DTAP_MSG_SMS (sizeof(gsm_dtap_msg_sms_strings)/sizeof(value_string))
+#define        NUM_GSM_DTAP_MSG_SMS (sizeof(gsm_a_dtap_msg_sms_strings)/sizeof(value_string))
 static gint ett_gsm_dtap_msg_sms[NUM_GSM_DTAP_MSG_SMS];
 static void (*dtap_msg_sms_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len) = {
     dtap_sms_cp_data,  /* CP-DATA */
@@ -8998,7 +10493,7 @@ static void (*dtap_msg_sms_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offse
     NULL,      /* NONE */
 };
 
-#define        NUM_GSM_DTAP_MSG_SM (sizeof(gsm_dtap_msg_sm_strings)/sizeof(value_string))
+#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) = {
     NULL,      /* Activate PDP Context Request */
@@ -9025,7 +10520,7 @@ static void (*dtap_msg_sm_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset
     NULL,      /* NONE */
 };
 
-#define        NUM_GSM_DTAP_MSG_SS (sizeof(gsm_dtap_msg_ss_strings)/sizeof(value_string))
+#define        NUM_GSM_DTAP_MSG_SS (sizeof(gsm_a_dtap_msg_ss_strings)/sizeof(value_string))
 static gint ett_gsm_dtap_msg_ss[NUM_GSM_DTAP_MSG_SS];
 static void (*dtap_msg_ss_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len) = {
     dtap_cc_release_complete,  /* Release Complete */
@@ -9061,12 +10556,6 @@ dissect_rp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
     gchar      *str;
 
 
-    if (!proto_is_protocol_enabled(proto_a_rp))
-    {
-       call_dissector(data_handle, tvb, pinfo, tree);
-       return;
-    }
-
     if (check_col(pinfo->cinfo, COL_INFO))
     {
        col_append_str(pinfo->cinfo, COL_INFO, "(RP) ");
@@ -9110,8 +10599,6 @@ dissect_rp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
     }
     else
     {
-       gsm_a_rp_type = oct;
-
        rp_item =
            proto_tree_add_protocol_format(tree, proto_a_rp, tvb, 0, -1,
                "GSM A-I/F RP - %s",
@@ -9154,6 +10641,9 @@ dissect_rp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
 static void
 dissect_bssmap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
 {
+    static gsm_a_tap_rec_t     tap_rec[4];
+    static gsm_a_tap_rec_t     *tap_p;
+    static int                 tap_current=0;
     guint8     oct;
     guint32    offset, saved_offset;
     guint32    len;
@@ -9163,25 +10653,21 @@ dissect_bssmap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
     gchar      *str;
 
 
-    if (!proto_is_protocol_enabled(proto_a_bssmap))
-    {
-       call_dissector(data_handle, tvb, pinfo, tree);
-       return;
-    }
-
     if (check_col(pinfo->cinfo, COL_INFO))
     {
        col_append_str(pinfo->cinfo, COL_INFO, "(BSSMAP) ");
     }
 
     /*
-     * In the interest of speed, if "tree" is NULL, don't do any work
-     * not necessary to generate protocol tree items.
+     * set tap record pointer
      */
-    if (!tree)
+    tap_current++;
+    if (tap_current == 4)
     {
-       return;
+       tap_current = 0;
     }
+    tap_p = &tap_rec[tap_current];
+
 
     offset = 0;
     saved_offset = offset;
@@ -9196,7 +10682,7 @@ dissect_bssmap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
      */
     oct = tvb_get_guint8(tvb, offset++);
 
-    str = my_match_strval((guint32) oct, gsm_bssmap_msg_strings, &idx);
+    str = my_match_strval((guint32) oct, gsm_a_bssmap_msg_strings, &idx);
 
     /*
      * create the protocol tree
@@ -9231,6 +10717,11 @@ dissect_bssmap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
     proto_tree_add_uint_format(bssmap_tree, hf_gsm_a_bssmap_msg_type,
        tvb, saved_offset, 1, oct, "Message Type");
 
+    tap_p->pdu_type = BSSAP_PDU_TYPE_BSSMAP;
+    tap_p->message_type = oct;
+
+    tap_queue_packet(gsm_a_tap, pinfo, tap_p);
+
     if (str == NULL) return;
 
     if ((len - offset) <= 0) return;
@@ -9254,30 +10745,28 @@ dissect_bssmap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
 static void
 dissect_dtap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
 {
-    void (*msg_fcn)(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len);
-    guint8     oct;
-    guint8     pd;
-    guint32    offset;
-    guint32    len;
-    guint32    oct_1, oct_2;
-    gint       idx;
-    proto_item *dtap_item = NULL;
-    proto_tree *dtap_tree = NULL;
-    proto_item *oct_1_item = NULL;
-    proto_tree *pd_tree = NULL;
-    gchar      *msg_str;
-    const gchar        *str;
-    gint       ett_tree;
-    gint       ti;
-    int                hf_idx;
+    static gsm_a_tap_rec_t     tap_rec[4];
+    static gsm_a_tap_rec_t     *tap_p;
+    static int                 tap_current=0;
+    void                       (*msg_fcn)(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len);
+    guint8                     oct;
+    guint8                     pd;
+    guint32                    offset;
+    guint32                    len;
+    guint32                    oct_1, oct_2;
+    gint                       idx;
+    proto_item                 *dtap_item = NULL;
+    proto_tree                 *dtap_tree = NULL;
+    proto_item                 *oct_1_item = NULL;
+    proto_tree                 *pd_tree = NULL;
+    gchar                      *msg_str;
+    const gchar                        *str;
+    gint                       ett_tree;
+    gint                       ti;
+    int                                hf_idx;
+    gboolean                   nsd;
 
 
-    if (!proto_is_protocol_enabled(proto_a_dtap))
-    {
-       call_dissector(data_handle, tvb, pinfo, tree);
-       return;
-    }
-
     len = tvb_length(tvb);
 
     if (len < 2)
@@ -9295,13 +10784,15 @@ dissect_dtap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
     }
 
     /*
-     * In the interest of speed, if "tree" is NULL, don't do any work
-     * not necessary to generate protocol tree items.
+     * set tap record pointer
      */
-    if (!tree)
+    tap_current++;
+    if (tap_current == 4)
     {
-       return;
+       tap_current = 0;
     }
+    tap_p = &tap_rec[tap_current];
+
 
     offset = 0;
     oct_2 = 0;
@@ -9332,6 +10823,7 @@ dissect_dtap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
     ett_tree = -1;
     hf_idx = -1;
     msg_fcn = NULL;
+    nsd = FALSE;
 
     /*
      * octet 1
@@ -9339,41 +10831,43 @@ dissect_dtap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
     switch (pd)
     {
     case 3:
-       str = pd_str[pd];
-       msg_str = my_match_strval((guint32) (oct & DTAP_CC_IEI_MASK), gsm_dtap_msg_cc_strings, &idx);
+       str = gsm_a_pd_str[pd];
+       msg_str = my_match_strval((guint32) (oct & DTAP_CC_IEI_MASK), gsm_a_dtap_msg_cc_strings, &idx);
        ett_tree = ett_gsm_dtap_msg_cc[idx];
        hf_idx = hf_gsm_a_dtap_msg_cc_type;
        msg_fcn = dtap_msg_cc_fcn[idx];
        ti = (oct_1 & DTAP_TI_MASK) >> 4;
+       nsd = TRUE;
        break;
 
     case 5:
-       str = pd_str[pd];
-       msg_str = my_match_strval((guint32) (oct & DTAP_MM_IEI_MASK), gsm_dtap_msg_mm_strings, &idx);
+       str = gsm_a_pd_str[pd];
+       msg_str = my_match_strval((guint32) (oct & DTAP_MM_IEI_MASK), gsm_a_dtap_msg_mm_strings, &idx);
        ett_tree = ett_gsm_dtap_msg_mm[idx];
        hf_idx = hf_gsm_a_dtap_msg_mm_type;
        msg_fcn = dtap_msg_mm_fcn[idx];
+       nsd = TRUE;
        break;
 
     case 6:
-       str = pd_str[pd];
-       msg_str = my_match_strval((guint32) (oct & DTAP_RR_IEI_MASK), gsm_dtap_msg_rr_strings, &idx);
+       str = gsm_a_pd_str[pd];
+       msg_str = my_match_strval((guint32) (oct & DTAP_RR_IEI_MASK), gsm_a_dtap_msg_rr_strings, &idx);
        ett_tree = ett_gsm_dtap_msg_rr[idx];
        hf_idx = hf_gsm_a_dtap_msg_rr_type;
        msg_fcn = dtap_msg_rr_fcn[idx];
        break;
 
     case 8:
-       str = pd_str[pd];
-       msg_str = my_match_strval((guint32) (oct & DTAP_GMM_IEI_MASK), gsm_dtap_msg_gmm_strings, &idx);
+       str = gsm_a_pd_str[pd];
+       msg_str = my_match_strval((guint32) (oct & DTAP_GMM_IEI_MASK), gsm_a_dtap_msg_gmm_strings, &idx);
        ett_tree = ett_gsm_dtap_msg_gmm[idx];
        hf_idx = hf_gsm_a_dtap_msg_gmm_type;
        msg_fcn = dtap_msg_gmm_fcn[idx];
        break;
 
     case 9:
-       str = pd_str[pd];
-       msg_str = my_match_strval((guint32) (oct & DTAP_SMS_IEI_MASK), gsm_dtap_msg_sms_strings, &idx);
+       str = gsm_a_pd_str[pd];
+       msg_str = my_match_strval((guint32) (oct & DTAP_SMS_IEI_MASK), gsm_a_dtap_msg_sms_strings, &idx);
        ett_tree = ett_gsm_dtap_msg_sms[idx];
        hf_idx = hf_gsm_a_dtap_msg_sms_type;
        msg_fcn = dtap_msg_sms_fcn[idx];
@@ -9381,8 +10875,8 @@ dissect_dtap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
        break;
 
     case 10:
-       str = pd_str[pd];
-       msg_str = my_match_strval((guint32) (oct & DTAP_SM_IEI_MASK), gsm_dtap_msg_sm_strings, &idx);
+       str = gsm_a_pd_str[pd];
+       msg_str = my_match_strval((guint32) (oct & DTAP_SM_IEI_MASK), gsm_a_dtap_msg_sm_strings, &idx);
        ett_tree = ett_gsm_dtap_msg_sm[idx];
        hf_idx = hf_gsm_a_dtap_msg_sm_type;
        msg_fcn = dtap_msg_sm_fcn[idx];
@@ -9390,16 +10884,17 @@ dissect_dtap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
        break;
 
     case 11:
-       str = pd_str[pd];
-       msg_str = my_match_strval((guint32) (oct & DTAP_SS_IEI_MASK), gsm_dtap_msg_ss_strings, &idx);
+       str = gsm_a_pd_str[pd];
+       msg_str = my_match_strval((guint32) (oct & DTAP_SS_IEI_MASK), gsm_a_dtap_msg_ss_strings, &idx);
        ett_tree = ett_gsm_dtap_msg_ss[idx];
        hf_idx = hf_gsm_a_dtap_msg_ss_type;
        msg_fcn = dtap_msg_ss_fcn[idx];
        ti = (oct_1 & DTAP_TI_MASK) >> 4;
+       nsd = TRUE;
        break;
 
     default:
-       str = pd_str[pd];
+       str = gsm_a_pd_str[pd];
        break;
     }
 
@@ -9440,7 +10935,7 @@ dissect_dtap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
 
     if (ti == -1)
     {
-       my_decode_bitfield_value(a_bigbuf, oct_1, 0xf0, 8);
+       other_decode_bitfield_value(a_bigbuf, oct_1, 0xf0, 8);
        proto_tree_add_text(pd_tree,
            tvb, 0, 1,
            "%s :  Skip Indicator",
@@ -9448,7 +10943,7 @@ dissect_dtap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
     }
     else
     {
-       my_decode_bitfield_value(a_bigbuf, oct_1, 0x80, 8);
+       other_decode_bitfield_value(a_bigbuf, oct_1, 0x80, 8);
        proto_tree_add_text(pd_tree,
            tvb, 0, 1,
            "%s :  TI flag: %s",
@@ -9459,7 +10954,7 @@ dissect_dtap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
        {
            /* ti is extended to next octet */
 
-           my_decode_bitfield_value(a_bigbuf, oct_1, 0x70, 8);
+           other_decode_bitfield_value(a_bigbuf, oct_1, 0x70, 8);
            proto_tree_add_text(pd_tree,
                tvb, 0, 1,
                "%s :  TIO: The TI value is given by the TIE in octet 2",
@@ -9467,43 +10962,47 @@ dissect_dtap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
        }
        else
        {
-           my_decode_bitfield_value(a_bigbuf, oct_1, 0x70, 8);
+           other_decode_bitfield_value(a_bigbuf, oct_1, 0x70, 8);
            proto_tree_add_text(pd_tree,
                tvb, 0, 1,
-               "%s :  TIO: %d",
+               "%s :  TIO: %u",
                a_bigbuf,
                ti & DTAP_TIE_PRES_MASK);
        }
     }
 
-    my_decode_bitfield_value(a_bigbuf, oct_1, DTAP_PD_MASK, 8);
+    other_decode_bitfield_value(a_bigbuf, oct_1, DTAP_PD_MASK, 8);
     proto_tree_add_text(pd_tree,
        tvb, 0, 1,
-       "%s :  Protocol Discriminator: %d",
+       "%s :  Protocol Discriminator: %u",
        a_bigbuf,
        pd);
 
     if ((ti != -1) &&
        (ti & DTAP_TIE_PRES_MASK) == DTAP_TIE_PRES_MASK)
     {
-       my_decode_bitfield_value(a_bigbuf, oct_2, 0x80, 8);
+       other_decode_bitfield_value(a_bigbuf, oct_2, 0x80, 8);
        proto_tree_add_text(pd_tree,
            tvb, 1, 1,
            "%s :  Extension",
            a_bigbuf);
 
-       my_decode_bitfield_value(a_bigbuf, oct_2, DTAP_TIE_MASK, 8);
+       other_decode_bitfield_value(a_bigbuf, oct_2, DTAP_TIE_MASK, 8);
        proto_tree_add_text(pd_tree,
            tvb, 1, 1,
-           "%s :  TIE: %d",
+           "%s :  TIE: %u",
            a_bigbuf,
            oct_2 & DTAP_TIE_MASK);
     }
 
     /*
-     * XXX
      * N(SD)
      */
+    if ((pinfo->p2p_dir == P2P_DIR_RECV) &&
+       nsd)
+    {
+       /* XXX */
+    }
 
     /*
      * add DTAP message name
@@ -9514,6 +11013,12 @@ dissect_dtap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
 
     offset++;
 
+    tap_p->pdu_type = BSSAP_PDU_TYPE_DTAP;
+    tap_p->message_type = (nsd ? (oct & 0x3f) : oct);
+    tap_p->protocol_disc = pd;
+
+    tap_queue_packet(gsm_a_tap, pinfo, tap_p);
+
     if (msg_str == NULL) return;
 
     if ((len - offset) <= 0) return;
@@ -9547,42 +11052,42 @@ proto_register_gsm_a(void)
     {
        { &hf_gsm_a_bssmap_msg_type,
            { "BSSMAP Message Type",    "gsm_a.bssmap_msgtype",
-           FT_UINT8, BASE_HEX, VALS(gsm_bssmap_msg_strings), 0x0,
+           FT_UINT8, BASE_HEX, VALS(gsm_a_bssmap_msg_strings), 0x0,
            "", HFILL }
        },
        { &hf_gsm_a_dtap_msg_mm_type,
            { "DTAP Mobility Management Message Type",  "gsm_a.dtap_msg_mm_type",
-           FT_UINT8, BASE_HEX, VALS(gsm_dtap_msg_mm_strings), 0x0,
+           FT_UINT8, BASE_HEX, VALS(gsm_a_dtap_msg_mm_strings), 0x0,
            "", HFILL }
        },
        { &hf_gsm_a_dtap_msg_rr_type,
            { "DTAP Radio Resources Management Message Type",   "gsm_a.dtap_msg_rr_type",
-           FT_UINT8, BASE_HEX, VALS(gsm_dtap_msg_rr_strings), 0x0,
+           FT_UINT8, BASE_HEX, VALS(gsm_a_dtap_msg_rr_strings), 0x0,
            "", HFILL }
        },
        { &hf_gsm_a_dtap_msg_cc_type,
            { "DTAP Call Control Message Type", "gsm_a.dtap_msg_cc_type",
-           FT_UINT8, BASE_HEX, VALS(gsm_dtap_msg_cc_strings), 0x0,
+           FT_UINT8, BASE_HEX, VALS(gsm_a_dtap_msg_cc_strings), 0x0,
            "", HFILL }
        },
        { &hf_gsm_a_dtap_msg_gmm_type,
            { "DTAP GPRS Mobility Management Message Type",     "gsm_a.dtap_msg_gmm_type",
-           FT_UINT8, BASE_HEX, VALS(gsm_dtap_msg_gmm_strings), 0x0,
+           FT_UINT8, BASE_HEX, VALS(gsm_a_dtap_msg_gmm_strings), 0x0,
            "", HFILL }
        },
        { &hf_gsm_a_dtap_msg_sms_type,
            { "DTAP Short Message Service Message Type",        "gsm_a.dtap_msg_sms_type",
-           FT_UINT8, BASE_HEX, VALS(gsm_dtap_msg_sms_strings), 0x0,
+           FT_UINT8, BASE_HEX, VALS(gsm_a_dtap_msg_sms_strings), 0x0,
            "", HFILL }
        },
        { &hf_gsm_a_dtap_msg_sm_type,
            { "DTAP GPRS Session Management Message Type",      "gsm_a.dtap_msg_sm_type",
-           FT_UINT8, BASE_HEX, VALS(gsm_dtap_msg_sm_strings), 0x0,
+           FT_UINT8, BASE_HEX, VALS(gsm_a_dtap_msg_sm_strings), 0x0,
            "", HFILL }
        },
        { &hf_gsm_a_dtap_msg_ss_type,
            { "DTAP Non call Supplementary Service Message Type",       "gsm_a.dtap_msg_ss_type",
-           FT_UINT8, BASE_HEX, VALS(gsm_dtap_msg_ss_strings), 0x0,
+           FT_UINT8, BASE_HEX, VALS(gsm_a_dtap_msg_ss_strings), 0x0,
            "", HFILL }
        },
        { &hf_gsm_a_rp_msg_type,
@@ -9653,19 +11158,32 @@ proto_register_gsm_a(void)
        { &hf_gsm_a_dlci_cc,
            { "Control Channel", "bssap.dlci.cc",
            FT_UINT8, BASE_HEX, VALS(bssap_cc_values), 0xc0,
-           "", HFILL}},
+           "", HFILL}
+       },
        { &hf_gsm_a_dlci_spare,
            { "Spare", "bssap.dlci.spare",
            FT_UINT8, BASE_HEX, NULL, 0x38,
-           "", HFILL}},
+           "", HFILL}
+       },
        { &hf_gsm_a_dlci_sapi,
            { "SAPI", "bssap.dlci.sapi",
            FT_UINT8, BASE_HEX, VALS(bssap_sapi_values), 0x07,
-           "", HFILL}},
+           "", HFILL}
+       },
+       { &hf_gsm_a_bssmap_cause,
+           { "BSSMAP Cause",   "gsm_a_bssmap.cause",
+           FT_UINT8, BASE_HEX, 0, 0x0,
+           "", HFILL }
+       },
+       { &hf_gsm_a_dtap_cause,
+           { "DTAP Cause",     "gsm_a_dtap.cause",
+           FT_UINT8, BASE_HEX, 0, 0x0,
+           "", HFILL }
+       },
     };
 
     /* Setup protocol subtree array */
-#define        NUM_INDIVIDUAL_ELEMS    10
+#define        NUM_INDIVIDUAL_ELEMS    33
     static gint *ett[NUM_INDIVIDUAL_ELEMS + NUM_GSM_BSSMAP_MSG +
                        NUM_GSM_DTAP_MSG_MM + NUM_GSM_DTAP_MSG_RR + NUM_GSM_DTAP_MSG_CC +
                        NUM_GSM_DTAP_MSG_GMM + NUM_GSM_DTAP_MSG_SMS +
@@ -9684,6 +11202,30 @@ proto_register_gsm_a(void)
     ett[7] = &ett_gsm_enc_info;
     ett[8] = &ett_cell_list;
     ett[9] = &ett_dlci;
+    ett[10] = &ett_bc_oct_3a;
+    ett[11] = &ett_bc_oct_4;
+    ett[12] = &ett_bc_oct_5;
+    ett[13] = &ett_bc_oct_5a;
+    ett[14] = &ett_bc_oct_5b;
+    ett[15] = &ett_bc_oct_6;
+    ett[16] = &ett_bc_oct_6a;
+    ett[17] = &ett_bc_oct_6b;
+    ett[18] = &ett_bc_oct_6c;
+    ett[19] = &ett_bc_oct_6d;
+    ett[20] = &ett_bc_oct_6e;
+    ett[21] = &ett_bc_oct_6f;
+    ett[22] = &ett_bc_oct_6g;
+    ett[23] = &ett_bc_oct_7;
+
+    ett[24] = &ett_tc_component;
+    ett[25] = &ett_tc_invoke_id;
+    ett[26] = &ett_tc_linked_id;
+    ett[27] = &ett_tc_opr_code;
+    ett[28] = &ett_tc_err_code;
+    ett[29] = &ett_tc_prob_code;
+    ett[30] = &ett_tc_sequence;
+    ett[31] = &gsm_ss_ett_sequence;
+    ett[32] = &gsm_ss_ett_param;
 
     last_offset = NUM_INDIVIDUAL_ELEMS;
 
@@ -9760,6 +11302,8 @@ proto_register_gsm_a(void)
        FT_UINT8, BASE_DEC);
 
     proto_register_subtree_array(ett, array_length(ett));
+
+    gsm_a_tap = register_tap("gsm_a");
 }