Update Free Software Foundation address.
[metze/wireshark/wip.git] / epan / dissectors / packet-afp.c
index 7cb05cc1ac2ffc26744130e1261b8d7ee8aece74..9ff972cf633f3770642ef1d5356acbe460585129 100644 (file)
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
 #ifdef HAVE_CONFIG_H
 # include "config.h"
 #endif
 
+#include <string.h>
+
 #include <glib.h>
 #include <epan/packet.h>
 /* #include <epan/strutil.h> */
@@ -52,17 +54,22 @@ http://developer.apple.com/DOCUMENTATION/macos8/pdf/ASAppleTalkFiling2.1_2.2.pdf
 
    http://developer.apple.com/documentation/Networking/Conceptual/AFP/AFP3_1.pdf
 
-  and in HTML form, at
+  and, in HTML form, at
 
 http://developer.apple.com/documentation/Networking/Conceptual/AFP/index.html
 
+  Current AFP 3.x specfication, in HTML form, at
+http://developer.apple.com/mac/library/documentation/Networking/Reference/AFP_Reference/Reference/reference.html
 
-  AFP 3.3 specfication in HTML form, at
+  Current AFP 3.x programming guide, in HTML form, at
 http://developer.apple.com/mac/library/documentation/Networking/Conceptual/AFP/Introduction/Introduction.html
 
-
   The netatalk source code by Wesley Craig & Adrian Sun
        http://netatalk.sf.net
+
+  XXX - distinguish between UTF-8 and Mac proprietary encodings for strings?
+  Does that need a preference in case we didn't see the client and server
+  negotiate that?
 */
 /* from netatalk/include/afp.h */
 #define AFPTRANS_NONE          0
@@ -135,35 +142,44 @@ http://developer.apple.com/mac/library/documentation/Networking/Conceptual/AFP/I
 #define AFP_ADDCMT             56
 #define AFP_RMVCMT             57
 #define AFP_GETCMT             58
+
 #define AFP_ZZZ                       122
 #define AFP_ADDICON           192
 
 /* AFP 3.0 new calls */
 #define AFP_BYTELOCK_EXT       59
-#define AFP_CATSEARCH_EXT      67
-#define AFP_ENUMERATE_EXT      66
 #define AFP_READ_EXT           60
 #define AFP_WRITE_EXT          61
 #define AFP_LOGIN_EXT          63
 #define AFP_GETSESSTOKEN       64
 #define AFP_DISCTOLDSESS       65
+#define AFP_ENUMERATE_EXT      66
+#define AFP_CATSEARCH_EXT      67
 
 /* AFP 3.1 new calls */
-#define AFP_ENUMERATE_EXT2     68
+#define AFP_ENUMERATE_EXT2      68
 
 /* AFP 3.2 new calls */
-#define AFP_GETEXTATTR         69
-#define AFP_SETEXTATTR         70
-#define AFP_REMOVEATTR         71
-#define AFP_LISTEXTATTR                72
-#define AFP_GETACL             73
-#define AFP_SETACL             74
-#define AFP_ACCESS             75
+#define AFP_GETEXTATTR          69
+#define AFP_SETEXTATTR          70
+#define AFP_REMOVEATTR          71
+#define AFP_LISTEXTATTR         72
+#define AFP_GETACL              73
+#define AFP_SETACL              74
+#define AFP_ACCESS              75
 
 /* AFP 3.2 calls added in 10.5 */
-#define AFP_SPOTLIGHTRPC 76
-#define AFP_SYNCDIR            78
-#define AFP_SYNCFORK           79
+#define AFP_SPOTLIGHTRPC        76
+#define AFP_SYNCDIR             78
+#define AFP_SYNCFORK            79
+
+/* FPSpotlightRPC subcommand codes */
+#define SPOTLIGHT_CMD_GET_VOLPATH 4
+#define SPOTLIGHT_CMD_GET_VOLID   2
+#define SPOTLIGHT_CMD_GET_THREE   3
+
+/* Spotlight epoch is UNIX epoch minus SPOTLIGHT_TIME_DELTA */
+#define SPOTLIGHT_TIME_DELTA G_GINT64_CONSTANT(280878921600U)
 
 /* ----------------------------- */
 static int proto_afp                       = -1;
@@ -171,7 +187,7 @@ static int hf_afp_reserved              = -1;
 static int hf_afp_unknown                  = -1;
 
 static int hf_afp_command                  = -1;               /* CommandCode */
-static int hf_afp_AFPVersion               = -1;
+static int hf_afp_Version                  = -1;
 static int hf_afp_UAM                      = -1;
 static int hf_afp_user                     = -1;
 static int hf_afp_passwd                   = -1;
@@ -241,8 +257,6 @@ static int hf_afp_create_flag                   = -1;
 static int hf_afp_struct_size              = -1;
 static int hf_afp_struct_size16                    = -1;
 
-static int hf_afp_request_bitmap           = -1;
-
 static int hf_afp_cat_count                = -1;
 static int hf_afp_cat_req_matches          = -1;
 static int hf_afp_cat_position             = -1;
@@ -274,7 +288,6 @@ static int hf_afp_rw_count              = -1;
 static int hf_afp_newline_mask             = -1;
 static int hf_afp_newline_char             = -1;
 static int hf_afp_last_written             = -1;
-static int hf_afp_actual_count             = -1;
 
 static int hf_afp_fork_type                = -1;
 static int hf_afp_access_mode              = -1;
@@ -358,7 +371,7 @@ static const value_string vol_signature_vals[] = {
        {0, NULL }
 };
 
-const value_string CommandCode_vals[] = {
+static const value_string CommandCode_vals[] = {
        {AFP_BYTELOCK,          "FPByteRangeLock" },
        {AFP_CLOSEVOL,          "FPCloseVol" },
        {AFP_CLOSEDIR,          "FPCloseDir" },
@@ -411,16 +424,14 @@ const value_string CommandCode_vals[] = {
        {AFP_RMVCMT,            "FPRemoveComment" },
        {AFP_GETCMT,            "FPGetComment" },
        {AFP_BYTELOCK_EXT,      "FPByteRangeLockExt" },
-       {AFP_CATSEARCH_EXT,     "FPCatSearchExt" },
-       {AFP_ENUMERATE_EXT,     "FPEnumerateExt" },
-       {AFP_ENUMERATE_EXT2,    "FPEnumerateExt2" },
        {AFP_READ_EXT,          "FPReadExt" },
        {AFP_WRITE_EXT,         "FPWriteExt" },
        {AFP_LOGIN_EXT,         "FPLoginExt" },
        {AFP_GETSESSTOKEN,      "FPGetSessionToken" },
        {AFP_DISCTOLDSESS,      "FPDisconnectOldSession" },
-       {AFP_ZZZ,               "FPZzzzz" },
-       {AFP_ADDICON,           "FPAddIcon" },
+       {AFP_ENUMERATE_EXT,     "FPEnumerateExt" },
+       {AFP_CATSEARCH_EXT,     "FPCatSearchExt" },
+       {AFP_ENUMERATE_EXT2,    "FPEnumerateExt2" },
        {AFP_GETEXTATTR,        "FPGetExtAttr" },
        {AFP_SETEXTATTR,        "FPSetExtAttr" },
        {AFP_REMOVEATTR,        "FPRemoveExtAttr" },
@@ -429,10 +440,13 @@ const value_string CommandCode_vals[] = {
        {AFP_SETACL,            "FPSetACL" },
        {AFP_ACCESS,            "FPAccess" },
        {AFP_SPOTLIGHTRPC,      "FPSpotlightRPC" },
-       {AFP_SYNCFORK,          "FPSyncFork" },
        {AFP_SYNCDIR,           "FPSyncDir" },
+       {AFP_SYNCFORK,          "FPSyncFork" },
+       {AFP_ZZZ,               "FPZzzzz" },
+       {AFP_ADDICON,           "FPAddIcon" },
        {0,                      NULL }
 };
+value_string_ext CommandCode_vals_ext = VALUE_STRING_EXT_INIT(CommandCode_vals);
 
 static const value_string unicode_hint_vals[] = {
        {    0, "MacRoman" },
@@ -538,6 +552,7 @@ static const value_string unicode_hint_vals[] = {
        { 1570, "JIS_X0208_90" },
        { 0,       NULL }
 };
+static value_string_ext unicode_hint_vals_ext = VALUE_STRING_EXT_INIT(unicode_hint_vals);
 
 /* volume bitmap
   from Apple AFP3.0.pdf
@@ -610,7 +625,6 @@ static int hf_afp_dir_attribute_InExpFolder   = -1;
 static int hf_afp_dir_attribute_BackUpNeeded  = -1;
 static int hf_afp_dir_attribute_RenameInhibit = -1;
 static int hf_afp_dir_attribute_DeleteInhibit = -1;
-static int hf_afp_dir_attribute_SetClear      = -1;
 
 static int hf_afp_file_bitmap_Attributes       = -1;
 static int hf_afp_file_bitmap_ParentDirID      = -1;
@@ -663,6 +677,24 @@ static int hf_afp_request_bitmap_UTF8Name       = -1;
 static int hf_afp_request_bitmap_ExtRsrcForkLen = -1;
 static int hf_afp_request_bitmap_PartialNames   = -1;
 
+static int ett_afp_spotlight_queries = -1;
+static int ett_afp_spotlight_query_line  = -1;
+static int ett_afp_spotlight_query = -1;
+static int ett_afp_spotlight_data = -1;
+static int ett_afp_spotlight_toc = -1;
+
+static int hf_afp_spotlight_request_flags = -1;
+static int hf_afp_spotlight_request_command = -1;
+static int hf_afp_spotlight_request_reserved = -1;
+static int hf_afp_spotlight_reply_reserved = -1;
+static int hf_afp_spotlight_volpath_server = -1;
+static int hf_afp_spotlight_volpath_client = -1;
+static int hf_afp_spotlight_returncode = -1;
+static int hf_afp_spotlight_volflags = -1;
+static int hf_afp_spotlight_reqlen = -1;
+static int hf_afp_spotlight_uuid = -1;
+static int hf_afp_spotlight_date = -1;
+
 static const value_string flag_vals[] = {
        {0,     "Start" },
        {1,     "End" },
@@ -682,6 +714,7 @@ static const value_string map_name_type_vals[] = {
        {5,     "Unicode user name to a user UUID" },
        {6,     "Unicode group name to a group UUID" },
        {0,     NULL } };
+static value_string_ext map_name_type_vals_ext = VALUE_STRING_EXT_INIT(map_name_type_vals);
 
 static const value_string map_id_type_vals[] = {
        {1,     "User ID to a Macintosh roman user name" },
@@ -691,6 +724,7 @@ static const value_string map_id_type_vals[] = {
        {5,     "User UUID to a unicode user name" },
        {6,     "Group UUID to a unicode group name" },
        {0,     NULL } };
+static value_string_ext map_id_type_vals_ext = VALUE_STRING_EXT_INIT(map_id_type_vals);
 
 /* map_id subfunctions 5,6: reply type */
 static const value_string map_id_reply_type_vals[] = {
@@ -748,24 +782,24 @@ static const value_string map_id_reply_type_vals[] = {
        table 1-7 p. 28
 */
 
-#define AR_O_SEARCH    (1 << 0)        /* owner has search access */
-#define AR_O_READ      (1 << 1)    /* owner has read access */
-#define AR_O_WRITE     (1 << 2)    /* owner has write access */
+#define AR_O_SEARCH     (1 << 0)    /* owner has search access */
+#define AR_O_READ       (1 << 1)    /* owner has read access */
+#define AR_O_WRITE      (1 << 2)    /* owner has write access */
 
-#define AR_G_SEARCH    (1 << 8)    /* group has search access */
-#define AR_G_READ      (1 << 9)    /* group has read access */
-#define AR_G_WRITE     (1 << 10)   /* group has write access */
+#define AR_G_SEARCH     (1 << 8)    /* group has search access */
+#define AR_G_READ       (1 << 9)    /* group has read access */
+#define AR_G_WRITE      (1 << 10)   /* group has write access */
 
-#define AR_E_SEARCH    (1 << 16)       /* everyone has search access */
-#define AR_E_READ      (1 << 17)   /* everyone has read access */
-#define AR_E_WRITE     (1 << 18)   /* everyone has write access */
+#define AR_E_SEARCH     (1 << 16)   /* everyone has search access */
+#define AR_E_READ       (1 << 17)   /* everyone has read access */
+#define AR_E_WRITE      (1 << 18)   /* everyone has write access */
 
-#define AR_U_SEARCH    (1 << 24)   /* user has search access */
-#define AR_U_READ      (1 << 25)   /* user has read access */
-#define AR_U_WRITE     (1 << 26)       /* user has write access */
+#define AR_U_SEARCH     (1 << 24)   /* user has search access */
+#define AR_U_READ       (1 << 25)   /* user has read access */
+#define AR_U_WRITE      (1 << 26)   /* user has write access */
 
-#define AR_BLANK       (1 << 28)       /* Blank Access Privileges (use parent dir privileges) */
-#define AR_U_OWN       (1UL << 31)     /* user is the owner */
+#define AR_BLANK        (1 << 28)   /* Blank Access Privileges (use parent dir privileges) */
+#define AR_U_OWN        (1UL << 31) /* user is the owner */
 
 static int hf_afp_dir_ar           = -1;
 static int hf_afp_dir_ar_o_search  = -1;
@@ -796,9 +830,9 @@ static int hf_afp_user_bitmap_UUID = -1;
 static gint ett_afp_user_bitmap    = -1;
 
 static const value_string user_flag_vals[] = {
-  {0,  "Use user ID" },
-  {1,  "Default user" },
-  {0,  NULL } };
+       {0,     "Use user ID" },
+       {1,     "Default user" },
+       {0,     NULL } };
 
 static int hf_afp_message            = -1;
 static int hf_afp_message_type       = -1;
@@ -873,7 +907,7 @@ kFPUTF8NameBit                      (bit 13)
 #define kGetKerberosSessionKey  8
 
 static const value_string token_type_vals[] = {
-       {kLoginWithoutID,               "LoginWithoutID"},
+       {kLoginWithoutID,             "LoginWithoutID"},
        {kLoginWithID,                "LoginWithID"},
        {kReconnWithID,               "ReconnWithID"},
        {kLoginWithTimeAndID,         "LoginWithTimeAndID"},
@@ -884,6 +918,7 @@ static const value_string token_type_vals[] = {
        {kGetKerberosSessionKey,      "GetKerberosSessionKey"},
 
        {0,                            NULL } };
+static value_string_ext token_type_vals_ext = VALUE_STRING_EXT_INIT(token_type_vals);
 
 /* AFP 3.2 ACL bitmap */
 #define kFileSec_UUID          (1 << 0)
@@ -905,9 +940,7 @@ static int hf_afp_access_bitmap                     = -1;
 static int hf_afp_acl_entrycount        = -1;
 static int hf_afp_acl_flags             = -1;
 
-static int hf_afp_ace_applicable        = -1;
 static int hf_afp_ace_flags             = -1;
-static int hf_afp_ace_rights            = -1;
 
 static int ett_afp_ace_flags            = -1;
 static int hf_afp_ace_flags_allow       = -1;
@@ -979,10 +1012,14 @@ static int hf_afp_acl_access_bitmap_generic_read    = -1;
 
 #define hash_init_count 20
 
+/* Forward declarations */
+
 /* Hash functions */
 static gint  afp_equal (gconstpointer v, gconstpointer v2);
 static guint afp_hash  (gconstpointer v);
 
+static gint dissect_spotlight(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint offset);
+
 typedef struct {
        guint32 conversation;
        guint16 seq;
@@ -993,6 +1030,52 @@ static GHashTable *afp_request_hash = NULL;
 static guint Vol;      /* volume */
 static guint Did;      /* parent directory ID */
 
+static guint64
+spotlight_ntoh64(tvbuff_t *tvb, gint offset, guint encoding)
+{
+       if (encoding == ENC_LITTLE_ENDIAN)
+               return tvb_get_letoh64(tvb, offset);
+       else
+               return tvb_get_ntoh64(tvb, offset);
+}
+
+static gdouble
+spotlight_ntohieee_double(tvbuff_t *tvb, gint offset, guint encoding)
+{
+       if (encoding == ENC_LITTLE_ENDIAN)
+               return tvb_get_letohieee_double(tvb, offset);
+       else
+               return tvb_get_ntohieee_double(tvb, offset);
+}
+
+/*
+* Returns the UTF-16 string encoding, by checking the 2-byte byte order mark.
+* If there is no byte order mark, -1 is returned.
+*/
+static guint
+spotlight_get_utf16_string_encoding(tvbuff_t *tvb, gint offset, gint query_length, guint encoding) {
+       guint utf16_encoding;
+
+       /* check for byte order mark */
+       utf16_encoding = ENC_BIG_ENDIAN;
+       if (query_length >= 2) {
+               guint16 byte_order_mark;
+               if (encoding == ENC_LITTLE_ENDIAN)
+                       byte_order_mark = tvb_get_letohs(tvb, offset);
+               else
+                       byte_order_mark = tvb_get_ntohs(tvb, offset);
+
+               if (byte_order_mark == 0xFFFE) {
+                       utf16_encoding = ENC_BIG_ENDIAN | ENC_UTF_16;
+               }
+               else if (byte_order_mark == 0xFEFF) {
+                       utf16_encoding = ENC_LITTLE_ENDIAN | ENC_UTF_16;
+               }
+       }
+
+       return utf16_encoding;
+}
+
 /* Hash Functions */
 static gint  afp_equal (gconstpointer v, gconstpointer v2)
 {
@@ -1014,7 +1097,7 @@ static guint afp_hash  (gconstpointer v)
 
 /* --------------------------
 */
-#define PAD(x)      { proto_tree_add_item(tree, hf_afp_pad, tvb, offset,  x, FALSE); offset += x; }
+#define PAD(x)      { proto_tree_add_item(tree, hf_afp_pad, tvb, offset,  x, ENC_NA); offset += x; }
 
 static guint16
 decode_vol_bitmap (proto_tree *tree, tvbuff_t *tvb, gint offset)
@@ -1025,21 +1108,21 @@ decode_vol_bitmap (proto_tree *tree, tvbuff_t *tvb, gint offset)
 
        bitmap = tvb_get_ntohs(tvb, offset);
        if (tree) {
-               item = proto_tree_add_item(tree, hf_afp_vol_bitmap, tvb, offset, 2,FALSE);
+               item = proto_tree_add_item(tree, hf_afp_vol_bitmap, tvb, offset, 2, ENC_BIG_ENDIAN);
                sub_tree = proto_item_add_subtree(item, ett_afp_vol_bitmap);
 
-               proto_tree_add_item(sub_tree, hf_afp_vol_bitmap_Attributes,     tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_vol_bitmap_Signature,      tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_vol_bitmap_CreateDate,     tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_vol_bitmap_ModDate,        tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_vol_bitmap_BackupDate,     tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_vol_bitmap_ID,             tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_vol_bitmap_BytesFree,      tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_vol_bitmap_BytesTotal,     tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_vol_bitmap_Name,           tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_vol_bitmap_ExtBytesFree,   tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_vol_bitmap_ExtBytesTotal,  tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_vol_bitmap_BlockSize ,     tvb, offset, 2,FALSE);
+               proto_tree_add_item(sub_tree, hf_afp_vol_bitmap_Attributes,     tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_vol_bitmap_Signature,      tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_vol_bitmap_CreateDate,     tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_vol_bitmap_ModDate,        tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_vol_bitmap_BackupDate,     tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_vol_bitmap_ID,             tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_vol_bitmap_BytesFree,      tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_vol_bitmap_BytesTotal,     tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_vol_bitmap_Name,           tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_vol_bitmap_ExtBytesFree,   tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_vol_bitmap_ExtBytesTotal,  tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_vol_bitmap_BlockSize ,     tvb, offset, 2, ENC_BIG_ENDIAN);
        }
 
        return bitmap;
@@ -1055,23 +1138,23 @@ decode_vol_attribute (proto_tree *tree, tvbuff_t *tvb, gint offset)
 
        bitmap = tvb_get_ntohs(tvb, offset);
        if (tree) {
-               item = proto_tree_add_item(tree, hf_afp_vol_attribute, tvb, offset, 2,FALSE);
+               item = proto_tree_add_item(tree, hf_afp_vol_attribute, tvb, offset, 2, ENC_BIG_ENDIAN);
                sub_tree = proto_item_add_subtree(item, ett_afp_vol_attribute);
 
-               proto_tree_add_item(sub_tree, hf_afp_vol_attribute_ReadOnly                ,tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_vol_attribute_HasVolumePassword       ,tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_vol_attribute_SupportsFileIDs         ,tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_vol_attribute_SupportsCatSearch       ,tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_vol_attribute_SupportsBlankAccessPrivs,tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_vol_attribute_SupportsUnixPrivs       ,tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_vol_attribute_SupportsUTF8Names       ,tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_vol_attribute_NoNetworkUserID         ,tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_vol_attribute_DefaultPrivsFromParent  ,tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_vol_attribute_NoExchangeFiles         ,tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_vol_attribute_SupportsExtAttrs        ,tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_vol_attribute_SupportsACLs            ,tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_vol_attribute_CaseSensitive           ,tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_vol_attribute_SupportsTMLockSteal     ,tvb, offset, 2,FALSE);
+               proto_tree_add_item(sub_tree, hf_afp_vol_attribute_ReadOnly                ,tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_vol_attribute_HasVolumePassword       ,tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_vol_attribute_SupportsFileIDs         ,tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_vol_attribute_SupportsCatSearch       ,tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_vol_attribute_SupportsBlankAccessPrivs,tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_vol_attribute_SupportsUnixPrivs       ,tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_vol_attribute_SupportsUTF8Names       ,tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_vol_attribute_NoNetworkUserID         ,tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_vol_attribute_DefaultPrivsFromParent  ,tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_vol_attribute_NoExchangeFiles         ,tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_vol_attribute_SupportsExtAttrs        ,tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_vol_attribute_SupportsACLs            ,tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_vol_attribute_CaseSensitive           ,tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_vol_attribute_SupportsTMLockSteal     ,tvb, offset, 2, ENC_BIG_ENDIAN);
        }
 
        return bitmap;
@@ -1108,7 +1191,7 @@ parse_vol_bitmap (proto_tree *tree, tvbuff_t *tvb, gint offset, guint16 bitmap)
                offset += 2;
        }
        if ((bitmap & kFPVolSignatureBit)) {
-               proto_tree_add_item(tree, hf_afp_vol_signature,tvb, offset, 2, FALSE);
+               proto_tree_add_item(tree, hf_afp_vol_signature,tvb, offset, 2, ENC_BIG_ENDIAN);
                offset += 2;
        }
        if ((bitmap & kFPVolCreateDateBit)) {
@@ -1124,39 +1207,39 @@ parse_vol_bitmap (proto_tree *tree, tvbuff_t *tvb, gint offset, guint16 bitmap)
                offset += 4;
        }
        if ((bitmap & kFPVolIDBit)) {
-               proto_tree_add_item(tree, hf_afp_vol_id, tvb, offset, 2,FALSE);
+               proto_tree_add_item(tree, hf_afp_vol_id, tvb, offset, 2, ENC_BIG_ENDIAN);
                offset += 2;
        }
        if ((bitmap & kFPVolBytesFreeBit)) {
-               proto_tree_add_item(tree, hf_afp_vol_bytes_free,tvb, offset, 4, FALSE);
+               proto_tree_add_item(tree, hf_afp_vol_bytes_free,tvb, offset, 4, ENC_BIG_ENDIAN);
                offset += 4;
        }
        if ((bitmap & kFPVolBytesTotalBit)) {
-               proto_tree_add_item(tree, hf_afp_vol_bytes_total,tvb, offset, 4, FALSE);
+               proto_tree_add_item(tree, hf_afp_vol_bytes_total,tvb, offset, 4, ENC_BIG_ENDIAN);
                offset += 4;
        }
        if ((bitmap & kFPVolNameBit)) {
                nameoff = tvb_get_ntohs(tvb, offset);
-               proto_tree_add_item(tree, hf_afp_vol_name_offset,tvb, offset, 2, FALSE);
+               proto_tree_add_item(tree, hf_afp_vol_name_offset,tvb, offset, 2, ENC_BIG_ENDIAN);
                offset += 2;
        }
        if ((bitmap & kFPVolExtBytesFreeBit)) {
-               proto_tree_add_item(tree, hf_afp_vol_ex_bytes_free,tvb, offset, 8, FALSE);
+               proto_tree_add_item(tree, hf_afp_vol_ex_bytes_free,tvb, offset, 8, ENC_BIG_ENDIAN);
                offset += 8;
        }
        if ((bitmap & kFPVolExtBytesTotalBit)) {
-               proto_tree_add_item(tree, hf_afp_vol_ex_bytes_total,tvb, offset, 8, FALSE);
+               proto_tree_add_item(tree, hf_afp_vol_ex_bytes_total,tvb, offset, 8, ENC_BIG_ENDIAN);
                offset += 8;
        }
        if ((bitmap & kFPVolBlockSizeBit)) {
-               proto_tree_add_item(tree, hf_afp_vol_block_size,tvb, offset, 4, FALSE);
+               proto_tree_add_item(tree, hf_afp_vol_block_size,tvb, offset, 4, ENC_BIG_ENDIAN);
                offset += 4;
        }
        if (nameoff) {
                guint8 len;
 
                len = tvb_get_guint8(tvb, offset);
-               proto_tree_add_item(tree, hf_afp_vol_name, tvb, offset, 1,FALSE);
+               proto_tree_add_item(tree, hf_afp_vol_name, tvb, offset, 1, ENC_UTF_8|ENC_BIG_ENDIAN);
                offset += len +1;
 
        }
@@ -1173,27 +1256,27 @@ decode_file_bitmap (proto_tree *tree, tvbuff_t *tvb, gint offset)
 
        bitmap = tvb_get_ntohs(tvb, offset);
        if (tree) {
-               item = proto_tree_add_item(tree, hf_afp_file_bitmap, tvb, offset, 2,FALSE);
+               item = proto_tree_add_item(tree, hf_afp_file_bitmap, tvb, offset, 2, ENC_BIG_ENDIAN);
                sub_tree = proto_item_add_subtree(item, ett_afp_file_bitmap);
 
-               proto_tree_add_item(sub_tree, hf_afp_file_bitmap_Attributes     , tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_file_bitmap_ParentDirID    , tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_file_bitmap_CreateDate     , tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_file_bitmap_ModDate        , tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_file_bitmap_BackupDate     , tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_file_bitmap_FinderInfo     , tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_file_bitmap_LongName       , tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_file_bitmap_ShortName      , tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_file_bitmap_NodeID         , tvb, offset, 2,FALSE);
+               proto_tree_add_item(sub_tree, hf_afp_file_bitmap_Attributes     , tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_file_bitmap_ParentDirID    , tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_file_bitmap_CreateDate     , tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_file_bitmap_ModDate        , tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_file_bitmap_BackupDate     , tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_file_bitmap_FinderInfo     , tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_file_bitmap_LongName       , tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_file_bitmap_ShortName      , tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_file_bitmap_NodeID         , tvb, offset, 2, ENC_BIG_ENDIAN);
 
-               proto_tree_add_item(sub_tree, hf_afp_file_bitmap_DataForkLen    , tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_file_bitmap_RsrcForkLen    , tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_file_bitmap_ExtDataForkLen , tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_file_bitmap_LaunchLimit    , tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_file_bitmap_UTF8Name       , tvb, offset, 2,FALSE);
+               proto_tree_add_item(sub_tree, hf_afp_file_bitmap_DataForkLen    , tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_file_bitmap_RsrcForkLen    , tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_file_bitmap_ExtDataForkLen , tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_file_bitmap_LaunchLimit    , tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_file_bitmap_UTF8Name       , tvb, offset, 2, ENC_BIG_ENDIAN);
 
-               proto_tree_add_item(sub_tree, hf_afp_file_bitmap_ExtRsrcForkLen , tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_file_bitmap_UnixPrivs      , tvb, offset, 2,FALSE);
+               proto_tree_add_item(sub_tree, hf_afp_file_bitmap_ExtRsrcForkLen , tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_file_bitmap_UnixPrivs      , tvb, offset, 2, ENC_BIG_ENDIAN);
        }
 
        return bitmap;
@@ -1214,26 +1297,26 @@ decode_file_attribute(proto_tree *tree, tvbuff_t *tvb, gint offset, int shared)
        item = proto_tree_add_text(tree, tvb, offset, 2,
                                "File Attributes: 0x%04x", attribute);
        sub_tree = proto_item_add_subtree(item, ett_afp_file_attribute);
-       proto_tree_add_item(sub_tree, hf_afp_file_attribute_Invisible    , tvb, offset, 2,FALSE);
+       proto_tree_add_item(sub_tree, hf_afp_file_attribute_Invisible    , tvb, offset, 2, ENC_BIG_ENDIAN);
        if (!shared)
-               proto_tree_add_item(sub_tree, hf_afp_file_attribute_MultiUser    , tvb, offset, 2,FALSE);
+               proto_tree_add_item(sub_tree, hf_afp_file_attribute_MultiUser    , tvb, offset, 2, ENC_BIG_ENDIAN);
 
-       proto_tree_add_item(sub_tree, hf_afp_file_attribute_System       , tvb, offset, 2,FALSE);
+       proto_tree_add_item(sub_tree, hf_afp_file_attribute_System       , tvb, offset, 2, ENC_BIG_ENDIAN);
 
        if (!shared) {
-               proto_tree_add_item(sub_tree, hf_afp_file_attribute_DAlreadyOpen , tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_file_attribute_RAlreadyOpen , tvb, offset, 2,FALSE);
+               proto_tree_add_item(sub_tree, hf_afp_file_attribute_DAlreadyOpen , tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_file_attribute_RAlreadyOpen , tvb, offset, 2, ENC_BIG_ENDIAN);
        }
        /* writeinhibit is file only but Macs are setting it with FPSetFileDirParms too */
-       proto_tree_add_item(sub_tree, hf_afp_file_attribute_WriteInhibit , tvb, offset, 2,FALSE);
-       proto_tree_add_item(sub_tree, hf_afp_file_attribute_BackUpNeeded , tvb, offset, 2,FALSE);
-       proto_tree_add_item(sub_tree, hf_afp_file_attribute_RenameInhibit, tvb, offset, 2,FALSE);
-       proto_tree_add_item(sub_tree, hf_afp_file_attribute_DeleteInhibit, tvb, offset, 2,FALSE);
+       proto_tree_add_item(sub_tree, hf_afp_file_attribute_WriteInhibit , tvb, offset, 2, ENC_BIG_ENDIAN);
+       proto_tree_add_item(sub_tree, hf_afp_file_attribute_BackUpNeeded , tvb, offset, 2, ENC_BIG_ENDIAN);
+       proto_tree_add_item(sub_tree, hf_afp_file_attribute_RenameInhibit, tvb, offset, 2, ENC_BIG_ENDIAN);
+       proto_tree_add_item(sub_tree, hf_afp_file_attribute_DeleteInhibit, tvb, offset, 2, ENC_BIG_ENDIAN);
 
        if (!shared)
-               proto_tree_add_item(sub_tree, hf_afp_file_attribute_CopyProtect  , tvb, offset, 2,FALSE);
+               proto_tree_add_item(sub_tree, hf_afp_file_attribute_CopyProtect  , tvb, offset, 2, ENC_BIG_ENDIAN);
 
-       proto_tree_add_item(sub_tree, hf_afp_file_attribute_SetClear     , tvb, offset, 2,FALSE);
+       proto_tree_add_item(sub_tree, hf_afp_file_attribute_SetClear     , tvb, offset, 2, ENC_BIG_ENDIAN);
 
        return(attribute);
 }
@@ -1245,27 +1328,27 @@ decode_access_rights (proto_tree *tree, tvbuff_t *tvb, int hf, gint offset)
        proto_item *item;
 
        if (tree) {
-               item = proto_tree_add_item(tree, hf, tvb, offset, 4, FALSE);
+               item = proto_tree_add_item(tree, hf, tvb, offset, 4, ENC_BIG_ENDIAN);
                sub_tree = proto_item_add_subtree(item, ett_afp_dir_ar);
 
-               proto_tree_add_item(sub_tree, hf_afp_dir_ar_o_search, tvb, offset, 4,   FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_dir_ar_o_read  , tvb, offset, 4,   FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_dir_ar_o_write , tvb, offset, 4,   FALSE);
+               proto_tree_add_item(sub_tree, hf_afp_dir_ar_o_search, tvb, offset, 4,   ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_dir_ar_o_read  , tvb, offset, 4,   ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_dir_ar_o_write , tvb, offset, 4,   ENC_BIG_ENDIAN);
 
-               proto_tree_add_item(sub_tree, hf_afp_dir_ar_g_search, tvb, offset, 4,   FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_dir_ar_g_read  , tvb, offset, 4,   FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_dir_ar_g_write , tvb, offset, 4,   FALSE);
+               proto_tree_add_item(sub_tree, hf_afp_dir_ar_g_search, tvb, offset, 4,   ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_dir_ar_g_read  , tvb, offset, 4,   ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_dir_ar_g_write , tvb, offset, 4,   ENC_BIG_ENDIAN);
 
-               proto_tree_add_item(sub_tree, hf_afp_dir_ar_e_search, tvb, offset, 4,   FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_dir_ar_e_read  , tvb, offset, 4,   FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_dir_ar_e_write , tvb, offset, 4,   FALSE);
+               proto_tree_add_item(sub_tree, hf_afp_dir_ar_e_search, tvb, offset, 4,   ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_dir_ar_e_read  , tvb, offset, 4,   ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_dir_ar_e_write , tvb, offset, 4,   ENC_BIG_ENDIAN);
 
-               proto_tree_add_item(sub_tree, hf_afp_dir_ar_u_search, tvb, offset, 4,   FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_dir_ar_u_read  , tvb, offset, 4,   FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_dir_ar_u_write , tvb, offset, 4,   FALSE);
+               proto_tree_add_item(sub_tree, hf_afp_dir_ar_u_search, tvb, offset, 4,   ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_dir_ar_u_read  , tvb, offset, 4,   ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_dir_ar_u_write , tvb, offset, 4,   ENC_BIG_ENDIAN);
 
-               proto_tree_add_item(sub_tree, hf_afp_dir_ar_blank   , tvb, offset, 4,   FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_dir_ar_u_own   , tvb, offset, 4,   FALSE);
+               proto_tree_add_item(sub_tree, hf_afp_dir_ar_blank   , tvb, offset, 4,   ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_dir_ar_u_own   , tvb, offset, 4,   ENC_BIG_ENDIAN);
        }
 }
 
@@ -1280,9 +1363,9 @@ decode_unix_privs (proto_tree *tree, tvbuff_t *tvb, gint offset)
                    "UNIX privileges");
                sub_tree = proto_item_add_subtree(item, ett_afp_unix_privs);
 
-               proto_tree_add_item(sub_tree, hf_afp_unix_privs_uid, tvb, offset, 4, FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_unix_privs_gid, tvb, offset+4, 4, FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_unix_privs_permissions, tvb, offset+8, 4, FALSE);
+               proto_tree_add_item(sub_tree, hf_afp_unix_privs_uid, tvb, offset, 4, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_unix_privs_gid, tvb, offset+4, 4, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_unix_privs_permissions, tvb, offset+8, 4, ENC_BIG_ENDIAN);
                decode_access_rights(sub_tree, tvb, hf_afp_unix_privs_ua_permissions, offset+12);
        }
 }
@@ -1296,13 +1379,13 @@ parse_long_filename(proto_tree *tree, tvbuff_t *tvb, gint offset, gint org_offse
        guint8 len;
 
        lnameoff = tvb_get_ntohs(tvb, offset);
-       proto_tree_add_item(tree, hf_afp_long_name_offset,tvb, offset, 2, FALSE);
+       proto_tree_add_item(tree, hf_afp_long_name_offset,tvb, offset, 2, ENC_BIG_ENDIAN);
        if (lnameoff) {
                tp_ofs = lnameoff +org_offset;
                len = tvb_get_guint8(tvb, tp_ofs);
-               proto_tree_add_item(tree, hf_afp_path_len, tvb, tp_ofs,  1,FALSE);
+               proto_tree_add_item(tree, hf_afp_path_len, tvb, tp_ofs,  1, ENC_BIG_ENDIAN);
                tp_ofs++;
-               proto_tree_add_item(tree, hf_afp_path_name, tvb, tp_ofs, len,FALSE);
+               proto_tree_add_item(tree, hf_afp_path_name, tvb, tp_ofs, len, ENC_UTF_8|ENC_NA);
                tp_ofs += len;
        }
        return tp_ofs;
@@ -1317,7 +1400,7 @@ parse_UTF8_filename(proto_tree *tree, tvbuff_t *tvb, gint offset, gint org_offse
        guint16 len;
 
        unameoff = tvb_get_ntohs(tvb, offset);
-       proto_tree_add_item(tree, hf_afp_unicode_name_offset,tvb, offset, 2, FALSE);
+       proto_tree_add_item(tree, hf_afp_unicode_name_offset,tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
        if (unameoff) {
              /* FIXME AFP3.x reuses PDINFO bit for UTF8.
@@ -1334,14 +1417,14 @@ parse_UTF8_filename(proto_tree *tree, tvbuff_t *tvb, gint offset, gint org_offse
                else if (tp_ofs < offset) {
                    tp_ofs = offset;
                }
-               proto_tree_add_item( tree, hf_afp_path_unicode_hint, tvb, tp_ofs, 4,FALSE);
+               proto_tree_add_item( tree, hf_afp_path_unicode_hint, tvb, tp_ofs, 4, ENC_BIG_ENDIAN);
                tp_ofs += 4;
 
                len = tvb_get_ntohs(tvb, tp_ofs);
-               proto_tree_add_item( tree, hf_afp_path_unicode_len, tvb, tp_ofs, 2,FALSE);
+               proto_tree_add_item( tree, hf_afp_path_unicode_len, tvb, tp_ofs, 2, ENC_BIG_ENDIAN);
                tp_ofs += 2;
 
-               proto_tree_add_item(tree, hf_afp_path_name, tvb, tp_ofs, len,FALSE);
+               proto_tree_add_item(tree, hf_afp_path_name, tvb, tp_ofs, len, ENC_UTF_8|ENC_NA);
                tp_ofs += len;
        }
        return tp_ofs;
@@ -1361,7 +1444,7 @@ parse_file_bitmap (proto_tree *tree, tvbuff_t *tvb, gint offset, guint16 bitmap,
                offset += 2;
        }
        if ((bitmap & kFPParentDirIDBit)) {
-               proto_tree_add_item(tree, hf_afp_did, tvb, offset, 4,FALSE);
+               proto_tree_add_item(tree, hf_afp_did, tvb, offset, 4, ENC_BIG_ENDIAN);
                offset += 4;
        }
        if ((bitmap & kFPCreateDateBit)) {
@@ -1377,7 +1460,7 @@ parse_file_bitmap (proto_tree *tree, tvbuff_t *tvb, gint offset, guint16 bitmap,
                offset += 4;
        }
        if ((bitmap & kFPFinderInfoBit)) {
-               proto_tree_add_item(tree, hf_afp_finder_info,tvb, offset, 32, FALSE);
+               proto_tree_add_item(tree, hf_afp_finder_info,tvb, offset, 32, ENC_NA);
                offset += 32;
        }
        if ((bitmap & kFPLongNameBit)) {
@@ -1391,26 +1474,26 @@ parse_file_bitmap (proto_tree *tree, tvbuff_t *tvb, gint offset, guint16 bitmap,
        }
        if ((bitmap & kFPShortNameBit)) {
                /* snameoff = tvb_get_ntohs(tvb, offset); */
-               proto_tree_add_item(tree, hf_afp_short_name_offset,tvb, offset, 2, FALSE);
+               proto_tree_add_item(tree, hf_afp_short_name_offset,tvb, offset, 2, ENC_BIG_ENDIAN);
                offset += 2;
        }
        if ((bitmap & kFPNodeIDBit)) {
-               proto_tree_add_item(tree, hf_afp_file_id, tvb, offset, 4,FALSE);
+               proto_tree_add_item(tree, hf_afp_file_id, tvb, offset, 4, ENC_BIG_ENDIAN);
                offset += 4;
        }
 
        if ((bitmap & kFPDataForkLenBit)) {
-               proto_tree_add_item(tree, hf_afp_file_DataForkLen, tvb, offset, 4,FALSE);
+               proto_tree_add_item(tree, hf_afp_file_DataForkLen, tvb, offset, 4, ENC_BIG_ENDIAN);
                offset += 4;
        }
 
        if ((bitmap & kFPRsrcForkLenBit)) {
-               proto_tree_add_item(tree, hf_afp_file_RsrcForkLen, tvb, offset, 4,FALSE);
+               proto_tree_add_item(tree, hf_afp_file_RsrcForkLen, tvb, offset, 4, ENC_BIG_ENDIAN);
                offset += 4;
        }
 
        if ((bitmap & kFPExtDataForkLenBit)) {
-               proto_tree_add_item(tree, hf_afp_file_ExtDataForkLen, tvb, offset, 8,FALSE);
+               proto_tree_add_item(tree, hf_afp_file_ExtDataForkLen, tvb, offset, 8, ENC_BIG_ENDIAN);
                offset += 8;
        }
 
@@ -1427,7 +1510,7 @@ parse_file_bitmap (proto_tree *tree, tvbuff_t *tvb, gint offset, guint16 bitmap,
        }
 
        if ((bitmap & kFPExtRsrcForkLenBit)) {
-               proto_tree_add_item(tree, hf_afp_file_ExtRsrcForkLen, tvb, offset, 8,FALSE);
+               proto_tree_add_item(tree, hf_afp_file_ExtRsrcForkLen, tvb, offset, 8, ENC_BIG_ENDIAN);
                offset += 8;
        }
 
@@ -1456,24 +1539,24 @@ decode_dir_bitmap (proto_tree *tree, tvbuff_t *tvb, gint offset)
 
        bitmap = tvb_get_ntohs(tvb, offset);
        if (tree) {
-               item = proto_tree_add_item(tree, hf_afp_dir_bitmap, tvb, offset, 2,FALSE);
+               item = proto_tree_add_item(tree, hf_afp_dir_bitmap, tvb, offset, 2, ENC_BIG_ENDIAN);
                sub_tree = proto_item_add_subtree(item, ett_afp_dir_bitmap);
 
-               proto_tree_add_item(sub_tree, hf_afp_dir_bitmap_Attributes     , tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_dir_bitmap_ParentDirID    , tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_dir_bitmap_CreateDate     , tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_dir_bitmap_ModDate        , tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_dir_bitmap_BackupDate     , tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_dir_bitmap_FinderInfo     , tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_dir_bitmap_LongName       , tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_dir_bitmap_ShortName      , tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_dir_bitmap_NodeID         , tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_dir_bitmap_OffspringCount , tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_dir_bitmap_OwnerID        , tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_dir_bitmap_GroupID        , tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_dir_bitmap_AccessRights   , tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_dir_bitmap_UTF8Name       , tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_dir_bitmap_UnixPrivs      , tvb, offset, 2,FALSE);
+               proto_tree_add_item(sub_tree, hf_afp_dir_bitmap_Attributes     , tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_dir_bitmap_ParentDirID    , tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_dir_bitmap_CreateDate     , tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_dir_bitmap_ModDate        , tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_dir_bitmap_BackupDate     , tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_dir_bitmap_FinderInfo     , tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_dir_bitmap_LongName       , tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_dir_bitmap_ShortName      , tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_dir_bitmap_NodeID         , tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_dir_bitmap_OffspringCount , tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_dir_bitmap_OwnerID        , tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_dir_bitmap_GroupID        , tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_dir_bitmap_AccessRights   , tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_dir_bitmap_UTF8Name       , tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_dir_bitmap_UnixPrivs      , tvb, offset, 2, ENC_BIG_ENDIAN);
        }
 
        return bitmap;
@@ -1493,14 +1576,14 @@ decode_dir_attribute(proto_tree *tree, tvbuff_t *tvb, gint offset)
                                        "Directory Attributes: 0x%04x", attribute);
                sub_tree = proto_item_add_subtree(item, ett_afp_dir_attribute);
 
-               proto_tree_add_item(sub_tree, hf_afp_dir_attribute_Invisible    , tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_dir_attribute_IsExpFolder  , tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_dir_attribute_System       , tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_dir_attribute_Mounted      , tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_dir_attribute_InExpFolder  , tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_dir_attribute_BackUpNeeded , tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_dir_attribute_RenameInhibit, tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_dir_attribute_DeleteInhibit, tvb, offset, 2,FALSE);
+               proto_tree_add_item(sub_tree, hf_afp_dir_attribute_Invisible    , tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_dir_attribute_IsExpFolder  , tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_dir_attribute_System       , tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_dir_attribute_Mounted      , tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_dir_attribute_InExpFolder  , tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_dir_attribute_BackUpNeeded , tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_dir_attribute_RenameInhibit, tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_dir_attribute_DeleteInhibit, tvb, offset, 2, ENC_BIG_ENDIAN);
        }
 
        return(attribute);
@@ -1520,7 +1603,7 @@ parse_dir_bitmap (proto_tree *tree, tvbuff_t *tvb, gint offset, guint16 bitmap)
                offset += 2;
        }
        if ((bitmap & kFPParentDirIDBit)) {
-               proto_tree_add_item(tree, hf_afp_did, tvb, offset, 4,FALSE);
+               proto_tree_add_item(tree, hf_afp_did, tvb, offset, 4, ENC_BIG_ENDIAN);
                offset += 4;
        }
        if ((bitmap & kFPCreateDateBit)) {
@@ -1536,7 +1619,7 @@ parse_dir_bitmap (proto_tree *tree, tvbuff_t *tvb, gint offset, guint16 bitmap)
                offset += 4;
        }
        if ((bitmap & kFPFinderInfoBit)) {
-               proto_tree_add_item(tree, hf_afp_finder_info,tvb, offset, 32, FALSE);
+               proto_tree_add_item(tree, hf_afp_finder_info,tvb, offset, 32, ENC_NA);
                offset += 32;
        }
        if ((bitmap & kFPLongNameBit)) {
@@ -1549,23 +1632,23 @@ parse_dir_bitmap (proto_tree *tree, tvbuff_t *tvb, gint offset, guint16 bitmap)
        }
        if ((bitmap & kFPShortNameBit)) {
                /* snameoff = tvb_get_ntohs(tvb, offset); */
-               proto_tree_add_item(tree, hf_afp_short_name_offset,tvb, offset, 2, FALSE);
+               proto_tree_add_item(tree, hf_afp_short_name_offset,tvb, offset, 2, ENC_BIG_ENDIAN);
                offset += 2;
        }
        if ((bitmap & kFPNodeIDBit)) {
-               proto_tree_add_item(tree, hf_afp_file_id, tvb, offset, 4,FALSE);
+               proto_tree_add_item(tree, hf_afp_file_id, tvb, offset, 4, ENC_BIG_ENDIAN);
                offset += 4;
        }
        if ((bitmap & kFPOffspringCountBit)) {
-               proto_tree_add_item(tree, hf_afp_dir_offspring, tvb, offset, 2,FALSE);
+               proto_tree_add_item(tree, hf_afp_dir_offspring, tvb, offset, 2, ENC_BIG_ENDIAN);
                offset += 2;            /* error in AFP3.0.pdf */
        }
        if ((bitmap & kFPOwnerIDBit)) {
-               proto_tree_add_item(tree, hf_afp_dir_OwnerID, tvb, offset, 4,   FALSE);
+               proto_tree_add_item(tree, hf_afp_dir_OwnerID, tvb, offset, 4,   ENC_BIG_ENDIAN);
                offset += 4;
        }
        if ((bitmap & kFPGroupIDBit)) {
-               proto_tree_add_item(tree, hf_afp_dir_GroupID, tvb, offset, 4,   FALSE);
+               proto_tree_add_item(tree, hf_afp_dir_GroupID, tvb, offset, 4,   ENC_BIG_ENDIAN);
                offset += 4;
        }
        if ((bitmap & kFPAccessRightsBit)) {
@@ -1700,16 +1783,25 @@ name_in_fbitmap(tvbuff_t *tvb, gint offset, guint16 bitmap)
        return name;
 }
 
+/* -------------------------- */
+static gint
+decode_vol(proto_tree *tree, tvbuff_t *tvb, gint offset)
+{
+       Vol = tvb_get_ntohs(tvb, offset);
+       proto_tree_add_item(tree, hf_afp_vol_id, tvb, offset, 2, ENC_BIG_ENDIAN);
+       return offset + 2;
+}
+
 /* -------------------------- */
 static gint
 decode_vol_did(proto_tree *tree, tvbuff_t *tvb, gint offset)
 {
        Vol = tvb_get_ntohs(tvb, offset);
-       proto_tree_add_item(tree, hf_afp_vol_id, tvb, offset, 2,FALSE);
+       proto_tree_add_item(tree, hf_afp_vol_id, tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
 
        Did = tvb_get_ntohl(tvb, offset);
-       proto_tree_add_item(tree, hf_afp_did, tvb, offset, 4,FALSE);
+       proto_tree_add_item(tree, hf_afp_did, tvb, offset, 4, ENC_BIG_ENDIAN);
        offset += 4;
        return offset;
 }
@@ -1787,16 +1879,16 @@ decode_name_label (proto_tree *tree, packet_info *pinfo, tvbuff_t *tvb, gint off
                item = proto_tree_add_text(tree, tvb, offset, len +header, label, name);
                sub_tree = proto_item_add_subtree(item, ett_afp_path_name);
 
-               proto_tree_add_item(  sub_tree, hf_afp_path_type, tvb, offset,   1,FALSE);
+               proto_tree_add_item(  sub_tree, hf_afp_path_type, tvb, offset,   1, ENC_BIG_ENDIAN);
                offset++;
                if (type == 3) {
-                       proto_tree_add_item( sub_tree, hf_afp_path_unicode_hint,  tvb, offset,  4,FALSE);
+                       proto_tree_add_item( sub_tree, hf_afp_path_unicode_hint,  tvb, offset,  4, ENC_BIG_ENDIAN);
                        offset += 4;
-                       proto_tree_add_item( sub_tree, hf_afp_path_unicode_len,  tvb, offset,   2,FALSE);
+                       proto_tree_add_item( sub_tree, hf_afp_path_unicode_len,  tvb, offset,   2, ENC_BIG_ENDIAN);
                        offset += 2;
                }
                else {
-                       proto_tree_add_item( sub_tree, hf_afp_path_len,  tvb, offset,   1,FALSE);
+                       proto_tree_add_item( sub_tree, hf_afp_path_len,  tvb, offset,   1, ENC_BIG_ENDIAN);
                        offset++;
                }
 
@@ -1857,13 +1949,13 @@ dissect_query_afp_open_vol(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
        if (!tree)
                return offset;
 
-       proto_tree_add_item(tree, hf_afp_vol_name, tvb, offset, 1,FALSE);
+       proto_tree_add_item(tree, hf_afp_vol_name, tvb, offset, 1, ENC_UTF_8|ENC_BIG_ENDIAN);
        offset += len +1;
 
        len = tvb_reported_length_remaining(tvb,offset);
        if (len >= 8) {
-               /* optionnal password */
-               proto_tree_add_item(tree, hf_afp_passwd, tvb, offset, 8,FALSE);
+               /* optional password */
+               proto_tree_add_item(tree, hf_afp_passwd, tvb, offset, 8, ENC_UTF_8|ENC_NA);
                offset += 8;
        }
        return offset;
@@ -1918,8 +2010,8 @@ dissect_reply_afp_get_server_param(tvbuff_t *tvb, packet_info *pinfo _U_, proto_
 
                ti = proto_tree_add_text(tree, tvb, offset , 1,"Flags : 0x%02x", flag);
                flag_tree = proto_item_add_subtree(ti, ett_afp_vol_flag);
-               proto_tree_add_item(flag_tree, hf_afp_vol_flag_passwd, tvb, offset, 1,FALSE);
-               proto_tree_add_item(flag_tree, hf_afp_vol_flag_has_config, tvb, offset, 1,FALSE);
+               proto_tree_add_item(flag_tree, hf_afp_vol_flag_passwd, tvb, offset, 1, ENC_BIG_ENDIAN);
+               proto_tree_add_item(flag_tree, hf_afp_vol_flag_has_config, tvb, offset, 1, ENC_BIG_ENDIAN);
                offset++;
 
                len  = tvb_get_guint8(tvb, offset) +1;
@@ -1927,7 +2019,7 @@ dissect_reply_afp_get_server_param(tvbuff_t *tvb, packet_info *pinfo _U_, proto_
                proto_item_set_text(item, "%s", rep);
                proto_item_set_len(item, len +1);
 
-               proto_tree_add_item(tree, hf_afp_vol_name, tvb, offset, 1,FALSE);
+               proto_tree_add_item(tree, hf_afp_vol_name, tvb, offset, 1, ENC_UTF_8|ENC_BIG_ENDIAN);
 
                offset += len;
        }
@@ -1950,7 +2042,7 @@ dissect_query_afp_with_vol_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree
                return offset;
        PAD(1);
 
-       proto_tree_add_item(tree, hf_afp_vol_id, tvb, offset, 2,FALSE);
+       proto_tree_add_item(tree, hf_afp_vol_id, tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
        return offset;
 }
@@ -1962,7 +2054,7 @@ dissect_query_afp_open_fork(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
        proto_tree *sub_tree = NULL;
        proto_item *item;
 
-       proto_tree_add_item(tree, hf_afp_fork_type, tvb, offset, 1,FALSE);
+       proto_tree_add_item(tree, hf_afp_fork_type, tvb, offset, 1, ENC_BIG_ENDIAN);
        offset++;
 
        offset = decode_vol_did(tree, tvb, offset);
@@ -1970,13 +2062,13 @@ dissect_query_afp_open_fork(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
        decode_file_bitmap(tree, tvb, offset);
        offset += 2;
        if (tree) {
-               item = proto_tree_add_item(tree, hf_afp_access_mode, tvb, offset, 2,FALSE);
+               item = proto_tree_add_item(tree, hf_afp_access_mode, tvb, offset, 2, ENC_BIG_ENDIAN);
                sub_tree = proto_item_add_subtree(item, ett_afp_access_mode);
 
-               proto_tree_add_item(sub_tree, hf_afp_access_read      , tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_access_write     , tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_access_deny_read , tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_access_deny_write, tvb, offset, 2,FALSE);
+               proto_tree_add_item(sub_tree, hf_afp_access_read      , tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_access_write     , tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_access_deny_read , tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_access_deny_write, tvb, offset, 2, ENC_BIG_ENDIAN);
        }
        offset += 2;
 
@@ -1995,7 +2087,7 @@ dissect_reply_afp_open_fork(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
        offset += 2;
 
        add_info_fork(tvb, pinfo, offset);
-       proto_tree_add_item(tree, hf_afp_ofork, tvb, offset, 2,FALSE);
+       proto_tree_add_item(tree, hf_afp_ofork, tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
 
        offset = parse_file_bitmap(tree, tvb, offset, f_bitmap,0);
@@ -2011,13 +2103,13 @@ dissect_query_afp_enumerate_ext2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *
        PAD(1);
        offset = decode_vol_did_file_dir_bitmap(tree, tvb, offset);
 
-       proto_tree_add_item(tree, hf_afp_req_count, tvb, offset, 2,FALSE);
+       proto_tree_add_item(tree, hf_afp_req_count, tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
 
-       proto_tree_add_item(tree, hf_afp_start_index32, tvb, offset, 4,FALSE);
+       proto_tree_add_item(tree, hf_afp_start_index32, tvb, offset, 4, ENC_BIG_ENDIAN);
        offset += 4;
 
-       proto_tree_add_item(tree, hf_afp_max_reply_size32, tvb, offset, 4,FALSE);
+       proto_tree_add_item(tree, hf_afp_max_reply_size32, tvb, offset, 4, ENC_BIG_ENDIAN);
        offset += 4;
 
        offset = decode_name(tree, pinfo, tvb, offset);
@@ -2033,13 +2125,13 @@ dissect_query_afp_enumerate(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
        PAD(1);
        offset = decode_vol_did_file_dir_bitmap(tree, tvb, offset);
 
-       proto_tree_add_item(tree, hf_afp_req_count, tvb, offset, 2,FALSE);
+       proto_tree_add_item(tree, hf_afp_req_count, tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
 
-       proto_tree_add_item(tree, hf_afp_start_index, tvb, offset, 2,FALSE);
+       proto_tree_add_item(tree, hf_afp_start_index, tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
 
-       proto_tree_add_item(tree, hf_afp_max_reply_size, tvb, offset, 2,FALSE);
+       proto_tree_add_item(tree, hf_afp_max_reply_size, tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
 
        offset = decode_name(tree, pinfo, tvb, offset);
@@ -2093,15 +2185,15 @@ loop_record(tvbuff_t *tvb, proto_tree *ptree, gint offset,
                        tree = proto_item_add_subtree(item, ett_afp_enumerate_line);
                }
                if (ext) {
-                       proto_tree_add_item(tree, hf_afp_struct_size16, tvb, offset, 2,FALSE);
+                       proto_tree_add_item(tree, hf_afp_struct_size16, tvb, offset, 2, ENC_BIG_ENDIAN);
                        offset += 2;
                }
                else {
-                       proto_tree_add_item(tree, hf_afp_struct_size, tvb, offset, 1,FALSE);
+                       proto_tree_add_item(tree, hf_afp_struct_size, tvb, offset, 1, ENC_BIG_ENDIAN);
                        offset++;
                }
 
-               proto_tree_add_item(tree, hf_afp_file_flag, tvb, offset, 1,FALSE);
+               proto_tree_add_item(tree, hf_afp_file_flag, tvb, offset, 1, ENC_BIG_ENDIAN);
                offset++;
                if (ext) {
                        PAD(1);
@@ -2136,7 +2228,7 @@ reply_enumerate(tvbuff_t *tvb, proto_tree *tree, gint offset, int ext)
 
        count = tvb_get_ntohs(tvb, offset);
        if (tree) {
-               item = proto_tree_add_item(tree, hf_afp_req_count, tvb, offset, 2,FALSE);
+               item = proto_tree_add_item(tree, hf_afp_req_count, tvb, offset, 2, ENC_BIG_ENDIAN);
                sub_tree = proto_item_add_subtree(item, ett_afp_enumerate);
        }
        offset += 2;
@@ -2180,16 +2272,16 @@ catsearch_spec(tvbuff_t *tvb, proto_tree *ptree, gint offset, int ext, guint32  b
        tree = proto_item_add_subtree(item, ett_afp_cat_spec);
 
        if (ext) {
-               proto_tree_add_item(tree, hf_afp_struct_size16, tvb, offset, 2,FALSE);
+               proto_tree_add_item(tree, hf_afp_struct_size16, tvb, offset, 2, ENC_BIG_ENDIAN);
                offset += 2;
        }
        else {
-               proto_tree_add_item(tree, hf_afp_struct_size, tvb, offset, 1,FALSE);
+               proto_tree_add_item(tree, hf_afp_struct_size, tvb, offset, 1, ENC_BIG_ENDIAN);
                offset++;
                PAD(1);
        }
 
-       offset = parse_file_bitmap(tree, tvb, offset, (guint16) bitmap,0);
+       parse_file_bitmap(tree, tvb, offset, (guint16) bitmap,0);
        offset = org +size;
 
        return offset;
@@ -2209,16 +2301,16 @@ query_catsearch(tvbuff_t *tvb, proto_tree *ptree, gint offset, int ext)
                return offset;
        PAD(1);
 
-       proto_tree_add_item(ptree, hf_afp_vol_id, tvb, offset, 2,FALSE);
+       proto_tree_add_item(ptree, hf_afp_vol_id, tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
 
-       proto_tree_add_item(ptree, hf_afp_cat_req_matches, tvb, offset, 4,FALSE);
+       proto_tree_add_item(ptree, hf_afp_cat_req_matches, tvb, offset, 4, ENC_BIG_ENDIAN);
        offset += 4;
 
-       proto_tree_add_item(ptree, hf_afp_reserved, tvb, offset, 4,FALSE);
+       proto_tree_add_item(ptree, hf_afp_reserved, tvb, offset, 4, ENC_NA);
        offset += 4;
 
-       proto_tree_add_item(ptree, hf_afp_cat_position, tvb, offset, 16,FALSE);
+       proto_tree_add_item(ptree, hf_afp_cat_position, tvb, offset, 16, ENC_NA);
        offset += 16;
 
        f_bitmap = decode_file_bitmap(ptree, tvb, offset);
@@ -2229,35 +2321,35 @@ query_catsearch(tvbuff_t *tvb, proto_tree *ptree, gint offset, int ext)
 
        r_bitmap = tvb_get_ntohl(tvb, offset);
        /* Already checked this above: if (ptree) */ {
-               item = proto_tree_add_item(ptree, hf_afp_file_bitmap, tvb, offset, 4,FALSE);
+               item = proto_tree_add_item(ptree, hf_afp_file_bitmap, tvb, offset, 4, ENC_BIG_ENDIAN);
                sub_tree = proto_item_add_subtree(item, ett_afp_cat_r_bitmap);
 
-               proto_tree_add_item(sub_tree, hf_afp_request_bitmap_Attributes      , tvb, offset, 4,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_request_bitmap_ParentDirID    , tvb, offset, 4,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_request_bitmap_CreateDate     , tvb, offset, 4,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_request_bitmap_ModDate        , tvb, offset, 4,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_request_bitmap_BackupDate     , tvb, offset, 4,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_request_bitmap_FinderInfo     , tvb, offset, 4,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_request_bitmap_LongName       , tvb, offset, 4,FALSE);
+               proto_tree_add_item(sub_tree, hf_afp_request_bitmap_Attributes , tvb, offset, 4, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_request_bitmap_ParentDirID, tvb, offset, 4, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_request_bitmap_CreateDate , tvb, offset, 4, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_request_bitmap_ModDate    , tvb, offset, 4, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_request_bitmap_BackupDate , tvb, offset, 4, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_request_bitmap_FinderInfo , tvb, offset, 4, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_request_bitmap_LongName   , tvb, offset, 4, ENC_BIG_ENDIAN);
 
                if (d_bitmap == 0) {
                        /* Only for file-only searches */
-                       proto_tree_add_item(sub_tree, hf_afp_request_bitmap_DataForkLen         , tvb, offset, 4,FALSE);
-                       proto_tree_add_item(sub_tree, hf_afp_request_bitmap_RsrcForkLen         , tvb, offset, 4,FALSE);
-                       proto_tree_add_item(sub_tree, hf_afp_request_bitmap_ExtDataForkLen      , tvb, offset, 4,FALSE);
+                       proto_tree_add_item(sub_tree, hf_afp_request_bitmap_DataForkLen    , tvb, offset, 4, ENC_BIG_ENDIAN);
+                       proto_tree_add_item(sub_tree, hf_afp_request_bitmap_RsrcForkLen    , tvb, offset, 4, ENC_BIG_ENDIAN);
+                       proto_tree_add_item(sub_tree, hf_afp_request_bitmap_ExtDataForkLen , tvb, offset, 4, ENC_BIG_ENDIAN);
                }
                if (f_bitmap == 0) {
                        /* Only for directory-only searches */
-                       proto_tree_add_item(sub_tree, hf_afp_request_bitmap_OffspringCount      , tvb, offset, 4,FALSE);
+                       proto_tree_add_item(sub_tree, hf_afp_request_bitmap_OffspringCount      , tvb, offset, 4, ENC_BIG_ENDIAN);
                }
 
-               proto_tree_add_item(sub_tree, hf_afp_request_bitmap_UTF8Name        , tvb, offset, 4,FALSE);
+               proto_tree_add_item(sub_tree, hf_afp_request_bitmap_UTF8Name        , tvb, offset, 4, ENC_BIG_ENDIAN);
 
                if (d_bitmap == 0) {
                        /* Only for file-only searches */
-                       proto_tree_add_item(sub_tree, hf_afp_request_bitmap_ExtRsrcForkLen      , tvb, offset, 4,FALSE);
+                       proto_tree_add_item(sub_tree, hf_afp_request_bitmap_ExtRsrcForkLen      , tvb, offset, 4, ENC_BIG_ENDIAN);
                }
-               proto_tree_add_item(sub_tree, hf_afp_request_bitmap_PartialNames        , tvb, offset, 4,FALSE);
+               proto_tree_add_item(sub_tree, hf_afp_request_bitmap_PartialNames        , tvb, offset, 4, ENC_BIG_ENDIAN);
        }
        offset += 4;
 
@@ -2295,7 +2387,7 @@ reply_catsearch(tvbuff_t *tvb, proto_tree *tree, gint offset, int ext)
        guint16 d_bitmap;
        int count;
 
-       proto_tree_add_item(tree, hf_afp_cat_position, tvb, offset, 16,FALSE);
+       proto_tree_add_item(tree, hf_afp_cat_position, tvb, offset, 16, ENC_NA);
        offset += 16;
 
        f_bitmap = decode_file_bitmap(tree, tvb, offset);
@@ -2306,7 +2398,7 @@ reply_catsearch(tvbuff_t *tvb, proto_tree *tree, gint offset, int ext)
 
        count = tvb_get_ntohl(tvb, offset);
        if (tree) {
-               item = proto_tree_add_item(tree, hf_afp_cat_count, tvb, offset, 4,FALSE);
+               item = proto_tree_add_item(tree, hf_afp_cat_count, tvb, offset, 4, ENC_BIG_ENDIAN);
                sub_tree = proto_item_add_subtree(item, ett_afp_cat_search);
        }
        offset += 4;
@@ -2336,7 +2428,7 @@ dissect_query_afp_get_vol_param(tvbuff_t *tvb, packet_info *pinfo, proto_tree *t
        PAD(1)
        add_info_vol(tvb, pinfo, offset);
 
-       proto_tree_add_item(tree, hf_afp_vol_id, tvb, offset, 2,FALSE);
+       proto_tree_add_item(tree, hf_afp_vol_id, tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
 
        decode_vol_bitmap(tree, tvb, offset);
@@ -2368,7 +2460,7 @@ dissect_query_afp_set_vol_param(tvbuff_t *tvb, packet_info *pinfo, proto_tree *t
        PAD(1)
 
        add_info_vol(tvb, pinfo, offset);
-       proto_tree_add_item(tree, hf_afp_vol_id, tvb, offset, 2,FALSE);
+       proto_tree_add_item(tree, hf_afp_vol_id, tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
 
        bitmap = decode_vol_bitmap(tree, tvb, offset);
@@ -2390,7 +2482,7 @@ decode_uam_parameters(const guint8 *uam, int len_uam, tvbuff_t *tvb, proto_tree
                        PAD(1);
 
                len = 8; /* tvb_strsize(tvb, offset);*/
-               proto_tree_add_item(tree, hf_afp_passwd, tvb, offset, len,FALSE);
+               proto_tree_add_item(tree, hf_afp_passwd, tvb, offset, len, ENC_UTF_8|ENC_NA);
                offset += len;
        }
        else if (!g_ascii_strncasecmp(uam, "DHCAST128", len_uam)) {
@@ -2398,7 +2490,7 @@ decode_uam_parameters(const guint8 *uam, int len_uam, tvbuff_t *tvb, proto_tree
                        PAD(1);
 
                len = 16;
-               proto_tree_add_item(tree, hf_afp_random, tvb, offset, len,FALSE);
+               proto_tree_add_item(tree, hf_afp_random, tvb, offset, len, ENC_NA);
                offset += len;
        }
        else if (!g_ascii_strncasecmp(uam, "2-Way Randnum exchange", len_uam)) {
@@ -2417,11 +2509,11 @@ dissect_query_afp_login(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
        const guint8 *uam;
 
        len = tvb_get_guint8(tvb, offset);
-       proto_tree_add_item(tree, hf_afp_AFPVersion, tvb, offset, 1,FALSE);
+       proto_tree_add_item(tree, hf_afp_Version, tvb, offset, 1, ENC_UTF_8|ENC_BIG_ENDIAN);
        offset += len +1;
        len_uam = tvb_get_guint8(tvb, offset);
-       uam = tvb_get_ptr(tvb, offset +1, len_uam);
-       proto_tree_add_item(tree, hf_afp_UAM, tvb, offset, 1,FALSE);
+       uam = tvb_get_ephemeral_string(tvb, offset +1, len_uam);
+       proto_tree_add_item(tree, hf_afp_UAM, tvb, offset, 1, ENC_UTF_8|ENC_BIG_ENDIAN);
        offset += len_uam +1;
 
        if (!g_ascii_strncasecmp(uam, "No User Authent", len_uam)) {
@@ -2429,7 +2521,7 @@ dissect_query_afp_login(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
        }
 
        len = tvb_get_guint8(tvb, offset);
-       proto_tree_add_item(tree, hf_afp_user, tvb, offset, 1,FALSE);
+       proto_tree_add_item(tree, hf_afp_user, tvb, offset, 1, ENC_UTF_8|ENC_BIG_ENDIAN);
        offset += len +1;
 
        return decode_uam_parameters(uam, len_uam, tvb, tree, offset);
@@ -2442,52 +2534,49 @@ dissect_query_afp_login_ext(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *t
        int len;
        int len_uam;
        const guint8 *uam;
-       guint8 type;
-
-       type = tvb_get_guint8(tvb, offset);
+       guint8 path_type;
 
        PAD(1);
-       proto_tree_add_item(tree, hf_afp_login_flags, tvb, offset, 2,FALSE);
+       proto_tree_add_item(tree, hf_afp_login_flags, tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
 
        len = tvb_get_guint8(tvb, offset);
-       proto_tree_add_item(tree, hf_afp_AFPVersion, tvb, offset, 1,FALSE);
+       proto_tree_add_item(tree, hf_afp_Version, tvb, offset, 1, ENC_UTF_8|ENC_BIG_ENDIAN);
        offset += len +1;
 
        len_uam = tvb_get_guint8(tvb, offset);
-       uam = tvb_get_ptr(tvb, offset +1, len_uam);
-       proto_tree_add_item(tree, hf_afp_UAM, tvb, offset, 1,FALSE);
+       uam = tvb_get_ephemeral_string(tvb, offset +1, len_uam);
+       proto_tree_add_item(tree, hf_afp_UAM, tvb, offset, 1, ENC_UTF_8|ENC_BIG_ENDIAN);
        offset += len_uam +1;
 
-       type = tvb_get_guint8(tvb, offset);
-       proto_tree_add_item(tree, hf_afp_user_type, tvb, offset, 1,FALSE);
+       proto_tree_add_item(tree, hf_afp_user_type, tvb, offset, 1, ENC_BIG_ENDIAN);
        offset++;
        /* only type 3 */
        len = tvb_get_ntohs(tvb, offset);
-       proto_tree_add_item(tree, hf_afp_user_len, tvb, offset, 2,FALSE);
+       proto_tree_add_item(tree, hf_afp_user_len, tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
-       proto_tree_add_item(tree, hf_afp_user_name, tvb, offset, len,FALSE);
+       proto_tree_add_item(tree, hf_afp_user_name, tvb, offset, len, ENC_UTF_8|ENC_NA);
        offset += len;
 
        /* directory service */
-       type = tvb_get_guint8(tvb, offset);
-       proto_tree_add_item(tree, hf_afp_path_type, tvb, offset, 1,FALSE);
+       path_type = tvb_get_guint8(tvb, offset);
+       proto_tree_add_item(tree, hf_afp_path_type, tvb, offset, 1, ENC_BIG_ENDIAN);
        offset++;
        /* FIXME use 16 bit len + unicode from smb dissector */
-       switch (type) {
+       switch (path_type) {
        case 1:
        case 2:
                len = tvb_get_guint8(tvb, offset);
-               proto_tree_add_item(tree, hf_afp_path_len, tvb, offset,  1,FALSE);
+               proto_tree_add_item(tree, hf_afp_path_len, tvb, offset,  1, ENC_BIG_ENDIAN);
                offset++;
-               proto_tree_add_item(tree, hf_afp_path_name, tvb, offset, len,FALSE);
+               proto_tree_add_item(tree, hf_afp_path_name, tvb, offset, len, ENC_UTF_8|ENC_NA);
                offset += len;
                break;
        case 3:
                len = tvb_get_ntohs(tvb, offset);
-               proto_tree_add_item( tree, hf_afp_path_unicode_len, tvb, offset, 2,FALSE);
+               proto_tree_add_item( tree, hf_afp_path_unicode_len, tvb, offset, 2, ENC_BIG_ENDIAN);
                offset += 2;
-               proto_tree_add_item(tree, hf_afp_path_name, tvb, offset, len,FALSE);
+               proto_tree_add_item(tree, hf_afp_path_name, tvb, offset, len, ENC_UTF_8|ENC_NA);
                offset += len;
                break;
        default:
@@ -2504,19 +2593,19 @@ dissect_query_afp_write(tvbuff_t *tvb, packet_info *pinfo , proto_tree *tree, gi
        int  param;
 
 
-       proto_tree_add_item(tree, hf_afp_flag, tvb, offset, 1,FALSE);
+       proto_tree_add_item(tree, hf_afp_flag, tvb, offset, 1, ENC_BIG_ENDIAN);
        offset += 1;
 
        add_info_fork(tvb, pinfo, offset);
-       proto_tree_add_item(tree, hf_afp_ofork, tvb, offset, 2,FALSE);
+       proto_tree_add_item(tree, hf_afp_ofork, tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
 
-       proto_tree_add_item(tree, hf_afp_offset, tvb, offset, 4,FALSE);
+       proto_tree_add_item(tree, hf_afp_offset, tvb, offset, 4, ENC_BIG_ENDIAN);
        param = tvb_get_ntohl(tvb, offset);
        col_append_fstr(pinfo->cinfo, COL_INFO, " Offset=%d", param);
        offset += 4;
 
-       proto_tree_add_item(tree, hf_afp_rw_count, tvb, offset, 4,FALSE);
+       proto_tree_add_item(tree, hf_afp_rw_count, tvb, offset, 4, ENC_BIG_ENDIAN);
        param = tvb_get_ntohl(tvb, offset);
        col_append_fstr(pinfo->cinfo, COL_INFO, " Size=%d", param);
        offset += 4;
@@ -2527,7 +2616,7 @@ dissect_query_afp_write(tvbuff_t *tvb, packet_info *pinfo , proto_tree *tree, gi
 static gint
 dissect_reply_afp_write(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, gint offset)
 {
-       proto_tree_add_item(tree, hf_afp_last_written, tvb, offset, 4, FALSE);
+       proto_tree_add_item(tree, hf_afp_last_written, tvb, offset, 4, ENC_BIG_ENDIAN);
        offset += 4;
 
        return offset;
@@ -2537,17 +2626,17 @@ dissect_reply_afp_write(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
 static gint
 dissect_query_afp_write_ext(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, gint offset)
 {
-       proto_tree_add_item(tree, hf_afp_flag, tvb, offset, 1,FALSE);
+       proto_tree_add_item(tree, hf_afp_flag, tvb, offset, 1, ENC_BIG_ENDIAN);
        offset += 1;
 
        add_info_fork(tvb, pinfo, offset);
-       proto_tree_add_item(tree, hf_afp_ofork, tvb, offset, 2,FALSE);
+       proto_tree_add_item(tree, hf_afp_ofork, tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
 
-       proto_tree_add_item(tree, hf_afp_offset64, tvb, offset, 8,FALSE);
+       proto_tree_add_item(tree, hf_afp_offset64, tvb, offset, 8, ENC_BIG_ENDIAN);
        offset += 8;
 
-       proto_tree_add_item(tree, hf_afp_rw_count64, tvb, offset, 8,FALSE);
+       proto_tree_add_item(tree, hf_afp_rw_count64, tvb, offset, 8, ENC_BIG_ENDIAN);
        offset += 8;
 
        return offset;
@@ -2556,7 +2645,7 @@ dissect_query_afp_write_ext(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *t
 static gint
 dissect_reply_afp_write_ext(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, gint offset)
 {
-       proto_tree_add_item(tree, hf_afp_last_written64, tvb, offset, 8, FALSE);
+       proto_tree_add_item(tree, hf_afp_last_written64, tvb, offset, 8, ENC_BIG_ENDIAN);
        offset += 8;
 
        return offset;
@@ -2571,23 +2660,23 @@ dissect_query_afp_read(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
        PAD(1);
 
        add_info_fork(tvb, pinfo, offset);
-       proto_tree_add_item(tree, hf_afp_ofork, tvb, offset, 2,FALSE);
+       proto_tree_add_item(tree, hf_afp_ofork, tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
 
-       proto_tree_add_item(tree, hf_afp_offset, tvb, offset, 4,FALSE);
+       proto_tree_add_item(tree, hf_afp_offset, tvb, offset, 4, ENC_BIG_ENDIAN);
        param = tvb_get_ntohl(tvb, offset);
        col_append_fstr(pinfo->cinfo, COL_INFO, " Offset=%d", param);
        offset += 4;
 
-       proto_tree_add_item(tree, hf_afp_rw_count, tvb, offset, 4,FALSE);
+       proto_tree_add_item(tree, hf_afp_rw_count, tvb, offset, 4, ENC_BIG_ENDIAN);
        param = tvb_get_ntohl(tvb, offset);
        col_append_fstr(pinfo->cinfo, COL_INFO, " Size=%d", param);
        offset += 4;
 
-       proto_tree_add_item(tree, hf_afp_newline_mask, tvb, offset, 1,FALSE);
+       proto_tree_add_item(tree, hf_afp_newline_mask, tvb, offset, 1, ENC_BIG_ENDIAN);
        offset++;
 
-       proto_tree_add_item(tree, hf_afp_newline_char, tvb, offset, 1,FALSE);
+       proto_tree_add_item(tree, hf_afp_newline_char, tvb, offset, 1, ENC_BIG_ENDIAN);
        offset++;
 
        return offset;
@@ -2600,13 +2689,13 @@ dissect_query_afp_read_ext(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tr
        PAD(1);
 
        add_info_fork(tvb, pinfo, offset);
-       proto_tree_add_item(tree, hf_afp_ofork, tvb, offset, 2,FALSE);
+       proto_tree_add_item(tree, hf_afp_ofork, tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
 
-       proto_tree_add_item(tree, hf_afp_offset64, tvb, offset, 8,FALSE);
+       proto_tree_add_item(tree, hf_afp_offset64, tvb, offset, 8, ENC_BIG_ENDIAN);
        offset += 8;
 
-       proto_tree_add_item(tree, hf_afp_rw_count64, tvb, offset, 8,FALSE);
+       proto_tree_add_item(tree, hf_afp_rw_count64, tvb, offset, 8, ENC_BIG_ENDIAN);
        offset += 8;
 
        return offset;
@@ -2620,7 +2709,7 @@ dissect_query_afp_read_ext(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tr
 static gint
 dissect_reply_afp_open_dt(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, gint offset)
 {
-       proto_tree_add_item(tree, hf_afp_dt_ref, tvb, offset, 2,FALSE);
+       proto_tree_add_item(tree, hf_afp_dt_ref, tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
 
        return offset;
@@ -2633,7 +2722,7 @@ static gint
 dissect_query_afp_close_dt(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, gint offset)
 {
        PAD(1);
-       proto_tree_add_item(tree, hf_afp_dt_ref, tvb, offset, 2,FALSE);
+       proto_tree_add_item(tree, hf_afp_dt_ref, tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
 
        return offset;
@@ -2652,7 +2741,7 @@ dissect_query_afp_with_fork(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
 {
        PAD(1);
        add_info_fork(tvb, pinfo, offset);
-       proto_tree_add_item(tree, hf_afp_ofork, tvb, offset, 2,FALSE);
+       proto_tree_add_item(tree, hf_afp_ofork, tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
 
        return offset;
@@ -2684,7 +2773,7 @@ dissect_reply_afp_get_fldr_param(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tr
        offset += 2;
 
        flags = tvb_get_guint8(tvb, offset);
-       proto_tree_add_item(tree, hf_afp_file_flag, tvb, offset, 1,FALSE);
+       proto_tree_add_item(tree, hf_afp_file_flag, tvb, offset, 1, ENC_BIG_ENDIAN);
        offset++;
        PAD(1);
        if (flags) {
@@ -2791,7 +2880,7 @@ dissect_query_afp_create_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
 static gint
 dissect_reply_afp_create_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, gint offset)
 {
-       proto_tree_add_item(tree, hf_afp_file_id, tvb, offset, 4,FALSE);
+       proto_tree_add_item(tree, hf_afp_file_id, tvb, offset, 4, ENC_BIG_ENDIAN);
        offset += 4;
 
        return offset;
@@ -2801,7 +2890,7 @@ dissect_reply_afp_create_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *t
 static gint
 dissect_reply_afp_create_dir(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, gint offset)
 {
-       proto_tree_add_item(tree, hf_afp_did, tvb, offset, 4,FALSE);
+       proto_tree_add_item(tree, hf_afp_did, tvb, offset, 4, ENC_BIG_ENDIAN);
        offset += 4;
 
        return offset;
@@ -2814,9 +2903,9 @@ static gint
 dissect_query_afp_delete_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, gint offset)
 {
        PAD(1);
-       proto_tree_add_item(tree, hf_afp_vol_id, tvb, offset, 2,FALSE);
+       proto_tree_add_item(tree, hf_afp_vol_id, tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
-       proto_tree_add_item(tree, hf_afp_file_id, tvb, offset, 4,FALSE);
+       proto_tree_add_item(tree, hf_afp_file_id, tvb, offset, 4, ENC_BIG_ENDIAN);
        offset += 4;
 
        return offset;
@@ -2829,9 +2918,9 @@ static gint
 dissect_query_afp_resolve_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, gint offset)
 {
        PAD(1);
-       proto_tree_add_item(tree, hf_afp_vol_id, tvb, offset, 2,FALSE);
+       proto_tree_add_item(tree, hf_afp_vol_id, tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
-       proto_tree_add_item(tree, hf_afp_file_id, tvb, offset, 4,FALSE);
+       proto_tree_add_item(tree, hf_afp_file_id, tvb, offset, 4, ENC_BIG_ENDIAN);
        offset += 4;
 
        decode_file_bitmap(tree, tvb, offset);
@@ -2847,7 +2936,7 @@ dissect_query_afp_get_fork_param(tvbuff_t *tvb, packet_info *pinfo, proto_tree *
 
        PAD(1);
        add_info_fork(tvb, pinfo, offset);
-       proto_tree_add_item(tree, hf_afp_ofork, tvb, offset, 2,FALSE);
+       proto_tree_add_item(tree, hf_afp_ofork, tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
 
        decode_file_bitmap(tree, tvb, offset);
@@ -2878,18 +2967,18 @@ dissect_query_afp_set_fork_param(tvbuff_t *tvb, packet_info *pinfo, proto_tree *
 
        PAD(1);
        add_info_fork(tvb, pinfo, offset);
-       proto_tree_add_item(tree, hf_afp_ofork, tvb, offset, 2,FALSE);
+       proto_tree_add_item(tree, hf_afp_ofork, tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
 
        bitmap = decode_file_bitmap(tree, tvb, offset);
        offset += 2;
 
        if ((bitmap & kFPExtDataForkLenBit) || (bitmap & kFPExtRsrcForkLenBit)) {
-               proto_tree_add_item(tree, hf_afp_ofork_len64, tvb, offset, 8, FALSE);
+               proto_tree_add_item(tree, hf_afp_ofork_len64, tvb, offset, 8, ENC_BIG_ENDIAN);
                offset += 8;
        }
        else {
-               proto_tree_add_item(tree, hf_afp_ofork_len, tvb, offset, 4,FALSE);
+               proto_tree_add_item(tree, hf_afp_ofork_len, tvb, offset, 4, ENC_BIG_ENDIAN);
                param = tvb_get_ntohl(tvb, offset);
                col_append_fstr(pinfo->cinfo, COL_INFO, " Size=%d", param);
                offset += 4;
@@ -2905,12 +2994,12 @@ dissect_query_afp_move(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint
        PAD(1);
        offset = decode_vol_did(tree, tvb, offset);
 
-       proto_tree_add_item(tree, hf_afp_did, tvb, offset, 4,FALSE);
+       proto_tree_add_item(tree, hf_afp_did, tvb, offset, 4, ENC_BIG_ENDIAN);
        offset += 4;
 
        offset = decode_name_label(tree, pinfo, tvb, offset, "Source path: %s");
-       offset = decode_name_label(tree, NULL, tvb, offset,  "Dest dir:    %s");
-       offset = decode_name_label(tree, NULL, tvb, offset,  "New name:    %s");
+       offset = decode_name_label(tree, NULL, tvb, offset,  "Dest dir:    %s");
+       offset = decode_name_label(tree, NULL, tvb, offset,  "New name:    %s");
 
        return offset;
 }
@@ -2923,7 +3012,7 @@ dissect_query_afp_exchange_file(tvbuff_t *tvb, packet_info *pinfo, proto_tree *t
        PAD(1);
        offset = decode_vol_did(tree, tvb, offset);
 
-       proto_tree_add_item(tree, hf_afp_did, tvb, offset, 4,FALSE);
+       proto_tree_add_item(tree, hf_afp_did, tvb, offset, 4, ENC_BIG_ENDIAN);
        offset += 4;
 
        offset = decode_name_label(tree, pinfo, tvb, offset, "Source path: %s");
@@ -2952,8 +3041,8 @@ dissect_query_afp_copy_file(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
        offset = decode_vol_did(sub_tree, tvb, offset);
 
        offset = decode_name_label(tree, pinfo, tvb, offset, "Source path: %s");
-       offset = decode_name_label(tree, NULL, tvb, offset,  "Dest dir:    %s");
-       offset = decode_name_label(tree, NULL, tvb, offset,  "New name:    %s");
+       offset = decode_name_label(tree, NULL, tvb, offset,  "Dest dir:    %s");
+       offset = decode_name_label(tree, NULL, tvb, offset,  "New name:    %s");
 
        return offset;
 }
@@ -2986,17 +3075,17 @@ dissect_query_afp_byte_lock(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *t
                sub_tree = proto_item_add_subtree(item, ett_afp_lock_flags);
        }
 
-       proto_tree_add_item(sub_tree, hf_afp_lock_op, tvb, offset, 1,FALSE);
-       proto_tree_add_item(sub_tree, hf_afp_lock_from, tvb, offset, 1,FALSE);
+       proto_tree_add_item(sub_tree, hf_afp_lock_op, tvb, offset, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_item(sub_tree, hf_afp_lock_from, tvb, offset, 1, ENC_BIG_ENDIAN);
        offset += 1;
 
-       proto_tree_add_item(tree, hf_afp_ofork, tvb, offset, 2,FALSE);
+       proto_tree_add_item(tree, hf_afp_ofork, tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
 
-       proto_tree_add_item(tree, hf_afp_lock_offset, tvb, offset, 4,FALSE);
+       proto_tree_add_item(tree, hf_afp_lock_offset, tvb, offset, 4, ENC_BIG_ENDIAN);
        offset += 4;
 
-       proto_tree_add_item(tree, hf_afp_lock_len, tvb, offset, 4,FALSE);
+       proto_tree_add_item(tree, hf_afp_lock_len, tvb, offset, 4, ENC_BIG_ENDIAN);
        offset += 4;
        return offset;
 }
@@ -3005,7 +3094,7 @@ dissect_query_afp_byte_lock(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *t
 static gint
 dissect_reply_afp_byte_lock(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, gint offset)
 {
-       proto_tree_add_item(tree, hf_afp_lock_range_start, tvb, offset, 4,FALSE);
+       proto_tree_add_item(tree, hf_afp_lock_range_start, tvb, offset, 4, ENC_BIG_ENDIAN);
        offset += 4;
 
        return offset;
@@ -3025,17 +3114,17 @@ dissect_query_afp_byte_lock_ext(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tre
                sub_tree = proto_item_add_subtree(item, ett_afp_lock_flags);
        }
 
-       proto_tree_add_item(sub_tree, hf_afp_lock_op, tvb, offset, 1,FALSE);
-       proto_tree_add_item(sub_tree, hf_afp_lock_from, tvb, offset, 1,FALSE);
+       proto_tree_add_item(sub_tree, hf_afp_lock_op, tvb, offset, 1, ENC_BIG_ENDIAN);
+       proto_tree_add_item(sub_tree, hf_afp_lock_from, tvb, offset, 1, ENC_BIG_ENDIAN);
        offset += 1;
 
-       proto_tree_add_item(tree, hf_afp_ofork, tvb, offset, 2,FALSE);
+       proto_tree_add_item(tree, hf_afp_ofork, tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
 
-       proto_tree_add_item(tree, hf_afp_lock_offset64, tvb, offset, 8,FALSE);
+       proto_tree_add_item(tree, hf_afp_lock_offset64, tvb, offset, 8, ENC_BIG_ENDIAN);
        offset += 8;
 
-       proto_tree_add_item(tree, hf_afp_lock_len64, tvb, offset, 8,FALSE);
+       proto_tree_add_item(tree, hf_afp_lock_len64, tvb, offset, 8, ENC_BIG_ENDIAN);
        offset += 8;
        return offset;
 }
@@ -3044,7 +3133,7 @@ dissect_query_afp_byte_lock_ext(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tre
 static gint
 dissect_reply_afp_byte_lock_ext(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, gint offset)
 {
-       proto_tree_add_item(tree, hf_afp_lock_range_start64, tvb, offset, 8,FALSE);
+       proto_tree_add_item(tree, hf_afp_lock_range_start64, tvb, offset, 8, ENC_BIG_ENDIAN);
        offset += 8;
 
        return offset;
@@ -3057,10 +3146,10 @@ dissect_query_afp_add_cmt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, g
        guint8 len;
 
        PAD(1);
-       proto_tree_add_item(tree, hf_afp_dt_ref, tvb, offset, 2,FALSE);
+       proto_tree_add_item(tree, hf_afp_dt_ref, tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
 
-       proto_tree_add_item(tree, hf_afp_did, tvb, offset, 4,FALSE);
+       proto_tree_add_item(tree, hf_afp_did, tvb, offset, 4, ENC_BIG_ENDIAN);
        offset += 4;
 
        offset = decode_name(tree, pinfo, tvb, offset);
@@ -3069,7 +3158,7 @@ dissect_query_afp_add_cmt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, g
                PAD(1);
 
        len = tvb_get_guint8(tvb, offset);
-       proto_tree_add_item(tree, hf_afp_comment, tvb, offset, 1,FALSE);
+       proto_tree_add_item(tree, hf_afp_comment, tvb, offset, 1, ENC_UTF_8|ENC_BIG_ENDIAN);
        offset += len +1;
 
        return offset;
@@ -3082,10 +3171,10 @@ dissect_query_afp_get_cmt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, g
 {
 
        PAD(1);
-       proto_tree_add_item(tree, hf_afp_dt_ref, tvb, offset, 2,FALSE);
+       proto_tree_add_item(tree, hf_afp_dt_ref, tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
 
-       proto_tree_add_item(tree, hf_afp_did, tvb, offset, 4,FALSE);
+       proto_tree_add_item(tree, hf_afp_did, tvb, offset, 4, ENC_BIG_ENDIAN);
        offset += 4;
 
        offset = decode_name(tree, pinfo, tvb, offset);
@@ -3099,7 +3188,7 @@ dissect_reply_afp_get_cmt(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tre
        guint8 len;
 
        len = tvb_get_guint8(tvb, offset);
-       proto_tree_add_item(tree, hf_afp_comment, tvb, offset, 1,FALSE);
+       proto_tree_add_item(tree, hf_afp_comment, tvb, offset, 1, ENC_UTF_8|ENC_BIG_ENDIAN);
        offset += len +1;
 
        return offset;
@@ -3111,19 +3200,19 @@ dissect_query_afp_get_icon(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tr
 {
 
        PAD(1);
-       proto_tree_add_item(tree, hf_afp_dt_ref, tvb, offset, 2,FALSE);
+       proto_tree_add_item(tree, hf_afp_dt_ref, tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
-       proto_tree_add_item(tree, hf_afp_file_creator, tvb, offset, 4,FALSE);
+       proto_tree_add_item(tree, hf_afp_file_creator, tvb, offset, 4, ENC_UTF_8|ENC_NA);
        offset += 4;
 
-       proto_tree_add_item(tree, hf_afp_file_type, tvb, offset, 4,FALSE);
+       proto_tree_add_item(tree, hf_afp_file_type, tvb, offset, 4, ENC_ASCII|ENC_NA);
        offset += 4;
 
-       proto_tree_add_item(tree, hf_afp_icon_type, tvb, offset, 1,FALSE);
+       proto_tree_add_item(tree, hf_afp_icon_type, tvb, offset, 1, ENC_BIG_ENDIAN);
        offset += 1;
        PAD(1);
 
-       proto_tree_add_item(tree, hf_afp_icon_length, tvb, offset, 2,FALSE);
+       proto_tree_add_item(tree, hf_afp_icon_length, tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
 
        return offset;
@@ -3135,12 +3224,12 @@ dissect_query_afp_get_icon_info(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tre
 {
 
        PAD(1);
-       proto_tree_add_item(tree, hf_afp_dt_ref, tvb, offset, 2,FALSE);
+       proto_tree_add_item(tree, hf_afp_dt_ref, tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
-       proto_tree_add_item(tree, hf_afp_file_creator, tvb, offset, 4,FALSE);
+       proto_tree_add_item(tree, hf_afp_file_creator, tvb, offset, 4, ENC_ASCII|ENC_NA);
        offset += 4;
 
-       proto_tree_add_item(tree, hf_afp_icon_index, tvb, offset, 2,FALSE);
+       proto_tree_add_item(tree, hf_afp_icon_index, tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
 
        return offset;
@@ -3151,17 +3240,17 @@ static gint
 dissect_reply_afp_get_icon_info(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, gint offset)
 {
 
-       proto_tree_add_item(tree, hf_afp_icon_tag, tvb, offset, 4,FALSE);
+       proto_tree_add_item(tree, hf_afp_icon_tag, tvb, offset, 4, ENC_BIG_ENDIAN);
        offset += 4;
 
-       proto_tree_add_item(tree, hf_afp_file_type, tvb, offset, 4,FALSE);
+       proto_tree_add_item(tree, hf_afp_file_type, tvb, offset, 4, ENC_ASCII|ENC_NA);
        offset += 4;
 
-       proto_tree_add_item(tree, hf_afp_icon_type, tvb, offset, 1,FALSE);
+       proto_tree_add_item(tree, hf_afp_icon_type, tvb, offset, 1, ENC_BIG_ENDIAN);
        offset += 1;
 
        PAD(1);
-       proto_tree_add_item(tree, hf_afp_icon_length, tvb, offset, 2,FALSE);
+       proto_tree_add_item(tree, hf_afp_icon_length, tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
 
        return offset;
@@ -3173,22 +3262,22 @@ dissect_query_afp_add_icon(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tr
 {
 
        PAD(1);
-       proto_tree_add_item(tree, hf_afp_dt_ref, tvb, offset, 2,FALSE);
+       proto_tree_add_item(tree, hf_afp_dt_ref, tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
-       proto_tree_add_item(tree, hf_afp_file_creator, tvb, offset, 4,FALSE);
+       proto_tree_add_item(tree, hf_afp_file_creator, tvb, offset, 4, ENC_ASCII|ENC_NA);
        offset += 4;
 
-       proto_tree_add_item(tree, hf_afp_file_type, tvb, offset, 4,FALSE);
+       proto_tree_add_item(tree, hf_afp_file_type, tvb, offset, 4, ENC_ASCII|ENC_NA);
        offset += 4;
 
-       proto_tree_add_item(tree, hf_afp_icon_type, tvb, offset, 1,FALSE);
+       proto_tree_add_item(tree, hf_afp_icon_type, tvb, offset, 1, ENC_BIG_ENDIAN);
        offset += 1;
 
        PAD(1);
-       proto_tree_add_item(tree, hf_afp_icon_tag, tvb, offset, 4,FALSE);
+       proto_tree_add_item(tree, hf_afp_icon_tag, tvb, offset, 4, ENC_BIG_ENDIAN);
        offset += 4;
 
-       proto_tree_add_item(tree, hf_afp_icon_length, tvb, offset, 2,FALSE);
+       proto_tree_add_item(tree, hf_afp_icon_length, tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
 
        return offset;
@@ -3202,11 +3291,11 @@ decode_dt_did(proto_tree *tree, tvbuff_t *tvb, gint offset)
 {
        /* FIXME it's not volume but dt cf decode_name*/
        Vol = tvb_get_ntohs(tvb, offset);
-       proto_tree_add_item(tree, hf_afp_dt_ref, tvb, offset, 2,FALSE);
+       proto_tree_add_item(tree, hf_afp_dt_ref, tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
 
        Did = tvb_get_ntohl(tvb, offset);
-       proto_tree_add_item(tree, hf_afp_did, tvb, offset, 4,FALSE);
+       proto_tree_add_item(tree, hf_afp_did, tvb, offset, 4, ENC_BIG_ENDIAN);
        offset += 4;
        return offset;
 }
@@ -3219,10 +3308,10 @@ dissect_query_afp_add_appl(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
        PAD(1);
        offset = decode_dt_did(tree, tvb, offset);
 
-       proto_tree_add_item(tree, hf_afp_file_creator, tvb, offset, 4,FALSE);
+       proto_tree_add_item(tree, hf_afp_file_creator, tvb, offset, 4, ENC_ASCII|ENC_NA);
        offset += 4;
 
-       proto_tree_add_item(tree, hf_afp_appl_tag, tvb, offset, 4,FALSE);
+       proto_tree_add_item(tree, hf_afp_appl_tag, tvb, offset, 4, ENC_BIG_ENDIAN);
        offset += 4;
 
        offset = decode_name(tree, pinfo, tvb, offset);
@@ -3240,7 +3329,7 @@ dissect_query_afp_rmv_appl(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
        PAD(1);
        offset = decode_dt_did(tree, tvb, offset);
 
-       proto_tree_add_item(tree, hf_afp_file_creator, tvb, offset, 4,FALSE);
+       proto_tree_add_item(tree, hf_afp_file_creator, tvb, offset, 4, ENC_ASCII|ENC_NA);
        offset += 4;
 
        offset = decode_name(tree, pinfo, tvb, offset);
@@ -3254,13 +3343,13 @@ dissect_query_afp_get_appl(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tr
 {
 
        PAD(1);
-       proto_tree_add_item(tree, hf_afp_dt_ref, tvb, offset, 2,FALSE);
+       proto_tree_add_item(tree, hf_afp_dt_ref, tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
 
-       proto_tree_add_item(tree, hf_afp_file_creator, tvb, offset, 4,FALSE);
+       proto_tree_add_item(tree, hf_afp_file_creator, tvb, offset, 4, ENC_ASCII|ENC_NA);
        offset += 4;
 
-       proto_tree_add_item(tree, hf_afp_appl_index, tvb, offset, 2,FALSE);
+       proto_tree_add_item(tree, hf_afp_appl_index, tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
 
        decode_file_bitmap(tree, tvb, offset);
@@ -3273,7 +3362,7 @@ dissect_query_afp_get_appl(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tr
 static gint
 dissect_reply_afp_get_appl(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, gint offset)
 {
-       proto_tree_add_item(tree, hf_afp_appl_tag, tvb, offset, 4,FALSE);
+       proto_tree_add_item(tree, hf_afp_appl_tag, tvb, offset, 4, ENC_BIG_ENDIAN);
        offset += 4;
 
        return offset;
@@ -3283,7 +3372,7 @@ dissect_reply_afp_get_appl(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tr
 static gint
 dissect_query_afp_create_file(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint offset)
 {
-       proto_tree_add_item(tree, hf_afp_create_flag, tvb, offset, 1,FALSE);
+       proto_tree_add_item(tree, hf_afp_create_flag, tvb, offset, 1, ENC_BIG_ENDIAN);
        offset++;
 
        offset = decode_vol_did(tree, tvb, offset);
@@ -3300,15 +3389,15 @@ dissect_query_afp_map_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree
        guint8 type;
 
        type = tvb_get_guint8(tvb, offset);
-       proto_tree_add_item(tree, hf_afp_map_id_type, tvb, offset, 1,FALSE);
+       proto_tree_add_item(tree, hf_afp_map_id_type, tvb, offset, 1, ENC_BIG_ENDIAN);
        offset++;
 
        if ( type < 5) {
-               proto_tree_add_item(tree, hf_afp_map_id, tvb, offset, 4,FALSE);
+               proto_tree_add_item(tree, hf_afp_map_id, tvb, offset, 4, ENC_BIG_ENDIAN);
                offset += 4;
        }
        else {
-               proto_tree_add_item(tree, hf_afp_UUID, tvb, offset, 16,FALSE);
+               proto_tree_add_item(tree, hf_afp_UUID, tvb, offset, 16, ENC_BIG_ENDIAN);
                offset += 16;
        }
 
@@ -3330,10 +3419,10 @@ dissect_reply_afp_map_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree
                len = tvb_get_guint8(tvb, offset +1);
                if (!len) {
                    /* assume it's undocumented type 5 or 6 reply */
-                   proto_tree_add_item(tree, hf_afp_map_id_reply_type, tvb, offset, 4,FALSE);
+                   proto_tree_add_item(tree, hf_afp_map_id_reply_type, tvb, offset, 4, ENC_BIG_ENDIAN);
                    offset += 4;
 
-                   proto_tree_add_item(tree, hf_afp_map_id, tvb, offset, 4,FALSE);
+                   proto_tree_add_item(tree, hf_afp_map_id, tvb, offset, 4, ENC_BIG_ENDIAN);
                    offset += 4;
 
                    size = 2;
@@ -3353,10 +3442,10 @@ dissect_reply_afp_map_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree
                }
        }
        if (size) {
-           proto_tree_add_item(tree, hf_afp_map_name, tvb, offset, size, FALSE);
+           proto_tree_add_item(tree, hf_afp_map_name, tvb, offset, size, ENC_ASCII|ENC_NA);
        }
        else {
-           proto_tree_add_item(tree, hf_afp_unknown, tvb, offset, len, FALSE);
+           proto_tree_add_item(tree, hf_afp_unknown, tvb, offset, len, ENC_NA);
        }
        offset += len +size;
        return offset;
@@ -3371,7 +3460,7 @@ dissect_query_afp_map_name(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tr
        int size;
 
        type = tvb_get_guint8(tvb, offset);
-       proto_tree_add_item(tree, hf_afp_map_name_type, tvb, offset, 1,FALSE);
+       proto_tree_add_item(tree, hf_afp_map_name_type, tvb, offset, 1, ENC_BIG_ENDIAN);
        offset++;
        switch (type) {
        case 5: /* use 16 bits length */
@@ -3384,7 +3473,7 @@ dissect_query_afp_map_name(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tr
                len = tvb_get_guint8(tvb, offset);
                break;
        }
-       proto_tree_add_item(tree, hf_afp_map_name, tvb, offset, size, FALSE);
+       proto_tree_add_item(tree, hf_afp_map_name, tvb, offset, size, ENC_ASCII|ENC_NA);
        offset += len +size;
 
        return offset;
@@ -3400,11 +3489,11 @@ dissect_reply_afp_map_name(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tr
        /* If remain == 16, assume UUID */
        remain =  tvb_reported_length(tvb);
        if (remain == 16) {
-               proto_tree_add_item(tree, hf_afp_UUID, tvb, offset, 16, FALSE);
+               proto_tree_add_item(tree, hf_afp_UUID, tvb, offset, 16, ENC_BIG_ENDIAN);
                offset += 16;
        }
        else {
-               proto_tree_add_item(tree, hf_afp_map_id, tvb, offset, 4, FALSE);
+               proto_tree_add_item(tree, hf_afp_map_id, tvb, offset, 4, ENC_BIG_ENDIAN);
                offset += 4;
        }
 
@@ -3419,14 +3508,14 @@ dissect_query_afp_disconnect_old_session(tvbuff_t *tvb, packet_info *pinfo _U_,
 
        PAD(1);
 
-       proto_tree_add_item(tree, hf_afp_session_token_type, tvb, offset, 2,FALSE);
+       proto_tree_add_item(tree, hf_afp_session_token_type, tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
 
        len = tvb_get_ntohl(tvb, offset);
-       proto_tree_add_item(tree, hf_afp_session_token_len, tvb, offset, 4,FALSE);
+       proto_tree_add_item(tree, hf_afp_session_token_len, tvb, offset, 4, ENC_BIG_ENDIAN);
        offset += 4;
 
-       proto_tree_add_item(tree, hf_afp_session_token, tvb, offset, len,FALSE);
+       proto_tree_add_item(tree, hf_afp_session_token, tvb, offset, len, ENC_NA);
        offset += len;
 
        if (offset <= orig_offset)
@@ -3444,23 +3533,23 @@ dissect_query_afp_get_session_token(tvbuff_t *tvb, packet_info *pinfo _U_, proto
 
        PAD(1);
        token = tvb_get_ntohs(tvb, offset);
-       proto_tree_add_item(tree, hf_afp_session_token_type, tvb, offset, 2,FALSE);
+       proto_tree_add_item(tree, hf_afp_session_token_type, tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
        if (token == kLoginWithoutID || token == kGetKerberosSessionKey) /* 0 || 8 */
                return offset;
 
        len = tvb_get_ntohl(tvb, offset);
-       proto_tree_add_item(tree, hf_afp_session_token_len, tvb, offset, 4,FALSE);
+       proto_tree_add_item(tree, hf_afp_session_token_len, tvb, offset, 4, ENC_BIG_ENDIAN);
        offset += 4;
 
        switch (token) {
        case kLoginWithTimeAndID:
        case kReconnWithTimeAndID:
-               proto_tree_add_item(tree, hf_afp_session_token_timestamp, tvb, offset, 4,FALSE);
+               proto_tree_add_item(tree, hf_afp_session_token_timestamp, tvb, offset, 4, ENC_BIG_ENDIAN);
                offset += 4;
        }
 
-       proto_tree_add_item(tree, hf_afp_session_token, tvb, offset, len,FALSE);
+       proto_tree_add_item(tree, hf_afp_session_token, tvb, offset, len, ENC_NA);
        offset += len;
 
        if (offset <= orig_offset)
@@ -3480,15 +3569,15 @@ dissect_reply_afp_get_session_token(tvbuff_t *tvb, packet_info *pinfo _U_, proto
        size = 4;
        /* [cm]: FIXME continued:  Since size is set to 4, this test is never true.
        if (size == 2) {
-               proto_tree_add_item(tree, hf_afp_session_token_type, tvb, offset, 2,FALSE);
+               proto_tree_add_item(tree, hf_afp_session_token_type, tvb, offset, 2, ENC_BIG_ENDIAN);
                offset += 2;
        }
        */
        len = tvb_get_ntohl(tvb, offset);
-       proto_tree_add_item(tree, hf_afp_session_token_len, tvb, offset, size,FALSE);
+       proto_tree_add_item(tree, hf_afp_session_token_len, tvb, offset, size, ENC_BIG_ENDIAN);
        offset += size;
 
-       proto_tree_add_item(tree, hf_afp_session_token, tvb, offset, len,FALSE);
+       proto_tree_add_item(tree, hf_afp_session_token, tvb, offset, len, ENC_NA);
        offset += len;
 
        if (offset <= orig_offset)
@@ -3503,17 +3592,17 @@ dissect_query_afp_get_server_message(tvbuff_t *tvb, packet_info *pinfo _U_, prot
 {
 
        PAD(1);
-       proto_tree_add_item(tree, hf_afp_message_type, tvb, offset, 2, FALSE);
+       proto_tree_add_item(tree, hf_afp_message_type, tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
 
        if (tree) {
                proto_tree *sub_tree;
                proto_item *item;
 
-               item = proto_tree_add_item(tree, hf_afp_message_bitmap, tvb, offset, 2, FALSE);
+               item = proto_tree_add_item(tree, hf_afp_message_bitmap, tvb, offset, 2, ENC_BIG_ENDIAN);
                sub_tree = proto_item_add_subtree(item, ett_afp_message_bitmap);
-               proto_tree_add_item(sub_tree, hf_afp_message_bitmap_REQ, tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_message_bitmap_UTF, tvb, offset, 2,FALSE);
+               proto_tree_add_item(sub_tree, hf_afp_message_bitmap_REQ, tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_message_bitmap_UTF, tvb, offset, 2, ENC_BIG_ENDIAN);
        }
        offset += 2;
 
@@ -3529,7 +3618,7 @@ dissect_reply_afp_get_server_message(tvbuff_t *tvb, packet_info *pinfo _U_, prot
 
        /* FIXME: APF 3.1 specs also specify a long reply format, yet unused */
 
-       proto_tree_add_item(tree, hf_afp_message_type, tvb, offset, 2, FALSE);
+       proto_tree_add_item(tree, hf_afp_message_type, tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
 
        bitmap = tvb_get_ntohs(tvb, offset);
@@ -3537,28 +3626,41 @@ dissect_reply_afp_get_server_message(tvbuff_t *tvb, packet_info *pinfo _U_, prot
                proto_tree *sub_tree;
                proto_item *item;
 
-               item = proto_tree_add_item(tree, hf_afp_message_bitmap, tvb, offset, 2, FALSE);
+               item = proto_tree_add_item(tree, hf_afp_message_bitmap, tvb, offset, 2, ENC_BIG_ENDIAN);
                sub_tree = proto_item_add_subtree(item, ett_afp_message_bitmap);
-               proto_tree_add_item(sub_tree, hf_afp_message_bitmap_REQ, tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_message_bitmap_UTF, tvb, offset, 2,FALSE);
+               proto_tree_add_item(sub_tree, hf_afp_message_bitmap_REQ, tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_message_bitmap_UTF, tvb, offset, 2, ENC_BIG_ENDIAN);
        }
        offset += 2;
 
-       /* FIXME: Not in the specs, but for UTF8 message length is 2 bytes */
-       if ((bitmap & 3) == 3) {
+       /*
+        * XXX - the spec says that the 0x01 bit indicates whether
+        * the ServerMessage field contains a server message or a login
+        * message.
+        */
+       if (bitmap & 0x02) {
+               /* Message is UTF-8, and message length is 2 bytes */
                len = tvb_get_ntohs(tvb, offset);
-               proto_tree_add_item(tree, hf_afp_message_len, tvb, offset, 2,FALSE);
+               proto_tree_add_item(tree, hf_afp_message_len, tvb, offset, 2, ENC_BIG_ENDIAN);
                offset += 2;
-       }
-       else if ((bitmap & 1)) {
+               if (len) {
+                       proto_tree_add_item(tree, hf_afp_message, tvb, offset, len , ENC_UTF_8|ENC_NA);
+                       offset += len;
+               }
+       } else {
+               /*
+                * Message is not UTF-8, and message length is 1 byte.
+                *
+                * Is the message in some Mac encoding? Always Mac Roman,
+                * or possibly some other encoding for other locales?
+                */
                len = tvb_get_guint8(tvb, offset);
-               proto_tree_add_item(tree, hf_afp_message_len, tvb, offset, 1,FALSE);
+               proto_tree_add_item(tree, hf_afp_message_len, tvb, offset, 1, ENC_BIG_ENDIAN);
                offset += 1;
-       }
-
-       if (len) {
-               proto_tree_add_item(tree, hf_afp_message, tvb, offset, len ,FALSE);
-               offset += len;
+               if (len) {
+                       proto_tree_add_item(tree, hf_afp_message, tvb, offset, len , ENC_ASCII|ENC_NA);
+                       offset += len;
+               }
        }
 
        return offset;
@@ -3569,21 +3671,21 @@ static gint
 dissect_query_afp_get_user_info(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, gint offset)
 {
 
-       proto_tree_add_item(tree, hf_afp_user_flag, tvb, offset, 1,FALSE);
+       proto_tree_add_item(tree, hf_afp_user_flag, tvb, offset, 1, ENC_BIG_ENDIAN);
        offset++;
 
-       proto_tree_add_item(tree, hf_afp_user_ID, tvb, offset, 4,FALSE);
+       proto_tree_add_item(tree, hf_afp_user_ID, tvb, offset, 4, ENC_BIG_ENDIAN);
        offset += 4;
 
        if (tree) {
                proto_tree *sub_tree;
                proto_item *item;
 
-               item = proto_tree_add_item(tree, hf_afp_user_bitmap, tvb, offset, 2,FALSE);
+               item = proto_tree_add_item(tree, hf_afp_user_bitmap, tvb, offset, 2, ENC_BIG_ENDIAN);
                sub_tree = proto_item_add_subtree(item, ett_afp_user_bitmap);
-               proto_tree_add_item(sub_tree, hf_afp_user_bitmap_UID, tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_user_bitmap_GID, tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_user_bitmap_UUID, tvb, offset, 2,FALSE);
+               proto_tree_add_item(sub_tree, hf_afp_user_bitmap_UID, tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_user_bitmap_GID, tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_user_bitmap_UUID, tvb, offset, 2, ENC_BIG_ENDIAN);
        }
        offset += 2;
 
@@ -3601,26 +3703,26 @@ dissect_reply_afp_get_user_info(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tre
                proto_tree *sub_tree;
                proto_item *item;
 
-               item = proto_tree_add_item(tree, hf_afp_user_bitmap, tvb, offset, 2,FALSE);
+               item = proto_tree_add_item(tree, hf_afp_user_bitmap, tvb, offset, 2, ENC_BIG_ENDIAN);
                sub_tree = proto_item_add_subtree(item, ett_afp_user_bitmap);
-               proto_tree_add_item(sub_tree, hf_afp_user_bitmap_UID, tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_user_bitmap_GID, tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_user_bitmap_UUID, tvb, offset, 2,FALSE);
+               proto_tree_add_item(sub_tree, hf_afp_user_bitmap_UID, tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_user_bitmap_GID, tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_user_bitmap_UUID, tvb, offset, 2, ENC_BIG_ENDIAN);
        }
 
        offset += 2;
        if ((bitmap & 1)) {
-               proto_tree_add_item(tree, hf_afp_user_ID, tvb, offset, 4,FALSE);
+               proto_tree_add_item(tree, hf_afp_user_ID, tvb, offset, 4, ENC_BIG_ENDIAN);
                offset += 4;
        }
 
        if ((bitmap & 2)) {
-               proto_tree_add_item(tree, hf_afp_group_ID, tvb, offset, 4,FALSE);
+               proto_tree_add_item(tree, hf_afp_group_ID, tvb, offset, 4, ENC_BIG_ENDIAN);
                offset += 4;
        }
 
        if ((bitmap & 4)) {
-               proto_tree_add_item(tree, hf_afp_UUID, tvb, offset, 16,FALSE);
+               proto_tree_add_item(tree, hf_afp_UUID, tvb, offset, 16, ENC_BIG_ENDIAN);
                offset += 16;
        }
        return offset;
@@ -3647,8 +3749,8 @@ decode_attr_name (proto_tree *tree, packet_info *pinfo _U_, tvbuff_t *tvb, gint
                item = proto_tree_add_text(tree, tvb, offset, len + 2, label, name);
                sub_tree = proto_item_add_subtree(item, ett_afp_extattr_names);
 
-               proto_tree_add_item(sub_tree, hf_afp_extattr_namelen, tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_extattr_name, tvb, offset +2, len, FALSE);
+               proto_tree_add_item(sub_tree, hf_afp_extattr_namelen, tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_extattr_name, tvb, offset +2, len, ENC_UTF_8|ENC_NA);
        }
        offset += 2 +len;
 
@@ -3664,11 +3766,11 @@ decode_attr_bitmap (proto_tree *tree, tvbuff_t *tvb, gint offset)
                proto_tree *sub_tree;
                proto_item *item;
 
-               item = proto_tree_add_item(tree, hf_afp_extattr_bitmap, tvb, offset, 2,FALSE);
+               item = proto_tree_add_item(tree, hf_afp_extattr_bitmap, tvb, offset, 2, ENC_BIG_ENDIAN);
                sub_tree = proto_item_add_subtree(item, ett_afp_extattr_bitmap);
-               proto_tree_add_item(sub_tree, hf_afp_extattr_bitmap_NoFollow, tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_extattr_bitmap_Create, tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_extattr_bitmap_Replace, tvb, offset, 2,FALSE);
+               proto_tree_add_item(sub_tree, hf_afp_extattr_bitmap_NoFollow, tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_extattr_bitmap_Create, tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_extattr_bitmap_Replace, tvb, offset, 2, ENC_BIG_ENDIAN);
        }
        offset += 2;
        return offset;
@@ -3684,14 +3786,14 @@ dissect_query_afp_get_ext_attr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr
        offset = decode_attr_bitmap(tree, tvb, offset);
 
        /* 8byte offset */
-       proto_tree_add_item(tree, hf_afp_offset64, tvb, offset, 8,FALSE);
+       proto_tree_add_item(tree, hf_afp_offset64, tvb, offset, 8, ENC_BIG_ENDIAN);
        offset += 8;
        /* 8byte reqcount */
-       proto_tree_add_item(tree, hf_afp_reqcount64, tvb, offset, 8,FALSE);
+       proto_tree_add_item(tree, hf_afp_reqcount64, tvb, offset, 8, ENC_BIG_ENDIAN);
        offset += 8;
 
        /* maxreply */
-       proto_tree_add_item(tree, hf_afp_extattr_reply_size, tvb, offset, 4, FALSE);
+       proto_tree_add_item(tree, hf_afp_extattr_reply_size, tvb, offset, 4, ENC_BIG_ENDIAN);
        offset += 4;
 
        offset = decode_name(tree, pinfo, tvb, offset);
@@ -3712,12 +3814,12 @@ dissect_reply_afp_get_ext_attr(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree
        offset = decode_attr_bitmap(tree, tvb, offset);
 
        len = tvb_get_ntohl(tvb, offset);
-       proto_tree_add_item(tree, hf_afp_extattr_len, tvb, offset, 4,FALSE);
+       proto_tree_add_item(tree, hf_afp_extattr_len, tvb, offset, 4, ENC_BIG_ENDIAN);
        offset += 4;
 
        remain =  tvb_reported_length_remaining(tvb, offset);
        if (len && remain >= len ) {
-               proto_tree_add_item(tree, hf_afp_extattr_data, tvb, offset, len, FALSE);
+               proto_tree_add_item(tree, hf_afp_extattr_data, tvb, offset, len, ENC_NA);
                offset += len;
        }
 
@@ -3739,7 +3841,7 @@ dissect_query_afp_set_ext_attr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr
        offset = decode_attr_bitmap(tree, tvb, offset);
 
        /* 8byte offset */
-       proto_tree_add_item(tree, hf_afp_offset64, tvb, offset, 8,FALSE);
+       proto_tree_add_item(tree, hf_afp_offset64, tvb, offset, 8, ENC_BIG_ENDIAN);
        offset += 8;
 
        offset = decode_name(tree, pinfo, tvb, offset);
@@ -3747,10 +3849,10 @@ dissect_query_afp_set_ext_attr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr
        offset = decode_attr_name(tree, pinfo, tvb, offset, "Attribute: %s");
 
        len = tvb_get_ntohl(tvb, offset);
-       proto_tree_add_item(tree, hf_afp_extattr_len, tvb, offset, 4,FALSE);
+       proto_tree_add_item(tree, hf_afp_extattr_len, tvb, offset, 4, ENC_BIG_ENDIAN);
        offset += 4;
 
-       proto_tree_add_item(tree, hf_afp_extattr_data, tvb, offset, len, FALSE);
+       proto_tree_add_item(tree, hf_afp_extattr_data, tvb, offset, len, ENC_NA);
        offset += len;
 
        return offset;
@@ -3766,13 +3868,13 @@ dissect_query_afp_list_ext_attrs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *
        /* for this command only kXAttrNoFollow is valid */
        offset = decode_attr_bitmap(tree, tvb, offset);
 
-       proto_tree_add_item(tree, hf_afp_extattr_req_count, tvb, offset, 2, FALSE);
+       proto_tree_add_item(tree, hf_afp_extattr_req_count, tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
 
-       proto_tree_add_item(tree, hf_afp_extattr_start_index, tvb, offset, 4, FALSE);
+       proto_tree_add_item(tree, hf_afp_extattr_start_index, tvb, offset, 4, ENC_BIG_ENDIAN);
        offset += 4;
 
-       proto_tree_add_item(tree, hf_afp_extattr_reply_size, tvb, offset, 4, FALSE);
+       proto_tree_add_item(tree, hf_afp_extattr_reply_size, tvb, offset, 4, ENC_BIG_ENDIAN);
        offset += 4;
 
        offset = decode_name(tree, pinfo, tvb, offset);
@@ -3792,7 +3894,7 @@ dissect_reply_afp_list_ext_attrs(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tr
        offset = decode_attr_bitmap(tree, tvb, offset);
 
        length = tvb_get_ntohl(tvb, offset);
-       proto_tree_add_item(tree, hf_afp_extattr_reply_size, tvb, offset, 4, FALSE);
+       proto_tree_add_item(tree, hf_afp_extattr_reply_size, tvb, offset, 4, ENC_BIG_ENDIAN);
        offset += 4;
 
        /* If reply_size was 0 on request, server only reports the size of
@@ -3803,8 +3905,8 @@ dissect_reply_afp_list_ext_attrs(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tr
                item = proto_tree_add_text(tree, tvb, offset, remain , "Attributes");
                sub_tree = proto_item_add_subtree(item, ett_afp_extattr_names);
                while ( remain > 0) {
-                       tvb_get_ephemeral_stringz(tvb, offset, &length);
-                       proto_tree_add_item(sub_tree, hf_afp_extattr_name, tvb, offset, length, FALSE);
+                       length = tvb_strsize(tvb, offset);
+                       proto_tree_add_item(sub_tree, hf_afp_extattr_name, tvb, offset, length, ENC_UTF_8|ENC_NA);
                        offset += length;
                        remain -= length;
                }
@@ -3844,27 +3946,27 @@ decode_acl_access_bitmap(tvbuff_t *tvb, proto_tree *tree, gint offset)
                proto_tree *sub_tree;
                proto_item *item;
 
-               item = proto_tree_add_item(tree, hf_afp_acl_access_bitmap, tvb, offset, 4, FALSE);
+               item = proto_tree_add_item(tree, hf_afp_acl_access_bitmap, tvb, offset, 4, ENC_BIG_ENDIAN);
                sub_tree = proto_item_add_subtree(item, ett_afp_acl_access_bitmap);
 
-               proto_tree_add_item(sub_tree, hf_afp_acl_access_bitmap_read_data      , tvb, offset, 4,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_acl_access_bitmap_write_data     , tvb, offset, 4,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_acl_access_bitmap_execute        , tvb, offset, 4,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_acl_access_bitmap_delete         , tvb, offset, 4,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_acl_access_bitmap_append_data    , tvb, offset, 4,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_acl_access_bitmap_delete_child   , tvb, offset, 4,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_acl_access_bitmap_read_attrs     , tvb, offset, 4,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_acl_access_bitmap_write_attrs    , tvb, offset, 4,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_acl_access_bitmap_read_extattrs  , tvb, offset, 4,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_acl_access_bitmap_write_extattrs , tvb, offset, 4,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_acl_access_bitmap_read_security  , tvb, offset, 4,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_acl_access_bitmap_write_security , tvb, offset, 4,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_acl_access_bitmap_change_owner   , tvb, offset, 4,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_acl_access_bitmap_synchronize    , tvb, offset, 4,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_acl_access_bitmap_generic_all    , tvb, offset, 4,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_acl_access_bitmap_generic_execute, tvb, offset, 4,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_acl_access_bitmap_generic_write  , tvb, offset, 4,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_acl_access_bitmap_generic_read   , tvb, offset, 4,FALSE);
+               proto_tree_add_item(sub_tree, hf_afp_acl_access_bitmap_read_data      , tvb, offset, 4, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_acl_access_bitmap_write_data     , tvb, offset, 4, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_acl_access_bitmap_execute        , tvb, offset, 4, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_acl_access_bitmap_delete         , tvb, offset, 4, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_acl_access_bitmap_append_data    , tvb, offset, 4, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_acl_access_bitmap_delete_child   , tvb, offset, 4, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_acl_access_bitmap_read_attrs     , tvb, offset, 4, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_acl_access_bitmap_write_attrs    , tvb, offset, 4, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_acl_access_bitmap_read_extattrs  , tvb, offset, 4, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_acl_access_bitmap_write_extattrs , tvb, offset, 4, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_acl_access_bitmap_read_security  , tvb, offset, 4, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_acl_access_bitmap_write_security , tvb, offset, 4, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_acl_access_bitmap_change_owner   , tvb, offset, 4, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_acl_access_bitmap_synchronize    , tvb, offset, 4, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_acl_access_bitmap_generic_all    , tvb, offset, 4, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_acl_access_bitmap_generic_execute, tvb, offset, 4, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_acl_access_bitmap_generic_write  , tvb, offset, 4, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_acl_access_bitmap_generic_read   , tvb, offset, 4, ENC_BIG_ENDIAN);
        }
 
        return bitmap;
@@ -3877,10 +3979,10 @@ dissect_query_afp_access(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gi
        PAD(1);
        offset = decode_vol_did(tree, tvb, offset);
 
-       proto_tree_add_item(tree, hf_afp_access_bitmap, tvb, offset, 2, FALSE);
+       proto_tree_add_item(tree, hf_afp_access_bitmap, tvb, offset, 2, ENC_BIG_ENDIAN);
        offset += 2;
 
-       proto_tree_add_item(tree, hf_afp_UUID, tvb, offset, 16, FALSE);
+       proto_tree_add_item(tree, hf_afp_UUID, tvb, offset, 16, ENC_BIG_ENDIAN);
        offset += 16;
 
        decode_acl_access_bitmap(tvb, tree, offset);
@@ -3898,12 +4000,601 @@ dissect_query_afp_with_did(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tr
        PAD(1);
        offset = decode_vol_did(tree, tvb, offset);
 
-       proto_tree_add_item(tree, hf_afp_did, tvb, offset, 4,FALSE);
+       proto_tree_add_item(tree, hf_afp_did, tvb, offset, 4, ENC_BIG_ENDIAN);
        offset += 4;
 
        return offset;
 }
 
+/* ************************** */
+
+#define SQ_TYPE_NULL    0x0000
+#define SQ_TYPE_COMPLEX 0x0200
+#define SQ_TYPE_INT64   0x8400
+#define SQ_TYPE_BOOL    0x0100
+#define SQ_TYPE_FLOAT   0x8500
+#define SQ_TYPE_DATA    0x0700
+#define SQ_TYPE_CNIDS   0x8700
+#define SQ_TYPE_UUID    0x0e00
+#define SQ_TYPE_DATE    0x8600
+
+#define SQ_CPX_TYPE_ARRAY              0x0a00
+#define SQ_CPX_TYPE_STRING             0x0c00
+#define SQ_CPX_TYPE_UTF16_STRING       0x1c00
+#define SQ_CPX_TYPE_DICT               0x0d00
+#define SQ_CPX_TYPE_CNIDS              0x1a00
+#define SQ_CPX_TYPE_FILEMETA           0x1b00
+
+#define SUBQ_SAFETY_LIM 20
+
+static gint
+spotlight_int64(tvbuff_t *tvb, proto_tree *tree, gint offset, guint encoding)
+{
+       gint count, i;
+       guint64 query_data64;
+
+       query_data64 = spotlight_ntoh64(tvb, offset, encoding);
+       count = query_data64 >> 32;
+       offset += 8;
+
+       i = 0;
+       while (i++ < count) {
+               query_data64 = spotlight_ntoh64(tvb, offset, encoding);
+               proto_tree_add_text(tree, tvb, offset, 8, "int64: 0x%016" G_GINT64_MODIFIER "x", query_data64);
+               offset += 8;
+       }
+
+       return count;
+}
+
+static gint
+spotlight_date(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint offset, guint encoding)
+{
+       gint count, i;
+       guint64 query_data64;
+       nstime_t t;
+
+       query_data64 = spotlight_ntoh64(tvb, offset, encoding);
+       count = query_data64 >> 32;
+       offset += 8;
+
+       if (count > SUBQ_SAFETY_LIM) {
+               expert_add_info_format(pinfo, tree, PI_MALFORMED, PI_ERROR,
+                                                          "Subquery count (%d) > safety limit (%d)", count, SUBQ_SAFETY_LIM);
+               return -1;
+       }
+
+       i = 0;
+       while (i++ < count) {
+               query_data64 = spotlight_ntoh64(tvb, offset, encoding) >> 24;
+               t.secs = query_data64 - SPOTLIGHT_TIME_DELTA;
+               t.nsecs = 0;
+               proto_tree_add_time(tree, hf_afp_spotlight_date, tvb, offset, 8, &t);
+               offset += 8;
+       }
+
+       return count;
+}
+
+static gint
+spotlight_uuid(tvbuff_t *tvb, proto_tree *tree, gint offset, guint encoding)
+{
+       gint count, i;
+       guint64 query_data64;
+
+       query_data64 = spotlight_ntoh64(tvb, offset, encoding);
+       count = query_data64 >> 32;
+       offset += 8;
+
+       i = 0;
+       while (i++ < count) {
+               proto_tree_add_item(tree, hf_afp_spotlight_uuid, tvb, offset, 16, ENC_BIG_ENDIAN);
+               offset += 16;
+       }
+
+       return count;
+}
+
+static gint
+spotlight_float(tvbuff_t *tvb, proto_tree *tree, gint offset, guint encoding)
+{
+       gint count, i;
+       guint64 query_data64;
+       gdouble fval;
+
+       query_data64 = spotlight_ntoh64(tvb, offset, encoding);
+       count = query_data64 >> 32;
+       offset += 8;
+
+       i = 0;
+       while (i++ < count) {
+               fval = spotlight_ntohieee_double(tvb, offset, encoding);
+               proto_tree_add_text(tree, tvb, offset, 8, "float: %f", fval);
+               offset += 8;
+       }
+
+       return count;
+}
+
+static gint
+spotlight_CNID_array(tvbuff_t *tvb, proto_tree *tree, gint offset, guint encoding)
+{
+       gint count;
+       guint64 query_data64;
+       guint16 unknown1;
+       guint32 unknown2;
+
+       query_data64 = spotlight_ntoh64(tvb, offset, encoding);
+       count = query_data64 & 0xffff;
+       unknown1 = (query_data64 & 0xffff0000) >> 16;
+       unknown2 = query_data64 >> 32;
+
+       proto_tree_add_text(tree, tvb, offset + 2, 2, "unknown1: 0x%04" G_GINT16_MODIFIER "x",
+               unknown1);
+       proto_tree_add_text(tree, tvb, offset + 4, 4, "unknown2: 0x%08" G_GINT32_MODIFIER "x",
+               unknown2);
+       offset += 8;
+
+
+       while (count --) {
+               query_data64 = spotlight_ntoh64(tvb, offset, encoding);
+               proto_tree_add_text(tree, tvb, offset, 8, "CNID: %" G_GINT64_MODIFIER "u",
+                       query_data64);
+               offset += 8;
+       }
+
+       return 0;
+}
+
+static const char *spotlight_get_qtype_string(guint64 query_type)
+{
+       switch (query_type) {
+       case SQ_TYPE_NULL:
+               return "null";
+       case SQ_TYPE_COMPLEX:
+               return "complex";
+       case SQ_TYPE_INT64:
+               return "int64";
+       case SQ_TYPE_BOOL:
+               return "bool";
+       case SQ_TYPE_FLOAT:
+               return "float";
+       case SQ_TYPE_DATA:
+               return "data";
+       case SQ_TYPE_CNIDS:
+               return "CNIDs";
+       default:
+               return "unknown";
+       }
+}
+
+static const char *spotlight_get_cpx_qtype_string(guint64 cpx_query_type)
+{
+       switch (cpx_query_type) {
+       case SQ_CPX_TYPE_ARRAY:
+               return "array";
+       case SQ_CPX_TYPE_STRING:
+               return "string";
+       case SQ_CPX_TYPE_UTF16_STRING:
+               return "utf-16 string";
+       case SQ_CPX_TYPE_DICT:
+               return "dictionary";
+       case SQ_CPX_TYPE_CNIDS:
+               return "CNIDs";
+       case SQ_CPX_TYPE_FILEMETA:
+               return "FileMeta";
+       default:
+               return "unknown";
+       }
+}
+
+static gint
+spotlight_dissect_query_loop(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint offset,
+                             guint64 cpx_query_type, gint count, gint toc_offset, guint encoding)
+{
+       gint i, j;
+       gint subquery_count;
+       gint toc_index;
+       guint64 query_data64;
+       gint query_length;
+       guint64 query_type;
+       guint64 complex_query_type;
+       guint unicode_encoding;
+       guint8 mark_exists;
+
+       proto_item *item_query;
+       proto_tree *sub_tree;
+
+       /*
+        * This loops through a possibly nested query data structure.
+        * The outermost one is always without count and called from
+        * dissect_spotlight() with count = INT_MAX thus the while (...)
+        * loop terminates if (offset >= toc_offset).
+        * If nested structures are found, these will have an encoded element
+        * count which is used in a recursive call to
+        * spotlight_dissect_query_loop as count parameter, thus in this case
+        * the while (...) loop will terminate when count reaches 0.
+        */
+       while ((offset < (toc_offset - 8)) && (count > 0)) {
+               query_data64 = spotlight_ntoh64(tvb, offset, encoding);
+               query_length = (query_data64 & 0xffff) * 8;
+               if (query_length == 0) {
+                       /* XXX - report this as an error */
+                       break;
+               }
+               query_type = (query_data64 & 0xffff0000) >> 16;
+
+               switch (query_type) {
+               case SQ_TYPE_COMPLEX:
+                       toc_index = (gint)((query_data64 >> 32) - 1);
+                       query_data64 = spotlight_ntoh64(tvb, toc_offset + toc_index * 8, encoding);
+                       complex_query_type = (query_data64 & 0xffff0000) >> 16;
+
+                       switch (complex_query_type) {
+                       case SQ_CPX_TYPE_ARRAY:
+                       case SQ_CPX_TYPE_DICT:
+                               subquery_count = (gint)(query_data64 >> 32);
+                               item_query = proto_tree_add_text(tree, tvb, offset, query_length,
+                                                                "%s, toc index: %u, children: %u",
+                                                                spotlight_get_cpx_qtype_string(complex_query_type),
+                                                                toc_index + 1,
+                                                                subquery_count);
+                               break;
+                       case SQ_CPX_TYPE_STRING:
+                               subquery_count = 1;
+                               query_data64 = spotlight_ntoh64(tvb, offset + 8, encoding);
+                               query_length = (query_data64 & 0xffff) * 8;
+                               item_query = proto_tree_add_text(tree, tvb, offset, query_length + 8,
+                                                                "%s, toc index: %u, string: '%s'",
+                                                                spotlight_get_cpx_qtype_string(complex_query_type),
+                                                                toc_index + 1,
+                                                                tvb_get_ephemeral_string(tvb, offset + 16, query_length - 8));
+                               break;
+                       case SQ_CPX_TYPE_UTF16_STRING:
+                               /*
+                               * This is an UTF-16 string.
+                               * Dissections show the typical byte order mark 0xFFFE or 0xFEFF, respectively.
+                               * However the existence of such a mark can not be assumed.
+                               * If the mark is missing, big endian encoding is assumed.
+                               */
+
+                               subquery_count = 1;
+                               query_data64 = spotlight_ntoh64(tvb, offset + 8, encoding);
+                               query_length = (query_data64 & 0xffff) * 8;
+
+                               unicode_encoding = spotlight_get_utf16_string_encoding(tvb, offset + 16, query_length - 8, encoding);
+                               mark_exists = (unicode_encoding & ENC_UTF_16);
+                               unicode_encoding &= ~ENC_UTF_16;
+
+                               item_query = proto_tree_add_text(tree, tvb, offset, query_length + 8,
+                                                                "%s, toc index: %u, utf-16 string: '%s'",
+                                                                spotlight_get_cpx_qtype_string(complex_query_type),
+                                                                toc_index + 1,
+                                                                tvb_get_ephemeral_unicode_string(tvb, offset + (mark_exists ? 18 : 16),
+                                                                query_length - (mark_exists? 10 : 8), unicode_encoding));
+                               break;
+                       default:
+                               subquery_count = 1;
+                               item_query = proto_tree_add_text(tree, tvb, offset, query_length,
+                                                                "type: %s (%s), toc index: %u, children: %u",
+                                                                spotlight_get_qtype_string(query_type),
+                                                                spotlight_get_cpx_qtype_string(complex_query_type),
+                                                                toc_index + 1,
+                                                                subquery_count);
+                               break;
+                       }
+
+                       sub_tree = proto_item_add_subtree(item_query, ett_afp_spotlight_query_line);
+                       offset += 8;
+                       offset = spotlight_dissect_query_loop(tvb, pinfo, sub_tree, offset, complex_query_type, subquery_count, toc_offset, encoding);
+                       count--;
+                       break;
+               case SQ_TYPE_NULL:
+                       subquery_count = (gint)(query_data64 >> 32);
+                       if (subquery_count > count) {
+                               item_query = proto_tree_add_text(tree, tvb, offset, query_length, "null");
+                               expert_add_info_format(pinfo, item_query, PI_MALFORMED, PI_ERROR,
+                                       "Subquery count (%d) > query count (%d)", subquery_count, count);
+                               count = 0;
+                       } else if (subquery_count > 20) {
+                               item_query = proto_tree_add_text(tree, tvb, offset, query_length, "null");
+                               expert_add_info_format(pinfo, item_query, PI_PROTOCOL, PI_WARN,
+                                       "Abnormal number of subqueries (%d)", subquery_count);
+                               count -= subquery_count;
+                       } else {
+                               for (i = 0; i < subquery_count; i++, count--)
+                                       proto_tree_add_text(tree, tvb, offset, query_length, "null");
+                       }
+                       offset += query_length;
+                       break;
+               case SQ_TYPE_BOOL:
+                       proto_tree_add_text(tree, tvb, offset, query_length, "bool: %s",
+                                                        (query_data64 >> 32) ? "true" : "false");
+                       count--;
+                       offset += query_length;
+                       break;
+               case SQ_TYPE_INT64:
+                       item_query = proto_tree_add_text(tree, tvb, offset, 8, "int64");
+                       sub_tree = proto_item_add_subtree(item_query, ett_afp_spotlight_query_line);
+                       j = spotlight_int64(tvb, sub_tree, offset, encoding);
+                       count -= j;
+                       offset += query_length;
+                       break;
+               case SQ_TYPE_UUID:
+                       item_query = proto_tree_add_text(tree, tvb, offset, 8, "UUID");
+                       sub_tree = proto_item_add_subtree(item_query, ett_afp_spotlight_query_line);
+                       j = spotlight_uuid(tvb, sub_tree, offset, encoding);
+                       count -= j;
+                       offset += query_length;
+                       break;
+               case SQ_TYPE_FLOAT:
+                       item_query = proto_tree_add_text(tree, tvb, offset, 8, "float");
+                       sub_tree = proto_item_add_subtree(item_query, ett_afp_spotlight_query_line);
+                       j = spotlight_float(tvb, sub_tree, offset, encoding);
+                       count -= j;
+                       offset += query_length;
+                       break;
+               case SQ_TYPE_DATA:
+                       switch (cpx_query_type) {
+                       case SQ_CPX_TYPE_STRING:
+                               proto_tree_add_text(tree, tvb, offset, query_length, "string: '%s'",
+                                                   tvb_get_ephemeral_string(tvb, offset + 8, query_length - 8));
+                               break;
+                       case SQ_CPX_TYPE_UTF16_STRING: {
+                               /* description see above */
+                               unicode_encoding = spotlight_get_utf16_string_encoding(tvb, offset + 8, query_length, encoding);
+                               mark_exists = (unicode_encoding & ENC_UTF_16);
+                               unicode_encoding &= ~ENC_UTF_16;
+
+                               proto_tree_add_text(tree, tvb, offset, query_length, "utf-16 string: '%s'",
+                                                   tvb_get_ephemeral_unicode_string(tvb, offset + (mark_exists ? 10 : 8),
+                                                               query_length - (mark_exists? 10 : 8), unicode_encoding));
+                               break;
+                       }
+                       case SQ_CPX_TYPE_FILEMETA:
+                               if (query_length <= 8) {
+                                       /* item_query = */ proto_tree_add_text(tree, tvb, offset, query_length, "filemeta (empty)");
+                               } else {
+                                       item_query = proto_tree_add_text(tree, tvb, offset, query_length, "filemeta");
+                                       sub_tree = proto_item_add_subtree(item_query, ett_afp_spotlight_query_line);
+                                       (void)dissect_spotlight(tvb, pinfo, sub_tree, offset + 8);
+                               }
+                               break;
+                       }
+                       count--;
+                       offset += query_length;
+                       break;
+               case SQ_TYPE_CNIDS:
+                       if (query_length <= 8) {
+                               /* item_query = */ proto_tree_add_text(tree, tvb, offset, query_length, "CNID Array (empty)");
+                       } else {
+                               item_query = proto_tree_add_text(tree, tvb, offset, query_length, "CNID Array");
+                               sub_tree = proto_item_add_subtree(item_query, ett_afp_spotlight_query_line);
+                               spotlight_CNID_array(tvb, sub_tree, offset + 8, encoding);
+                       }
+                       count--;
+                       offset += query_length;
+                       break;
+               case SQ_TYPE_DATE:
+                       if ((j = spotlight_date(tvb, pinfo, tree, offset, encoding)) == -1)
+                               return offset;
+                       count -= j;
+                       offset += query_length;
+                       break;
+               default:
+                       proto_tree_add_text(tree, tvb, offset, query_length, "type: %s",
+                                                        spotlight_get_qtype_string(query_type));
+                       count--;
+                       offset += query_length;
+                       break;
+               }
+       }
+
+       return offset;
+}
+
+static gint
+dissect_spotlight(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint offset)
+{
+       guint encoding;
+       gint i;
+       guint64 toc_offset;
+       guint64 querylen;
+       gint toc_entries;
+       guint64 toc_entry;
+
+       proto_item *item_queries_data;
+       proto_tree *sub_tree_queries;
+       proto_item *item_toc;
+       proto_tree *sub_tree_toc;
+
+       if (strncmp(tvb_get_ephemeral_string(tvb, offset, 8), "md031234", 8) == 0)
+               encoding = ENC_BIG_ENDIAN;
+       else
+               encoding = ENC_LITTLE_ENDIAN;
+       proto_tree_add_text(tree,
+                           tvb,
+                           offset,
+                           8,
+                           "Endianess: %s",
+                           encoding == ENC_BIG_ENDIAN ?
+                           "Big Endian" : "Litte Endian");
+       offset += 8;
+
+       toc_offset = (spotlight_ntoh64(tvb, offset, encoding) >> 32) * 8;
+       if (toc_offset < 8) {
+               proto_tree_add_text(tree,
+                                   tvb,
+                                   offset,
+                                   8,
+                                   "ToC Offset: %" G_GINT64_MODIFIER "u < 8 (bogus)",
+                                   toc_offset);
+               return -1;
+       }
+       toc_offset -= 8;
+       if (offset + toc_offset + 8 > G_MAXINT) {
+               proto_tree_add_text(tree,
+                                   tvb,
+                                   offset,
+                                   8,
+                                   "ToC Offset: %" G_GINT64_MODIFIER "u > %u (bogus)",
+                                   toc_offset,
+                                   G_MAXINT - 8 - offset);
+               return -1;
+       }
+       querylen = (spotlight_ntoh64(tvb, offset, encoding) & 0xffffffff) * 8;
+       if (querylen < 8) {
+               proto_tree_add_text(tree,
+                                   tvb,
+                                   offset,
+                                   8,
+                                   "ToC Offset: %" G_GINT64_MODIFIER "u Bytes, Query length: %" G_GINT64_MODIFIER "u < 8 (bogus)",
+                                   toc_offset,
+                                   querylen);
+               return -1;
+       }
+       querylen -= 8;
+       if (querylen > G_MAXINT) {
+               proto_tree_add_text(tree,
+                                   tvb,
+                                   offset,
+                                   8,
+                                   "ToC Offset: %" G_GINT64_MODIFIER "u Bytes, Query length: %" G_GINT64_MODIFIER "u > %u (bogus)",
+                                   toc_offset,
+                                   querylen,
+                                   G_MAXINT);
+               return -1;
+       }
+       proto_tree_add_text(tree,
+                           tvb,
+                           offset,
+                           8,
+                           "ToC Offset: %" G_GINT64_MODIFIER "u Bytes, Query length: %" G_GINT64_MODIFIER "u Bytes",
+                           toc_offset,
+                           querylen);
+       offset += 8;
+
+       toc_entries = (gint)(spotlight_ntoh64(tvb, offset + (gint)toc_offset, encoding) & 0xffff);
+
+       item_queries_data = proto_tree_add_text(tree,
+                                               tvb,
+                                               offset,
+                                               (gint)toc_offset,
+                                               "Spotlight RPC data");
+       sub_tree_queries = proto_item_add_subtree(item_queries_data, ett_afp_spotlight_queries);
+
+       /* Queries */
+       offset = spotlight_dissect_query_loop(tvb, pinfo, sub_tree_queries, offset, SQ_CPX_TYPE_ARRAY, INT_MAX, offset + (gint)toc_offset + 8, encoding);
+
+       /* ToC */
+       if (toc_entries < 1) {
+               proto_tree_add_text(tree,
+                                   tvb,
+                                   offset,
+                                   (gint)querylen - (gint)toc_offset,
+                                   "Complex types ToC (%u < 1 - bogus)",
+                                   toc_entries);
+               return -1;
+       }
+       toc_entries -= 1;
+       item_toc = proto_tree_add_text(tree,
+                                      tvb,
+                                      offset,
+                                      (gint)querylen - (gint)toc_offset,
+                                      "Complex types ToC (%u entries)",
+                                      toc_entries);
+       sub_tree_toc = proto_item_add_subtree(item_toc, ett_afp_spotlight_toc);
+       proto_tree_add_text(sub_tree_toc, tvb, offset, 2, "Number of entries (%u)", toc_entries);
+       proto_tree_add_text(sub_tree_toc, tvb, offset + 2, 2, "unknown");
+       proto_tree_add_text(sub_tree_toc, tvb, offset + 4, 4, "unknown");
+
+       offset += 8;
+       for (i = 0; i < toc_entries; i++, offset += 8) {
+               toc_entry = spotlight_ntoh64(tvb, offset, encoding);
+               if ((((toc_entry & 0xffff0000) >> 16) == SQ_CPX_TYPE_ARRAY)
+                   || (((toc_entry & 0xffff0000) >> 16) == SQ_CPX_TYPE_DICT)) {
+                       proto_tree_add_text(sub_tree_toc,
+                                           tvb,
+                                           offset,
+                                           8,
+                                           "%u: count: %" G_GINT64_MODIFIER "u, type: %s, offset: %" G_GINT64_MODIFIER "u",
+                                           i+1,
+                                           toc_entry >> 32,
+                                           spotlight_get_cpx_qtype_string((toc_entry & 0xffff0000) >> 16),
+                                           (toc_entry & 0xffff) * 8);
+               } else if ((((toc_entry & 0xffff0000) >> 16) == SQ_CPX_TYPE_STRING)
+                       || (((toc_entry & 0xffff0000) >> 16) == SQ_CPX_TYPE_UTF16_STRING)) {
+                       proto_tree_add_text(sub_tree_toc,
+                                           tvb,
+                                           offset,
+                                           8,
+                                           "%u: pad byte count: %" G_GINT64_MODIFIER "x, type: %s, offset: %" G_GINT64_MODIFIER "u",
+                                           i+1,
+                                           8 - (toc_entry >> 32),
+                                           spotlight_get_cpx_qtype_string((toc_entry & 0xffff0000) >> 16),
+                                           (toc_entry & 0xffff) * 8);
+               }
+               else {
+                       proto_tree_add_text(sub_tree_toc,
+                                           tvb,
+                                           offset,
+                                           8,
+                                           "%u: unknown: 0x%08" G_GINT64_MODIFIER "x, type: %s, offset: %" G_GINT64_MODIFIER "u",
+                                           i+1,
+                                           toc_entry >> 32,
+                                           spotlight_get_cpx_qtype_string((toc_entry & 0xffff0000) >> 16),
+                                           (toc_entry & 0xffff) * 8);
+               }
+
+
+       }
+
+       return offset;
+}
+
+static gint
+dissect_query_afp_spotlight(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint offset, afp_request_val *request_val)
+{
+       gint len;
+
+       PAD(1);
+       offset = decode_vol(tree, tvb, offset);
+
+       proto_tree_add_item(tree, hf_afp_spotlight_request_flags, tvb, offset, 4, ENC_BIG_ENDIAN);
+       offset += 4;
+
+       proto_tree_add_item(tree, hf_afp_spotlight_request_command, tvb, offset, 4, ENC_BIG_ENDIAN);
+       offset += 4;
+
+       proto_tree_add_item(tree, hf_afp_spotlight_request_reserved, tvb, offset, 4, ENC_BIG_ENDIAN);
+       offset += 4;
+
+       switch (request_val->spotlight_req_command) {
+
+       case SPOTLIGHT_CMD_GET_VOLPATH:
+               tvb_get_ephemeral_stringz(tvb, offset, &len);
+               proto_tree_add_item(tree, hf_afp_spotlight_volpath_client, tvb, offset, len, ENC_UTF_8|ENC_NA);
+               offset += len;
+               break;
+
+       case SPOTLIGHT_CMD_GET_VOLID:
+               /* empty */
+               break;
+
+       case SPOTLIGHT_CMD_GET_THREE:
+               proto_tree_add_item(tree, hf_afp_spotlight_volflags, tvb, offset, 4, ENC_BIG_ENDIAN);
+               offset += 4;
+
+               proto_tree_add_item(tree, hf_afp_spotlight_reqlen, tvb, offset, 4, ENC_BIG_ENDIAN);
+               offset += 4;
+
+               offset = dissect_spotlight(tvb, pinfo, tree, offset);
+
+               break;
+       }
+       return offset;
+}
+
 /* ************************** */
 static guint16
 decode_acl_list_bitmap(tvbuff_t *tvb, proto_tree *tree, gint offset)
@@ -3915,13 +4606,13 @@ decode_acl_list_bitmap(tvbuff_t *tvb, proto_tree *tree, gint offset)
                proto_tree *sub_tree;
                proto_item *item;
 
-               item = proto_tree_add_item(tree, hf_afp_acl_list_bitmap, tvb, offset, 2,FALSE);
+               item = proto_tree_add_item(tree, hf_afp_acl_list_bitmap, tvb, offset, 2, ENC_BIG_ENDIAN);
                sub_tree = proto_item_add_subtree(item, ett_afp_acl_list_bitmap);
-               proto_tree_add_item(sub_tree, hf_afp_acl_list_bitmap_UUID, tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_acl_list_bitmap_GRPUUID, tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_acl_list_bitmap_ACL, tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_acl_list_bitmap_REMOVEACL, tvb, offset, 2,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_acl_list_bitmap_Inherit, tvb, offset, 2,FALSE);
+               proto_tree_add_item(sub_tree, hf_afp_acl_list_bitmap_UUID,      tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_acl_list_bitmap_GRPUUID,   tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_acl_list_bitmap_ACL,       tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_acl_list_bitmap_REMOVEACL, tvb, offset, 2, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_acl_list_bitmap_Inherit,   tvb, offset, 2, ENC_BIG_ENDIAN);
        }
 
        return bitmap;
@@ -3939,15 +4630,15 @@ decode_ace_flags_bitmap(tvbuff_t *tvb, proto_tree *tree, gint offset)
                proto_tree *sub_tree;
                proto_item *item;
 
-               item = proto_tree_add_item(tree, hf_afp_ace_flags, tvb, offset, 4,FALSE);
+               item = proto_tree_add_item(tree, hf_afp_ace_flags, tvb, offset, 4, ENC_BIG_ENDIAN);
                sub_tree = proto_item_add_subtree(item, ett_afp_ace_flags);
-               proto_tree_add_item(sub_tree, hf_afp_ace_flags_allow, tvb, offset, 4,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_ace_flags_deny, tvb, offset, 4,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_ace_flags_inherited, tvb, offset, 4,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_ace_flags_fileinherit, tvb, offset, 4,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_ace_flags_dirinherit, tvb, offset, 4,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_ace_flags_limitinherit, tvb, offset, 4,FALSE);
-               proto_tree_add_item(sub_tree, hf_afp_ace_flags_onlyinherit, tvb, offset, 4,FALSE);
+               proto_tree_add_item(sub_tree, hf_afp_ace_flags_allow,        tvb, offset, 4, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_ace_flags_deny,         tvb, offset, 4, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_ace_flags_inherited,    tvb, offset, 4, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_ace_flags_fileinherit,  tvb, offset, 4, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_ace_flags_dirinherit,   tvb, offset, 4, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_ace_flags_limitinherit, tvb, offset, 4, ENC_BIG_ENDIAN);
+               proto_tree_add_item(sub_tree, hf_afp_ace_flags_onlyinherit,  tvb, offset, 4, ENC_BIG_ENDIAN);
        }
 
        return bitmap;
@@ -3958,7 +4649,7 @@ decode_kauth_ace(tvbuff_t *tvb, proto_tree *tree, gint offset)
 {
        /* FIXME: preliminary decoding... */
        if (tree) {
-               proto_tree_add_item(tree, hf_afp_UUID, tvb, offset, 16,FALSE);
+               proto_tree_add_item(tree, hf_afp_UUID, tvb, offset, 16, ENC_BIG_ENDIAN);
                offset += 16;
 
                decode_ace_flags_bitmap(tvb, tree, offset);
@@ -3976,8 +4667,8 @@ decode_kauth_ace(tvbuff_t *tvb, proto_tree *tree, gint offset)
 static gint
 decode_kauth_acl(tvbuff_t *tvb, proto_tree *tree, gint offset)
 {
-       int entries;
-       int i;
+       int         entries;
+       int         i;
        proto_tree *sub_tree;
        proto_tree *ace_tree;
        proto_item *item;
@@ -3985,11 +4676,11 @@ decode_kauth_acl(tvbuff_t *tvb, proto_tree *tree, gint offset)
        /* FIXME: preliminary decoding... */
        entries = tvb_get_ntohl(tvb, offset);
 
-       item = proto_tree_add_text(tree, tvb, offset, 4, "ACEs : %d", entries);
+       item = proto_tree_add_item(tree, hf_afp_acl_entrycount, tvb, offset, 4, ENC_BIG_ENDIAN);
        sub_tree = proto_item_add_subtree(item, ett_afp_ace_entries);
        offset += 4;
 
-       proto_tree_add_item(tree, hf_afp_acl_flags, tvb, offset, 4,FALSE);
+       proto_tree_add_item(tree, hf_afp_acl_flags, tvb, offset, 4, ENC_BIG_ENDIAN);
        offset += 4;
 
        for (i = 0; i < entries; i++) {
@@ -4009,12 +4700,12 @@ decode_uuid_acl(tvbuff_t *tvb, proto_tree *tree, gint offset, guint16 bitmap)
                PAD(1);
 
        if ((bitmap & kFileSec_UUID)) {
-               proto_tree_add_item(tree, hf_afp_UUID, tvb, offset, 16, FALSE);
+               proto_tree_add_item(tree, hf_afp_UUID, tvb, offset, 16, ENC_BIG_ENDIAN);
                offset += 16;
        }
 
        if ((bitmap & kFileSec_GRPUUID)) {
-               proto_tree_add_item(tree, hf_afp_UUID, tvb, offset, 16, FALSE);
+               proto_tree_add_item(tree, hf_afp_GRPUUID, tvb, offset, 16, ENC_BIG_ENDIAN);
                offset += 16;
        }
 
@@ -4054,7 +4745,7 @@ dissect_query_afp_get_acl(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, g
        decode_acl_list_bitmap(tvb, tree, offset);
        offset += 2;
 
-       proto_tree_add_item(tree, hf_afp_max_reply_size32, tvb, offset, 4,FALSE);
+       proto_tree_add_item(tree, hf_afp_max_reply_size32, tvb, offset, 4, ENC_BIG_ENDIAN);
        offset += 4;
 
        offset = decode_name(tree, pinfo, tvb, offset);
@@ -4076,11 +4767,47 @@ dissect_reply_afp_get_acl(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tre
        return offset;
 }
 
+/* ************************** */
+static gint
+dissect_reply_afp_spotlight(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint offset, afp_request_val *request_val)
+{
+       gint len;
+
+       switch (request_val->spotlight_req_command) {
+
+       case SPOTLIGHT_CMD_GET_VOLPATH:
+               proto_tree_add_item(tree, hf_afp_vol_id, tvb, offset, 4, ENC_BIG_ENDIAN);
+               offset += 4;
+
+               proto_tree_add_item(tree, hf_afp_spotlight_reply_reserved, tvb, offset, 4, ENC_BIG_ENDIAN);
+               offset += 4;
+
+               tvb_get_ephemeral_stringz(tvb, offset, &len);
+               proto_tree_add_item(tree, hf_afp_spotlight_volpath_server, tvb, offset, len, ENC_UTF_8|ENC_NA);
+               offset += len;
+               break;
+
+       case SPOTLIGHT_CMD_GET_VOLID:
+               proto_tree_add_item(tree, hf_afp_spotlight_volflags, tvb, offset, 4, ENC_BIG_ENDIAN);
+               offset += 4;
+               break;
+
+       case SPOTLIGHT_CMD_GET_THREE:
+               proto_tree_add_item(tree, hf_afp_spotlight_returncode, tvb, offset, 4, ENC_BIG_ENDIAN);
+               offset += 4;
+
+               offset = dissect_spotlight(tvb, pinfo, tree, offset);
+               break;
+       }
+       return offset;
+}
+
+
 /* ************************** */
 static void
 dissect_afp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
 {
-       struct aspinfo  *aspinfo = pinfo->private_data;
+       struct aspinfo  *aspinfo = (struct aspinfo*)pinfo->private_data;
        proto_tree      *afp_tree = NULL;
        proto_item      *ti;
        conversation_t  *conversation;
@@ -4105,11 +4832,17 @@ dissect_afp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
 
        if (!request_val && !aspinfo->reply)  {
                afp_command = tvb_get_guint8(tvb, offset);
-               new_request_key = se_alloc(sizeof(afp_request_key));
+               new_request_key = se_new(afp_request_key);
                *new_request_key = request_key;
 
-               request_val = se_alloc(sizeof(afp_request_val));
+               request_val = se_new(afp_request_val);
                request_val->command = afp_command;
+
+               if (afp_command == AFP_SPOTLIGHTRPC)
+                       request_val->spotlight_req_command = tvb_get_ntohl(tvb, offset + 2 + 2 + 4);
+               else
+                       request_val->spotlight_req_command = -1;
+
                request_val->frame_req = pinfo->fd->num;
                request_val->frame_res = 0;
                request_val->req_time=pinfo->fd->abs_ts;
@@ -4125,18 +4858,18 @@ dissect_afp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
 
        afp_command = request_val->command;
        col_add_fstr(pinfo->cinfo, COL_INFO, "%s %s",
-                    val_to_str(afp_command, CommandCode_vals,
+                    val_to_str_ext(afp_command, &CommandCode_vals_ext,
                                "Unknown command (%u)"),
                     aspinfo->reply ? "reply" : "request");
        if (aspinfo->reply && aspinfo->code != 0) {
                col_append_fstr(pinfo->cinfo, COL_INFO, ": %s (%d)",
-                       val_to_str(aspinfo->code, asp_error_vals,
+                       val_to_str_ext(aspinfo->code, &asp_error_vals_ext,
                                "Unknown error (%u)"), aspinfo->code);
        }
 
        if (tree)
        {
-               ti = proto_tree_add_item(tree, proto_afp, tvb, offset, -1,FALSE);
+               ti = proto_tree_add_item(tree, proto_afp, tvb, offset, -1, ENC_NA);
                afp_tree = proto_item_add_subtree(ti, ett_afp);
        }
        if (!aspinfo->reply)  {
@@ -4171,137 +4904,198 @@ dissect_afp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                offset++;
                switch(afp_command) {
                case AFP_BYTELOCK:
-                       offset = dissect_query_afp_byte_lock(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_byte_lock(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_BYTELOCK_EXT:
-                       offset = dissect_query_afp_byte_lock_ext(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_byte_lock_ext(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_OPENDT:        /* same as close vol */
                case AFP_FLUSH:
                case AFP_CLOSEVOL:
-                       offset = dissect_query_afp_with_vol_id(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_with_vol_id(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_CLOSEDIR:
-                       /* offset = dissect_query_afp_close_dir(tvb, pinfo, afp_tree, offset);break; */
+                       /* offset = dissect_query_afp_close_dir(tvb, pinfo, afp_tree, offset); */
                        break;
                case AFP_CLOSEDT:
-                       offset = dissect_query_afp_close_dt(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_close_dt(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_FLUSHFORK: /* same packet as closefork */
                case AFP_SYNCFORK:
                case AFP_CLOSEFORK:
-                       offset = dissect_query_afp_with_fork(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_with_fork(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_COPYFILE:
-                       offset = dissect_query_afp_copy_file(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_copy_file(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_CREATEFILE:
-                       offset = dissect_query_afp_create_file(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_create_file(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_DISCTOLDSESS:
-                       offset = dissect_query_afp_disconnect_old_session(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_disconnect_old_session(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_ENUMERATE_EXT2:
-                       offset = dissect_query_afp_enumerate_ext2(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_enumerate_ext2(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_ENUMERATE_EXT:
                case AFP_ENUMERATE:
-                       offset = dissect_query_afp_enumerate(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_enumerate(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_GETFORKPARAM:
-                       offset = dissect_query_afp_get_fork_param(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_get_fork_param(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_GETSESSTOKEN:
-                       offset = dissect_query_afp_get_session_token(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_get_session_token(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_GETUSERINFO:
-                       offset = dissect_query_afp_get_user_info(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_get_user_info(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_GETSRVINFO:
-                       /* offset = dissect_query_afp_get_server_info(tvb, pinfo, afp_tree, offset);break; */
+                       /* offset = dissect_query_afp_get_server_info(tvb, pinfo, afp_tree, offset); */
+                       break;
                case AFP_GETSRVPARAM:
                        break;                                  /* no parameters */
                case AFP_GETVOLPARAM:
-                       offset = dissect_query_afp_get_vol_param(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_get_vol_param(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_LOGIN_EXT:
-                       offset = dissect_query_afp_login_ext(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_login_ext(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_LOGIN:
-                       offset = dissect_query_afp_login(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_login(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_LOGINCONT:
                case AFP_LOGOUT:
                        break;
                case AFP_MAPID:
-                       offset = dissect_query_afp_map_id(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_map_id(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_MAPNAME:
-                       offset = dissect_query_afp_map_name(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_map_name(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_MOVE:
-                       offset = dissect_query_afp_move(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_move(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_OPENVOL:
-                       offset = dissect_query_afp_open_vol(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_open_vol(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_OPENDIR:
                        break;
                case AFP_OPENFORK:
-                       offset = dissect_query_afp_open_fork(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_open_fork(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_READ:
-                       offset = dissect_query_afp_read(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_read(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_READ_EXT:
-                       offset = dissect_query_afp_read_ext(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_read_ext(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_RENAME:
-                       offset = dissect_query_afp_rename(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_rename(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_SETDIRPARAM:
-                       offset = dissect_query_afp_set_dir_param(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_set_dir_param(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_SETFILEPARAM:
-                       offset = dissect_query_afp_set_file_param(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_set_file_param(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_SETFORKPARAM:
-                       offset = dissect_query_afp_set_fork_param(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_set_fork_param(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_SETVOLPARAM:
-                       offset = dissect_query_afp_set_vol_param(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_set_vol_param(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_WRITE:
-                       offset = dissect_query_afp_write(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_write(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_WRITE_EXT:
-                       offset = dissect_query_afp_write_ext(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_write_ext(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_GETFLDRPARAM:
-                       offset = dissect_query_afp_get_fldr_param(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_get_fldr_param(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_SETFLDRPARAM:
-                       offset = dissect_query_afp_set_fldr_param(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_set_fldr_param(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_CHANGEPW:
                        break;
                case AFP_GETSRVRMSG:
-                       offset = dissect_query_afp_get_server_message(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_get_server_message(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_DELETE:        /* same as create_id */
                case AFP_CREATEDIR:
                case AFP_CREATEID:
-                       offset = dissect_query_afp_create_id(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_create_id(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_DELETEID:
-                       offset = dissect_query_afp_delete_id(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_delete_id(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_RESOLVEID:
-                       offset = dissect_query_afp_resolve_id(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_resolve_id(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_EXCHANGEFILE:
-                       offset = dissect_query_afp_exchange_file(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_exchange_file(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_CATSEARCH_EXT:
-                       offset = dissect_query_afp_cat_search_ext(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_cat_search_ext(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_CATSEARCH:
-                       offset = dissect_query_afp_cat_search(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_cat_search(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_GETICON:
-                       offset = dissect_query_afp_get_icon(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_get_icon(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_GTICNINFO:
-                       offset = dissect_query_afp_get_icon_info(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_get_icon_info(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_ADDAPPL:
-                       offset = dissect_query_afp_add_appl(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_add_appl(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_RMVAPPL:
-                       offset = dissect_query_afp_rmv_appl(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_rmv_appl(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_GETAPPL:
-                       offset = dissect_query_afp_get_appl(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_get_appl(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_ADDCMT:
-                       offset = dissect_query_afp_add_cmt(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_add_cmt(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_RMVCMT: /* same as get_cmt */
                case AFP_GETCMT:
-                       offset = dissect_query_afp_get_cmt(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_get_cmt(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_ADDICON:
-                       offset = dissect_query_afp_add_icon(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_add_icon(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_GETEXTATTR:
-                       offset = dissect_query_afp_get_ext_attr(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_get_ext_attr(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_SETEXTATTR:
-                       offset = dissect_query_afp_set_ext_attr(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_set_ext_attr(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_LISTEXTATTR:
-                       offset = dissect_query_afp_list_ext_attrs(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_list_ext_attrs(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_REMOVEATTR:
-                       offset = dissect_query_afp_remove_ext_attr(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_remove_ext_attr(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_GETACL:
-                       offset = dissect_query_afp_get_acl(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_get_acl(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_SETACL:
-                       offset = dissect_query_afp_set_acl(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_set_acl(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_ACCESS:
-                       offset = dissect_query_afp_access(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_access(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_SYNCDIR:
-                       offset = dissect_query_afp_with_did(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_query_afp_with_did(tvb, pinfo, afp_tree, offset);
+                       break;
+               case AFP_SPOTLIGHTRPC:
+                       offset = dissect_query_afp_spotlight(tvb, pinfo, afp_tree, offset, request_val);
+                       if (offset == -1)
+                               return; /* bogus spotlight RPC */
+                       break;
                }
        }
        else {
@@ -4342,64 +5136,97 @@ dissect_afp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
 
                switch(afp_command) {
                case AFP_BYTELOCK:
-                       offset = dissect_reply_afp_byte_lock(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_reply_afp_byte_lock(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_BYTELOCK_EXT:
-                       offset = dissect_reply_afp_byte_lock_ext(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_reply_afp_byte_lock_ext(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_ENUMERATE_EXT2:
                case AFP_ENUMERATE_EXT:
-                       offset = dissect_reply_afp_enumerate_ext(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_reply_afp_enumerate_ext(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_ENUMERATE:
-                       offset = dissect_reply_afp_enumerate(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_reply_afp_enumerate(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_OPENVOL:
-                       offset = dissect_reply_afp_open_vol(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_reply_afp_open_vol(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_OPENFORK:
-                       offset = dissect_reply_afp_open_fork(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_reply_afp_open_fork(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_RESOLVEID:
                case AFP_GETFORKPARAM:
-                       offset =dissect_reply_afp_get_fork_param(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_reply_afp_get_fork_param(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_GETUSERINFO:
-                       offset = dissect_reply_afp_get_user_info(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_reply_afp_get_user_info(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_GETSRVPARAM:
-                       offset = dissect_reply_afp_get_server_param(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_reply_afp_get_server_param(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_GETSRVRMSG:
-                       offset = dissect_reply_afp_get_server_message(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_reply_afp_get_server_message(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_CREATEDIR:
-                       offset = dissect_reply_afp_create_dir(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_reply_afp_create_dir(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_MAPID:
-                       offset = dissect_reply_afp_map_id(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_reply_afp_map_id(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_MAPNAME:
-                       offset = dissect_reply_afp_map_name(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_reply_afp_map_name(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_MOVE:          /* same as create_id */
                case AFP_CREATEID:
-                       offset = dissect_reply_afp_create_id(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_reply_afp_create_id(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_GETSESSTOKEN:
-                       offset = dissect_reply_afp_get_session_token(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_reply_afp_get_session_token(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_GETVOLPARAM:
-                       offset = dissect_reply_afp_get_vol_param(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_reply_afp_get_vol_param(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_GETFLDRPARAM:
-                       offset = dissect_reply_afp_get_fldr_param(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_reply_afp_get_fldr_param(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_OPENDT:
-                       offset = dissect_reply_afp_open_dt(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_reply_afp_open_dt(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_CATSEARCH_EXT:
-                       offset = dissect_reply_afp_cat_search_ext(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_reply_afp_cat_search_ext(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_CATSEARCH:
-                       offset = dissect_reply_afp_cat_search(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_reply_afp_cat_search(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_GTICNINFO:
-                       offset = dissect_reply_afp_get_icon_info(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_reply_afp_get_icon_info(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_GETAPPL:
-                       offset = dissect_reply_afp_get_appl(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_reply_afp_get_appl(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_GETCMT:
-                       offset = dissect_reply_afp_get_cmt(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_reply_afp_get_cmt(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_WRITE:
-                       offset = dissect_reply_afp_write(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_reply_afp_write(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_WRITE_EXT:
-                       offset = dissect_reply_afp_write_ext(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_reply_afp_write_ext(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_GETEXTATTR:
-                       offset = dissect_reply_afp_get_ext_attr(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_reply_afp_get_ext_attr(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_LISTEXTATTR:
-                       offset = dissect_reply_afp_list_ext_attrs(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_reply_afp_list_ext_attrs(tvb, pinfo, afp_tree, offset);
+                       break;
                case AFP_GETACL:
-                       offset = dissect_reply_afp_get_acl(tvb, pinfo, afp_tree, offset);break;
+                       offset = dissect_reply_afp_get_acl(tvb, pinfo, afp_tree, offset);
+                       break;
+               case AFP_SPOTLIGHTRPC:
+                       offset = dissect_reply_afp_spotlight(tvb, pinfo, afp_tree, offset, request_val);
+                       if (offset == -1)
+                               return; /* bogus */
+                       break;
                }
        }
        if (offset < len) {
@@ -4425,7 +5252,7 @@ proto_register_afp(void)
        static hf_register_info hf[] = {
                { &hf_afp_command,
                  { "Command",      "afp.command",
-                   FT_UINT8, BASE_DEC, VALS(CommandCode_vals), 0x0,
+                   FT_UINT8, BASE_DEC|BASE_EXT_STRING, &CommandCode_vals_ext, 0x0,
                    "AFP function", HFILL }},
 
                { &hf_afp_pad,
@@ -4433,8 +5260,8 @@ proto_register_afp(void)
                    FT_NONE,   BASE_NONE, NULL, 0,
                    "Pad Byte", HFILL }},
 
-               { &hf_afp_AFPVersion,
-                 { "AFP Version",  "afp.AFPVersion",
+               { &hf_afp_Version,
+                 { "AFP Version",  "afp.Version",
                    FT_UINT_STRING, BASE_NONE, NULL, 0x0,
                    "Client AFP version", HFILL }},
 
@@ -4487,7 +5314,7 @@ proto_register_afp(void)
                    "The response to this packet is in this packet", HFILL }},
 
                { &hf_afp_login_flags,
-                 { "Flags",         "afp.afp_login_flags",
+                 { "Flags",         "afp.login_flags",
                    FT_UINT16, BASE_HEX, NULL, 0 /* 0x0FFF*/,
                    "Login flags", HFILL }},
 
@@ -4746,11 +5573,6 @@ proto_register_afp(void)
                    FT_BOOLEAN, 16, NULL,  kFPDeleteInhibitBit,
                    NULL, HFILL }},
 
-               { &hf_afp_dir_attribute_SetClear,
-                 { "Set",         "afp.dir_attribute.set_clear",
-                   FT_BOOLEAN, 16, NULL,  kFPSetClearBit,
-                   "Clear/set attribute", HFILL }},
-
                { &hf_afp_file_bitmap_Attributes,
                  { "Attributes",         "afp.file_bitmap.attributes",
                    FT_BOOLEAN, 16, NULL,  kFPAttributeBit,
@@ -4840,7 +5662,7 @@ proto_register_afp(void)
                { &hf_afp_file_attribute_MultiUser,
                  { "Multi user",         "afp.file_attribute.multi_user",
                    FT_BOOLEAN, 16, NULL,  kFPMultiUserBit,
-                   "multi user", HFILL }},
+                   NULL, HFILL }},
 
                { &hf_afp_file_attribute_System,
                  { "System",            "afp.file_attribute.system",
@@ -4870,17 +5692,17 @@ proto_register_afp(void)
                { &hf_afp_file_attribute_RenameInhibit,
                  { "Rename inhibit",         "afp.file_attribute.rename_inhibit",
                    FT_BOOLEAN, 16, NULL,  kFPRenameInhibitBit,
-                   "rename inhibit", HFILL }},
+                   NULL, HFILL }},
 
                { &hf_afp_file_attribute_DeleteInhibit,
                  { "Delete inhibit",         "afp.file_attribute.delete_inhibit",
                    FT_BOOLEAN, 16, NULL,  kFPDeleteInhibitBit,
-                   "delete inhibit", HFILL }},
+                   NULL, HFILL }},
 
                { &hf_afp_file_attribute_CopyProtect,
                  { "Copy protect",         "afp.file_attribute.copy_protect",
                    FT_BOOLEAN, 16, NULL,  kFPCopyProtectBit,
-                   "copy protect", HFILL }},
+                   NULL, HFILL }},
 
                { &hf_afp_file_attribute_SetClear,
                  { "Set",         "afp.file_attribute.set_clear",
@@ -5173,11 +5995,6 @@ proto_register_afp(void)
                    FT_BOOLEAN, 32, NULL,  0x80000000,
                    NULL, HFILL }},
 
-               { &hf_afp_request_bitmap,
-                 { "Request bitmap",         "afp.request_bitmap",
-                   FT_UINT32, BASE_HEX, NULL, 0x0,
-                   NULL, HFILL }},
-
                { &hf_afp_struct_size,
                  { "Struct size",         "afp.struct_size",
                    FT_UINT8, BASE_DEC, NULL,0,
@@ -5228,11 +6045,6 @@ proto_register_afp(void)
                    FT_UINT32, BASE_DEC, NULL, 0x0,
                    "Offset of the last byte written", HFILL }},
 
-               { &hf_afp_actual_count,
-                 { "Count",         "afp.actual_count",
-                   FT_INT32, BASE_DEC, NULL, 0x0,
-                   "Number of bytes returned by read/write", HFILL }},
-
                { &hf_afp_ofork_len,
                  { "New length",         "afp.ofork_len",
                    FT_INT32, BASE_DEC, NULL, 0x0,
@@ -5255,7 +6067,7 @@ proto_register_afp(void)
 
                { &hf_afp_path_unicode_hint,
                  { "Unicode hint",  "afp.path_unicode_hint",
-                   FT_UINT32, BASE_HEX, VALS(unicode_hint_vals), 0x0,
+                   FT_UINT32, BASE_HEX|BASE_EXT_STRING, &unicode_hint_vals_ext, 0x0,
                    NULL, HFILL }},
 
                { &hf_afp_path_name,
@@ -5298,11 +6110,21 @@ proto_register_afp(void)
                    FT_UINT_STRING, BASE_NONE, NULL, 0x0,
                    "File/folder comment", HFILL }},
 
+               /*
+                * XXX - should this be a type that's displayed as
+                * text if it's all printable ASCII and hex otherwise,
+                * or something such as that?
+                */
                { &hf_afp_file_creator,
                  { "File creator",         "afp.file_creator",
                    FT_STRING, BASE_NONE, NULL, 0x0,
                    NULL, HFILL }},
 
+               /*
+                * XXX - should this be a type that's displayed as
+                * text if it's all printable ASCII and hex otherwise,
+                * or something such as that?
+                */
                { &hf_afp_file_type,
                  { "File type",         "afp.file_type",
                    FT_STRING, BASE_NONE, NULL, 0x0,
@@ -5461,16 +6283,16 @@ proto_register_afp(void)
                { &hf_afp_cat_position,
                  { "Position",         "afp.cat_position",
                    FT_BYTES, BASE_NONE, NULL, 0x0,
-                   "Reserved", HFILL }},
+                   "Catalog position", HFILL }},
 
                { &hf_afp_map_name_type,
                  { "Type",      "afp.map_name_type",
-                   FT_UINT8, BASE_DEC, VALS(map_name_type_vals), 0x0,
+                   FT_UINT8, BASE_DEC|BASE_EXT_STRING, &map_name_type_vals_ext, 0x0,
                    "Map name type", HFILL }},
 
                { &hf_afp_map_id_type,
                  { "Type",      "afp.map_id_type",
-                   FT_UINT8, BASE_DEC, VALS(map_id_type_vals), 0x0,
+                   FT_UINT8, BASE_DEC|BASE_EXT_STRING, &map_id_type_vals_ext, 0x0,
                    "Map ID type", HFILL }},
 
                { &hf_afp_map_id,
@@ -5526,7 +6348,7 @@ proto_register_afp(void)
 
                { &hf_afp_session_token_type,
                  { "Type",         "afp.session_token_type",
-                   FT_UINT16, BASE_HEX, VALS(token_type_vals), 0x0,
+                   FT_UINT16, BASE_HEX|BASE_EXT_STRING, &token_type_vals_ext, 0x0,
                    "Session token type", HFILL }},
 
                /* FIXME FT_UINT32 in specs */
@@ -5562,12 +6384,12 @@ proto_register_afp(void)
 
                { &hf_afp_UUID,
                  { "UUID",         "afp.uuid",
-                   FT_BYTES, BASE_NONE, NULL, 0x0,
+                   FT_GUID, BASE_NONE, NULL, 0x0,
                    NULL, HFILL }},
 
                { &hf_afp_GRPUUID,
                  { "GRPUUID",         "afp.grpuuid",
-                   FT_BYTES, BASE_NONE, NULL, 0x0,
+                   FT_GUID, BASE_NONE, NULL, 0x0,
                    "Group UUID", HFILL }},
 
                { &hf_afp_user_bitmap,
@@ -5600,6 +6422,10 @@ proto_register_afp(void)
                    FT_UINT16, BASE_HEX, NULL, 0,
                    "Message bitmap", HFILL }},
 
+               /*
+                * XXX - in the reply, this indicates whether the message
+                * is a server message or a login message.
+                */
                { &hf_afp_message_bitmap_REQ,
                  { "Request message",         "afp.message_bitmap.requested",
                    FT_BOOLEAN, 16, NULL, 0x01,
@@ -5717,7 +6543,7 @@ proto_register_afp(void)
                    "Inherit ACL", HFILL }},
 
                { &hf_afp_acl_entrycount,
-                 { "Count",         "afp.acl_entrycount",
+                 { "ACEs count",         "afp.acl_entrycount",
                    FT_UINT32, BASE_HEX, NULL, 0,
                    "Number of ACL entries", HFILL }},
 
@@ -5726,16 +6552,6 @@ proto_register_afp(void)
                    FT_UINT32, BASE_HEX, NULL, 0,
                    NULL, HFILL }},
 
-               { &hf_afp_ace_applicable,
-                 { "ACE",         "afp.ace_applicable",
-                   FT_BYTES, BASE_NONE, NULL, 0x0,
-                   "ACE applicable", HFILL }},
-
-               { &hf_afp_ace_rights,
-                 { "Rights",         "afp.ace_rights",
-                   FT_UINT32, BASE_HEX, NULL, 0,
-                   "ACE flags", HFILL }},
-
                { &hf_afp_acl_access_bitmap,
                  { "Bitmap",         "afp.acl_access_bitmap",
                    FT_UINT32, BASE_HEX, NULL, 0,
@@ -5871,6 +6687,61 @@ proto_register_afp(void)
                    FT_BOOLEAN, 32, NULL, ACE_ONLY_INHERIT,
                    NULL, HFILL }},
 
+               { &hf_afp_spotlight_request_flags,
+                 { "Flags",               "afp.spotlight.flags",
+                   FT_UINT32, BASE_HEX, NULL, 0x0,
+                   "Spotlight RPC Flags", HFILL }},
+
+               { &hf_afp_spotlight_request_command,
+                 { "Command",               "afp.spotlight.command",
+                   FT_UINT32, BASE_HEX, NULL, 0x0,
+                   "Spotlight RPC Command", HFILL }},
+
+               { &hf_afp_spotlight_request_reserved,
+                 { "Padding",               "afp.spotlight.reserved",
+                   FT_UINT32, BASE_HEX, NULL, 0x0,
+                   "Spotlight RPC Padding", HFILL }},
+
+               { &hf_afp_spotlight_reply_reserved,
+                 { "Reserved",               "afp.spotlight.reserved",
+                   FT_UINT32, BASE_HEX, NULL, 0x0,
+                   "Spotlight RPC Padding", HFILL }},
+
+               { &hf_afp_spotlight_volpath_client,
+                 { "Client's volume path",               "afp.spotlight.volpath_client",
+                   FT_STRING, BASE_NONE, NULL, 0x0,
+                   NULL, HFILL }},
+
+               { &hf_afp_spotlight_volpath_server,
+                 { "Server's volume path",               "afp.spotlight.volpath_server",
+                   FT_STRING, BASE_NONE, NULL, 0x0,
+                   "Servers's volume path", HFILL }},
+
+               { &hf_afp_spotlight_returncode,
+                 { "Return code",               "afp.spotlight.return",
+                   FT_INT32, BASE_DEC, NULL, 0x0,
+                   NULL, HFILL }},
+
+               { &hf_afp_spotlight_volflags,
+                 { "Volume flags",               "afp.spotlight.volflags",
+                   FT_UINT32, BASE_HEX, NULL, 0x0,
+                   NULL, HFILL }},
+
+               { &hf_afp_spotlight_reqlen,
+                 { "Length",               "afp.spotlight.reqlen",
+                   FT_UINT32, BASE_DEC, NULL, 0x0,
+                   NULL, HFILL }},
+
+               { &hf_afp_spotlight_uuid,
+                 { "UUID",               "afp.spotlight.uuid",
+                   FT_GUID, BASE_NONE, NULL, 0x0,
+                   NULL, HFILL }},
+
+               { &hf_afp_spotlight_date,
+                 { "Date",               "afp.spotlight.date",
+                   FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x0,
+                   NULL, HFILL }},
+
                { &hf_afp_unknown,
                  { "Unknown parameter",         "afp.unknown",
                    FT_BYTES, BASE_NONE, NULL, 0x0,
@@ -5908,6 +6779,11 @@ proto_register_afp(void)
                &ett_afp_ace_entries,
                &ett_afp_ace_entry,
                &ett_afp_ace_flags,
+               &ett_afp_spotlight_queries,
+               &ett_afp_spotlight_query_line,
+               &ett_afp_spotlight_query,
+               &ett_afp_spotlight_data,
+               &ett_afp_spotlight_toc
        };
 
        proto_afp = proto_register_protocol("Apple Filing Protocol", "AFP", "afp");