Note that for THE3GPP_IPV6_DNS_SERVERS we probably *do* need to handle
[obnox/wireshark/wip.git] / packet-ncp2222.inc
index cdb4d53a332550e1b58f715a3908ed848028b52c..56768238a3d3688ae1db295023974b12932b42d5 100644 (file)
@@ -8,7 +8,10 @@
  * Gilbert Ramirez <gram@alumni.rice.edu>
  * Modified to decode NDS packets by Greg Morris <gmorris@novell.com>
  *
- * $Id: packet-ncp2222.inc,v 1.19 2002/09/22 15:46:42 gerald Exp $
+ * Portions Copyright (c) Gilbert Ramirez 2000-2002
+ * Portions Copyright (c) Novell, Inc. 2000-2003
+ *
+ * $Id: packet-ncp2222.inc,v 1.70 2004/02/29 08:01:22 guy Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@ethereal.com>
 #define NCP_PACKET_INIT_COUNT  200
 #define PROTO_LENGTH_UNTIL_END -1
 
+gboolean        nds_defragment = TRUE;
+
+typedef struct {
+        guint32         nds_frag_verb;
+        guint32         nds_frag_version;
+        guint32         nds_frag_flags;
+        guint32         nds_length;
+        guint32         nds_frag;
+        gboolean        nds_fragmented;
+} frag_info;        
+
+frag_info           frags[100];
+
+const fragment_items nds_frag_items = {
+       &ett_nds_segment,
+       &ett_nds_segments,
+       &hf_nds_segments,
+       &hf_nds_segment,
+       &hf_nds_segment_overlap,
+       &hf_nds_segment_overlap_conflict,
+       &hf_nds_segment_multiple_tails,
+       &hf_nds_segment_too_long_segment,
+       &hf_nds_segment_error,
+       NULL,
+       "segments"
+};
+
 static const value_string nds_tags[] = {
         { 0x00000000, "No Such Entry" },
         { 0x00000001, "Local Entry" },
@@ -47,7 +77,7 @@ static const value_string nds_info_type[] = {
         { 0x00000001, "Attribute Name & Value / " },
         { 0x00000002, "Effective Privileges / " },
         { 0x00000003, "Value Information / " },
-        { 0x00000004, "Abreviated Value / " },
+        { 0x00000004, "Abbreviated Value / " },
        { 0,    NULL }
 };
 
@@ -177,6 +207,14 @@ static const value_string class_def_type[] = {
         { 0,   NULL }
 };
 
+static const value_string nds_search_scope[] = {
+        { 0x0000, "Examine the base object only" },
+        { 0x0001, "Search the immediate subordinates of the base object" },
+        { 0x0002, "Search the base object and all its subordinates" },
+        { 0x0003, "Search the base objects and all objects in its partition (Implemented in NDS 8)" },
+        { 0,   NULL }
+};
+
 static const value_string nds_reply_errors[] = {
         { 0xffffffff, "(-1) Insufficient Space" },
         { 0xffffff89, "(-119) Buffer too Small" },
@@ -495,7 +533,7 @@ static const value_string nds_reply_errors[] = {
         { 0xfffffd0d, "(-755) Invalid Synchronization Data" },
         { 0xfffffd0c, "(-756) Stream Exists" },
         { 0xfffffd0b, "(-757) Auxiliary Has Containment" },
-        { 0xfffffd0a, "(-758) Auxiliary Not Containere" },
+        { 0xfffffd0a, "(-758) Auxiliary Not Container" },
         { 0xfffffd09, "(-759) Auxiliary Not Effective" },
         { 0xfffffd08, "(-760) Auxiliary On Alias" },
         { 0xfffffd07, "(-761) Have Seen State" },
@@ -513,6 +551,60 @@ static const value_string nds_reply_errors[] = {
         { 0xfffffcfb, "(-773) Iterator Syntax" },
         { 0xfffffcfa, "(-774) Repairing DIB" },
         { 0xfffffcf9, "(-775) Invalid OID Format" },
+        { 0xfffffcf8, "(-776) Attempted to perform an NDS operation, and the DS agent on this server is closing" },
+        { 0xfffffcf7, "(-777) Attempted to modify an object's attribute that is not stored on the sparse replica" },
+        { 0xfffffcf6, "(-778) VpVector and VpvUser which must be correlated, are out of sync" },
+        { 0xfffffcf5, "(-779) Error Cannot Go Remote" },
+        { 0xfffffcf4, "(-780) Request not Supported" },
+        { 0xfffffcf3, "(-781) Entry Not Local" },
+        { 0xfffffcf2, "(-782) Root Unreachable" },
+        { 0xfffffcf1, "(-783) VRDIM Not Initialized" },
+        { 0xfffffcf0, "(-784) Wait Timeout" },
+        { 0xfffffcef, "(-785) DIB Error" },
+        { 0xfffffcee, "(-786) DIB IO Failure" },
+        { 0xfffffced, "(-787) Illegal Schema Attribute" },
+        { 0xfffffcec, "(-788) Error Schema Partition" },
+        { 0xfffffceb, "(-789) Invalid Template" },
+        { 0xfffffcea, "(-790) Error Opening File" },
+        { 0xfffffce9, "(-791) Error Direct Opening File" },
+        { 0xfffffce8, "(-792) Error Creating File" },
+        { 0xfffffce7, "(-793) Error Direct Creating File" },
+        { 0xfffffce6, "(-794) Error Reading File" },
+        { 0xfffffce5, "(-795) Error Direct Reading File" },
+        { 0xfffffce4, "(-796) Error Writing File" },
+        { 0xfffffce3, "(-797) Error Direct Writing File" },
+        { 0xfffffce2, "(-798) Error Positioning in File" },
+        { 0xfffffce1, "(-799) Error Getting File Size" },
+        { 0xffffe88f, "(-6001) Error Truncating File" },
+        { 0xffffe88e, "(-6002) Error Parsing File Name" },
+        { 0xffffe88d, "(-6003) Error Closing File" },
+        { 0xffffe88c, "(-6004) Error Getting File Info" },
+        { 0xffffe88b, "(-6005) Error Expanding File" },
+        { 0xffffe88a, "(-6006) Error Getting Free Blocks" },
+        { 0xffffe889, "(-6007) Error Checking File Existence" },
+        { 0xffffe888, "(-6008) Error Deleting File" },
+        { 0xffffe887, "(-6009) Error Renaming File" },
+        { 0xffffe886, "(-6010) Error Initializing IO System" },
+        { 0xffffe885, "(-6011) Error Flushing File" },
+        { 0xffffe884, "(-6012) Error Setting Up for Read" },
+        { 0xffffe883, "(-6013) Error Setting up for Write" },
+        { 0xffffe882, "(-6014) Error Old View" },
+        { 0xffffe881, "(-6015) Server in Skulk" },
+        { 0xffffe880, "(-6016) Error Returning Partial Results" },
+        { 0xffffe87f, "(-6017) No Such Schema" },
+        { 0xffffe87e, "(-6018) Serial Number Mismatch" },
+        { 0xffffe87d, "(-6019) Bad Referal Database Serial Number" },
+        { 0xffffe87c, "(-6020) Bad Referal Serial Number" },
+        { 0xffffe87b, "(-6021) Invalid File Sequence" },
+        { 0xffffe87a, "(-6022) Error Referal Trans Gap" },
+        { 0xffffe879, "(-6023) Bad Referal File Number" },
+        { 0xffffe878, "(-6024) Referal File Not Found" },
+        { 0xffffe877, "(-6025) Error Backup Active" },
+        { 0xffffe876, "(-6026) Referal Device Full" },
+        { 0xffffe875, "(-6027) Unsupported Version" },
+        { 0xffffe874, "(-6028) Error Must Wait Checkpoint" },
+        { 0xffffe873, "(-6029) Attribute Maintenance in Progress" },
+        { 0xffffe872, "(-6030) Error Abort Transaction" },
         { 0xffff0000, "Ok" },
         { 0x0000, "Ok" },
        { 0,    NULL }
@@ -554,16 +646,6 @@ typedef struct {
        guint32         nw_eid;
 } ncp_req_eid_hash_key;
 
-typedef struct {
-        const ncp_record       *ncp_rec;
-        gboolean               *req_cond_results;
-        guint32                        req_frame_num;
-        guint32                 req_nds_flags;
-        guint8                  nds_request_verb;
-        guint8                  nds_version;
-        char *                  object_name;
-} ncp_req_hash_value;
-
 typedef struct {
         char                           object_name[256];
         char                    *object_class;
@@ -580,8 +662,8 @@ static GMemChunk *ncp_req_hash_values = NULL;
 gint
 ncp_equal(gconstpointer v, gconstpointer v2)
 {
-       ncp_req_hash_key        *val1 = (ncp_req_hash_key*)v;
-       ncp_req_hash_key        *val2 = (ncp_req_hash_key*)v2;
+       const ncp_req_hash_key  *val1 = (const ncp_req_hash_key*)v;
+       const ncp_req_hash_key  *val2 = (const ncp_req_hash_key*)v2;
 
        if (val1->conversation == val2->conversation &&
            val1->nw_sequence  == val2->nw_sequence ) {
@@ -593,8 +675,8 @@ ncp_equal(gconstpointer v, gconstpointer v2)
 gint
 ncp_eid_equal(gconstpointer v, gconstpointer v2)
 {
-       ncp_req_eid_hash_key    *val1 = (ncp_req_eid_hash_key*)v;
-       ncp_req_eid_hash_key    *val2 = (ncp_req_eid_hash_key*)v2;
+       const ncp_req_eid_hash_key      *val1 = (const ncp_req_eid_hash_key*)v;
+       const ncp_req_eid_hash_key      *val2 = (const ncp_req_eid_hash_key*)v2;
 
         if (val1->nw_eid == val2->nw_eid ) {
                return 1;
@@ -605,14 +687,14 @@ ncp_eid_equal(gconstpointer v, gconstpointer v2)
 guint
 ncp_hash(gconstpointer v)
 {
-       ncp_req_hash_key        *ncp_key = (ncp_req_hash_key*)v;
+       const ncp_req_hash_key  *ncp_key = (const ncp_req_hash_key*)v;
        return GPOINTER_TO_UINT(ncp_key->conversation) + ncp_key->nw_sequence;
 }
 
 guint
 ncp_eid_hash(gconstpointer v)
 {
-       ncp_req_eid_hash_key    *ncp_eid_key = (ncp_req_eid_hash_key*)v;
+       const ncp_req_eid_hash_key      *ncp_eid_key = (const ncp_req_eid_hash_key*)v;
        return GPOINTER_TO_UINT(ncp_eid_key->nw_eid);
 }
 
@@ -643,6 +725,10 @@ ncp_req_eid_hash_cleanup(gpointer key _U_, gpointer value, gpointer user_data _U
 static void
 ncp_init_protocol(void)
 {
+       /* fragment */
+       fragment_table_init(&nds_fragment_table);
+       reassembled_table_init(&nds_reassembled_table);
+        
        if (ncp_req_hash) {
                g_hash_table_foreach(ncp_req_hash, ncp_req_hash_cleanup, NULL);
                g_hash_table_destroy(ncp_req_hash);
@@ -688,24 +774,15 @@ ncp_postseq_cleanup(void)
 {
        if (ncp_req_hash) {
                /* Destroy the hash, but don't clean up request_condition data. */
-               g_hash_table_destroy(ncp_req_hash);
-               ncp_req_hash = NULL;
+               /*g_hash_table_destroy(ncp_req_hash);
+               ncp_req_hash = NULL;*/
        }
        if (ncp_req_hash_keys) {
-               g_mem_chunk_destroy(ncp_req_hash_keys);
-               ncp_req_hash_keys = NULL;
+               /*g_mem_chunk_destroy(ncp_req_hash_keys);
+               ncp_req_hash_keys = NULL;*/
        }
-       /* Don't free the ncp_req_hash_values, as they're
+       /* Don't free the ncp_req_hash_values or EID_hash_table, as they're
         * needed during random-access processing of the proto_tree.*/
-       if (ncp_req_eid_hash) {
-               /* Destroy the hash, but don't clean up request_condition data. */
-               g_hash_table_destroy(ncp_req_eid_hash);
-               ncp_req_eid_hash = NULL;
-       }
-       if (ncp_req_eid_hash_keys) {
-               g_mem_chunk_destroy(ncp_req_eid_hash_keys);
-               ncp_req_eid_hash_keys = NULL;
-       }
 }
 
 ncp_req_hash_value*
@@ -724,7 +801,11 @@ ncp_hash_insert(conversation_t *conversation, guint8 nw_sequence,
        request_value = g_mem_chunk_alloc(ncp_req_hash_values);
        request_value->ncp_rec = ncp_rec;
        request_value->req_cond_results = NULL;
-        request_value->req_nds_flags = NULL;
+        request_value->req_nds_flags = 0;
+       request_value->nds_request_verb = 0;
+       request_value->nds_version = 0;
+       strcpy(request_value->object_name, " ");
+        request_value->nds_frag = TRUE;
         
         g_hash_table_insert(ncp_req_hash, request_key, request_value);
 
@@ -732,8 +813,7 @@ ncp_hash_insert(conversation_t *conversation, guint8 nw_sequence,
 }
 
 ncp_req_eid_hash_value*
-ncp_eid_hash_insert(conversation_t *conversation, guint32 nw_eid,
-               const ncp_record *ncp_rec)
+ncp_eid_hash_insert(guint32 nw_eid)
 {
        ncp_req_eid_hash_key            *request_eid_key;
        ncp_req_eid_hash_value          *request_eid_value;
@@ -766,7 +846,7 @@ ncp_hash_lookup(conversation_t *conversation, guint8 nw_sequence)
 
 /* Returns the value_rec* for needed EID, or NULL if not found. */
 ncp_req_eid_hash_value*
-ncp_eid_hash_lookup(conversation_t *conversation, guint32 nw_eid)
+ncp_eid_hash_lookup(conversation_t *conversation _U_, guint32 nw_eid)
 {
        ncp_req_eid_hash_key            request_eid_key;
 
@@ -835,14 +915,14 @@ ncp_record_find(guint8 func, guint8 subfunc)
 guint
 get_item_value(proto_item *item)
 {
-       return fvalue_get_integer(PITEM_FINFO(item)->value);
+       return fvalue_get_integer(&PITEM_FINFO(item)->value);
 }
 
 
 char *
 get_item_string(proto_item *item)
 {
-       return fvalue_get(PITEM_FINFO(item)->value);
+       return fvalue_get(&PITEM_FINFO(item)->value);
 }
 
 char *
@@ -883,9 +963,35 @@ typedef struct {
 } nw_time_t;
 
 typedef struct {
-       char *  buffer;
+       char   buffer[1024];
 } nw_uni_t;
 
+#define VTYPE_NONE             0       /* no value */
+#define VTYPE_UINT8            1
+#define VTYPE_UINT16           2
+#define VTYPE_UINT32           3
+#define VTYPE_STRING           4
+#define VTYPE_BITFIELD         5
+#define VTYPE_MULTIVALUE_UINT32        6
+#define VTYPE_BYTES            7
+#define VTYPE_BOOLEAN          8
+
+#define MVTYPE_ATTR_REQUEST            1
+#define MVTYPE_ATTR_REPLY              2
+#define MVTYPE_ATTR_REQUEST2           3       /* XXX - how does this differ from 1? */
+#define MVTYPE_READ_CLASS_REQ          4
+#define MVTYPE_READ_REPLICAS           5
+#define MVTYPE_MODIFY_ATTR_REQUEST     6
+#define MVTYPE_ADDR_REFERRAL_REQUEST   7
+#define MVTYPE_ADDR_REFERRAL_REPLY     8
+#define MVTYPE_LOC_ADDR_REFERRAL_REPLY 9
+#define MVTYPE_PROC_ENTRY_SPECIFIERS   10
+#define MVTYPE_PRINT_TIMESTAMP         11
+#define MVTYPE_LIST_PARTITIONS         12
+#define MVTYPE_CLASS_NAMES             13
+#define MVTYPE_MODIFY_CLASS            14
+#define MVTYPE_ADD_ATTR_REQUEST         15
+
 typedef struct {
         guint8          vtype;
         guint32         vvalue;
@@ -928,6 +1034,7 @@ typedef struct {
         guint32         bit16hfname;
         guint8          mvtype;
         guint32         vflags;
+        guint32         nds_version;
 } nds_val;        
         
 
@@ -946,14 +1053,14 @@ uint_to_nwtime(guint data, nw_time_t *nwtime)
 {
        /* 2-second resolution */
        nwtime->second = (data & 0x001f) * 2;
-       nwtime->minute = ((data & 0x07e0) >> 5) + 1;
-       nwtime->hour   = ((data & 0xf800) >> 11) + 1;
+       nwtime->minute = ((data & 0x07e0) >> 5);
+       nwtime->hour   = ((data & 0xf800) >> 11);
 }
 
 char *
 unicode_to_string(char * data, guint32 length)
 {
-        int     i;
+        guint32 i;
        guint16 character;
         int     offset = 0;
         char *  buffer = "";
@@ -1033,7 +1140,7 @@ padd_uni(ptvcursor_t *ptvc, const ptvc_record *rec)
         nw_uni_t        nw_uni;
         guint            offset;
         
-       nw_uni.buffer = "\0";
+       strcpy(nw_uni.buffer, "");
         offset = ptvcursor_current_offset(ptvc);
 
        item = ptvcursor_add(ptvc, *rec->hf_ptr,
@@ -1321,7 +1428,6 @@ void free_proto_tree(void *tree)
        }
 }
 
-
 static guint32
 align_4(tvbuff_t *tvb, guint32 aoffset)
 {
@@ -1330,21 +1436,26 @@ align_4(tvbuff_t *tvb, guint32 aoffset)
                 return (aoffset%4);
        }
        return 0;
-}       
-
+}
+       
 static void
 get_string(tvbuff_t* tvb, guint offset, guint str_length, char *dest_buf)
 {
         guint32 i;
         guint16 c_char;
         guint32 length_remaining = 0;
-        
+
         length_remaining = tvb_length_remaining(tvb, offset);
-        if(str_length > length_remaining)
+        if(str_length > length_remaining || str_length > 1024)  
         {
                 strcpy(dest_buf, "String too long to process");
                 return;
-        }        
+        }
+        dest_buf[0] = '\0';        
+        if(str_length == 0)
+        {
+                return;
+        }
         for ( i = 0; i < str_length; i++ )
         {
                 c_char = tvb_get_guint8(tvb, offset );
@@ -1352,8 +1463,8 @@ get_string(tvbuff_t* tvb, guint offset, guint str_length, char *dest_buf)
                 {
                         if (c_char != 0x00)
                         { 
-                        c_char = 0x2e;
-                        dest_buf[i] = c_char & 0xff;
+                                c_char = '.';
+                                dest_buf[i] = c_char & 0xff;
                         }
                         else
                         {
@@ -1374,8 +1485,53 @@ get_string(tvbuff_t* tvb, guint offset, guint str_length, char *dest_buf)
                         return;
                 }        
         }
-dest_buf[i] = '\0';
-return;
+        dest_buf[i] = '\0';
+        return;
+}
+
+static void
+uni_to_string(char * data, guint32 str_length, char *dest_buf)
+{
+        guint32 i;
+        guint16 c_char;
+        guint32 length_remaining = 0;
+
+        length_remaining = str_length;
+        dest_buf[0] = '\0';        
+        if(str_length == 0)
+        {
+                return;
+        }
+        for ( i = 0; i < str_length; i++ )
+        {
+                c_char = data[i];
+                if (c_char<0x20 || c_char>0x7e)
+                {
+                        if (c_char != 0x00)
+                        { 
+                                c_char = '.';
+                                dest_buf[i] = c_char & 0xff;
+                        }
+                        else
+                        {
+                                i--;
+                                str_length--;
+                        }
+                }
+                else
+                {
+                        dest_buf[i] = c_char & 0xff;
+                }
+                length_remaining--;
+                
+                if(length_remaining==0)
+                {
+                        dest_buf[i+1] = '\0';
+                        return;
+                }        
+        }
+        dest_buf[i] = '\0';
+        return;
 }
 
 /*************************************
@@ -1385,7 +1541,7 @@ return;
 * %s = string = 2
 **************************************/  
 int
-get_info_type(gchar* check_string)
+get_info_type(const gchar* check_string)
 {
         guint length;
         guint i;
@@ -1395,29 +1551,29 @@ get_info_type(gchar* check_string)
         
         for (i = 0 ; i < length-1 ; i++ ) {
                 char_val = check_string[i+1];
-                if (check_string[i] == 0x25 && check_string[i+1] == 0x64) {
+                if (check_string[i] == 0x25 && check_string[i+1] == 0x64) {   /* %d Digits*/
                         return 0;
                 } 
-                if ( check_string[i] == 0x25 && check_string[i+1] == 0x78) {
+                if ( check_string[i] == 0x78 && check_string[i+1] == 0x25 && check_string[i+2] == 0x73) {  /* x%s Bytes*/
                         return 1;
                 }
         }
-        return 2;
+        return 2; /* Normal String */
 }                
 
 static void
 process_bitfield(proto_tree *ncp_tree, tvbuff_t *tvb, nds_val *values)
 {
-        char                    flags_str[512];
-        char *                  sep = NULL;
+        gchar                   flags_str[512];
+        gchar                   *sep;
        proto_item              *tinew;
        proto_tree              *flags_tree;
-        int                     i;
+        guint32                 i;
         guint32                 bvalue = 0;
 
         bvalue = 0x00000001;
-        strcpy(flags_str, " (");
-        sep = " ";
+        flags_str[0]='\0';
+        sep="";
         for (i = 0 ; i < (values->vlength*8); i++ ) {
                 if (values->vvalue & bvalue) 
                 {
@@ -1478,88 +1634,84 @@ process_bitfield(proto_tree *ncp_tree, tvbuff_t *tvb, nds_val *values)
                }
                 bvalue = bvalue*2;
         }
-        if (flags_str[0] != '\0')
+        if(values->vlength==4)
         {
-               strcat(flags_str, " )\0");
-                if(values->vlength==4)
-                {
-                       tinew = proto_tree_add_uint_format(ncp_tree, values->hfname,
-                               tvb, values->voffset, values->vlength, values->vvalue, "%s 0x%08x -%s",
-                                values->vdesc, values->vvalue, flags_str);
-                }
-                else
-                {                
-                       tinew = proto_tree_add_uint_format(ncp_tree, values->hfname,
-                               tvb, values->voffset, values->vlength, values->vvalue, "%s 0x%04x -%s",
-                                values->vdesc, values->vvalue, flags_str);
-                }
-                        
+               tinew = proto_tree_add_uint_format(ncp_tree, values->hfname,
+                       tvb, values->voffset, values->vlength, values->vvalue, "%s 0x%08x",
+                        values->vdesc, values->vvalue);
+       }
+        else
+        {                
+               tinew = proto_tree_add_uint_format(ncp_tree, values->hfname,
+                       tvb, values->voffset, values->vlength, values->vvalue, "%s 0x%04x",
+                        values->vdesc, values->vvalue);
+        }
+       if (flags_str[0] != '\0')
+               proto_item_append_text(tinew, " - (%s)", flags_str);
                                                         
-               flags_tree = proto_item_add_subtree(tinew, ett_nds);
+       flags_tree = proto_item_add_subtree(tinew, ett_nds);
                                                 
-                bvalue = 0x00000001;
+        bvalue = 0x00000001;
                
-                for (i = 0 ; i < (values->vlength*8); i++ ) {
-                
-                        if (values->vvalue & bvalue) 
+        for (i = 0 ; i < (values->vlength*8); i++ ) {
+                if (values->vvalue & bvalue) 
+                {
+                        switch(bvalue)
                         {
-                                switch(bvalue)
-                                {
-                                        case 0x00000001:
-                                               proto_tree_add_item(flags_tree, values->bit1hfname, tvb, values->voffset, values->vlength, TRUE);
-                                                break;
-                                        case 0x00000002:
-                                               proto_tree_add_item(flags_tree, values->bit2hfname, tvb, values->voffset, values->vlength, TRUE);
-                                                break;
-                                        case 0x00000004:
-                                               proto_tree_add_item(flags_tree, values->bit3hfname, tvb, values->voffset, values->vlength, TRUE);
-                                                break;
-                                        case 0x0000008:
-                                               proto_tree_add_item(flags_tree, values->bit4hfname, tvb, values->voffset, values->vlength, TRUE);
-                                                break;
-                                        case 0x00000010:
-                                               proto_tree_add_item(flags_tree, values->bit5hfname, tvb, values->voffset, values->vlength, TRUE);
-                                                break;
-                                        case 0x00000020:
-                                               proto_tree_add_item(flags_tree, values->bit6hfname, tvb, values->voffset, values->vlength, TRUE);
-                                                break;
-                                        case 0x00000040:
-                                               proto_tree_add_item(flags_tree, values->bit7hfname, tvb, values->voffset, values->vlength, TRUE);
-                                                break;
-                                        case 0x00000080:
-                                               proto_tree_add_item(flags_tree, values->bit8hfname, tvb, values->voffset, values->vlength, TRUE);
-                                                break;
-                                        case 0x00000100:
-                                               proto_tree_add_item(flags_tree, values->bit9hfname, tvb, values->voffset, values->vlength, TRUE);
-                                                break;
-                                        case 0x00000200:
-                                               proto_tree_add_item(flags_tree, values->bit10hfname, tvb, values->voffset, values->vlength, TRUE);
-                                                break;
-                                        case 0x00000400:
-                                               proto_tree_add_item(flags_tree, values->bit11hfname, tvb, values->voffset, values->vlength, TRUE);
-                                                break;
-                                        case 0x00000800:
-                                               proto_tree_add_item(flags_tree, values->bit12hfname, tvb, values->voffset, values->vlength, TRUE);
-                                                break;
-                                        case 0x00001000:
-                                               proto_tree_add_item(flags_tree, values->bit13hfname, tvb, values->voffset, values->vlength, TRUE);
-                                                break;
-                                        case 0x00002000:
-                                               proto_tree_add_item(flags_tree, values->bit14hfname, tvb, values->voffset, values->vlength, TRUE);
-                                                break;
-                                        case 0x00004000:
-                                               proto_tree_add_item(flags_tree, values->bit15hfname, tvb, values->voffset, values->vlength, TRUE);
-                                                break;
-                                        case 0x00008000:
-                                               proto_tree_add_item(flags_tree, values->bit16hfname, tvb, values->voffset, values->vlength, TRUE);
-                                                break;
-                                        default:
-                                                break;
-                                }
+                                case 0x00000001:
+                                        proto_tree_add_item(flags_tree, values->bit1hfname, tvb, values->voffset, values->vlength, TRUE);
+                                        break;
+                                case 0x00000002:
+                                       proto_tree_add_item(flags_tree, values->bit2hfname, tvb, values->voffset, values->vlength, TRUE);
+                                        break;
+                                case 0x00000004:
+                                       proto_tree_add_item(flags_tree, values->bit3hfname, tvb, values->voffset, values->vlength, TRUE);
+                                        break;
+                                case 0x00000008:
+                                        proto_tree_add_item(flags_tree, values->bit4hfname, tvb, values->voffset, values->vlength, TRUE);
+                                        break;
+                                case 0x00000010:
+                                        proto_tree_add_item(flags_tree, values->bit5hfname, tvb, values->voffset, values->vlength, TRUE);
+                                        break;
+                                case 0x00000020:
+                                        proto_tree_add_item(flags_tree, values->bit6hfname, tvb, values->voffset, values->vlength, TRUE);
+                                        break;
+                                case 0x00000040:
+                                        proto_tree_add_item(flags_tree, values->bit7hfname, tvb, values->voffset, values->vlength, TRUE);
+                                        break;
+                                case 0x00000080:
+                                        proto_tree_add_item(flags_tree, values->bit8hfname, tvb, values->voffset, values->vlength, TRUE);
+                                        break;
+                                case 0x00000100:
+                                        proto_tree_add_item(flags_tree, values->bit9hfname, tvb, values->voffset, values->vlength, TRUE);
+                                        break;
+                                case 0x00000200:
+                                        proto_tree_add_item(flags_tree, values->bit10hfname, tvb, values->voffset, values->vlength, TRUE);
+                                        break;
+                                case 0x00000400:
+                                        proto_tree_add_item(flags_tree, values->bit11hfname, tvb, values->voffset, values->vlength, TRUE);
+                                        break;
+                                case 0x00000800:
+                                        proto_tree_add_item(flags_tree, values->bit12hfname, tvb, values->voffset, values->vlength, TRUE);
+                                        break;
+                                case 0x00001000:
+                                        proto_tree_add_item(flags_tree, values->bit13hfname, tvb, values->voffset, values->vlength, TRUE);
+                                        break;
+                                case 0x00002000:
+                                        proto_tree_add_item(flags_tree, values->bit14hfname, tvb, values->voffset, values->vlength, TRUE);
+                                        break;
+                                case 0x00004000:
+                                        proto_tree_add_item(flags_tree, values->bit15hfname, tvb, values->voffset, values->vlength, TRUE);
+                                        break;
+                                case 0x00008000:
+                                        proto_tree_add_item(flags_tree, values->bit16hfname, tvb, values->voffset, values->vlength, TRUE);
+                                        break;
+                                default:
+                                        break;
                         }
-                        bvalue = bvalue*2;
                 }
-        }        
+                bvalue = bvalue*2;
+        }
 }
 
 
@@ -1573,10 +1725,10 @@ print_nds_values(proto_tree *vtree, tvbuff_t *tvb, guint32 syntax_type, nds_val
         guint32         value5 = 0;
         guint32         value6 = 0;
         guint32         voffset = 0;
-        guint         icounter;
+        guint32         icounter;
         guint32         number_of_values = 0;
         guint32         number_of_items = 0;
-        guint         r;
+        guint32         r;
         proto_item      *vitem;
         proto_tree      *nvtree;
         proto_item      *aditem;
@@ -1586,6 +1738,7 @@ print_nds_values(proto_tree *vtree, tvbuff_t *tvb, guint32 syntax_type, nds_val
         guint16         rstate = 0;
         guint16         rnum = 0;
         guint16         revent = 0;
+       gint            length_remaining;
 
         voffset = vvalues->voffset;
         if(tvb_get_guint8(tvb, voffset) == 0x00)
@@ -1596,7 +1749,7 @@ print_nds_values(proto_tree *vtree, tvbuff_t *tvb, guint32 syntax_type, nds_val
         number_of_values = tvb_get_letohl(tvb, voffset);
         
         vitem = proto_tree_add_uint_format(vtree, hf_nds_uint32value, tvb, voffset,
-                4, number_of_values, "Number of Values: %d", number_of_values);
+                4, number_of_values, "Number of Values: %u", number_of_values);
         
         nvtree = proto_item_add_subtree(vitem, ett_nds);
         
@@ -1621,18 +1774,18 @@ print_nds_values(proto_tree *vtree, tvbuff_t *tvb, guint32 syntax_type, nds_val
                                        proto_tree_add_string(nvtree, hf_value_string, tvb, voffset, 
                                            value1, vvalues->vstring);
                                        voffset = voffset + value1;    
+                                       voffset += align_4(tvb, voffset);
                                }            
-                               voffset += align_4(tvb, voffset);
                                break;
                        case 0x00000007:        /* Boolean */
                                value1 = tvb_get_letohl(tvb, voffset); /* length of field */
                                if (value1==0)
                                {
-                               vvalues->vstring = "False";
+                                       vvalues->vstring = "False";
                                }
                                else
                                {
-                               vvalues->vstring = "True";
+                                       vvalues->vstring = "True";
                                }
                                proto_tree_add_string(nvtree, hf_value_string, tvb, voffset, 
                                            value1, vvalues->vstring);
@@ -1641,7 +1794,8 @@ print_nds_values(proto_tree *vtree, tvbuff_t *tvb, guint32 syntax_type, nds_val
                        case 0x00000009:        /* Binary String */
                        case 0x00000015:        /* Stream */
                                value1 = tvb_get_letohl(tvb, voffset); /* length of field */
-                               if(value1 > tvb_length_remaining(tvb, voffset))
+                               length_remaining = tvb_length_remaining(tvb, voffset);
+                               if(length_remaining == -1 || value1 > (guint32) length_remaining)
                                {
                                         break;
                                }
@@ -1700,11 +1854,6 @@ print_nds_values(proto_tree *vtree, tvbuff_t *tvb, guint32 syntax_type, nds_val
                                                proto_tree_add_item(nvtree, hf_nds_node, tvb, voffset+4, 6, FALSE);
                                                proto_tree_add_item(nvtree, hf_nds_socket, tvb, voffset+10, 2, FALSE);
                                                 break;
-                                        case 0x00000001:
-                                               proto_tree_add_item(nvtree, hf_nds_port, tvb, voffset, 2, FALSE);
-                                                value4 = tvb_get_letohl(tvb, voffset+2);
-                                               proto_tree_add_ipv4(nvtree, hf_add_ref_ip, tvb, voffset+2, 4, value4);
-                                                break;
                                         case 0x00000008:
                                                proto_tree_add_item(nvtree, hf_nds_port, tvb, voffset, 2, FALSE);
                                                 value4 = tvb_get_letohl(tvb, voffset+2);
@@ -1715,6 +1864,11 @@ print_nds_values(proto_tree *vtree, tvbuff_t *tvb, guint32 syntax_type, nds_val
                                                 value4 = tvb_get_letohl(tvb, voffset+2);
                                                 proto_tree_add_ipv4(nvtree, hf_add_ref_tcp, tvb, voffset+2, 4, value4);
                                                 break;
+                                        case 0x00000001:
+                                               proto_tree_add_item(nvtree, hf_nds_port, tvb, voffset, 2, FALSE);
+                                                value4 = tvb_get_letohl(tvb, voffset+2);
+                                               proto_tree_add_ipv4(nvtree, hf_add_ref_ip, tvb, voffset+2, 4, value4);
+                                                break;
                                         case 0x0000000d:
                                                 get_string(tvb, voffset, value3, vvalues->vstring);
                                                 proto_tree_add_string(nvtree, hf_value_string, tvb, voffset, 
@@ -1785,9 +1939,13 @@ print_nds_values(proto_tree *vtree, tvbuff_t *tvb, guint32 syntax_type, nds_val
                                proto_tree_add_uint_format(nvtree, hf_replica_number, tvb, voffset, 
                                         4, value3, "Replica Number %d", value3);
                                voffset = voffset+4;
+                               if(vvalues->nds_version == 0xfe)
+                               {
+                                        voffset += 4;
+                               }
                                number_of_items = tvb_get_letohl(tvb, voffset);  /* Number of Addresses */
-                               aditem = proto_tree_add_uint_format(vtree, hf_nds_uint32value, tvb, voffset,
-                                        4, number_of_items, "Number of Addresses: %d", number_of_items);
+                               aditem = proto_tree_add_uint_format(nvtree, hf_nds_uint32value, tvb, voffset,
+                                        4, number_of_items, "Number of Addresses: %u", number_of_items);
         
                                adtree = proto_item_add_subtree(aditem, ett_nds);
                                voffset = voffset+4;
@@ -1878,13 +2036,13 @@ print_nds_values(proto_tree *vtree, tvbuff_t *tvb, guint32 syntax_type, nds_val
                                revent = tvb_get_letohs(tvb, voffset); /* Event */
                                proto_tree_add_uint_format(nvtree, hf_nds_revent, tvb, voffset,
                                         2, revent, "Event: %d", revent);
-                               voffset = voffset+14;
+                               voffset = voffset+2;
                                voffset += align_4(tvb, voffset);
                                break;
                        case 0x00000017:        /* Back Link */
                                value1 = tvb_get_letohl(tvb, voffset);         /* Length */
                                proto_tree_add_uint_format(nvtree, hf_nds_uint32value, tvb, voffset,
-                                        4, value1, "Lenght of Record", value1);
+                                        4, value1, "Length of Record %08x", value1);
                                voffset = voffset+4;
                                value2 = tvb_get_letohl(tvb, voffset);         /* Remote ID */
                                proto_tree_add_uint_format(nvtree, hf_nds_uint32value, tvb, voffset,
@@ -1894,14 +2052,15 @@ print_nds_values(proto_tree *vtree, tvbuff_t *tvb, guint32 syntax_type, nds_val
                                voffset = voffset+4;
                                get_string(tvb, voffset, value3, vvalues->vstring);
                                proto_tree_add_string_format(nvtree, hf_value_string, tvb, voffset, 
-                                        value3, "Server Distinguished Name - %s", vvalues->vstring);
+                                        value3, vvalues->vstring,
+                                        "Server Distinguished Name - %s", vvalues->vstring);
                                voffset = voffset+value3;
                                voffset += align_4(tvb, voffset);
                                break;
                        case 0x00000019:        /* Typed Name */
                                value1 = tvb_get_letohl(tvb, voffset);         /* Length */
                                proto_tree_add_uint_format(nvtree, hf_nds_uint32value, tvb, voffset,
-                                        4, value1, "Lenght of Record", value1);
+                                        4, value1, "Length of Record %08x", value1);
                                voffset = voffset+4;
                                value2 = tvb_get_letohl(tvb, voffset);         /* Level */
                                proto_tree_add_uint_format(nvtree, hf_nds_uint32value, tvb, voffset,
@@ -1915,14 +2074,15 @@ print_nds_values(proto_tree *vtree, tvbuff_t *tvb, guint32 syntax_type, nds_val
                                voffset = voffset+4;
                                get_string(tvb, voffset, value4, vvalues->vstring);
                                proto_tree_add_string_format(nvtree, hf_value_string, tvb, voffset, 
-                                        value4, "Distinguished Name - %s", vvalues->vstring);
+                                        value4, vvalues->vstring,
+                                        "Distinguished Name - %s", vvalues->vstring);
                                voffset = voffset+value4;
                                voffset += align_4(tvb, voffset);
                                break;
                        case 0x0000001a:        /* Hold */
                                value1 = tvb_get_letohl(tvb, voffset);         /* Length */
                                proto_tree_add_uint_format(nvtree, hf_nds_uint32value, tvb, voffset,
-                                        4, value1, "Lenght of Record", value1);
+                                        4, value1, "Length of Record %08x", value1);
                                voffset = voffset+4;
                                value2 = tvb_get_letohl(tvb, voffset);         /* Amount */
                                proto_tree_add_uint_format(nvtree, hf_nds_uint32value, tvb, voffset,
@@ -1932,7 +2092,8 @@ print_nds_values(proto_tree *vtree, tvbuff_t *tvb, guint32 syntax_type, nds_val
                                voffset = voffset+4;
                                get_string(tvb, voffset, value3, vvalues->vstring);
                                proto_tree_add_string_format(nvtree, hf_value_string, tvb, voffset, 
-                                        value3, "Subject - %s", vvalues->vstring);
+                                        value3, vvalues->vstring,
+                                        "Subject - %s", vvalues->vstring);
                                voffset = voffset+value3;
                                voffset += align_4(tvb, voffset);
                                break;
@@ -1968,9 +2129,9 @@ print_es_type(proto_tree *estree, tvbuff_t *tvb, nds_val *values, guint32 vtype,
         guint32         value3;
         guint32         value4;
         guint32         value5;
-        guint32         number_of_referals;
-        guint         r;
-        guint         i;
+        guint32         number_of_referrals;
+        guint32         r;
+        guint32         i;
         guint16         replica_num;
         guint16         event_num;
         nw_uni_t        mval_buf;
@@ -1980,7 +2141,8 @@ print_es_type(proto_tree *estree, tvbuff_t *tvb, nds_val *values, guint32 vtype,
        proto_item      *aitem;
         char *          vstring="";
               
-               mval_buf.buffer = "";
+               strcpy(mval_buf.buffer, "");
+
         switch (vtype)
         {
                 case 0: /* No Specifier Type */
@@ -2006,6 +2168,7 @@ print_es_type(proto_tree *estree, tvbuff_t *tvb, nds_val *values, guint32 vtype,
                                 value2, values->vstring);
                         values->voffset=ioffset + value2;
                         ioffset = values->voffset;
+                        ioffset += align_4(tvb, ioffset);
                         break;
                 case 2: /* Based */
                         value1 = tvb_get_letohl(tvb, ioffset);   /* ES Type */
@@ -2043,6 +2206,7 @@ print_es_type(proto_tree *estree, tvbuff_t *tvb, nds_val *values, guint32 vtype,
                                                 value3, values->vstring);
                                         values->voffset=ioffset + value3;
                                         ioffset = values->voffset;
+                                        ioffset += align_4(tvb, ioffset);
                                         break;
                                 case 2: /* Based */
                                         break;
@@ -2130,6 +2294,7 @@ print_es_type(proto_tree *estree, tvbuff_t *tvb, nds_val *values, guint32 vtype,
                                                 value3, values->vstring);
                                         values->voffset=ioffset + value3;
                                         ioffset = values->voffset;
+                                        ioffset += align_4(tvb, ioffset);
                                         break;
                                 case 2: /* Based */
                                         break;
@@ -2184,18 +2349,18 @@ print_es_type(proto_tree *estree, tvbuff_t *tvb, nds_val *values, guint32 vtype,
                          }
                         break;
                 case 3: /* Hinted */
-                        number_of_referals = tvb_get_letohl(tvb, ioffset);
+                        number_of_referrals = tvb_get_letohl(tvb, ioffset);
                         
-                        for (r = 1 ; r <= number_of_referals; r++ )
+                        for (r = 1 ; r <= number_of_referrals; r++ )
                         {
-                               aitem = proto_tree_add_uint_format(estree, hf_referal_record, tvb, 6, 0,
-                               r, "NDS Referal Record #%d", r);
+                               aitem = proto_tree_add_uint_format(estree, hf_referral_record, tvb, 6, 0,
+                               r, "NDS Referral Record #%u", r);
                                 atree = proto_item_add_subtree(aitem, ett_nds);
                                 
                                 value1 = tvb_get_letohl(tvb, ioffset);
                                 
-                               proto_tree_add_uint_format(atree, hf_referal_addcount, tvb, ioffset, 4,
-                                       value1, "Number of Addresses in Referal - %d", value1);
+                               proto_tree_add_uint_format(atree, hf_referral_addcount, tvb, ioffset, 4,
+                                       value1, "Number of Addresses in Referral - %d", value1);
                                      
                                 ioffset = ioffset + 4;
                                 for (i = 1 ; i <= value1; i++ ) 
@@ -2281,6 +2446,7 @@ print_es_type(proto_tree *estree, tvbuff_t *tvb, nds_val *values, guint32 vtype,
                                                 value3, values->vstring);
                                         values->voffset=ioffset + value3;
                                         ioffset = values->voffset;
+                                        ioffset += align_4(tvb, ioffset);
                                         break;
                                 case 2: /* Based */
                                         break;
@@ -2387,24 +2553,22 @@ print_es_type(proto_tree *estree, tvbuff_t *tvb, nds_val *values, guint32 vtype,
 static void
 process_multivalues(proto_tree *ncp_tree, tvbuff_t *tvb, nds_val *values)
 {
-        guint8          i;
-        guint8          r;
-        guint8          n;
+        guint32         i;
+        guint32         r;
         guint32         ioffset = 0;
         guint32         value1 = 0;
         guint32         value2 = 0;
         guint8          value3 = 0;
         guint32         value4 = 0;
-        guint32         value5 = 0;
+        gint            value5 = 0;
         guint32         value6 = 0;
         guint32         value7 = 0;
-        guint32         value8 = 0;
         char *          valuestr = "";
         proto_tree      *ntree;
         proto_tree      *atree;
        proto_item      *nitem;
         proto_item      *aitem;
-        guint32         number_of_referals = 0;
+        guint32         number_of_referrals = 0;
         nw_uni_t        mval_buf;
         proto_tree      *estree;
        proto_item      *esitem;
@@ -2412,9 +2576,15 @@ process_multivalues(proto_tree *ncp_tree, tvbuff_t *tvb, nds_val *values)
         guint16         event_num = 0;
         guint32         bvalue=0;
         nds_val         temp_values;
+        proto_tree      *sub1tree;
+       proto_item      *sub1item;
+        proto_tree      *sub2tree;
+       proto_item      *sub2item;
+       gint            length_remaining;
                
-               mval_buf.buffer = "";
-        if(values->mvtype != 12)
+               strcpy(mval_buf.buffer, "");
+        
+        if(values->mvtype != MVTYPE_LIST_PARTITIONS)
         {
                 nitem = proto_tree_add_uint_format(ncp_tree, values->hfname, tvb, values->voffset+ioffset,
                         values->vlength, values->vvalue, values->vdesc, values->vvalue);
@@ -2430,7 +2600,7 @@ process_multivalues(proto_tree *ncp_tree, tvbuff_t *tvb, nds_val *values)
 
         switch (values->mvtype)
         {
-                case 1:         /* Attribute Request */
+                case MVTYPE_ATTR_REQUEST:      /* Attribute Request */
                         for (i = 1 ; i <= values->vvalue; i++ )
                         {
                                 ioffset += align_4(tvb, ioffset);
@@ -2443,7 +2613,8 @@ process_multivalues(proto_tree *ncp_tree, tvbuff_t *tvb, nds_val *values)
                                 ioffset = ioffset + value1;        
                         }
                         break;
-                case 2:         /* Attribute Reply */
+
+                case MVTYPE_ATTR_REPLY:                /* Attribute Reply */
                         switch(values->vflags)
                         {
                                 case 0:
@@ -2476,8 +2647,11 @@ process_multivalues(proto_tree *ncp_tree, tvbuff_t *tvb, nds_val *values)
                                                 get_string(tvb, ioffset, value2, mval_buf.buffer);
                                                 values->vstring = mval_buf.buffer;
                                                 proto_tree_add_string(ntree, hf_mv_string, tvb, ioffset, 
-                                                        value2, values->vstring);
-                                                values->voffset=ioffset + value2;
+                                                        value2, values->vstring);        
+                                                ioffset += value2;
+                                                ioffset += align_4(tvb, ioffset);
+                                                values->voffset = ioffset; 
+        
                                                 print_nds_values(ntree, tvb, value1, values);        
                                                 ioffset = values->voffset;
                                         }
@@ -2703,7 +2877,8 @@ process_multivalues(proto_tree *ncp_tree, tvbuff_t *tvb, nds_val *values)
                                         break;
                         }
                         break;
-                case 3:         /* Attribute Request */
+
+                case MVTYPE_ATTR_REQUEST2:     /* Attribute Request */
                         for (i = 1 ; i <= values->vvalue; i++ )
                         {
                                 ioffset += align_4(tvb, ioffset);
@@ -2713,7 +2888,25 @@ process_multivalues(proto_tree *ncp_tree, tvbuff_t *tvb, nds_val *values)
                                 ioffset = ioffset + value1;        
                         }
                         break;
-                case 4:         /* Read Class Request */
+
+                case MVTYPE_ADD_ATTR_REQUEST:  /* Add Attribute Request */
+                        for (i = 1 ; i <= values->vvalue; i++ )
+                        {
+                                value1 = tvb_get_letohl(tvb, ioffset);
+                                ioffset = ioffset + 4;
+                                get_string(tvb, ioffset, value1, mval_buf.buffer);
+                                values->vstring = mval_buf.buffer;                                
+                                proto_tree_add_string(ntree, hf_mv_string, tvb, ioffset, 
+                                        value1, values->vstring);
+                                ioffset = ioffset + value1;        
+                                ioffset += align_4(tvb, ioffset);
+                                values->voffset = ioffset;
+                                print_nds_values(ntree, tvb, 9, values);        
+                                ioffset = values->voffset;
+                        }
+                        break;
+                        
+                case MVTYPE_READ_CLASS_REQ:    /* Read Class Request */
                         for (i = 1 ; i <= values->vvalue; i++ )
                         {
                                 ioffset += align_4(tvb, ioffset);
@@ -2727,7 +2920,8 @@ process_multivalues(proto_tree *ncp_tree, tvbuff_t *tvb, nds_val *values)
                                 ioffset = ioffset + value1;        
                         }
                         break;
-                case 5:         /* Read Replicas */
+
+                case MVTYPE_READ_REPLICAS:     /* Read Replicas */
                         for (i = 1 ; i <= values->vvalue; i++ )
                         {
                                                 
@@ -2876,7 +3070,8 @@ process_multivalues(proto_tree *ncp_tree, tvbuff_t *tvb, nds_val *values)
                                 }
                         }
                         break;
-                case 6:         /* Modify Attribute Request */        
+
+                case MVTYPE_MODIFY_ATTR_REQUEST: /* Modify Attribute Request */
                         for (i = 0 ; i < values->vvalue; i++ ) 
                         {
                                ioffset += align_4(tvb, ioffset);
@@ -2905,7 +3100,8 @@ process_multivalues(proto_tree *ncp_tree, tvbuff_t *tvb, nds_val *values)
                                }
                         }
                         break;
-                case 7:         /* Address Referal Request */        
+
+                case MVTYPE_ADDR_REFERRAL_REQUEST: /* Address Referral Request */
                         for (i = 0 ; i < values->vvalue; i++ ) 
                         {
         
@@ -2920,19 +3116,20 @@ process_multivalues(proto_tree *ncp_tree, tvbuff_t *tvb, nds_val *values)
                                ioffset = ioffset+4;
                         }
                         break;
-                case 8:         /* Address Referal Reply */
-                        number_of_referals = values->vvalue;
+
+                case MVTYPE_ADDR_REFERRAL_REPLY: /* Address Referral Reply */
+                        number_of_referrals = values->vvalue;
                         
-                        for (r = 1 ; r <= number_of_referals; r++ )
+                        for (r = 1 ; r <= number_of_referrals; r++ )
                         {
-                               aitem = proto_tree_add_uint_format(ntree, hf_referal_record, tvb, 6, 0,
-                               r, "NDS Referal Record #%d", r);
+                               aitem = proto_tree_add_uint_format(ntree, hf_referral_record, tvb, 6, 0,
+                               r, "NDS Referral Record #%u", r);
                                 atree = proto_item_add_subtree(aitem, ett_nds);
                                 
                                 value1 = tvb_get_letohl(tvb, ioffset);
                                 
-                               proto_tree_add_uint_format(atree, hf_referal_addcount, tvb, ioffset, 4,
-                                       value1, "Number of Addresses in Referal - %d", value1);
+                               proto_tree_add_uint_format(atree, hf_referral_addcount, tvb, ioffset, 4,
+                                       value1, "Number of Addresses in Referral - %d", value1);
                                      
                                 ioffset = ioffset + 4;
                                 for (i = 1 ; i <= value1; i++ ) 
@@ -2983,15 +3180,15 @@ process_multivalues(proto_tree *ncp_tree, tvbuff_t *tvb, nds_val *values)
                                 }
                 
                         }
-                
                         break;
-                case 9:         /* Local Address Referal Reply */
-                        number_of_referals = values->vvalue;
 
-                        for (r = 1 ; r <= number_of_referals; r++ )
+                case MVTYPE_LOC_ADDR_REFERRAL_REPLY: /* Local Address Referral Reply */
+                        number_of_referrals = values->vvalue;
+
+                        for (r = 1 ; r <= number_of_referrals; r++ )
                         {
-                               aitem = proto_tree_add_uint_format(ntree, hf_referal_record, tvb, 6, 0,
-                               r, "NDS Referal Record #%d", r);
+                               aitem = proto_tree_add_uint_format(ntree, hf_referral_record, tvb, 6, 0,
+                               r, "NDS Referral Record #%u", r);
                                 atree = proto_item_add_subtree(aitem, ett_nds);
                                 
                                 value2 = tvb_get_letohl(tvb, ioffset);
@@ -3043,7 +3240,8 @@ process_multivalues(proto_tree *ncp_tree, tvbuff_t *tvb, nds_val *values)
                                 ioffset += align_4(tvb, ioffset);
                         }
                         break;
-                case 10:                        /* Process Entry Specifiers */
+
+                case MVTYPE_PROC_ENTRY_SPECIFIERS: /* Process Entry Specifiers */
                         value2 = tvb_get_letohl(tvb, ioffset);   /* ES Type */
                         values->vstring = match_strval(value2, es_type);
                         if (values->vstring == NULL)
@@ -3067,8 +3265,8 @@ process_multivalues(proto_tree *ncp_tree, tvbuff_t *tvb, nds_val *values)
                         ioffset = ioffset + 4;
                         ioffset = print_es_type(estree, tvb, values, value3, ioffset);
                         value4 = tvb_get_letohl(tvb, ioffset);
-                       aitem = proto_tree_add_uint_format(ntree, hf_referal_record, tvb, ioffset, 4,
-                               value4, "Referal Protocols - %d", value4);
+                       aitem = proto_tree_add_uint_format(ntree, hf_referral_record, tvb, ioffset, 4,
+                               value4, "Referral Protocols - %d", value4);
                         atree = proto_item_add_subtree(aitem, ett_nds);
                         ioffset += 4;               
                         for (i = 0 ; i < value4; i++ ) 
@@ -3084,7 +3282,7 @@ process_multivalues(proto_tree *ncp_tree, tvbuff_t *tvb, nds_val *values)
                                ioffset = ioffset+4;
                         }
                         value6 = tvb_get_letohl(tvb, ioffset);
-                       aitem = proto_tree_add_uint_format(ntree, hf_referal_record, tvb, ioffset, 4,
+                       aitem = proto_tree_add_uint_format(ntree, hf_referral_record, tvb, ioffset, 4,
                                value6, "Tree Walking Protocols - %d", value6);
                         atree = proto_item_add_subtree(aitem, ett_nds);
                         ioffset += 4;               
@@ -3101,18 +3299,21 @@ process_multivalues(proto_tree *ncp_tree, tvbuff_t *tvb, nds_val *values)
                                ioffset = ioffset+4;
                         }
                         break;
-                case 11:                /* Print Timestamp */
-                                replica_num = tvb_get_letohs(tvb, ioffset);   /* Replica */
-                                proto_tree_add_item(ncp_tree, hf_nds_replica_num, tvb, ioffset, 
-                                        2, replica_num);
-                                ioffset = ioffset + 2;
-                                event_num = tvb_get_letohs(tvb, ioffset);   /* Event */
-                                proto_tree_add_item(ncp_tree, hf_nds_event_num, tvb, ioffset, 
-                                        2, event_num);
-                                ioffset = ioffset + 2;
-                case 12:        /* List Partitions */
-                        number_of_referals = values->vvalue;
-                        for (i = 0; i < number_of_referals; i++)
+
+                case MVTYPE_PRINT_TIMESTAMP:   /* Print Timestamp */
+                        replica_num = tvb_get_letohs(tvb, ioffset);   /* Replica */
+                        proto_tree_add_item(ncp_tree, hf_nds_replica_num, tvb, ioffset, 
+                                2, replica_num);
+                        ioffset = ioffset + 2;
+                        event_num = tvb_get_letohs(tvb, ioffset);   /* Event */
+                        proto_tree_add_item(ncp_tree, hf_nds_event_num, tvb, ioffset, 
+                                2, event_num);
+                        ioffset = ioffset + 2;
+                       /* fall through */
+
+                case MVTYPE_LIST_PARTITIONS:   /* List Partitions */
+                        number_of_referrals = values->vvalue;
+                        for (i = 0; i < number_of_referrals; i++)
                         {        
                                 bvalue = 0x00000001;
                
@@ -3124,8 +3325,8 @@ process_multivalues(proto_tree *ncp_tree, tvbuff_t *tvb, nds_val *values)
                                                 {
                                                         case 0x00000001:                /* Information Flags */
                                                                 temp_values.vvalue = tvb_get_letohs(tvb, ioffset);
-                                                                temp_values.vtype = 5; /* Bitfield */
-                                                                temp_values.vstring = "";
+                                                                temp_values.vtype = VTYPE_BITFIELD;
+                                                                temp_values.vstring = mval_buf.buffer;
                                                                 temp_values.vdesc = "Information Flags (low) Byte:";
                                                                 temp_values.vlength = 2;
                                                                 temp_values.hfname= hf_nds_rflags;
@@ -3165,8 +3366,8 @@ process_multivalues(proto_tree *ncp_tree, tvbuff_t *tvb, nds_val *values)
                                                                 process_bitfield(ntree, tvb, &temp_values);
                                                                 ioffset = ioffset+2;
                                                                 temp_values.vvalue = tvb_get_letohs(tvb, ioffset);
-                                                                temp_values.vtype = 5; /* Bitfield */
-                                                                temp_values.vstring = "";
+                                                                temp_values.vtype = VTYPE_BITFIELD;
+                                                                temp_values.vstring = mval_buf.buffer;
                                                                 temp_values.vdesc = "Information Flags (high) Byte:";
                                                                 temp_values.vlength = 2;
                                                                 temp_values.hfname= hf_nds_rflags;
@@ -3214,8 +3415,8 @@ process_multivalues(proto_tree *ncp_tree, tvbuff_t *tvb, nds_val *values)
                                                                 break;
                                                         case 0x00000004:                /* Entry Flags */
                                                                 temp_values.vvalue = tvb_get_letohl(tvb, ioffset);
-                                                                temp_values.vtype = 5; /* Bitfield */
-                                                                temp_values.vstring = "";
+                                                                temp_values.vtype = VTYPE_BITFIELD;
+                                                                temp_values.vstring = mval_buf.buffer;
                                                                 temp_values.vdesc = "Entry Flags:";
                                                                 temp_values.vlength = 2;
                                                                 temp_values.hfname= hf_nds_eflags;
@@ -3411,23 +3612,26 @@ process_multivalues(proto_tree *ncp_tree, tvbuff_t *tvb, nds_val *values)
                                 }
                         }
                         break;                
-                case 13:        /* Class Names */
-                        number_of_referals = values->vvalue;
-                        for (i = 0; i < number_of_referals; i++)
+
+                case MVTYPE_CLASS_NAMES:       /* Class Names */
+                        number_of_referrals = values->vvalue;
+                        for (i = 0; i < number_of_referrals; i++)
                         {        
+                                ioffset += align_4(tvb, ioffset);
                                 value1 = tvb_get_letohl(tvb, ioffset);
                                 ioffset = ioffset + 4;
                                 get_string(tvb, ioffset, value1, mval_buf.buffer);
                                 temp_values.vstring = mval_buf.buffer;                                
-                                proto_tree_add_string(ntree, hf_nds_base_class, tvb, ioffset, 
+                                sub1item = proto_tree_add_string(ntree, hf_nds_base_class, tvb, ioffset, 
                                         value1, temp_values.vstring);
+                                sub1tree = proto_item_add_subtree(sub1item, ett_nds);
                                 ioffset = ioffset + value1;        
                                 ioffset += align_4(tvb, ioffset);
                                 if(values->vflags != 0)
                                 {
                                         temp_values.vvalue = tvb_get_letohl(tvb, ioffset);
-                                        temp_values.vtype = 5; /* Bitfield */
-                                        temp_values.vstring = "";
+                                        temp_values.vtype = VTYPE_BITFIELD;
+                                        temp_values.vstring = mval_buf.buffer;
                                         temp_values.vdesc = "Class Flags:";
                                         temp_values.vlength = 2;
                                         temp_values.hfname= hf_nds_cflags;
@@ -3464,25 +3668,27 @@ process_multivalues(proto_tree *ncp_tree, tvbuff_t *tvb, nds_val *values)
                                         temp_values.bit15hfname = hf_bit15cflags;
                                         temp_values.bit16 = "Not Defined";
                                         temp_values.bit16hfname = hf_bit16cflags;
-                                        process_bitfield(ntree, tvb, &temp_values);
+                                        process_bitfield(sub1tree, tvb, &temp_values);
                                         ioffset = ioffset+4;
                                         if(values->vflags != 5)
                                         {
                                                 value1 = tvb_get_letohl(tvb, ioffset); /* length of field */
-                                                if(value1 > tvb_length_remaining(tvb, ioffset))
+                                                length_remaining = tvb_length_remaining(tvb, ioffset);
+                                                if(length_remaining == -1 || value1 > (guint32) length_remaining)
                                                 {
                                                          break;
                                                 }
                                                 ioffset += 4;
-                                                proto_tree_add_bytes(ntree, hf_nds_asn1, tvb, ioffset, value1, tvb_get_ptr(tvb, ioffset, value1));
+                                                proto_tree_add_bytes(sub1tree, hf_nds_asn1, tvb, ioffset, value1, tvb_get_ptr(tvb, ioffset, value1));
                                                 ioffset += value1;
                                                 ioffset += (value1%2);
                                         }
                                         if(values->vflags == 1 || values->vflags == 2 || values->vflags == 4)
                                         {
                                                 value1 = tvb_get_letohl(tvb, ioffset);  /* Super Classes */
-                                                proto_tree_add_uint_format(ntree, hf_nds_purge, tvb, ioffset,
+                                                sub2item = proto_tree_add_uint_format(sub1tree, hf_nds_purge, tvb, ioffset,
                                                         4, value1, "Super Classes %d", value1);
+                                                sub2tree = proto_item_add_subtree(sub2item, ett_nds);
                                                 ioffset = ioffset + 4;        
                                                 for (r = 0; r < value1; r++)
                                                 {
@@ -3490,14 +3696,15 @@ process_multivalues(proto_tree *ncp_tree, tvbuff_t *tvb, nds_val *values)
                                                         ioffset = ioffset + 4;
                                                         get_string(tvb, ioffset, value2, mval_buf.buffer);
                                                         temp_values.vstring = mval_buf.buffer;                                
-                                                        proto_tree_add_string(ntree, hf_nds_base_class, tvb, ioffset, 
+                                                        proto_tree_add_string(sub2tree, hf_nds_super, tvb, ioffset, 
                                                                 value2, temp_values.vstring);
                                                         ioffset = ioffset + value2;        
                                                         ioffset += align_4(tvb, ioffset);
                                                 }        
                                                 value1 = tvb_get_letohl(tvb, ioffset);  /* Containment Classes */
-                                                proto_tree_add_uint_format(ntree, hf_nds_purge, tvb, ioffset,
+                                                sub2item = proto_tree_add_uint_format(sub1tree, hf_nds_purge, tvb, ioffset,
                                                         4, value1, "Containment Classes %d", value1);
+                                                sub2tree = proto_item_add_subtree(sub2item, ett_nds);
                                                 ioffset = ioffset + 4;        
                                                 for (r = 0; r < value1; r++)
                                                 {
@@ -3505,14 +3712,15 @@ process_multivalues(proto_tree *ncp_tree, tvbuff_t *tvb, nds_val *values)
                                                         ioffset = ioffset + 4;
                                                         get_string(tvb, ioffset, value2, mval_buf.buffer);
                                                         temp_values.vstring = mval_buf.buffer;                                
-                                                        proto_tree_add_string(ntree, hf_nds_base_class, tvb, ioffset, 
+                                                        proto_tree_add_string(sub2tree, hf_nds_base_class, tvb, ioffset, 
                                                                 value2, temp_values.vstring);
                                                         ioffset = ioffset + value2;        
                                                         ioffset += align_4(tvb, ioffset);
                                                 }        
                                                 value1 = tvb_get_letohl(tvb, ioffset);  /* Naming Attributes */
-                                                proto_tree_add_uint_format(ntree, hf_nds_purge, tvb, ioffset,
+                                                sub2item = proto_tree_add_uint_format(sub1tree, hf_nds_purge, tvb, ioffset,
                                                         4, value1, "Naming Attributes %d", value1);
+                                                sub2tree = proto_item_add_subtree(sub2item, ett_nds);
                                                 ioffset = ioffset + 4;        
                                                 for (r = 0; r < value1; r++)
                                                 {
@@ -3520,14 +3728,15 @@ process_multivalues(proto_tree *ncp_tree, tvbuff_t *tvb, nds_val *values)
                                                         ioffset = ioffset + 4;
                                                         get_string(tvb, ioffset, value2, mval_buf.buffer);
                                                         temp_values.vstring = mval_buf.buffer;                                
-                                                        proto_tree_add_string(ntree, hf_nds_base_class, tvb, ioffset, 
+                                                        proto_tree_add_string(sub2tree, hf_mv_string, tvb, ioffset, 
                                                                 value2, temp_values.vstring);
                                                         ioffset = ioffset + value2;        
                                                         ioffset += align_4(tvb, ioffset);
                                                 }        
                                                 value1 = tvb_get_letohl(tvb, ioffset);  /* Mandatory Attributes */
-                                                proto_tree_add_uint_format(ntree, hf_nds_purge, tvb, ioffset,
+                                                sub2item = proto_tree_add_uint_format(sub1tree, hf_nds_purge, tvb, ioffset,
                                                         4, value1, "Mandatory Attributes %d", value1);
+                                                sub2tree = proto_item_add_subtree(sub2item, ett_nds);
                                                 ioffset = ioffset + 4;        
                                                 for (r = 0; r < value1; r++)
                                                 {
@@ -3535,14 +3744,15 @@ process_multivalues(proto_tree *ncp_tree, tvbuff_t *tvb, nds_val *values)
                                                         ioffset = ioffset + 4;
                                                         get_string(tvb, ioffset, value2, mval_buf.buffer);
                                                         temp_values.vstring = mval_buf.buffer;                                
-                                                        proto_tree_add_string(ntree, hf_nds_base_class, tvb, ioffset, 
+                                                        proto_tree_add_string(sub2tree, hf_mv_string, tvb, ioffset, 
                                                                 value2, temp_values.vstring);
                                                         ioffset = ioffset + value2;        
                                                         ioffset += align_4(tvb, ioffset);
                                                 }        
                                                 value1 = tvb_get_letohl(tvb, ioffset);  /* Optional Attributes */
-                                                proto_tree_add_uint_format(ntree, hf_nds_purge, tvb, ioffset,
+                                                sub2item = proto_tree_add_uint_format(sub1tree, hf_nds_purge, tvb, ioffset,
                                                         4, value1, "Optional Attributes %d", value1);
+                                                sub2tree = proto_item_add_subtree(sub2item, ett_nds);
                                                 ioffset = ioffset + 4;        
                                                 for (r = 0; r < value1; r++)
                                                 {
@@ -3551,7 +3761,7 @@ process_multivalues(proto_tree *ncp_tree, tvbuff_t *tvb, nds_val *values)
                                                         ioffset = ioffset + 4;
                                                         get_string(tvb, ioffset, value2, mval_buf.buffer);
                                                         temp_values.vstring = mval_buf.buffer;                                
-                                                        proto_tree_add_string(ntree, hf_nds_base_class, tvb, ioffset, 
+                                                        proto_tree_add_string(sub2tree, hf_mv_string, tvb, ioffset, 
                                                                 value2, temp_values.vstring);
                                                         ioffset = ioffset + value2;        
                                                         if(tvb_length_remaining(tvb, ioffset) < 4 )
@@ -3560,11 +3770,13 @@ process_multivalues(proto_tree *ncp_tree, tvbuff_t *tvb, nds_val *values)
                                                         }
                                                 }        
                                         }
-                                        if(values->vflags == 2 || values->vflags == 4)   /* Class Definitions of Super Classes */
+                                        /*if(values->vflags == 2 || values->vflags == 4)*/   /* Class Definitions of Super Classes */
+                                        if(values->vflags == 4)   /* Class Definitions of Super Classes */
                                         {
                                                 value1 = tvb_get_letohl(tvb, ioffset);  /* Containment Classes */
-                                                proto_tree_add_uint_format(ntree, hf_nds_purge, tvb, ioffset,
+                                                sub2item = proto_tree_add_uint_format(sub1tree, hf_nds_purge, tvb, ioffset,
                                                         4, value1, "Containment Classes %d", value1);
+                                                sub2tree = proto_item_add_subtree(sub2item, ett_nds);
                                                 ioffset = ioffset + 4;        
                                                 for (r = 0; r < value1; r++)
                                                 {
@@ -3572,14 +3784,15 @@ process_multivalues(proto_tree *ncp_tree, tvbuff_t *tvb, nds_val *values)
                                                         ioffset = ioffset + 4;
                                                         get_string(tvb, ioffset, value2, mval_buf.buffer);
                                                         temp_values.vstring = mval_buf.buffer;                                
-                                                        proto_tree_add_string(ntree, hf_nds_base_class, tvb, ioffset, 
+                                                        proto_tree_add_string(sub2tree, hf_nds_base_class, tvb, ioffset, 
                                                                 value2, temp_values.vstring);
                                                         ioffset = ioffset + value2;        
                                                         ioffset += align_4(tvb, ioffset);
                                                 }        
                                                 value1 = tvb_get_letohl(tvb, ioffset);  /* Naming Attributes */
-                                                proto_tree_add_uint_format(ntree, hf_nds_purge, tvb, ioffset,
+                                                sub2item = proto_tree_add_uint_format(sub1tree, hf_nds_purge, tvb, ioffset,
                                                         4, value1, "Naming Attributes %d", value1);
+                                                sub2tree = proto_item_add_subtree(sub2item, ett_nds);
                                                 ioffset = ioffset + 4;        
                                                 for (r = 0; r < value1; r++)
                                                 {
@@ -3587,14 +3800,15 @@ process_multivalues(proto_tree *ncp_tree, tvbuff_t *tvb, nds_val *values)
                                                         ioffset = ioffset + 4;
                                                         get_string(tvb, ioffset, value2, mval_buf.buffer);
                                                         temp_values.vstring = mval_buf.buffer;                                
-                                                        proto_tree_add_string(ntree, hf_nds_base_class, tvb, ioffset, 
+                                                        proto_tree_add_string(sub2tree, hf_mv_string, tvb, ioffset, 
                                                                 value2, temp_values.vstring);
                                                         ioffset = ioffset + value2;        
                                                         ioffset += align_4(tvb, ioffset);
                                                 }        
                                                 value1 = tvb_get_letohl(tvb, ioffset);  /* Mandatory Attributes */
-                                                proto_tree_add_uint_format(ntree, hf_nds_purge, tvb, ioffset,
+                                                sub2item = proto_tree_add_uint_format(sub1tree, hf_nds_purge, tvb, ioffset,
                                                         4, value1, "Mandatory Attributes %d", value1);
+                                                sub2tree = proto_item_add_subtree(sub2item, ett_nds);
                                                 ioffset = ioffset + 4;        
                                                 for (r = 0; r < value1; r++)
                                                 {
@@ -3602,14 +3816,15 @@ process_multivalues(proto_tree *ncp_tree, tvbuff_t *tvb, nds_val *values)
                                                         ioffset = ioffset + 4;
                                                         get_string(tvb, ioffset, value2, mval_buf.buffer);
                                                         temp_values.vstring = mval_buf.buffer;                                
-                                                        proto_tree_add_string(ntree, hf_nds_base_class, tvb, ioffset, 
+                                                        proto_tree_add_string(sub2tree, hf_mv_string, tvb, ioffset, 
                                                                 value2, temp_values.vstring);
                                                         ioffset = ioffset + value2;        
                                                         ioffset += align_4(tvb, ioffset);
                                                 }        
                                                 value1 = tvb_get_letohl(tvb, ioffset);  /* Optional Attributes */
-                                                proto_tree_add_uint_format(ntree, hf_nds_purge, tvb, ioffset,
+                                                sub2item = proto_tree_add_uint_format(sub1tree, hf_nds_purge, tvb, ioffset,
                                                         4, value1, "Optional Attributes %d", value1);
+                                                sub2tree = proto_item_add_subtree(sub2item, ett_nds);
                                                 ioffset = ioffset + 4;        
                                                 for (r = 0; r < value1; r++)
                                                 {
@@ -3617,13 +3832,13 @@ process_multivalues(proto_tree *ncp_tree, tvbuff_t *tvb, nds_val *values)
                                                         ioffset = ioffset + 4;
                                                         get_string(tvb, ioffset, value2, mval_buf.buffer);
                                                         temp_values.vstring = mval_buf.buffer;                                
-                                                        proto_tree_add_string(ntree, hf_nds_base_class, tvb, ioffset, 
+                                                        proto_tree_add_string(sub2tree, hf_mv_string, tvb, ioffset, 
                                                                 value2, temp_values.vstring);
                                                         ioffset = ioffset + value2;        
                                                         ioffset += align_4(tvb, ioffset);
                                                 }        
                                                 value1 = tvb_get_letohl(tvb, ioffset);    /* Default ACL */
-                                                proto_tree_add_uint_format(ntree, hf_nds_eid, tvb, ioffset,
+                                                proto_tree_add_uint_format(sub1tree, hf_nds_eid, tvb, ioffset,
                                                         4, value1, "Default ACL %08x", value1);
                                                 ioffset = ioffset + 4;        
                                                 if(tvb_length_remaining(tvb, ioffset) < 4 )
@@ -3634,33 +3849,34 @@ process_multivalues(proto_tree *ncp_tree, tvbuff_t *tvb, nds_val *values)
                                         if(values->vflags == 5)   /* Base Class Definitions */
                                         {
                                                 value1 = tvb_get_letohl(tvb, ioffset);         /* Creation Timestamp */
-                                                proto_tree_add_uint_format(ntree, hf_es_seconds, tvb, ioffset,
+                                                proto_tree_add_uint_format(sub1tree, hf_es_seconds, tvb, ioffset,
                                                         4, value1, "Creation Timestamp Seconds %d", value1);
                                                 ioffset = ioffset + 4;        
                                                 replica_num = tvb_get_letohs(tvb, ioffset);   /* Replica */
-                                                proto_tree_add_item(ntree, hf_nds_replica_num, tvb, ioffset, 
+                                                proto_tree_add_item(sub1tree, hf_nds_replica_num, tvb, ioffset, 
                                                         2, replica_num);
                                                 ioffset = ioffset + 2;
                                                 event_num = tvb_get_letohs(tvb, ioffset);   /* Event */
-                                                proto_tree_add_item(ntree, hf_nds_event_num, tvb, ioffset, 
+                                                proto_tree_add_item(sub1tree, hf_nds_event_num, tvb, ioffset, 
                                                         2, event_num);
                                                 ioffset = ioffset + 2;
                                                 value1 = tvb_get_letohl(tvb, ioffset);          /* Modification Timestamp */
-                                                proto_tree_add_uint_format(ntree, hf_es_seconds, tvb, ioffset,
+                                                proto_tree_add_uint_format(sub1tree, hf_es_seconds, tvb, ioffset,
                                                         4, value1, "Modification Timestamp Seconds %d", value1);
                                                 ioffset = ioffset + 4;        
                                                 replica_num = tvb_get_letohs(tvb, ioffset);   /* Replica */
-                                                proto_tree_add_item(ntree, hf_nds_replica_num, tvb, ioffset, 
+                                                proto_tree_add_item(sub1tree, hf_nds_replica_num, tvb, ioffset, 
                                                         2, replica_num);
                                                 ioffset = ioffset + 2;
                                                 event_num = tvb_get_letohs(tvb, ioffset);   /* Event */
-                                                proto_tree_add_item(ntree, hf_nds_event_num, tvb, ioffset, 
+                                                proto_tree_add_item(sub1tree, hf_nds_event_num, tvb, ioffset, 
                                                         2, event_num);
                                                 ioffset = ioffset + 2;
                                                 /* Class Definition */
                                                 value1 = tvb_get_letohl(tvb, ioffset);  /* Super Classes */
-                                                proto_tree_add_uint_format(ntree, hf_nds_purge, tvb, ioffset,
+                                                sub2item = proto_tree_add_uint_format(sub1tree, hf_nds_purge, tvb, ioffset,
                                                         4, value1, "Super Classes %d", value1);
+                                                sub2tree = proto_item_add_subtree(sub2item, ett_nds);
                                                 ioffset = ioffset + 4;        
                                                 for (r = 0; r < value1; r++)
                                                 {
@@ -3668,14 +3884,15 @@ process_multivalues(proto_tree *ncp_tree, tvbuff_t *tvb, nds_val *values)
                                                         ioffset = ioffset + 4;
                                                         get_string(tvb, ioffset, value2, mval_buf.buffer);
                                                         temp_values.vstring = mval_buf.buffer;                                
-                                                        proto_tree_add_string(ntree, hf_nds_base_class, tvb, ioffset, 
+                                                        proto_tree_add_string(sub2tree, hf_nds_super, tvb, ioffset, 
                                                                 value2, temp_values.vstring);
                                                         ioffset = ioffset + value2;        
                                                         ioffset += align_4(tvb, ioffset);
                                                 }        
                                                 value1 = tvb_get_letohl(tvb, ioffset);  /* Containment Classes */
-                                                proto_tree_add_uint_format(ntree, hf_nds_purge, tvb, ioffset,
+                                                sub2item = proto_tree_add_uint_format(sub1tree, hf_nds_purge, tvb, ioffset,
                                                         4, value1, "Containment Classes %d", value1);
+                                                sub2tree = proto_item_add_subtree(sub2item, ett_nds);
                                                 ioffset = ioffset + 4;        
                                                 for (r = 0; r < value1; r++)
                                                 {
@@ -3683,14 +3900,15 @@ process_multivalues(proto_tree *ncp_tree, tvbuff_t *tvb, nds_val *values)
                                                         ioffset = ioffset + 4;
                                                         get_string(tvb, ioffset, value2, mval_buf.buffer);
                                                         temp_values.vstring = mval_buf.buffer;                                
-                                                        proto_tree_add_string(ntree, hf_nds_base_class, tvb, ioffset, 
+                                                        proto_tree_add_string(sub2tree, hf_nds_base_class, tvb, ioffset, 
                                                                 value2, temp_values.vstring);
                                                         ioffset = ioffset + value2;        
                                                         ioffset += align_4(tvb, ioffset);
                                                 }        
                                                 value1 = tvb_get_letohl(tvb, ioffset);  /* Naming Attributes */
-                                                proto_tree_add_uint_format(ntree, hf_nds_purge, tvb, ioffset,
+                                                sub2item = proto_tree_add_uint_format(sub1tree, hf_nds_purge, tvb, ioffset,
                                                         4, value1, "Naming Attributes %d", value1);
+                                                sub2tree = proto_item_add_subtree(sub2item, ett_nds);
                                                 ioffset = ioffset + 4;        
                                                 for (r = 0; r < value1; r++)
                                                 {
@@ -3698,14 +3916,15 @@ process_multivalues(proto_tree *ncp_tree, tvbuff_t *tvb, nds_val *values)
                                                         ioffset = ioffset + 4;
                                                         get_string(tvb, ioffset, value2, mval_buf.buffer);
                                                         temp_values.vstring = mval_buf.buffer;                                
-                                                        proto_tree_add_string(ntree, hf_nds_base_class, tvb, ioffset, 
+                                                        proto_tree_add_string(sub2tree, hf_mv_string, tvb, ioffset, 
                                                                 value2, temp_values.vstring);
                                                         ioffset = ioffset + value2;        
                                                         ioffset += align_4(tvb, ioffset);
                                                 }        
                                                 value1 = tvb_get_letohl(tvb, ioffset);  /* Mandatory Attributes */
-                                                proto_tree_add_uint_format(ntree, hf_nds_purge, tvb, ioffset,
+                                                sub2item = proto_tree_add_uint_format(sub1tree, hf_nds_purge, tvb, ioffset,
                                                         4, value1, "Mandatory Attributes %d", value1);
+                                                sub2tree = proto_item_add_subtree(sub2item, ett_nds);
                                                 ioffset = ioffset + 4;        
                                                 for (r = 0; r < value1; r++)
                                                 {
@@ -3713,14 +3932,15 @@ process_multivalues(proto_tree *ncp_tree, tvbuff_t *tvb, nds_val *values)
                                                         ioffset = ioffset + 4;
                                                         get_string(tvb, ioffset, value2, mval_buf.buffer);
                                                         temp_values.vstring = mval_buf.buffer;                                
-                                                        proto_tree_add_string(ntree, hf_nds_base_class, tvb, ioffset, 
+                                                        proto_tree_add_string(sub2tree, hf_mv_string, tvb, ioffset, 
                                                                 value2, temp_values.vstring);
                                                         ioffset = ioffset + value2;        
                                                         ioffset += align_4(tvb, ioffset);
                                                 }        
                                                 value1 = tvb_get_letohl(tvb, ioffset);  /* Optional Attributes */
-                                                proto_tree_add_uint_format(ntree, hf_nds_purge, tvb, ioffset,
+                                                sub2item = proto_tree_add_uint_format(sub1tree, hf_nds_purge, tvb, ioffset,
                                                         4, value1, "Optional Attributes %d", value1);
+                                                sub2tree = proto_item_add_subtree(sub2item, ett_nds);
                                                 ioffset = ioffset + 4;        
                                                 for (r = 0; r < value1; r++)
                                                 {
@@ -3728,13 +3948,13 @@ process_multivalues(proto_tree *ncp_tree, tvbuff_t *tvb, nds_val *values)
                                                         ioffset = ioffset + 4;
                                                         get_string(tvb, ioffset, value2, mval_buf.buffer);
                                                         temp_values.vstring = mval_buf.buffer;                                
-                                                        proto_tree_add_string(ntree, hf_nds_base_class, tvb, ioffset, 
+                                                        proto_tree_add_string(sub2tree, hf_mv_string, tvb, ioffset, 
                                                                 value2, temp_values.vstring);
                                                         ioffset = ioffset + value2;        
                                                         ioffset += align_4(tvb, ioffset);
                                                 }        
                                                 value1 = tvb_get_letohl(tvb, ioffset);    /* Default ACL */
-                                                proto_tree_add_uint_format(ntree, hf_nds_eid, tvb, ioffset,
+                                                proto_tree_add_uint_format(sub1tree, hf_nds_eid, tvb, ioffset,
                                                         4, value1, "Default ACL %08x", value1);
                                                 ioffset = ioffset + 4;        
                                                 if(tvb_length_remaining(tvb, ioffset) < 4 )
@@ -3745,7 +3965,8 @@ process_multivalues(proto_tree *ncp_tree, tvbuff_t *tvb, nds_val *values)
                                 }                                        
                         }
                         break;                
-                case 14:        /* Modify Class */
+
+                case MVTYPE_MODIFY_CLASS:      /* Modify Class */
                         for (i = 1 ; i <= values->vvalue; i++ )   /* Attribute Names to add*/
                         {
                                 ioffset += align_4(tvb, ioffset);
@@ -3849,14 +4070,282 @@ process_multivalues(proto_tree *ncp_tree, tvbuff_t *tvb, nds_val *values)
         }
 }
 
+/*
+ * Defrag logic 
+ *
+ * NDS fragment not being set to 0xffffffff indicates we are inside or at the 
+ * beginning of a fragment. But when the end of the fragment 
+ * is encounterd the flag is set to 0xffffffff. So we must mark what the
+ * frame number is of the end fragment so that we will be
+ * able to redissect if the user clicks on the packet
+ * or resorts/filters the trace. 
+ *
+ * Once we are certain that we are in a fragment sequence
+ * then we can just process each fragment in this conversation
+ * until we reach the fragment == 0xffffffff packet. 
+ *
+ * We will be able to easily determine if a conversation is a fragment
+ * with the exception of the last packet in the fragment. So remember
+ * the last fragment packet number.
+ *
+ * Also the NDS dissection requires the values of NDS Verb, Version, and Flags.
+ * Without this values being remembered from the first request packet then 
+ * we will be unable to dissect the reply packet. For this reason we remember
+ * these values on the first fragment and then populate the values in the final
+ * fragment. We only do this on the first dissection.
+ *
+ * XXX - this has several problems:
+ *
+ *     1) it uses global variables ("frags");
+ *
+ *     2) the sequence numbers don't start at a fixed value, they're
+ *        per-connection sequence numbers;
+ *
+ *     3) the fragment size and handle aren't put into the protocol
+ *        tree for fragments other than the last fragment.
+ *
+ * 2) needs to be fixed by having a way of doing defragmentation using
+ * connection sequence numbers; that's needed for fragmentation in
+ * connection-oriented protocols, e.g. COTP, as well.
+ * That might let us fix 1) as well.
+ *
+ * 3) should be fixed by putting that into the protocol tree ourselves
+ * if this isn't the first fragment.
+*/         
+void
+nds_defrag(tvbuff_t *tvb, packet_info *pinfo, guint16 nw_connection, guint8 sequence, guint16 type, proto_tree *tree)
+{
+    int                 i, frag_count=0;
+    guint              len=0;
+    guint32             tid = 1;
+    tvbuff_t            *frag_tvb = NULL;
+    fragment_data       *fd_head;
+    ncp_req_hash_value *request_value = NULL;
+    conversation_t      *conversation;
+    guint32             nds_frag;
+    
+    for (i = 0; i < 9; i++) {
+        if (!frags[i].nds_fragmented)
+       {
+                frags[i].nds_frag = 0;
+        }
+    }
+    /* Check to see if defragmentation is enabeled in the dissector */
+    if (!nds_defragment) {
+        dissect_ncp_reply(tvb, pinfo, nw_connection, sequence, type, tree);
+        return;
+    }
+    /* Has this already been dissected? */
+    if (!pinfo->fd->flags.visited) {
+       /* Find the conversation whence the request would have come. */
+               conversation = find_conversation(&pinfo->src, &pinfo->dst,
+                           PT_NCP, nw_connection, nw_connection, 0);
+               if (conversation != NULL) {
+                       /* find the record telling us the request made that caused
+                          this reply */
+                       request_value = ncp_hash_lookup(conversation, sequence);
+                       if (!request_value) {
+                        dissect_ncp_reply(tvb, pinfo, nw_connection, sequence, type, tree);
+                        return;
+                }
+                       p_add_proto_data(pinfo->fd, proto_ncp, (void*) request_value);
+               }
+               /* else... we haven't seen an NCP Request for that conversation and sequence. */
+        else
+        {
+                dissect_ncp_reply(tvb, pinfo, nw_connection, sequence, type, tree);
+                return;
+        }
+    }
+    else {
+               request_value = p_get_proto_data(pinfo->fd, proto_ncp);
+               if (!request_value) {
+                dissect_ncp_reply(tvb, pinfo, nw_connection, sequence, type, tree);
+                return;
+        }
+    }
+    /* Validate that this is an NDS packet */
+    /* If this isn't an NDS packet then just return */
+    if (!request_value->ncp_rec ||
+         request_value->ncp_rec->func!=104 || request_value->ncp_rec->subfunc!=2) {
+        dissect_ncp_reply(tvb, pinfo, nw_connection, sequence, type, tree);
+        return;
+    }
+    /* Get the fragment flag */
+    nds_frag = tvb_get_letohl(tvb, 12);
+    /* Now we need to find if this is a new fragment or already one defined. */
+    /* We currently limit the maximum number of simultaneous fragments to 100. */
+    for (i=0; i<100; i++)
+    {
+        if (frags[i].nds_frag == nds_frag || frags[i].nds_frag == 0)
+        {
+                if (frags[i].nds_frag == 0)
+                {
+                        frags[i].nds_length = 0;
+                        frags[i].nds_frag = nds_frag;
+                        frags[i].nds_fragmented = TRUE;
+                }
+                break;
+        }
+    }
+    frag_count = i;
+    
+    /* Now we process the fragments */
+    if (request_value->nds_frag || (request_value->nds_end_frag == pinfo->fd->num)) 
+    {
+        /* Check to see of this is a fragment. If so then mark as a fragment. */
+        if (frags[frag_count].nds_frag==0xffffffff) {
+                request_value->nds_frag = FALSE;
+                /* nds_length of 0 means start of fragment */
+                frags[frag_count].nds_length = 0;
+        }
+        else
+        {
+                if (frags[frag_count].nds_length == 0)
+                {
+                        frags[frag_count].nds_length = tvb_get_letohl(tvb, 0);
+                }
+        }
+        /*   
+         * Fragment
+         *
+         */
+        tid = (pinfo->srcport+pinfo->destport);
+        len = tvb_reported_length(tvb);
+        if (len > 0 && tvb_bytes_exist(tvb, 0, len))
+        {
+            if (frags[frag_count].nds_length > len)
+            {
+                /* This is the first fragment so remember the verb, version, and flags. */
+                frags[frag_count].nds_frag_verb = request_value->nds_request_verb;
+                frags[frag_count].nds_frag_version = request_value->nds_version;
+                frags[frag_count].nds_frag_flags = request_value->req_nds_flags;
+                fd_head = fragment_add_seq_next(tvb, 0, pinfo, tid, nds_fragment_table, nds_reassembled_table, len, request_value->nds_frag);
+                frags[frag_count].nds_length = 1;
+            }
+            else
+            {
+                /* Subsequent fragments should be offset by 16 since we do not need */
+                /* the additional fragment handle and size fields in our composite data */
+                fd_head = fragment_add_seq_next(tvb, 16, pinfo, tid, nds_fragment_table, nds_reassembled_table, len-16, request_value->nds_frag);
+            } 
+            if (fd_head != NULL) 
+            {
+                /* Is this the last fragment? nds_frag will indicate */
+                if (fd_head->next != NULL && !request_value->nds_frag) 
+                {
+                    frag_tvb = tvb_new_real_data(fd_head->data,
+                        fd_head->len, fd_head->len);
+                    tvb_set_child_real_data_tvbuff(tvb,
+                        frag_tvb);
+                    add_new_data_source(pinfo,
+                        frag_tvb,
+                        "Reassembled NDS");
+                    /* Show all fragments. */
+                    if (tree) 
+                    {
+                        show_fragment_seq_tree(fd_head,
+                            &nds_frag_items,
+                            tree, pinfo,
+                            frag_tvb);
+                        tid++;
+                    }
+                    
+                    if (!pinfo->fd->flags.visited) 
+                    {
+                         /* Now we need to find the original fragment number. */
+                         /* Get the fragment flag */
+                         nds_frag = tvb_get_letohl(frag_tvb, 12);
+                         for (i=0; i<100; i++)
+                         {
+                             if (frags[i].nds_frag == nds_frag)
+                             {
+                                     break;
+                             }
+                         }
+                         if (frags[i].nds_frag == 0)
+                         {
+                                 /* Error can't find fragment */
+                                 /*g_assert(0);*/
+                         }
+                         frag_count = i;
+                        /* Remember this fragment information so we can dissect.
+                         * Only do this on the first dissection. After the first 
+                         * dissection we will just read the memory values. 
+                         */
+                        request_value->nds_end_frag = pinfo->fd->num;
+                        request_value->nds_request_verb = frags[frag_count].nds_frag_verb;
+                        request_value->nds_version = frags[frag_count].nds_frag_version;
+                        request_value->req_nds_flags = frags[frag_count].nds_frag_flags;
+                    }
+
+                } 
+                else 
+                {
+                    /* This is either a beggining or middle fragment on second dissection */
+                    frag_tvb = tvb_new_subset(tvb, 0, -1, -1);
+                    if (check_col(pinfo->cinfo, COL_INFO))
+                    {
+                      if (request_value->nds_frag)
+                      {
+                        col_add_fstr(pinfo->cinfo, COL_INFO, "[NDS Fragment %08x]", frags[frag_count].nds_frag);
+                      }
+                    }
+                }
+            }
+            else 
+            {
+                /* Fragment from first pass of dissection */
+                if (check_col(pinfo->cinfo, COL_INFO))
+                {
+                  if (request_value->nds_frag)
+                  {
+                     col_add_fstr(pinfo->cinfo, COL_INFO, "[NDS Fragment %08x]", frags[frag_count].nds_frag);
+                  }
+                }
+                frag_tvb = NULL;
+            }
+        }
+        else 
+        {
+            /*
+             * There are no bytes so Dissect this
+             */
+            frag_tvb = tvb_new_subset(tvb, 0, -1, -1);
+        }
+        if (frag_tvb == NULL)
+        {
+            /* This is a fragment packet */
+                frag_tvb = tvb_new_subset (tvb, 0, -1, -1);
+               nds_data_handle = find_dissector("data");
+                call_dissector(nds_data_handle, frag_tvb, pinfo, tree);
+        }
+        else
+        {
+            /* This is the end fragment so dissect */
+            if (!request_value->nds_frag) {
+                frags[frag_count].nds_length = 0;
+                dissect_ncp_reply(frag_tvb, pinfo, nw_connection, sequence, type, tree);
+            }
+        }
+    }
+    else
+    {
+        /* This is not any fragment packet */
+        frags[frag_count].nds_length = 0;
+        request_value->nds_frag = FALSE;
+        dissect_ncp_reply(tvb, pinfo, nw_connection, sequence, type, tree);
+    }
+}
+
 void
 dissect_ncp_request(tvbuff_t *tvb, packet_info *pinfo,
                guint16 nw_connection, guint8 sequence,
                guint16 type, proto_tree *ncp_tree)
 {
        guint8                  func, subfunc = 0;
-       gboolean                requires_subfunc;
-       gboolean                has_length = TRUE;
+       gboolean                requires_subfunc = FALSE;
+       gboolean                has_length = FALSE;
        ncp_req_hash_value      *request_value = NULL;
        const ncp_record        *ncp_rec = NULL;
        conversation_t          *conversation;
@@ -3869,17 +4358,6 @@ dissect_ncp_request(tvbuff_t *tvb, packet_info *pinfo,
 
        func = tvb_get_guint8(tvb, 6);
 
-       requires_subfunc = ncp_requires_subfunc(func);
-       has_length = ncp_has_length_parameter(func);
-       if (requires_subfunc) {
-               if (has_length) {
-                       subfunc = tvb_get_guint8(tvb, 9);
-               }
-               else {
-                       subfunc = tvb_get_guint8(tvb, 7);
-               }
-       }
-
        /* Determine which ncp_record to use. */
        switch (type) {
                case NCP_ALLOCATE_SLOT:
@@ -3902,6 +4380,16 @@ dissect_ncp_request(tvbuff_t *tvb, packet_info *pinfo,
                         }        
                        break;
                case NCP_SERVICE_REQUEST:
+                       requires_subfunc = ncp_requires_subfunc(func);
+                       has_length = ncp_has_length_parameter(func);
+                       if (requires_subfunc) {
+                               if (has_length) {
+                                       subfunc = tvb_get_guint8(tvb, 9);
+                               }
+                               else {
+                                       subfunc = tvb_get_guint8(tvb, 7);
+                               }
+                       }
                        ncp_rec = ncp_record_find(func, subfunc);
                        break;
                case NCP_DEALLOCATE_SLOT:
@@ -3915,22 +4403,28 @@ dissect_ncp_request(tvbuff_t *tvb, packet_info *pinfo,
                         break;        
                default:
                        ncp_rec = NULL;
+                       break;
        }
 
        /* Fill in the INFO column. */
        if (check_col(pinfo->cinfo, COL_INFO)) {
                        if (ncp_rec) {
                        col_add_fstr(pinfo->cinfo, COL_INFO, "C %s", ncp_rec->name);
+                       if (ncp_rec->req_info_str) {
+                               /* We want to add more stuff to the Info
+                                  column. */
+                               run_info_str = TRUE;
+                       }
                }
                else {
                        if (requires_subfunc) {
                                col_add_fstr(pinfo->cinfo, COL_INFO,
-                                       "C Unknown Function %d %d (0x%02X/0x%02x)",
+                                       "C Unknown Function %u %u (0x%02X/0x%02x)",
                                        func, subfunc, func, subfunc);
                        }
                        else {
                                col_add_fstr(pinfo->cinfo, COL_INFO,
-                                       "C Unknown Function %d (0x%02x)",
+                                       "C Unknown Function %u (0x%02x)",
                                        func, func);
                        }
                }
@@ -3955,34 +4449,34 @@ dissect_ncp_request(tvbuff_t *tvb, packet_info *pinfo,
                }
                request_value = ncp_hash_insert(conversation, sequence, ncp_rec);
                request_value->req_frame_num = pinfo->fd->num;
+               request_value->req_frame_time.secs=pinfo->fd->abs_secs;
+               request_value->req_frame_time.nsecs=pinfo->fd->abs_usecs*1000;
 
                /* If this is the first time we're examining the packet,
                 * check to see if this NCP type uses a "request condition".
                 * If so, we have to build a proto_tree because request conditions
                 * use display filters to work, and without a proto_tree,
-                * display filters can't possibly work. If we already have
-                * a proto_tree, then wonderful. If we don't, we need to build
-                * one. */
+                * display filters can't possibly work. */
                if (ncp_rec) {
                                if (ncp_rec->req_cond_indexes) {
                                run_req_cond = TRUE;
                                }
-                       /* Only create info string if COL_INFO is available. */
-                       if (ncp_rec->req_info_str && check_col(pinfo->cinfo, COL_INFO)) {
-                               run_info_str = TRUE;
-                       }
-                       /* We also have to use a tree if we have to construct an info_str */
-                       if ((run_info_str || run_req_cond) && !ncp_tree) {
-                               proto_item *ti;
-                       
-                               temp_tree = proto_tree_create_root();
-                               proto_tree_set_visible(temp_tree, FALSE);
-                               ti = proto_tree_add_item(temp_tree, proto_ncp, tvb, 0, -1, FALSE);
-                               ncp_tree = proto_item_add_subtree(ti, ett_ncp);
-                        }
                }
        }
 
+       /* If we have to handle a request condition, or have to
+          add to the Info column, we need to construct a protocol
+          tree.  If we already have a proto_tree, then wonderful.
+          If we don't, we need to build one. */
+       if ((run_info_str || run_req_cond) && !ncp_tree) {
+               proto_item *ti;
+
+               temp_tree = proto_tree_create_root();
+               proto_tree_set_visible(temp_tree, FALSE);
+               ti = proto_tree_add_item(temp_tree, proto_ncp, tvb, 0, -1, FALSE);
+               ncp_tree = proto_item_add_subtree(ti, ett_ncp);
+       }
+
        if (ncp_tree) {
                /* If the dissection throws an exception, be sure to free
                 * the temporary proto_tree that was created. Because of the
@@ -4016,9 +4510,6 @@ dissect_ncp_request(tvbuff_t *tvb, packet_info *pinfo,
                        proto_tree_prime_hfid(ncp_tree, *ncp_rec->req_info_str->hf_ptr);
                }
 
-               conversation = find_conversation(&pinfo->src, &pinfo->dst,
-                   PT_NCP, nw_connection, nw_connection, 0);
-
                switch (type) {
                         case NCP_BROADCAST_SLOT:
                                ; /* nothing */
@@ -4026,7 +4517,7 @@ dissect_ncp_request(tvbuff_t *tvb, packet_info *pinfo,
 
                        case NCP_SERVICE_REQUEST:
                                proto_tree_add_uint_format(ncp_tree, hf_ncp_func, tvb, 6, 1,
-                                       func, "Function: %d (0x%02X), %s",
+                                       func, "Function: %u (0x%02X), %s",
                                        func, func, ncp_rec ? ncp_rec->name : "Unknown");
                                break;
 
@@ -4040,13 +4531,13 @@ dissect_ncp_request(tvbuff_t *tvb, packet_info *pinfo,
                                proto_tree_add_item(ncp_tree, hf_ncp_length, tvb, 7,
                                        2, FALSE);
                                proto_tree_add_uint_format(ncp_tree, hf_ncp_subfunc, tvb, 9, 1,
-                                       subfunc, "SubFunction: %d (0x%02x)",
+                                       subfunc, "SubFunction: %u (0x%02x)",
                                        subfunc, subfunc);
                                ptvc = ptvcursor_new(ncp_tree, tvb, 10);
                        }
                        else {
                                proto_tree_add_uint_format(ncp_tree, hf_ncp_subfunc, tvb, 7, 1,
-                                       subfunc, "SubFunction: %d (0x%02x)",
+                                       subfunc, "SubFunction: %u (0x%02x)",
                                        subfunc, subfunc);
                                ptvc = ptvcursor_new(ncp_tree, tvb, 8);
                        }
@@ -4058,7 +4549,7 @@ dissect_ncp_request(tvbuff_t *tvb, packet_info *pinfo,
                /* The group is not part of the packet, but it's useful
                 * information to display anyway. */
                if (ncp_rec) {
-                       proto_tree_add_text(ncp_tree, tvb, 6, 1, "Group: %s",
+                       proto_tree_add_text(ncp_tree, tvb, 0, 0, "Group: %s",
                                        ncp_groups[ncp_rec->group]);
                }
 
@@ -4067,6 +4558,10 @@ dissect_ncp_request(tvbuff_t *tvb, packet_info *pinfo,
                        process_ptvc_record(ptvc, ncp_rec->request_ptvc, NULL, TRUE, ncp_rec);
                }
                ptvcursor_free(ptvc);
+                /* NMAS packets are dessected in packet-ncp-nmas.c */
+                if (func == 0x5e && ncp_tree) {
+                        dissect_nmas_request(tvb, pinfo, ncp_tree, request_value);
+                }
 
                /* Now that the dissection is done, do we need to run
                 * some display filters on the resulting tree in order
@@ -4091,14 +4586,30 @@ dissect_ncp_request(tvbuff_t *tvb, packet_info *pinfo,
                         * get to them. */
                        request_value->req_cond_results = results;
                }
-
                /* Construct the info string if necessary */
                if (run_info_str) {
                        GPtrArray *parray;
+                        char*   byte_string;
+                        char    non_uni_string[1024];
                        int i, len;
                        field_info *finfo;
                         int info_type;
                         
+                        if (!request_value)
+                        {
+                               conversation = find_conversation(&pinfo->src, &pinfo->dst,
+                                   PT_NCP, nw_connection, nw_connection, 0);
+                               if (conversation != NULL) {
+                                       /* find the record telling us the request made that caused
+                                       this reply */
+                                       request_value = ncp_hash_lookup(conversation, sequence);
+                                }
+                                if (!conversation || !request_value)
+                                {
+                                        return;
+                                }
+                        }
+                        
                        parray = proto_get_finfo_ptr_array(ncp_tree,
                                *ncp_rec->req_info_str->hf_ptr);
                        len = g_ptr_array_len(parray);
@@ -4109,45 +4620,79 @@ dissect_ncp_request(tvbuff_t *tvb, packet_info *pinfo,
 
                                finfo = g_ptr_array_index(parray, 0);
 
-                                info_type = get_info_type((gchar*) ncp_rec->req_info_str->first_string);
+                                info_type = get_info_type((const gchar*) ncp_rec->req_info_str->first_string);
                                                             
-                                if (info_type == 2) {    // Is this  a string or not?
-                                
-                                        col_append_fstr(pinfo->cinfo, COL_INFO,
-                                               (gchar*) ncp_rec->req_info_str->first_string,
-                                                       fvalue_get(finfo->value));
+                                if (info_type != 0) {    /* Is this  a string or not? */
+                                       
+                                        if (info_type == 1) {   /* Is this bytes? */
+                                                byte_string = bytes_to_str(fvalue_get(&finfo->value), fvalue_length(&finfo->value));
+                                                col_append_fstr(pinfo->cinfo, COL_INFO,
+                                                       (const gchar*) ncp_rec->req_info_str->first_string,
+                                                               byte_string);
+                                        }
+                                        else
+                                        {
+                                                if (info_type == 2) {   /* Is this a String? */
+                                                        uni_to_string(fvalue_get(&finfo->value), fvalue_length(&finfo->value), non_uni_string);
+                                                        col_append_fstr(pinfo->cinfo, COL_INFO,
+                                                               (const gchar*) ncp_rec->req_info_str->first_string,
+                                                               non_uni_string);
+                                                }
+                                                else
+                                                {
+                                                        col_append_fstr(pinfo->cinfo, COL_INFO,
+                                                               (const gchar*) ncp_rec->req_info_str->first_string,
+                                                                       fvalue_get(&finfo->value));
+                                                }
+                                        }
                                 }
                                 else
                                 {
-                                
                                        col_append_fstr(pinfo->cinfo, COL_INFO,
-                                               (gchar*) ncp_rec->req_info_str->first_string,
-                                               fvalue_get_integer(finfo->value));
+                                               (const gchar*) ncp_rec->req_info_str->first_string,
+                                               fvalue_get_integer(&finfo->value));
                                 }
                         }
                        if (len > 1) {
                                for (i = 1; i < len; i++) {
+                                        non_uni_string[0]='\0';
                                        finfo = g_ptr_array_index(parray, i);
-                                        info_type = get_info_type((gchar*) ncp_rec->req_info_str->repeat_string);
+                                        info_type = get_info_type((const gchar*) ncp_rec->req_info_str->repeat_string);
                                                                     
-                                        if (info_type == 2) {    // Is this  a string or not?
-                                        
+                                        if (info_type != 0) {    /* Is this  a string or not? */
+                                              if (info_type == 1) 
+                                              {   /* Is this bytes? */
+                                                byte_string = bytes_to_str(fvalue_get(&finfo->value), fvalue_length(&finfo->value));
                                                 col_append_fstr(pinfo->cinfo, COL_INFO,
-                                                       (gchar*) ncp_rec->req_info_str->repeat_string,
-                                                               fvalue_get(finfo->value));
+                                                       (const gchar*) ncp_rec->req_info_str->repeat_string,
+                                                               byte_string);
+                                              }
+                                              else
+                                              {
+                                                        if (info_type == 2) {   /* Is this a String? */
+                                                                uni_to_string(fvalue_get(&finfo->value), fvalue_length(&finfo->value), non_uni_string);
+                                                                col_append_fstr(pinfo->cinfo, COL_INFO,
+                                                                       (const gchar*) ncp_rec->req_info_str->repeat_string,
+                                                                               non_uni_string);
+                                                        }
+                                                        else
+                                                        {
+                                                                col_append_fstr(pinfo->cinfo, COL_INFO,
+                                                                       (const gchar*) ncp_rec->req_info_str->repeat_string,
+                                                                               fvalue_get(&finfo->value));
+                                                        }
+                                              }
                                         }
                                         else
                                         {
-                                        
                                                col_append_fstr(pinfo->cinfo, COL_INFO,
-                                                       (gchar*) ncp_rec->req_info_str->repeat_string,
-                                                       fvalue_get_integer(finfo->value));
+                                                       (const gchar*) ncp_rec->req_info_str->repeat_string,
+                                                       fvalue_get_integer(&finfo->value));
                                         }
                                 }
                        }
                }
 
-
                /* Free the temporary proto_tree */
                CLEANUP_CALL_AND_POP;
        }
@@ -4159,18 +4704,15 @@ dissect_ncp_reply(tvbuff_t *tvb, packet_info *pinfo,
        guint16 nw_connection, guint8 sequence, guint16 type,
        proto_tree *ncp_tree)
 {
-       conversation_t                  *conversation;
-       conversation_t                  *eid_conversation;
+       conversation_t                  *conversation = NULL;
        ncp_req_hash_value              *request_value = NULL;
        ncp_req_eid_hash_value          *request_eid_value = NULL;
        const ncp_record                *ncp_rec = NULL;
-       const ncp_record                *ncp_eid_rec = NULL;
        int                             *req_cond_results;
        guint8                          completion_code=0;
        guint                           length;
        ptvcursor_t                     *ptvc = NULL;
        const char                      *error_string;
-        char                            *n_string="";
         guint32                         nds_string_len = 0;
         guint8                          ping_version = 0;
         guint32                         nds_flags = 0;
@@ -4178,26 +4720,21 @@ dissect_ncp_reply(tvbuff_t *tvb, packet_info *pinfo,
         nw_uni_t                        reply_buffer;
         char *                          verb_string="";
         guint32                         nds_error_code = 0;
-        guint32                         nds_error_offset = 0;
         guint32                         nds_reply_buffer = 0;
         char *                          nds_error_string = NULL;
         guint32                         nds_frag=0;
-        nds_val                         p1values;
-        nds_val                         p2values;
-        nds_val                         p3values;
-        nds_val                         p4values;
-        nds_val                         p5values;
-        nds_val                         p6values;
-        nds_val                         p7values;
-        nds_val                         p8values;      
-        nds_val                         p9values;
+       nds_val                         pvalues[9];
+       char                            string_buffer[9][1024];
         gboolean                        resolve_eid=FALSE;
         guint32                         global_eid=0;
         gboolean                        add_eid = FALSE;
-        char                            *global_object_name='\0';
+        char                            global_object_name[256];
+       int                             i;
+        guint32                         bvalue=0;
         
-
-        reply_buffer.buffer = "\0";
+       strcpy(reply_buffer.buffer, "");
+       strcpy(global_object_name, "");
+       
        if (!pinfo->fd->flags.visited) {
                /* Find the conversation whence the request would have come. */
                conversation = find_conversation(&pinfo->src, &pinfo->dst,
@@ -4220,69 +4757,80 @@ dissect_ncp_reply(tvbuff_t *tvb, packet_info *pinfo,
                }
        }
 
+       if (check_col(pinfo->cinfo, COL_PROTOCOL)) {
+                if (ncp_rec && ncp_rec->func==0x68 &&
+                   (ncp_rec->subfunc==0x02 || ncp_rec->subfunc==0x01)) {
+                       col_set_str(pinfo->cinfo, COL_PROTOCOL, "NDS");
+                }
+       }
+
        /* A completion code of 0 always means OK. Non-zero means failure,
         * but each non-zero value has a different meaning. And the same value
         * can have different meanings, depending on the ncp.func (and ncp.subfunc)
         * value. */
        completion_code = tvb_get_guint8(tvb, 6);
-       if (ncp_rec && ncp_rec->errors) {
-               error_string = ncp_error_string(ncp_rec->errors, completion_code);
-       }
-       else if (completion_code == 0) {
-               error_string = "OK";
-       }
-       else {
-               error_string = "Not OK";
+       if (completion_code == 0) {
+               
+                if(type == NCP_POSITIVE_ACK)
+                {
+                        error_string = "Server Busy, Request Being Processed";
+                }
+                else
+                {                
+                        error_string = "OK";
+                }        
+       } else {
+               if (ncp_rec && ncp_rec->errors) {
+                       error_string = ncp_error_string(ncp_rec->errors, completion_code);
+               }
+               else {
+                       error_string = "Not OK";
+               }
        }
-        if (ncp_rec && ncp_rec->func==0x68 && ncp_rec->subfunc==0x02)
+        if (type == NCP_SERVICE_REPLY && ncp_rec && ncp_rec->func==0x68 &&
+            ncp_rec->subfunc==0x02)
         {
                 nds_offset = 8;
-                nds_reply_buffer = tvb_get_letohl(tvb, nds_offset);        
-                nds_frag = tvb_get_letohl(tvb, 12);        
+                nds_reply_buffer = tvb_get_letohl(tvb, nds_offset);
+                nds_offset += 4;        
+                nds_frag = tvb_get_letohl(tvb, nds_offset);        
                 if (nds_reply_buffer > 7)
                 {                        
-                        nds_offset = 16
+                        nds_offset += 4
                         nds_error_code = tvb_get_letohl(tvb, nds_offset);
-                        error_string = match_strval(nds_error_code, nds_reply_errors);
-                        if (error_string == NULL)
+                        nds_error_string = match_strval(nds_error_code, nds_reply_errors);
+                        if (nds_error_string == NULL)
                         {
-                                nds_offset = 19;
-                                nds_error_code = tvb_get_letohl(tvb, nds_offset);
-                                error_string = match_strval(nds_error_code, nds_reply_errors);
+                                nds_error_string = "NDS Error - No Definition Found";
                         }
-                        if (error_string == NULL || nds_error_code == 0x00000000)
+                        if (nds_error_string == NULL || nds_error_code == 0x00000000)
                         {
-                                if (nds_frag != 0xffffffff)
-                                {
-                                        error_string = "NDS Fragment";
-                                }
-                                else
-                                {        
-                                        error_string = "Ok";
-                                }
+                                nds_error_string = "Ok";
                         }        
                 }
         }
 
        if (check_col(pinfo->cinfo, COL_INFO)) {
-                if (ncp_rec && ncp_rec->func==0x68 && ncp_rec->subfunc==0x02) {
-                       col_set_str(pinfo->cinfo, COL_PROTOCOL, "NDS");
-                }
-                if (ncp_rec && ncp_rec->func==0x68 && ncp_rec->subfunc==0x01) {
-                       col_set_str(pinfo->cinfo, COL_PROTOCOL, "NDS");
-                }
                col_add_fstr(pinfo->cinfo, COL_INFO, "%s %s",
                    type == NCP_SERVICE_REPLY ? "R" : "ACK",
-                   error_string);
+                   nds_error_string ? nds_error_string : error_string);
        }
 
        if (ncp_tree) {
-
                if (request_value) {
+                       nstime_t ns;
+
                        proto_tree_add_uint(ncp_tree, hf_ncp_req_frame_num, tvb, 0, 0,
                                request_value->req_frame_num);
-               }
+                       ns.secs=pinfo->fd->abs_secs-request_value->req_frame_time.secs;
+                       ns.nsecs=pinfo->fd->abs_usecs*1000-request_value->req_frame_time.nsecs;
+                       if(ns.nsecs<0){
+                               ns.nsecs+=1000000000;
+                               ns.secs--;
+                       }
+                       proto_tree_add_time(ncp_tree, hf_ncp_req_frame_time, tvb, 0, 0, &ns);
 
+               }
 
                /* Put the func (and maybe subfunc) from the request packet
                 * in the proto tree, but hidden. That way filters on ncp.func
@@ -4290,11 +4838,11 @@ dissect_ncp_reply(tvbuff_t *tvb, packet_info *pinfo,
                 */
                if (ncp_rec) {
                        proto_tree_add_uint_format(ncp_tree, hf_ncp_func, tvb, 6, 0,
-                               ncp_rec->func, "Function: %d (0x%02X), %s",
+                               ncp_rec->func, "Function: %u (0x%02X), %s",
                                ncp_rec->func, ncp_rec->func, ncp_rec->name);
                        if (ncp_requires_subfunc(ncp_rec->func)) {
                                proto_tree_add_uint_format(ncp_tree, hf_ncp_subfunc, tvb, 6, 0,
-                                       ncp_rec->subfunc, "SubFunction: %d (0x%02x)",
+                                       ncp_rec->subfunc, "SubFunction: %u (0x%02x)",
                                        ncp_rec->subfunc, ncp_rec->subfunc);
                        }
                }
@@ -4304,15 +4852,27 @@ dissect_ncp_reply(tvbuff_t *tvb, packet_info *pinfo,
                        completion_code, completion_code, error_string);
 
                proto_tree_add_item(ncp_tree, hf_ncp_connection_status, tvb, 7, 1, FALSE);
+
+               /*
+                * Unless this is a reply, that's all there is to parse.
+                */
+               if (type != NCP_SERVICE_REPLY)
+                       return;
+
                 /* Decode NDS Reply packets */
                 if (ncp_rec) {
-                        if (ncp_rec->func == 0x68 && ncp_rec->subfunc == 0x01) {
+                        /* Dissect NMAS Reply packets */
+                        if (ncp_rec->func == 0x5e && request_value)
+                        {
+                                dissect_nmas_reply(tvb, pinfo, ncp_tree, ncp_rec->func, ncp_rec->subfunc, request_value);
+                        }
+                        if ((ncp_rec->func == 0x68 && ncp_rec->subfunc == 0x01) && completion_code == 0) {
                                 ping_version = tvb_get_guint8(tvb, 8);
                                proto_tree_add_item(ncp_tree, hf_ping_version, tvb, 8, 1, TRUE);
                                 if (ping_version == 9) {
                                         nds_string_len = tvb_get_ntohl(tvb, 9);
                                         nds_offset = nds_string_len+16;
-                                       proto_tree_add_item(ncp_tree, hf_nds_string, tvb, 16, nds_string_len, FALSE);
+                                       proto_tree_add_item(ncp_tree, hf_nds_tree_name, tvb, 16, nds_string_len, FALSE);
                                                proto_tree_add_item(ncp_tree, hf_nds_reply_depth, tvb, nds_offset, 4, FALSE);
                                                proto_tree_add_item(ncp_tree, hf_nds_reply_rev, tvb, (nds_offset+4), 4, FALSE);
                                                proto_tree_add_item(ncp_tree, hf_nds_reply_flags, tvb, (nds_offset+8), 4, TRUE);
@@ -4320,26 +4880,294 @@ dissect_ncp_reply(tvbuff_t *tvb, packet_info *pinfo,
                                 else {
                                         nds_offset = 12;
                                         nds_flags = request_value->req_nds_flags;
-                                        if (nds_flags & 0x00200000) {
-                                                nds_offset = nds_offset+4;
-                                        }
-                                        if (nds_flags & 0x00000002) {
-                                               proto_tree_add_item(ncp_tree, hf_nds_reply_depth, tvb, nds_offset, 4, TRUE);
-                                                nds_offset = nds_offset+4;
-                                        }
-                                        if (nds_flags & 0x00000004) {
-                                               proto_tree_add_item(ncp_tree, hf_nds_reply_rev, tvb, nds_offset, 4, TRUE);
-                                                nds_offset = nds_offset+4;
-                                        }
-                                        if (nds_flags & 0x00000008) {
-                                               proto_tree_add_item(ncp_tree, hf_nds_reply_flags, tvb, nds_offset, 4, TRUE);
-                                                nds_offset = nds_offset+4;
-                                        }
-                                        if (nds_flags & 0x00020000) {
-                                                nds_string_len = tvb_get_letohl(tvb, nds_offset);
-                                                get_string(tvb, nds_offset+4, nds_string_len, reply_buffer.buffer);
-                                                /*nds_string_len = strlen(reply_buffer.buffer);*/
-                                                proto_tree_add_text(ncp_tree, tvb, nds_offset+4, nds_string_len, "NDS Tree Name: %s", reply_buffer.buffer);
+                                        bvalue = 0x00000001;
+                                               
+                                        for (i = 0 ; i < 32; i++ ) {
+                                                if (nds_flags & bvalue) 
+                                                {
+                                                        switch(bvalue)
+                                                        {
+                                                                case 0x00000001:   /* Supported Fields */
+                                                                        pvalues[0].vvalue = tvb_get_letohs(tvb, nds_offset);
+                                                                        pvalues[0].vtype = VTYPE_BITFIELD;
+                                                                        pvalues[0].vstring = "";
+                                                                        pvalues[0].vdesc = "Ping (low) Supported Fields:";
+                                                                        pvalues[0].vlength = 2;
+                                                                        pvalues[0].hfname= hf_nds_rflags;
+                                                                        pvalues[0].voffset = nds_offset;
+                                                                        pvalues[0].bit1 = "Supported Fields";
+                                                                        pvalues[0].bit1hfname = hf_bit1pingflags1;
+                                                                        pvalues[0].bit2 = "Depth";
+                                                                        pvalues[0].bit2hfname = hf_bit2pingflags1;
+                                                                        pvalues[0].bit3 = "Revision";
+                                                                        pvalues[0].bit3hfname = hf_bit3pingflags1;
+                                                                        pvalues[0].bit4 = "Flags";
+                                                                        pvalues[0].bit4hfname = hf_bit4pingflags1;
+                                                                        pvalues[0].bit5 = "Verification Flags";
+                                                                        pvalues[0].bit5hfname = hf_bit5pingflags1;
+                                                                        pvalues[0].bit6 = "Letter Version";
+                                                                        pvalues[0].bit6hfname = hf_bit6pingflags1;
+                                                                        pvalues[0].bit7 = "OS Version";
+                                                                        pvalues[0].bit7hfname = hf_bit7pingflags1;
+                                                                        pvalues[0].bit8 = "License Flags";
+                                                                        pvalues[0].bit8hfname = hf_bit8pingflags1;
+                                                                        pvalues[0].bit9 = "DS Time";
+                                                                        pvalues[0].bit9hfname = hf_bit9pingflags1;
+                                                                        pvalues[0].bit10 = "Not Defined";
+                                                                        pvalues[0].bit10hfname = hf_bit10pingflags1;
+                                                                        pvalues[0].bit11 = "Not Defined";
+                                                                        pvalues[0].bit11hfname = hf_bit11pingflags1;
+                                                                        pvalues[0].bit12 = "Not Defined";
+                                                                        pvalues[0].bit12hfname = hf_bit12pingflags1;
+                                                                        pvalues[0].bit13 = "Not Defined";
+                                                                        pvalues[0].bit13hfname = hf_bit13pingflags1;
+                                                                        pvalues[0].bit14 = "Not Defined";
+                                                                        pvalues[0].bit14hfname = hf_bit14pingflags1;
+                                                                        pvalues[0].bit15 = "Not Defined";
+                                                                        pvalues[0].bit15hfname = hf_bit15pingflags1;
+                                                                        pvalues[0].bit16 = "Not Defined";
+                                                                        pvalues[0].bit16hfname = hf_bit16pingflags1;
+                                                                        
+                                                                        process_bitfield(ncp_tree, tvb, &pvalues[0]);
+                                                                        nds_offset += 2;
+                                                                        
+                                                                        pvalues[0].vvalue = tvb_get_letohs(tvb, nds_offset);
+                                                                        pvalues[0].vtype = VTYPE_BITFIELD;
+                                                                        pvalues[0].vstring = "";
+                                                                        pvalues[0].vdesc = "Ping (high) Supported Fields:";
+                                                                        pvalues[0].vlength = 2;
+                                                                        pvalues[0].hfname= hf_nds_rflags;
+                                                                        pvalues[0].voffset = nds_offset;
+                                                                        pvalues[0].bit1 = "Sap Name";
+                                                                        pvalues[0].bit1hfname = hf_bit1pingflags2;
+                                                                        pvalues[0].bit2 = "Tree Name";
+                                                                        pvalues[0].bit2hfname = hf_bit2pingflags2;
+                                                                        pvalues[0].bit3 = "OS Name";
+                                                                        pvalues[0].bit3hfname = hf_bit3pingflags2;
+                                                                        pvalues[0].bit4 = "Hardware Name";
+                                                                        pvalues[0].bit4hfname = hf_bit4pingflags2;
+                                                                        pvalues[0].bit5 = "Vendor Name";
+                                                                        pvalues[0].bit5hfname = hf_bit5pingflags2;
+                                                                        pvalues[0].bit6 = "Not Defined";
+                                                                        pvalues[0].bit6hfname = hf_bit6pingflags2;
+                                                                        pvalues[0].bit7 = "Not Defined";
+                                                                        pvalues[0].bit7hfname = hf_bit7pingflags2;
+                                                                        pvalues[0].bit8 = "Not Defined";
+                                                                        pvalues[0].bit8hfname = hf_bit8pingflags2;
+                                                                        pvalues[0].bit9 = "Not Defined";
+                                                                        pvalues[0].bit9hfname = hf_bit9pingflags2;
+                                                                        pvalues[0].bit10 = "Not Defined";
+                                                                        pvalues[0].bit10hfname = hf_bit10pingflags2;
+                                                                        pvalues[0].bit11 = "Not Defined";
+                                                                        pvalues[0].bit11hfname = hf_bit11pingflags2;
+                                                                        pvalues[0].bit12 = "Not Defined";
+                                                                        pvalues[0].bit12hfname = hf_bit12pingflags2;
+                                                                        pvalues[0].bit13 = "Not Defined";
+                                                                        pvalues[0].bit13hfname = hf_bit13pingflags2;
+                                                                        pvalues[0].bit14 = "Not Defined";
+                                                                        pvalues[0].bit14hfname = hf_bit14pingflags2;
+                                                                        pvalues[0].bit15 = "Not Defined";
+                                                                        pvalues[0].bit15hfname = hf_bit15pingflags2;
+                                                                        pvalues[0].bit16 = "Not Defined";
+                                                                        pvalues[0].bit16hfname = hf_bit16pingflags2;
+                                                                        
+                                                                        process_bitfield(ncp_tree, tvb, &pvalues[0]);
+                                                                        nds_offset += 2;
+                                                                        break;
+                                                                case 0x00000002:
+                                                                       proto_tree_add_item(ncp_tree, hf_nds_reply_depth, tvb, nds_offset, 4, TRUE);
+                                                                        nds_offset += 4;
+                                                                        break;
+                                                                case 0x00000004:
+                                                                       proto_tree_add_item(ncp_tree, hf_nds_reply_rev, tvb, nds_offset, 4, TRUE);
+                                                                        nds_offset += 4;
+                                                                        break;
+                                                                case 0x00000008:
+                                                                        pvalues[0].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                                        pvalues[0].vtype = VTYPE_BITFIELD;
+                                                                        pvalues[0].vstring = "";
+                                                                        pvalues[0].vdesc = "Ping Flags:";
+                                                                        pvalues[0].vlength = 4;
+                                                                        pvalues[0].hfname= hf_nds_rflags;
+                                                                        pvalues[0].voffset = nds_offset;
+                                                                        pvalues[0].bit1 = "Root Most Master Replica";
+                                                                        pvalues[0].bit1hfname = hf_bit1pingpflags1;
+                                                                        pvalues[0].bit2 = "Time Synchronized";
+                                                                        pvalues[0].bit2hfname = hf_bit2pingpflags1;
+                                                                        pvalues[0].bit3 = "Not Defined";
+                                                                        pvalues[0].bit3hfname = hf_bit3pingpflags1;
+                                                                        pvalues[0].bit4 = "Not Defined";
+                                                                        pvalues[0].bit4hfname = hf_bit4pingpflags1;
+                                                                        pvalues[0].bit5 = "Not Defined";
+                                                                        pvalues[0].bit5hfname = hf_bit5pingpflags1;
+                                                                        pvalues[0].bit6 = "Not Defined";
+                                                                        pvalues[0].bit6hfname = hf_bit6pingpflags1;
+                                                                        pvalues[0].bit7 = "Not Defined";
+                                                                        pvalues[0].bit7hfname = hf_bit7pingpflags1;
+                                                                        pvalues[0].bit8 = "Not Defined";
+                                                                        pvalues[0].bit8hfname = hf_bit8pingpflags1;
+                                                                        pvalues[0].bit9 = "Not Defined";
+                                                                        pvalues[0].bit9hfname = hf_bit9pingpflags1;
+                                                                        pvalues[0].bit10 = "Not Defined";
+                                                                        pvalues[0].bit10hfname = hf_bit10pingpflags1;
+                                                                        pvalues[0].bit11 = "Not Defined";
+                                                                        pvalues[0].bit11hfname = hf_bit11pingpflags1;
+                                                                        pvalues[0].bit12 = "Not Defined";
+                                                                        pvalues[0].bit12hfname = hf_bit12pingpflags1;
+                                                                        pvalues[0].bit13 = "Not Defined";
+                                                                        pvalues[0].bit13hfname = hf_bit13pingpflags1;
+                                                                        pvalues[0].bit14 = "Not Defined";
+                                                                        pvalues[0].bit14hfname = hf_bit14pingpflags1;
+                                                                        pvalues[0].bit15 = "Not Defined";
+                                                                        pvalues[0].bit15hfname = hf_bit15pingpflags1;
+                                                                        pvalues[0].bit16 = "Not Defined";
+                                                                        pvalues[0].bit16hfname = hf_bit16pingpflags1;
+                                                                        
+                                                                        process_bitfield(ncp_tree, tvb, &pvalues[0]);
+                                                                        nds_offset += 4;
+                                                                        break;
+                                                                case 0x00000010:
+                                                                        pvalues[0].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                                        pvalues[0].vtype = VTYPE_BITFIELD;
+                                                                        pvalues[0].vstring = "";
+                                                                        pvalues[0].vdesc = "Verification Flags:";
+                                                                        pvalues[0].vlength = 4;
+                                                                        pvalues[0].hfname= hf_nds_rflags;
+                                                                        pvalues[0].voffset = nds_offset;
+                                                                        pvalues[0].bit1 = "Checksum";
+                                                                        pvalues[0].bit1hfname = hf_bit1pingvflags1;
+                                                                        pvalues[0].bit2 = "CRC32";
+                                                                        pvalues[0].bit2hfname = hf_bit2pingvflags1;
+                                                                        pvalues[0].bit3 = "Not Defined";
+                                                                        pvalues[0].bit3hfname = hf_bit3pingvflags1;
+                                                                        pvalues[0].bit4 = "Not Defined";
+                                                                        pvalues[0].bit4hfname = hf_bit4pingvflags1;
+                                                                        pvalues[0].bit5 = "Not Defined";
+                                                                        pvalues[0].bit5hfname = hf_bit5pingvflags1;
+                                                                        pvalues[0].bit6 = "Not Defined";
+                                                                        pvalues[0].bit6hfname = hf_bit6pingvflags1;
+                                                                        pvalues[0].bit7 = "Not Defined";
+                                                                        pvalues[0].bit7hfname = hf_bit7pingvflags1;
+                                                                        pvalues[0].bit8 = "Not Defined";
+                                                                        pvalues[0].bit8hfname = hf_bit8pingvflags1;
+                                                                        pvalues[0].bit9 = "Not Defined";
+                                                                        pvalues[0].bit9hfname = hf_bit9pingvflags1;
+                                                                        pvalues[0].bit10 = "Not Defined";
+                                                                        pvalues[0].bit10hfname = hf_bit10pingvflags1;
+                                                                        pvalues[0].bit11 = "Not Defined";
+                                                                        pvalues[0].bit11hfname = hf_bit11pingvflags1;
+                                                                        pvalues[0].bit12 = "Not Defined";
+                                                                        pvalues[0].bit12hfname = hf_bit12pingvflags1;
+                                                                        pvalues[0].bit13 = "Not Defined";
+                                                                        pvalues[0].bit13hfname = hf_bit13pingvflags1;
+                                                                        pvalues[0].bit14 = "Not Defined";
+                                                                        pvalues[0].bit14hfname = hf_bit14pingvflags1;
+                                                                        pvalues[0].bit15 = "Not Defined";
+                                                                        pvalues[0].bit15hfname = hf_bit15pingvflags1;
+                                                                        pvalues[0].bit16 = "Not Defined";
+                                                                        pvalues[0].bit16hfname = hf_bit16pingvflags1;
+                                                                        
+                                                                        process_bitfield(ncp_tree, tvb, &pvalues[0]);
+                                                                        nds_offset += 4;
+                                                                        break;
+                                                                case 0x00000020:
+                                                                       proto_tree_add_item(ncp_tree, hf_nds_letter_ver, tvb, nds_offset, 4, TRUE);
+                                                                        nds_offset += 4;
+                                                                        break;
+                                                                case 0x00000040:
+                                                                       proto_tree_add_item(ncp_tree, hf_nds_os_ver, tvb, nds_offset, 4, TRUE);
+                                                                        nds_offset += 4;
+                                                                        break;
+                                                                case 0x00000080:
+                                                                       proto_tree_add_item(ncp_tree, hf_nds_lic_flags, tvb, nds_offset, 4, TRUE);
+                                                                        nds_offset += 4;
+                                                                        break;
+                                                                case 0x00000100:
+                                                                       proto_tree_add_item(ncp_tree, hf_nds_ds_time, tvb, nds_offset, 4, TRUE);
+                                                                        nds_offset += 4;
+                                                                        break;
+                                                                case 0x00010000:
+                                                                        nds_string_len = tvb_get_letohl(tvb, nds_offset);
+                                                                        nds_offset += 4;
+                                                                        get_string(tvb, nds_offset, nds_string_len, reply_buffer.buffer);
+                                                                        proto_tree_add_text(ncp_tree, tvb, nds_offset, nds_string_len, "SAP Name: %s", reply_buffer.buffer);
+                                                                        nds_offset += nds_string_len;
+                                                                        nds_offset += align_4(tvb, nds_offset);
+                                                                        nds_offset += 2;
+                                                                        break;
+                                                                case 0x00020000:
+                                                                        nds_string_len = tvb_get_letohl(tvb, nds_offset);
+                                                                        nds_offset += 4;
+                                                                        get_string(tvb, nds_offset, nds_string_len, reply_buffer.buffer);
+                                                                        proto_tree_add_text(ncp_tree, tvb, nds_offset, nds_string_len, "NDS Tree Name: %s", reply_buffer.buffer);
+                                                                        nds_offset += nds_string_len;
+                                                                        nds_offset += align_4(tvb, nds_offset);
+                                                                        break;
+                                                                case 0x00040000:
+                                                                        nds_string_len = tvb_get_letohl(tvb, nds_offset);
+                                                                        nds_offset += 4;
+                                                                        get_string(tvb, nds_offset, nds_string_len, reply_buffer.buffer);
+                                                                        proto_tree_add_text(ncp_tree, tvb, nds_offset, nds_string_len, "OS Name: %s", reply_buffer.buffer);
+                                                                        nds_offset += nds_string_len;
+                                                                        nds_offset += align_4(tvb, nds_offset);
+                                                                        break;
+                                                                case 0x00080000:
+                                                                        nds_string_len = tvb_get_letohl(tvb, nds_offset);
+                                                                        nds_offset += 4;
+                                                                        get_string(tvb, nds_offset, nds_string_len, reply_buffer.buffer);
+                                                                        proto_tree_add_text(ncp_tree, tvb, nds_offset, nds_string_len, "Hardware Name: %s", reply_buffer.buffer);
+                                                                        nds_offset += nds_string_len;
+                                                                        nds_offset += align_4(tvb, nds_offset);
+                                                                        break;
+                                                                case 0x00100000:
+                                                                        nds_string_len = tvb_get_letohl(tvb, nds_offset);
+                                                                        nds_offset += 4;
+                                                                        get_string(tvb, nds_offset, nds_string_len, reply_buffer.buffer);
+                                                                        proto_tree_add_text(ncp_tree, tvb, nds_offset, nds_string_len, "Vendor Name: %s", reply_buffer.buffer);
+                                                                        nds_offset += nds_string_len;
+                                                                        nds_offset += align_4(tvb, nds_offset);
+                                                                        break;
+                                                                case 0x00000200:
+                                                                        /* Not Defined */
+                                                                case 0x00000400:
+                                                                        /* Not Defined */
+                                                                case 0x00000800:
+                                                                        /* Not Defined */
+                                                                case 0x00001000:
+                                                                        /* Not Defined */
+                                                                case 0x00002000:
+                                                                        /* Not Defined */
+                                                                case 0x00004000:
+                                                                        /* Not Defined */
+                                                                case 0x00008000:
+                                                                        /* Not Defined */
+                                                                case 0x00200000:
+                                                                        /* Not Defined */
+                                                                case 0x00400000:
+                                                                        /* Not Defined */
+                                                                case 0x00800000:
+                                                                        /* Not Defined */
+                                                                case 0x01000000:
+                                                                        /* Not Defined */
+                                                                case 0x02000000:
+                                                                        /* Not Defined */
+                                                                case 0x04000000:
+                                                                        /* Not Defined */
+                                                                case 0x08000000:
+                                                                        /* Not Defined */
+                                                                case 0x10000000:
+                                                                        /* Not Defined */
+                                                                case 0x20000000:
+                                                                        /* Not Defined */
+                                                                case 0x40000000:
+                                                                        /* Not Defined */
+                                                                case 0x80000000:
+                                                                        /* Not Defined */
+                                                                default:
+                                                                        break;
+                                                        }
+                                                }
+                                                bvalue = bvalue*2;
                                         }
                                 }        
                         }
@@ -4348,238 +5176,162 @@ dissect_ncp_reply(tvbuff_t *tvb, packet_info *pinfo,
                                 nds_offset = 8;
                                         
                                 nds_reply_buffer = tvb_get_letohl(tvb, nds_offset);        
-                                proto_tree_add_uint_format(ncp_tree, hf_ncp_fragment_size, tvb, 8,
-                                        4, nds_reply_buffer, "NDS Fragment Size %d",
-                                       nds_reply_buffer);
-                                nds_frag = tvb_get_letohl(tvb, 12);        
-                                proto_tree_add_uint_format(ncp_tree, hf_ncp_fragment_handle, tvb, 12,
-                                        4, nds_frag, "NDS Fragment Handle 0x%08x",
-                                       nds_frag);
+                                proto_tree_add_uint(ncp_tree, hf_ncp_fragment_size, tvb, nds_offset,
+                                        4, nds_reply_buffer);
+                                nds_offset += 4;
+                                nds_frag = tvb_get_letohl(tvb, nds_offset);        
+                                proto_tree_add_uint(ncp_tree, hf_ncp_fragment_handle, tvb, nds_offset,
+                                        4, nds_frag);
+                                nds_offset += 4;        
                                 if (nds_reply_buffer > 7)
                                 {                        
-                                        nds_offset = 16; 
-                                        nds_error_code = tvb_get_letohl(tvb, nds_offset);
-                                        nds_error_string = match_strval(nds_error_code, nds_reply_errors);
-                                        if (nds_error_string == NULL)
-                                        {
-                                                nds_offset = 19;
-                                                nds_error_code = tvb_get_letohl(tvb, nds_offset);
-                                                error_string = match_strval(nds_error_code, nds_reply_errors);
-                                        }
-                                        if (nds_error_string == NULL || nds_error_code == 0x00000000)
-                                        {
-                                                if (nds_frag != 0xffffffff)
-                                                {
-                                                        nds_error_string = "NDS Fragment";
-                                                }
-                                                else
-                                                {        
-                                                        nds_error_string = "Ok";
-                                                }
-                                                nds_error_code = 0x00000000;
-                                        }        
+                                       /*
+                                        * XXX - is this present in
+                                        * replies to continuation
+                                        * messages?  It doesn't appear to
+                                        * be.
+                                        */
                                         proto_tree_add_uint_format(ncp_tree, hf_nds_reply_error, tvb, nds_offset,
                                                 4, nds_error_code, "NDS Completion Code: 0x%08x, %s",
                                                nds_error_code, nds_error_string);
-                                                            
                                 }
-                                if (request_value && nds_error_code == 0x00000000 && nds_frag == 0xffffffff)
+                                if (request_value && nds_error_code == 0x00000000)
                                 {
                                         nds_offset = 20;
-                                        p1values.vtype = 0;
-                                        p2values.vtype = 0;
-                                        p3values.vtype = 0;
-                                        p4values.vtype = 0;
-                                        p5values.vtype = 0;
-                                        p6values.vtype = 0;
-                                        p7values.vtype = 0;
-                                        p8values.vtype = 0;
-                                        p9values.vtype = 0;
-                                        p1values.vvalue = 0;
-                                        p2values.vvalue = 0;
-                                        p3values.vvalue = 0;
-                                        p4values.vvalue = 0;
-                                        p5values.vvalue = 0;
-                                        p6values.vvalue = 0;
-                                        p7values.vvalue = 0;
-                                        p8values.vvalue = 0;
-                                        p9values.vvalue = 0;
-                                        p1values.vlength = 0;
-                                        p2values.vlength = 0;
-                                        p3values.vlength = 0;
-                                        p4values.vlength = 0;
-                                        p5values.vlength = 0;
-                                        p6values.vlength = 0;
-                                        p7values.vlength = 0;
-                                        p8values.vlength = 0;
-                                        p9values.vlength = 0;
-                                        p1values.voffset = 0;
-                                        p2values.voffset = 0;
-                                        p3values.voffset = 0;
-                                        p4values.voffset = 0;
-                                        p5values.voffset = 0;
-                                        p6values.voffset = 0;
-                                        p7values.voffset = 0;
-                                        p8values.voffset = 0;
-                                        p9values.voffset = 0;
-                                        p1values.hfname = 0;
-                                        p2values.hfname = 0;
-                                        p3values.hfname = 0;
-                                        p4values.hfname = 0;
-                                        p5values.hfname = 0;
-                                        p6values.hfname = 0;
-                                        p7values.hfname = 0;
-                                        p8values.hfname = 0;
-                                        p9values.hfname = 0;
-                                        p1values.vdesc = "";
-                                        p2values.vdesc = "";
-                                        p3values.vdesc = "";
-                                        p4values.vdesc = "";
-                                        p5values.vdesc = "";
-                                        p6values.vdesc = "";
-                                        p7values.vdesc = "";
-                                        p8values.vdesc = "";
-                                        p9values.vdesc = "";
-                                        p1values.vstring = "";
-                                        p2values.vstring = "";
-                                        p3values.vstring = "";
-                                        p4values.vstring = "";
-                                        p5values.vstring = "";
-                                        p6values.vstring = "";
-                                        p7values.vstring = "";
-                                        p8values.vstring = "";
-                                        p9values.vstring = "";
+                                       for (i = 0; i < 9; i++) {
+                                               pvalues[i].vtype = 0;
+                                               pvalues[i].vvalue = 0;
+                                               pvalues[i].vlength = 0;
+                                               pvalues[i].voffset = 0;
+                                               pvalues[i].hfname = 0;
+                                               pvalues[i].vdesc = "";
+                                               string_buffer[i][0] = '\0';
+                                               pvalues[i].vstring = string_buffer[i];
+                                               pvalues[i].mvtype = 0;
+                                       }
+                                        verb_string = val_to_str(request_value->nds_request_verb,
+                                            ncp_nds_verb_vals,
+                                            "Continuation Fragment");
                                         switch (request_value->nds_request_verb)
                                         {
                                                 case 0x01:
-                                                        verb_string = "Resolve Name";
                                                         if(request_value->nds_version == 0)
                                                         { 
-                                                                p1values.vvalue = tvb_get_letohl(tvb, nds_offset);
-                                                                p1values.vstring = match_strval(p1values.vvalue, nds_tags);
-                                                                if(p1values.vstring == NULL)
+                                                                pvalues[0].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                                pvalues[0].vstring = match_strval(pvalues[0].vvalue, nds_tags);
+                                                                if(pvalues[0].vstring == NULL)
                                                                 {
-                                                                        p1values.vstring = "No Tags Set";
+                                                                        pvalues[0].vstring = "No Tags Set";
                                                                 }
-                                                                p1values.vtype = 4; /* String */
-                                                                p1values.vdesc = "Tag: %s";
-                                                                p1values.vlength = 4;
-                                                                p1values.voffset = nds_offset;
-                                                                p1values.hfname = hf_nds_tag_string;
-                                                                nds_offset = nds_offset+p1values.vlength;
-                                                                switch(p1values.vvalue)
+                                                                pvalues[0].vtype = VTYPE_STRING;
+                                                                pvalues[0].vdesc = "Tag: %s";
+                                                                pvalues[0].vlength = 4;
+                                                                pvalues[0].voffset = nds_offset;
+                                                                pvalues[0].hfname = hf_nds_tag_string;
+                                                                nds_offset = nds_offset+pvalues[0].vlength;
+                                                                switch(pvalues[0].vvalue)
                                                                 {
                                                                         case 0:         /* No Such Entry */
                                                                                 break;
                                                                         case 1:         /* Local Entry */
-                                                                                p2values.vvalue = tvb_get_letohl(tvb, nds_offset);
-                                                                                p2values.vstring = "";
-                                                                                p2values.vtype = 3; /* Uint32 */
-                                                                                p2values.vdesc = "Entry ID: 0x%08x";
+                                                                                pvalues[1].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                                                pvalues[1].vtype = VTYPE_UINT32;
+                                                                                pvalues[1].vdesc = "Entry ID: 0x%08x";
                                                                                 add_eid = TRUE;
-                                                                                global_object_name = request_value->object_name;
-                                                                                global_eid = p2values.vvalue;
-                                                                                p2values.vlength = 4;
-                                                                                p2values.voffset = nds_offset;
-                                                                                p2values.hfname = hf_nds_eid;
-                                                                                nds_offset = nds_offset+p2values.vlength;
-                                                                                p3values.vvalue = tvb_get_letohl(tvb, nds_offset);
-                                                                                p3values.vtype = 6; /* Multivalue Uint32 */
-                                                                                p3values.vstring = "";
-                                                                                p3values.vdesc = "Referal Records: %d";
-                                                                                p3values.vlength = 4;
-                                                                                p3values.voffset = nds_offset;
-                                                                                p3values.hfname = hf_nds_referals;
-                                                                                p3values.mvtype = 9;
+                                                                                strcpy(global_object_name, request_value->object_name);
+                                                                                global_eid = pvalues[1].vvalue;
+                                                                                pvalues[1].vlength = 4;
+                                                                                pvalues[1].voffset = nds_offset;
+                                                                                pvalues[1].hfname = hf_nds_eid;
+                                                                                nds_offset = nds_offset+pvalues[1].vlength;
+                                                                                pvalues[2].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                                                pvalues[2].vtype = VTYPE_MULTIVALUE_UINT32;
+                                                                                pvalues[2].vdesc = "Referral Records: %u";
+                                                                                pvalues[2].vlength = 4;
+                                                                                pvalues[2].voffset = nds_offset;
+                                                                                pvalues[2].hfname = hf_nds_referrals;
+                                                                                pvalues[2].mvtype = MVTYPE_LOC_ADDR_REFERRAL_REPLY;
                                                                                 break;
                                                                         case 2:         /* Remote Entry */
                                                                                 nds_offset += 4;   /* GUINT32 reserved field */
-                                                                                p2values.vvalue = tvb_get_letohl(tvb, nds_offset);
-                                                                                p2values.vstring = "";
-                                                                                p2values.vtype = 3; /* Uint32 */
-                                                                                p2values.vdesc = "Entry ID: 0x%08x";
+                                                                                pvalues[1].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                                                pvalues[1].vtype = VTYPE_UINT32;
+                                                                                pvalues[1].vdesc = "Entry ID: 0x%08x";
                                                                                 add_eid = TRUE;
-                                                                                global_eid = p2values.vvalue;
-                                                                                global_object_name = request_value->object_name;
-                                                                                p2values.vlength = 4;
-                                                                                p2values.voffset = nds_offset;
-                                                                                p2values.hfname = hf_nds_eid;
-                                                                                nds_offset = nds_offset+p2values.vlength;
-                                                                                p3values.vvalue = tvb_get_letohl(tvb, nds_offset);
-                                                                                p3values.vtype = 6; /* Multivalue Uint32 */
-                                                                                p3values.vstring = "";
-                                                                                p3values.vdesc = "Referal Records: %d";
-                                                                                p3values.vlength = 4;
-                                                                                p3values.voffset = nds_offset;
-                                                                                p3values.hfname = hf_nds_referals;
-                                                                                p3values.mvtype = 9;
+                                                                                global_eid = pvalues[1].vvalue;
+                                                                                strcpy(global_object_name, request_value->object_name);
+                                                                                pvalues[1].vlength = 4;
+                                                                                pvalues[1].voffset = nds_offset;
+                                                                                pvalues[1].hfname = hf_nds_eid;
+                                                                                nds_offset = nds_offset+pvalues[1].vlength;
+                                                                                pvalues[2].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                                                pvalues[2].vtype = VTYPE_MULTIVALUE_UINT32;
+                                                                                pvalues[2].vdesc = "Referral Records: %u";
+                                                                                pvalues[2].vlength = 4;
+                                                                                pvalues[2].voffset = nds_offset;
+                                                                                pvalues[2].hfname = hf_nds_referrals;
+                                                                                pvalues[2].mvtype = MVTYPE_LOC_ADDR_REFERRAL_REPLY;
                                                                                 break;
                                                                         case 3:         /* Alias Entry */
-                                                                                p2values.vtype = 4; /* String */
-                                                                                p2values.vdesc = "Alias Name: %s";
-                                                                                p2values.vstring = "";
-                                                                                p2values.mvtype = 1;
-                                                                                p2values.vvalue = 0;
-                                                                                p2values.vlength = 256;
-                                                                                p2values.vlength = tvb_get_letohl(tvb, nds_offset);
-                                                                                if (p2values.vlength == 0x00)
+                                                                                pvalues[1].vtype = VTYPE_STRING;
+                                                                                pvalues[1].vdesc = "Alias Name: %s";
+                                                                                pvalues[1].mvtype = MVTYPE_ATTR_REQUEST;
+                                                                                pvalues[1].vvalue = 0;
+                                                                                pvalues[1].vlength = 256;
+                                                                                pvalues[1].vlength = tvb_get_letohl(tvb, nds_offset);
+                                                                                if (pvalues[1].vlength == 0x00)
                                                                                 {
-                                                                                        p2values.vtype = 0;
+                                                                                        pvalues[1].vtype = VTYPE_NONE;
                                                                                         break;
                                                                                 }
-                                                                                p2values.voffset = nds_offset+4;
+                                                                                pvalues[1].voffset = nds_offset+4;
                                                                                 nds_offset += 4;
-                                                                                get_string(tvb, p2values.voffset, p2values.vlength, p2values.vstring);
-                                                                                nds_offset += p2values.vlength;
+                                                                                get_string(tvb, pvalues[1].voffset, pvalues[1].vlength, pvalues[1].vstring);
+                                                                                nds_offset += pvalues[1].vlength;
                                                                                 nds_offset += align_4(tvb, nds_offset);
-                                                                                p2values.hfname= hf_nds_name;
+                                                                                pvalues[1].hfname= hf_nds_name;
                                                                                 break;
                                                                         case 4:         /* Referral Information */
-                                                                                p2values.vvalue = tvb_get_letohl(tvb, nds_offset);
-                                                                                p2values.vstring = "";
-                                                                                p2values.vtype = 3; /* Uint32 */
-                                                                                p2values.vdesc = "Distance Object is From Root: 0x%08x";
-                                                                                p2values.vlength = 4;
-                                                                                p2values.voffset = nds_offset;
-                                                                                p2values.hfname = hf_nds_eid;
-                                                                                nds_offset = nds_offset+p2values.vlength;
-                                                                                p3values.vvalue = tvb_get_letohl(tvb, nds_offset);
-                                                                                p3values.vtype = 6; /* Multivalue Uint32 */
-                                                                                p3values.vstring = "";
-                                                                                p3values.vdesc = "Referal Records: %d";
-                                                                                p3values.vlength = 4;
-                                                                                p3values.voffset = nds_offset;
-                                                                                p3values.hfname = hf_nds_depth;
-                                                                                p3values.mvtype = 9;
+                                                                                pvalues[1].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                                                pvalues[1].vtype = VTYPE_UINT32;
+                                                                                pvalues[1].vdesc = "Distance Object is From Root: 0x%08x";
+                                                                                pvalues[1].vlength = 4;
+                                                                                pvalues[1].voffset = nds_offset;
+                                                                                pvalues[1].hfname = hf_nds_eid;
+                                                                                nds_offset = nds_offset+pvalues[1].vlength;
+                                                                                pvalues[2].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                                                pvalues[2].vtype = VTYPE_MULTIVALUE_UINT32;
+                                                                                pvalues[2].vdesc = "Referral Records: %u";
+                                                                                pvalues[2].vlength = 4;
+                                                                                pvalues[2].voffset = nds_offset;
+                                                                                pvalues[2].hfname = hf_nds_depth;
+                                                                                pvalues[2].mvtype = MVTYPE_LOC_ADDR_REFERRAL_REPLY;
                                                                                 break;
                                                                         case 6:          /* Entry and Referrals */
-                                                                                p2values.vvalue = tvb_get_letohl(tvb, nds_offset);
-                                                                                p2values.vstring = "";
-                                                                                p2values.vtype = 3; /* Uint32 */
-                                                                                p2values.vdesc = "Result Flags: 0x%08x";
-                                                                                p2values.vlength = 4;
-                                                                                p2values.voffset = nds_offset;
-                                                                                p2values.hfname = hf_nds_result_flags;
-                                                                                nds_offset = nds_offset+p2values.vlength;
-                                                                                p3values.vvalue = tvb_get_letohl(tvb, nds_offset);
-                                                                                p3values.vstring = "";
-                                                                                p3values.vtype = 3; /* Uint32 */
-                                                                                p3values.vdesc = "Entry ID: 0x%08x";
+                                                                                pvalues[1].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                                                pvalues[1].vtype = VTYPE_UINT32;
+                                                                                pvalues[1].vdesc = "Result Flags: 0x%08x";
+                                                                                pvalues[1].vlength = 4;
+                                                                                pvalues[1].voffset = nds_offset;
+                                                                                pvalues[1].hfname = hf_nds_result_flags;
+                                                                                nds_offset = nds_offset+pvalues[1].vlength;
+                                                                                pvalues[2].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                                                pvalues[2].vtype = VTYPE_UINT32;
+                                                                                pvalues[2].vdesc = "Entry ID: 0x%08x";
                                                                                 add_eid = TRUE;
-                                                                                global_eid = p3values.vvalue;
-                                                                                global_object_name = request_value->object_name;
-                                                                                p3values.vlength = 4;
-                                                                                p3values.voffset = nds_offset;
-                                                                                p3values.hfname = hf_nds_eid;
-                                                                                nds_offset = nds_offset+p3values.vlength;
-                                                                                p4values.vvalue = tvb_get_letohl(tvb, nds_offset);
-                                                                                p4values.vtype = 6; /* Multivalue Uint32 */
-                                                                                p4values.vstring = "";
-                                                                                p4values.vdesc = "Referal Records: %d";
-                                                                                p4values.vlength = 4;
-                                                                                p4values.voffset = nds_offset;
-                                                                                p4values.mvtype = 8;
-                                                                                p4values.hfname = hf_nds_referals;
+                                                                                global_eid = pvalues[2].vvalue;
+                                                                                strcpy(global_object_name, request_value->object_name);
+                                                                                pvalues[2].vlength = 4;
+                                                                                pvalues[2].voffset = nds_offset;
+                                                                                pvalues[2].hfname = hf_nds_eid;
+                                                                                nds_offset = nds_offset+pvalues[2].vlength;
+                                                                                pvalues[3].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                                                pvalues[3].vtype = VTYPE_MULTIVALUE_UINT32;
+                                                                                pvalues[3].vdesc = "Referral Records: %u";
+                                                                                pvalues[3].vlength = 4;
+                                                                                pvalues[3].voffset = nds_offset;
+                                                                                pvalues[3].mvtype = MVTYPE_ADDR_REFERRAL_REPLY;
+                                                                                pvalues[3].hfname = hf_nds_referrals;
                                                                                 break;
                                                                         default:
                                                                                 break;
@@ -4587,139 +5339,128 @@ dissect_ncp_reply(tvbuff_t *tvb, packet_info *pinfo,
                                                         }
                                                         else
                                                         {
-                                                                p1values.vvalue = tvb_get_letohl(tvb, nds_offset);
-                                                                p1values.vstring = "";
-                                                                p1values.vtype = 3; /* Uint32 */
-                                                                p1values.vdesc = "CRC: 0x%08x";
-                                                                p1values.vlength = 4;
-                                                                p1values.voffset = nds_offset;
-                                                                p1values.hfname = hf_nds_crc;
-                                                                nds_offset = nds_offset+p1values.vlength;
-                                                                p2values.vvalue = tvb_get_letohl(tvb, nds_offset);
-                                                                p2values.vstring = match_strval(p2values.vvalue, nds_tags);
-                                                                if(p2values.vstring == NULL)
+                                                                pvalues[0].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                                pvalues[0].vtype = VTYPE_UINT32;
+                                                                pvalues[0].vdesc = "CRC: 0x%08x";
+                                                                pvalues[0].vlength = 4;
+                                                                pvalues[0].voffset = nds_offset;
+                                                                pvalues[0].hfname = hf_nds_crc;
+                                                                nds_offset = nds_offset+pvalues[0].vlength;
+                                                                pvalues[1].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                                pvalues[1].vstring = match_strval(pvalues[1].vvalue, nds_tags);
+                                                                if(pvalues[1].vstring == NULL)
                                                                 {
-                                                                        p2values.vstring = "No Tags Set";
+                                                                        pvalues[1].vstring = "No Tags Set";
                                                                 }
-                                                                p2values.vtype = 4; /* String */
-                                                                p2values.vdesc = "Tag: %s";
-                                                                p2values.vlength = 4;
-                                                                p2values.voffset = nds_offset;
-                                                                nds_offset = nds_offset+p2values.vlength;
-                                                                p2values.hfname = hf_nds_tag_string;
-                                                                switch(p2values.vvalue)
+                                                                pvalues[1].vtype = VTYPE_STRING;
+                                                                pvalues[1].vdesc = "Tag: %s";
+                                                                pvalues[1].vlength = 4;
+                                                                pvalues[1].voffset = nds_offset;
+                                                                nds_offset = nds_offset+pvalues[1].vlength;
+                                                                pvalues[1].hfname = hf_nds_tag_string;
+                                                                switch(pvalues[1].vvalue)
                                                                 {
                                                                         case 0:         /* No Such Entry */
                                                                                 break;
                                                                         case 1:         /* Local Entry */
-                                                                                p3values.vvalue = tvb_get_letohl(tvb, nds_offset);
-                                                                                p3values.vstring = "";
-                                                                                p3values.vtype = 3; /* Uint32 */
-                                                                                p3values.vdesc = "Entry ID: 0x%08x";
+                                                                                pvalues[2].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                                                pvalues[2].vtype = VTYPE_UINT32;
+                                                                                pvalues[2].vdesc = "Entry ID: 0x%08x";
                                                                                 add_eid = TRUE;
-                                                                                global_eid = p3values.vvalue;
-                                                                                global_object_name = request_value->object_name;
-                                                                                p3values.vlength = 4;
-                                                                                p3values.voffset = nds_offset;
-                                                                                p3values.hfname = hf_nds_eid;
-                                                                                nds_offset = nds_offset+p3values.vlength;
-                                                                                p4values.vvalue = tvb_get_letohl(tvb, nds_offset);
-                                                                                p4values.vtype = 6; /* Multivalue Uint32 */
-                                                                                p4values.vstring = "";
-                                                                                p4values.vdesc = "Referal Records: %d";
-                                                                                p4values.vlength = 4;
-                                                                                p4values.voffset = nds_offset;
-                                                                                p4values.hfname = hf_nds_referals;
-                                                                                p4values.mvtype = 9;
+                                                                                global_eid = pvalues[2].vvalue;
+                                                                                strcpy(global_object_name, request_value->object_name);
+                                                                                pvalues[2].vlength = 4;
+                                                                                pvalues[2].voffset = nds_offset;
+                                                                                pvalues[2].hfname = hf_nds_eid;
+                                                                                nds_offset = nds_offset+pvalues[2].vlength;
+                                                                                pvalues[3].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                                                pvalues[3].vtype = VTYPE_MULTIVALUE_UINT32;
+                                                                                pvalues[3].vdesc = "Referral Records: %u";
+                                                                                pvalues[3].vlength = 4;
+                                                                                pvalues[3].voffset = nds_offset;
+                                                                                pvalues[3].hfname = hf_nds_referrals;
+                                                                                pvalues[3].mvtype = MVTYPE_LOC_ADDR_REFERRAL_REPLY;
                                                                                 break;
                                                                         case 2:         /* Remote Entry */
                                                                                 nds_offset += 4;   /* GUINT32 reserved field */
-                                                                                p3values.vvalue = tvb_get_letohl(tvb, nds_offset);
-                                                                                p3values.vstring = "";
+                                                                                pvalues[2].vvalue = tvb_get_letohl(tvb, nds_offset);
                                                                                 add_eid = TRUE;
-                                                                                global_eid = p3values.vvalue;
-                                                                                global_object_name = request_value->object_name;
-                                                                                p3values.vtype = 3; /* Uint32 */
-                                                                                p3values.vdesc = "Entry ID: 0x%08x";
-                                                                                p3values.vlength = 4;
-                                                                                p3values.voffset = nds_offset;
-                                                                                p3values.hfname = hf_nds_eid;
-                                                                                nds_offset = nds_offset+p3values.vlength;
-                                                                                p4values.vvalue = tvb_get_letohl(tvb, nds_offset);
-                                                                                p4values.vtype = 6; /* Multivalue Uint32 */
-                                                                                p4values.vstring = "";
-                                                                                p4values.vdesc = "Referal Records: %d";
-                                                                                p4values.vlength = 4;
-                                                                                p4values.voffset = nds_offset;
-                                                                                p4values.hfname = hf_nds_referals;
-                                                                                p4values.mvtype = 9;
+                                                                                global_eid = pvalues[2].vvalue;
+                                                                                strcpy(global_object_name, request_value->object_name);
+                                                                                pvalues[2].vtype = VTYPE_UINT32;
+                                                                                pvalues[2].vdesc = "Entry ID: 0x%08x";
+                                                                                pvalues[2].vlength = 4;
+                                                                                pvalues[2].voffset = nds_offset;
+                                                                                pvalues[2].hfname = hf_nds_eid;
+                                                                                nds_offset = nds_offset+pvalues[2].vlength;
+                                                                                pvalues[3].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                                                pvalues[3].vtype = VTYPE_MULTIVALUE_UINT32;
+                                                                                pvalues[3].vdesc = "Referral Records: %u";
+                                                                                pvalues[3].vlength = 4;
+                                                                                pvalues[3].voffset = nds_offset;
+                                                                                pvalues[3].hfname = hf_nds_referrals;
+                                                                                pvalues[3].mvtype = MVTYPE_LOC_ADDR_REFERRAL_REPLY;
                                                                                 break;
                                                                         case 3:         /* Alias Entry */
-                                                                                p3values.vtype = 4; /* String */
-                                                                                p3values.vdesc = "Alias Name: %s";
-                                                                                p3values.vstring = "";
-                                                                                p3values.mvtype = 1;
-                                                                                p3values.vvalue = 0;
-                                                                                p3values.vlength = 256;
-                                                                                p3values.vlength = tvb_get_letohl(tvb, nds_offset);
-                                                                                if (p3values.vlength == 0x00)
+                                                                                pvalues[2].vtype = VTYPE_STRING;
+                                                                                pvalues[2].vdesc = "Alias Name: %s";
+                                                                                pvalues[2].mvtype = MVTYPE_ATTR_REQUEST;
+                                                                                pvalues[2].vvalue = 0;
+                                                                                pvalues[2].vlength = 256;
+                                                                                pvalues[2].vlength = tvb_get_letohl(tvb, nds_offset);
+                                                                                if (pvalues[2].vlength == 0x00)
                                                                                 {
-                                                                                        p3values.vtype = 0;
+                                                                                        pvalues[2].vtype = VTYPE_NONE;
                                                                                         break;
                                                                                 }
-                                                                                p3values.voffset = nds_offset+4;
+                                                                                pvalues[2].voffset = nds_offset+4;
                                                                                 nds_offset += 4;
-                                                                                get_string(tvb, p3values.voffset, p3values.vlength, p3values.vstring);
-                                                                                nds_offset += p3values.vlength;
+                                                                                get_string(tvb, pvalues[2].voffset, pvalues[2].vlength, pvalues[2].vstring);
+                                                                                nds_offset += pvalues[2].vlength;
                                                                                 nds_offset += align_4(tvb, nds_offset);
-                                                                                p3values.hfname= hf_nds_name;
+                                                                                pvalues[2].hfname= hf_nds_name;
                                                                                 break;
                                                                         case 4:         /* Referral Information */
-                                                                                p3values.vvalue = tvb_get_letohl(tvb, nds_offset);
-                                                                                p3values.vstring = "";
-                                                                                p3values.vtype = 3; /* Uint32 */
-                                                                                p3values.vdesc = "Distance Object is From Root: 0x%08x";
-                                                                                p3values.vlength = 4;
-                                                                                p3values.voffset = nds_offset;
-                                                                                p3values.hfname = hf_nds_eid;
-                                                                                nds_offset = nds_offset+p3values.vlength;
-                                                                                p4values.vvalue = tvb_get_letohl(tvb, nds_offset);
-                                                                                p4values.vtype = 6; /* Multivalue Uint32 */
-                                                                                p4values.vstring = "";
-                                                                                p4values.vdesc = "Referal Records: %d";
-                                                                                p4values.vlength = 4;
-                                                                                p4values.voffset = nds_offset;
-                                                                                p4values.hfname = hf_nds_depth;
-                                                                                p4values.mvtype = 8;
+                                                                                pvalues[2].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                                                pvalues[2].vtype = VTYPE_UINT32;
+                                                                                pvalues[2].vdesc = "Distance Object is From Root: 0x%08x";
+                                                                                pvalues[2].vlength = 4;
+                                                                                pvalues[2].voffset = nds_offset;
+                                                                                pvalues[2].hfname = hf_nds_eid;
+                                                                                nds_offset = nds_offset+pvalues[2].vlength;
+                                                                                pvalues[3].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                                                pvalues[3].vtype = VTYPE_MULTIVALUE_UINT32;
+                                                                                pvalues[3].vdesc = "Referral Records: %u";
+                                                                                pvalues[3].vlength = 4;
+                                                                                pvalues[3].voffset = nds_offset;
+                                                                                pvalues[3].hfname = hf_nds_depth;
+                                                                                pvalues[3].mvtype = MVTYPE_ADDR_REFERRAL_REPLY;
                                                                                 break;
                                                                         case 6:          /* Entry and Referrals */
-                                                                                p3values.vvalue = tvb_get_letohl(tvb, nds_offset);
-                                                                                p3values.vstring = "";
-                                                                                p3values.vtype = 3; /* Uint32 */
-                                                                                p3values.vdesc = "Result Flags: 0x%08x";
-                                                                                p3values.vlength = 4;
-                                                                                p3values.voffset = nds_offset;
-                                                                                p3values.hfname = hf_nds_result_flags;
-                                                                                nds_offset = nds_offset+p3values.vlength;
-                                                                                p4values.vvalue = tvb_get_letohl(tvb, nds_offset);
-                                                                                p4values.vstring = "";
-                                                                                p4values.vtype = 3; /* Uint32 */
-                                                                                p4values.vdesc = "Entry ID: 0x%08x";
+                                                                                pvalues[2].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                                                pvalues[2].vtype = VTYPE_UINT32;
+                                                                                pvalues[2].vdesc = "Result Flags: 0x%08x";
+                                                                                pvalues[2].vlength = 4;
+                                                                                pvalues[2].voffset = nds_offset;
+                                                                                pvalues[2].hfname = hf_nds_result_flags;
+                                                                                nds_offset = nds_offset+pvalues[2].vlength;
+                                                                                pvalues[3].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                                                pvalues[3].vtype = VTYPE_UINT32;
+                                                                                pvalues[3].vdesc = "Entry ID: 0x%08x";
                                                                                 add_eid = TRUE;
-                                                                                global_object_name = request_value->object_name;
-                                                                                global_eid = p4values.vvalue;
-                                                                                p4values.vlength = 4;
-                                                                                p4values.voffset = nds_offset;
-                                                                                p4values.hfname = hf_nds_eid;
-                                                                                nds_offset = nds_offset+p4values.vlength;
-                                                                                p5values.vvalue = tvb_get_letohl(tvb, nds_offset);
-                                                                                p5values.vtype = 6; /* Multivalue Uint32 */
-                                                                                p5values.vstring = "";
-                                                                                p5values.vdesc = "Referal Records: %d";
-                                                                                p5values.vlength = 4;
-                                                                                p5values.voffset = nds_offset;
-                                                                                p5values.mvtype = 8;
-                                                                                p5values.hfname = hf_nds_referals;
+                                                                                strcpy(global_object_name, request_value->object_name);
+                                                                                global_eid = pvalues[3].vvalue;
+                                                                                pvalues[3].vlength = 4;
+                                                                                pvalues[3].voffset = nds_offset;
+                                                                                pvalues[3].hfname = hf_nds_eid;
+                                                                                nds_offset = nds_offset+pvalues[3].vlength;
+                                                                                pvalues[4].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                                                pvalues[4].vtype = VTYPE_MULTIVALUE_UINT32;
+                                                                                pvalues[4].vdesc = "Referral Records: %u";
+                                                                                pvalues[4].vlength = 4;
+                                                                                pvalues[4].voffset = nds_offset;
+                                                                                pvalues[4].mvtype = MVTYPE_ADDR_REFERRAL_REPLY;
+                                                                                pvalues[4].hfname = hf_nds_referrals;
                                                                                 break;
                                                                         default:
                                                                                 break;
@@ -4728,555 +5469,456 @@ dissect_ncp_reply(tvbuff_t *tvb, packet_info *pinfo,
                                                         }
                                                         break;
                                                 case 0x02:    
-                                                        verb_string = "Read Entry Information";
                                                         if(request_value->nds_version != 0x000000fe)
                                                         { 
-                                                                p1values.vvalue = 1;
-                                                                p1values.vtype = 6; /* Multivalue Uint32 */
-                                                                p1values.vstring = "";
-                                                                p1values.vdesc = "Entry Information";
-                                                                p1values.vlength = 0;
-                                                                p1values.voffset = nds_offset-4;
-                                                                p1values.hfname = hf_nds_name;
-                                                                p1values.mvtype = 12;
-                                                                p1values.vflags = request_value->req_nds_flags;
+                                                                pvalues[0].vvalue = 1;
+                                                                pvalues[0].vtype = VTYPE_MULTIVALUE_UINT32;
+                                                                pvalues[0].vdesc = "Entry Information";
+                                                                pvalues[0].vlength = 0;
+                                                                pvalues[0].voffset = nds_offset-4;
+                                                                pvalues[0].hfname = hf_nds_name;
+                                                                pvalues[0].mvtype = MVTYPE_LIST_PARTITIONS;
+                                                                pvalues[0].vflags = request_value->req_nds_flags;
                                                         }
                                                         else
                                                         {
-                                                                p1values.vvalue = tvb_get_letohl(tvb, nds_offset);
-                                                                p1values.vstring = "";
-                                                                p1values.vtype = 3; /* Uint32 */
-                                                                p1values.vdesc = "CRC: 0x%08x";
-                                                                p1values.vlength = 4;
-                                                                p1values.voffset = nds_offset;
-                                                                p1values.hfname = hf_nds_crc;
-                                                                nds_offset = nds_offset+p1values.vlength;
-                                                                p2values.vvalue = 1;
-                                                                p2values.vtype = 6; /* Multivalue Uint32 */
-                                                                p2values.vstring = "";
-                                                                p2values.vdesc = "Entry Information";
-                                                                p2values.vlength = 0;
-                                                                p2values.voffset = nds_offset-4;
-                                                                p2values.hfname = hf_nds_name;
-                                                                p2values.mvtype = 12;
-                                                                p2values.vflags = request_value->req_nds_flags;
+                                                                pvalues[0].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                                pvalues[0].vtype = VTYPE_UINT32;
+                                                                pvalues[0].vdesc = "CRC: 0x%08x";
+                                                                pvalues[0].vlength = 4;
+                                                                pvalues[0].voffset = nds_offset;
+                                                                pvalues[0].hfname = hf_nds_crc;
+                                                                nds_offset = nds_offset+pvalues[0].vlength;
+                                                                pvalues[1].vvalue = 1;
+                                                                pvalues[1].vtype = VTYPE_MULTIVALUE_UINT32;
+                                                                pvalues[1].vdesc = "Entry Information";
+                                                                pvalues[1].vlength = 0;
+                                                                pvalues[1].voffset = nds_offset-4;
+                                                                pvalues[1].hfname = hf_nds_name;
+                                                                pvalues[1].mvtype = MVTYPE_LIST_PARTITIONS;
+                                                                pvalues[1].vflags = request_value->req_nds_flags;
                                                         }
                                                         break;
                                                 case 0x03:    
-                                                        verb_string = "Read";
                                                         if(request_value->nds_version != 0x000000fe)
                                                         { 
-                                                                p1values.vvalue = tvb_get_letohl(tvb, nds_offset);
-                                                                p1values.vstring = "";
-                                                                p1values.vtype = 3; /* Uint32 */
-                                                                p1values.vdesc = "Iteration Handle: 0x%08x";
-                                                                p1values.vlength = 4;
-                                                                p1values.voffset = nds_offset;
-                                                                p1values.hfname = hf_nds_iteration;
-                                                                nds_offset = nds_offset+p1values.vlength;
-                                                                p2values.vvalue = tvb_get_letohl(tvb, nds_offset);
-                                                                p2values.vstring = match_strval(p2values.vvalue, nds_info_type);
-                                                                if(p2values.vstring == NULL)
+                                                                pvalues[0].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                                pvalues[0].vtype = VTYPE_UINT32;
+                                                                pvalues[0].vdesc = "Iteration Handle: 0x%08x";
+                                                                pvalues[0].vlength = 4;
+                                                                pvalues[0].voffset = nds_offset;
+                                                                pvalues[0].hfname = hf_nds_iteration;
+                                                                nds_offset = nds_offset+pvalues[0].vlength;
+                                                                pvalues[1].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                                pvalues[1].vstring = match_strval(pvalues[1].vvalue, nds_info_type);
+                                                                if(pvalues[1].vstring == NULL)
                                                                 {
-                                                                        p2values.vstring = "No Info Type Set";
+                                                                        pvalues[1].vstring = "No Info Type Set";
                                                                 }
-                                                                p2values.vtype = 4; /* String */
-                                                                p2values.vdesc = "Info Type: %s";
-                                                                p2values.vlength = 4;
-                                                                p2values.voffset = nds_offset;
-                                                                p2values.hfname = hf_nds_info_type;
-                                                                nds_offset = nds_offset+p2values.vlength;
-                                                                p3values.vvalue = tvb_get_letohl(tvb, nds_offset);
-                                                                p3values.vtype = 6; /* Multivalue Uint32 */
-                                                                p3values.vstring = "";
-                                                                p3values.vdesc = "Number of Attributes: %d";
-                                                                p3values.vlength = 4;
-                                                                p3values.voffset = nds_offset;
-                                                                p3values.hfname = hf_nds_attr;
-                                                                p3values.mvtype = 2;
-                                                                p3values.vflags = request_value->req_nds_flags;
+                                                                pvalues[1].vtype = VTYPE_STRING;
+                                                                pvalues[1].vdesc = "Info Type: %s";
+                                                                pvalues[1].vlength = 4;
+                                                                pvalues[1].voffset = nds_offset;
+                                                                pvalues[1].hfname = hf_nds_info_type;
+                                                                nds_offset = nds_offset+pvalues[1].vlength;
+                                                                pvalues[2].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                                pvalues[2].vtype = VTYPE_MULTIVALUE_UINT32;
+                                                                pvalues[2].vdesc = "Number of Attributes: %u";
+                                                                pvalues[2].vlength = 4;
+                                                                pvalues[2].voffset = nds_offset;
+                                                                pvalues[2].hfname = hf_nds_attr;
+                                                                pvalues[2].mvtype = MVTYPE_ATTR_REPLY;
+                                                                pvalues[2].vflags = request_value->req_nds_flags;
+                                                                pvalues[2].nds_version = request_value->nds_version;
                                                         }
                                                         else
                                                         {
-                                                                p1values.vvalue = tvb_get_letohl(tvb, nds_offset);
-                                                                p1values.vstring = "";
-                                                                p1values.vtype = 3; /* Uint32 */
-                                                                p1values.vdesc = "CRC: 0x%08x";
-                                                                p1values.vlength = 4;
-                                                                p1values.voffset = nds_offset;
-                                                                p1values.hfname = hf_nds_crc;
-                                                                nds_offset = nds_offset+p1values.vlength;
-                                                                p2values.vvalue = tvb_get_letohl(tvb, nds_offset);
-                                                                p2values.vstring = "";
-                                                                p2values.vtype = 3; /* Uint32 */
-                                                                p2values.vdesc = "Iteration Handle: 0x%08x";
-                                                                p2values.vlength = 4;
-                                                                p2values.voffset = nds_offset;
-                                                                p2values.hfname = hf_nds_iteration;
-                                                                nds_offset = nds_offset+p2values.vlength;
-                                                                p3values.vvalue = tvb_get_letohl(tvb, nds_offset);
-                                                                p3values.vstring = match_strval(p3values.vvalue, nds_info_type);
-                                                                if(p3values.vstring == NULL)
+                                                                pvalues[0].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                                pvalues[0].vtype = VTYPE_UINT32;
+                                                                pvalues[0].vdesc = "CRC: 0x%08x";
+                                                                pvalues[0].vlength = 4;
+                                                                pvalues[0].voffset = nds_offset;
+                                                                pvalues[0].hfname = hf_nds_crc;
+                                                                nds_offset = nds_offset+pvalues[0].vlength;
+                                                                pvalues[1].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                                pvalues[1].vtype = VTYPE_UINT32;
+                                                                pvalues[1].vdesc = "Iteration Handle: 0x%08x";
+                                                                pvalues[1].vlength = 4;
+                                                                pvalues[1].voffset = nds_offset;
+                                                                pvalues[1].hfname = hf_nds_iteration;
+                                                                nds_offset = nds_offset+pvalues[1].vlength;
+                                                                pvalues[2].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                                pvalues[2].vstring = match_strval(pvalues[2].vvalue, nds_info_type);
+                                                                if(pvalues[2].vstring == NULL)
                                                                 {
-                                                                        p3values.vstring = "No Info Type Set";
+                                                                        pvalues[2].vstring = "No Info Type Set";
                                                                 }
-                                                                p3values.vtype = 4; /* String */
-                                                                p3values.vdesc = "Info Type: %s";
-                                                                p3values.vlength = 4;
-                                                                p3values.voffset = nds_offset;
-                                                                p3values.hfname = hf_nds_info_type;
-                                                                nds_offset = nds_offset+p3values.vlength;
-                                                                p4values.vvalue = tvb_get_letohl(tvb, nds_offset);
-                                                                p4values.vtype = 6; /* Multivalue Uint32 */
-                                                                p4values.vstring = "";
-                                                                p4values.vdesc = "Number of Attributes: %d";
-                                                                p4values.vlength = 4;
-                                                                p4values.voffset = nds_offset;
-                                                                p4values.hfname = hf_nds_attr;
-                                                                p4values.mvtype = 2;
-                                                                p4values.vflags = request_value->req_nds_flags;
+                                                                pvalues[2].vtype = VTYPE_STRING;
+                                                                pvalues[2].vdesc = "Info Type: %s";
+                                                                pvalues[2].vlength = 4;
+                                                                pvalues[2].voffset = nds_offset;
+                                                                pvalues[2].hfname = hf_nds_info_type;
+                                                                nds_offset = nds_offset+pvalues[2].vlength;
+                                                                pvalues[3].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                                pvalues[3].vtype = VTYPE_MULTIVALUE_UINT32;
+                                                                pvalues[3].vdesc = "Number of Attributes: %u";
+                                                                pvalues[3].vlength = 4;
+                                                                pvalues[3].voffset = nds_offset;
+                                                                pvalues[3].hfname = hf_nds_attr;
+                                                                pvalues[3].mvtype = MVTYPE_ATTR_REPLY;
+                                                                pvalues[3].vflags = request_value->req_nds_flags;
+                                                                pvalues[3].nds_version = request_value->nds_version;
                                                         }
                                                         break;
                                                 case 0x04:    
-                                                        verb_string = "Compare";
-                                                        p1values.vvalue = tvb_get_letohl(tvb, nds_offset);
-                                                        if (p1values.vvalue == 0x00000000)
+                                                        pvalues[0].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                        if (pvalues[0].vvalue == 0x00000000)
                                                         {
-                                                                p1values.vstring = "Did Not Match";
+                                                                pvalues[0].vstring = "Did Not Match";
                                                         }        
                                                         else
                                                         {
-                                                                p1values.vstring = "Matched";
+                                                                pvalues[0].vstring = "Matched";
                                                         }
-                                                        p1values.vtype = 4; /* String */
-                                                        p1values.vdesc = "Compare Values Returned - %s";
-                                                        p1values.vlength = 4;
-                                                        p1values.voffset = nds_offset;
-                                                        p1values.mvtype = 0;
-                                                        p1values.hfname= hf_nds_compare_results;
-                                                        nds_offset += p1values.vlength;
+                                                        pvalues[0].vtype = VTYPE_STRING;
+                                                        pvalues[0].vdesc = "Compare Values Returned - %s";
+                                                        pvalues[0].vlength = 4;
+                                                        pvalues[0].voffset = nds_offset;
+                                                        pvalues[0].mvtype = 0;
+                                                        pvalues[0].hfname= hf_nds_compare_results;
+                                                        nds_offset += pvalues[0].vlength;
                                                         break;
                                                 case 0x05:    
-                                                        verb_string = "List";
-                                                        p1values.vvalue = tvb_get_letohl(tvb, nds_offset);
-                                                        p1values.vstring = "";
-                                                        p1values.vtype = 3; /* Uint32 */
-                                                        p1values.vdesc = "Iteration Handle: 0x%08x";
-                                                        p1values.vlength = 4;
-                                                        p1values.voffset = nds_offset;
-                                                        p1values.hfname = hf_nds_iteration;
-                                                        nds_offset = nds_offset+p1values.vlength;
-                                                        p2values.vvalue = tvb_get_letohl(tvb, nds_offset);;
-                                                        p2values.vtype = 6; /* Multivalue Uint32 */
-                                                        p2values.vstring = "";
-                                                        p2values.vdesc = "Entry Information";
-                                                        p2values.vlength = 0;
-                                                        p2values.voffset = nds_offset;
-                                                        p2values.hfname = hf_nds_name;
-                                                        p2values.mvtype = 12;
-                                                        p2values.vflags = request_value->req_nds_flags;
+                                                        pvalues[0].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                        pvalues[0].vtype = VTYPE_UINT32;
+                                                        pvalues[0].vdesc = "Iteration Handle: 0x%08x";
+                                                        pvalues[0].vlength = 4;
+                                                        pvalues[0].voffset = nds_offset;
+                                                        pvalues[0].hfname = hf_nds_iteration;
+                                                        nds_offset = nds_offset+pvalues[0].vlength;
+                                                        pvalues[1].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                        pvalues[1].vtype = VTYPE_MULTIVALUE_UINT32;
+                                                        pvalues[1].vdesc = "Entry Information";
+                                                        pvalues[1].vlength = 0;
+                                                        pvalues[1].voffset = nds_offset;
+                                                        pvalues[1].hfname = hf_nds_name;
+                                                        pvalues[1].mvtype = MVTYPE_LIST_PARTITIONS;
+                                                        pvalues[1].vflags = request_value->req_nds_flags;
                                                         break;
                                                 case 0x06:    
-                                                        verb_string = "Search Entries";
                                                         break;
                                                 case 0x07:    
-                                                        verb_string = "Add Entry";
                                                         break;
                                                 case 0x08:    
-                                                        verb_string = "Remove Entry";
                                                         break;
                                                 case 0x09:    
-                                                        verb_string = "Modify Entry";
                                                         break;
                                                 case 0x0a:    
-                                                        verb_string = "Modify RDN";
                                                         break;
                                                 case 0x0b:    
-                                                        verb_string = "Define Attribute";
                                                         break;
                                                 case 0x0c:    
-                                                        verb_string = "Read Attribute Definition";
                                                         break;
                                                 case 0x0d:    
-                                                        verb_string = "Remove Attribute Definition";
                                                         break;
                                                 case 0x0e:    
-                                                        verb_string = "Define Class";
                                                         break;
                                                 case 0x0f:    
-                                                        verb_string = "Read Class Definition";
-                                                        p1values.vvalue = tvb_get_letohl(tvb, nds_offset);
-                                                        p1values.vstring = "";
-                                                        p1values.vtype = 3; /* Uint32 */
-                                                        p1values.vdesc = "Iteration Handle: 0x%08x";
-                                                        p1values.vlength = 4;
-                                                        p1values.voffset = nds_offset;
-                                                        p1values.hfname = hf_nds_iteration;
-                                                        nds_offset = nds_offset+p1values.vlength;
-                                                        p2values.vvalue = tvb_get_letohl(tvb, nds_offset);
-                                                        p2values.vstring = match_strval(p2values.vvalue, class_def_type);
-                                                        if(p2values.vstring == NULL)
+                                                        pvalues[0].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                        pvalues[0].vtype = VTYPE_UINT32;
+                                                        pvalues[0].vdesc = "Iteration Handle: 0x%08x";
+                                                        pvalues[0].vlength = 4;
+                                                        pvalues[0].voffset = nds_offset;
+                                                        pvalues[0].hfname = hf_nds_iteration;
+                                                        nds_offset = nds_offset+pvalues[0].vlength;
+                                                        pvalues[1].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                        pvalues[1].vstring = match_strval(pvalues[1].vvalue, class_def_type);
+                                                        if(pvalues[1].vstring == NULL)
                                                         {
-                                                                p2values.vstring = "No Class Definition Type Set";
+                                                                pvalues[1].vstring = "No Class Definition Type Set";
                                                         }
-                                                        p2values.vtype = 4; /* String */
-                                                        p2values.vdesc = "Class Definition Type: %s";
-                                                        p2values.vlength = 4;
-                                                        p2values.voffset = nds_offset;
-                                                        p2values.mvtype = 0;
-                                                        p2values.hfname= hf_nds_class_def_type;
-                                                        nds_offset = nds_offset + p2values.vlength;
-                                                        p3values.vvalue = tvb_get_letohl(tvb, nds_offset);;
-                                                        p3values.vtype = 6; /* Multivalue Uint32 */
-                                                        p3values.vstring = "";
-                                                        p3values.vdesc = "Class Definitions %d";
-                                                        p3values.vlength = 0;
-                                                        p3values.voffset = nds_offset;
-                                                        p3values.hfname = hf_nds_classes;
-                                                        p3values.mvtype = 13;
-                                                        p3values.vflags = request_value->req_nds_flags;
+                                                        pvalues[1].vtype = VTYPE_STRING;
+                                                        pvalues[1].vdesc = "Class Definition Type: %s";
+                                                        pvalues[1].vlength = 4;
+                                                        pvalues[1].voffset = nds_offset;
+                                                        pvalues[1].mvtype = 0;
+                                                        pvalues[1].hfname= hf_nds_class_def_type;
+                                                        nds_offset = nds_offset + pvalues[1].vlength;
+                                                        pvalues[2].vvalue = tvb_get_letohl(tvb, nds_offset);;
+                                                        pvalues[2].vtype = VTYPE_MULTIVALUE_UINT32;
+                                                        pvalues[2].vdesc = "Class Definitions %u";
+                                                        pvalues[2].vlength = 0;
+                                                        pvalues[2].voffset = nds_offset;
+                                                        pvalues[2].hfname = hf_nds_classes;
+                                                        pvalues[2].mvtype = MVTYPE_CLASS_NAMES;
+                                                        pvalues[2].vflags = request_value->req_nds_flags;
                                                         break;
                                                 case 0x10:    
-                                                        verb_string = "Modify Class Definition";
                                                         break;
                                                 case 0x11:    
-                                                        verb_string = "Remove Class Definition";
                                                         break;
                                                 case 0x12:    
-                                                        verb_string = "List Containable Classes";
-                                                        p1values.vvalue = tvb_get_letohl(tvb, nds_offset);
-                                                        p1values.vstring = "";
-                                                        p1values.vtype = 3; /* Uint32 */
-                                                        p1values.vdesc = "Iteration Handle: 0x%08x";
-                                                        p1values.vlength = 4;
-                                                        p1values.voffset = nds_offset;
-                                                        p1values.hfname = hf_nds_iteration;
-                                                        nds_offset = nds_offset+p1values.vlength;
-                                                        p2values.vvalue = tvb_get_letohl(tvb, nds_offset);
-                                                        p2values.vtype = 6; /* Multivalue Uint32 */
-                                                        p2values.vstring = "";
-                                                        p2values.vdesc = "Classes: %d";
-                                                        p2values.vlength = 4;
-                                                        p2values.voffset = nds_offset;
-                                                        p2values.mvtype = 4;
-                                                        p2values.hfname= hf_nds_classes;
+                                                        pvalues[0].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                        pvalues[0].vtype = VTYPE_UINT32;
+                                                        pvalues[0].vdesc = "Iteration Handle: 0x%08x";
+                                                        pvalues[0].vlength = 4;
+                                                        pvalues[0].voffset = nds_offset;
+                                                        pvalues[0].hfname = hf_nds_iteration;
+                                                        nds_offset = nds_offset+pvalues[0].vlength;
+                                                        pvalues[1].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                        pvalues[1].vtype = VTYPE_MULTIVALUE_UINT32;
+                                                        pvalues[1].vdesc = "Classes: %u";
+                                                        pvalues[1].vlength = 4;
+                                                        pvalues[1].voffset = nds_offset;
+                                                        pvalues[1].mvtype = MVTYPE_READ_CLASS_REQ;
+                                                        pvalues[1].hfname= hf_nds_classes;
                                                         break;
                                                 case 0x13:    
-                                                        p1values.vvalue = tvb_get_letohl(tvb, nds_offset);
-                                                        p1values.vstring = "";
-                                                        p1values.vtype = 3; /* Uint32 */
-                                                        p1values.vdesc = "Privileges: 0x%08x";
-                                                        p1values.vlength = 4;
-                                                        p1values.voffset = nds_offset;
-                                                        p1values.hfname = hf_nds_privileges;
-                                                        nds_offset = nds_offset+p1values.vlength;
+                                                        pvalues[0].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                        pvalues[0].vtype = VTYPE_UINT32;
+                                                        pvalues[0].vdesc = "Privileges: 0x%08x";
+                                                        pvalues[0].vlength = 4;
+                                                        pvalues[0].voffset = nds_offset;
+                                                        pvalues[0].hfname = hf_nds_privileges;
+                                                        nds_offset = nds_offset+pvalues[0].vlength;
                                                         break;
                                                 case 0x14:    
-                                                        verb_string = "Add Partition";
                                                         break;
                                                 case 0x15:    
-                                                        verb_string = "Remove Partition";
                                                         break;
                                                 case 0x16:    
-                                                        verb_string = "List Partitions";
-                                                        p1values.vvalue = tvb_get_letohl(tvb, nds_offset);
-                                                        p1values.vstring = "";
-                                                        p1values.vtype = 3; /* Uint32 */
-                                                        p1values.vdesc = "Iteration Handle: 0x%08x";
-                                                        p1values.vlength = 4;
-                                                        p1values.voffset = nds_offset;
-                                                        p1values.hfname = hf_nds_iteration;
-                                                        nds_offset = nds_offset+p1values.vlength;
-                                                        p2values.vtype = 4; /* String */
-                                                        p2values.vdesc = "Server Distinguished Name: %s";
-                                                        p2values.vstring = "";
-                                                        p2values.mvtype = 1;
-                                                        p2values.vvalue = 0;
-                                                        p2values.vlength = 256;
-                                                        p2values.vlength = tvb_get_letohl(tvb, nds_offset);
-                                                        if (p2values.vlength == 0x00)
+                                                        pvalues[0].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                        pvalues[0].vtype = VTYPE_UINT32;
+                                                        pvalues[0].vdesc = "Iteration Handle: 0x%08x";
+                                                        pvalues[0].vlength = 4;
+                                                        pvalues[0].voffset = nds_offset;
+                                                        pvalues[0].hfname = hf_nds_iteration;
+                                                        nds_offset = nds_offset+pvalues[0].vlength;
+                                                        pvalues[1].vtype = VTYPE_STRING;
+                                                        pvalues[1].vdesc = "Server Distinguished Name: %s";
+                                                        pvalues[1].mvtype = MVTYPE_ATTR_REQUEST;
+                                                        pvalues[1].vvalue = 0;
+                                                        pvalues[1].vlength = 256;
+                                                        pvalues[1].vlength = tvb_get_letohl(tvb, nds_offset);
+                                                        if (pvalues[1].vlength == 0x00)
                                                         {
-                                                                p2values.vtype = 0;
+                                                                pvalues[1].vtype = VTYPE_NONE;
                                                                 break;
                                                         }
-                                                        p2values.voffset = nds_offset+4;
+                                                        pvalues[1].voffset = nds_offset+4;
                                                         nds_offset += 4;
-                                                        get_string(tvb, p2values.voffset, p2values.vlength, p2values.vstring);
-                                                        nds_offset += p2values.vlength;
+                                                        get_string(tvb, pvalues[1].voffset, pvalues[1].vlength, pvalues[1].vstring);
+                                                        nds_offset += pvalues[1].vlength;
                                                         nds_offset += align_4(tvb, nds_offset);
-                                                        p2values.hfname= hf_nds_name;
+                                                        pvalues[1].hfname= hf_nds_name;
                                                         nds_offset += align_4(tvb, nds_offset);
-                                                        p3values.vvalue = tvb_get_letohl(tvb, nds_offset);
-                                                        p3values.vtype = 6; /* Multivalue Uint32 */
-                                                        p3values.vstring = "";
-                                                        p3values.vdesc = "Replicas: %d";
-                                                        p3values.vlength = 4;
-                                                        p3values.voffset = nds_offset;
-                                                        p3values.hfname = hf_nds_replicas;
-                                                        p3values.mvtype = 5;
-                                                        p3values.bit1 = "Output Flags";
-                                                        p3values.bit2 = "Entry ID";
-                                                        p3values.bit3 = "Replica State";
-                                                        p3values.bit4 = "Modification Timestamp";
-                                                        p3values.bit5 = "Purge Time";
-                                                        p3values.bit6 = "Local Partition ID";
-                                                        p3values.bit7 = "Distinguished Name";
-                                                        p3values.bit8 = "Replica Type";
-                                                        p3values.bit9 = "Partition Busy";
-                                                        p3values.vflags = request_value->req_nds_flags;
+                                                        pvalues[2].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                        pvalues[2].vtype = VTYPE_MULTIVALUE_UINT32;
+                                                        pvalues[2].vdesc = "Replicas: %u";
+                                                        pvalues[2].vlength = 4;
+                                                        pvalues[2].voffset = nds_offset;
+                                                        pvalues[2].hfname = hf_nds_replicas;
+                                                        pvalues[2].mvtype = MVTYPE_READ_REPLICAS;
+                                                        pvalues[2].bit1 = "Output Flags";
+                                                        pvalues[2].bit2 = "Entry ID";
+                                                        pvalues[2].bit3 = "Replica State";
+                                                        pvalues[2].bit4 = "Modification Timestamp";
+                                                        pvalues[2].bit5 = "Purge Time";
+                                                        pvalues[2].bit6 = "Local Partition ID";
+                                                        pvalues[2].bit7 = "Distinguished Name";
+                                                        pvalues[2].bit8 = "Replica Type";
+                                                        pvalues[2].bit9 = "Partition Busy";
+                                                        pvalues[2].vflags = request_value->req_nds_flags;
                                                         break;
                                                 case 0x17:    
-                                                        verb_string = "Split Partition";
                                                         break;
                                                 case 0x18:    
-                                                        verb_string = "Join Partitions";
                                                         break;
                                                 case 0x19:    
-                                                        verb_string = "Add Replica";
                                                         break;
                                                 case 0x1a:    
-                                                        verb_string = "Remove Replica";
                                                         break;
                                                 case 0x1b:    
-                                                        verb_string = "Open Stream";
-                                                        p1values.vvalue = tvb_get_ntohl(tvb, nds_offset);
-                                                        p1values.vstring = "";
-                                                        p1values.vtype = 3; /* Uint32 */
-                                                        p1values.vdesc = "File Handle: 0x%08x";
-                                                        p1values.vlength = 4;
-                                                        p1values.voffset = nds_offset;
-                                                        p1values.hfname = hf_nds_file_handle;
-                                                        nds_offset = nds_offset+p1values.vlength;
-                                                        p2values.vvalue = tvb_get_letohl(tvb, nds_offset);
-                                                        p2values.vstring = "";
-                                                        p2values.vtype = 3; /* Uint32 */
-                                                        p2values.vdesc = "File Size: %d";
-                                                        p2values.vlength = 4;
-                                                        p2values.voffset = nds_offset;
-                                                        p2values.hfname = hf_nds_file_size;
-                                                        nds_offset = nds_offset+p2values.vlength;
+                                                        pvalues[0].vvalue = tvb_get_ntohl(tvb, nds_offset);
+                                                        pvalues[0].vtype = VTYPE_UINT32;
+                                                        pvalues[0].vdesc = "File Handle: 0x%08x";
+                                                        pvalues[0].vlength = 4;
+                                                        pvalues[0].voffset = nds_offset;
+                                                        pvalues[0].hfname = hf_nds_file_handle;
+                                                        nds_offset = nds_offset+pvalues[0].vlength;
+                                                        pvalues[1].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                        pvalues[1].vtype = VTYPE_UINT32;
+                                                        pvalues[1].vdesc = "File Size: %u";
+                                                        pvalues[1].vlength = 4;
+                                                        pvalues[1].voffset = nds_offset;
+                                                        pvalues[1].hfname = hf_nds_file_size;
+                                                        nds_offset = nds_offset+pvalues[1].vlength;
                                                         break;
                                                 case 0x1c:    
-                                                        verb_string = "Search Filter";
                                                         break;
                                                 case 0x1d:    
-                                                        verb_string = "Create Subordinate Reference";
                                                         break;
                                                 case 0x1e:    
-                                                        verb_string = "Link Replica";
                                                         break;
                                                 case 0x1f:    
-                                                        verb_string = "Change Replica Type";
                                                         break;
                                                 case 0x20:    
-                                                        verb_string = "Start Update Schema";
                                                         break;
                                                 case 0x21:    
-                                                        verb_string = "End Update Schema";
                                                         break;
                                                 case 0x22:    
-                                                        verb_string = "Update Schema";
                                                         break;
                                                 case 0x23:    
-                                                        verb_string = "Start Update Replica";
                                                         break;
                                                 case 0x24:    
-                                                        verb_string = "End Update Replica";
                                                         break;
                                                 case 0x25:    
-                                                        verb_string = "Update Replica";
                                                         break;
                                                 case 0x26:    
-                                                        verb_string = "Synchronize Partition";
                                                         break;
                                                 case 0x27:    
-                                                        verb_string = "Synchronize Schema";
                                                         break;
                                                 case 0x28:    
-                                                        verb_string = "Read Syntaxes";
                                                         break;
                                                 case 0x29:    
-                                                        verb_string = "Get Replica Root ID";
                                                         break;                  
                                                 case 0x2a:    
-                                                        verb_string = "Begin Move Entry";
                                                         break;
                                                 case 0x2b:    
-                                                        verb_string = "Finish Move Entry";
                                                         break;
                                                 case 0x2c:    
-                                                        verb_string = "Release Moved Entry";
                                                         break;
                                                 case 0x2d:    
-                                                        verb_string = "Backup Entry";
                                                         break;
                                                 case 0x2e:    
-                                                        verb_string = "Restore Entry";
                                                         break;
                                                 case 0x2f:    
-                                                        verb_string = "Save DIB";
                                                         break;
                                                 case 0x30:
-                                                        verb_string = "Control";
                                                         break;
                                                 case 0x31:
-                                                        verb_string = "Remove Backlink";
                                                         break;
                                                 case 0x32:    
-                                                        verb_string = "Close Iteration";
                                                         break;
                                                 case 0x33:    
-                                                        verb_string = "Mutate Entry";
                                                         break;
                                                 case 0x34:    
-                                                        verb_string = "Audit Skulking";
                                                         break;
                                                 case 0x35:    
-                                                        verb_string = "Get Server Address";
                                                         if(request_value->nds_version != 0x000000fe)
                                                         { 
-                                                                p1values.vtype = 4; /* String */
-                                                                p1values.vdesc = "Distinguished Name: %s";
-                                                                p1values.vstring = "";
-                                                                p1values.mvtype = 1;
-                                                                p1values.vvalue = 0;
-                                                                p1values.vlength = 256;
-                                                                p1values.vlength = tvb_get_letohl(tvb, nds_offset);
-                                                                if (p1values.vlength == 0x00)
+                                                                pvalues[0].vtype = VTYPE_STRING;
+                                                                pvalues[0].vdesc = "Distinguished Name: %s";
+                                                                pvalues[0].mvtype = MVTYPE_ATTR_REQUEST;
+                                                                pvalues[0].vvalue = 0;
+                                                                pvalues[0].vlength = 256;
+                                                                pvalues[0].vlength = tvb_get_letohl(tvb, nds_offset);
+                                                                if (pvalues[0].vlength == 0x00)
                                                                 {
-                                                                        p1values.vtype = 0;
+                                                                        pvalues[0].vtype = VTYPE_NONE;
                                                                         break;
                                                                 }
-                                                                p1values.voffset = nds_offset+4;
+                                                                pvalues[0].voffset = nds_offset+4;
                                                                 nds_offset += 4;
-                                                                get_string(tvb, p1values.voffset, p1values.vlength, p1values.vstring);
-                                                                nds_offset += p1values.vlength;
+                                                                get_string(tvb, pvalues[0].voffset, pvalues[0].vlength, pvalues[0].vstring);
+                                                                nds_offset += pvalues[0].vlength;
                                                                 nds_offset += align_4(tvb, nds_offset);
-                                                                p1values.hfname= hf_nds_name;
-                                                                p2values.vvalue = tvb_get_letohl(tvb, nds_offset);
-                                                                p2values.vtype = 6; /* Multivalue Uint32 */
-                                                                p2values.vstring = "";
-                                                                p2values.vdesc = "Referal Records: %d";
-                                                                p2values.vlength = 4;
-                                                                p2values.voffset = nds_offset;
-                                                                p2values.hfname = hf_nds_referals;
-                                                                p2values.mvtype = 9;
+                                                                pvalues[0].hfname= hf_nds_name;
+                                                                pvalues[1].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                                pvalues[1].vtype = VTYPE_MULTIVALUE_UINT32;
+                                                                pvalues[1].vdesc = "Referral Records: %u";
+                                                                pvalues[1].vlength = 4;
+                                                                pvalues[1].voffset = nds_offset;
+                                                                pvalues[1].hfname = hf_nds_referrals;
+                                                                pvalues[1].mvtype = MVTYPE_LOC_ADDR_REFERRAL_REPLY;
                                                         }
                                                         else
                                                         {
-                                                                p1values.vvalue = tvb_get_letohl(tvb, nds_offset);
-                                                                p1values.vstring = "";
-                                                                p1values.vtype = 3; /* Uint32 */
-                                                                p1values.vdesc = "Iteration Handle: 0x%08x";
-                                                                p1values.vlength = 4;
-                                                                p1values.voffset = nds_offset;
-                                                                p1values.hfname = hf_nds_iteration;
-                                                                nds_offset = nds_offset+p1values.vlength;
-                                                                p2values.vtype = 4; /* String */
-                                                                p2values.vdesc = "Distinguished Name: %s";
-                                                                p2values.vstring = "";
-                                                                p2values.mvtype = 1;
-                                                                p2values.vvalue = 0;
-                                                                p2values.vlength = 256;
-                                                                p2values.vlength = tvb_get_letohl(tvb, nds_offset);
-                                                                if (p2values.vlength == 0x00)
+                                                                pvalues[0].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                                pvalues[0].vtype = VTYPE_UINT32;
+                                                                pvalues[0].vdesc = "Iteration Handle: 0x%08x";
+                                                                pvalues[0].vlength = 4;
+                                                                pvalues[0].voffset = nds_offset;
+                                                                pvalues[0].hfname = hf_nds_iteration;
+                                                                nds_offset = nds_offset+pvalues[0].vlength;
+                                                                pvalues[1].vtype = VTYPE_STRING;
+                                                                pvalues[1].vdesc = "Distinguished Name: %s";
+                                                                pvalues[1].mvtype = MVTYPE_ATTR_REQUEST;
+                                                                pvalues[1].vvalue = 0;
+                                                                pvalues[1].vlength = 256;
+                                                                pvalues[1].vlength = tvb_get_letohl(tvb, nds_offset);
+                                                                if (pvalues[1].vlength == 0x00)
                                                                 {
-                                                                        p2values.vtype = 0;
+                                                                        pvalues[1].vtype = VTYPE_NONE;
                                                                         break;
                                                                 }
-                                                                p2values.voffset = nds_offset+4;
+                                                                pvalues[1].voffset = nds_offset+4;
                                                                 nds_offset += 4;
-                                                                get_string(tvb, p2values.voffset, p2values.vlength, p2values.vstring);
-                                                                nds_offset += p2values.vlength;
+                                                                get_string(tvb, pvalues[1].voffset, pvalues[1].vlength, pvalues[1].vstring);
+                                                                nds_offset += pvalues[1].vlength;
                                                                 nds_offset += align_4(tvb, nds_offset);
-                                                                p2values.hfname= hf_nds_name;
-                                                                p3values.vvalue = tvb_get_letohl(tvb, nds_offset);
-                                                                p3values.vtype = 6; /* Multivalue Uint32 */
-                                                                p3values.vstring = "";
-                                                                p3values.vdesc = "Referal Records: %d";
-                                                                p3values.vlength = 4;
-                                                                p3values.voffset = nds_offset;
-                                                                p3values.hfname = hf_nds_referals;
-                                                                p3values.mvtype = 9;
+                                                                pvalues[1].hfname= hf_nds_name;
+                                                                pvalues[2].vvalue = tvb_get_letohl(tvb, nds_offset);
+                                                                pvalues[2].vtype = VTYPE_MULTIVALUE_UINT32;
+                                                                pvalues[2].vdesc = "Referral Records: %u";
+                                                                pvalues[2].vlength = 4;
+                                                                pvalues[2].voffset = nds_offset;
+                                                                pvalues[2].hfname = hf_nds_referrals;
+                                                                pvalues[2].mvtype = MVTYPE_LOC_ADDR_REFERRAL_REPLY;
                                                         }        
                                                         break;
                                                 case 0x36:    
-                                                        verb_string = "Set Keys";
                                                         break;
                                                 case 0x37:    
-                                                        verb_string = "Change Password";
                                                         break;
                                                 case 0x38:    
-                                                        verb_string = "Verify Password";
                                                         break;
                                                 case 0x39:    
-                                                        verb_string = "Begin Login";
                                                         break;
                                                 case 0x3a:    
-                                                        verb_string = "Finish Login";
                                                         break;
                                                 case 0x3b:    
-                                                        verb_string = "Begin Authentication";
                                                         break;
                                                 case 0x3c:    
-                                                        verb_string = "Finish Authentication";
                                                         break;
                                                 case 0x3d:    
-                                                        verb_string = "Logout";
                                                         break;
                                                 case 0x3e:    
-                                                        verb_string = "Repair Ring";
                                                         break;
                                                 case 0x3f:    
-                                                        verb_string = "Repair Timestamps";
                                                         break;
                                                 case 0x40:    
-                                                        verb_string = "Create Back Link";
                                                         break;
                                                 case 0x41:              
-                                                        verb_string = "Delete External Reference";
                                                         break;
                                                 case 0x42:    
-                                                        verb_string = "Rename External Reference";
                                                         break;
                                                 case 0x43:    
-                                                        verb_string = "Create Directory Entry";
                                                         break;
                                                 case 0x44:    
-                                                        verb_string = "Remove Directory Entry";
                                                         break;
                                                 case 0x45:    
-                                                        verb_string = "Designate New Master";
                                                         break;
                                                 case 0x46:    
-                                                        verb_string = "Change Tree Name";
                                                         break;
                                                 case 0x47:    
-                                                        verb_string = "Partition Entry Count";
                                                         break;
                                                 case 0x48:    
-                                                        verb_string = "Check Login Restrictions";
                                                         break;
                                                 case 0x49:    
-                                                        verb_string = "Start Join";
                                                         break;
                                                 case 0x4a:    
-                                                        verb_string = "Low Level Split";
                                                         break;
                                                 case 0x4b:    
-                                                        verb_string = "Low Level Join";
                                                         break;
                                                 case 0x4c:    
-                                                        verb_string = "Abort Low Level Join";
                                                         break;
                                                 case 0x4d:    
-                                                        verb_string = "Get All Servers";
                                                         break;
                                                        default:
-                                                               verb_string = "NDS Continuation Fragment";
                                                         break;
                                         }        
-                                       if(request_value->nds_request_verb != NULL)
+                                       if(request_value->nds_request_verb != 0)
                                         {
                                                 proto_tree_add_uint_format(ncp_tree, hf_ncp_nds_verb, tvb, 6, 0,
                                                        request_value->nds_request_verb, "NDS Verb: %d, %s",
@@ -5291,7 +5933,7 @@ dissect_ncp_reply(tvbuff_t *tvb, packet_info *pinfo,
                                                 {
                                                        request_eid_value = ncp_eid_hash_lookup(conversation, global_eid);
                                                                if (!request_eid_value) {
-                                                                       request_eid_value = ncp_eid_hash_insert(conversation, global_eid, ncp_rec);
+                                                                       request_eid_value = ncp_eid_hash_insert(global_eid);
                                                                         strcpy(request_eid_value->object_name, global_object_name);
                                                                 }        
                                                 }
@@ -5299,240 +5941,62 @@ dissect_ncp_reply(tvbuff_t *tvb, packet_info *pinfo,
                                         /* For NDS requests with just an EID, resolve name from hash table. */
                                         if(resolve_eid)
                                         {
-                                               request_eid_value = ncp_eid_hash_lookup(conversation, global_eid);
-                                               if (request_eid_value) {
-                                                        global_object_name = request_eid_value->object_name;
+                                               request_eid_value = ncp_eid_hash_lookup(conversation, global_eid);
+                                               if (request_eid_value) {
+                                                        strcpy(global_object_name, request_eid_value->object_name);
                                                         proto_tree_add_string_format(ncp_tree, hf_nds_name, tvb, 6, 0,
-                                                               global_object_name, "NDS Name for EID - %s",
-                                                               global_object_name);
-                                               }
-                                        }
-                                        if (p1values.vtype != 0) {
-                                                switch (p1values.vtype) {
-                                                        case 1:         /* uint8 */
-                                                               proto_tree_add_uint_format(ncp_tree, p1values.hfname, tvb, p1values.voffset,
-                                                                p1values.vlength, p1values.vtype, "NDS Parameter not defined %d",
-                                                               p1values.vtype);
-                                                                break;
-                                                        case 2:         /* uint16 */
-                                                               proto_tree_add_uint_format(ncp_tree, p1values.hfname, tvb, p1values.voffset,
-                                                                p1values.vlength, p1values.vtype, "NDS Parameter not defined %d",
-                                                               p1values.vtype);
-                                                                break;
-                                                        case 3:         /* uint32 */
-                                                               proto_tree_add_uint_format(ncp_tree, p1values.hfname, tvb, p1values.voffset,
-                                                                p1values.vlength, p1values.vvalue, p1values.vdesc,
-                                                               p1values.vvalue);
-                                                                break;
-                                                        case 4:         /* string */
-                                                                proto_tree_add_string_format(ncp_tree, p1values.hfname, tvb, p1values.voffset, 
-                                                                p1values.vlength, p1values.vdesc, p1values.vstring);
-                                                                break;
-                                                        case 5:         /* boolean */
-                                                                process_bitfield(ncp_tree, tvb, &p1values);
-                                                                break;
-                                                        case 6:         /*multivalue uint32 */
-                                                                process_multivalues(ncp_tree, tvb, &p1values);
-                                                                break;
-                                                        default:
-                                                               proto_tree_add_uint_format(ncp_tree, hf_nds_p1type, tvb, p1values.voffset,
-                                                                p1values.vlength, p1values.vtype, "NDS Parameter not defined %d",
-                                                               p1values.vtype);
-                                                                break;
-                                                }
-                                                switch (p2values.vtype) {
-                                                        case 1:         /* uint8 */
-                                                                break;
-                                                        case 2:         /* uint16 */
-                                                                break;
-                                                        case 3:         /* uint32 */
-                                                               proto_tree_add_uint_format(ncp_tree, p2values.hfname, tvb, p2values.voffset,
-                                                                p2values.vlength, p2values.vvalue, p2values.vdesc,
-                                                               p2values.vvalue);
-                                                                break;
-                                                        case 4:         /* string */
-                                                                proto_tree_add_string_format(ncp_tree, p2values.hfname, tvb, p2values.voffset, 
-                                                                p2values.vlength, p2values.vdesc, p2values.vstring);
-                                                                break;
-                                                        case 5:         /* boolean */
-                                                                process_bitfield(ncp_tree, tvb, &p2values);
-                                                                break;
-                                                        case 6:         /*multivalue uint32 */
-                                                                process_multivalues(ncp_tree, tvb, &p2values);
-                                                                break;
-                                                        default:
-                                                                break;
-                                                }
-                                                switch (p3values.vtype) {
-                                                        case 1:         /* uint8 */
-                                                                break;
-                                                        case 2:         /* uint16 */
-                                                                break;
-                                                        case 3:         /* uint32 */
-                                                               proto_tree_add_uint_format(ncp_tree, p3values.hfname, tvb, p3values.voffset,
-                                                                p3values.vlength, p3values.vvalue, p3values.vdesc,
-                                                               p3values.vvalue);
-                                                                break;
-                                                        case 4:         /* string */
-                                                                proto_tree_add_string_format(ncp_tree, p3values.hfname, tvb, p3values.voffset, 
-                                                                p3values.vlength, p3values.vdesc, p3values.vstring);
-                                                                break;
-                                                        case 5:         /* boolean */
-                                                                process_bitfield(ncp_tree, tvb, &p3values);
-                                                                break;
-                                                        case 6:         /*multivalue uint32 */
-                                                                process_multivalues(ncp_tree, tvb, &p3values);
-                                                                break;
-                                                        default:
-                                                                break;
-                                                }
-                                                switch (p4values.vtype) {
-                                                        case 1:         /* uint8 */
-                                                                break;
-                                                        case 2:         /* uint16 */
-                                                                break;
-                                                        case 3:         /* uint32 */
-                                                               proto_tree_add_uint_format(ncp_tree, p4values.hfname, tvb, p4values.voffset,
-                                                                p4values.vlength, p4values.vvalue, p4values.vdesc,
-                                                               p4values.vvalue);
-                                                                break;
-                                                        case 4:         /* string */
-                                                                proto_tree_add_string_format(ncp_tree, p4values.hfname, tvb, p4values.voffset, 
-                                                                p4values.vlength, p4values.vdesc, p4values.vstring);
-                                                                break;
-                                                        case 5:         /* boolean */
-                                                                process_bitfield(ncp_tree, tvb, &p4values);
-                                                                break;
-                                                        case 6:         /*multivalue uint32 */
-                                                                process_multivalues(ncp_tree, tvb, &p4values);
-                                                                break;
-                                                        default:
-                                                                break;
-                                                }
-                                                switch (p5values.vtype) {
-                                                        case 1:         /* uint8 */
-                                                                break;
-                                                        case 2:         /* uint16 */
-                                                                break;
-                                                        case 3:         /* uint32 */
-                                                               proto_tree_add_uint_format(ncp_tree, p5values.hfname, tvb, p5values.voffset,
-                                                                p5values.vlength, p5values.vvalue, p5values.vdesc,
-                                                               p5values.vvalue);
-                                                                break;
-                                                        case 4:         /* string */
-                                                                proto_tree_add_string_format(ncp_tree, p5values.hfname, tvb, p5values.voffset, 
-                                                                p5values.vlength, p5values.vdesc, p5values.vstring);
-                                                                break;
-                                                        case 5:         /* boolean */
-                                                                process_bitfield(ncp_tree, tvb, &p5values);
-                                                                break;
-                                                        case 6:         /*multivalue uint32 */
-                                                                process_multivalues(ncp_tree, tvb, &p5values);
-                                                                break;
-                                                        default:
-                                                                break;
-                                                }
-                                                switch (p6values.vtype) {
-                                                        case 1:         /* uint8 */
-                                                                break;
-                                                        case 2:         /* uint16 */
-                                                                break;
-                                                        case 3:         /* uint32 */
-                                                               proto_tree_add_uint_format(ncp_tree, p6values.hfname, tvb, p6values.voffset,
-                                                                p6values.vlength, p6values.vvalue, p6values.vdesc,
-                                                               p6values.vvalue);
-                                                                break;
-                                                        case 4:         /* string */
-                                                                proto_tree_add_string_format(ncp_tree, p6values.hfname, tvb, p6values.voffset, 
-                                                                p6values.vlength, p6values.vdesc, p6values.vstring);
-                                                                break;
-                                                        case 5:         /* boolean */
-                                                                process_bitfield(ncp_tree, tvb, &p6values);
-                                                                break;
-                                                        case 6:         /*multivalue uint32 */
-                                                                process_multivalues(ncp_tree, tvb, &p6values);
-                                                                break;
-                                                        default:
-                                                                break;
-                                                }
-                                                switch (p7values.vtype) {
-                                                        case 1:         /* uint8 */
-                                                                break;
-                                                        case 2:         /* uint16 */
-                                                                break;
-                                                        case 3:         /* uint32 */
-                                                               proto_tree_add_uint_format(ncp_tree, p7values.hfname, tvb, p7values.voffset,
-                                                                p7values.vlength, p7values.vvalue, p7values.vdesc,
-                                                               p7values.vvalue);
-                                                                break;
-                                                        case 4:         /* string */
-                                                                proto_tree_add_string_format(ncp_tree, p7values.hfname, tvb, p7values.voffset, 
-                                                                p7values.vlength, p7values.vdesc, p7values.vstring);
-                                                                break;
-                                                        case 5:         /* boolean */
-                                                                process_bitfield(ncp_tree, tvb, &p7values);
-                                                                break;
-                                                        case 6:         /*multivalue uint32 */
-                                                                process_multivalues(ncp_tree, tvb, &p7values);
-                                                                break;
-                                                        default:
-                                                                break;
-                                                }
-                                                switch (p8values.vtype) {
-                                                        case 1:         /* uint8 */
-                                                                break;
-                                                        case 2:         /* uint16 */
-                                                                break;
-                                                        case 3:         /* uint32 */
-                                                               proto_tree_add_uint_format(ncp_tree, p8values.hfname, tvb, p8values.voffset,
-                                                                p8values.vlength, p8values.vvalue, p8values.vdesc,
-                                                               p8values.vvalue);
-                                                                break;
-                                                        case 4:         /* string */
-                                                                proto_tree_add_string_format(ncp_tree, p8values.hfname, tvb, p8values.voffset, 
-                                                                p8values.vlength, p8values.vdesc, p8values.vstring);
-                                                                break;
-                                                        case 5:         /* boolean */
-                                                                process_bitfield(ncp_tree, tvb, &p8values);
-                                                                break;
-                                                        case 6:         /*multivalue uint32 */
-                                                                process_multivalues(ncp_tree, tvb, &p8values);
-                                                                break;
-                                                        default:
-                                                                break;
-                                                }
-                                                switch (p9values.vtype) {
-                                                        case 1:         /* uint8 */
-                                                                break;
-                                                        case 2:         /* uint16 */
-                                                                break;
-                                                        case 3:         /* uint32 */
-                                                               proto_tree_add_uint_format(ncp_tree, p9values.hfname, tvb, p9values.voffset,
-                                                                p9values.vlength, p9values.vvalue, p9values.vdesc,
-                                                               p9values.vvalue);
-                                                                break;
-                                                        case 4:         /* string */
-                                                                proto_tree_add_string_format(ncp_tree, p9values.hfname, tvb, p9values.voffset, 
-                                                                p9values.vlength, p9values.vdesc, p9values.vstring);
-                                                                break;
-                                                        case 5:         /* boolean */
-                                                                process_bitfield(ncp_tree, tvb, &p9values);
-                                                                break;
-                                                        case 6:         /*multivalue uint32 */
-                                                                process_multivalues(ncp_tree, tvb, &p9values);
-                                                                break;
-                                                        default:
-                                                                break;
-                                                }
-                                        }                
+                                                               global_object_name, "NDS Name for EID - %s",
+                                                               global_object_name);
+                                               }
+                                        }        
+                                       for (i = 0; i < 9; i++) {
+                                               switch (pvalues[i].vtype) {
+
+                                               case VTYPE_NONE: /* no value */
+                                                       break;
+
+                                               case VTYPE_UINT8:
+                                                       proto_tree_add_uint_format(ncp_tree, pvalues[i].hfname, tvb, pvalues[i].voffset,
+                                                           pvalues[i].vlength, pvalues[i].vtype, "NDS Parameter not defined %u",
+                                                           pvalues[i].vtype);
+                                                       break;
+
+                                               case VTYPE_UINT16:
+                                                       proto_tree_add_uint_format(ncp_tree, pvalues[i].hfname, tvb, pvalues[i].voffset,
+                                                           pvalues[i].vlength, pvalues[i].vtype, "NDS Parameter not defined %u",
+                                                           pvalues[i].vtype);
+                                                       break;
+
+                                               case VTYPE_UINT32:
+                                                       proto_tree_add_uint_format(ncp_tree, pvalues[i].hfname, tvb, pvalues[i].voffset,
+                                                           pvalues[i].vlength, pvalues[i].vvalue, pvalues[i].vdesc,
+                                                           pvalues[i].vvalue);
+                                                       break;
+
+                                               case VTYPE_STRING:
+                                                       proto_tree_add_string_format(ncp_tree, pvalues[i].hfname, tvb, pvalues[i].voffset, 
+                                                           pvalues[i].vlength, pvalues[i].vstring, pvalues[i].vdesc,
+                                                           pvalues[i].vstring);
+                                                       break;
+
+                                               case VTYPE_BITFIELD:
+                                                       process_bitfield(ncp_tree, tvb, &pvalues[i]);
+                                                       break;
+
+                                               case VTYPE_MULTIVALUE_UINT32:
+                                                       process_multivalues(ncp_tree, tvb, &pvalues[i]);
+                                                       break;
+
+                                               default:
+                                                       proto_tree_add_uint_format(ncp_tree, hf_nds_p1type, tvb, pvalues[i].voffset,
+                                                           pvalues[i].vlength, pvalues[i].vtype, "NDS Parameter not defined %u",
+                                                           pvalues[i].vtype);
+                                                       break;
+                                               }
+                                       }
                                 }                
                         }
-                }                        
-               /*
-                * Unless this is a reply, that's all there is to parse.
-                */
-               if (type != NCP_SERVICE_REPLY)
-                       return;
+                }
 
                length = tvb_length(tvb);
                if (!ncp_rec && length > 8) {
@@ -5574,55 +6038,41 @@ dissect_nds_request(tvbuff_t *tvb, packet_info *pinfo,
        ncp_req_hash_value      *request_value = NULL;
        ncp_req_eid_hash_value  *request_eid_value = NULL;
        const ncp_record        *ncp_rec = NULL;          
-        ncp_req_hash_value      *nds_rec = NULL;          
        conversation_t          *conversation;
-       conversation_t          *eid_conversation;
        ptvcursor_t             *ptvc = NULL;
        proto_tree              *temp_tree = NULL;
+       gboolean                run_req_cond = FALSE;
+       gboolean                run_info_str = FALSE;
         guint8                  nds_verb = 0;
         char *                  verb_string = "";
         guint32                 nds_frag = 0;
-        nds_val                 p1values;
-        nds_val                 p2values;
-        nds_val                 p3values;
-        nds_val                 p4values;
-        nds_val                 p5values;
-        nds_val                 p6values;
-        nds_val                 p7values;
-        nds_val                 p8values;
-        nds_val                 p9values;
-        guint32                 value1= 0;
-        guint32                 value2= 0;
-        char *                  nds_string = "";
+        gboolean                added_arrow;
+        nds_val                        pvalues[9];
+       char                    string_buffer[9][1024];
         guint8                  nds_version = 0;
         guint32                 foffset = 0;
-        guint32                 nlength = 0;
-        guint32                 nds_reply_buffer;
         nw_uni_t                req_buffer;
-        char *                  global_object_name="\0";
+        char                    global_object_name[256];
         guint32                 global_eid=0;
-        boolean                 resolve_eid=FALSE;
+        gboolean                resolve_eid=FALSE;
         guint32                 global_flags=0;
+       int                     i;
+        
+       for (i = 0; i < 9; i++) {
+               pvalues[i].vtype = 0;
+               pvalues[i].vvalue = 0;
+               pvalues[i].vlength = 0;
+               pvalues[i].voffset = 0;
+               pvalues[i].hfname = 0;
+               pvalues[i].vdesc = "";
+               string_buffer[i][0] = '\0';
+               pvalues[i].vstring = string_buffer[i];
+               pvalues[i].mvtype = 0;
+       }
+        
+        strcpy(req_buffer.buffer, "");
+        strcpy(global_object_name, "");
         
-        p1values.vtype = 0;
-        p2values.vtype = 0;
-        p3values.vtype = 0;
-        p4values.vtype = 0;
-        p5values.vtype = 0;
-        p6values.vtype = 0;
-        p7values.vtype = 0;
-        p8values.vtype = 0;
-        p9values.vtype = 0;
-        p1values.mvtype = 0;
-        p2values.mvtype = 0;
-        p3values.mvtype = 0;
-        p4values.mvtype = 0;
-        p5values.mvtype = 0;
-        p6values.mvtype = 0;
-        p7values.mvtype = 0;
-        p8values.mvtype = 0;
-        p9values.mvtype = 0;
-        req_buffer.buffer = "\0";
         func = tvb_get_guint8(tvb, 6);
         subfunc = tvb_get_guint8(tvb, 7);
         
@@ -5631,7 +6081,6 @@ dissect_nds_request(tvbuff_t *tvb, packet_info *pinfo,
         /* Check to see if this is a fragment packet */
         nds_frag = tvb_get_letohl(tvb, 8);
         
-
         /* Get NDS Verb */
         if (nds_frag == 0xffffffff) {
                 nds_verb = tvb_get_guint8(tvb, 24);
@@ -5646,432 +6095,411 @@ dissect_nds_request(tvbuff_t *tvb, packet_info *pinfo,
                         nds_version = 0;
                         foffset = 28;
                 }
-                nds_reply_buffer = tvb_get_letohl(tvb, foffset);        
-                proto_tree_add_uint_format(ncp_tree, hf_nds_buffer_size, tvb, foffset,
-                        4, nds_reply_buffer, "NDS Reply Buffer Size %d",
-                       nds_reply_buffer);
+                if (type == NCP_SERVICE_REQUEST) {
+                        proto_tree_add_item(ncp_tree, hf_nds_buffer_size, tvb, foffset,
+                                            4, TRUE);
+                }
                 foffset = foffset+4;        
+                verb_string = val_to_str(nds_verb, ncp_nds_verb_vals,
+                    "Continuation Fragment");
                 switch(nds_verb) {
                 
                         case 0x01:
-                                verb_string = "Resolve Name -> ";
-                                p1values.vvalue = tvb_get_letohl(tvb, foffset);
-                                nds_version = p1values.vvalue;
-                                p1values.vstring = "";
-                                p1values.vtype = 3; /* Uint32 */
-                                p1values.vdesc = "Version: %d";
-                                p1values.vlength = 4;
-                                p1values.hfname = hf_nds_ver;
-                                p1values.voffset = foffset;
-                                foffset = foffset+p1values.vlength;
-                                p2values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p2values.vtype = 5; /* Bitfield */
-                                p2values.vstring = "";
-                                p2values.vdesc = "Flags:";
-                                p2values.vlength = 2;
-                                p2values.hfname= hf_nds_nflags;
-                                p2values.voffset = foffset;
-                                p2values.bit1 = "Entry ID";
-                                p2values.bit1hfname = hf_bit1nflags;
-                                p2values.bit2 = "Readable";
-                                p2values.bit2hfname = hf_bit2nflags;
-                                p2values.bit3 = "Writeable";
-                                p2values.bit3hfname = hf_bit3nflags;
-                                p2values.bit4 = "Master";
-                                p2values.bit4hfname = hf_bit4nflags;
-                                p2values.bit5 = "Create ID";
-                                p2values.bit5hfname = hf_bit5nflags;
-                                p2values.bit6 = "Walk Tree";
-                                p2values.bit6hfname = hf_bit6nflags;
-                                p2values.bit7 = "Dereference Alias";
-                                p2values.bit7hfname = hf_bit7nflags;
-                                p2values.bit8 = "Not Defined";
-                                p2values.bit8hfname = hf_bit8nflags;
-                                p2values.bit9 = "Not Defined";
-                                p2values.bit9hfname = hf_bit9nflags;
-                                p2values.bit10 = "Not Defined";
-                                p2values.bit10hfname = hf_bit10nflags;
-                                p2values.bit11= "Not Defined";
-                                p2values.bit11hfname = hf_bit11nflags;
-                                p2values.bit12 = "Not Defined";
-                                p2values.bit12hfname = hf_bit12nflags;
-                                p2values.bit13 = "Not Defined";
-                                p2values.bit13hfname = hf_bit13nflags;
-                                p2values.bit14 = "Prefer Referalls";
-                                p2values.bit14hfname = hf_bit14nflags;
-                                p2values.bit15 = "Prefer Only Referalls";
-                                p2values.bit15hfname = hf_bit15nflags;
-                                p2values.bit16 = "Not Defined";
-                                p2values.bit16hfname = hf_bit16nflags;
+                                pvalues[0].vvalue = tvb_get_letohl(tvb, foffset);
+                                nds_version = pvalues[0].vvalue;
+                                pvalues[0].vtype = VTYPE_UINT32;
+                                pvalues[0].vdesc = "Version: %u";
+                                pvalues[0].vlength = 4;
+                                pvalues[0].hfname = hf_nds_ver;
+                                pvalues[0].voffset = foffset;
+                                foffset = foffset+pvalues[0].vlength;
+                                pvalues[1].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[1].vtype = VTYPE_BITFIELD;
+                                pvalues[1].vdesc = "Flags:";
+                                pvalues[1].vlength = 2;
+                                pvalues[1].hfname= hf_nds_nflags;
+                                pvalues[1].voffset = foffset;
+                                pvalues[1].bit1 = "Entry ID";
+                                pvalues[1].bit1hfname = hf_bit1nflags;
+                                pvalues[1].bit2 = "Readable";
+                                pvalues[1].bit2hfname = hf_bit2nflags;
+                                pvalues[1].bit3 = "Writeable";
+                                pvalues[1].bit3hfname = hf_bit3nflags;
+                                pvalues[1].bit4 = "Master";
+                                pvalues[1].bit4hfname = hf_bit4nflags;
+                                pvalues[1].bit5 = "Create ID";
+                                pvalues[1].bit5hfname = hf_bit5nflags;
+                                pvalues[1].bit6 = "Walk Tree";
+                                pvalues[1].bit6hfname = hf_bit6nflags;
+                                pvalues[1].bit7 = "Dereference Alias";
+                                pvalues[1].bit7hfname = hf_bit7nflags;
+                                pvalues[1].bit8 = "Not Defined";
+                                pvalues[1].bit8hfname = hf_bit8nflags;
+                                pvalues[1].bit9 = "Not Defined";
+                                pvalues[1].bit9hfname = hf_bit9nflags;
+                                pvalues[1].bit10 = "Not Defined";
+                                pvalues[1].bit10hfname = hf_bit10nflags;
+                                pvalues[1].bit11= "Not Defined";
+                                pvalues[1].bit11hfname = hf_bit11nflags;
+                                pvalues[1].bit12 = "Not Defined";
+                                pvalues[1].bit12hfname = hf_bit12nflags;
+                                pvalues[1].bit13 = "Not Defined";
+                                pvalues[1].bit13hfname = hf_bit13nflags;
+                                pvalues[1].bit14 = "Prefer Referrals";
+                                pvalues[1].bit14hfname = hf_bit14nflags;
+                                pvalues[1].bit15 = "Prefer Only Referrals";
+                                pvalues[1].bit15hfname = hf_bit15nflags;
+                                pvalues[1].bit16 = "Not Defined";
+                                pvalues[1].bit16hfname = hf_bit16nflags;
                                 foffset = foffset+4;
-                                if (p1values.vvalue == 0 || p1values.vvalue == 1)
+                                if (pvalues[0].vvalue == 0 || pvalues[0].vvalue == 1)
                                 {
-                                        p3values.vtype = 3; /* Uint32 */
-                                        p3values.vdesc = "Scope: %d";
-                                        p3values.vstring = "";
-                                        p3values.vlength = 4;
-                                        p3values.voffset = foffset;
-                                        p3values.vvalue = tvb_get_letohl(tvb, foffset);
-                                        p3values.hfname= hf_nds_scope;
-                                        foffset = foffset+p3values.vlength;
-                                        p4values.vtype = 4; /* String */
-                                        p4values.vdesc = "Name: %s";
-                                        p4values.vstring = "";
-                                        p4values.mvtype = 1;
-                                        p4values.vvalue = 0;
-                                        p4values.vlength = 256;
-                                        p4values.vlength = tvb_get_letohl(tvb, foffset);
-                                        if (p4values.vlength == 0x00)
+                                        pvalues[2].vtype = VTYPE_UINT32;
+                                        pvalues[2].vdesc = "Scope: %u";
+                                        pvalues[2].vlength = 4;
+                                        pvalues[2].voffset = foffset;
+                                        pvalues[2].vvalue = tvb_get_letohl(tvb, foffset);
+                                        pvalues[2].hfname= hf_nds_scope;
+                                        foffset = foffset+pvalues[2].vlength;
+                                        pvalues[3].vtype = VTYPE_STRING;
+                                        pvalues[3].vdesc = "Name: %s";
+                                        pvalues[3].mvtype = MVTYPE_ATTR_REQUEST;
+                                        pvalues[3].vvalue = 0;
+                                        pvalues[3].vlength = 256;
+                                        pvalues[3].vlength = tvb_get_letohl(tvb, foffset);
+                                        if (pvalues[3].vlength == 0x00)
                                         {
-                                                p4values.vtype = 0;
+                                                pvalues[3].vtype = VTYPE_NONE;
                                                 break;
                                         }
-                                        p4values.voffset = foffset+4;
+                                        pvalues[3].voffset = foffset+4;
                                         foffset = foffset + 4;
-                                        get_string(tvb, p4values.voffset, p4values.vlength, req_buffer.buffer);
-                                        p4values.vstring = req_buffer.buffer;
-                                        global_object_name = req_buffer.buffer;
-                                        p4values.hfname= hf_nds_name;
-                                        foffset = foffset+p4values.vlength;
+                                        get_string(tvb, pvalues[3].voffset, pvalues[3].vlength, req_buffer.buffer);
+                                        pvalues[3].vstring = req_buffer.buffer;
+                                        strcpy(global_object_name, req_buffer.buffer);
+                                        pvalues[3].hfname= hf_nds_name;
+                                        foffset = foffset+pvalues[3].vlength;
                                         foffset += align_4(tvb, foffset);
-                                        p5values.vvalue = tvb_get_letohl(tvb, foffset);
-                                        p5values.vtype = 6; /* Mulitvalue Uint32 */
-                                        p5values.vstring = "";
-                                        p5values.vdesc = "Communications Transports: %d";
-                                        p5values.vlength = 4;
-                                        p5values.hfname= hf_nds_comm_trans;
-                                        p5values.voffset = foffset;
-                                        p5values.mvtype = 7;
-                                        foffset = foffset + (p5values.vvalue * 4) + 4;
-                                        p6values.vvalue = tvb_get_letohl(tvb, foffset);
-                                        p6values.vtype = 6; /* Multivalue Uint32 */
-                                        p6values.vstring = "";
-                                        p6values.vdesc = "Tree Walker Transport Type: %d";
-                                        p6values.vlength = 4;
-                                        p6values.mvtype = 7;
-                                        p6values.hfname= hf_nds_tree_trans;
-                                        p6values.voffset = foffset;
+                                        pvalues[4].vvalue = tvb_get_letohl(tvb, foffset);
+                                        pvalues[4].vtype = VTYPE_MULTIVALUE_UINT32;
+                                        pvalues[4].vdesc = "Communications Transports: %u";
+                                        pvalues[4].vlength = 4;
+                                        pvalues[4].hfname= hf_nds_comm_trans;
+                                        pvalues[4].voffset = foffset;
+                                        pvalues[4].mvtype = MVTYPE_ADDR_REFERRAL_REQUEST;
+                                        foffset = foffset + (pvalues[4].vvalue * 4) + 4;
+                                        pvalues[5].vvalue = tvb_get_letohl(tvb, foffset);
+                                        pvalues[5].vtype = VTYPE_MULTIVALUE_UINT32;
+                                        pvalues[5].vdesc = "Tree Walker Transport Type: %u";
+                                        pvalues[5].vlength = 4;
+                                        pvalues[5].mvtype = MVTYPE_ADDR_REFERRAL_REQUEST;
+                                        pvalues[5].hfname= hf_nds_tree_trans;
+                                        pvalues[5].voffset = foffset;
                                 }
                                 else
                                 {
-                                        p3values.vtype = 3; /* Uint32 */
-                                        p3values.vdesc = "Minimum DS Version: %d";
-                                        p3values.vstring = "";
-                                        p3values.vlength = 4;
-                                        p3values.voffset = foffset;
-                                        p3values.vvalue = tvb_get_letohl(tvb, foffset);
-                                        p3values.hfname= hf_min_nds_ver;
-                                        foffset = foffset+p3values.vlength;
-                                        p4values.vvalue = tvb_get_letohl(tvb, foffset);
-                                        p4values.vtype = 6; /* Multivalue Uint32 */
-                                        p4values.vstring = "";
-                                        p4values.vdesc = "Number of Versions to Include: %d";
-                                        p4values.vlength = 4;
-                                        p4values.mvtype = 3;
-                                        p4values.voffset = foffset;
-                                        p4values.hfname= hf_nds_ver_include;
-                                        foffset += (p4values.vvalue * 4) + 4;
-                                        p5values.vvalue = tvb_get_letohl(tvb, foffset);
-                                        p5values.vtype = 6; /* Multivalue Uint32 */
-                                        p5values.vstring = "";
-                                        p5values.vdesc = "Number of Versions to Exclude: %d";
-                                        p5values.vlength = 4;
-                                        p5values.mvtype = 3;
-                                        p5values.hfname= hf_nds_ver_exclude;
-                                        p5values.voffset = foffset;
+                                        pvalues[2].vtype = VTYPE_UINT32;
+                                        pvalues[2].vdesc = "Minimum DS Version: %u";
+                                        pvalues[2].vlength = 4;
+                                        pvalues[2].voffset = foffset;
+                                        pvalues[2].vvalue = tvb_get_letohl(tvb, foffset);
+                                        pvalues[2].hfname= hf_min_nds_ver;
+                                        foffset = foffset+pvalues[2].vlength;
+                                        pvalues[3].vvalue = tvb_get_letohl(tvb, foffset);
+                                        pvalues[3].vtype = VTYPE_MULTIVALUE_UINT32;
+                                        pvalues[3].vdesc = "Number of Versions to Include: %u";
+                                        pvalues[3].vlength = 4;
+                                        pvalues[3].mvtype = MVTYPE_ATTR_REQUEST2;
+                                        pvalues[3].voffset = foffset;
+                                        pvalues[3].hfname= hf_nds_ver_include;
+                                        foffset += (pvalues[3].vvalue * 4) + 4;
+                                        pvalues[4].vvalue = tvb_get_letohl(tvb, foffset);
+                                        pvalues[4].vtype = VTYPE_MULTIVALUE_UINT32;
+                                        pvalues[4].vdesc = "Number of Versions to Exclude: %u";
+                                        pvalues[4].vlength = 4;
+                                        pvalues[4].mvtype = MVTYPE_ATTR_REQUEST2;
+                                        pvalues[4].hfname= hf_nds_ver_exclude;
+                                        pvalues[4].voffset = foffset;
                                         foffset += 4;
-                                        p6values.vtype = 3; /* Uint32 */
-                                        p6values.vdesc = "DN Output Type: %d";
-                                        p6values.vstring = "";
-                                        p6values.vlength = 4;
-                                        p6values.voffset = foffset;
-                                        p6values.vvalue = tvb_get_letohl(tvb, foffset);
-                                        p6values.hfname= hf_nds_dn_output_type;
-                                        foffset = foffset+p6values.vlength;
-                                        p7values.vtype = 3; /* Uint32 */
-                                        p7values.vdesc = "Nested Output Type: %d";
-                                        p7values.vstring = "";
-                                        p7values.vlength = 4;
-                                        p7values.voffset = foffset;
-                                        p7values.vvalue = tvb_get_letohl(tvb, foffset);
-                                        p7values.hfname= hf_nds_nested_output_type;
-                                        foffset = foffset+p7values.vlength;
-                                        p8values.vtype = 4; /* String */
-                                        p8values.vdesc = "Output Delimiter: %s";
-                                        p8values.vstring = "";
-                                        p8values.mvtype = 1;
-                                        p8values.vvalue = 0;
-                                        p8values.vlength = 256;
-                                        p8values.vlength = tvb_get_letohl(tvb, foffset);
-                                        p8values.voffset = foffset+4;
+                                        pvalues[5].vtype = VTYPE_UINT32;
+                                        pvalues[5].vdesc = "DN Output Type: %u";
+                                        pvalues[5].vlength = 4;
+                                        pvalues[5].voffset = foffset;
+                                        pvalues[5].vvalue = tvb_get_letohl(tvb, foffset);
+                                        pvalues[5].hfname= hf_nds_dn_output_type;
+                                        foffset = foffset+pvalues[5].vlength;
+                                        pvalues[6].vtype = VTYPE_UINT32;
+                                        pvalues[6].vdesc = "Nested Output Type: %u";
+                                        pvalues[6].vlength = 4;
+                                        pvalues[6].voffset = foffset;
+                                        pvalues[6].vvalue = tvb_get_letohl(tvb, foffset);
+                                        pvalues[6].hfname= hf_nds_nested_output_type;
+                                        foffset = foffset+pvalues[6].vlength;
+                                        pvalues[7].vtype = VTYPE_STRING;
+                                        pvalues[7].vdesc = "Output Delimiter: %s";
+                                        pvalues[7].mvtype = MVTYPE_ATTR_REQUEST;
+                                        pvalues[7].vvalue = 0;
+                                        pvalues[7].vlength = 256;
+                                        pvalues[7].vlength = tvb_get_letohl(tvb, foffset);
+                                        pvalues[7].voffset = foffset+4;
                                         foffset = foffset + 4;
-                                        get_string(tvb, p8values.voffset, p8values.vlength, req_buffer.buffer);
-                                        p8values.vstring = req_buffer.buffer;
-                                        p8values.hfname= hf_nds_output_delimiter;
-                                        foffset = foffset+p8values.vlength;
+                                        get_string(tvb, pvalues[7].voffset, pvalues[7].vlength, req_buffer.buffer);
+                                        pvalues[7].vstring = req_buffer.buffer;
+                                        pvalues[7].hfname= hf_nds_output_delimiter;
+                                        foffset = foffset+pvalues[7].vlength;
                                         foffset += align_4(tvb, foffset);
-                                        p9values.vvalue = tvb_get_letohl(tvb, foffset);
-                                        p9values.vtype = 6; /* Multivalue Uint32 */
-                                        p9values.vstring = "";
-                                        p9values.vdesc = "Size of Entry Specifier: %d";
-                                        p9values.vlength = 4;
-                                        p9values.mvtype = 10;
-                                        p9values.hfname= hf_nds_output_entry_specifier;
-                                        p9values.voffset = foffset;
+                                        pvalues[8].vvalue = tvb_get_letohl(tvb, foffset);
+                                        pvalues[8].vtype = VTYPE_MULTIVALUE_UINT32;
+                                        pvalues[8].vdesc = "Size of Entry Specifier: %u";
+                                        pvalues[8].vlength = 4;
+                                        pvalues[8].mvtype = MVTYPE_PROC_ENTRY_SPECIFIERS;
+                                        pvalues[8].hfname= hf_nds_output_entry_specifier;
+                                        pvalues[8].voffset = foffset;
                                 }
                                 break;
                         case 0x02:    
-                                verb_string = "Read Entry Information";
-                                p1values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p1values.vstring = "";
-                                p1values.vtype = 3; /* Uint32 */
-                                p1values.vdesc = "Version: %d";
-                                p1values.vlength = 4;
-                                p1values.voffset = foffset;
-                                p1values.hfname= hf_nds_ver;
-                                foffset = foffset+p1values.vlength;
-                                switch(p1values.vvalue)
+                                pvalues[0].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[0].vtype = VTYPE_UINT32;
+                                pvalues[0].vdesc = "Version: %u";
+                                pvalues[0].vlength = 4;
+                                pvalues[0].voffset = foffset;
+                                pvalues[0].hfname= hf_nds_ver;
+                                foffset = foffset+pvalues[0].vlength;
+                                switch(pvalues[0].vvalue)
                                 {
                                         case 0:
-                                                p2values.vvalue = tvb_get_letohl(tvb, foffset);
-                                                p2values.vstring = "";
-                                                p2values.vtype = 3; /* Uint32 */
-                                                p2values.vdesc = "Entry ID: 0x%08x";
-                                                p2values.vlength = 4;
+                                                pvalues[1].vvalue = tvb_get_letohl(tvb, foffset);
+                                                pvalues[1].vtype = VTYPE_UINT32;
+                                                pvalues[1].vdesc = "Entry ID: 0x%08x";
+                                                pvalues[1].vlength = 4;
                                                 resolve_eid = TRUE;
-                                                global_eid = p2values.vvalue;
-                                                p2values.voffset = foffset;
-                                                p2values.hfname = hf_nds_eid;
-                                                foffset = foffset+p2values.vlength;
+                                                global_eid = pvalues[1].vvalue;
+                                                pvalues[1].voffset = foffset;
+                                                pvalues[1].hfname = hf_nds_eid;
+                                                foffset = foffset+pvalues[1].vlength;
                                                 break;
                                         case 1:
-                                                p2values.vvalue = tvb_get_letohl(tvb, foffset);
-                                                p2values.vtype = 5; /* Bitfield */
-                                                p2values.vstring = "";
-                                                p2values.vdesc = "Request Flags:";
-                                                p2values.vlength = 2;
-                                                p2values.hfname= hf_nds_rflags;
-                                                p2values.voffset = foffset;
-                                                p2values.bit1 = "Typeless";
-                                                p2values.bit1hfname = hf_bit1rflags;
-                                                p2values.bit2 = "Slashed";
-                                                p2values.bit2hfname = hf_bit2rflags;
-                                                p2values.bit3 = "Dotted";
-                                                p2values.bit3hfname = hf_bit3rflags;
-                                                p2values.bit4 = "Tuned";
-                                                p2values.bit4hfname = hf_bit4rflags;
-                                                p2values.bit5 = "Not Defined";
-                                                p2values.bit5hfname = hf_bit5rflags;
-                                                p2values.bit6 = "Not Defined";
-                                                p2values.bit6hfname = hf_bit6rflags;
-                                                p2values.bit7 = "Not Defined";
-                                                p2values.bit7hfname = hf_bit7rflags;
-                                                p2values.bit8 = "Not Defined";
-                                                p2values.bit8hfname = hf_bit8rflags;
-                                                p2values.bit9 = "Not Defined";
-                                                p2values.bit9hfname = hf_bit9rflags;
-                                                p2values.bit10 = "Not Defined";
-                                                p2values.bit10hfname = hf_bit10rflags;
-                                                p2values.bit11 = "Not Defined";
-                                                p2values.bit11hfname = hf_bit11rflags;
-                                                p2values.bit12 = "Not Defined";
-                                                p2values.bit12hfname = hf_bit12rflags;
-                                                p2values.bit13 = "Not Defined";
-                                                p2values.bit13hfname = hf_bit13rflags;
-                                                p2values.bit14 = "Not Defined";
-                                                p2values.bit14hfname = hf_bit14rflags;
-                                                p2values.bit15 = "Not Defined";
-                                                p2values.bit15hfname = hf_bit15rflags;
-                                                p2values.bit16 = "Not Defined";
-                                                p2values.bit16hfname = hf_bit16rflags;
-                                                if((p2values.vvalue&&0xf000) == 0xc000)
+                                                pvalues[1].vvalue = tvb_get_letohl(tvb, foffset);
+                                                pvalues[1].vtype = VTYPE_BITFIELD;
+                                                pvalues[1].vdesc = "Request Flags:";
+                                                pvalues[1].vlength = 2;
+                                                pvalues[1].hfname= hf_nds_rflags;
+                                                pvalues[1].voffset = foffset;
+                                                pvalues[1].bit1 = "Typeless";
+                                                pvalues[1].bit1hfname = hf_bit1rflags;
+                                                pvalues[1].bit2 = "Slashed";
+                                                pvalues[1].bit2hfname = hf_bit2rflags;
+                                                pvalues[1].bit3 = "Dotted";
+                                                pvalues[1].bit3hfname = hf_bit3rflags;
+                                                pvalues[1].bit4 = "Tuned";
+                                                pvalues[1].bit4hfname = hf_bit4rflags;
+                                                pvalues[1].bit5 = "Not Defined";
+                                                pvalues[1].bit5hfname = hf_bit5rflags;
+                                                pvalues[1].bit6 = "Not Defined";
+                                                pvalues[1].bit6hfname = hf_bit6rflags;
+                                                pvalues[1].bit7 = "Not Defined";
+                                                pvalues[1].bit7hfname = hf_bit7rflags;
+                                                pvalues[1].bit8 = "Not Defined";
+                                                pvalues[1].bit8hfname = hf_bit8rflags;
+                                                pvalues[1].bit9 = "Not Defined";
+                                                pvalues[1].bit9hfname = hf_bit9rflags;
+                                                pvalues[1].bit10 = "Not Defined";
+                                                pvalues[1].bit10hfname = hf_bit10rflags;
+                                                pvalues[1].bit11 = "Not Defined";
+                                                pvalues[1].bit11hfname = hf_bit11rflags;
+                                                pvalues[1].bit12 = "Not Defined";
+                                                pvalues[1].bit12hfname = hf_bit12rflags;
+                                                pvalues[1].bit13 = "Not Defined";
+                                                pvalues[1].bit13hfname = hf_bit13rflags;
+                                                pvalues[1].bit14 = "Not Defined";
+                                                pvalues[1].bit14hfname = hf_bit14rflags;
+                                                pvalues[1].bit15 = "Not Defined";
+                                                pvalues[1].bit15hfname = hf_bit15rflags;
+                                                pvalues[1].bit16 = "Not Defined";
+                                                pvalues[1].bit16hfname = hf_bit16rflags;
+                                                if((pvalues[1].vvalue&&0xf000) == 0xc000)
                                                 {
-                                                        p3values.vtype = 4; /* String */
-                                                        p3values.vdesc = "Name Type: %s";
-                                                        p3values.vstring = "Partial";
-                                                        p3values.mvtype = 0;
-                                                        p3values.vvalue = 0;
-                                                        p3values.vlength = 0;
-                                                        p3values.voffset = 0;
-                                                        p3values.hfname= hf_nds_name_type;
+                                                        pvalues[2].vtype = VTYPE_STRING;
+                                                        pvalues[2].vdesc = "Name Type: %s";
+                                                        pvalues[2].vstring = "Partial";
+                                                        pvalues[2].mvtype = 0;
+                                                        pvalues[2].vvalue = 0;
+                                                        pvalues[2].vlength = 0;
+                                                        pvalues[2].voffset = 0;
+                                                        pvalues[2].hfname= hf_nds_name_type;
                                                 }
                                                 else
                                                 {
-                                                        p3values.vtype = 4; /* String */
-                                                        p3values.vdesc = "Name Type: %s";
-                                                        p3values.vstring = "Full";
-                                                        p3values.vvalue = 0;
-                                                        p3values.mvtype = 0;
-                                                        p3values.vlength = 0;
-                                                        p3values.voffset = 0;
-                                                        p3values.hfname= hf_nds_name_type;
+                                                        pvalues[2].vtype = VTYPE_STRING;
+                                                        pvalues[2].vdesc = "Name Type: %s";
+                                                        pvalues[2].vstring = "Full";
+                                                        pvalues[2].vvalue = 0;
+                                                        pvalues[2].mvtype = 0;
+                                                        pvalues[2].vlength = 0;
+                                                        pvalues[2].voffset = 0;
+                                                        pvalues[2].hfname= hf_nds_name_type;
                                                 }
                                                 foffset = foffset+4;
-                                                p4values.vvalue = tvb_get_letohl(tvb, foffset);
-                                                p4values.vstring = "";
-                                                p4values.vtype = 3; /* Uint32 */
-                                                p4values.vdesc = "Entry ID: 0x%08x";
-                                                p4values.vlength = 4;
-                                                p4values.voffset = foffset;
+                                                pvalues[3].vvalue = tvb_get_letohl(tvb, foffset);
+                                                pvalues[3].vtype = VTYPE_UINT32;
+                                                pvalues[3].vdesc = "Entry ID: 0x%08x";
+                                                pvalues[3].vlength = 4;
+                                                pvalues[3].voffset = foffset;
                                                 resolve_eid = TRUE;
-                                                global_eid = p4values.vvalue;
-                                                p4values.hfname = hf_nds_eid;
-                                                foffset = foffset+p4values.vlength;
+                                                global_eid = pvalues[3].vvalue;
+                                                pvalues[3].hfname = hf_nds_eid;
+                                                foffset = foffset+pvalues[3].vlength;
                                                 break;
                                         case 2:
-                                                p2values.vvalue = tvb_get_letohl(tvb, foffset);
-                                                p2values.vtype = 5; /* Bitfield */
-                                                p2values.vstring = "";
-                                                p2values.vdesc = "Request Flags:";
-                                                p2values.vlength = 2;
-                                                p2values.hfname= hf_nds_rflags;
-                                                p2values.voffset = foffset;
-                                                p2values.bit1 = "Typeless";
-                                                p2values.bit1hfname = hf_bit1rflags;
-                                                p2values.bit2 = "Slashed";
-                                                p2values.bit2hfname = hf_bit2rflags;
-                                                p2values.bit3 = "Dotted";
-                                                p2values.bit3hfname = hf_bit3rflags;
-                                                p2values.bit4 = "Tuned";
-                                                p2values.bit4hfname = hf_bit4rflags;
-                                                p2values.bit5 = "Not Defined";
-                                                p2values.bit5hfname = hf_bit5rflags;
-                                                p2values.bit6 = "Not Defined";
-                                                p2values.bit6hfname = hf_bit6rflags;
-                                                p2values.bit7 = "Not Defined";
-                                                p2values.bit7hfname = hf_bit7rflags;
-                                                p2values.bit8 = "Not Defined";
-                                                p2values.bit8hfname = hf_bit8rflags;
-                                                p2values.bit9 = "Not Defined";
-                                                p2values.bit9hfname = hf_bit9rflags;
-                                                p2values.bit10 = "Not Defined";
-                                                p2values.bit10hfname = hf_bit10rflags;
-                                                p2values.bit11 = "Not Defined";
-                                                p2values.bit11hfname = hf_bit11rflags;
-                                                p2values.bit12 = "Not Defined";
-                                                p2values.bit12hfname = hf_bit12rflags;
-                                                p2values.bit13 = "Not Defined";
-                                                p2values.bit13hfname = hf_bit13rflags;
-                                                p2values.bit14 = "Not Defined";
-                                                p2values.bit14hfname = hf_bit14rflags;
-                                                p2values.bit15 = "Not Defined";
-                                                p2values.bit15hfname = hf_bit15rflags;
-                                                p2values.bit16 = "Not Defined";
-                                                p2values.bit16hfname = hf_bit16rflags;
-                                                if((p2values.vvalue&&0xf000) == 0xc000)
+                                                pvalues[1].vvalue = tvb_get_letohl(tvb, foffset);
+                                                pvalues[1].vtype = VTYPE_BITFIELD;
+                                                pvalues[1].vdesc = "Request Flags:";
+                                                pvalues[1].vlength = 2;
+                                                pvalues[1].hfname= hf_nds_rflags;
+                                                pvalues[1].voffset = foffset;
+                                                pvalues[1].bit1 = "Typeless";
+                                                pvalues[1].bit1hfname = hf_bit1rflags;
+                                                pvalues[1].bit2 = "Slashed";
+                                                pvalues[1].bit2hfname = hf_bit2rflags;
+                                                pvalues[1].bit3 = "Dotted";
+                                                pvalues[1].bit3hfname = hf_bit3rflags;
+                                                pvalues[1].bit4 = "Tuned";
+                                                pvalues[1].bit4hfname = hf_bit4rflags;
+                                                pvalues[1].bit5 = "Not Defined";
+                                                pvalues[1].bit5hfname = hf_bit5rflags;
+                                                pvalues[1].bit6 = "Not Defined";
+                                                pvalues[1].bit6hfname = hf_bit6rflags;
+                                                pvalues[1].bit7 = "Not Defined";
+                                                pvalues[1].bit7hfname = hf_bit7rflags;
+                                                pvalues[1].bit8 = "Not Defined";
+                                                pvalues[1].bit8hfname = hf_bit8rflags;
+                                                pvalues[1].bit9 = "Not Defined";
+                                                pvalues[1].bit9hfname = hf_bit9rflags;
+                                                pvalues[1].bit10 = "Not Defined";
+                                                pvalues[1].bit10hfname = hf_bit10rflags;
+                                                pvalues[1].bit11 = "Not Defined";
+                                                pvalues[1].bit11hfname = hf_bit11rflags;
+                                                pvalues[1].bit12 = "Not Defined";
+                                                pvalues[1].bit12hfname = hf_bit12rflags;
+                                                pvalues[1].bit13 = "Not Defined";
+                                                pvalues[1].bit13hfname = hf_bit13rflags;
+                                                pvalues[1].bit14 = "Not Defined";
+                                                pvalues[1].bit14hfname = hf_bit14rflags;
+                                                pvalues[1].bit15 = "Not Defined";
+                                                pvalues[1].bit15hfname = hf_bit15rflags;
+                                                pvalues[1].bit16 = "Not Defined";
+                                                pvalues[1].bit16hfname = hf_bit16rflags;
+                                                if((pvalues[1].vvalue&&0xf000) == 0xc000)
                                                 {
-                                                        p3values.vtype = 4; /* String */
-                                                        p3values.vdesc = "Name Type: %s";
-                                                        p3values.vstring = "Return Partion Name";
-                                                        p3values.vvalue = 0;
-                                                        p3values.vlength = 4;
-                                                        p3values.voffset = p2values.voffset;
-                                                        p3values.mvtype = 0;
-                                                        p3values.hfname= hf_nds_name_type;
+                                                        pvalues[2].vtype = VTYPE_STRING;
+                                                        pvalues[2].vdesc = "Name Type: %s";
+                                                        pvalues[2].vstring = "Return Partion Name";
+                                                        pvalues[2].vvalue = 0;
+                                                        pvalues[2].vlength = 4;
+                                                        pvalues[2].voffset = pvalues[1].voffset;
+                                                        pvalues[2].mvtype = 0;
+                                                        pvalues[2].hfname= hf_nds_name_type;
                                                 }
                                                 else
                                                 {
-                                                        p3values.vtype = 4; /* String */
-                                                        p3values.vdesc = "Name Type: %s";
-                                                        p3values.vstring = "Return Full Name";
-                                                        p3values.vvalue = 0;
-                                                        p3values.vlength = 4;
-                                                        p3values.mvtype = 0;
-                                                        p3values.voffset = p2values.voffset;
-                                                        p3values.hfname= hf_nds_name_type;
+                                                        pvalues[2].vtype = VTYPE_STRING;
+                                                        pvalues[2].vdesc = "Name Type: %s";
+                                                        pvalues[2].vstring = "Return Full Name";
+                                                        pvalues[2].vvalue = 0;
+                                                        pvalues[2].vlength = 4;
+                                                        pvalues[2].mvtype = 0;
+                                                        pvalues[2].voffset = pvalues[1].voffset;
+                                                        pvalues[2].hfname= hf_nds_name_type;
                                                 }
                                                 foffset = foffset+4;
-                                                p4values.vvalue = tvb_get_letohs(tvb, foffset);
+                                                pvalues[3].vvalue = tvb_get_letohs(tvb, foffset);
                                                 global_flags = tvb_get_letohl(tvb, foffset);
-                                                p4values.vtype = 5; /* Bitfield */
-                                                p4values.vstring = "";
-                                                p4values.vdesc = "Information Flags (low) Byte:";
-                                                p4values.vlength = 2;
-                                                p4values.hfname= hf_nds_rflags;
-                                                p4values.voffset = foffset;
-                                                p4values.bit1 = "Output Flags";
-                                                p4values.bit1hfname = hf_bit1infoflagsl;
-                                                p4values.bit2 = "Entry ID";
-                                                p4values.bit2hfname = hf_bit2infoflagsl;
-                                                p4values.bit3 = "Entry Flags";
-                                                p4values.bit3hfname = hf_bit3infoflagsl;
-                                                p4values.bit4 = "Subordinate Count";
-                                                p4values.bit4hfname = hf_bit4infoflagsl;
-                                                p4values.bit5 = "Modification Time";
-                                                p4values.bit5hfname = hf_bit5infoflagsl;
-                                                p4values.bit6 = "Modification Timestamp";
-                                                p4values.bit6hfname = hf_bit6infoflagsl;
-                                                p4values.bit7 = "Creation Timestamp";
-                                                p4values.bit7hfname = hf_bit7infoflagsl;
-                                                p4values.bit8 = "Partition Root ID";
-                                                p4values.bit8hfname = hf_bit8infoflagsl;
-                                                p4values.bit9 = "Parent ID";
-                                                p4values.bit9hfname = hf_bit9infoflagsl;
-                                                p4values.bit10 = "Revision Count";
-                                                p4values.bit10hfname = hf_bit10infoflagsl;
-                                                p4values.bit11 = "Replica Type";
-                                                p4values.bit11hfname = hf_bit11infoflagsl;
-                                                p4values.bit12 = "Base Class";
-                                                p4values.bit12hfname = hf_bit12infoflagsl;
-                                                p4values.bit13 = "Relative Distinguished Name";
-                                                p4values.bit13hfname = hf_bit13infoflagsl;
-                                                p4values.bit14 = "Distinguished Name";
-                                                p4values.bit14hfname = hf_bit14infoflagsl;
-                                                p4values.bit15 = "Root Distinguished Name";
-                                                p4values.bit15hfname = hf_bit15infoflagsl;
-                                                p4values.bit16 = "Parent Distinguished Name";
-                                                p4values.bit16hfname = hf_bit16infoflagsl;
+                                                pvalues[3].vtype = VTYPE_BITFIELD;
+                                                pvalues[3].vdesc = "Information Flags (low) Byte:";
+                                                pvalues[3].vlength = 2;
+                                                pvalues[3].hfname= hf_nds_rflags;
+                                                pvalues[3].voffset = foffset;
+                                                pvalues[3].bit1 = "Output Flags";
+                                                pvalues[3].bit1hfname = hf_bit1infoflagsl;
+                                                pvalues[3].bit2 = "Entry ID";
+                                                pvalues[3].bit2hfname = hf_bit2infoflagsl;
+                                                pvalues[3].bit3 = "Entry Flags";
+                                                pvalues[3].bit3hfname = hf_bit3infoflagsl;
+                                                pvalues[3].bit4 = "Subordinate Count";
+                                                pvalues[3].bit4hfname = hf_bit4infoflagsl;
+                                                pvalues[3].bit5 = "Modification Time";
+                                                pvalues[3].bit5hfname = hf_bit5infoflagsl;
+                                                pvalues[3].bit6 = "Modification Timestamp";
+                                                pvalues[3].bit6hfname = hf_bit6infoflagsl;
+                                                pvalues[3].bit7 = "Creation Timestamp";
+                                                pvalues[3].bit7hfname = hf_bit7infoflagsl;
+                                                pvalues[3].bit8 = "Partition Root ID";
+                                                pvalues[3].bit8hfname = hf_bit8infoflagsl;
+                                                pvalues[3].bit9 = "Parent ID";
+                                                pvalues[3].bit9hfname = hf_bit9infoflagsl;
+                                                pvalues[3].bit10 = "Revision Count";
+                                                pvalues[3].bit10hfname = hf_bit10infoflagsl;
+                                                pvalues[3].bit11 = "Replica Type";
+                                                pvalues[3].bit11hfname = hf_bit11infoflagsl;
+                                                pvalues[3].bit12 = "Base Class";
+                                                pvalues[3].bit12hfname = hf_bit12infoflagsl;
+                                                pvalues[3].bit13 = "Relative Distinguished Name";
+                                                pvalues[3].bit13hfname = hf_bit13infoflagsl;
+                                                pvalues[3].bit14 = "Distinguished Name";
+                                                pvalues[3].bit14hfname = hf_bit14infoflagsl;
+                                                pvalues[3].bit15 = "Root Distinguished Name";
+                                                pvalues[3].bit15hfname = hf_bit15infoflagsl;
+                                                pvalues[3].bit16 = "Parent Distinguished Name";
+                                                pvalues[3].bit16hfname = hf_bit16infoflagsl;
                                                 foffset = foffset+2;
-                                                p5values.vvalue = tvb_get_letohs(tvb, foffset);
-                                                p5values.vtype = 5; /* Bitfield */
-                                                p5values.vstring = "";
-                                                p5values.vdesc = "Information Flags (high) Byte:";
-                                                p5values.vlength = 2;
-                                                p5values.hfname= hf_nds_rflags;
-                                                p5values.voffset = foffset;
-                                                p5values.bit1 = "Purge Time";
-                                                p5values.bit1hfname = hf_bit1infoflagsh;
-                                                p5values.bit2 = "Dereference Base Class";
-                                                p5values.bit2hfname = hf_bit2infoflagsh;
-                                                p5values.bit3 = "Not Defined";
-                                                p5values.bit3hfname = hf_bit3infoflagsh;
-                                                p5values.bit4 = "Not Defined";
-                                                p5values.bit4hfname = hf_bit4infoflagsh;
-                                                p5values.bit5 = "Not Defined";
-                                                p5values.bit5hfname = hf_bit5infoflagsh;
-                                                p5values.bit6 = "Not Defined";
-                                                p5values.bit6hfname = hf_bit6infoflagsh;
-                                                p5values.bit7 = "Not Defined";
-                                                p5values.bit7hfname = hf_bit7infoflagsh;
-                                                p5values.bit8 = "Not Defined";
-                                                p5values.bit8hfname = hf_bit8infoflagsh;
-                                                p5values.bit9 = "Not Defined";
-                                                p5values.bit9hfname = hf_bit9infoflagsh;
-                                                p5values.bit10 = "Not Defined";
-                                                p5values.bit10hfname = hf_bit10infoflagsh;
-                                                p5values.bit11 = "Not Defined";
-                                                p5values.bit11hfname = hf_bit11infoflagsh;
-                                                p5values.bit12 = "Not Defined";
-                                                p5values.bit12hfname = hf_bit12infoflagsh;
-                                                p5values.bit13 = "Not Defined";
-                                                p5values.bit13hfname = hf_bit13infoflagsh;
-                                                p5values.bit14 = "Not Defined";
-                                                p5values.bit14hfname = hf_bit14infoflagsh;
-                                                p5values.bit15 = "Not Defined";
-                                                p5values.bit15hfname = hf_bit15infoflagsh;
-                                                p5values.bit16 = "Not Defined";
-                                                p5values.bit16hfname = hf_bit16infoflagsh;
+                                                pvalues[4].vvalue = tvb_get_letohs(tvb, foffset);
+                                                pvalues[4].vtype = VTYPE_BITFIELD;
+                                                pvalues[4].vdesc = "Information Flags (high) Byte:";
+                                                pvalues[4].vlength = 2;
+                                                pvalues[4].hfname= hf_nds_rflags;
+                                                pvalues[4].voffset = foffset;
+                                                pvalues[4].bit1 = "Purge Time";
+                                                pvalues[4].bit1hfname = hf_bit1infoflagsh;
+                                                pvalues[4].bit2 = "Dereference Base Class";
+                                                pvalues[4].bit2hfname = hf_bit2infoflagsh;
+                                                pvalues[4].bit3 = "Not Defined";
+                                                pvalues[4].bit3hfname = hf_bit3infoflagsh;
+                                                pvalues[4].bit4 = "Not Defined";
+                                                pvalues[4].bit4hfname = hf_bit4infoflagsh;
+                                                pvalues[4].bit5 = "Not Defined";
+                                                pvalues[4].bit5hfname = hf_bit5infoflagsh;
+                                                pvalues[4].bit6 = "Not Defined";
+                                                pvalues[4].bit6hfname = hf_bit6infoflagsh;
+                                                pvalues[4].bit7 = "Not Defined";
+                                                pvalues[4].bit7hfname = hf_bit7infoflagsh;
+                                                pvalues[4].bit8 = "Not Defined";
+                                                pvalues[4].bit8hfname = hf_bit8infoflagsh;
+                                                pvalues[4].bit9 = "Not Defined";
+                                                pvalues[4].bit9hfname = hf_bit9infoflagsh;
+                                                pvalues[4].bit10 = "Not Defined";
+                                                pvalues[4].bit10hfname = hf_bit10infoflagsh;
+                                                pvalues[4].bit11 = "Not Defined";
+                                                pvalues[4].bit11hfname = hf_bit11infoflagsh;
+                                                pvalues[4].bit12 = "Not Defined";
+                                                pvalues[4].bit12hfname = hf_bit12infoflagsh;
+                                                pvalues[4].bit13 = "Not Defined";
+                                                pvalues[4].bit13hfname = hf_bit13infoflagsh;
+                                                pvalues[4].bit14 = "Not Defined";
+                                                pvalues[4].bit14hfname = hf_bit14infoflagsh;
+                                                pvalues[4].bit15 = "Not Defined";
+                                                pvalues[4].bit15hfname = hf_bit15infoflagsh;
+                                                pvalues[4].bit16 = "Not Defined";
+                                                pvalues[4].bit16hfname = hf_bit16infoflagsh;
                                                 foffset = foffset+2;
-                                                p6values.vvalue = tvb_get_letohl(tvb, foffset);
-                                                p6values.vstring = "";
-                                                p6values.vtype = 3; /* Uint32 */
-                                                p6values.vdesc = "Entry ID: 0x%08x";
-                                                p6values.vlength = 4;
-                                                p6values.voffset = foffset;
+                                                pvalues[5].vvalue = tvb_get_letohl(tvb, foffset);
+                                                pvalues[5].vtype = VTYPE_UINT32;
+                                                pvalues[5].vdesc = "Entry ID: 0x%08x";
+                                                pvalues[5].vlength = 4;
+                                                pvalues[5].voffset = foffset;
                                                 resolve_eid = TRUE;
-                                                global_eid = p6values.vvalue;
-                                                p6values.hfname = hf_nds_eid;
-                                                foffset = foffset+p6values.vlength;
+                                                global_eid = pvalues[5].vvalue;
+                                                pvalues[5].hfname = hf_nds_eid;
+                                                foffset = foffset+pvalues[5].vlength;
                                                 break;
                                         default:
                                                 break;
@@ -6079,166 +6507,151 @@ dissect_nds_request(tvbuff_t *tvb, packet_info *pinfo,
                                 
                                 break;
                         case 0x03:    
-                                verb_string = "Read -> ";
-                                p1values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p1values.vstring = "";
-                                p1values.vtype = 3; /* Uint32 */
-                                p1values.vdesc = "Version: %d";
-                                p1values.vlength = 4;
-                                p1values.voffset = foffset;
-                                p1values.hfname= hf_nds_ver;
-                                foffset = foffset+p1values.vlength;
-                                if(p1values.vvalue == 0)
+                                pvalues[0].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[0].vtype = VTYPE_UINT32;
+                                pvalues[0].vdesc = "Version: %u";
+                                pvalues[0].vlength = 4;
+                                pvalues[0].voffset = foffset;
+                                pvalues[0].hfname= hf_nds_ver;
+                                foffset = foffset+pvalues[0].vlength;
+                                if(pvalues[0].vvalue == 0)
                                 {
-                                        p2values.vvalue = tvb_get_letohl(tvb, foffset);
-                                        p2values.vstring = "";
-                                        p2values.vtype = 3; /* Uint32 */
-                                        p2values.vdesc = "Iteration Handle: 0x%08x";
-                                        p2values.vlength = 4;
-                                        p2values.voffset = foffset;
-                                        p2values.hfname= hf_nds_iteration;
-                                        foffset = foffset+p2values.vlength;
-                                        p3values.vvalue = tvb_get_letohl(tvb, foffset);
-                                        p3values.vstring = "";
-                                        p3values.vtype = 3; /* Uint32 */
-                                        p3values.vdesc = "Entry ID: 0x%08x";
-                                        p3values.vlength = 4;
+                                        pvalues[1].vvalue = tvb_get_letohl(tvb, foffset);
+                                        pvalues[1].vtype = VTYPE_UINT32;
+                                        pvalues[1].vdesc = "Iteration Handle: 0x%08x";
+                                        pvalues[1].vlength = 4;
+                                        pvalues[1].voffset = foffset;
+                                        pvalues[1].hfname= hf_nds_iteration;
+                                        foffset = foffset+pvalues[1].vlength;
+                                        pvalues[2].vvalue = tvb_get_letohl(tvb, foffset);
+                                        pvalues[2].vtype = VTYPE_UINT32;
+                                        pvalues[2].vdesc = "Entry ID: 0x%08x";
+                                        pvalues[2].vlength = 4;
                                         resolve_eid = TRUE;
-                                        global_eid = p3values.vvalue;
-                                        p3values.voffset = foffset;
-                                        p3values.hfname= hf_nds_eid;
-                                        foffset = foffset+p3values.vlength;
-                                        p4values.vvalue = tvb_get_letohl(tvb, foffset);
-                                        p4values.vstring = match_strval(p4values.vvalue, nds_info_type);
-                                        global_flags = p4values.vvalue;
-                                        if(p4values.vstring == NULL)
+                                        global_eid = pvalues[2].vvalue;
+                                        pvalues[2].voffset = foffset;
+                                        pvalues[2].hfname= hf_nds_eid;
+                                        foffset = foffset+pvalues[2].vlength;
+                                        pvalues[3].vvalue = tvb_get_letohl(tvb, foffset);
+                                        pvalues[3].vstring = match_strval(pvalues[3].vvalue, nds_info_type);
+                                        global_flags = pvalues[3].vvalue;
+                                        if(pvalues[3].vstring == NULL)
                                         {
-                                                p4values.vstring = "No Info Type Set";
+                                                pvalues[3].vstring = "No Info Type Set";
                                         }
-                                        p4values.vtype = 4; /* String */
-                                        p4values.vdesc = "Info Type: %s";
-                                        p4values.vlength = 4;
-                                        p4values.voffset = foffset;
-                                        p4values.mvtype = 1;
-                                        p4values.hfname= hf_nds_info_type;
-                                        foffset = foffset + p4values.vlength;
-                                        p5values.vvalue = tvb_get_letohl(tvb, foffset);
-                                        p5values.vstring = "";
-                                        p5values.vtype = 3; /* Uint32 */
-                                        p5values.vdesc = "All Attributes: %d";
-                                        p5values.vlength = 4;
-                                        p5values.voffset = foffset;
-                                        p5values.hfname= hf_nds_all_attr;
-                                        foffset = foffset+p5values.vlength;
-                                        p6values.vvalue = tvb_get_letohl(tvb, foffset);
-                                        p6values.vtype = 6; /* Multivalue Uint32 */
-                                        p6values.vstring = "";
-                                        p6values.vdesc = "Attributes: %d";
-                                        p6values.vlength = 4;
-                                        p6values.voffset = foffset;
-                                        p6values.mvtype = 1;
-                                        p6values.hfname= hf_nds_attr;
+                                        pvalues[3].vtype = VTYPE_STRING;
+                                        pvalues[3].vdesc = "Info Type: %s";
+                                        pvalues[3].vlength = 4;
+                                        pvalues[3].voffset = foffset;
+                                        pvalues[3].mvtype = MVTYPE_ATTR_REQUEST;
+                                        pvalues[3].hfname= hf_nds_info_type;
+                                        foffset = foffset + pvalues[3].vlength;
+                                        pvalues[4].vvalue = tvb_get_letohl(tvb, foffset);
+                                        pvalues[4].vtype = VTYPE_UINT32;
+                                        pvalues[4].vdesc = "All Attributes: %u";
+                                        pvalues[4].vlength = 4;
+                                        pvalues[4].voffset = foffset;
+                                        pvalues[4].hfname= hf_nds_all_attr;
+                                        foffset = foffset+pvalues[4].vlength;
+                                        pvalues[5].vvalue = tvb_get_letohl(tvb, foffset);
+                                        pvalues[5].vtype = VTYPE_MULTIVALUE_UINT32;
+                                        pvalues[5].vdesc = "Attributes: %u";
+                                        pvalues[5].vlength = 4;
+                                        pvalues[5].voffset = foffset;
+                                        pvalues[5].mvtype = MVTYPE_ATTR_REQUEST;
+                                        pvalues[5].hfname= hf_nds_attr;
                                 }
                                 else
                                 {
-                                        p2values.vvalue = tvb_get_letohl(tvb, foffset);
-                                        p2values.vstring = "";
-                                        p2values.vtype = 3; /* Uint32 */
-                                        p2values.vdesc = "Request Flags: 0x%08x";
-                                        p2values.vlength = 4;
-                                        p2values.voffset = foffset;
-                                        p2values.hfname= hf_nds_req_flags;
-                                        foffset = foffset+p2values.vlength;
-                                        p3values.vvalue = tvb_get_letohl(tvb, foffset);
-                                        p3values.vstring = "";
-                                        p3values.vtype = 3; /* Uint32 */
-                                        p3values.vdesc = "Iteration Handle: 0x%08x";
-                                        p3values.vlength = 4;
-                                        p3values.voffset = foffset;
-                                        p3values.hfname= hf_nds_iteration;
-                                        foffset = foffset+p3values.vlength;
-                                        p4values.vvalue = tvb_get_letohl(tvb, foffset);
-                                        p4values.vstring = "";
-                                        p4values.vtype = 3; /* Uint32 */
-                                        p4values.vdesc = "Entry ID: 0x%08x";
-                                        p4values.vlength = 4;
+                                        pvalues[1].vvalue = tvb_get_letohl(tvb, foffset);
+                                        pvalues[1].vtype = VTYPE_UINT32;
+                                        pvalues[1].vdesc = "Request Flags: 0x%08x";
+                                        pvalues[1].vlength = 4;
+                                        pvalues[1].voffset = foffset;
+                                        pvalues[1].hfname= hf_nds_req_flags;
+                                        foffset = foffset+pvalues[1].vlength;
+                                        pvalues[2].vvalue = tvb_get_letohl(tvb, foffset);
+                                        pvalues[2].vtype = VTYPE_UINT32;
+                                        pvalues[2].vdesc = "Iteration Handle: 0x%08x";
+                                        pvalues[2].vlength = 4;
+                                        pvalues[2].voffset = foffset;
+                                        pvalues[2].hfname= hf_nds_iteration;
+                                        foffset = foffset+pvalues[2].vlength;
+                                        pvalues[3].vvalue = tvb_get_letohl(tvb, foffset);
+                                        pvalues[3].vtype = VTYPE_UINT32;
+                                        pvalues[3].vdesc = "Entry ID: 0x%08x";
+                                        pvalues[3].vlength = 4;
                                         resolve_eid = TRUE;
-                                        global_eid = p4values.vvalue;
-                                        p4values.voffset = foffset;
-                                        p4values.hfname= hf_nds_eid;
-                                        foffset = foffset+p4values.vlength;
-                                        p5values.vvalue = tvb_get_letohl(tvb, foffset);
-                                        p5values.vstring = match_strval(p5values.vvalue, nds_info_type);
-                                        global_flags = p5values.vvalue;
-                                        if(p5values.vstring == NULL)
+                                        global_eid = pvalues[3].vvalue;
+                                        pvalues[3].voffset = foffset;
+                                        pvalues[3].hfname= hf_nds_eid;
+                                        foffset = foffset+pvalues[3].vlength;
+                                        pvalues[4].vvalue = tvb_get_letohl(tvb, foffset);
+                                        pvalues[4].vstring = match_strval(pvalues[4].vvalue, nds_info_type);
+                                        global_flags = pvalues[4].vvalue;
+                                        if(pvalues[4].vstring == NULL)
                                         {
-                                                p5values.vstring = "No Info Type Set";
+                                                pvalues[4].vstring = "No Info Type Set";
                                         }
-                                        p5values.vtype = 4; /* String */
-                                        p5values.vdesc = "Info Type: %s";
-                                        p5values.vlength = 4;
-                                        p5values.voffset = foffset;
-                                        p5values.hfname= hf_nds_info_type;
-                                        p5values.mvtype = 1;
-                                        foffset = foffset+p5values.vlength;
-                                        p6values.vvalue = tvb_get_letohl(tvb, foffset);
-                                        p6values.vstring = "";
-                                        p6values.vtype = 3; /* Uint32 */
-                                        p6values.vdesc = "All Attributes: %d";
-                                        p6values.vlength = 4;
-                                        p6values.voffset = foffset;
-                                        p6values.hfname= hf_nds_all_attr;
-                                        foffset = foffset+p6values.vlength;
-                                        p7values.vvalue = tvb_get_letohl(tvb, foffset);
-                                        p7values.vtype = 6; /* Multivalue Uint32 */
-                                        p7values.vstring = "";
-                                        p7values.vdesc = "Attributes: %d";
-                                        p7values.vlength = 4;
-                                        p7values.voffset = foffset;
-                                        p7values.mvtype = 1;
-                                        p7values.hfname= hf_nds_attr;
+                                        pvalues[4].vtype = VTYPE_STRING;
+                                        pvalues[4].vdesc = "Info Type: %s";
+                                        pvalues[4].vlength = 4;
+                                        pvalues[4].voffset = foffset;
+                                        pvalues[4].hfname= hf_nds_info_type;
+                                        pvalues[4].mvtype = MVTYPE_ATTR_REQUEST;
+                                        foffset = foffset+pvalues[4].vlength;
+                                        pvalues[5].vvalue = tvb_get_letohl(tvb, foffset);
+                                        pvalues[5].vtype = VTYPE_UINT32;
+                                        pvalues[5].vdesc = "All Attributes: %u";
+                                        pvalues[5].vlength = 4;
+                                        pvalues[5].voffset = foffset;
+                                        pvalues[5].hfname= hf_nds_all_attr;
+                                        foffset = foffset+pvalues[5].vlength;
+                                        pvalues[6].vvalue = tvb_get_letohl(tvb, foffset);
+                                        pvalues[6].vtype = VTYPE_MULTIVALUE_UINT32;
+                                        pvalues[6].vdesc = "Attributes: %u";
+                                        pvalues[6].vlength = 4;
+                                        pvalues[6].voffset = foffset;
+                                        pvalues[6].mvtype = MVTYPE_ATTR_REQUEST;
+                                        pvalues[6].hfname= hf_nds_attr;
                                 }
                                 break;
                         case 0x04:    
-                                verb_string = "Compare";
-                                p1values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p1values.vstring = "";
-                                p1values.vtype = 3; /* Uint32 */
-                                p1values.vdesc = "Version: %d";
-                                p1values.vlength = 4;
-                                p1values.voffset = foffset;
-                                p1values.hfname= hf_nds_ver;
-                                foffset = foffset+p1values.vlength;
-                                p2values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p2values.vstring = "";
-                                p2values.vtype = 3; /* Uint32 */
-                                p2values.vdesc = "Entry ID: 0x%08x";
-                                p2values.vlength = 4;
+                                pvalues[0].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[0].vtype = VTYPE_UINT32;
+                                pvalues[0].vdesc = "Version: %u";
+                                pvalues[0].vlength = 4;
+                                pvalues[0].voffset = foffset;
+                                pvalues[0].hfname= hf_nds_ver;
+                                foffset = foffset+pvalues[0].vlength;
+                                pvalues[1].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[1].vtype = VTYPE_UINT32;
+                                pvalues[1].vdesc = "Entry ID: 0x%08x";
+                                pvalues[1].vlength = 4;
                                 resolve_eid = TRUE;
-                                global_eid = p2values.vvalue;
-                                p2values.voffset = foffset;
-                                p2values.hfname = hf_nds_eid;
-                                foffset = foffset+p2values.vlength;
+                                global_eid = pvalues[1].vvalue;
+                                pvalues[1].voffset = foffset;
+                                pvalues[1].hfname = hf_nds_eid;
+                                foffset = foffset+pvalues[1].vlength;
                                 foffset += 4;       /* Attribute Count = 1 */
-                                p3values.vtype = 4; /* String */
-                                p3values.vdesc = "Attribute Name Being Compared: %s";
-                                p3values.vstring = "";
-                                p3values.mvtype = 1;
-                                p3values.vvalue = 0;
-                                p3values.vlength = 256;
-                                p3values.vlength = tvb_get_letohl(tvb, foffset);
-                                if (p3values.vlength == 0x00)
+                                pvalues[2].vtype = VTYPE_STRING;
+                                pvalues[2].vdesc = "Attribute Name Being Compared: %s";
+                                pvalues[2].mvtype = MVTYPE_ATTR_REQUEST;
+                                pvalues[2].vvalue = 0;
+                                pvalues[2].vlength = 256;
+                                pvalues[2].vlength = tvb_get_letohl(tvb, foffset);
+                                if (pvalues[2].vlength == 0x00)
                                 {
-                                        p3values.vtype = 0;
+                                        pvalues[2].vtype = VTYPE_NONE;
                                         break;
                                 }
-                                p3values.voffset = foffset+4;
+                                pvalues[2].voffset = foffset+4;
                                 foffset = foffset + 4;
-                                get_string(tvb, p3values.voffset, p3values.vlength, req_buffer.buffer);
-                                p3values.vstring = req_buffer.buffer;
-                                global_object_name = req_buffer.buffer;
-                                p3values.hfname= hf_nds_name;
-                                foffset = foffset+p3values.vlength;
+                                get_string(tvb, pvalues[2].voffset, pvalues[2].vlength, req_buffer.buffer);
+                                pvalues[2].vstring = req_buffer.buffer;
+                                strcpy(global_object_name, req_buffer.buffer);
+                                pvalues[2].hfname= hf_nds_name;
+                                foffset = foffset+pvalues[2].vlength;
                                 foffset += align_4(tvb, foffset);
                                 foffset += 4;       /* Attribute Value Count = 1 */
                                 /***************
@@ -6247,1353 +6660,1519 @@ dissect_nds_request(tvbuff_t *tvb, packet_info *pinfo,
                                  ***************/
                                 break;
                         case 0x05:    
-                                verb_string = "List -> ";
-                                p1values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p1values.vstring = "";
-                                p1values.vtype = 3; /* Uint32 */
-                                p1values.vdesc = "Version: %d";
-                                p1values.vlength = 4;
-                                p1values.voffset = foffset;
-                                p1values.hfname= hf_nds_ver;
-                                foffset = foffset+p1values.vlength;
-                                p2values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p2values.vtype = 5; /* Bitfield */
-                                p2values.vstring = "";
-                                p2values.vdesc = "Request Flags:";
-                                p2values.vlength = 2;
-                                p2values.hfname= hf_nds_rflags;
-                                p2values.voffset = foffset;
-                                p2values.bit1 = "List Typeless";
-                                p2values.bit1hfname = hf_bit1lflags;
-                                p2values.bit2 = "List Containers";
-                                p2values.bit2hfname = hf_bit2lflags;
-                                p2values.bit3 = "List Slashed";
-                                p2values.bit3hfname = hf_bit3lflags;
-                                p2values.bit4 = "List Dotted";
-                                p2values.bit4hfname = hf_bit4lflags;
-                                p2values.bit5 = "Dereference Alias";
-                                p2values.bit5hfname = hf_bit5lflags;
-                                p2values.bit6 = "List All Containers";
-                                p2values.bit6hfname = hf_bit6lflags;
-                                p2values.bit7 = "List Obsolete";
-                                p2values.bit7hfname = hf_bit7lflags;
-                                p2values.bit8 = "List Tuned Output";
-                                p2values.bit8hfname = hf_bit8lflags;
-                                p2values.bit9 = "List External Reference";
-                                p2values.bit9hfname = hf_bit9lflags;
-                                p2values.bit10 = "Not Defined";
-                                p2values.bit10hfname = hf_bit10lflags;
-                                p2values.bit11 = "Not Defined";
-                                p2values.bit11hfname = hf_bit11lflags;
-                                p2values.bit12 = "Not Defined";
-                                p2values.bit12hfname = hf_bit12lflags;
-                                p2values.bit13 = "Not Defined";
-                                p2values.bit13hfname = hf_bit13lflags;
-                                p2values.bit14 = "Not Defined";
-                                p2values.bit14hfname = hf_bit14lflags;
-                                p2values.bit15 = "Not Defined";
-                                p2values.bit15hfname = hf_bit15lflags;
-                                p2values.bit16 = "Not Defined";
-                                p2values.bit16hfname = hf_bit16lflags;
-                                foffset = foffset+p2values.vlength;
+                                pvalues[0].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[0].vtype = VTYPE_UINT32;
+                                pvalues[0].vdesc = "Version: %u";
+                                pvalues[0].vlength = 4;
+                                pvalues[0].voffset = foffset;
+                                pvalues[0].hfname= hf_nds_ver;
+                                foffset = foffset+pvalues[0].vlength;
+                                pvalues[1].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[1].vtype = VTYPE_BITFIELD;
+                                pvalues[1].vdesc = "Request Flags:";
+                                pvalues[1].vlength = 2;
+                                pvalues[1].hfname= hf_nds_rflags;
+                                pvalues[1].voffset = foffset;
+                                pvalues[1].bit1 = "List Typeless";
+                                pvalues[1].bit1hfname = hf_bit1lflags;
+                                pvalues[1].bit2 = "List Containers";
+                                pvalues[1].bit2hfname = hf_bit2lflags;
+                                pvalues[1].bit3 = "List Slashed";
+                                pvalues[1].bit3hfname = hf_bit3lflags;
+                                pvalues[1].bit4 = "List Dotted";
+                                pvalues[1].bit4hfname = hf_bit4lflags;
+                                pvalues[1].bit5 = "Dereference Alias";
+                                pvalues[1].bit5hfname = hf_bit5lflags;
+                                pvalues[1].bit6 = "List All Containers";
+                                pvalues[1].bit6hfname = hf_bit6lflags;
+                                pvalues[1].bit7 = "List Obsolete";
+                                pvalues[1].bit7hfname = hf_bit7lflags;
+                                pvalues[1].bit8 = "List Tuned Output";
+                                pvalues[1].bit8hfname = hf_bit8lflags;
+                                pvalues[1].bit9 = "List External Reference";
+                                pvalues[1].bit9hfname = hf_bit9lflags;
+                                pvalues[1].bit10 = "Not Defined";
+                                pvalues[1].bit10hfname = hf_bit10lflags;
+                                pvalues[1].bit11 = "Not Defined";
+                                pvalues[1].bit11hfname = hf_bit11lflags;
+                                pvalues[1].bit12 = "Not Defined";
+                                pvalues[1].bit12hfname = hf_bit12lflags;
+                                pvalues[1].bit13 = "Not Defined";
+                                pvalues[1].bit13hfname = hf_bit13lflags;
+                                pvalues[1].bit14 = "Not Defined";
+                                pvalues[1].bit14hfname = hf_bit14lflags;
+                                pvalues[1].bit15 = "Not Defined";
+                                pvalues[1].bit15hfname = hf_bit15lflags;
+                                pvalues[1].bit16 = "Not Defined";
+                                pvalues[1].bit16hfname = hf_bit16lflags;
+                                foffset = foffset+pvalues[1].vlength;
                                 foffset += 2;
-                                p3values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p3values.vstring = "";
-                                p3values.vtype = 3; /* Uint32 */
-                                p3values.vdesc = "Iteration Handle: 0x%08x";
-                                p3values.vlength = 4;
-                                p3values.voffset = foffset;
-                                p3values.hfname= hf_nds_iteration;
-                                foffset = foffset+p3values.vlength;
-                                p4values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p4values.vstring = "";
-                                p4values.vtype = 3; /* Uint32 */
-                                p4values.vdesc = "Parent ID: 0x%08x";
-                                p4values.vlength = 4;
-                                p4values.voffset = foffset;
-                                p4values.hfname= hf_nds_parent;
-                                foffset = foffset+p4values.vlength;
-                                p5values.vvalue = tvb_get_letohs(tvb, foffset);
+                                pvalues[2].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[2].vtype = VTYPE_UINT32;
+                                pvalues[2].vdesc = "Iteration Handle: 0x%08x";
+                                pvalues[2].vlength = 4;
+                                pvalues[2].voffset = foffset;
+                                pvalues[2].hfname= hf_nds_iteration;
+                                foffset = foffset+pvalues[2].vlength;
+                                pvalues[3].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[3].vtype = VTYPE_UINT32;
+                                pvalues[3].vdesc = "Parent ID: 0x%08x";
+                                pvalues[3].vlength = 4;
+                                pvalues[3].voffset = foffset;
+                                pvalues[3].hfname= hf_nds_parent;
+                                foffset = foffset+pvalues[3].vlength;
+                                pvalues[4].vvalue = tvb_get_letohs(tvb, foffset);
                                 global_flags = tvb_get_letohl(tvb, foffset);
-                                p5values.vtype = 5; /* Bitfield */
-                                p5values.vstring = "";
-                                p5values.vdesc = "Information Flags (low) Byte:";
-                                p5values.vlength = 2;
-                                p5values.hfname= hf_nds_rflags;
-                                p5values.voffset = foffset;
-                                p5values.bit1 = "Output Flags";
-                                p5values.bit1hfname = hf_bit1infoflagsl;
-                                p5values.bit2 = "Entry ID";
-                                p5values.bit2hfname = hf_bit2infoflagsl;
-                                p5values.bit3 = "Entry Flags";
-                                p5values.bit3hfname = hf_bit3infoflagsl;
-                                p5values.bit4 = "Subordinate Count";
-                                p5values.bit4hfname = hf_bit4infoflagsl;
-                                p5values.bit5 = "Modification Time";
-                                p5values.bit5hfname = hf_bit5infoflagsl;
-                                p5values.bit6 = "Modification Timestamp";
-                                p5values.bit6hfname = hf_bit6infoflagsl;
-                                p5values.bit7 = "Creation Timestamp";
-                                p5values.bit7hfname = hf_bit7infoflagsl;
-                                p5values.bit8 = "Partition Root ID";
-                                p5values.bit8hfname = hf_bit8infoflagsl;
-                                p5values.bit9 = "Parent ID";
-                                p5values.bit9hfname = hf_bit9infoflagsl;
-                                p5values.bit10 = "Revision Count";
-                                p5values.bit10hfname = hf_bit10infoflagsl;
-                                p5values.bit11 = "Replica Type";
-                                p5values.bit11hfname = hf_bit11infoflagsl;
-                                p5values.bit12 = "Base Class";
-                                p5values.bit12hfname = hf_bit12infoflagsl;
-                                p5values.bit13 = "Relative Distinguished Name";
-                                p5values.bit13hfname = hf_bit13infoflagsl;
-                                p5values.bit14 = "Distinguished Name";
-                                p5values.bit14hfname = hf_bit14infoflagsl;
-                                p5values.bit15 = "Root Distinguished Name";
-                                p5values.bit15hfname = hf_bit15infoflagsl;
-                                p5values.bit16 = "Parent Distinguished Name";
-                                p5values.bit16hfname = hf_bit16infoflagsl;
+                                pvalues[4].vtype = VTYPE_BITFIELD;
+                                pvalues[4].vdesc = "Information Flags (low) Byte:";
+                                pvalues[4].vlength = 2;
+                                pvalues[4].hfname= hf_nds_rflags;
+                                pvalues[4].voffset = foffset;
+                                pvalues[4].bit1 = "Output Flags";
+                                pvalues[4].bit1hfname = hf_bit1infoflagsl;
+                                pvalues[4].bit2 = "Entry ID";
+                                pvalues[4].bit2hfname = hf_bit2infoflagsl;
+                                pvalues[4].bit3 = "Entry Flags";
+                                pvalues[4].bit3hfname = hf_bit3infoflagsl;
+                                pvalues[4].bit4 = "Subordinate Count";
+                                pvalues[4].bit4hfname = hf_bit4infoflagsl;
+                                pvalues[4].bit5 = "Modification Time";
+                                pvalues[4].bit5hfname = hf_bit5infoflagsl;
+                                pvalues[4].bit6 = "Modification Timestamp";
+                                pvalues[4].bit6hfname = hf_bit6infoflagsl;
+                                pvalues[4].bit7 = "Creation Timestamp";
+                                pvalues[4].bit7hfname = hf_bit7infoflagsl;
+                                pvalues[4].bit8 = "Partition Root ID";
+                                pvalues[4].bit8hfname = hf_bit8infoflagsl;
+                                pvalues[4].bit9 = "Parent ID";
+                                pvalues[4].bit9hfname = hf_bit9infoflagsl;
+                                pvalues[4].bit10 = "Revision Count";
+                                pvalues[4].bit10hfname = hf_bit10infoflagsl;
+                                pvalues[4].bit11 = "Replica Type";
+                                pvalues[4].bit11hfname = hf_bit11infoflagsl;
+                                pvalues[4].bit12 = "Base Class";
+                                pvalues[4].bit12hfname = hf_bit12infoflagsl;
+                                pvalues[4].bit13 = "Relative Distinguished Name";
+                                pvalues[4].bit13hfname = hf_bit13infoflagsl;
+                                pvalues[4].bit14 = "Distinguished Name";
+                                pvalues[4].bit14hfname = hf_bit14infoflagsl;
+                                pvalues[4].bit15 = "Root Distinguished Name";
+                                pvalues[4].bit15hfname = hf_bit15infoflagsl;
+                                pvalues[4].bit16 = "Parent Distinguished Name";
+                                pvalues[4].bit16hfname = hf_bit16infoflagsl;
                                 foffset = foffset+2;
-                                p6values.vvalue = tvb_get_letohs(tvb, foffset);
-                                p6values.vtype = 5; /* Bitfield */
-                                p6values.vstring = "";
-                                p6values.vdesc = "Information Flags (high) Byte:";
-                                p6values.vlength = 2;
-                                p6values.hfname= hf_nds_rflags;
-                                p6values.voffset = foffset;
-                                p6values.bit1 = "Purge Time";
-                                p6values.bit1hfname = hf_bit1infoflagsh;
-                                p6values.bit2 = "Dereference Base Class";
-                                p6values.bit2hfname = hf_bit2infoflagsh;
-                                p6values.bit3 = "Not Defined";
-                                p6values.bit3hfname = hf_bit3infoflagsh;
-                                p6values.bit4 = "Not Defined";
-                                p6values.bit4hfname = hf_bit4infoflagsh;
-                                p6values.bit5 = "Not Defined";
-                                p6values.bit5hfname = hf_bit5infoflagsh;
-                                p6values.bit6 = "Not Defined";
-                                p6values.bit6hfname = hf_bit6infoflagsh;
-                                p6values.bit7 = "Not Defined";
-                                p6values.bit7hfname = hf_bit7infoflagsh;
-                                p6values.bit8 = "Not Defined";
-                                p6values.bit8hfname = hf_bit8infoflagsh;
-                                p6values.bit9 = "Not Defined";
-                                p6values.bit9hfname = hf_bit9infoflagsh;
-                                p6values.bit10 = "Not Defined";
-                                p6values.bit10hfname = hf_bit10infoflagsh;
-                                p6values.bit11 = "Not Defined";
-                                p6values.bit11hfname = hf_bit11infoflagsh;
-                                p6values.bit12 = "Not Defined";
-                                p6values.bit12hfname = hf_bit12infoflagsh;
-                                p6values.bit13 = "Not Defined";
-                                p6values.bit13hfname = hf_bit13infoflagsh;
-                                p6values.bit14 = "Not Defined";
-                                p6values.bit14hfname = hf_bit14infoflagsh;
-                                p6values.bit15 = "Not Defined";
-                                p6values.bit15hfname = hf_bit15infoflagsh;
-                                p6values.bit16 = "Not Defined";
-                                p6values.bit16hfname = hf_bit16infoflagsh;
+                                pvalues[5].vvalue = tvb_get_letohs(tvb, foffset);
+                                pvalues[5].vtype = VTYPE_BITFIELD;
+                                pvalues[5].vdesc = "Information Flags (high) Byte:";
+                                pvalues[5].vlength = 2;
+                                pvalues[5].hfname= hf_nds_rflags;
+                                pvalues[5].voffset = foffset;
+                                pvalues[5].bit1 = "Purge Time";
+                                pvalues[5].bit1hfname = hf_bit1infoflagsh;
+                                pvalues[5].bit2 = "Dereference Base Class";
+                                pvalues[5].bit2hfname = hf_bit2infoflagsh;
+                                pvalues[5].bit3 = "Not Defined";
+                                pvalues[5].bit3hfname = hf_bit3infoflagsh;
+                                pvalues[5].bit4 = "Not Defined";
+                                pvalues[5].bit4hfname = hf_bit4infoflagsh;
+                                pvalues[5].bit5 = "Not Defined";
+                                pvalues[5].bit5hfname = hf_bit5infoflagsh;
+                                pvalues[5].bit6 = "Not Defined";
+                                pvalues[5].bit6hfname = hf_bit6infoflagsh;
+                                pvalues[5].bit7 = "Not Defined";
+                                pvalues[5].bit7hfname = hf_bit7infoflagsh;
+                                pvalues[5].bit8 = "Not Defined";
+                                pvalues[5].bit8hfname = hf_bit8infoflagsh;
+                                pvalues[5].bit9 = "Not Defined";
+                                pvalues[5].bit9hfname = hf_bit9infoflagsh;
+                                pvalues[5].bit10 = "Not Defined";
+                                pvalues[5].bit10hfname = hf_bit10infoflagsh;
+                                pvalues[5].bit11 = "Not Defined";
+                                pvalues[5].bit11hfname = hf_bit11infoflagsh;
+                                pvalues[5].bit12 = "Not Defined";
+                                pvalues[5].bit12hfname = hf_bit12infoflagsh;
+                                pvalues[5].bit13 = "Not Defined";
+                                pvalues[5].bit13hfname = hf_bit13infoflagsh;
+                                pvalues[5].bit14 = "Not Defined";
+                                pvalues[5].bit14hfname = hf_bit14infoflagsh;
+                                pvalues[5].bit15 = "Not Defined";
+                                pvalues[5].bit15hfname = hf_bit15infoflagsh;
+                                pvalues[5].bit16 = "Not Defined";
+                                pvalues[5].bit16hfname = hf_bit16infoflagsh;
                                 foffset = foffset+2;
-                                p7values.vtype = 4; /* String */
-                                p7values.vdesc = "Name Filter: %s";
-                                p7values.vstring = "";
-                                p7values.mvtype = 1;
-                                p7values.vvalue = 0;
-                                p7values.vlength = 256;
-                                p7values.vlength = tvb_get_letohl(tvb, foffset);
-                                p7values.voffset = foffset+4;
+                                pvalues[6].vtype = VTYPE_STRING;
+                                pvalues[6].vdesc = "Name Filter: %s";
+                                pvalues[6].mvtype = MVTYPE_ATTR_REQUEST;
+                                pvalues[6].vvalue = 0;
+                                pvalues[6].vlength = 256;
+                                pvalues[6].vlength = tvb_get_letohl(tvb, foffset);
+                                pvalues[6].voffset = foffset+4;
                                 foffset = foffset + 4;
-                                get_string(tvb, p7values.voffset, p7values.vlength, p7values.vstring);
-                                p7values.hfname= hf_nds_name_filter;
-                                foffset = foffset+p7values.vlength;
-                                if(p1values.vvalue == 0)
+                                get_string(tvb, pvalues[6].voffset, pvalues[6].vlength, pvalues[6].vstring);
+                                pvalues[6].hfname= hf_nds_name_filter;
+                                foffset = foffset+pvalues[6].vlength;
+                                if(pvalues[0].vvalue == 0)
                                 {
                                         break;
                                 }        
                                 foffset += align_4(tvb, foffset);
-                                p8values.vtype = 4; /* String */
-                                p8values.vdesc = "Class Filter: %s";
-                                p8values.vstring = "";
-                                p8values.mvtype = 1;
-                                p8values.vvalue = 0;
-                                p8values.vlength = 256;
-                                p8values.vlength = tvb_get_letohl(tvb, foffset);
-                                p8values.voffset = foffset+4;
+                                pvalues[7].vtype = VTYPE_STRING;
+                                pvalues[7].vdesc = "Class Filter: %s";
+                                pvalues[7].mvtype = MVTYPE_ATTR_REQUEST;
+                                pvalues[7].vvalue = 0;
+                                pvalues[7].vlength = 256;
+                                pvalues[7].vlength = tvb_get_letohl(tvb, foffset);
+                                pvalues[7].voffset = foffset+4;
                                 foffset = foffset + 4;
-                                get_string(tvb, p8values.voffset, p8values.vlength, p8values.vstring);
-                                p8values.hfname= hf_nds_class_filter;
-                                foffset = foffset+p8values.vlength;
-                                if(p1values.vvalue == 1)
+                                get_string(tvb, pvalues[7].voffset, pvalues[7].vlength, pvalues[7].vstring);
+                                pvalues[7].hfname= hf_nds_class_filter;
+                                foffset = foffset+pvalues[7].vlength;
+                                if(pvalues[0].vvalue == 1)
                                 {
                                         break;
                                 }        
                                 foffset += align_4(tvb, foffset);
-                                p9values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p9values.vtype = 6; /* Multivalue Uint32 */
-                                p9values.vstring = "";
-                                p9values.vdesc = "Seconds %d";
-                                p9values.vlength = 4;
-                                p9values.mvtype = 11;
-                                p9values.hfname= hf_nds_time_filter;
-                                p9values.voffset = foffset;
+                                pvalues[8].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[8].vtype = VTYPE_MULTIVALUE_UINT32;
+                                pvalues[8].vdesc = "Seconds: %u";
+                                pvalues[8].vlength = 4;
+                                pvalues[8].mvtype = MVTYPE_PRINT_TIMESTAMP;
+                                pvalues[8].hfname= hf_nds_time_filter;
+                                pvalues[8].voffset = foffset;
                                 break;
                         case 0x06:    
-                                verb_string = "Search Entries";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[0].vstring = "";
+                                pvalues[0].vtype = VTYPE_UINT32;
+                                pvalues[0].vdesc = "Version: %u";
+                                pvalues[0].vlength = 4;
+                                pvalues[0].voffset = foffset;
+                                pvalues[0].hfname= hf_nds_ver;
+                                foffset = foffset+pvalues[0].vlength;
+                                pvalues[1].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[1].vtype = VTYPE_UINT32;
+                                pvalues[1].vstring = "";
+                                pvalues[1].vdesc = "Request Flags: 0x%08x"; 
+                                pvalues[1].vlength = 4;
+                                pvalues[1].hfname= hf_nds_rflags;
+                                pvalues[1].voffset = foffset;
+                                foffset = foffset+4;
+                                pvalues[2].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[2].vtype = VTYPE_UINT32;
+                                pvalues[2].vdesc = "Iteration Handle: 0x%08x";
+                                pvalues[2].vlength = 4;
+                                pvalues[2].voffset = foffset;
+                                pvalues[2].hfname= hf_nds_iteration;
+                                foffset = foffset+pvalues[2].vlength;
+                                pvalues[3].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[3].vstring = "";
+                                pvalues[3].vtype = VTYPE_UINT32;
+                                pvalues[3].vdesc = "Base Entry ID: 0x%08x";
+                                pvalues[3].vlength = 4;
+                                resolve_eid = FALSE;
+                                global_eid = pvalues[3].vvalue;
+                                pvalues[3].voffset = foffset;
+                                pvalues[3].hfname= hf_nds_eid;
+                                foffset = foffset+pvalues[3].vlength;
+                                pvalues[4].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[4].vstring = match_strval(pvalues[4].vvalue, nds_search_scope);
+                                if(pvalues[4].vstring == NULL)
+                                {
+                                        pvalues[4].vstring = "No Search Scope Defined";
+                                }
+                                pvalues[4].vtype = VTYPE_STRING;
+                                pvalues[4].vdesc = "Replica Type: %s";
+                                pvalues[4].vlength = 4;
+                                pvalues[4].voffset = foffset;
+                                pvalues[4].mvtype = 0;
+                                pvalues[4].hfname= hf_nds_search_scope;
+                                foffset = foffset + pvalues[4].vlength;
+                                pvalues[5].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[5].vtype = VTYPE_UINT32;
+                                pvalues[5].vdesc = "Number of Objects to Search: 0x%08x";
+                                pvalues[5].vlength = 4;
+                                pvalues[5].voffset = foffset;
+                                pvalues[5].hfname= hf_nds_num_objects;
+                                foffset = foffset+pvalues[5].vlength;
+                                pvalues[6].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[6].vtype = VTYPE_BITFIELD;
+                                pvalues[6].vdesc = "Information Types:";
+                                pvalues[6].vlength = 2;
+                                pvalues[6].hfname= hf_nds_nflags;
+                                pvalues[6].voffset = foffset;
+                                pvalues[6].bit1 = "Names";
+                                pvalues[6].bit1hfname = hf_bit1siflags;
+                                pvalues[6].bit2 = "Names and Values";
+                                pvalues[6].bit2hfname = hf_bit2siflags;
+                                pvalues[6].bit3 = "Effective Privileges";
+                                pvalues[6].bit3hfname = hf_bit3siflags;
+                                pvalues[6].bit4 = "Value Info";
+                                pvalues[6].bit4hfname = hf_bit4siflags;
+                                pvalues[6].bit5 = "Abbreviated Value";
+                                pvalues[6].bit5hfname = hf_bit5siflags;
+                                pvalues[6].bit6 = "Not Defined";
+                                pvalues[6].bit6hfname = hf_bit6siflags;
+                                pvalues[6].bit7 = "Not Defined";
+                                pvalues[6].bit7hfname = hf_bit7siflags;
+                                pvalues[6].bit8 = "Not Defined";
+                                pvalues[6].bit8hfname = hf_bit8siflags;
+                                pvalues[6].bit9 = "Expanded Class";
+                                pvalues[6].bit9hfname = hf_bit9siflags;
+                                pvalues[6].bit10 = "Not Defined";
+                                pvalues[6].bit10hfname = hf_bit10siflags;
+                                pvalues[6].bit11= "Not Defined";
+                                pvalues[6].bit11hfname = hf_bit11siflags;
+                                pvalues[6].bit12 = "Not Defined";
+                                pvalues[6].bit12hfname = hf_bit12siflags;
+                                pvalues[6].bit13 = "Not Defined";
+                                pvalues[6].bit13hfname = hf_bit13siflags;
+                                pvalues[6].bit14 = "Not Defined";
+                                pvalues[6].bit14hfname = hf_bit14siflags;
+                                pvalues[6].bit15 = "Not Defined";
+                                pvalues[6].bit15hfname = hf_bit15siflags;
+                                pvalues[6].bit16 = "Not Defined";
+                                pvalues[6].bit16hfname = hf_bit16siflags;
+                                foffset = foffset+4;
+                                if(pvalues[0].vvalue != 2)
+                                {
+                                        pvalues[7].vvalue = tvb_get_letohs(tvb, foffset);
+                                        global_flags = tvb_get_letohl(tvb, foffset);
+                                        pvalues[7].vtype = VTYPE_BITFIELD;
+                                        pvalues[7].vdesc = "Information Flags (low) Byte:";
+                                        pvalues[7].vlength = 2;
+                                        pvalues[7].hfname= hf_nds_rflags;
+                                        pvalues[7].voffset = foffset;
+                                        pvalues[7].bit1 = "Output Flags";
+                                        pvalues[7].bit1hfname = hf_bit1infoflagsl;
+                                        pvalues[7].bit2 = "Entry ID";
+                                        pvalues[7].bit2hfname = hf_bit2infoflagsl;
+                                        pvalues[7].bit3 = "Entry Flags";
+                                        pvalues[7].bit3hfname = hf_bit3infoflagsl;
+                                        pvalues[7].bit4 = "Subordinate Count";
+                                        pvalues[7].bit4hfname = hf_bit4infoflagsl;
+                                        pvalues[7].bit5 = "Modification Time";
+                                        pvalues[7].bit5hfname = hf_bit5infoflagsl;
+                                        pvalues[7].bit6 = "Modification Timestamp";
+                                        pvalues[7].bit6hfname = hf_bit6infoflagsl;
+                                        pvalues[7].bit7 = "Creation Timestamp";
+                                        pvalues[7].bit7hfname = hf_bit7infoflagsl;
+                                        pvalues[7].bit8 = "Partition Root ID";
+                                        pvalues[7].bit8hfname = hf_bit8infoflagsl;
+                                        pvalues[7].bit9 = "Parent ID";
+                                        pvalues[7].bit9hfname = hf_bit9infoflagsl;
+                                        pvalues[7].bit10 = "Revision Count";
+                                        pvalues[7].bit10hfname = hf_bit10infoflagsl;
+                                        pvalues[7].bit11 = "Replica Type";
+                                        pvalues[7].bit11hfname = hf_bit11infoflagsl;
+                                        pvalues[7].bit12 = "Base Class";
+                                        pvalues[7].bit12hfname = hf_bit12infoflagsl;
+                                        pvalues[7].bit13 = "Relative Distinguished Name";
+                                        pvalues[7].bit13hfname = hf_bit13infoflagsl;
+                                        pvalues[7].bit14 = "Distinguished Name";
+                                        pvalues[7].bit14hfname = hf_bit14infoflagsl;
+                                        pvalues[7].bit15 = "Root Distinguished Name";
+                                        pvalues[7].bit15hfname = hf_bit15infoflagsl;
+                                        pvalues[7].bit16 = "Parent Distinguished Name";
+                                        pvalues[7].bit16hfname = hf_bit16infoflagsl;
+                                        foffset = foffset+2;
+                                        pvalues[8].vvalue = tvb_get_letohs(tvb, foffset);
+                                        pvalues[8].vtype = VTYPE_BITFIELD;
+                                        pvalues[8].vdesc = "Information Flags (high) Byte:";
+                                        pvalues[8].vlength = 2;
+                                        pvalues[8].hfname= hf_nds_rflags;
+                                        pvalues[8].voffset = foffset;
+                                        pvalues[8].bit1 = "Purge Time";
+                                        pvalues[8].bit1hfname = hf_bit1infoflagsh;
+                                        pvalues[8].bit2 = "Dereference Base Class";
+                                        pvalues[8].bit2hfname = hf_bit2infoflagsh;
+                                        pvalues[8].bit3 = "Not Defined";
+                                        pvalues[8].bit3hfname = hf_bit3infoflagsh;
+                                        pvalues[8].bit4 = "Not Defined";
+                                        pvalues[8].bit4hfname = hf_bit4infoflagsh;
+                                        pvalues[8].bit5 = "Not Defined";
+                                        pvalues[8].bit5hfname = hf_bit5infoflagsh;
+                                        pvalues[8].bit6 = "Not Defined";
+                                        pvalues[8].bit6hfname = hf_bit6infoflagsh;
+                                        pvalues[8].bit7 = "Not Defined";
+                                        pvalues[8].bit7hfname = hf_bit7infoflagsh;
+                                        pvalues[8].bit8 = "Not Defined";
+                                        pvalues[8].bit8hfname = hf_bit8infoflagsh;
+                                        pvalues[8].bit9 = "Not Defined";
+                                        pvalues[8].bit9hfname = hf_bit9infoflagsh;
+                                        pvalues[8].bit10 = "Not Defined";
+                                        pvalues[8].bit10hfname = hf_bit10infoflagsh;
+                                        pvalues[8].bit11 = "Not Defined";
+                                        pvalues[8].bit11hfname = hf_bit11infoflagsh;
+                                        pvalues[8].bit12 = "Not Defined";
+                                        pvalues[8].bit12hfname = hf_bit12infoflagsh;
+                                        pvalues[8].bit13 = "Not Defined";
+                                        pvalues[8].bit13hfname = hf_bit13infoflagsh;
+                                        pvalues[8].bit14 = "Not Defined";
+                                        pvalues[8].bit14hfname = hf_bit14infoflagsh;
+                                        pvalues[8].bit15 = "Not Defined";
+                                        pvalues[8].bit15hfname = hf_bit15infoflagsh;
+                                        pvalues[8].bit16 = "Not Defined";
+                                        pvalues[8].bit16hfname = hf_bit16infoflagsh;
+                                        foffset = foffset+2;
+                                }
                                 break;
                         case 0x07:    
-                                verb_string = "Add Entry";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[0].vstring = "";
+                                pvalues[0].vtype = VTYPE_UINT32;
+                                pvalues[0].vdesc = "Version: %u";
+                                pvalues[0].vlength = 4;
+                                pvalues[0].voffset = foffset;
+                                pvalues[0].hfname= hf_nds_ver;
+                                foffset = foffset+pvalues[0].vlength;
+                                pvalues[1].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[1].vtype = VTYPE_UINT32;
+                                pvalues[1].vstring = "";
+                                pvalues[1].vdesc = "Request Flags: 0x%08x"; 
+                                pvalues[1].vlength = 4;
+                                pvalues[1].hfname= hf_nds_rflags;
+                                pvalues[1].voffset = foffset;
+                                foffset = foffset+4;
+                                if(pvalues[0].vvalue == 0)
+                                {
+                                        pvalues[2].vvalue = tvb_get_letohl(tvb, foffset);
+                                        pvalues[2].vstring = "";
+                                        pvalues[2].vtype = VTYPE_UINT32;
+                                        pvalues[2].vdesc = "Parent Entry ID: 0x%08x";
+                                        pvalues[2].vlength = 4;
+                                        resolve_eid = FALSE;
+                                        global_eid = pvalues[2].vvalue;
+                                        pvalues[2].voffset = foffset;
+                                        pvalues[2].hfname= hf_nds_eid;
+                                        foffset = foffset+pvalues[2].vlength;
+                                        pvalues[3].vtype = VTYPE_STRING;
+                                        pvalues[3].vdesc = "Relative Distinguished Name: %s";
+                                        pvalues[3].vstring = "";
+                                        pvalues[3].mvtype = MVTYPE_ATTR_REQUEST;
+                                        pvalues[3].vvalue = 0;
+                                        pvalues[3].vlength = 256;
+                                        pvalues[3].vlength = tvb_get_letohl(tvb, foffset);
+                                        if (pvalues[3].vlength == 0x00)
+                                        {
+                                                pvalues[3].vtype = VTYPE_NONE;
+                                                break;
+                                        }
+                                        pvalues[3].voffset = foffset+4;
+                                        foffset = foffset + 4;
+                                        get_string(tvb, pvalues[3].voffset, pvalues[3].vlength, req_buffer.buffer);
+                                        pvalues[3].vstring = req_buffer.buffer;
+                                        strcpy(global_object_name, req_buffer.buffer);
+                                        pvalues[3].hfname= hf_nds_relative_dn;
+                                        foffset = foffset+pvalues[3].vlength;
+                                        foffset += align_4(tvb, foffset);
+                                        pvalues[4].vvalue = tvb_get_letohl(tvb, foffset);
+                                        pvalues[4].vtype = VTYPE_MULTIVALUE_UINT32;
+                                        pvalues[4].vstring = "";
+                                        pvalues[4].vdesc = "Attributes: %u";
+                                        pvalues[4].vlength = 4;
+                                        pvalues[4].voffset = foffset;
+                                        pvalues[4].mvtype = MVTYPE_ADD_ATTR_REQUEST;
+                                        pvalues[4].hfname= hf_nds_attr;
+                                }
+                                else
+                                {
+                                        pvalues[2].vvalue = tvb_get_letohl(tvb, foffset);
+                                        pvalues[2].vstring = "";
+                                        pvalues[2].vtype = VTYPE_UINT32;
+                                        pvalues[2].vdesc = "Iteration Handle: 0x%08x";
+                                        pvalues[2].vlength = 4;
+                                        pvalues[2].voffset = foffset;
+                                        pvalues[2].hfname= hf_nds_iteration;
+                                        foffset = foffset+pvalues[2].vlength;
+                                        pvalues[3].vvalue = tvb_get_letohl(tvb, foffset);
+                                        pvalues[3].vstring = "";
+                                        pvalues[3].vtype = VTYPE_UINT32;
+                                        pvalues[3].vdesc = "Parent Entry ID: 0x%08x";
+                                        pvalues[3].vlength = 4;
+                                        resolve_eid = FALSE;
+                                        global_eid = pvalues[3].vvalue;
+                                        pvalues[3].voffset = foffset;
+                                        pvalues[3].hfname= hf_nds_eid;
+                                        foffset = foffset+pvalues[3].vlength;
+                                        pvalues[4].vtype = VTYPE_STRING;
+                                        pvalues[4].vdesc = "Relative Distinguished Name: %s";
+                                        pvalues[4].vstring = "";
+                                        pvalues[4].mvtype = MVTYPE_ATTR_REQUEST;
+                                        pvalues[4].vvalue = 0;
+                                        pvalues[4].vlength = 256;
+                                        pvalues[4].vlength = tvb_get_letohl(tvb, foffset);
+                                        if (pvalues[4].vlength == 0x00)
+                                        {
+                                                pvalues[4].vtype = VTYPE_NONE;
+                                                break;
+                                        }
+                                        pvalues[4].voffset = foffset+4;
+                                        foffset = foffset + 4;
+                                        get_string(tvb, pvalues[4].voffset, pvalues[4].vlength, req_buffer.buffer);
+                                        pvalues[4].vstring = req_buffer.buffer;
+                                        strcpy(global_object_name, req_buffer.buffer);
+                                        pvalues[4].hfname= hf_nds_relative_dn;
+                                        foffset = foffset+pvalues[4].vlength;
+                                        foffset += align_4(tvb, foffset);
+                                        pvalues[5].vvalue = tvb_get_letohl(tvb, foffset);
+                                        pvalues[5].vtype = VTYPE_MULTIVALUE_UINT32;
+                                        pvalues[5].vstring = "";
+                                        pvalues[5].vdesc = "Attributes: %u";
+                                        pvalues[5].vlength = 4;
+                                        pvalues[5].voffset = foffset;
+                                        pvalues[5].mvtype = MVTYPE_ADD_ATTR_REQUEST;
+                                        pvalues[5].hfname= hf_nds_attr;
+                                }
                                 break;
                         case 0x08:    
-                                verb_string = "Remove Entry";
-                                p1values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p1values.vstring = "";
-                                p1values.vtype = 3; /* Uint32 */
-                                p1values.vdesc = "Version: %d";
-                                p1values.vlength = 4;
-                                p1values.voffset = foffset;
-                                p1values.hfname= hf_nds_ver;
-                                foffset = foffset+p1values.vlength;
-                                p2values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p2values.vstring = "";
-                                p2values.vtype = 3; /* Uint32 */
-                                p2values.vdesc = "Entry ID: 0x%08x";
-                                p2values.vlength = 4;
+                                pvalues[0].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[0].vtype = VTYPE_UINT32;
+                                pvalues[0].vdesc = "Version: %u";
+                                pvalues[0].vlength = 4;
+                                pvalues[0].voffset = foffset;
+                                pvalues[0].hfname= hf_nds_ver;
+                                foffset = foffset+pvalues[0].vlength;
+                                pvalues[1].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[1].vtype = VTYPE_UINT32;
+                                pvalues[1].vdesc = "Entry ID: 0x%08x";
+                                pvalues[1].vlength = 4;
                                 resolve_eid = TRUE;
-                                global_eid = p2values.vvalue;
-                                p2values.voffset = foffset;
-                                p2values.hfname= hf_nds_eid;
-                                foffset = foffset+p2values.vlength;
+                                global_eid = pvalues[1].vvalue;
+                                pvalues[1].voffset = foffset;
+                                pvalues[1].hfname= hf_nds_eid;
+                                foffset = foffset+pvalues[1].vlength;
                                 break;
                         case 0x09:    
-                                verb_string = "Modify Entry";
-                                p1values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p1values.vstring = "";
-                                p1values.vtype = 3; /* Uint32 */
-                                p1values.vdesc = "Version: %d";
-                                p1values.vlength = 4;
-                                p1values.voffset = foffset;
-                                p1values.hfname= hf_nds_ver;
-                                foffset = foffset+p1values.vlength;
-                                p2values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p2values.vtype = 3; /* Uint32 */
-                                p2values.vstring = "";
-                                p2values.vdesc = "Request Flags: 0x%08x";  /* always 0 */
-                                p2values.vlength = 4;
-                                p2values.hfname= hf_nds_rflags;
-                                p2values.voffset = foffset;
-                                foffset = foffset+4;
-                                p3values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p3values.vtype = 3; /* Uint32 */
-                                p3values.vstring = "";
-                                p3values.vdesc = "Iteration Handle: 0x%08x";  /* always 0 */
-                                p3values.vlength = 4;
-                                p3values.hfname= hf_nds_iteration;
-                                p3values.voffset = foffset;
-                                foffset = foffset+4;
-                                p4values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p4values.vstring = "";
-                                p4values.vtype = 3; /* Uint32 */
-                                p4values.vdesc = "Entry ID: 0x%08x";
-                                p4values.vlength = 4;
-                                p4values.voffset = foffset;
-                                resolve_eid = TRUE;
-                                global_eid = p4values.vvalue;
-                                p4values.hfname = hf_nds_eid;
-                                foffset = foffset+p4values.vlength;
-                                p5values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p5values.vtype = 6; /* Multivalue Uint32 */
-                                p5values.vstring = "";
-                                p5values.vdesc = "Number of Attributes to Change %d";
-                                p5values.vlength = 4;
-                                p5values.mvtype = 6;
-                                p5values.hfname= hf_nds_number_of_changes;
-                                p5values.voffset = foffset;
+                                pvalues[0].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[0].vtype = VTYPE_UINT32;
+                                pvalues[0].vdesc = "Version: %u";
+                                pvalues[0].vlength = 4;
+                                pvalues[0].voffset = foffset;
+                                pvalues[0].hfname= hf_nds_ver;
+                                foffset = foffset+pvalues[0].vlength;
+                                if(pvalues[0].vvalue == 0)
+                                {
+                                        pvalues[1].vvalue = tvb_get_letohl(tvb, foffset);
+                                        pvalues[1].vtype = VTYPE_UINT32;
+                                        pvalues[1].vstring = "";
+                                        pvalues[1].vdesc = "Iteration Handle: 0x%08x";  /* always 0 */
+                                        pvalues[1].vlength = 4;
+                                        pvalues[1].hfname= hf_nds_iteration;
+                                        pvalues[1].voffset = foffset;
+                                        foffset = foffset+4;
+                                        pvalues[2].vvalue = tvb_get_letohl(tvb, foffset);
+                                        pvalues[2].vstring = "";
+                                        pvalues[2].vtype = VTYPE_UINT32;
+                                        pvalues[2].vdesc = "Entry ID: 0x%08x";
+                                        pvalues[2].vlength = 4;
+                                        pvalues[2].voffset = foffset;
+                                        resolve_eid = TRUE;
+                                        global_eid = pvalues[2].vvalue;
+                                        pvalues[2].hfname = hf_nds_eid;
+                                        foffset = foffset+pvalues[2].vlength;
+                                        pvalues[3].vvalue = tvb_get_letohl(tvb, foffset);
+                                        pvalues[3].vtype = VTYPE_MULTIVALUE_UINT32;
+                                        pvalues[3].vstring = "";
+                                        pvalues[3].vdesc = "Number of Attributes to Change %u";
+                                        pvalues[3].vlength = 4;
+                                        pvalues[3].mvtype = MVTYPE_MODIFY_ATTR_REQUEST;
+                                        pvalues[3].hfname= hf_nds_number_of_changes;
+                                        pvalues[3].voffset = foffset;
+                                }
+                                else
+                                {
+                                        pvalues[1].vvalue = tvb_get_letohl(tvb, foffset);
+                                        pvalues[1].vtype = VTYPE_UINT32;
+                                        pvalues[1].vstring = "";
+                                        pvalues[1].vdesc = "Request Flags: 0x%08x";  /* always 0 */
+                                        pvalues[1].vlength = 4;
+                                        pvalues[1].hfname= hf_nds_rflags;
+                                        pvalues[1].voffset = foffset;
+                                        foffset = foffset+4;
+                                        pvalues[2].vvalue = tvb_get_letohl(tvb, foffset);
+                                        pvalues[2].vtype = VTYPE_UINT32;
+                                        pvalues[2].vstring = "";
+                                        pvalues[2].vdesc = "Iteration Handle: 0x%08x";  /* always 0 */
+                                        pvalues[2].vlength = 4;
+                                        pvalues[2].hfname= hf_nds_iteration;
+                                        pvalues[2].voffset = foffset;
+                                        foffset = foffset+4;
+                                        pvalues[3].vvalue = tvb_get_letohl(tvb, foffset);
+                                        pvalues[3].vstring = "";
+                                        pvalues[3].vtype = VTYPE_UINT32;
+                                        pvalues[3].vdesc = "Entry ID: 0x%08x";
+                                        pvalues[3].vlength = 4;
+                                        pvalues[3].voffset = foffset;
+                                        resolve_eid = TRUE;
+                                        global_eid = pvalues[3].vvalue;
+                                        pvalues[3].hfname = hf_nds_eid;
+                                        foffset = foffset+pvalues[3].vlength;
+                                        pvalues[4].vvalue = tvb_get_letohl(tvb, foffset);
+                                        pvalues[4].vtype = VTYPE_MULTIVALUE_UINT32;
+                                        pvalues[4].vstring = "";
+                                        pvalues[4].vdesc = "Number of Attributes to Change %u";
+                                        pvalues[4].vlength = 4;
+                                        pvalues[4].mvtype = MVTYPE_MODIFY_ATTR_REQUEST;
+                                        pvalues[4].hfname= hf_nds_number_of_changes;
+                                        pvalues[4].voffset = foffset;
+                                }
                                 break;
                         case 0x0a:    
-                                verb_string = "Modify RDN";
-                                p1values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p1values.vstring = "";
-                                p1values.vtype = 3; /* Uint32 */
-                                p1values.vdesc = "Version: %d";
-                                p1values.vlength = 4;
-                                p1values.voffset = foffset;
-                                p1values.hfname= hf_nds_ver;
-                                foffset = foffset+p1values.vlength;
-                                p2values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p2values.vstring = "";
-                                p2values.vtype = 3; /* Uint32 */
-                                p2values.vdesc = "Entry ID: 0x%08x";
-                                p2values.vlength = 4;
+                                pvalues[0].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[0].vtype = VTYPE_UINT32;
+                                pvalues[0].vdesc = "Version: %u";
+                                pvalues[0].vlength = 4;
+                                pvalues[0].voffset = foffset;
+                                pvalues[0].hfname= hf_nds_ver;
+                                foffset = foffset+pvalues[0].vlength;
+                                pvalues[1].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[1].vtype = VTYPE_UINT32;
+                                pvalues[1].vdesc = "Entry ID: 0x%08x";
+                                pvalues[1].vlength = 4;
                                 resolve_eid = TRUE;
-                                global_eid = p2values.vvalue;
-                                p2values.voffset = foffset;
-                                p2values.hfname = hf_nds_eid;
-                                foffset = foffset+p2values.vlength;
-                                p3values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p3values.vtype = 8; /* Boolean */
-                                p3values.vdesc = "Keep Original RDN: %s";
-                                p3values.vlength = 4;
-                                p3values.voffset = foffset;
-                                p3values.mvtype = 0;
-                                p3values.hfname= hf_nds_keep;
+                                global_eid = pvalues[1].vvalue;
+                                pvalues[1].voffset = foffset;
+                                pvalues[1].hfname = hf_nds_eid;
+                                foffset = foffset+pvalues[1].vlength;
+                                pvalues[2].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[2].vtype = VTYPE_BOOLEAN;
+                                pvalues[2].vdesc = "Keep Original RDN: %s";
+                                pvalues[2].vlength = 4;
+                                pvalues[2].voffset = foffset;
+                                pvalues[2].mvtype = 0;
+                                pvalues[2].hfname= hf_nds_keep;
                                 foffset = foffset+4;
                                 foffset += align_4(tvb, foffset);
-                                p4values.vtype = 4; /* String */
-                                p4values.vdesc = "New RDN: %s";
-                                p4values.vstring = "";
-                                p4values.mvtype = 0;
-                                p4values.vvalue = 0;
-                                p4values.vlength = 256;
-                                p4values.vlength = tvb_get_letohl(tvb, foffset);
-                                p4values.voffset = foffset+4;
+                                pvalues[3].vtype = VTYPE_STRING;
+                                pvalues[3].vdesc = "New RDN: %s";
+                                pvalues[3].mvtype = 0;
+                                pvalues[3].vvalue = 0;
+                                pvalues[3].vlength = 256;
+                                pvalues[3].vlength = tvb_get_letohl(tvb, foffset);
+                                pvalues[3].voffset = foffset+4;
                                 foffset = foffset + 4;
-                                get_string(tvb, p4values.voffset, p4values.vlength, p4values.vstring);
-                                p4values.hfname= hf_nds_new_rdn;
-                                foffset = foffset+p4values.vlength;
+                                get_string(tvb, pvalues[3].voffset, pvalues[3].vlength, pvalues[3].vstring);
+                                pvalues[3].hfname= hf_nds_new_rdn;
+                                foffset = foffset+pvalues[3].vlength;
                                 break;
                         case 0x0b:    
-                                verb_string = "Define Attribute ->";
-                                p1values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p1values.vstring = "";
-                                p1values.vtype = 3; /* Uint32 */
-                                p1values.vdesc = "Version: %d";
-                                p1values.vlength = 4;
-                                p1values.voffset = foffset;
-                                p1values.hfname= hf_nds_ver;
-                                foffset = foffset+p1values.vlength;
-                                p2values.vvalue = tvb_get_letohs(tvb, foffset);
+                                pvalues[0].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[0].vtype = VTYPE_UINT32;
+                                pvalues[0].vdesc = "Version: %u";
+                                pvalues[0].vlength = 4;
+                                pvalues[0].voffset = foffset;
+                                pvalues[0].hfname= hf_nds_ver;
+                                foffset = foffset+pvalues[0].vlength;
+                                pvalues[1].vvalue = tvb_get_letohs(tvb, foffset);
                                 global_flags = tvb_get_letohl(tvb, foffset);
-                                p2values.vtype = 5; /* Bitfield */
-                                p2values.vstring = "";
-                                p2values.vdesc = "Attribute Constraints:";
-                                p2values.vlength = 2;
-                                p2values.hfname= hf_nds_acflags;
-                                p2values.voffset = foffset;
-                                p2values.bit1 = "Single Valued";
-                                p2values.bit1hfname = hf_bit1acflags;
-                                p2values.bit2 = "Sized";
-                                p2values.bit2hfname = hf_bit2acflags;
-                                p2values.bit3 = "Non-Removable";
-                                p2values.bit3hfname = hf_bit3acflags;
-                                p2values.bit4 = "Read Only";
-                                p2values.bit4hfname = hf_bit4acflags;
-                                p2values.bit5 = "Hidden";
-                                p2values.bit5hfname = hf_bit5acflags;
-                                p2values.bit6 = "String";
-                                p2values.bit6hfname = hf_bit6acflags;
-                                p2values.bit7 = "Synchronize Immediate";
-                                p2values.bit7hfname = hf_bit7acflags;
-                                p2values.bit8 = "Public Read";
-                                p2values.bit8hfname = hf_bit8acflags;
-                                p2values.bit9 = "Server Read";
-                                p2values.bit9hfname = hf_bit9acflags;
-                                p2values.bit10 = "Write Managed";
-                                p2values.bit10hfname = hf_bit10acflags;
-                                p2values.bit11 = "Per Replica";
-                                p2values.bit11hfname = hf_bit11acflags;
-                                p2values.bit12 = "Never Schedule Synchronization";
-                                p2values.bit12hfname = hf_bit12acflags;
-                                p2values.bit13 = "Operational";
-                                p2values.bit13hfname = hf_bit13acflags;
-                                p2values.bit14 = "Not Defined";
-                                p2values.bit14hfname = hf_bit14acflags;
-                                p2values.bit15 = "Not Defined";
-                                p2values.bit15hfname = hf_bit15acflags;
-                                p2values.bit16 = "Not Defined";
-                                p2values.bit16hfname = hf_bit16acflags;
+                                pvalues[1].vtype = VTYPE_BITFIELD;
+                                pvalues[1].vdesc = "Attribute Constraints:";
+                                pvalues[1].vlength = 2;
+                                pvalues[1].hfname= hf_nds_acflags;
+                                pvalues[1].voffset = foffset;
+                                pvalues[1].bit1 = "Single Valued";
+                                pvalues[1].bit1hfname = hf_bit1acflags;
+                                pvalues[1].bit2 = "Sized";
+                                pvalues[1].bit2hfname = hf_bit2acflags;
+                                pvalues[1].bit3 = "Non-Removable";
+                                pvalues[1].bit3hfname = hf_bit3acflags;
+                                pvalues[1].bit4 = "Read Only";
+                                pvalues[1].bit4hfname = hf_bit4acflags;
+                                pvalues[1].bit5 = "Hidden";
+                                pvalues[1].bit5hfname = hf_bit5acflags;
+                                pvalues[1].bit6 = "String";
+                                pvalues[1].bit6hfname = hf_bit6acflags;
+                                pvalues[1].bit7 = "Synchronize Immediate";
+                                pvalues[1].bit7hfname = hf_bit7acflags;
+                                pvalues[1].bit8 = "Public Read";
+                                pvalues[1].bit8hfname = hf_bit8acflags;
+                                pvalues[1].bit9 = "Server Read";
+                                pvalues[1].bit9hfname = hf_bit9acflags;
+                                pvalues[1].bit10 = "Write Managed";
+                                pvalues[1].bit10hfname = hf_bit10acflags;
+                                pvalues[1].bit11 = "Per Replica";
+                                pvalues[1].bit11hfname = hf_bit11acflags;
+                                pvalues[1].bit12 = "Never Schedule Synchronization";
+                                pvalues[1].bit12hfname = hf_bit12acflags;
+                                pvalues[1].bit13 = "Operational";
+                                pvalues[1].bit13hfname = hf_bit13acflags;
+                                pvalues[1].bit14 = "Not Defined";
+                                pvalues[1].bit14hfname = hf_bit14acflags;
+                                pvalues[1].bit15 = "Not Defined";
+                                pvalues[1].bit15hfname = hf_bit15acflags;
+                                pvalues[1].bit16 = "Not Defined";
+                                pvalues[1].bit16hfname = hf_bit16acflags;
                                 foffset = foffset+4;
-                                p3values.vtype = 4; /* String */
-                                p3values.vdesc = "Attribute Name: %s";
-                                p3values.vstring = "";
-                                p3values.mvtype = 1;
-                                p3values.vvalue = 0;
-                                p3values.vlength = 256;
-                                p3values.vlength = tvb_get_letohl(tvb, foffset);
-                                if (p3values.vlength == 0x00)
+                                pvalues[2].vtype = VTYPE_STRING;
+                                pvalues[2].vdesc = "Attribute Name: %s";
+                                pvalues[2].mvtype = MVTYPE_ATTR_REQUEST;
+                                pvalues[2].vvalue = 0;
+                                pvalues[2].vlength = 256;
+                                pvalues[2].vlength = tvb_get_letohl(tvb, foffset);
+                                if (pvalues[2].vlength == 0x00)
                                 {
-                                        p3values.vtype = 0;
+                                        pvalues[2].vtype = VTYPE_NONE;
                                         break;
                                 }
-                                p3values.voffset = foffset+4;
+                                pvalues[2].voffset = foffset+4;
                                 foffset = foffset + 4;
-                                get_string(tvb, p3values.voffset, p3values.vlength, req_buffer.buffer);
-                                p3values.vstring = req_buffer.buffer;
-                                global_object_name = req_buffer.buffer;
-                                p3values.hfname= hf_nds_name;
-                                foffset = foffset+p3values.vlength;
+                                get_string(tvb, pvalues[2].voffset, pvalues[2].vlength, req_buffer.buffer);
+                                pvalues[2].vstring = req_buffer.buffer;
+                                strcpy(global_object_name, req_buffer.buffer);
+                                pvalues[2].hfname= hf_nds_name;
+                                foffset = foffset+pvalues[2].vlength;
                                 foffset += align_4(tvb, foffset);
-                                p4values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p4values.vstring = match_strval(p4values.vvalue, nds_syntax);
-                                if(p4values.vstring == NULL)
+                                pvalues[3].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[3].vstring = match_strval(pvalues[3].vvalue, nds_syntax);
+                                if(pvalues[3].vstring == NULL)
                                 {
-                                        p4values.vstring = "No Syntax Found";
+                                        pvalues[3].vstring = "No Syntax Found";
                                 }
-                                p4values.vtype = 4; /* String */
-                                p4values.vdesc = "Syntax: %s";
-                                p4values.vlength = 4;
-                                p4values.voffset = foffset;
-                                p4values.hfname= hf_nds_syntax;
-                                p4values.mvtype = 0;
-                                foffset = foffset+p4values.vlength;
-                                p5values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p5values.vstring = "";
-                                p5values.vtype = 3; /* Uint32 */
-                                p5values.vdesc = "Lower Limit Value %d";
-                                p5values.vlength = 4;
-                                p5values.voffset = foffset;
-                                p5values.hfname = hf_nds_lower;
+                                pvalues[3].vtype = VTYPE_STRING;
+                                pvalues[3].vdesc = "Syntax: %s";
+                                pvalues[3].vlength = 4;
+                                pvalues[3].voffset = foffset;
+                                pvalues[3].hfname= hf_nds_syntax;
+                                pvalues[3].mvtype = 0;
+                                foffset = foffset+pvalues[3].vlength;
+                                pvalues[4].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[4].vtype = VTYPE_UINT32;
+                                pvalues[4].vdesc = "Lower Limit Value %u";
+                                pvalues[4].vlength = 4;
+                                pvalues[4].voffset = foffset;
+                                pvalues[4].hfname = hf_nds_lower;
                                 foffset += 4;
-                                p6values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p6values.vstring = "";
-                                p6values.vtype = 3; /* Uint32 */
-                                p6values.vdesc = "Upper Limit Value %d";
-                                p6values.vlength = 4;
-                                p6values.voffset = foffset;
-                                p6values.hfname = hf_nds_upper;
-                                p7values.vvalue = tvb_get_letohl(tvb, foffset); /* Length of bytes field */
+                                pvalues[5].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[5].vtype = VTYPE_UINT32;
+                                pvalues[5].vdesc = "Upper Limit Value %u";
+                                pvalues[5].vlength = 4;
+                                pvalues[5].voffset = foffset;
+                                pvalues[5].hfname = hf_nds_upper;
                                 foffset += 4;
-                                p7values.vstring = "";
-                                p7values.vtype = 7; /* Bytes */
-                                p7values.vdesc = "ASN.1 ID";
-                                p7values.vlength = p7values.vvalue;
-                                p7values.voffset = foffset;
-                                p7values.hfname = hf_nds_asn1;
+                                pvalues[6].vvalue = tvb_get_letohl(tvb, foffset); /* Length of bytes field */
+                                foffset += 4;
+                                pvalues[6].vtype = VTYPE_BYTES;
+                                pvalues[6].vdesc = "ASN.1 ID";
+                                pvalues[6].vlength = pvalues[6].vvalue;
+                                pvalues[6].voffset = foffset;
+                                pvalues[6].hfname = hf_nds_asn1;
                                 break;
                         case 0x0c:    
-                                verb_string = "Read Attribute Definition";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x0d:    
-                                verb_string = "Remove Attribute Definition";
-                                p1values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p1values.vstring = "";
-                                p1values.vtype = 3; /* Uint32 */
-                                p1values.vdesc = "Version: %d";
-                                p1values.vlength = 4;
-                                p1values.voffset = foffset;
-                                p1values.hfname= hf_nds_ver;
-                                foffset = foffset+p1values.vlength;
-                                p2values.vtype = 4; /* String */
-                                p2values.vdesc = "Attribute Name: %s";
-                                p2values.vstring = "";
-                                p2values.mvtype = 1;
-                                p2values.vvalue = 0;
-                                p2values.vlength = 256;
-                                p2values.vlength = tvb_get_letohl(tvb, foffset);
-                                if (p2values.vlength == 0x00)
+                                pvalues[0].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[0].vtype = VTYPE_UINT32;
+                                pvalues[0].vdesc = "Version: %u";
+                                pvalues[0].vlength = 4;
+                                pvalues[0].voffset = foffset;
+                                pvalues[0].hfname= hf_nds_ver;
+                                foffset = foffset+pvalues[0].vlength;
+                                pvalues[1].vtype = VTYPE_STRING;
+                                pvalues[1].vdesc = "Attribute Name: %s";
+                                pvalues[1].mvtype = MVTYPE_ATTR_REQUEST;
+                                pvalues[1].vvalue = 0;
+                                pvalues[1].vlength = 256;
+                                pvalues[1].vlength = tvb_get_letohl(tvb, foffset);
+                                if (pvalues[1].vlength == 0x00)
                                 {
-                                        p2values.vtype = 0;
+                                        pvalues[1].vtype = VTYPE_NONE;
                                         break;
                                 }
-                                p2values.voffset = foffset+4;
+                                pvalues[1].voffset = foffset+4;
                                 foffset = foffset + 4;
-                                get_string(tvb, p2values.voffset, p2values.vlength, req_buffer.buffer);
-                                p2values.vstring = req_buffer.buffer;
-                                global_object_name = req_buffer.buffer;
-                                p2values.hfname= hf_nds_attribute_dn;
+                                get_string(tvb, pvalues[1].voffset, pvalues[1].vlength, req_buffer.buffer);
+                                pvalues[1].vstring = req_buffer.buffer;
+                                strcpy(global_object_name, req_buffer.buffer);
+                                pvalues[1].hfname= hf_nds_attribute_dn;
                                 break;
                         case 0x0e:    
-                                verb_string = "Define Class";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x0f:    
-                                verb_string = "Read Class Definition ->";
-                                p1values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p1values.vstring = "";
-                                p1values.vtype = 3; /* Uint32 */
-                                p1values.vdesc = "Version: %d";
-                                p1values.vlength = 4;
-                                p1values.voffset = foffset;
-                                p1values.hfname= hf_nds_ver;
-                                foffset = foffset+p1values.vlength;
-                                p2values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p2values.vstring = "";
-                                p2values.vtype = 3; /* Uint32 */
-                                p2values.vdesc = "Iteration Handle: 0x%08x";
-                                p2values.vlength = 4;
-                                p2values.voffset = foffset;
-                                p2values.hfname= hf_nds_iteration;
-                                foffset = foffset+p2values.vlength;
-                                p3values.vvalue = tvb_get_letohl(tvb, foffset);
-                                global_flags = p3values.vvalue;
-                                p3values.vstring = match_strval(p3values.vvalue, class_def_type);
-                                if(p3values.vstring == NULL)
+                                pvalues[0].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[0].vtype = VTYPE_UINT32;
+                                pvalues[0].vdesc = "Version: %u";
+                                pvalues[0].vlength = 4;
+                                pvalues[0].voffset = foffset;
+                                pvalues[0].hfname= hf_nds_ver;
+                                foffset = foffset+pvalues[0].vlength;
+                                pvalues[1].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[1].vtype = VTYPE_UINT32;
+                                pvalues[1].vdesc = "Iteration Handle: 0x%08x";
+                                pvalues[1].vlength = 4;
+                                pvalues[1].voffset = foffset;
+                                pvalues[1].hfname= hf_nds_iteration;
+                                foffset = foffset+pvalues[1].vlength;
+                                pvalues[2].vvalue = tvb_get_letohl(tvb, foffset);
+                                global_flags = pvalues[2].vvalue;
+                                pvalues[2].vstring = match_strval(pvalues[2].vvalue, class_def_type);
+                                if(pvalues[2].vstring == NULL)
                                 {
-                                        p3values.vstring = "No Class Definition Type Set";
+                                        pvalues[2].vstring = "No Class Definition Type Set";
                                 }
-                                p3values.vtype = 4; /* String */
-                                p3values.vdesc = "Class Definition Type: %s";
-                                p3values.vlength = 4;
-                                p3values.voffset = foffset;
-                                p3values.mvtype = 0;
-                                p3values.hfname= hf_nds_class_def_type;
-                                foffset = foffset + p3values.vlength;
-                                p4values.vvalue = tvb_get_letohl(tvb, foffset);
-                                if (p4values.vvalue == 0x00000000)
+                                pvalues[2].vtype = VTYPE_STRING;
+                                pvalues[2].vdesc = "Class Definition Type: %s";
+                                pvalues[2].vlength = 4;
+                                pvalues[2].voffset = foffset;
+                                pvalues[2].mvtype = 0;
+                                pvalues[2].hfname= hf_nds_class_def_type;
+                                foffset = foffset + pvalues[2].vlength;
+                                pvalues[3].vvalue = tvb_get_letohl(tvb, foffset);
+                                if (pvalues[3].vvalue == 0x00000000)
                                 {
-                                        p4values.vstring = "Return All Classes = False";
+                                        pvalues[3].vstring = "Do Not Return All Classes";
+                                        pvalues[3].mvtype = 0;
                                 }        
                                 else
                                 {
-                                        p4values.vstring = "Return All Classes = True";
+                                        pvalues[3].vstring = "Return All Classes";
+                                        pvalues[3].mvtype = MVTYPE_ATTR_REQUEST;
                                 }
-                                p4values.vtype = 4; /* String */
-                                p4values.vdesc = "Return all Classes %s";
-                                p4values.vlength = 4;
-                                p4values.voffset = foffset;
-                                p4values.mvtype = 0;
-                                p4values.hfname= hf_nds_return_all_classes;
-                                foffset = foffset + p4values.vlength;
+                                pvalues[3].vtype = VTYPE_STRING;
+                                pvalues[3].vdesc = "%s";
+                                pvalues[3].vlength = 4;
+                                pvalues[3].voffset = foffset;
+                                pvalues[3].hfname= hf_nds_return_all_classes;
+                                foffset = foffset + pvalues[3].vlength;
                                 foffset += align_4(tvb, foffset);
-                                p5values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p5values.vtype = 6; /* Multivalue Uint32 */
-                                p5values.vstring = "";
-                                p5values.vdesc = "Classes: %d";
-                                p5values.vlength = 4;
-                                p5values.voffset = foffset;
-                                p5values.mvtype = 4;
-                                p5values.hfname= hf_nds_classes;
+                                pvalues[4].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[4].vtype = VTYPE_MULTIVALUE_UINT32;
+                                pvalues[4].vdesc = "Classes: %d";
+                                pvalues[4].vlength = 4;
+                                pvalues[4].voffset = foffset;
+                                pvalues[4].mvtype = MVTYPE_READ_CLASS_REQ;
+                                pvalues[4].hfname= hf_nds_classes;
                                 break;
                         case 0x10:    
-                                verb_string = "Modify Class Definition -> ";
-                                p1values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p1values.vstring = "";
-                                p1values.vtype = 3; /* Uint32 */
-                                p1values.vdesc = "Version: %d";
-                                p1values.vlength = 4;
-                                p1values.voffset = foffset;
-                                p1values.hfname= hf_nds_ver;
-                                foffset = foffset+p1values.vlength;
-                                p2values.vtype = 4; /* String */
-                                p2values.vdesc = "Class Name: %s";
-                                p2values.vstring = "";
-                                p2values.mvtype = 1;
-                                p2values.vvalue = 0;
-                                p2values.vlength = 256;
-                                p2values.vlength = tvb_get_letohl(tvb, foffset);
-                                if (p2values.vlength == 0x00)
+                                pvalues[0].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[0].vtype = VTYPE_UINT32;
+                                pvalues[0].vdesc = "Version: %u";
+                                pvalues[0].vlength = 4;
+                                pvalues[0].voffset = foffset;
+                                pvalues[0].hfname= hf_nds_ver;
+                                foffset = foffset+pvalues[0].vlength;
+                                pvalues[1].vtype = VTYPE_STRING;
+                                pvalues[1].vdesc = "Class Name: %s";
+                                pvalues[1].mvtype = MVTYPE_ATTR_REQUEST;
+                                pvalues[1].vvalue = 0;
+                                pvalues[1].vlength = 256;
+                                pvalues[1].vlength = tvb_get_letohl(tvb, foffset);
+                                if (pvalues[1].vlength == 0x00)
                                 {
-                                        p2values.vtype = 0;
+                                        pvalues[1].vtype = VTYPE_NONE;
                                         break;
                                 }
-                                p2values.voffset = foffset+4;
+                                pvalues[1].voffset = foffset+4;
                                 foffset = foffset + 4;
-                                get_string(tvb, p2values.voffset, p2values.vlength, req_buffer.buffer);
-                                p2values.vstring = req_buffer.buffer;
-                                global_object_name = req_buffer.buffer;
-                                p2values.hfname= hf_nds_base_class;
-                                foffset = foffset+p2values.vlength;
+                                get_string(tvb, pvalues[1].voffset, pvalues[1].vlength, req_buffer.buffer);
+                                pvalues[1].vstring = req_buffer.buffer;
+                                strcpy(global_object_name, req_buffer.buffer);
+                                pvalues[1].hfname= hf_nds_base_class;
+                                foffset = foffset+pvalues[1].vlength;
                                 foffset += align_4(tvb, foffset);
-                                p3values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p3values.vtype = 6; /* Multivalue Uint32 */
-                                p3values.vstring = "";
-                                p3values.vdesc = "Number of Attributes to Add: %d";
-                                p3values.vlength = 4;
-                                p3values.voffset = foffset;
-                                p3values.mvtype = 14;
-                                p3values.hfname= hf_nds_att_add;
+                                pvalues[2].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[2].vtype = VTYPE_MULTIVALUE_UINT32;
+                                pvalues[2].vdesc = "Number of Attributes to Add: %u";
+                                pvalues[2].vlength = 4;
+                                pvalues[2].voffset = foffset;
+                                pvalues[2].mvtype = MVTYPE_MODIFY_CLASS;
+                                pvalues[2].hfname= hf_nds_att_add;
                                 break;
                         case 0x11:    
-                                verb_string = "Remove Class Definition";
-                                p1values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p1values.vstring = "";
-                                p1values.vtype = 3; /* Uint32 */
-                                p1values.vdesc = "Version: %d";
-                                p1values.vlength = 4;
-                                p1values.voffset = foffset;
-                                p1values.hfname= hf_nds_ver;
-                                foffset = foffset+p1values.vlength;
-                                p2values.vtype = 4; /* String */
-                                p2values.vdesc = "Class Name: %s";
-                                p2values.vstring = "";
-                                p2values.mvtype = 1;
-                                p2values.vvalue = 0;
-                                p2values.vlength = 256;
-                                p2values.vlength = tvb_get_letohl(tvb, foffset);
-                                if (p2values.vlength == 0x00)
+                                pvalues[0].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[0].vtype = VTYPE_UINT32;
+                                pvalues[0].vdesc = "Version: %u";
+                                pvalues[0].vlength = 4;
+                                pvalues[0].voffset = foffset;
+                                pvalues[0].hfname= hf_nds_ver;
+                                foffset = foffset+pvalues[0].vlength;
+                                pvalues[1].vtype = VTYPE_STRING;
+                                pvalues[1].vdesc = "Class Name: %s";
+                                pvalues[1].mvtype = MVTYPE_ATTR_REQUEST;
+                                pvalues[1].vvalue = 0;
+                                pvalues[1].vlength = 256;
+                                pvalues[1].vlength = tvb_get_letohl(tvb, foffset);
+                                if (pvalues[1].vlength == 0x00)
                                 {
-                                        p2values.vtype = 0;
+                                        pvalues[1].vtype = VTYPE_NONE;
                                         break;
                                 }
-                                p2values.voffset = foffset+4;
+                                pvalues[1].voffset = foffset+4;
                                 foffset = foffset + 4;
-                                get_string(tvb, p2values.voffset, p2values.vlength, req_buffer.buffer);
-                                p2values.vstring = req_buffer.buffer;
-                                global_object_name = req_buffer.buffer;
-                                p2values.hfname= hf_nds_base;
+                                get_string(tvb, pvalues[1].voffset, pvalues[1].vlength, req_buffer.buffer);
+                                pvalues[1].vstring = req_buffer.buffer;
+                                strcpy(global_object_name, req_buffer.buffer);
+                                pvalues[1].hfname= hf_nds_base;
                                 break;
                         case 0x12:    
-                                verb_string = "List Containable Classes";
-                                p1values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p1values.vstring = "";
-                                p1values.vtype = 3; /* Uint32 */
-                                p1values.vdesc = "Version: %d";
-                                p1values.vlength = 4;
-                                p1values.voffset = foffset;
-                                p1values.hfname= hf_nds_ver;
-                                foffset = foffset+p1values.vlength;
-                                p2values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p2values.vstring = "";
-                                p2values.vtype = 3; /* Uint32 */
-                                p2values.vdesc = "Iteration Handle: 0x%08x";
-                                p2values.vlength = 4;
-                                p2values.voffset = foffset;
-                                p2values.hfname= hf_nds_iteration;
-                                foffset = foffset+p2values.vlength;
-                                p3values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p3values.vstring = "";
-                                p3values.vtype = 3; /* Uint32 */
-                                p3values.vdesc = "Entry ID: 0x%08x";
-                                p3values.vlength = 4;
+                                pvalues[0].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[0].vtype = VTYPE_UINT32;
+                                pvalues[0].vdesc = "Version: %u";
+                                pvalues[0].vlength = 4;
+                                pvalues[0].voffset = foffset;
+                                pvalues[0].hfname= hf_nds_ver;
+                                foffset = foffset+pvalues[0].vlength;
+                                pvalues[1].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[1].vtype = VTYPE_UINT32;
+                                pvalues[1].vdesc = "Iteration Handle: 0x%08x";
+                                pvalues[1].vlength = 4;
+                                pvalues[1].voffset = foffset;
+                                pvalues[1].hfname= hf_nds_iteration;
+                                foffset = foffset+pvalues[1].vlength;
+                                pvalues[2].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[2].vtype = VTYPE_UINT32;
+                                pvalues[2].vdesc = "Entry ID: 0x%08x";
+                                pvalues[2].vlength = 4;
                                 resolve_eid = TRUE;
-                                global_eid = p3values.vvalue;
-                                p3values.voffset = foffset;
-                                p3values.hfname= hf_nds_eid;
-                                foffset = foffset+p3values.vlength;
+                                global_eid = pvalues[2].vvalue;
+                                pvalues[2].voffset = foffset;
+                                pvalues[2].hfname= hf_nds_eid;
+                                foffset = foffset+pvalues[2].vlength;
                                 break;
                         case 0x13:    
-                                verb_string = "Get Effective Rights -> ";
-                                p1values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p1values.vstring = "";
-                                p1values.vtype = 3; /* Uint32 */
-                                p1values.vdesc = "Version: %d";
-                                p1values.vlength = 4;
-                                p1values.voffset = foffset;
-                                p1values.hfname= hf_nds_ver;
-                                foffset = foffset+p1values.vlength;
-                                p2values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p2values.vstring = "";
-                                p2values.vtype = 3; /* Uint32 */
-                                p2values.vdesc = "Entry ID: 0x%08x";
-                                p2values.vlength = 4;
+                                pvalues[0].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[0].vtype = VTYPE_UINT32;
+                                pvalues[0].vdesc = "Version: %u";
+                                pvalues[0].vlength = 4;
+                                pvalues[0].voffset = foffset;
+                                pvalues[0].hfname= hf_nds_ver;
+                                foffset = foffset+pvalues[0].vlength;
+                                pvalues[1].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[1].vtype = VTYPE_UINT32;
+                                pvalues[1].vdesc = "Entry ID: 0x%08x";
+                                pvalues[1].vlength = 4;
                                 resolve_eid = TRUE;
-                                global_eid = p2values.vvalue;
-                                p2values.voffset = foffset;
-                                p2values.hfname= hf_nds_eid;
-                                foffset = foffset+p2values.vlength;
-                                p3values.vtype = 4; /* String */
-                                p3values.vdesc = "Trustee Name: %s";
-                                p3values.vstring = "";
-                                p3values.mvtype = 1;
-                                p3values.vvalue = 0;
-                                p3values.vlength = 256;
-                                p3values.vlength = tvb_get_letohl(tvb, foffset);
-                                if (p3values.vlength == 0x00)
+                                global_eid = pvalues[1].vvalue;
+                                pvalues[1].voffset = foffset;
+                                pvalues[1].hfname= hf_nds_eid;
+                                foffset = foffset+pvalues[1].vlength;
+                                pvalues[2].vtype = VTYPE_STRING;
+                                pvalues[2].vdesc = "Trustee Name: %s";
+                                pvalues[2].mvtype = MVTYPE_ATTR_REQUEST;
+                                pvalues[2].vvalue = 0;
+                                pvalues[2].vlength = 256;
+                                pvalues[2].vlength = tvb_get_letohl(tvb, foffset);
+                                if (pvalues[2].vlength == 0x00)
                                 {
-                                        p3values.vtype = 0;
+                                        pvalues[2].vtype = VTYPE_NONE;
                                         break;
                                 }
-                                p3values.voffset = foffset+4;
+                                pvalues[2].voffset = foffset+4;
                                 foffset = foffset + 4;
-                                get_string(tvb, p3values.voffset, p3values.vlength, req_buffer.buffer);
-                                p3values.vstring = req_buffer.buffer;
-                                p3values.hfname= hf_nds_name;
-                                foffset = foffset+p3values.vlength;
+                                get_string(tvb, pvalues[2].voffset, pvalues[2].vlength, req_buffer.buffer);
+                                pvalues[2].vstring = req_buffer.buffer;
+                                pvalues[2].hfname= hf_nds_name;
+                                foffset = foffset+pvalues[2].vlength;
                                 foffset += align_4(tvb, foffset);
-                                p4values.vtype = 4; /* String */
-                                p4values.vdesc = "Attribute to be Checked: %s";
-                                p4values.vstring = "";
-                                p4values.mvtype = 0;
-                                p4values.vvalue = 0;
-                                p4values.vlength = 256;
-                                p4values.vlength = tvb_get_letohl(tvb, foffset);
-                                if (p4values.vlength == 0x00)
+                                pvalues[3].vtype = VTYPE_STRING;
+                                pvalues[3].vdesc = "Attribute to be Checked: %s";
+                                pvalues[3].mvtype = 0;
+                                pvalues[3].vvalue = 0;
+                                pvalues[3].vlength = 256;
+                                pvalues[3].vlength = tvb_get_letohl(tvb, foffset);
+                                if (pvalues[3].vlength == 0x00)
                                 {
-                                        p4values.vtype = 0;
+                                        pvalues[3].vtype = VTYPE_NONE;
                                         break;
                                 }
-                                p4values.voffset = foffset+4;
+                                pvalues[3].voffset = foffset+4;
                                 foffset = foffset + 4;
-                                get_string(tvb, p4values.voffset, p4values.vlength, p4values.vstring);
-                                p4values.hfname= hf_nds_name;
-                                foffset = foffset+p4values.vlength;
+                                get_string(tvb, pvalues[3].voffset, pvalues[3].vlength, pvalues[3].vstring);
+                                pvalues[3].hfname= hf_nds_name;
+                                foffset = foffset+pvalues[3].vlength;
                                 foffset += align_4(tvb, foffset);
-                                if(p1values.vvalue != 0)
+                                if(pvalues[0].vvalue != 0)
                                 {
-                                        p5values.vtype = 4; /* String */
-                                        p5values.vdesc = "Security Equivalence: %s";
-                                        p5values.vstring = "";
-                                        p5values.mvtype = 1;
-                                        p5values.vvalue = 0;
-                                        p5values.vlength = 256;
-                                        p5values.vlength = tvb_get_letohl(tvb, foffset);
-                                        if (p5values.vlength == 0x00)
+                                        pvalues[4].vtype = VTYPE_STRING;
+                                        pvalues[4].vdesc = "Security Equivalence: %s";
+                                        pvalues[4].mvtype = MVTYPE_ATTR_REQUEST;
+                                        pvalues[4].vvalue = 0;
+                                        pvalues[4].vlength = 256;
+                                        pvalues[4].vlength = tvb_get_letohl(tvb, foffset);
+                                        if (pvalues[4].vlength == 0x00)
                                         {
-                                                p5values.vtype = 0;
+                                                pvalues[4].vtype = VTYPE_NONE;
                                                 break;
                                         }
-                                        p5values.voffset = foffset+4;
+                                        pvalues[4].voffset = foffset+4;
                                         foffset = foffset + 4;
-                                        get_string(tvb, p5values.voffset, p5values.vlength, p5values.vstring);
-                                        p5values.hfname= hf_nds_name;
-                                        foffset = foffset+p5values.vlength;
+                                        get_string(tvb, pvalues[4].voffset, pvalues[4].vlength, pvalues[4].vstring);
+                                        pvalues[4].hfname= hf_nds_name;
+                                        foffset = foffset+pvalues[4].vlength;
                                         foffset += align_4(tvb, foffset);
                                 }
                                 break;
                         case 0x14:    
-                                verb_string = "Add Partition";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x15:    
-                                verb_string = "Remove Partition";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x16:    
-                                verb_string = "List Partitions";
-                                p1values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p1values.vstring = "";
-                                p1values.vtype = 3; /* Uint32 */
-                                p1values.vdesc = "Version: %d";
-                                p1values.vlength = 4;
-                                p1values.voffset = foffset;
-                                p1values.hfname= hf_nds_ver;
-                                foffset = foffset+p1values.vlength;
-                                p2values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p2values.vtype = 5; /* Bitfield */
-                                p2values.vstring = "";
-                                p2values.vdesc = "Request Flags:";
-                                p2values.vlength = 2;
-                                p2values.hfname= hf_nds_rflags;
-                                p2values.voffset = foffset;
-                                p2values.bit1 = "Typeless";
-                                p2values.bit1hfname = hf_nds_bit1;
-                                p2values.bit2 = "All Containers";
-                                p2values.bit2hfname = hf_nds_bit2;
-                                p2values.bit3 = "Slashed";
-                                p2values.bit3hfname = hf_nds_bit3;
-                                p2values.bit4 = "Dotted";
-                                p2values.bit4hfname = hf_nds_bit4;
-                                p2values.bit5 = "Tuned";
-                                p2values.bit5hfname = hf_nds_bit5;
-                                p2values.bit6 = "Not Defined";
-                                p2values.bit6hfname = hf_nds_bit6;
-                                p2values.bit7 = "Not Defined";
-                                p2values.bit7hfname = hf_nds_bit7;
-                                p2values.bit8 = "Not Defined";
-                                p2values.bit8hfname = hf_nds_bit8;
-                                p2values.bit9 = "Not Defined";
-                                p2values.bit9hfname = hf_nds_bit9;
-                                p2values.bit10 = "Not Defined";
-                                p2values.bit10hfname = hf_nds_bit10;
-                                p2values.bit11 = "Not Defined";
-                                p2values.bit11hfname = hf_nds_bit11;
-                                p2values.bit12 = "Not Defined";
-                                p2values.bit12hfname = hf_nds_bit12;
-                                p2values.bit13 = "Not Defined";
-                                p2values.bit13hfname = hf_nds_bit13;
-                                p2values.bit14 = "Not Defined";
-                                p2values.bit14hfname = hf_nds_bit14;
-                                p2values.bit15 = "Not Defined";
-                                p2values.bit15hfname = hf_nds_bit15;
-                                p2values.bit16 = "Not Defined";
-                                p2values.bit16hfname = hf_nds_bit16;
-                                foffset = foffset+p2values.vlength;
-                                p3values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p3values.vstring = "";
-                                p3values.vtype = 3; /* Uint32 */
-                                p3values.vdesc = "Iteration Handle: 0x%08x";
-                                p3values.vlength = 4;
-                                p3values.voffset = foffset;
-                                p3values.hfname= hf_nds_iteration;
-                                foffset = foffset+p3values.vlength;
-                                if(p1values.vvalue == 0)
+                                pvalues[0].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[0].vtype = VTYPE_UINT32;
+                                pvalues[0].vdesc = "Version: %u";
+                                pvalues[0].vlength = 4;
+                                pvalues[0].voffset = foffset;
+                                pvalues[0].hfname= hf_nds_ver;
+                                foffset = foffset+pvalues[0].vlength;
+                                pvalues[1].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[1].vtype = VTYPE_BITFIELD;
+                                pvalues[1].vdesc = "Request Flags:";
+                                pvalues[1].vlength = 2;
+                                pvalues[1].hfname= hf_nds_rflags;
+                                pvalues[1].voffset = foffset;
+                                pvalues[1].bit1 = "Typeless";
+                                pvalues[1].bit1hfname = hf_nds_bit1;
+                                pvalues[1].bit2 = "All Containers";
+                                pvalues[1].bit2hfname = hf_nds_bit2;
+                                pvalues[1].bit3 = "Slashed";
+                                pvalues[1].bit3hfname = hf_nds_bit3;
+                                pvalues[1].bit4 = "Dotted";
+                                pvalues[1].bit4hfname = hf_nds_bit4;
+                                pvalues[1].bit5 = "Tuned";
+                                pvalues[1].bit5hfname = hf_nds_bit5;
+                                pvalues[1].bit6 = "Not Defined";
+                                pvalues[1].bit6hfname = hf_nds_bit6;
+                                pvalues[1].bit7 = "Not Defined";
+                                pvalues[1].bit7hfname = hf_nds_bit7;
+                                pvalues[1].bit8 = "Not Defined";
+                                pvalues[1].bit8hfname = hf_nds_bit8;
+                                pvalues[1].bit9 = "Not Defined";
+                                pvalues[1].bit9hfname = hf_nds_bit9;
+                                pvalues[1].bit10 = "Not Defined";
+                                pvalues[1].bit10hfname = hf_nds_bit10;
+                                pvalues[1].bit11 = "Not Defined";
+                                pvalues[1].bit11hfname = hf_nds_bit11;
+                                pvalues[1].bit12 = "Not Defined";
+                                pvalues[1].bit12hfname = hf_nds_bit12;
+                                pvalues[1].bit13 = "Not Defined";
+                                pvalues[1].bit13hfname = hf_nds_bit13;
+                                pvalues[1].bit14 = "Not Defined";
+                                pvalues[1].bit14hfname = hf_nds_bit14;
+                                pvalues[1].bit15 = "Not Defined";
+                                pvalues[1].bit15hfname = hf_nds_bit15;
+                                pvalues[1].bit16 = "Not Defined";
+                                pvalues[1].bit16hfname = hf_nds_bit16;
+                                foffset = foffset+pvalues[1].vlength;
+                                pvalues[2].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[2].vtype = VTYPE_UINT32;
+                                pvalues[2].vdesc = "Iteration Handle: 0x%08x";
+                                pvalues[2].vlength = 4;
+                                pvalues[2].voffset = foffset;
+                                pvalues[2].hfname= hf_nds_iteration;
+                                foffset = foffset+pvalues[2].vlength;
+                                if(pvalues[0].vvalue == 0)
                                 {
                                         global_flags = 0x000000c0;
                                         break;
                                 }
-                                p4values.vvalue = tvb_get_letohs(tvb, foffset);
-                                p4values.vtype = 5; /* Bitfield */
-                                p4values.vstring = "";
-                                p4values.vdesc = "Information Flags (low) Byte:";
-                                p4values.vlength = 2;
-                                p4values.hfname= hf_nds_rflags;
-                                p4values.voffset = foffset;
-                                p4values.bit1 = "Output Flags";
-                                p4values.bit1hfname = hf_bit1l1flagsl;
-                                p4values.bit2 = "Entry ID";
-                                p4values.bit2hfname = hf_bit2l1flagsl;
-                                p4values.bit3 = "Replica State";
-                                p4values.bit3hfname = hf_bit3l1flagsl;
-                                p4values.bit4 = "Modification Timestamp";
-                                p4values.bit4hfname = hf_bit4l1flagsl;
-                                p4values.bit5 = "Purge Time";
-                                p4values.bit5hfname = hf_bit5l1flagsl;
-                                p4values.bit6 = "Local Partition ID";
-                                p4values.bit6hfname = hf_bit6l1flagsl;
-                                p4values.bit7 = "Distinguished Name";
-                                p4values.bit7hfname = hf_bit7l1flagsl;
-                                p4values.bit8 = "Replica Type";
-                                p4values.bit8hfname = hf_bit8l1flagsl;
-                                p4values.bit9 = "Partition Busy";
-                                p4values.bit9hfname = hf_bit9l1flagsl;
-                                p4values.bit10 = "Not Defined";
-                                p4values.bit10hfname = hf_bit10l1flagsl;
-                                p4values.bit11 = "Not Defined";
-                                p4values.bit11hfname = hf_bit11l1flagsl;
-                                p4values.bit12 = "Not Defined";
-                                p4values.bit12hfname = hf_bit12l1flagsl;
-                                p4values.bit13 = "Not Defined";
-                                p4values.bit13hfname = hf_bit13l1flagsl;
-                                p4values.bit14 = "Not Defined";
-                                p4values.bit14hfname = hf_bit14l1flagsl;
-                                p4values.bit15 = "Not Defined";
-                                p4values.bit15hfname = hf_bit15l1flagsl;
-                                p4values.bit16 = "Not Defined";
-                                p4values.bit16hfname = hf_bit16l1flagsl;
-                                global_flags = p4values.vvalue;
+                                pvalues[3].vvalue = tvb_get_letohs(tvb, foffset);
+                                pvalues[3].vtype = VTYPE_BITFIELD;
+                                pvalues[3].vdesc = "Information Flags (low) Byte:";
+                                pvalues[3].vlength = 2;
+                                pvalues[3].hfname= hf_nds_rflags;
+                                pvalues[3].voffset = foffset;
+                                pvalues[3].bit1 = "Output Flags";
+                                pvalues[3].bit1hfname = hf_bit1l1flagsl;
+                                pvalues[3].bit2 = "Entry ID";
+                                pvalues[3].bit2hfname = hf_bit2l1flagsl;
+                                pvalues[3].bit3 = "Replica State";
+                                pvalues[3].bit3hfname = hf_bit3l1flagsl;
+                                pvalues[3].bit4 = "Modification Timestamp";
+                                pvalues[3].bit4hfname = hf_bit4l1flagsl;
+                                pvalues[3].bit5 = "Purge Time";
+                                pvalues[3].bit5hfname = hf_bit5l1flagsl;
+                                pvalues[3].bit6 = "Local Partition ID";
+                                pvalues[3].bit6hfname = hf_bit6l1flagsl;
+                                pvalues[3].bit7 = "Distinguished Name";
+                                pvalues[3].bit7hfname = hf_bit7l1flagsl;
+                                pvalues[3].bit8 = "Replica Type";
+                                pvalues[3].bit8hfname = hf_bit8l1flagsl;
+                                pvalues[3].bit9 = "Partition Busy";
+                                pvalues[3].bit9hfname = hf_bit9l1flagsl;
+                                pvalues[3].bit10 = "Not Defined";
+                                pvalues[3].bit10hfname = hf_bit10l1flagsl;
+                                pvalues[3].bit11 = "Not Defined";
+                                pvalues[3].bit11hfname = hf_bit11l1flagsl;
+                                pvalues[3].bit12 = "Not Defined";
+                                pvalues[3].bit12hfname = hf_bit12l1flagsl;
+                                pvalues[3].bit13 = "Not Defined";
+                                pvalues[3].bit13hfname = hf_bit13l1flagsl;
+                                pvalues[3].bit14 = "Not Defined";
+                                pvalues[3].bit14hfname = hf_bit14l1flagsl;
+                                pvalues[3].bit15 = "Not Defined";
+                                pvalues[3].bit15hfname = hf_bit15l1flagsl;
+                                pvalues[3].bit16 = "Not Defined";
+                                pvalues[3].bit16hfname = hf_bit16l1flagsl;
+                                global_flags = pvalues[3].vvalue;
                                 foffset = foffset+2;
-                                p5values.vvalue = tvb_get_letohs(tvb, foffset);
-                                p5values.vtype = 5; /* Bitfield */
-                                p5values.vstring = "";
-                                p5values.vdesc = "Information Flags (high) Byte:";
-                                p5values.vlength = 2;
-                                p5values.hfname= hf_nds_rflags;
-                                p5values.voffset = foffset;
-                                p5values.bit1 = "Not Defined";
-                                p5values.bit1hfname = hf_bit1l1flagsl;
-                                p5values.bit2 = "Not Defined";
-                                p5values.bit2hfname = hf_bit2l1flagsl;
-                                p5values.bit3 = "Not Defined";
-                                p5values.bit3hfname = hf_bit3l1flagsl;
-                                p5values.bit4 = "Not Defined";
-                                p5values.bit4hfname = hf_bit4l1flagsl;
-                                p5values.bit5 = "Not Defined";
-                                p5values.bit5hfname = hf_bit5l1flagsl;
-                                p5values.bit6 = "Not Defined";
-                                p5values.bit6hfname = hf_bit6l1flagsl;
-                                p5values.bit7 = "Not Defined";
-                                p5values.bit7hfname = hf_bit7l1flagsl;
-                                p5values.bit8 = "Not Defined";
-                                p5values.bit8hfname = hf_bit8l1flagsl;
-                                p5values.bit9 = "Not Defined";
-                                p5values.bit9hfname = hf_bit9l1flagsl;
-                                p5values.bit10 = "Not Defined";
-                                p5values.bit10hfname = hf_bit10l1flagsl;
-                                p5values.bit11 = "Not Defined";
-                                p5values.bit11hfname = hf_bit11l1flagsl;
-                                p5values.bit12 = "Not Defined";
-                                p5values.bit12hfname = hf_bit12l1flagsl;
-                                p5values.bit13 = "Not Defined";
-                                p5values.bit13hfname = hf_bit13l1flagsl;
-                                p5values.bit14 = "Not Defined";
-                                p5values.bit14hfname = hf_bit14l1flagsl;
-                                p5values.bit15 = "Not Defined";
-                                p5values.bit15hfname = hf_bit15l1flagsl;
-                                p5values.bit16 = "Not Defined";
-                                p5values.bit16hfname = hf_bit16l1flagsl;
+                                pvalues[4].vvalue = tvb_get_letohs(tvb, foffset);
+                                pvalues[4].vtype = VTYPE_BITFIELD;
+                                pvalues[4].vdesc = "Information Flags (high) Byte:";
+                                pvalues[4].vlength = 2;
+                                pvalues[4].hfname= hf_nds_rflags;
+                                pvalues[4].voffset = foffset;
+                                pvalues[4].bit1 = "Not Defined";
+                                pvalues[4].bit1hfname = hf_bit1l1flagsl;
+                                pvalues[4].bit2 = "Not Defined";
+                                pvalues[4].bit2hfname = hf_bit2l1flagsl;
+                                pvalues[4].bit3 = "Not Defined";
+                                pvalues[4].bit3hfname = hf_bit3l1flagsl;
+                                pvalues[4].bit4 = "Not Defined";
+                                pvalues[4].bit4hfname = hf_bit4l1flagsl;
+                                pvalues[4].bit5 = "Not Defined";
+                                pvalues[4].bit5hfname = hf_bit5l1flagsl;
+                                pvalues[4].bit6 = "Not Defined";
+                                pvalues[4].bit6hfname = hf_bit6l1flagsl;
+                                pvalues[4].bit7 = "Not Defined";
+                                pvalues[4].bit7hfname = hf_bit7l1flagsl;
+                                pvalues[4].bit8 = "Not Defined";
+                                pvalues[4].bit8hfname = hf_bit8l1flagsl;
+                                pvalues[4].bit9 = "Not Defined";
+                                pvalues[4].bit9hfname = hf_bit9l1flagsl;
+                                pvalues[4].bit10 = "Not Defined";
+                                pvalues[4].bit10hfname = hf_bit10l1flagsl;
+                                pvalues[4].bit11 = "Not Defined";
+                                pvalues[4].bit11hfname = hf_bit11l1flagsl;
+                                pvalues[4].bit12 = "Not Defined";
+                                pvalues[4].bit12hfname = hf_bit12l1flagsl;
+                                pvalues[4].bit13 = "Not Defined";
+                                pvalues[4].bit13hfname = hf_bit13l1flagsl;
+                                pvalues[4].bit14 = "Not Defined";
+                                pvalues[4].bit14hfname = hf_bit14l1flagsl;
+                                pvalues[4].bit15 = "Not Defined";
+                                pvalues[4].bit15hfname = hf_bit15l1flagsl;
+                                pvalues[4].bit16 = "Not Defined";
+                                pvalues[4].bit16hfname = hf_bit16l1flagsl;
                                 foffset = foffset+2;
-                                if(p1values.vvalue == 1)
+                                if(pvalues[0].vvalue == 1)
                                 {
                                         break;
                                 }
-                                p6values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p6values.vstring = "";
-                                p6values.vtype = 3; /* Uint32 */
-                                p6values.vdesc = "Partition Root ID: 0x%08x";
-                                p6values.vlength = 4;
-                                p6values.voffset = foffset;
-                                p6values.hfname= hf_nds_partition_root_id;
-                                foffset = foffset+p6values.vlength;
+                                pvalues[5].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[5].vtype = VTYPE_UINT32;
+                                pvalues[5].vdesc = "Partition Root ID: 0x%08x";
+                                pvalues[5].vlength = 4;
+                                pvalues[5].voffset = foffset;
+                                pvalues[5].hfname= hf_nds_partition_root_id;
+                                foffset = foffset+pvalues[5].vlength;
                                 break;
                         case 0x17:    
-                                verb_string = "Split Partition";
-                                p1values.vvalue = tvb_get_letohl(tvb, foffset);
-                                nds_version = p1values.vvalue;
-                                p1values.vstring = "";
-                                p1values.vtype = 3; /* Uint32 */
-                                p1values.vdesc = "Version: %d";
-                                p1values.vlength = 4;
-                                p1values.hfname = hf_nds_ver;
-                                p1values.voffset = foffset;
-                                foffset = foffset+p1values.vlength;
-                                p2values.vvalue = tvb_get_letohl(tvb, foffset);
-                                nds_version = p2values.vvalue;
-                                p2values.vstring = "";
-                                p2values.vtype = 3; /* Uint32 */
-                                p2values.vdesc = "Flags: 0x%08x";
-                                p2values.vlength = 4;
-                                p2values.hfname = hf_nds_req_flags;
-                                p2values.voffset = foffset;
-                                foffset = foffset+p2values.vlength;
-                                p3values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p3values.vstring = "";
-                                p3values.vtype = 3; /* Uint32 */
-                                p3values.vdesc = "New Partition Root ID: 0x%08x";
-                                p3values.vlength = 4;
-                                p3values.voffset = foffset;
-                                p3values.hfname= hf_nds_new_part_id;
-                                foffset = foffset+p3values.vlength;
+                                pvalues[0].vvalue = tvb_get_letohl(tvb, foffset);
+                                nds_version = pvalues[0].vvalue;
+                                pvalues[0].vtype = VTYPE_UINT32;
+                                pvalues[0].vdesc = "Version: %u";
+                                pvalues[0].vlength = 4;
+                                pvalues[0].hfname = hf_nds_ver;
+                                pvalues[0].voffset = foffset;
+                                foffset = foffset+pvalues[0].vlength;
+                                pvalues[1].vvalue = tvb_get_letohl(tvb, foffset);
+                                nds_version = pvalues[1].vvalue;
+                                pvalues[1].vtype = VTYPE_UINT32;
+                                pvalues[1].vdesc = "Flags: 0x%08x";
+                                pvalues[1].vlength = 4;
+                                pvalues[1].hfname = hf_nds_req_flags;
+                                pvalues[1].voffset = foffset;
+                                foffset = foffset+pvalues[1].vlength;
+                                pvalues[2].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[2].vtype = VTYPE_UINT32;
+                                pvalues[2].vdesc = "New Partition Root ID: 0x%08x";
+                                pvalues[2].vlength = 4;
+                                pvalues[2].voffset = foffset;
+                                pvalues[2].hfname= hf_nds_new_part_id;
+                                foffset = foffset+pvalues[2].vlength;
                                 break;
                         case 0x18:    
-                                verb_string = "Join Partitions";
-                                p1values.vvalue = tvb_get_letohl(tvb, foffset);
-                                nds_version = p1values.vvalue;
-                                p1values.vstring = "";
-                                p1values.vtype = 3; /* Uint32 */
-                                p1values.vdesc = "Version: %d";
-                                p1values.vlength = 4;
-                                p1values.hfname = hf_nds_ver;
-                                p1values.voffset = foffset;
-                                foffset = foffset+p1values.vlength;
-                                p2values.vvalue = tvb_get_letohl(tvb, foffset);
-                                nds_version = p2values.vvalue;
-                                p2values.vstring = "";
-                                p2values.vtype = 3; /* Uint32 */
-                                p2values.vdesc = "Flags: 0x%08x";
-                                p2values.vlength = 4;
-                                p2values.hfname = hf_nds_req_flags;
-                                p2values.voffset = foffset;
-                                foffset = foffset+p2values.vlength;
-                                p3values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p3values.vstring = "";
-                                p3values.vtype = 3; /* Uint32 */
-                                p3values.vdesc = "Child Partition Root ID: 0x%08x";
-                                p3values.vlength = 4;
-                                p3values.voffset = foffset;
-                                p3values.hfname= hf_nds_child_part_id;
-                                foffset = foffset+p3values.vlength;
+                                pvalues[0].vvalue = tvb_get_letohl(tvb, foffset);
+                                nds_version = pvalues[0].vvalue;
+                                pvalues[0].vtype = VTYPE_UINT32;
+                                pvalues[0].vdesc = "Version: %u";
+                                pvalues[0].vlength = 4;
+                                pvalues[0].hfname = hf_nds_ver;
+                                pvalues[0].voffset = foffset;
+                                foffset = foffset+pvalues[0].vlength;
+                                pvalues[1].vvalue = tvb_get_letohl(tvb, foffset);
+                                nds_version = pvalues[1].vvalue;
+                                pvalues[1].vtype = VTYPE_UINT32;
+                                pvalues[1].vdesc = "Flags: 0x%08x";
+                                pvalues[1].vlength = 4;
+                                pvalues[1].hfname = hf_nds_req_flags;
+                                pvalues[1].voffset = foffset;
+                                foffset = foffset+pvalues[1].vlength;
+                                pvalues[2].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[2].vtype = VTYPE_UINT32;
+                                pvalues[2].vdesc = "Child Partition Root ID: 0x%08x";
+                                pvalues[2].vlength = 4;
+                                pvalues[2].voffset = foffset;
+                                pvalues[2].hfname= hf_nds_child_part_id;
+                                foffset = foffset+pvalues[2].vlength;
                                 break;
                         case 0x19:    
-                                verb_string = "Add Replica";
-                                p1values.vvalue = tvb_get_letohl(tvb, foffset);
-                                nds_version = p1values.vvalue;
-                                p1values.vstring = "";
-                                p1values.vtype = 3; /* Uint32 */
-                                p1values.vdesc = "Version: %d";
-                                p1values.vlength = 4;
-                                p1values.hfname = hf_nds_ver;
-                                p1values.voffset = foffset;
-                                foffset = foffset+p1values.vlength;
-                                p2values.vvalue = tvb_get_letohl(tvb, foffset);
-                                nds_version = p2values.vvalue;
-                                p2values.vstring = "";
-                                p2values.vtype = 3; /* Uint32 */
-                                p2values.vdesc = "Flags: 0x%08x";
-                                p2values.vlength = 4;
-                                p2values.hfname = hf_nds_req_flags;
-                                p2values.voffset = foffset;
-                                foffset = foffset+p2values.vlength;
-                                p3values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p3values.vstring = "";
-                                p3values.vtype = 3; /* Uint32 */
-                                p3values.vdesc = "Master Partition Root ID: 0x%08x";
-                                p3values.vlength = 4;
-                                p3values.voffset = foffset;
-                                p3values.hfname= hf_nds_master_part_id;
-                                foffset = foffset+p3values.vlength;
-                                p4values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p4values.vstring = match_strval(p4values.vvalue, nds_replica_type);
-                                if(p4values.vstring == NULL)
+                                pvalues[0].vvalue = tvb_get_letohl(tvb, foffset);
+                                nds_version = pvalues[0].vvalue;
+                                pvalues[0].vtype = VTYPE_UINT32;
+                                pvalues[0].vdesc = "Version: %u";
+                                pvalues[0].vlength = 4;
+                                pvalues[0].hfname = hf_nds_ver;
+                                pvalues[0].voffset = foffset;
+                                foffset = foffset+pvalues[0].vlength;
+                                pvalues[1].vvalue = tvb_get_letohl(tvb, foffset);
+                                nds_version = pvalues[1].vvalue;
+                                pvalues[1].vtype = VTYPE_UINT32;
+                                pvalues[1].vdesc = "Flags: 0x%08x";
+                                pvalues[1].vlength = 4;
+                                pvalues[1].hfname = hf_nds_req_flags;
+                                pvalues[1].voffset = foffset;
+                                foffset = foffset+pvalues[1].vlength;
+                                pvalues[2].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[2].vtype = VTYPE_UINT32;
+                                pvalues[2].vdesc = "Master Partition Root ID: 0x%08x";
+                                pvalues[2].vlength = 4;
+                                pvalues[2].voffset = foffset;
+                                pvalues[2].hfname= hf_nds_master_part_id;
+                                foffset = foffset+pvalues[2].vlength;
+                                pvalues[3].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[3].vstring = match_strval(pvalues[3].vvalue, nds_replica_type);
+                                if(pvalues[3].vstring == NULL)
                                 {
-                                        p4values.vstring = "No Replica Type Found";
+                                        pvalues[3].vstring = "No Replica Type Found";
                                 }
-                                p4values.vtype = 4; /* String */
-                                p4values.vdesc = "Replica Type: %s";
-                                p4values.vlength = 4;
-                                p4values.voffset = foffset;
-                                p4values.mvtype = 0;
-                                p4values.hfname= hf_replica_type;
-                                foffset = foffset + p4values.vlength;
-                                p5values.vtype = 4; /* String */
-                                p5values.vdesc = "Target Server Name: %s";
-                                p5values.vstring = "";
-                                p5values.mvtype = 0;
-                                p5values.vvalue = 0;
-                                p5values.vlength = 256;
-                                p5values.vlength = tvb_get_letohl(tvb, foffset);
-                                if (p5values.vlength == 0x00)
+                                pvalues[3].vtype = VTYPE_STRING;
+                                pvalues[3].vdesc = "Replica Type: %s";
+                                pvalues[3].vlength = 4;
+                                pvalues[3].voffset = foffset;
+                                pvalues[3].mvtype = 0;
+                                pvalues[3].hfname= hf_replica_type;
+                                foffset = foffset + pvalues[3].vlength;
+                                pvalues[4].vtype = VTYPE_STRING;
+                                pvalues[4].vdesc = "Target Server Name: %s";
+                                pvalues[4].mvtype = 0;
+                                pvalues[4].vvalue = 0;
+                                pvalues[4].vlength = 256;
+                                pvalues[4].vlength = tvb_get_letohl(tvb, foffset);
+                                if (pvalues[4].vlength == 0x00)
                                 {
-                                        p5values.vtype = 0;
+                                        pvalues[4].vtype = VTYPE_NONE;
                                         break;
                                 }
-                                p5values.voffset = foffset+4;
+                                pvalues[4].voffset = foffset+4;
                                 foffset = foffset + 4;
-                                get_string(tvb, p5values.voffset, p5values.vlength, p5values.vstring);
-                                p5values.hfname= hf_nds_target_name;
+                                get_string(tvb, pvalues[4].voffset, pvalues[4].vlength, pvalues[4].vstring);
+                                pvalues[4].hfname= hf_nds_target_name;
                                 break;
                         case 0x1a:    
-                                verb_string = "Remove Replica";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x1b:    
-                                verb_string = "Open Stream -> ";
-                                p1values.vvalue = tvb_get_letohl(tvb, foffset);
-                                nds_version = p1values.vvalue;
-                                p1values.vstring = "";
-                                p1values.vtype = 3; /* Uint32 */
-                                p1values.vdesc = "Version: %d";
-                                p1values.vlength = 4;
-                                p1values.hfname = hf_nds_ver;
-                                p1values.voffset = foffset;
-                                foffset = foffset+p1values.vlength;
-                                p2values.vvalue = tvb_get_letohl(tvb, foffset);
-                                nds_version = p2values.vvalue;
-                                p2values.vstring = "";
-                                p2values.vtype = 3; /* Uint32 */
-                                p2values.vdesc = "Streams Flags: 0x%08x";
-                                p2values.vlength = 4;
-                                p2values.hfname = hf_nds_stream_flags;
-                                p2values.voffset = foffset;
-                                foffset = foffset+p2values.vlength;
-                                p3values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p3values.vstring = "";
-                                p3values.vtype = 3; /* Uint32 */
-                                p3values.vdesc = "Entry ID: 0x%08x";
-                                p3values.vlength = 4;
+                                pvalues[0].vvalue = tvb_get_letohl(tvb, foffset);
+                                nds_version = pvalues[0].vvalue;
+                                pvalues[0].vtype = VTYPE_UINT32;
+                                pvalues[0].vdesc = "Version: %u";
+                                pvalues[0].vlength = 4;
+                                pvalues[0].hfname = hf_nds_ver;
+                                pvalues[0].voffset = foffset;
+                                foffset = foffset+pvalues[0].vlength;
+                                pvalues[1].vvalue = tvb_get_letohl(tvb, foffset);
+                                nds_version = pvalues[1].vvalue;
+                                pvalues[1].vtype = VTYPE_UINT32;
+                                pvalues[1].vdesc = "Streams Flags: 0x%08x";
+                                pvalues[1].vlength = 4;
+                                pvalues[1].hfname = hf_nds_stream_flags;
+                                pvalues[1].voffset = foffset;
+                                foffset = foffset+pvalues[1].vlength;
+                                pvalues[2].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[2].vtype = VTYPE_UINT32;
+                                pvalues[2].vdesc = "Entry ID: 0x%08x";
+                                pvalues[2].vlength = 4;
                                 resolve_eid = TRUE;
-                                global_eid = p3values.vvalue;
-                                p3values.voffset = foffset;
-                                p3values.hfname= hf_nds_eid;
-                                foffset = foffset+p3values.vlength;
-                                p4values.vtype = 4; /* String */
-                                p4values.vdesc = "Stream Name: %s";
-                                p4values.vstring = "";
-                                p4values.mvtype = 1;
-                                p4values.vvalue = 0;
-                                p4values.vlength = 256;
-                                p4values.vlength = tvb_get_letohl(tvb, foffset);
-                                if (p4values.vlength == 0x00)
+                                global_eid = pvalues[2].vvalue;
+                                pvalues[2].voffset = foffset;
+                                pvalues[2].hfname= hf_nds_eid;
+                                foffset = foffset+pvalues[2].vlength;
+                                pvalues[3].vtype = VTYPE_STRING;
+                                pvalues[3].vdesc = "Stream Name: %s";
+                                pvalues[3].mvtype = MVTYPE_ATTR_REQUEST;
+                                pvalues[3].vvalue = 0;
+                                pvalues[3].vlength = 256;
+                                pvalues[3].vlength = tvb_get_letohl(tvb, foffset);
+                                if (pvalues[3].vlength == 0x00)
                                 {
-                                        p4values.vtype = 0;
+                                        pvalues[3].vtype = VTYPE_NONE;
                                         break;
                                 }
-                                p4values.voffset = foffset+4;
+                                pvalues[3].voffset = foffset+4;
                                 foffset += 4;
-                                get_string(tvb, p4values.voffset, p4values.vlength, p4values.vstring);
-                                foffset += p4values.vlength;
+                                get_string(tvb, pvalues[3].voffset, pvalues[3].vlength, pvalues[3].vstring);
+                                foffset += pvalues[3].vlength;
                                 foffset += align_4(tvb, foffset);
-                                p4values.hfname= hf_nds_stream_name;
+                                pvalues[3].hfname= hf_nds_stream_name;
                                 break;
                         case 0x1c:    
-                                verb_string = "Search Filter";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x1d:    
-                                verb_string = "Create Subordinate Reference";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x1e:    
-                                verb_string = "Link Replica";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x1f:    
-                                verb_string = "Change Replica Type";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x20:    
-                                verb_string = "Start Update Schema";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x21:    
-                                verb_string = "End Update Schema";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x22:    
-                                verb_string = "Update Schema";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x23:    
-                                verb_string = "Start Update Replica";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x24:    
-                                verb_string = "End Update Replica";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x25:    
-                                verb_string = "Update Replica";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x26:    
-                                verb_string = "Synchronize Partition";
-                                p1values.vvalue = tvb_get_letohl(tvb, foffset);
-                                nds_version = p1values.vvalue;
-                                p1values.vstring = "";
-                                p1values.vtype = 3; /* Uint32 */
-                                p1values.vdesc = "Version: %d";
-                                p1values.vlength = 4;
-                                p1values.hfname = hf_nds_ver;
-                                p1values.voffset = foffset;
-                                foffset = foffset+p1values.vlength;
-                                p2values.vvalue = tvb_get_letohl(tvb, foffset);
-                                nds_version = p2values.vvalue;
-                                p2values.vstring = "";
-                                p2values.vtype = 3; /* Uint32 */
-                                p2values.vdesc = "Flags: 0x%08x";
-                                p2values.vlength = 4;
-                                p2values.hfname = hf_nds_req_flags;
-                                p2values.voffset = foffset;
-                                foffset = foffset+p2values.vlength;
-                                p3values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p3values.vstring = "";
-                                p3values.vtype = 3; /* Uint32 */
-                                p3values.vdesc = "Time Delay in Seconds: %d";
-                                p3values.vlength = 4;
-                                p3values.voffset = foffset;
-                                p3values.hfname= hf_nds_time_delay;
-                                foffset = foffset+p3values.vlength;
-                                if(p1values.vvalue == 0)
+                                pvalues[0].vvalue = tvb_get_letohl(tvb, foffset);
+                                nds_version = pvalues[0].vvalue;
+                                pvalues[0].vtype = VTYPE_UINT32;
+                                pvalues[0].vdesc = "Version: %u";
+                                pvalues[0].vlength = 4;
+                                pvalues[0].hfname = hf_nds_ver;
+                                pvalues[0].voffset = foffset;
+                                foffset = foffset+pvalues[0].vlength;
+                                pvalues[1].vvalue = tvb_get_letohl(tvb, foffset);
+                                nds_version = pvalues[1].vvalue;
+                                pvalues[1].vtype = VTYPE_UINT32;
+                                pvalues[1].vdesc = "Flags: 0x%08x";
+                                pvalues[1].vlength = 4;
+                                pvalues[1].hfname = hf_nds_req_flags;
+                                pvalues[1].voffset = foffset;
+                                foffset = foffset+pvalues[1].vlength;
+                                pvalues[2].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[2].vtype = VTYPE_UINT32;
+                                pvalues[2].vdesc = "Time Delay in Seconds: %u";
+                                pvalues[2].vlength = 4;
+                                pvalues[2].voffset = foffset;
+                                pvalues[2].hfname= hf_nds_time_delay;
+                                foffset = foffset+pvalues[2].vlength;
+                                if(pvalues[0].vvalue == 0)
                                 {
-                                        p4values.vtype = 4; /* String */
-                                        p4values.vdesc = "Root Most Object Name: %s";
-                                        p4values.vstring = "";
-                                        p4values.mvtype = 1;
-                                        p4values.vvalue = 0;
-                                        p4values.vlength = 256;
-                                        p4values.vlength = tvb_get_letohl(tvb, foffset);
-                                        if (p4values.vlength == 0x00)
+                                        pvalues[3].vtype = VTYPE_STRING;
+                                        pvalues[3].vdesc = "Root Most Object Name: %s";
+                                        pvalues[3].mvtype = MVTYPE_ATTR_REQUEST;
+                                        pvalues[3].vvalue = 0;
+                                        pvalues[3].vlength = 256;
+                                        pvalues[3].vlength = tvb_get_letohl(tvb, foffset);
+                                        if (pvalues[3].vlength == 0x00)
                                         {
-                                                p4values.vtype = 0;
+                                                pvalues[3].vtype = VTYPE_NONE;
                                                 break;
                                         }
-                                        p4values.voffset = foffset+4;
+                                        pvalues[3].voffset = foffset+4;
                                         foffset += 4;
-                                        get_string(tvb, p4values.voffset, p4values.vlength, p4values.vstring);
-                                        foffset += p4values.vlength;
+                                        get_string(tvb, pvalues[3].voffset, pvalues[3].vlength, pvalues[3].vstring);
+                                        foffset += pvalues[3].vlength;
                                         foffset += align_4(tvb, foffset);
-                                        p4values.hfname= hf_nds_root_name;
+                                        pvalues[3].hfname= hf_nds_root_name;
                                 }
                                 else
                                 {
-                                        p4values.vvalue = tvb_get_letohl(tvb, foffset);
-                                        p4values.vstring = "";
-                                        p4values.vtype = 3; /* Uint32 */
-                                        p4values.vdesc = "Entry ID: 0x%08x";
-                                        p4values.vlength = 4;
+                                        pvalues[3].vvalue = tvb_get_letohl(tvb, foffset);
+                                        pvalues[3].vtype = VTYPE_UINT32;
+                                        pvalues[3].vdesc = "Entry ID: 0x%08x";
+                                        pvalues[3].vlength = 4;
                                         resolve_eid = TRUE;
-                                        global_eid = p4values.vvalue;
-                                        p4values.voffset = foffset;
-                                        p4values.hfname= hf_nds_eid;
-                                        foffset = foffset+p4values.vlength;
+                                        global_eid = pvalues[3].vvalue;
+                                        pvalues[3].voffset = foffset;
+                                        pvalues[3].hfname= hf_nds_eid;
+                                        foffset = foffset+pvalues[3].vlength;
                                         resolve_eid = TRUE;
-                                        global_eid = p4values.vvalue;
+                                        global_eid = pvalues[3].vvalue;
                                 }
                                 break;
                         case 0x27:    
-                                verb_string = "Synchronize Schema";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x28:    
-                                verb_string = "Read Syntaxes";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x29:    
-                                verb_string = "Get Replica Root ID";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x2a:    
-                                verb_string = "Begin Move Entry";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x2b:    
-                                verb_string = "Finish Move Entry";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x2c:    
-                                verb_string = "Release Moved Entry";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x2d:    
-                                verb_string = "Backup Entry";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x2e:    
-                                verb_string = "Restore Entry";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x2f:    
-                                verb_string = "Save DIB";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x30:
-                                verb_string = "Control";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x31:
-                                verb_string = "Remove Backlink";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x32:    
-                                verb_string = "Close Iteration";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x33:    
-                                verb_string = "Mutate Entry";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x34:    
-                                verb_string = "Audit Skulking";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x35:    
-                                verb_string = "Get Server Address";
-                                p1values.vvalue = 0;
+                                pvalues[0].vvalue = 0;
                                 break;
                         case 0x36:    
-                                verb_string = "Set Keys";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x37:    
-                                verb_string = "Change Password";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x38:    
-                                verb_string = "Verify Password";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x39:    
-                                verb_string = "Begin Login";
-                                p1values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p1values.vstring = "";
-                                p1values.vtype = 3; /* Uint32 */
-                                p1values.vdesc = "Version: %d";
-                                p1values.vlength = 4;
-                                p1values.voffset = foffset;
-                                p1values.hfname= hf_nds_ver;
-                                foffset = foffset+p1values.vlength;
-                                p2values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p2values.vstring = "";
-                                p2values.vtype = 3; /* Uint32 */
-                                p2values.vdesc = "Entry ID: 0x%08x";
-                                p2values.vlength = 4;
+                                pvalues[0].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[0].vtype = VTYPE_UINT32;
+                                pvalues[0].vdesc = "Version: %u";
+                                pvalues[0].vlength = 4;
+                                pvalues[0].voffset = foffset;
+                                pvalues[0].hfname= hf_nds_ver;
+                                foffset = foffset+pvalues[0].vlength;
+                                pvalues[1].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[1].vtype = VTYPE_UINT32;
+                                pvalues[1].vdesc = "Entry ID: 0x%08x";
+                                pvalues[1].vlength = 4;
                                 resolve_eid = TRUE;
-                                global_eid = p2values.vvalue;
-                                p2values.voffset = foffset;
-                                p2values.hfname= hf_nds_eid;
-                                foffset = foffset+p2values.vlength;
+                                global_eid = pvalues[1].vvalue;
+                                pvalues[1].voffset = foffset;
+                                pvalues[1].hfname= hf_nds_eid;
+                                foffset = foffset+pvalues[1].vlength;
                                 break;
                         case 0x3a:    
-                                verb_string = "Finish Login";
-                                p1values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p1values.vstring = "";
-                                p1values.vtype = 3; /* Uint32 */
-                                p1values.vdesc = "Reply Buffer Size: %d";
-                                p1values.vlength = 4;
-                                p1values.voffset = foffset;
-                                p1values.hfname= hf_nds_buffer_size;
-                                foffset = foffset+p1values.vlength;
-                                p2values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p2values.vstring = "";
-                                p2values.vtype = 3; /* Uint32 */
-                                p2values.vdesc = "Version: %d";
-                                p2values.vlength = 4;
-                                p2values.voffset = foffset;
-                                p2values.hfname= hf_nds_ver;
-                                foffset = foffset+p2values.vlength;
-                                p3values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p3values.vstring = "";
-                                p3values.vtype = 3; /* Uint32 */
-                                p3values.vdesc = "Entry ID: 0x%08x";
-                                p3values.vlength = 4;
+                                pvalues[0].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[0].vtype = VTYPE_UINT32;
+                                pvalues[0].vdesc = "Reply Buffer Size: %u";
+                                pvalues[0].vlength = 4;
+                                pvalues[0].voffset = foffset;
+                                pvalues[0].hfname= hf_nds_buffer_size;
+                                foffset = foffset+pvalues[0].vlength;
+                                pvalues[1].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[1].vtype = VTYPE_UINT32;
+                                pvalues[1].vdesc = "Version: %u";
+                                pvalues[1].vlength = 4;
+                                pvalues[1].voffset = foffset;
+                                pvalues[1].hfname= hf_nds_ver;
+                                foffset = foffset+pvalues[1].vlength;
+                                pvalues[2].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[2].vtype = VTYPE_UINT32;
+                                pvalues[2].vdesc = "Entry ID: 0x%08x";
+                                pvalues[2].vlength = 4;
                                 resolve_eid = TRUE;
-                                global_eid = p3values.vvalue;
-                                p3values.voffset = foffset;
-                                p3values.hfname= hf_nds_eid;
-                                foffset = foffset+p3values.vlength;
+                                global_eid = pvalues[2].vvalue;
+                                pvalues[2].voffset = foffset;
+                                pvalues[2].hfname= hf_nds_eid;
+                                foffset = foffset+pvalues[2].vlength;
                                 break;
                         case 0x3b:    
-                                verb_string = "Begin Authentication";
-                                p1values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p1values.vstring = "";
-                                p1values.vtype = 3; /* Uint32 */
-                                p1values.vdesc = "Version: %d";
-                                p1values.vlength = 4;
-                                p1values.voffset = foffset;
-                                p1values.hfname= hf_nds_ver;
-                                foffset = foffset+p1values.vlength;
-                                p2values.vvalue = tvb_get_letohl(tvb, foffset);
-                                p2values.vstring = "";
-                                p2values.vtype = 3; /* Uint32 */
-                                p2values.vdesc = "Entry ID: 0x%08x";
-                                p2values.vlength = 4;
+                                pvalues[0].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[0].vtype = VTYPE_UINT32;
+                                pvalues[0].vdesc = "Version: %u";
+                                pvalues[0].vlength = 4;
+                                pvalues[0].voffset = foffset;
+                                pvalues[0].hfname= hf_nds_ver;
+                                foffset = foffset+pvalues[0].vlength;
+                                pvalues[1].vvalue = tvb_get_letohl(tvb, foffset);
+                                pvalues[1].vtype = VTYPE_UINT32;
+                                pvalues[1].vdesc = "Entry ID: 0x%08x";
+                                pvalues[1].vlength = 4;
                                 resolve_eid = TRUE;
-                                global_eid = p2values.vvalue;
-                                p2values.voffset = foffset;
-                                p2values.hfname= hf_nds_eid;
-                                foffset = foffset+p2values.vlength;
+                                global_eid = pvalues[1].vvalue;
+                                pvalues[1].voffset = foffset;
+                                pvalues[1].hfname= hf_nds_eid;
+                                foffset = foffset+pvalues[1].vlength;
                                 break;
                         case 0x3c:    
-                                verb_string = "Finish Authentication";
                                 break;
                         case 0x3d:    
-                                verb_string = "Logout";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x3e:    
-                                verb_string = "Repair Ring";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x3f:    
-                                verb_string = "Repair Timestamps";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x40:    
-                                verb_string = "Create Back Link";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x41:    
-                                verb_string = "Delete External Reference";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x42:    
-                                verb_string = "Rename External Reference";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x43:    
-                                verb_string = "Create Directory Entry";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x44:    
-                                verb_string = "Remove Directory Entry";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x45:    
-                                verb_string = "Designate New Master";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x46:    
-                                verb_string = "Change Tree Name";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x47:    
-                                verb_string = "Partition Entry Count";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x48:    
-                                verb_string = "Check Login Restrictions";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x49:    
-                                verb_string = "Start Join";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x4a:    
-                                verb_string = "Low Level Split";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x4b:    
-                                verb_string = "Low Level Join";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x4c:    
-                                verb_string = "Abort Low Level Join";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                         case 0x4d:    
-                                verb_string = "Get All Servers";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                                 break;
                                default:
-                                       verb_string = "NDS Continuation Fragment";
-                                p1values.vtype = 0; /* Not Defined */
+                                pvalues[0].vtype = VTYPE_NONE; /* Not Defined */
                        }
         }
         /* Fill in the INFO column. */
         if (check_col(pinfo->cinfo, COL_INFO)) {
                if (ncp_rec) {
-                      
                        col_set_str(pinfo->cinfo, COL_PROTOCOL, "NDS");
                         if (nds_frag != 0xffffffff) {
                                 col_add_fstr(pinfo->cinfo, COL_INFO, "C Continue NDS Fragment %08x", nds_frag);
@@ -7601,6 +8180,7 @@ dissect_nds_request(tvbuff_t *tvb, packet_info *pinfo,
                         else {
                                        col_add_fstr(pinfo->cinfo, COL_INFO, "C NDS %s", verb_string);
                        }
+                       run_info_str = TRUE;
                 }
                        else {
                        col_add_fstr(pinfo->cinfo, COL_INFO,
@@ -7609,29 +8189,29 @@ dissect_nds_request(tvbuff_t *tvb, packet_info *pinfo,
                        }
                         
         }
-        if (!pinfo->fd->flags.visited) {
-                
-                       /* This is the first time we've looked at this packet.
-                       Keep track of the address and connection whence the request
-                       came, and the address and connection to which the request
-                       is being sent, so that we can match up calls with replies.
-                       (We don't include the sequence number, as we may want
-                       to have all packets over the same connection treated
-               as being part of a single conversation so that we can
-                let the user select that conversation to be displayed.) */
-                        
-               conversation = find_conversation(&pinfo->src, &pinfo->dst,
+
+        /* Keep track of the address and connection whence the request
+           came, and the address and connection to which the request
+           is being sent, so that we can match up calls with replies.
+           (We don't include the sequence number, as we may want
+           to have all packets over the same connection treated
+           as being part of a single conversation so that we can
+           let the user select that conversation to be displayed.) */
+
+        conversation = find_conversation(&pinfo->src, &pinfo->dst,
                    PT_NCP, nw_connection, nw_connection, 0);
+               if (conversation == NULL) {
+                       /* It's not part of any conversation - create a new one. */
+                       conversation = conversation_new(&pinfo->src, &pinfo->dst,
+                           PT_NCP, nw_connection, nw_connection, 0);
+       }
                 
-               if (conversation == NULL) {
-                       /* It's not part of any conversation - create a new one. */
-                       conversation = conversation_new(&pinfo->src, &pinfo->dst,
-                           PT_NCP, nw_connection, nw_connection, 0);
-               }
-                        
+       if (!pinfo->fd->flags.visited) {
                request_value = ncp_hash_insert(conversation, sequence, ncp_rec);
                request_value->req_frame_num = pinfo->fd->num;
-                
+               request_value->req_frame_time.secs=pinfo->fd->abs_secs;
+               request_value->req_frame_time.nsecs=pinfo->fd->abs_usecs*1000;
+
                /* If this is the first time we're examining the packet,
                 * check to see if this NCP type uses a "request condition".
                 * If so, we have to build a proto_tree because request conditions
@@ -7639,17 +8219,24 @@ dissect_nds_request(tvbuff_t *tvb, packet_info *pinfo,
                 * display filters can't possibly work. If we already have
                 * a proto_tree, then wonderful. If we don't, we need to build
                 * one. */
-               if (ncp_rec) {
-                       proto_item *ti;
-                                       
-                               temp_tree = proto_tree_create_root();
-                               proto_tree_set_visible(temp_tree, FALSE);
-                               ti = proto_tree_add_item(temp_tree, proto_ncp, tvb, 0, -1, FALSE);
-                               ncp_tree = proto_item_add_subtree(ti, ett_ncp);
-                        
+               if (ncp_rec && !ncp_tree) {
+                               run_req_cond = TRUE;
                }
         }
                 
+       /* If we have to handle a request condition, or have to
+          add to the Info column, we need to construct a protocol
+          tree.  If we already have a proto_tree, then wonderful.
+          If we don't, we need to build one. */
+       if ((run_info_str || run_req_cond) && !ncp_tree) {
+               proto_item *ti;
+                                       
+               temp_tree = proto_tree_create_root();
+               proto_tree_set_visible(temp_tree, FALSE);
+               ti = proto_tree_add_item(temp_tree, proto_ncp, tvb, 0, -1, FALSE);
+               ncp_tree = proto_item_add_subtree(ti, ett_ncp);
+       }
+
         if (ncp_tree) {
                /* If the dissection throws an exception, be sure to free
                 * the temporary proto_tree that was created. Because of the
@@ -7662,10 +8249,7 @@ dissect_nds_request(tvbuff_t *tvb, packet_info *pinfo,
                          
                CLEANUP_PUSH(free_proto_tree, temp_tree);
                
-               conversation = find_conversation(&pinfo->src, &pinfo->dst,
-                   PT_NCP, nw_connection, nw_connection, 0);
-                    
-                    
+               request_value = ncp_hash_lookup(conversation, sequence);
                 
                switch (type) {
                         case NCP_BROADCAST_SLOT:
@@ -7688,8 +8272,7 @@ dissect_nds_request(tvbuff_t *tvb, packet_info *pinfo,
                                        subfunc, "SubFunction: %d (0x%02x)",
                                        subfunc, subfunc);
                                                 
-                               proto_tree_add_uint_format(ncp_tree, hf_ncp_fragment_handle, tvb, 8, 4,
-                                       nds_frag, "Fragment Handle: (0x%08x)",
+                               proto_tree_add_uint(ncp_tree, hf_ncp_fragment_handle, tvb, 8, 4,
                                        nds_frag);
                                                 
                                 if (nds_frag == 0xffffffff) {
@@ -7703,459 +8286,105 @@ dissect_nds_request(tvbuff_t *tvb, packet_info *pinfo,
                                                proto_tree_add_uint_format(ncp_tree, hf_ncp_nds_verb, tvb, 24, 4,
                                                        nds_verb, "NDS Verb: %d, (0x%02x), %s",
                                                        nds_verb, nds_verb, verb_string);
-                                        if (p1values.vtype != 0) {
-                                                switch (p1values.vtype) {
-                                                        case 1:         /* uint8 */
-                                                               proto_tree_add_uint_format(ncp_tree, p1values.hfname, tvb, p1values.voffset,
-                                                                p1values.vlength, p1values.vtype, "NDS Parameter not defined %d",
-                                                               p1values.vtype);
-                                                                break;
-                                                        case 2:         /* uint16 */
-                                                               proto_tree_add_uint_format(ncp_tree, p1values.hfname, tvb, p1values.voffset,
-                                                                p1values.vlength, p1values.vtype, "NDS Parameter not defined %d",
-                                                               p1values.vtype);
-                                                                break;
-                                                        case 3:         /* uint32 */
-                                                               proto_tree_add_uint_format(ncp_tree, p1values.hfname, tvb, p1values.voffset,
-                                                                p1values.vlength, p1values.vvalue, p1values.vdesc,
-                                                               p1values.vvalue);
-                                                                break;
-                                                        case 4:         /* string */
-                                                                proto_tree_add_string_format(ncp_tree, p1values.hfname, tvb, p1values.voffset, 
-                                                                p1values.vlength, p1values.vstring, p1values.vdesc, p1values.vstring);
-                                                                if (p1values.mvtype == 1)
-                                                                {
-                                                                        if (check_col(pinfo->cinfo, COL_INFO)) 
-                                                                        {
-                                                                                col_append_str(pinfo->cinfo, COL_INFO, p1values.vstring);
-                                                                        }
-                                                                }
-                                                                break;
-                                                        case 5:         /* bitfield */
-                                                                process_bitfield(ncp_tree, tvb, &p1values);
-                                                                break;
-                                                        case 6:         /*multivalue uint32 */
-                                                                process_multivalues(ncp_tree, tvb, &p1values);
-                                                                if (p1values.mvtype == 1 || p1values.mvtype == 10)
-                                                                {
-                                                                        if (p1values.mvtype == 10)
-                                                                        {
-                                                                                global_object_name = p1values.vstring;
-                                                                        }
-                                                                        if (check_col(pinfo->cinfo, COL_INFO)) 
-                                                                        {
-                                                                                col_append_str(pinfo->cinfo, COL_INFO, p1values.vstring);
-                                                                        }
-                                                                }
-                                                                break;
-                                                        case 7:         /* Bytes */
-                                                                proto_tree_add_bytes(ncp_tree, p1values.hfname, tvb, p1values.voffset,
-                                                                p1values.vlength, tvb_get_ptr(tvb, p1values.voffset, p1values.vvalue));
-                                                                break;
-                                                        case 8:
-                                                               proto_tree_add_item(ncp_tree, p1values.hfname, tvb, p1values.voffset, p1values.vlength, TRUE);
-                                                                break;
-                                                        default:
-                                                               proto_tree_add_uint_format(ncp_tree, hf_nds_p1type, tvb, p1values.voffset,
-                                                                p1values.vlength, p1values.vtype, "NDS Parameter not defined %d",
-                                                               p1values.vtype);
-                                                                break;
-                                                }
-                                                switch (p2values.vtype) {
-                                                        case 1:         /* uint8 */
-                                                                break;
-                                                        case 2:         /* uint16 */
-                                                                break;
-                                                        case 3:         /* uint32 */
-                                                               proto_tree_add_uint_format(ncp_tree, p2values.hfname, tvb, p2values.voffset,
-                                                                p2values.vlength, p2values.vvalue, p2values.vdesc,
-                                                               p2values.vvalue);
-                                                                break;
-                                                        case 4:         /* string */
-                                                                proto_tree_add_string_format(ncp_tree, p2values.hfname, tvb, p2values.voffset, 
-                                                                p2values.vlength, p2values.vstring, p2values.vdesc, p2values.vstring);
-                                                                if (p2values.mvtype == 1)
-                                                                {
-                                                                        if (check_col(pinfo->cinfo, COL_INFO)) 
-                                                                        {
-                                                                                col_append_str(pinfo->cinfo, COL_INFO, p2values.vstring);
-                                                                        }
-                                                                }
-                                                                break;
-                                                        case 5:         /* boolean */
-                                                                process_bitfield(ncp_tree, tvb, &p2values);
-                                                                break;
-                                                        case 6:         /*multivalue uint32 */
-                                                                process_multivalues(ncp_tree, tvb, &p2values);
-                                                                if (p2values.mvtype == 1 || p2values.mvtype == 10)
-                                                                {
-                                                                        if (p2values.mvtype == 10)
-                                                                        {
-                                                                                global_object_name = p1values.vstring;
-                                                                        }
-                                                                        if (check_col(pinfo->cinfo, COL_INFO)) 
-                                                                        {
-                                                                                col_append_str(pinfo->cinfo, COL_INFO, p2values.vstring);
-                                                                        }
-                                                                }
-                                                                break;
-                                                        case 7:         /* Bytes */
-                                                                proto_tree_add_bytes(ncp_tree, p2values.hfname, tvb, p2values.voffset,
-                                                                p2values.vlength, tvb_get_ptr(tvb, p2values.voffset, p2values.vvalue));
-                                                                break;
-                                                        case 8:
-                                                               proto_tree_add_item(ncp_tree, p2values.hfname, tvb, p2values.voffset, p2values.vlength, TRUE);
-                                                                break;
-                                                        default:
-                                                                break;
-                                                }
-                                                switch (p3values.vtype) {
-                                                        case 1:         /* uint8 */
-                                                                break;
-                                                        case 2:         /* uint16 */
-                                                                break;
-                                                        case 3:         /* uint32 */
-                                                               proto_tree_add_uint_format(ncp_tree, p3values.hfname, tvb, p3values.voffset,
-                                                                p3values.vlength, p3values.vvalue, p3values.vdesc,
-                                                               p3values.vvalue);
-                                                                break;
-                                                        case 4:         /* string */
-                                                                proto_tree_add_string_format(ncp_tree, p3values.hfname, tvb, p3values.voffset, 
-                                                                p3values.vlength, p3values.vstring, p3values.vdesc, p3values.vstring);
-                                                                if (p3values.mvtype == 1)
-                                                                {
-                                                                        if (check_col(pinfo->cinfo, COL_INFO)) 
-                                                                        {
-                                                                                col_append_str(pinfo->cinfo, COL_INFO, p3values.vstring);
-                                                                        }
-                                                                }
-                                                                break;
-                                                        case 5:         /* boolean */
-                                                                process_bitfield(ncp_tree, tvb, &p3values);
-                                                                break;
-                                                        case 6:         /*multivalue uint32 */
-                                                                process_multivalues(ncp_tree, tvb, &p3values);
-                                                                if (p3values.mvtype == 1 || p3values.mvtype == 10)
-                                                                {
-                                                                        if (p3values.mvtype == 10)
-                                                                        {
-                                                                                global_object_name = p3values.vstring;
-                                                                        }
-                                                                        if (check_col(pinfo->cinfo, COL_INFO)) 
-                                                                        {
-                                                                                col_append_str(pinfo->cinfo, COL_INFO, p3values.vstring);
-                                                                        }
-                                                                }
-                                                                break;
-                                                        case 7:         /* Bytes */
-                                                                proto_tree_add_bytes(ncp_tree, p3values.hfname, tvb, p3values.voffset,
-                                                                p3values.vlength, tvb_get_ptr(tvb, p3values.voffset, p3values.vvalue));
-                                                                break;
-                                                        case 8:
-                                                               proto_tree_add_item(ncp_tree, p3values.hfname, tvb, p3values.voffset, p3values.vlength, TRUE);
-                                                                break;
-                                                        default:
-                                                                break;
-                                                }
-                                                switch (p4values.vtype) {
-                                                        case 1:         /* uint8 */
-                                                                break;
-                                                        case 2:         /* uint16 */
-                                                                break;
-                                                        case 3:         /* uint32 */
-                                                               proto_tree_add_uint_format(ncp_tree, p4values.hfname, tvb, p4values.voffset,
-                                                                p4values.vlength, p4values.vvalue, p4values.vdesc,
-                                                               p4values.vvalue);
-                                                                break;
-                                                        case 4:         /* string */
-                                                                proto_tree_add_string_format(ncp_tree, p4values.hfname, tvb, p4values.voffset, 
-                                                                p4values.vlength, p4values.vstring, p4values.vdesc, p4values.vstring);
-                                                                if (p4values.mvtype == 1)
-                                                                {
-                                                                        if (check_col(pinfo->cinfo, COL_INFO)) 
-                                                                        {
-                                                                                col_append_str(pinfo->cinfo, COL_INFO, p4values.vstring);
-                                                                        }
-                                                                }
-                                                                break;
-                                                        case 5:         /* boolean */
-                                                                process_bitfield(ncp_tree, tvb, &p4values);
-                                                                break;
-                                                        case 6:         /*multivalue uint32 */
-                                                                process_multivalues(ncp_tree, tvb, &p4values);
-                                                                if (p4values.mvtype == 1 || p4values.mvtype == 10)
-                                                                {
-                                                                        if (p4values.mvtype == 10)
-                                                                        {
-                                                                                global_object_name = p4values.vstring;
-                                                                        }
-                                                                        if (check_col(pinfo->cinfo, COL_INFO)) 
-                                                                        {
-                                                                                col_append_str(pinfo->cinfo, COL_INFO, p4values.vstring);
-                                                                        }
-                                                                }
-                                                                break;
-                                                        case 7:         /* Bytes */
-                                                                proto_tree_add_bytes(ncp_tree, p4values.hfname, tvb, p4values.voffset,
-                                                                p4values.vlength, tvb_get_ptr(tvb, p4values.voffset, p4values.vvalue));
-                                                                break;
-                                                        case 8:
-                                                               proto_tree_add_item(ncp_tree, p4values.hfname, tvb, p4values.voffset, p4values.vlength, TRUE);
-                                                                break;
-                                                        default:
-                                                                break;
-                                                }
-                                                switch (p5values.vtype) {
-                                                        case 1:         /* uint8 */
-                                                                break;
-                                                        case 2:         /* uint16 */
-                                                                break;
-                                                        case 3:         /* uint32 */
-                                                               proto_tree_add_uint_format(ncp_tree, p5values.hfname, tvb, p5values.voffset,
-                                                                p5values.vlength, p5values.vvalue, p5values.vdesc,
-                                                               p5values.vvalue);
-                                                                break;
-                                                        case 4:         /* string */
-                                                                proto_tree_add_string_format(ncp_tree, p5values.hfname, tvb, p5values.voffset, 
-                                                                p5values.vlength, p5values.vstring, p5values.vdesc, p5values.vstring);
-                                                                if (p5values.mvtype == 1 || p5values.mvtype == 10)
-                                                                {
-                                                                        if (p5values.mvtype == 10)
-                                                                        {
-                                                                                global_object_name = p5values.vstring;
-                                                                        }
-                                                                        if (check_col(pinfo->cinfo, COL_INFO)) 
-                                                                        {
-                                                                                col_append_str(pinfo->cinfo, COL_INFO, p5values.vstring);
-                                                                        }
-                                                                }
-                                                                break;
-                                                        case 5:         /* boolean */
-                                                                process_bitfield(ncp_tree, tvb, &p5values);
-                                                                break;
-                                                        case 6:         /*multivalue uint32 */
-                                                                process_multivalues(ncp_tree, tvb, &p5values);
-                                                                if (p5values.mvtype == 1)
-                                                                {
-                                                                        if (check_col(pinfo->cinfo, COL_INFO)) 
-                                                                        {
-                                                                                col_append_str(pinfo->cinfo, COL_INFO, p5values.vstring);
-                                                                        }
-                                                                }
-                                                                break;
-                                                        case 7:         /* Bytes */
-                                                                proto_tree_add_bytes(ncp_tree, p5values.hfname, tvb, p5values.voffset,
-                                                                p5values.vlength, tvb_get_ptr(tvb, p5values.voffset, p5values.vvalue));
-                                                                break;
-                                                        case 8:
-                                                               proto_tree_add_item(ncp_tree, p5values.hfname, tvb, p5values.voffset, p5values.vlength, TRUE);
-                                                                break;
-                                                        default:
-                                                                break;
-                                                }
-                                                switch (p6values.vtype) {
-                                                        case 1:         /* uint8 */
-                                                                break;
-                                                        case 2:         /* uint16 */
-                                                                break;
-                                                        case 3:         /* uint32 */
-                                                               proto_tree_add_uint_format(ncp_tree, p6values.hfname, tvb, p6values.voffset,
-                                                                p6values.vlength, p6values.vvalue, p6values.vdesc,
-                                                               p6values.vvalue);
-                                                                break;
-                                                        case 4:         /* string */
-                                                                proto_tree_add_string_format(ncp_tree, p6values.hfname, tvb, p6values.voffset, 
-                                                                p6values.vlength, p6values.vstring, p6values.vdesc, p6values.vstring);
-                                                                if (p6values.mvtype == 1 || p6values.mvtype == 10)
-                                                                {
-                                                                        if (p6values.mvtype == 10)
-                                                                        {
-                                                                                global_object_name = p6values.vstring;
-                                                                        }
-                                                                        if (check_col(pinfo->cinfo, COL_INFO)) 
-                                                                        {
-                                                                                col_append_str(pinfo->cinfo, COL_INFO, p6values.vstring);
-                                                                        }
-                                                                }
-                                                                break;
-                                                        case 5:         /* boolean */
-                                                                process_bitfield(ncp_tree, tvb, &p6values);
-                                                                break;
-                                                        case 6:         /*multivalue uint32 */
-                                                                process_multivalues(ncp_tree, tvb, &p6values);
-                                                                if (p6values.mvtype == 1)
-                                                                {
-                                                                        if (check_col(pinfo->cinfo, COL_INFO)) 
-                                                                        {
-                                                                                col_append_str(pinfo->cinfo, COL_INFO, p6values.vstring);
-                                                                        }
-                                                                }
-                                                                break;
-                                                        case 7:         /* Bytes */
-                                                                proto_tree_add_bytes(ncp_tree, p6values.hfname, tvb, p6values.voffset,
-                                                                p6values.vlength, tvb_get_ptr(tvb, p6values.voffset, p6values.vvalue));
-                                                                break;
-                                                        case 8:
-                                                               proto_tree_add_item(ncp_tree, p6values.hfname, tvb, p6values.voffset, p6values.vlength, TRUE);
-                                                                break;
-                                                        default:
-                                                                break;
-                                                }
-                                                switch (p7values.vtype) {
-                                                        case 1:         /* uint8 */
-                                                                break;
-                                                        case 2:         /* uint16 */
-                                                                break;
-                                                        case 3:         /* uint32 */
-                                                               proto_tree_add_uint_format(ncp_tree, p7values.hfname, tvb, p7values.voffset,
-                                                                p7values.vlength, p7values.vvalue, p7values.vdesc,
-                                                               p7values.vvalue);
-                                                                break;
-                                                        case 4:         /* string */
-                                                                proto_tree_add_string_format(ncp_tree, p7values.hfname, tvb, p7values.voffset, 
-                                                                p7values.vlength, p7values.vstring, p7values.vdesc, p7values.vstring);
-                                                                if (p7values.mvtype == 1 || p7values.mvtype == 10)
-                                                                {
-                                                                        if (p7values.mvtype == 10)
-                                                                        {
-                                                                                global_object_name = p7values.vstring;
-                                                                        }
-                                                                        if (check_col(pinfo->cinfo, COL_INFO)) 
-                                                                        {
-                                                                                col_append_str(pinfo->cinfo, COL_INFO, p7values.vstring);
-                                                                        }
-                                                                }
-                                                                break;
-                                                        case 5:         /* boolean */
-                                                                process_bitfield(ncp_tree, tvb, &p7values);
-                                                                break;
-                                                        case 6:         /*multivalue uint32 */
-                                                                process_multivalues(ncp_tree, tvb, &p7values);
-                                                                if (p7values.mvtype == 1)
-                                                                {
-                                                                        if (check_col(pinfo->cinfo, COL_INFO)) 
-                                                                        {
-                                                                                col_append_str(pinfo->cinfo, COL_INFO, p7values.vstring);
-                                                                        }
-                                                                }
-                                                                break;
-                                                        case 7:         /* Bytes */
-                                                                proto_tree_add_bytes(ncp_tree, p7values.hfname, tvb, p7values.voffset,
-                                                                p7values.vlength, tvb_get_ptr(tvb, p7values.voffset, p7values.vvalue));
-                                                                break;
-                                                        case 8:
-                                                               proto_tree_add_item(ncp_tree, p7values.hfname, tvb, p7values.voffset, p7values.vlength, TRUE);
-                                                                break;
-                                                        default:
-                                                                break;
-                                                }
-                                                switch (p8values.vtype) {
-                                                        case 1:         /* uint8 */
-                                                                break;
-                                                        case 2:         /* uint16 */
-                                                                break;
-                                                        case 3:         /* uint32 */
-                                                               proto_tree_add_uint_format(ncp_tree, p8values.hfname, tvb, p8values.voffset,
-                                                                p8values.vlength, p8values.vvalue, p8values.vdesc,
-                                                               p8values.vvalue);
-                                                                break;
-                                                        case 4:         /* string */
-                                                                proto_tree_add_string_format(ncp_tree, p8values.hfname, tvb, p8values.voffset, 
-                                                                p8values.vlength, p8values.vstring, p8values.vdesc, p8values.vstring);
-                                                                if (p8values.mvtype == 1)
-                                                                {
-                                                                        if (check_col(pinfo->cinfo, COL_INFO)) 
-                                                                        {
-                                                                                col_append_str(pinfo->cinfo, COL_INFO, p8values.vstring);
-                                                                        }
-                                                                }
-                                                                break;
-                                                        case 5:         /* boolean */
-                                                                process_bitfield(ncp_tree, tvb, &p8values);
-                                                                break;
-                                                        case 6:         /*multivalue uint32 */
-                                                                process_multivalues(ncp_tree, tvb, &p8values);
-                                                                if (p8values.mvtype == 1 || p8values.mvtype == 10)
-                                                                {
-                                                                        if (p8values.mvtype == 10)
-                                                                        {
-                                                                                global_object_name = p8values.vstring;
-                                                                        }
-                                                                        if (check_col(pinfo->cinfo, COL_INFO)) 
-                                                                        {
-                                                                                col_append_str(pinfo->cinfo, COL_INFO, p8values.vstring);
-                                                                        }
-                                                                }
-                                                                break;
-                                                        case 7:         /* Bytes */
-                                                                proto_tree_add_bytes(ncp_tree, p8values.hfname, tvb, p8values.voffset,
-                                                                p8values.vlength, tvb_get_ptr(tvb, p8values.voffset, p8values.vvalue));
-                                                                break;
-                                                        case 8:
-                                                               proto_tree_add_item(ncp_tree, p8values.hfname, tvb, p8values.voffset, p8values.vlength, TRUE);
-                                                                break;
-                                                        default:
-                                                                break;
-                                                }
-                                                switch (p9values.vtype) {
-                                                        case 1:         /* uint8 */
-                                                                break;
-                                                        case 2:         /* uint16 */
-                                                                break;
-                                                        case 3:         /* uint32 */
-                                                               proto_tree_add_uint_format(ncp_tree, p9values.hfname, tvb, p9values.voffset,
-                                                                p9values.vlength, p9values.vvalue, p9values.vdesc,
-                                                               p9values.vvalue);
-                                                                break;
-                                                        case 4:         /* string */
-                                                                proto_tree_add_string_format(ncp_tree, p9values.hfname, tvb, p9values.voffset, 
-                                                                p9values.vlength, p9values.vstring, p9values.vdesc, p9values.vstring);
-                                                                if (p9values.mvtype == 1)
-                                                                {
-                                                                        if (check_col(pinfo->cinfo, COL_INFO)) 
-                                                                        {
-                                                                                col_append_str(pinfo->cinfo, COL_INFO, p9values.vstring);
-                                                                        }
-                                                                }
-                                                                break;
-                                                        case 5:         /* boolean */
-                                                                process_bitfield(ncp_tree, tvb, &p9values);
-                                                                break;
-                                                        case 6:         /*multivalue uint32 */
-                                                                process_multivalues(ncp_tree, tvb, &p9values);
-                                                                if (p9values.mvtype == 1 || p9values.mvtype == 10)
-                                                                {
-                                                                        if (p9values.mvtype == 10)
-                                                                        {
-                                                                                global_object_name = p9values.vstring;
-                                                                        }
-                                                                        if (check_col(pinfo->cinfo, COL_INFO)) 
-                                                                        {
-                                                                                col_append_str(pinfo->cinfo, COL_INFO, p9values.vstring);
-                                                                        }
-                                                                }
-                                                                break;
-                                                        case 7:         /* Bytes */
-                                                                proto_tree_add_bytes(ncp_tree, p9values.hfname, tvb, p9values.voffset,
-                                                                p9values.vlength, tvb_get_ptr(tvb, p9values.voffset, p9values.vvalue));
-                                                                break;
-                                                        case 8:
-                                                               proto_tree_add_item(ncp_tree, p9values.hfname, tvb, p9values.voffset, p9values.vlength, TRUE);
-                                                                break;
-                                                        default:
-                                                                break;
-                                                }
-                                                if(resolve_eid) {
-                
-                                                        /* For NDS requests with just an EID, resolve name from hash table. */
-                                                        request_eid_value = ncp_eid_hash_lookup(conversation, global_eid);
-                                                        if (request_eid_value) {
-                                                                global_object_name = request_eid_value->object_name;
-                                                                if (check_col(pinfo->cinfo, COL_INFO)) 
-                                                                {
-                                                                        col_append_str(pinfo->cinfo, COL_INFO, ", Object Name - ");
-                                                                        col_append_str(pinfo->cinfo, COL_INFO, global_object_name);
-                                                                }
+                                        added_arrow = FALSE;
+                                       for (i = 0; i < 9; i++) {
+                                               switch (pvalues[i].vtype) {
+
+                                               case VTYPE_NONE: /* no value */
+                                                       break;
+
+                                               case VTYPE_UINT8:
+                                                       proto_tree_add_uint_format(ncp_tree, pvalues[i].hfname, tvb, pvalues[i].voffset,
+                                                           pvalues[i].vlength, pvalues[i].vtype, "NDS Parameter not defined %d",
+                                                           pvalues[i].vtype);
+                                                       break;
+
+                                               case VTYPE_UINT16:
+                                                       proto_tree_add_uint_format(ncp_tree, pvalues[i].hfname, tvb, pvalues[i].voffset,
+                                                           pvalues[i].vlength, pvalues[i].vtype, "NDS Parameter not defined %d",
+                                                           pvalues[i].vtype);
+                                                       break;
+
+                                               case VTYPE_UINT32:
+                                                       proto_tree_add_uint_format(ncp_tree, pvalues[i].hfname, tvb, pvalues[i].voffset,
+                                                           pvalues[i].vlength, pvalues[i].vvalue, pvalues[i].vdesc,
+                                                           pvalues[i].vvalue);
+                                                       break;
+
+                                               case VTYPE_STRING:
+                                                       proto_tree_add_string_format(ncp_tree, pvalues[i].hfname, tvb, pvalues[i].voffset, 
+                                                           pvalues[i].vlength, pvalues[i].vstring, pvalues[i].vdesc, pvalues[i].vstring);
+                                                       if (pvalues[i].mvtype == MVTYPE_ATTR_REQUEST) {
+                                                               /*
+                                                                * The "vstring" value is set to the input ES type
+                                                                * for MVTYPE_PROC_ENTRY_SPECIFIERS,
+                                                                * to add string to columninfo
+                                                                */
+                                                               if (check_col(pinfo->cinfo, COL_INFO)) {
+                                                                       if (!added_arrow) {
+                                                                               col_append_str(pinfo->cinfo, COL_INFO, " -> ");
+                                                                               added_arrow = TRUE;
+                                                                       }
+                                                                       col_append_str(pinfo->cinfo, COL_INFO, pvalues[i].vstring);
+                                                               }
+                                                       }
+                                                       break;
+
+                                               case VTYPE_BITFIELD:
+                                                       process_bitfield(ncp_tree, tvb, &pvalues[i]);
+                                                       break;
+
+                                               case VTYPE_MULTIVALUE_UINT32:
+                                                       process_multivalues(ncp_tree, tvb, &pvalues[i]);
+                                                       if (pvalues[i].mvtype == MVTYPE_PROC_ENTRY_SPECIFIERS) {
+                                                               /*
+                                                                * The "vstring" value is set to the input ES type
+                                                                * by "process_multivalues()".
+                                                                */
+                                                               strcpy(global_object_name, pvalues[i].vstring);
+                                                       }
+                                                       if (pvalues[i].mvtype == MVTYPE_ATTR_REQUEST || pvalues[i].mvtype == MVTYPE_PROC_ENTRY_SPECIFIERS) {
+                                                               /*
+                                                                * The "vstring" value is set to the input ES type
+                                                                * for MVTYPE_PROC_ENTRY_SPECIFIERS,
+                                                                * and the last string for MVTYPE_ATTR_REQUEST,
+                                                                * by "process_multivalues()".
+                                                                */
+                                                               if (check_col(pinfo->cinfo, COL_INFO)) {
+                                                                       if (!added_arrow) {
+                                                                               col_append_str(pinfo->cinfo, COL_INFO, " -> ");
+                                                                               added_arrow = TRUE;
+                                                                       }
+                                                                       col_append_str(pinfo->cinfo, COL_INFO, pvalues[i].vstring);
+                                                               }
+                                                       }
+                                                       break;
+
+                                               case VTYPE_BYTES:
+                                                       proto_tree_add_bytes(ncp_tree, pvalues[i].hfname, tvb, pvalues[i].voffset,
+                                                           pvalues[i].vlength, tvb_get_ptr(tvb, pvalues[i].voffset, pvalues[i].vvalue));
+                                                       break;
+
+                                               case VTYPE_BOOLEAN:
+                                                       proto_tree_add_item(ncp_tree, pvalues[i].hfname, tvb, pvalues[i].voffset, pvalues[i].vlength, TRUE);
+                                                       break;
+
+                                               default:
+                                                       proto_tree_add_uint_format(ncp_tree, hf_nds_p1type, tvb, pvalues[i].voffset,
+                                                           pvalues[i].vlength, pvalues[i].vtype, "NDS Parameter not defined %u",
+                                                           pvalues[i].vtype);
+                                                       break;
+                                               }
+                                                /* For NDS requests with just an EID, resolve name from hash table. */
+                                        }
+                                        request_eid_value = ncp_eid_hash_lookup(conversation, global_eid);
+                                        if(resolve_eid) {
+                                                if (request_eid_value) {
+                                                        strcpy(global_object_name, request_eid_value->object_name);
+                                                        if (check_col(pinfo->cinfo, COL_INFO)) 
+                                                        {
+                                                                col_append_str(pinfo->cinfo, COL_INFO, ", Object Name - ");
+                                                                col_append_str(pinfo->cinfo, COL_INFO, global_object_name);
                                                         }
                                                 }        
                                         }
@@ -8163,9 +8392,9 @@ dissect_nds_request(tvbuff_t *tvb, packet_info *pinfo,
                                         {
                                                 request_value->nds_request_verb = nds_verb;
                                                 request_value->nds_version = nds_version;
-                                                request_value->object_name = global_object_name;
+                                                strcpy(request_value->object_name, global_object_name);
                                                 request_value->req_nds_flags = global_flags;
-                                        }                                                
+                                        }
                                 }
                                        break;
                
@@ -8180,9 +8409,14 @@ dissect_nds_request(tvbuff_t *tvb, packet_info *pinfo,
         }        
 }
 
-
+/*
+ * XXX - this duplicates stuff in "dissect_ncp_request()"; could
+ * "dissect_ncp_request()" not just call "dissect_ping_req()" if
+ * the operation is an NCP ping, and "dissect_ping_req()" just dissect
+ * ping portion?
+ */
 void
-dissect_ping_req(tvbuff_t *tvb, packet_info *pinfo,                                          
+dissect_ping_req(tvbuff_t *tvb, packet_info *pinfo,
                guint16 nw_connection, guint8 sequence,
                guint16 type, proto_tree *ncp_tree)
 {
@@ -8192,18 +8426,20 @@ dissect_ping_req(tvbuff_t *tvb, packet_info *pinfo,
        conversation_t          *conversation;
        ptvcursor_t             *ptvc = NULL;
        proto_tree              *temp_tree = NULL;
-        guint32                 nds_version = 0;
         gint                    length_remaining = 0;
-       char                    flags_str[1+3+1+3+1+3+1+3+1+1];
-        char *                  sep = NULL;
-       proto_tree              *flags_tree;
         guint32                 nds_flags;
-       proto_item              *tinew;
-        guint32                 nds_flag_tree = 0x00020000;
-        guint32                 nds_flag_depth = 0x00000002;
-        guint32                 nds_flag_rev = 0x00000004;
-        guint32                 nds_flag_flags = 0x00000008;
-        int                     ett_nds_flags;
+        guint32                 ping_version;
+       nds_val                 pvalue;
+       char                    string_buffer[1024];
+        
+       pvalue.vvalue = 0;
+       pvalue.vlength = 0;
+       pvalue.voffset = 0;
+       pvalue.hfname = 0;
+       pvalue.vdesc = "";
+       string_buffer[0] = '\0';
+       pvalue.vstring = string_buffer;
+       pvalue.mvtype = 0;
         
        func = tvb_get_guint8(tvb, 6);
         subfunc = tvb_get_guint8(tvb, 7);
@@ -8245,6 +8481,8 @@ dissect_ping_req(tvbuff_t *tvb, packet_info *pinfo,
                 
                        request_value = ncp_hash_insert(conversation, sequence, ncp_rec);
                        request_value->req_frame_num = pinfo->fd->num;
+               request_value->req_frame_time.secs=pinfo->fd->abs_secs;
+               request_value->req_frame_time.nsecs=pinfo->fd->abs_usecs*1000;
         
                        /* If this is the first time we're examining the packet,
                         * check to see if this NCP type uses a "request condition".
@@ -8253,8 +8491,7 @@ dissect_ping_req(tvbuff_t *tvb, packet_info *pinfo,
                         * display filters can't possibly work. If we already have
                         * a proto_tree, then wonderful. If we don't, we need to build
                         * one. */
-                       if (ncp_rec) 
-                {
+                       if (ncp_rec && !ncp_tree) {
                        proto_item *ti;
                                
                        temp_tree = proto_tree_create_root();
@@ -8264,109 +8501,140 @@ dissect_ping_req(tvbuff_t *tvb, packet_info *pinfo,
                        }
                }
         
-               if (ncp_tree) 
-        {
-                       /* If the dissection throws an exception, be sure to free
-                        * the temporary proto_tree that was created. Because of the
-                        * way the CLEANUP_PUSH macro works, we can't put it in an 'if'
-                        * block; it has to be in the same scope as the terminating
-                        * CLEANUP_POP or CLEANUP_POP_AND_ALLOC. So, we always
-                        * call CLEANUP_POP and friends, but the value of temp_tree is
-                        * NULL if no cleanup is needed, and non-null if cleanup is needed. 
-                 */
-                 
-                       CLEANUP_PUSH(free_proto_tree, temp_tree);
-        
-                       conversation = find_conversation(&pinfo->src, &pinfo->dst,
-                           PT_NCP, nw_connection, nw_connection, 0);
+       if (ncp_tree) {
+               /* If the dissection throws an exception, be sure to free
+                * the temporary proto_tree that was created. Because of the
+                * way the CLEANUP_PUSH macro works, we can't put it in an 'if'
+                * block; it has to be in the same scope as the terminating
+                * CLEANUP_POP or CLEANUP_POP_AND_ALLOC. So, we always
+                * call CLEANUP_POP and friends, but the value of temp_tree is
+                * NULL if no cleanup is needed, and non-null if cleanup is needed. 
+                */
+               CLEANUP_PUSH(free_proto_tree, temp_tree);
         
-                       switch (type) 
-                {
-                        case NCP_BROADCAST_SLOT:
-                                       ; /* nothing */
-                                       break;
+               switch (type) {
+
+               case NCP_BROADCAST_SLOT:
+                       ; /* nothing */
+                       break;
         
-                               case NCP_SERVICE_REQUEST:
-                                       proto_tree_add_uint_format(ncp_tree, hf_ncp_func, tvb, 6, 1,
-                                               func, "Function: %d (0x%02X), %s",
-                                               func, func, ncp_rec ? ncp_rec->name : "Unknown");
+               case NCP_SERVICE_REQUEST:
+                       proto_tree_add_uint_format(ncp_tree, hf_ncp_func, tvb, 6, 1,
+                               func, "Function: %u (0x%02X), %s",
+                               func, func, ncp_rec ? ncp_rec->name : "Unknown");
                                         
-                               proto_tree_add_uint_format(ncp_tree, hf_ncp_subfunc, tvb, 7, 1,
-                                       subfunc, "SubFunction: %d (0x%02x)",
-                                       subfunc, subfunc);
+                       proto_tree_add_uint_format(ncp_tree, hf_ncp_subfunc, tvb, 7, 1,
+                               subfunc, "SubFunction: %u (0x%02x)",
+                               subfunc, subfunc);
                                         
-                               proto_tree_add_uint_format(ncp_tree, hf_nds_version, tvb, 8, 4,
-                                       nds_version, "NDS Version: (0x%x)",
-                                       nds_version);
-                               
-                               length_remaining = tvb_length_remaining(tvb, 8);
-                                if (length_remaining > 6)
-                                {
-                                        nds_flags = tvb_get_letohl(tvb, 12);
-                                       strcpy(flags_str, " ");
-                                       sep = "(";
-                                       if (nds_flags & nds_flag_tree) 
-                                        {
-                                               strcat(flags_str, sep);
-                                               strcat(flags_str, "Tree");
-                                               sep = ",";
-                                       }
-                                       if (nds_flags & nds_flag_depth) 
-                                        {
-                                               strcat(flags_str, sep);
-                                               strcat(flags_str, "Depth");
-                                               sep = ",";
-                                       }
-                                       if (nds_flags & nds_flag_rev) 
-                                        {
-                                               strcat(flags_str, sep);
-                                               strcat(flags_str, "Revision");
-                                       }
-                                       if (nds_flags & nds_flag_flags) 
-                                        {
-                                               strcat(flags_str, sep);
-                                               strcat(flags_str, "Flags");
-                                       }
-                                       if (flags_str[0] != '\0')
-                                        {
-                                               strcat(flags_str, ")");
-                                               tinew = proto_tree_add_uint_format(ncp_tree, hf_nds_flags,
-                                                       tvb, 12, 4, nds_flags, "Flags: 0x%08x -%s", nds_flags,
-                                                       flags_str);
-                                                
-                                               flags_tree = proto_item_add_subtree(tinew, ett_nds);
-                                                
-                                                if(request_value)
-                                                {        
-                                                        request_value->req_nds_flags = nds_flags;
-                                                }
-                                                                                                        
-                                               proto_tree_add_item(flags_tree, hf_nds_flags_tree,
-                                                       tvb, 12, 4, TRUE);
-                                               proto_tree_add_item(flags_tree, hf_nds_flags_flags,
-                                                       tvb, 12, 4, TRUE);
-                                               proto_tree_add_item(flags_tree, hf_nds_flags_rev,
-                                                       tvb, 12, 4, TRUE);
-                                               proto_tree_add_item(flags_tree, hf_nds_flags_depth,
-                                                       tvb, 12, 4, TRUE);
-                                        } 
-                                }                                         
-                                       break;
-       
-                               default:
-                                       ; /* nothing */
-                                       break;
+                       length_remaining = tvb_reported_length_remaining(tvb, 8);
+                       if (length_remaining >= 8) {
+                                ping_version = tvb_get_letohl(tvb, 8);
+                               proto_tree_add_uint(ncp_tree, hf_nds_ping_version, tvb, 8,
+                                   4, ping_version);
+                               nds_flags = tvb_get_letohl(tvb, 12);
+                               if (request_value)
+                                       request_value->req_nds_flags = nds_flags;
+
+                               
+                                pvalue.vvalue = tvb_get_letohs(tvb, 12);
+                                pvalue.vtype = VTYPE_BITFIELD;
+                                pvalue.vstring = "";
+                                pvalue.vdesc = "Ping (low) Request Flags:";
+                                pvalue.vlength = 2;
+                                pvalue.hfname= hf_nds_rflags;
+                                pvalue.voffset = 12;
+                                pvalue.bit1 = "Supported Fields";
+                                pvalue.bit1hfname = hf_bit1pingflags1;
+                                pvalue.bit2 = "Depth";
+                                pvalue.bit2hfname = hf_bit2pingflags1;
+                                pvalue.bit3 = "Revision";
+                                pvalue.bit3hfname = hf_bit3pingflags1;
+                                pvalue.bit4 = "Flags";
+                                pvalue.bit4hfname = hf_bit4pingflags1;
+                                pvalue.bit5 = "Verification Flags";
+                                pvalue.bit5hfname = hf_bit5pingflags1;
+                                pvalue.bit6 = "Letter Version";
+                                pvalue.bit6hfname = hf_bit6pingflags1;
+                                pvalue.bit7 = "OS Version";
+                                pvalue.bit7hfname = hf_bit7pingflags1;
+                                pvalue.bit8 = "License Flags";
+                                pvalue.bit8hfname = hf_bit8pingflags1;
+                                pvalue.bit9 = "DS Time";
+                                pvalue.bit9hfname = hf_bit9pingflags1;
+                                pvalue.bit10 = "Not Defined";
+                                pvalue.bit10hfname = hf_bit10pingflags1;
+                                pvalue.bit11 = "Not Defined";
+                                pvalue.bit11hfname = hf_bit11pingflags1;
+                                pvalue.bit12 = "Not Defined";
+                                pvalue.bit12hfname = hf_bit12pingflags1;
+                                pvalue.bit13 = "Not Defined";
+                                pvalue.bit13hfname = hf_bit13pingflags1;
+                                pvalue.bit14 = "Not Defined";
+                                pvalue.bit14hfname = hf_bit14pingflags1;
+                                pvalue.bit15 = "Not Defined";
+                                pvalue.bit15hfname = hf_bit15pingflags1;
+                                pvalue.bit16 = "Not Defined";
+                                pvalue.bit16hfname = hf_bit16pingflags1;
                                 
-                       }
-               ptvc = ptvcursor_new(ncp_tree, tvb, 7);
-                       if (ncp_rec && ncp_rec->request_ptvc) {
-                               clear_repeat_vars();
-                               process_ptvc_record(ptvc, ncp_rec->request_ptvc, NULL, TRUE, ncp_rec);
-                       }
-                       ptvcursor_free(ptvc);
+                                process_bitfield(ncp_tree, tvb, &pvalue);
+                                
+                                pvalue.vvalue = tvb_get_letohs(tvb, 14);
+                                pvalue.vtype = VTYPE_BITFIELD;
+                                pvalue.vstring = "";
+                                pvalue.vdesc = "Ping (high) Request Flags:";
+                                pvalue.vlength = 2;
+                                pvalue.hfname= hf_nds_rflags;
+                                pvalue.voffset = 14;
+                                pvalue.bit1 = "Sap Name";
+                                pvalue.bit1hfname = hf_bit1pingflags2;
+                                pvalue.bit2 = "Tree Name";
+                                pvalue.bit2hfname = hf_bit2pingflags2;
+                                pvalue.bit3 = "OS Name";
+                                pvalue.bit3hfname = hf_bit3pingflags2;
+                                pvalue.bit4 = "Hardware Name";
+                                pvalue.bit4hfname = hf_bit4pingflags2;
+                                pvalue.bit5 = "Vendor Name";
+                                pvalue.bit5hfname = hf_bit5pingflags2;
+                                pvalue.bit6 = "Not Defined";
+                                pvalue.bit6hfname = hf_bit6pingflags2;
+                                pvalue.bit7 = "Not Defined";
+                                pvalue.bit7hfname = hf_bit7pingflags2;
+                                pvalue.bit8 = "Not Defined";
+                                pvalue.bit8hfname = hf_bit8pingflags2;
+                                pvalue.bit9 = "Not Defined";
+                                pvalue.bit9hfname = hf_bit9pingflags2;
+                                pvalue.bit10 = "Not Defined";
+                                pvalue.bit10hfname = hf_bit10pingflags2;
+                                pvalue.bit11 = "Not Defined";
+                                pvalue.bit11hfname = hf_bit11pingflags2;
+                                pvalue.bit12 = "Not Defined";
+                                pvalue.bit12hfname = hf_bit12pingflags2;
+                                pvalue.bit13 = "Not Defined";
+                                pvalue.bit13hfname = hf_bit13pingflags2;
+                                pvalue.bit14 = "Not Defined";
+                                pvalue.bit14hfname = hf_bit14pingflags2;
+                                pvalue.bit15 = "Not Defined";
+                                pvalue.bit15hfname = hf_bit15pingflags2;
+                                pvalue.bit16 = "Not Defined";
+                                pvalue.bit16hfname = hf_bit16pingflags2;
+                                
+                                process_bitfield(ncp_tree, tvb, &pvalue);
+                       }
+                       break;
        
-                       /* Free the temporary proto_tree */
-                       CLEANUP_CALL_AND_POP;
-               }
-        
+               default:
+                       ; /* nothing */
+                       break;
+               }
+               ptvc = ptvcursor_new(ncp_tree, tvb, 7);
+               if (ncp_rec && ncp_rec->request_ptvc) {
+                       clear_repeat_vars();
+                       process_ptvc_record(ptvc, ncp_rec->request_ptvc, NULL, TRUE, ncp_rec);
+               }
+               ptvcursor_free(ptvc);
+
+               /* Free the temporary proto_tree */
+               CLEANUP_CALL_AND_POP;
+       }
 }