From Steve Huston: add support for AMQP 0-10.
authorguy <guy@f5534014-38df-0310-8fa8-9805f1628bb7>
Wed, 5 Jan 2011 17:19:48 +0000 (17:19 +0000)
committerguy <guy@f5534014-38df-0310-8fa8-9805f1628bb7>
Wed, 5 Jan 2011 17:19:48 +0000 (17:19 +0000)
From me: add 0_9 to names for #defines and routines for 0-9, add expert
info for the "you ran past the end of the field table" error.

git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@35380 f5534014-38df-0310-8fa8-9805f1628bb7

AUTHORS
epan/dissectors/packet-amqp.c

diff --git a/AUTHORS b/AUTHORS
index 6744c6f..5f4d6e5 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -3213,6 +3213,10 @@ Emil Wojak <emil [AT] wojak.eu>
        TDS dissector improvements
 }
 
+Steve Huston <shuston [AT] riverace.com>
+       AMQP 0-10 support
+}
+
 and by:
 
 Pavel Roskin            <proski [AT] gnu.org>
index d47d4bf..247d97b 100644 (file)
@@ -1,8 +1,9 @@
 /* packet-amqp.c
  *
- * AMQP v0-9 Wireshark dissector plug-in
+ * AMQP v0-9, 0-10 Wireshark dissector plug-in
  *
- * Author: Martin Sustrik <sustrik@imatix.com>
+ * Author: Martin Sustrik <sustrik@imatix.com> (AMQP 0-9)
+ * Author: Steve Huston <shuston@riverace.com> (extended for AMQP 0-10)
  *
  * Copyright (c) 1996-2007 iMatix Corporation
  *
 #ifdef HAVE_CONFIG_H
 #    include "config.h"
 #endif
-
 #include <gmodule.h>
 #include <glib.h>
+#include <epan/exceptions.h>
 #include <epan/packet.h>
+#include <epan/expert.h>
 #include <epan/emem.h>
 #include <epan/dissectors/packet-tcp.h>
+#include <epan/tfs.h>
 
 /*  Generic data  */
 
@@ -51,506 +54,1040 @@ static int amqp_port = 5672;
 
 /*  Generic defines  */
 
-#define AMQP_FRAME_TYPE_METHOD                                    1
-#define AMQP_FRAME_TYPE_CONTENT_HEADER                            2
-#define AMQP_FRAME_TYPE_CONTENT_BODY                              3
-#define AMQP_FRAME_TYPE_OOB_METHOD                                4
-#define AMQP_FRAME_TYPE_OOB_CONTENT_HEADER                        5
-#define AMQP_FRAME_TYPE_OOB_CONTENT_BODY                          6
-#define AMQP_FRAME_TYPE_TRACE                                     7
-#define AMQP_FRAME_TYPE_HEARTBEAT                                 8
-
-#define AMQP_CLASS_CONNECTION                                     10
-#define AMQP_CLASS_CHANNEL                                        20
-#define AMQP_CLASS_ACCESS                                         30
-#define AMQP_CLASS_EXCHANGE                                       40
-#define AMQP_CLASS_QUEUE                                          50
-#define AMQP_CLASS_BASIC                                          60
-#define AMQP_CLASS_FILE                                           70
-#define AMQP_CLASS_STREAM                                         80
-#define AMQP_CLASS_TX                                             90
-#define AMQP_CLASS_DTX                                            100
-#define AMQP_CLASS_TUNNEL                                         110
-
-#define AMQP_METHOD_CONNECTION_START                              10
-#define AMQP_METHOD_CONNECTION_START_OK                           11
-#define AMQP_METHOD_CONNECTION_SECURE                             20
-#define AMQP_METHOD_CONNECTION_SECURE_OK                          21
-#define AMQP_METHOD_CONNECTION_TUNE                               30
-#define AMQP_METHOD_CONNECTION_TUNE_OK                            31
-#define AMQP_METHOD_CONNECTION_OPEN                               40
-#define AMQP_METHOD_CONNECTION_OPEN_OK                            41
-#define AMQP_METHOD_CONNECTION_REDIRECT                           42
-#define AMQP_METHOD_CONNECTION_CLOSE                              50
-#define AMQP_METHOD_CONNECTION_CLOSE_OK                           51
-
-#define AMQP_METHOD_CHANNEL_OPEN                                  10
-#define AMQP_METHOD_CHANNEL_OPEN_OK                               11
-#define AMQP_METHOD_CHANNEL_FLOW                                  20
-#define AMQP_METHOD_CHANNEL_FLOW_OK                               21
-#define AMQP_METHOD_CHANNEL_CLOSE                                 40
-#define AMQP_METHOD_CHANNEL_CLOSE_OK                              41
-#define AMQP_METHOD_CHANNEL_RESUME                                50
-#define AMQP_METHOD_CHANNEL_PING                                  60
-#define AMQP_METHOD_CHANNEL_PONG                                  70
-#define AMQP_METHOD_CHANNEL_OK                                    80
-
-#define AMQP_METHOD_ACCESS_REQUEST                                10
-#define AMQP_METHOD_ACCESS_REQUEST_OK                             11
-
-#define AMQP_METHOD_EXCHANGE_DECLARE                              10
-#define AMQP_METHOD_EXCHANGE_DECLARE_OK                           11
-#define AMQP_METHOD_EXCHANGE_DELETE                               20
-#define AMQP_METHOD_EXCHANGE_DELETE_OK                            21
-
-#define AMQP_METHOD_QUEUE_DECLARE                                 10
-#define AMQP_METHOD_QUEUE_DECLARE_OK                              11
-#define AMQP_METHOD_QUEUE_BIND                                    20
-#define AMQP_METHOD_QUEUE_BIND_OK                                 21
-#define AMQP_METHOD_QUEUE_UNBIND                                  50
-#define AMQP_METHOD_QUEUE_UNBIND_OK                               51
-#define AMQP_METHOD_QUEUE_PURGE                                   30
-#define AMQP_METHOD_QUEUE_PURGE_OK                                31
-#define AMQP_METHOD_QUEUE_DELETE                                  40
-#define AMQP_METHOD_QUEUE_DELETE_OK                               41
-
-#define AMQP_METHOD_BASIC_QOS                                     10
-#define AMQP_METHOD_BASIC_QOS_OK                                  11
-#define AMQP_METHOD_BASIC_CONSUME                                 20
-#define AMQP_METHOD_BASIC_CONSUME_OK                              21
-#define AMQP_METHOD_BASIC_CANCEL                                  30
-#define AMQP_METHOD_BASIC_CANCEL_OK                               31
-#define AMQP_METHOD_BASIC_PUBLISH                                 40
-#define AMQP_METHOD_BASIC_RETURN                                  50
-#define AMQP_METHOD_BASIC_DELIVER                                 60
-#define AMQP_METHOD_BASIC_GET                                     70
-#define AMQP_METHOD_BASIC_GET_OK                                  71
-#define AMQP_METHOD_BASIC_GET_EMPTY                               72
-#define AMQP_METHOD_BASIC_ACK                                     80
-#define AMQP_METHOD_BASIC_REJECT                                  90
-#define AMQP_METHOD_BASIC_RECOVER                                 100
-
-#define AMQP_METHOD_FILE_QOS                                      10
-#define AMQP_METHOD_FILE_QOS_OK                                   11
-#define AMQP_METHOD_FILE_CONSUME                                  20
-#define AMQP_METHOD_FILE_CONSUME_OK                               21
-#define AMQP_METHOD_FILE_CANCEL                                   30
-#define AMQP_METHOD_FILE_CANCEL_OK                                31
-#define AMQP_METHOD_FILE_OPEN                                     40
-#define AMQP_METHOD_FILE_OPEN_OK                                  41
-#define AMQP_METHOD_FILE_STAGE                                    50
-#define AMQP_METHOD_FILE_PUBLISH                                  60
-#define AMQP_METHOD_FILE_RETURN                                   70
-#define AMQP_METHOD_FILE_DELIVER                                  80
-#define AMQP_METHOD_FILE_ACK                                      90
-#define AMQP_METHOD_FILE_REJECT                                   100
-
-#define AMQP_METHOD_STREAM_QOS                                    10
-#define AMQP_METHOD_STREAM_QOS_OK                                 11
-#define AMQP_METHOD_STREAM_CONSUME                                20
-#define AMQP_METHOD_STREAM_CONSUME_OK                             21
-#define AMQP_METHOD_STREAM_CANCEL                                 30
-#define AMQP_METHOD_STREAM_CANCEL_OK                              31
-#define AMQP_METHOD_STREAM_PUBLISH                                40
-#define AMQP_METHOD_STREAM_RETURN                                 50
-#define AMQP_METHOD_STREAM_DELIVER                                60
-
-#define AMQP_METHOD_TX_SELECT                                     10
-#define AMQP_METHOD_TX_SELECT_OK                                  11
-#define AMQP_METHOD_TX_COMMIT                                     20
-#define AMQP_METHOD_TX_COMMIT_OK                                  21
-#define AMQP_METHOD_TX_ROLLBACK                                   30
-#define AMQP_METHOD_TX_ROLLBACK_OK                                31
-
-#define AMQP_METHOD_DTX_SELECT                                    10
-#define AMQP_METHOD_DTX_SELECT_OK                                 11
-#define AMQP_METHOD_DTX_START                                     20
-#define AMQP_METHOD_DTX_START_OK                                  21
-
-#define AMQP_METHOD_TUNNEL_REQUEST                                10
+#define AMQP_INCREMENT(offset, addend, bound) {\
+    int tmp;\
+    tmp = offset;\
+    offset += (addend);\
+    THROW_ON((offset > bound), ReportedBoundsError);  \
+}
+
+/*
+ * This dissector handles AMQP 0-9 and 0-10. The conversation structure
+ * contains the version being run - it's only really reliably detected at
+ * protocol init. If this dissector starts in the middle of a conversation
+ * it will try to figure it out, but conversation start is the best.
+ */
+
+/* #define AMQP_V0_8           1 */
+#define AMQP_V0_9           2
+/* #define AMQP_V0_91          3 */
+#define AMQP_V0_10          4
+typedef struct {
+    guint8 version;
+} amqp_conv;
+
+/* 0-9 defines */
+
+#define AMQP_0_9_FRAME_TYPE_METHOD                                    1
+#define AMQP_0_9_FRAME_TYPE_CONTENT_HEADER                            2
+#define AMQP_0_9_FRAME_TYPE_CONTENT_BODY                              3
+#define AMQP_0_9_FRAME_TYPE_OOB_METHOD                                4
+#define AMQP_0_9_FRAME_TYPE_OOB_CONTENT_HEADER                        5
+#define AMQP_0_9_FRAME_TYPE_OOB_CONTENT_BODY                          6
+#define AMQP_0_9_FRAME_TYPE_TRACE                                     7
+#define AMQP_0_9_FRAME_TYPE_HEARTBEAT                                 8
+
+#define AMQP_0_9_CLASS_CONNECTION                                     10
+#define AMQP_0_9_CLASS_CHANNEL                                        20
+#define AMQP_0_9_CLASS_ACCESS                                         30
+#define AMQP_0_9_CLASS_EXCHANGE                                       40
+#define AMQP_0_9_CLASS_QUEUE                                          50
+#define AMQP_0_9_CLASS_BASIC                                          60
+#define AMQP_0_9_CLASS_FILE                                           70
+#define AMQP_0_9_CLASS_STREAM                                         80
+#define AMQP_0_9_CLASS_TX                                             90
+#define AMQP_0_9_CLASS_DTX                                            100
+#define AMQP_0_9_CLASS_TUNNEL                                         110
+
+#define AMQP_0_9_METHOD_CONNECTION_START                              10
+#define AMQP_0_9_METHOD_CONNECTION_START_OK                           11
+#define AMQP_0_9_METHOD_CONNECTION_SECURE                             20
+#define AMQP_0_9_METHOD_CONNECTION_SECURE_OK                          21
+#define AMQP_0_9_METHOD_CONNECTION_TUNE                               30
+#define AMQP_0_9_METHOD_CONNECTION_TUNE_OK                            31
+#define AMQP_0_9_METHOD_CONNECTION_OPEN                               40
+#define AMQP_0_9_METHOD_CONNECTION_OPEN_OK                            41
+#define AMQP_0_9_METHOD_CONNECTION_REDIRECT                           42
+#define AMQP_0_9_METHOD_CONNECTION_CLOSE                              50
+#define AMQP_0_9_METHOD_CONNECTION_CLOSE_OK                           51
+
+#define AMQP_0_9_METHOD_CHANNEL_OPEN                                  10
+#define AMQP_0_9_METHOD_CHANNEL_OPEN_OK                               11
+#define AMQP_0_9_METHOD_CHANNEL_FLOW                                  20
+#define AMQP_0_9_METHOD_CHANNEL_FLOW_OK                               21
+#define AMQP_0_9_METHOD_CHANNEL_CLOSE                                 40
+#define AMQP_0_9_METHOD_CHANNEL_CLOSE_OK                              41
+#define AMQP_0_9_METHOD_CHANNEL_RESUME                                50
+#define AMQP_0_9_METHOD_CHANNEL_PING                                  60
+#define AMQP_0_9_METHOD_CHANNEL_PONG                                  70
+#define AMQP_0_9_METHOD_CHANNEL_OK                                    80
+
+#define AMQP_0_9_METHOD_ACCESS_REQUEST                                10
+#define AMQP_0_9_METHOD_ACCESS_REQUEST_OK                             11
+
+#define AMQP_0_9_METHOD_EXCHANGE_DECLARE                              10
+#define AMQP_0_9_METHOD_EXCHANGE_DECLARE_OK                           11
+#define AMQP_0_9_METHOD_EXCHANGE_DELETE                               20
+#define AMQP_0_9_METHOD_EXCHANGE_DELETE_OK                            21
+
+#define AMQP_0_9_METHOD_QUEUE_DECLARE                                 10
+#define AMQP_0_9_METHOD_QUEUE_DECLARE_OK                              11
+#define AMQP_0_9_METHOD_QUEUE_BIND                                    20
+#define AMQP_0_9_METHOD_QUEUE_BIND_OK                                 21
+#define AMQP_0_9_METHOD_QUEUE_UNBIND                                  50
+#define AMQP_0_9_METHOD_QUEUE_UNBIND_OK                               51
+#define AMQP_0_9_METHOD_QUEUE_PURGE                                   30
+#define AMQP_0_9_METHOD_QUEUE_PURGE_OK                                31
+#define AMQP_0_9_METHOD_QUEUE_DELETE                                  40
+#define AMQP_0_9_METHOD_QUEUE_DELETE_OK                               41
+
+#define AMQP_0_9_METHOD_BASIC_QOS                                     10
+#define AMQP_0_9_METHOD_BASIC_QOS_OK                                  11
+#define AMQP_0_9_METHOD_BASIC_CONSUME                                 20
+#define AMQP_0_9_METHOD_BASIC_CONSUME_OK                              21
+#define AMQP_0_9_METHOD_BASIC_CANCEL                                  30
+#define AMQP_0_9_METHOD_BASIC_CANCEL_OK                               31
+#define AMQP_0_9_METHOD_BASIC_PUBLISH                                 40
+#define AMQP_0_9_METHOD_BASIC_RETURN                                  50
+#define AMQP_0_9_METHOD_BASIC_DELIVER                                 60
+#define AMQP_0_9_METHOD_BASIC_GET                                     70
+#define AMQP_0_9_METHOD_BASIC_GET_OK                                  71
+#define AMQP_0_9_METHOD_BASIC_GET_EMPTY                               72
+#define AMQP_0_9_METHOD_BASIC_ACK                                     80
+#define AMQP_0_9_METHOD_BASIC_REJECT                                  90
+#define AMQP_0_9_METHOD_BASIC_RECOVER                                 100
+
+#define AMQP_0_9_METHOD_FILE_QOS                                      10
+#define AMQP_0_9_METHOD_FILE_QOS_OK                                   11
+#define AMQP_0_9_METHOD_FILE_CONSUME                                  20
+#define AMQP_0_9_METHOD_FILE_CONSUME_OK                               21
+#define AMQP_0_9_METHOD_FILE_CANCEL                                   30
+#define AMQP_0_9_METHOD_FILE_CANCEL_OK                                31
+#define AMQP_0_9_METHOD_FILE_OPEN                                     40
+#define AMQP_0_9_METHOD_FILE_OPEN_OK                                  41
+#define AMQP_0_9_METHOD_FILE_STAGE                                    50
+#define AMQP_0_9_METHOD_FILE_PUBLISH                                  60
+#define AMQP_0_9_METHOD_FILE_RETURN                                   70
+#define AMQP_0_9_METHOD_FILE_DELIVER                                  80
+#define AMQP_0_9_METHOD_FILE_ACK                                      90
+#define AMQP_0_9_METHOD_FILE_REJECT                                   100
+
+#define AMQP_0_9_METHOD_STREAM_QOS                                    10
+#define AMQP_0_9_METHOD_STREAM_QOS_OK                                 11
+#define AMQP_0_9_METHOD_STREAM_CONSUME                                20
+#define AMQP_0_9_METHOD_STREAM_CONSUME_OK                             21
+#define AMQP_0_9_METHOD_STREAM_CANCEL                                 30
+#define AMQP_0_9_METHOD_STREAM_CANCEL_OK                              31
+#define AMQP_0_9_METHOD_STREAM_PUBLISH                                40
+#define AMQP_0_9_METHOD_STREAM_RETURN                                 50
+#define AMQP_0_9_METHOD_STREAM_DELIVER                                60
+
+#define AMQP_0_9_METHOD_TX_SELECT                                     10
+#define AMQP_0_9_METHOD_TX_SELECT_OK                                  11
+#define AMQP_0_9_METHOD_TX_COMMIT                                     20
+#define AMQP_0_9_METHOD_TX_COMMIT_OK                                  21
+#define AMQP_0_9_METHOD_TX_ROLLBACK                                   30
+#define AMQP_0_9_METHOD_TX_ROLLBACK_OK                                31
+
+#define AMQP_0_9_METHOD_DTX_SELECT                                    10
+#define AMQP_0_9_METHOD_DTX_SELECT_OK                                 11
+#define AMQP_0_9_METHOD_DTX_START                                     20
+#define AMQP_0_9_METHOD_DTX_START_OK                                  21
+
+#define AMQP_0_9_METHOD_TUNNEL_REQUEST                                10
+
+/* AMQP 0-10 values */
+
+#define AMQP_0_10_FRAME_CONTROL  0
+#define AMQP_0_10_FRAME_COMMAND  1
+#define AMQP_0_10_FRAME_HEADER   2
+#define AMQP_0_10_FRAME_BODY     3
+
+#define AMQP_0_10_TYPE_STR16     0x95
+#define AMQP_0_10_TYPE_MAP       0xa8
+#define AMQP_0_10_TYPE_LIST      0xa9
+#define AMQP_0_10_TYPE_ARRAY     0xaa
+#define AMQP_0_10_TYPE_STRUCT32  0xab
+
+#define AMQP_0_10_CLASS_CONNECTION           0x01
+#define AMQP_0_10_METHOD_CONNECTION_START          0x01
+#define AMQP_0_10_METHOD_CONNECTION_START_OK       0x02
+#define AMQP_0_10_METHOD_CONNECTION_SECURE         0x03
+#define AMQP_0_10_METHOD_CONNECTION_SECURE_OK      0x04
+#define AMQP_0_10_METHOD_CONNECTION_TUNE           0x05
+#define AMQP_0_10_METHOD_CONNECTION_TUNE_OK        0x06
+#define AMQP_0_10_METHOD_CONNECTION_OPEN           0x07
+#define AMQP_0_10_METHOD_CONNECTION_OPEN_OK        0x08
+#define AMQP_0_10_METHOD_CONNECTION_REDIRECT       0x09
+#define AMQP_0_10_METHOD_CONNECTION_HEARTBEAT      0x0a
+#define AMQP_0_10_METHOD_CONNECTION_CLOSE          0x0b
+#define AMQP_0_10_METHOD_CONNECTION_CLOSE_OK       0x0c
+
+#define AMQP_0_10_CLASS_SESSION              0x02
+#define AMQP_0_10_METHOD_SESSION_ATTACH            0x01
+#define AMQP_0_10_METHOD_SESSION_ATTACHED          0x02
+#define AMQP_0_10_METHOD_SESSION_DETACH            0x03
+#define AMQP_0_10_METHOD_SESSION_DETACHED          0x04
+#define AMQP_0_10_METHOD_SESSION_REQUEST_TIMEOUT   0x05
+#define AMQP_0_10_METHOD_SESSION_TIMEOUT           0x06
+#define AMQP_0_10_METHOD_SESSION_COMMAND_POINT     0x07
+#define AMQP_0_10_METHOD_SESSION_EXPECTED          0x08
+#define AMQP_0_10_METHOD_SESSION_CONFIRMED         0x09
+#define AMQP_0_10_METHOD_SESSION_COMPLETED         0x0a
+#define AMQP_0_10_METHOD_SESSION_KNOWN_COMPLETED   0x0b
+#define AMQP_0_10_METHOD_SESSION_FLUSH             0x0c
+#define AMQP_0_10_METHOD_SESSION_GAP               0x0d
+
+#define AMQP_0_10_CLASS_EXECUTION            0x03
+#define AMQP_0_10_METHOD_EXECUTION_SYNC            0x01
+#define AMQP_0_10_METHOD_EXECUTION_RESULT          0x02
+#define AMQP_0_10_METHOD_EXECUTION_EXCEPTION       0x03
+
+#define AMQP_0_10_CLASS_MESSAGE              0x04
+#define AMQP_0_10_STRUCT_MESSAGE_DELIVERY_PROPERTIES   0x01
+#define AMQP_0_10_STRUCT_MESSAGE_FRAGMENT_PROPERTIES   0x02
+#define AMQP_0_10_STRUCT_MESSAGE_MESSAGE_PROPERTIES    0x03
+#define AMQP_0_10_STRUCT_MESSAGE_ACQUIRED              0x04
+#define AMQP_0_10_STRUCT_MESSAGE_RESUME_RESULT         0x05
+#define AMQP_0_10_METHOD_MESSAGE_TRANSFER          0x01
+#define AMQP_0_10_METHOD_MESSAGE_ACCEPT            0x02
+#define AMQP_0_10_METHOD_MESSAGE_REJECT            0x03
+#define AMQP_0_10_METHOD_MESSAGE_RELEASE           0x04
+#define AMQP_0_10_METHOD_MESSAGE_ACQUIRE           0x05
+#define AMQP_0_10_METHOD_MESSAGE_RESUME            0x06
+#define AMQP_0_10_METHOD_MESSAGE_SUBSCRIBE         0x07
+#define AMQP_0_10_METHOD_MESSAGE_CANCEL            0x08
+#define AMQP_0_10_METHOD_MESSAGE_SET_FLOW_MODE     0x09
+#define AMQP_0_10_METHOD_MESSAGE_FLOW              0x0a
+#define AMQP_0_10_METHOD_MESSAGE_FLUSH             0x0b
+#define AMQP_0_10_METHOD_MESSAGE_STOP              0x0c
+
+#define AMQP_0_10_CLASS_TX                   0x05
+#define AMQP_0_10_METHOD_TX_SELECT                 0x01
+#define AMQP_0_10_METHOD_TX_COMMIT                 0x02
+#define AMQP_0_10_METHOD_TX_ROLLBACK               0x03
+
+#define AMQP_0_10_CLASS_DTX                  0x06
+#define AMQP_0_10_STRUCT_DTX_XA_RESULT          0x01
+#define AMQP_0_10_STRUCT_DTX_RECOVER_RESULT     0x03
+#define AMQP_0_10_METHOD_DTX_SELECT                0x01
+#define AMQP_0_10_METHOD_DTX_START                 0x02
+#define AMQP_0_10_METHOD_DTX_END                   0x03
+#define AMQP_0_10_METHOD_DTX_COMMIT                0x04
+#define AMQP_0_10_METHOD_DTX_FORGET                0x05
+#define AMQP_0_10_METHOD_DTX_GET_TIMEOUT           0x06
+#define AMQP_0_10_METHOD_DTX_PREPARE               0x07
+#define AMQP_0_10_METHOD_DTX_RECOVER               0x08
+#define AMQP_0_10_METHOD_DTX_ROLLBACK              0x09
+#define AMQP_0_10_METHOD_DTX_SET_TIMEOUT           0x0a
+
+#define AMQP_0_10_CLASS_EXCHANGE             0x07
+#define AMQP_0_10_STRUCT_EXCHANGE_QUERY_RESULT  0x01
+#define AMQP_0_10_STRUCT_EXCHANGE_BOUND_RESULT  0x02
+#define AMQP_0_10_METHOD_EXCHANGE_DECLARE          0x01
+#define AMQP_0_10_METHOD_EXCHANGE_DELETE           0x02
+#define AMQP_0_10_METHOD_EXCHANGE_QUERY            0x03
+#define AMQP_0_10_METHOD_EXCHANGE_BIND             0x04
+#define AMQP_0_10_METHOD_EXCHANGE_UNBIND           0x05
+#define AMQP_0_10_METHOD_EXCHANGE_BOUND            0x06
+
+#define AMQP_0_10_CLASS_QUEUE                0x08
+#define AMQP_0_10_STRUCT_QUEUE_QUERY_RESULT     0x01
+#define AMQP_0_10_METHOD_QUEUE_DECLARE             0x01
+#define AMQP_0_10_METHOD_QUEUE_DELETE              0x02
+#define AMQP_0_10_METHOD_QUEUE_PURGE               0x03
+#define AMQP_0_10_METHOD_QUEUE_QUERY               0x04
+
+#define AMQP_0_10_CLASS_FILE                 0x09
+#define AMQP_0_10_STRUCT_FILE_PROPERTIES        0x01
+#define AMQP_0_10_METHOD_FILE_QOS                  0x01
+#define AMQP_0_10_METHOD_FILE_QOS_OK               0x02
+#define AMQP_0_10_METHOD_FILE_CONSUME              0x03
+#define AMQP_0_10_METHOD_FILE_CONSUME_OK           0x04
+#define AMQP_0_10_METHOD_FILE_CANCEL               0x05
+#define AMQP_0_10_METHOD_FILE_OPEN                 0x06
+#define AMQP_0_10_METHOD_FILE_OPEN_OK              0x07
+#define AMQP_0_10_METHOD_FILE_STAGE                0x08
+#define AMQP_0_10_METHOD_FILE_PUBLISH              0x09
+#define AMQP_0_10_METHOD_FILE_RETURN               0x0a
+#define AMQP_0_10_METHOD_FILE_DELIVER              0x0b
+#define AMQP_0_10_METHOD_FILE_ACK                  0x0c
+#define AMQP_0_10_METHOD_FILE_REJECT               0x0d
+
+#define AMQP_0_10_CLASS_STREAM               0x0a
+#define AMQP_0_10_STRUCT_STREAM_PROPERTIES      0x01
+#define AMQP_0_10_METHOD_STREAM_QOS                0x01
+#define AMQP_0_10_METHOD_STREAM_QOS_OK             0x02
+#define AMQP_0_10_METHOD_STREAM_CONSUME            0x03
+#define AMQP_0_10_METHOD_STREAM_CONSUME_OK         0x04
+#define AMQP_0_10_METHOD_STREAM_CANCEL             0x05
+#define AMQP_0_10_METHOD_STREAM_PUBLISH            0x06
+#define AMQP_0_10_METHOD_STREAM_RETURN             0x07
+#define AMQP_0_10_METHOD_STREAM_DELIVER            0x08
 
 /*  Private functions  */
 
 static void
 dissect_amqp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
 
+static void
+check_amqp_version(tvbuff_t *tvb, amqp_conv *conn);
+
 static guint
-get_amqp_message_len(packet_info *pinfo, tvbuff_t *tvb, int offset);
+get_amqp_0_10_message_len(packet_info *pinfo, tvbuff_t *tvb, int offset);
+
+static guint
+get_amqp_0_9_message_len(packet_info *pinfo, tvbuff_t *tvb, int offset);
+
+static void
+dissect_amqp_0_9_field_table(tvbuff_t *tvb, packet_info *pinfo, int offset, guint length, proto_item *item);
+
+static void
+dissect_amqp_0_10_map(tvbuff_t *tvb,
+                      int offset,
+                      int bound,
+                      int length,
+                      proto_item *item);
+
+static void
+dissect_amqp_0_10_array(tvbuff_t *tvb,
+                        int offset,
+                        int bound,
+                        int length,
+                        proto_item *item);
+
+static void
+dissect_amqp_0_10_xid (tvbuff_t *tvb,
+                       int offset,
+                       guint16 xid_length,
+                       proto_item *ti);
+
+static void
+dissect_amqp_0_10_connection(tvbuff_t *tvb,
+                             packet_info *pinfo,
+                             proto_tree *tree,
+                             int offset, guint16 length);
+
+static void
+dissect_amqp_0_10_session(tvbuff_t *tvb,
+                          packet_info *pinfo,
+                          proto_tree *tree,
+                          int offset, guint16 length);
+
+static void
+dissect_amqp_0_10_execution(tvbuff_t *tvb,
+                            packet_info *pinfo,
+                            proto_tree *tree,
+                            int offset, guint16 length);
+
+static void
+dissect_amqp_0_10_message(tvbuff_t *tvb,
+                          packet_info *pinfo,
+                          proto_tree *tree,
+                          int offset, guint16 length);
+
+static void
+dissect_amqp_0_10_tx(tvbuff_t *tvb,
+                     packet_info *pinfo,
+                     proto_tree *tree,
+                     int offset, guint16 length);
+
+static void
+dissect_amqp_0_10_dtx(tvbuff_t *tvb,
+                      packet_info *pinfo,
+                      proto_tree *tree,
+                      int offset, guint16 length);
+
+static void
+dissect_amqp_0_10_exchange(tvbuff_t *tvb,
+                           packet_info *pinfo,
+                           proto_tree *tree,
+                           int offset, guint16 length);
 
 static void
-dissect_amqp_field_table(tvbuff_t *tvb, int offset, guint length, proto_item *item);
+dissect_amqp_0_10_queue(tvbuff_t *tvb,
+                        packet_info *pinfo,
+                        proto_tree *tree,
+                        int offset, guint16 length);
 
 static void
-dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
+dissect_amqp_0_10_file(tvbuff_t *tvb,
+                       packet_info *pinfo,
+                       proto_tree *tree,
+                       int offset, guint16 length);
+
+static void
+dissect_amqp_0_10_stream(tvbuff_t *tvb,
+                         packet_info *pinfo,
+                         proto_tree *tree,
+                         int offset, guint16 length);
+
+static void
+dissect_amqp_0_10_struct_delivery_properties(tvbuff_t *tvb,
+                                             proto_tree *tree,
+                                             int offset,
+                                             guint32 struct_length);
+
+static void
+dissect_amqp_0_10_struct_fragment_properties(tvbuff_t *tvb,
+                                             proto_tree *tree,
+                                             int offset,
+                                             guint32 struct_length);
+
+static void
+dissect_amqp_0_10_struct_message_properties(tvbuff_t *tvb,
+                                            proto_tree *tree,
+                                            int offset,
+                                            guint32 struct_length);
+
+static void
+dissect_amqp_0_10_struct_exchange_query_result(tvbuff_t *tvb,
+                                               proto_tree *tree,
+                                               int offset,
+                                               guint32 struct_length);
+
+static void
+dissect_amqp_0_10_struct_queue_query_result(tvbuff_t *tvb,
+                                            proto_tree *tree,
+                                            int offset,
+                                            guint32 struct_length);
+
+static void
+dissect_amqp_0_10_struct_file_properties(tvbuff_t *tvb,
+                                         proto_tree *tree,
+                                         int offset,
+                                         guint32 struct_length);
+
+static void
+dissect_amqp_0_10_struct_stream_properties(tvbuff_t *tvb,
+                                           proto_tree *tree,
+                                           int offset,
+                                           guint32 struct_length);
+
+static void
+dissect_amqp_0_10_struct32(tvbuff_t *tvb, proto_tree *tree,
+                           int offset, guint32 struct_length);
+
+static void
+dissect_amqp_0_10_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
+
+static void
+dissect_amqp_0_9_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
 
 static int
-dissect_amqp_method_connection_start(tvbuff_t *tvb,
+dissect_amqp_0_9_method_connection_start(tvbuff_t *tvb, packet_info *pinfo,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_connection_start_ok(tvbuff_t *tvb,
+dissect_amqp_0_9_method_connection_start_ok(tvbuff_t *tvb, packet_info *pinfo,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_connection_secure(tvbuff_t *tvb,
+dissect_amqp_0_9_method_connection_secure(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_connection_secure_ok(tvbuff_t *tvb,
+dissect_amqp_0_9_method_connection_secure_ok(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_connection_tune(tvbuff_t *tvb,
+dissect_amqp_0_9_method_connection_tune(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_connection_tune_ok(tvbuff_t *tvb,
+dissect_amqp_0_9_method_connection_tune_ok(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_connection_open(tvbuff_t *tvb,
+dissect_amqp_0_9_method_connection_open(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_connection_open_ok(tvbuff_t *tvb,
+dissect_amqp_0_9_method_connection_open_ok(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_connection_redirect(tvbuff_t *tvb,
+dissect_amqp_0_9_method_connection_redirect(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_connection_close(tvbuff_t *tvb,
+dissect_amqp_0_9_method_connection_close(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_connection_close_ok(tvbuff_t *tvb,
+dissect_amqp_0_9_method_connection_close_ok(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_channel_open(tvbuff_t *tvb,
+dissect_amqp_0_9_method_channel_open(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_channel_open_ok(tvbuff_t *tvb,
+dissect_amqp_0_9_method_channel_open_ok(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_channel_flow(tvbuff_t *tvb,
+dissect_amqp_0_9_method_channel_flow(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_channel_flow_ok(tvbuff_t *tvb,
+dissect_amqp_0_9_method_channel_flow_ok(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_channel_close(tvbuff_t *tvb,
+dissect_amqp_0_9_method_channel_close(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_channel_close_ok(tvbuff_t *tvb,
+dissect_amqp_0_9_method_channel_close_ok(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_channel_resume(tvbuff_t *tvb,
+dissect_amqp_0_9_method_channel_resume(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_channel_ping(tvbuff_t *tvb,
+dissect_amqp_0_9_method_channel_ping(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_channel_pong(tvbuff_t *tvb,
+dissect_amqp_0_9_method_channel_pong(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_channel_ok(tvbuff_t *tvb,
+dissect_amqp_0_9_method_channel_ok(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_access_request(tvbuff_t *tvb,
+dissect_amqp_0_9_method_access_request(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_access_request_ok(tvbuff_t *tvb,
+dissect_amqp_0_9_method_access_request_ok(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_exchange_declare(tvbuff_t *tvb,
+dissect_amqp_0_9_method_exchange_declare(tvbuff_t *tvb, packet_info *pinfo,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_exchange_declare_ok(tvbuff_t *tvb,
+dissect_amqp_0_9_method_exchange_declare_ok(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_exchange_delete(tvbuff_t *tvb,
+dissect_amqp_0_9_method_exchange_delete(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_exchange_delete_ok(tvbuff_t *tvb,
+dissect_amqp_0_9_method_exchange_delete_ok(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_queue_declare(tvbuff_t *tvb,
+dissect_amqp_0_9_method_queue_declare(tvbuff_t *tvb, packet_info *pinfo,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_queue_declare_ok(tvbuff_t *tvb,
+dissect_amqp_0_9_method_queue_declare_ok(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_queue_bind(tvbuff_t *tvb,
+dissect_amqp_0_9_method_queue_bind(tvbuff_t *tvb, packet_info *pinfo,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_queue_bind_ok(tvbuff_t *tvb,
+dissect_amqp_0_9_method_queue_bind_ok(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_queue_unbind(tvbuff_t *tvb,
+dissect_amqp_0_9_method_queue_unbind(tvbuff_t *tvb, packet_info *pinfo,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_queue_unbind_ok(tvbuff_t *tvb,
+dissect_amqp_0_9_method_queue_unbind_ok(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_queue_purge(tvbuff_t *tvb,
+dissect_amqp_0_9_method_queue_purge(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_queue_purge_ok(tvbuff_t *tvb,
+dissect_amqp_0_9_method_queue_purge_ok(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_queue_delete(tvbuff_t *tvb,
+dissect_amqp_0_9_method_queue_delete(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_queue_delete_ok(tvbuff_t *tvb,
+dissect_amqp_0_9_method_queue_delete_ok(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_basic_qos(tvbuff_t *tvb,
+dissect_amqp_0_9_method_basic_qos(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_basic_qos_ok(tvbuff_t *tvb,
+dissect_amqp_0_9_method_basic_qos_ok(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_basic_consume(tvbuff_t *tvb,
+dissect_amqp_0_9_method_basic_consume(tvbuff_t *tvb, packet_info *pinfo,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_basic_consume_ok(tvbuff_t *tvb,
+dissect_amqp_0_9_method_basic_consume_ok(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_basic_cancel(tvbuff_t *tvb,
+dissect_amqp_0_9_method_basic_cancel(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_basic_cancel_ok(tvbuff_t *tvb,
+dissect_amqp_0_9_method_basic_cancel_ok(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_basic_publish(tvbuff_t *tvb,
+dissect_amqp_0_9_method_basic_publish(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_basic_return(tvbuff_t *tvb,
+dissect_amqp_0_9_method_basic_return(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_basic_deliver(tvbuff_t *tvb,
+dissect_amqp_0_9_method_basic_deliver(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_basic_get(tvbuff_t *tvb,
+dissect_amqp_0_9_method_basic_get(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_basic_get_ok(tvbuff_t *tvb,
+dissect_amqp_0_9_method_basic_get_ok(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_basic_get_empty(tvbuff_t *tvb,
+dissect_amqp_0_9_method_basic_get_empty(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_basic_ack(tvbuff_t *tvb,
+dissect_amqp_0_9_method_basic_ack(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_basic_reject(tvbuff_t *tvb,
+dissect_amqp_0_9_method_basic_reject(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_basic_recover(tvbuff_t *tvb,
+dissect_amqp_0_9_method_basic_recover(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_file_qos(tvbuff_t *tvb,
+dissect_amqp_0_9_method_file_qos(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_file_qos_ok(tvbuff_t *tvb,
+dissect_amqp_0_9_method_file_qos_ok(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_file_consume(tvbuff_t *tvb,
+dissect_amqp_0_9_method_file_consume(tvbuff_t *tvb, packet_info *pinfo,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_file_consume_ok(tvbuff_t *tvb,
+dissect_amqp_0_9_method_file_consume_ok(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_file_cancel(tvbuff_t *tvb,
+dissect_amqp_0_9_method_file_cancel(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_file_cancel_ok(tvbuff_t *tvb,
+dissect_amqp_0_9_method_file_cancel_ok(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_file_open(tvbuff_t *tvb,
+dissect_amqp_0_9_method_file_open(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_file_open_ok(tvbuff_t *tvb,
+dissect_amqp_0_9_method_file_open_ok(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_file_stage(tvbuff_t *tvb,
+dissect_amqp_0_9_method_file_stage(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_file_publish(tvbuff_t *tvb,
+dissect_amqp_0_9_method_file_publish(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_file_return(tvbuff_t *tvb,
+dissect_amqp_0_9_method_file_return(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_file_deliver(tvbuff_t *tvb,
+dissect_amqp_0_9_method_file_deliver(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_file_ack(tvbuff_t *tvb,
+dissect_amqp_0_9_method_file_ack(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_file_reject(tvbuff_t *tvb,
+dissect_amqp_0_9_method_file_reject(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_stream_qos(tvbuff_t *tvb,
+dissect_amqp_0_9_method_stream_qos(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_stream_qos_ok(tvbuff_t *tvb,
+dissect_amqp_0_9_method_stream_qos_ok(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_stream_consume(tvbuff_t *tvb,
+dissect_amqp_0_9_method_stream_consume(tvbuff_t *tvb, packet_info *pinfo,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_stream_consume_ok(tvbuff_t *tvb,
+dissect_amqp_0_9_method_stream_consume_ok(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_stream_cancel(tvbuff_t *tvb,
+dissect_amqp_0_9_method_stream_cancel(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_stream_cancel_ok(tvbuff_t *tvb,
+dissect_amqp_0_9_method_stream_cancel_ok(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_stream_publish(tvbuff_t *tvb,
+dissect_amqp_0_9_method_stream_publish(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_stream_return(tvbuff_t *tvb,
+dissect_amqp_0_9_method_stream_return(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_stream_deliver(tvbuff_t *tvb,
+dissect_amqp_0_9_method_stream_deliver(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_tx_select(tvbuff_t *tvb,
+dissect_amqp_0_9_method_tx_select(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_tx_select_ok(tvbuff_t *tvb,
+dissect_amqp_0_9_method_tx_select_ok(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_tx_commit(tvbuff_t *tvb,
+dissect_amqp_0_9_method_tx_commit(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_tx_commit_ok(tvbuff_t *tvb,
+dissect_amqp_0_9_method_tx_commit_ok(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_tx_rollback(tvbuff_t *tvb,
+dissect_amqp_0_9_method_tx_rollback(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_tx_rollback_ok(tvbuff_t *tvb,
+dissect_amqp_0_9_method_tx_rollback_ok(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_dtx_select(tvbuff_t *tvb,
+dissect_amqp_0_9_method_dtx_select(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_dtx_select_ok(tvbuff_t *tvb,
+dissect_amqp_0_9_method_dtx_select_ok(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_dtx_start(tvbuff_t *tvb,
+dissect_amqp_0_9_method_dtx_start(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_dtx_start_ok(tvbuff_t *tvb,
+dissect_amqp_0_9_method_dtx_start_ok(tvbuff_t *tvb,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_method_tunnel_request(tvbuff_t *tvb,
+dissect_amqp_0_9_method_tunnel_request(tvbuff_t *tvb, packet_info *pinfo,
     int offset, proto_tree *args_tree);
 
 static int
-dissect_amqp_content_header_basic(tvbuff_t *tvb,
+dissect_amqp_0_9_content_header_basic(tvbuff_t *tvb, packet_info *pinfo,
     int offset, proto_tree *prop_tree);
 
 static int
-dissect_amqp_content_header_file(tvbuff_t *tvb,
+dissect_amqp_0_9_content_header_file(tvbuff_t *tvb, packet_info *pinfo,
     int offset, proto_tree *prop_tree);
 
 static int
-dissect_amqp_content_header_stream(tvbuff_t *tvb,
+dissect_amqp_0_9_content_header_stream(tvbuff_t *tvb, packet_info *pinfo,
     int offset, proto_tree *prop_tree);
 
 static int
-dissect_amqp_content_header_tunnel(tvbuff_t *tvb,
+dissect_amqp_0_9_content_header_tunnel(tvbuff_t *tvb, packet_info *pifo,
     int offset, proto_tree *prop_tree);
 
+/*  AMQP 0-10 type decoding information  */
+
+typedef int (*type_formatter)(tvbuff_t *tvb,
+                              guint offset,   /* In tvb where data starts */
+                              guint bound,    /* Last byte in tvb */
+                              guint length,   /* Length of data, if known */
+                              const char **value); /* Receive formatted val */
+struct amqp_typeinfo {
+    guint8 typecode;        /* From AMQP 0-10 spec */
+    const char *typename;
+    type_formatter formatter;
+    guint known_size;
+};
+static gboolean
+get_amqp_0_10_type_formatter(guint8 code,
+                             const char **name,
+                             type_formatter *decoder,
+                             guint *length_size);
+
+static int
+format_amqp_0_10_bin(tvbuff_t *tvb,
+                     guint offset, guint bound, guint length,
+                     const char **value);
+
+static int
+format_amqp_0_10_int(tvbuff_t *tvb,
+                     guint offset, guint bound, guint length,
+                     const char **value);
+
+static int
+format_amqp_0_10_uint(tvbuff_t *tvb,
+                      guint offset, guint bound, guint length,
+                      const char **value);
+
+static int
+format_amqp_0_10_char(tvbuff_t *tvb,
+                      guint offset, guint bound, guint length,
+                      const char **value);
+
+static int
+format_amqp_0_10_boolean(tvbuff_t *tvb,
+                         guint offset, guint bound, guint length,
+                         const char **value);
+
+static int
+format_amqp_0_10_vbin(tvbuff_t *tvb,
+                      guint offset, guint bound, guint length,
+                      const char **value);
+
+static int
+format_amqp_0_10_str(tvbuff_t *tvb,
+                     guint offset, guint bound, guint length,
+                     const char **value);
+
+static void
+format_amqp_0_10_sequence_set(tvbuff_t *tvb, guint offset, guint length,
+                              proto_item *item);
+
 /*  Various handles  */
 
 static int proto_amqp = -1;
 
-static int hf_amqp_type = -1;
+/* 0-10 handles */
+
+static int hf_amqp_0_10_format = -1;
+static int hf_amqp_0_10_position = -1;
+static int hf_amqp_0_10_type = -1;
+static int hf_amqp_0_10_size = -1;
+static int hf_amqp_0_10_track = -1;
+static int hf_amqp_0_10_class = -1;
+static int hf_amqp_0_10_connection_method = -1;
+static int hf_amqp_0_10_session_method = -1;
+static int hf_amqp_0_10_execution_method = -1;
+static int hf_amqp_0_10_message_method = -1;
+static int hf_amqp_0_10_tx_method = -1;
+static int hf_amqp_0_10_dtx_method = -1;
+static int hf_amqp_0_10_exchange_method = -1;
+static int hf_amqp_0_10_queue_method = -1;
+static int hf_amqp_0_10_file_method = -1;
+static int hf_amqp_0_10_stream_method = -1;
+static int hf_amqp_0_10_argument_packing_flags = -1;
+static int hf_amqp_0_10_session_header_sync = -1;
+static int hf_amqp_0_10_undissected_struct32 = -1;
+static int hf_amqp_0_10_message_body = -1;
+static int hf_amqp_0_10_dtx_xid = -1;
+static int hf_amqp_0_10_dtx_xid_format = -1;
+static int hf_amqp_0_10_dtx_xid_global_id = -1;
+static int hf_amqp_0_10_dtx_xid_branch_id = -1;
+static int hf_amqp_0_10_struct_delivery_properties_discard_unroutable = -1;
+static int hf_amqp_0_10_struct_delivery_properties_immediate = -1;
+static int hf_amqp_0_10_struct_delivery_properties_redelivered = -1;
+static int hf_amqp_0_10_struct_delivery_properties_priority = -1;
+static int hf_amqp_0_10_struct_delivery_properties_mode = -1;
+static int hf_amqp_0_10_struct_delivery_properties_ttl = -1;
+static int hf_amqp_0_10_struct_delivery_properties_timestamp = -1;
+static int hf_amqp_0_10_struct_delivery_properties_expiration = -1;
+static int hf_amqp_0_10_struct_delivery_properties_exchange = -1;
+static int hf_amqp_0_10_struct_delivery_properties_routing_key = -1;
+static int hf_amqp_0_10_struct_delivery_properties_resume_ttl = -1;
+static int hf_amqp_0_10_struct_fragment_properties_first = -1;
+static int hf_amqp_0_10_struct_fragment_properties_last = -1;
+static int hf_amqp_0_10_struct_fragment_properties_size = -1;
+static int hf_amqp_0_10_struct_message_properties = -1;
+static int hf_amqp_0_10_struct_message_properties_content_len = -1;
+static int hf_amqp_0_10_struct_message_properties_message_id = -1;
+static int hf_amqp_0_10_struct_message_properties_correlation = -1;
+static int hf_amqp_0_10_struct_message_properties_reply_to = -1;
+static int hf_amqp_0_10_struct_message_properties_content_type = -1;
+static int hf_amqp_0_10_struct_message_properties_content_encoding = -1;
+static int hf_amqp_0_10_struct_message_properties_user_id = -1;
+static int hf_amqp_0_10_struct_message_properties_app_id = -1;
+static int hf_amqp_0_10_struct_message_properties_application_headers = -1;
+static int hf_amqp_0_10_struct_reply_to_exchange = -1;
+static int hf_amqp_0_10_struct_reply_to_routing_key = -1;
+static int hf_amqp_0_10_struct_acquired_transfers = -1;
+static int hf_amqp_0_10_struct_resume_result_offset = -1;
+static int hf_amqp_0_10_struct_exchange_query_result_durable = -1;
+static int hf_amqp_0_10_struct_exchange_query_result_not_found = -1;
+static int hf_amqp_0_10_struct_exchange_bound_result_exchange_not_found = -1;
+static int hf_amqp_0_10_struct_exchange_bound_result_queue_not_found = -1;
+static int hf_amqp_0_10_struct_exchange_bound_result_queue_not_matched = -1;
+static int hf_amqp_0_10_struct_exchange_bound_result_key_not_matched = -1;
+static int hf_amqp_0_10_struct_exchange_bound_result_args_not_matched = -1;
+static int hf_amqp_0_10_struct_queue_query_result_durable = -1;
+static int hf_amqp_0_10_struct_queue_query_result_exclusive = -1;
+static int hf_amqp_0_10_struct_queue_query_result_auto_delete = -1;
+static int hf_amqp_0_10_struct_queue_query_result_message_count = -1;
+static int hf_amqp_0_10_struct_queue_query_result_subscriber_count = -1;
+static int hf_amqp_0_10_struct_file_properties_content_type = -1;
+static int hf_amqp_0_10_struct_file_properties_content_encoding = -1;
+static int hf_amqp_0_10_struct_file_properties_headers = -1;
+static int hf_amqp_0_10_struct_file_properties_priority = -1;
+static int hf_amqp_0_10_struct_file_properties_reply_to = -1;
+static int hf_amqp_0_10_struct_file_properties_message_id = -1;
+static int hf_amqp_0_10_struct_file_properties_filename = -1;
+static int hf_amqp_0_10_struct_file_properties_timestamp = -1;
+static int hf_amqp_0_10_struct_file_properties_cluster_id = -1;
+static int hf_amqp_0_10_struct_stream_properties_content_type = -1;
+static int hf_amqp_0_10_struct_stream_properties_content_encoding = -1;
+static int hf_amqp_0_10_struct_stream_properties_headers = -1;
+static int hf_amqp_0_10_struct_stream_properties_priority = -1;
+static int hf_amqp_0_10_struct_stream_properties_timestamp = -1;
+static int hf_amqp_0_10_method_session_attach_name = -1;
+static int hf_amqp_0_10_method_session_attach_force = -1;
+static int hf_amqp_0_10_method_session_detached_code = -1;
+static int hf_amqp_0_10_method_session_timeout = -1;
+static int hf_amqp_0_10_method_session_completed_timely = -1;
+static int hf_amqp_0_10_method_session_flush_expected = -1;
+static int hf_amqp_0_10_method_session_flush_confirmed = -1;
+static int hf_amqp_0_10_method_session_flush_completed = -1;
+static int hf_amqp_0_10_method_session_command_point_id = -1;
+static int hf_amqp_0_10_method_session_command_point_offset = -1;
+static int hf_amqp_0_10_method_session_commands = -1;
+static int hf_amqp_0_10_method_session_fragments = -1;
+static int hf_amqp_0_10_method_execution_command_id = -1;
+static int hf_amqp_0_10_method_execution_exception_error = -1;
+static int hf_amqp_0_10_method_execution_field_index = -1;
+static int hf_amqp_0_10_method_execution_description = -1;
+static int hf_amqp_0_10_method_execution_error_info = -1;
+static int hf_amqp_0_10_method_message_transfer_destination = -1;
+static int hf_amqp_0_10_method_message_transfer_accept_mode = -1;
+static int hf_amqp_0_10_method_message_transfer_acquire_mode = -1;
+static int hf_amqp_0_10_method_message_accept_transfers = -1;
+static int hf_amqp_0_10_method_message_transfer_reject_code = -1;
+static int hf_amqp_0_10_method_message_reject_text = -1;
+static int hf_amqp_0_10_method_message_release_set_redelivered = -1;
+static int hf_amqp_0_10_method_message_dest = -1;
+static int hf_amqp_0_10_method_message_resume_id = -1;
+static int hf_amqp_0_10_method_message_subscribe_queue = -1;
+static int hf_amqp_0_10_method_message_subscribe_exclusive = -1;
+static int hf_amqp_0_10_method_message_subscribe_resume_ttl = -1;
+static int hf_amqp_0_10_method_message_subscribe_args = -1;
+static int hf_amqp_0_10_method_message_flow_mode = -1;
+static int hf_amqp_0_10_method_message_credit_unit = -1;
+static int hf_amqp_0_10_method_message_credit_value = -1;
+static int hf_amqp_0_10_method_dtx_start_join = -1;
+static int hf_amqp_0_10_method_dtx_start_resume = -1;
+static int hf_amqp_0_10_method_dtx_end_fail = -1;
+static int hf_amqp_0_10_method_dtx_end_suspend = -1;
+static int hf_amqp_0_10_method_dtx_commit_one_phase = -1;
+static int hf_amqp_0_10_method_dtx_set_timeout_timeout = -1;
+static int hf_amqp_0_10_method_exchange_declare_exchange = -1;
+static int hf_amqp_0_10_method_exchange_declare_type = -1;
+static int hf_amqp_0_10_method_exchange_declare_alt_exchange = -1;
+static int hf_amqp_0_10_method_exchange_declare_passive = -1;
+static int hf_amqp_0_10_method_exchange_declare_durable = -1;
+static int hf_amqp_0_10_method_exchange_declare_auto_delete = -1;
+static int hf_amqp_0_10_method_exchange_declare_arguments = -1;
+static int hf_amqp_0_10_method_exchange_delete_if_unused = -1;
+static int hf_amqp_0_10_method_exchange_bind_queue = -1;
+static int hf_amqp_0_10_method_exchange_binding_key = -1;
+static int hf_amqp_0_10_method_queue_name = -1;
+static int hf_amqp_0_10_method_queue_alt_exchange = -1;
+static int hf_amqp_0_10_method_queue_declare_passive = -1;
+static int hf_amqp_0_10_method_queue_declare_durable = -1;
+static int hf_amqp_0_10_method_queue_declare_exclusive = -1;
+static int hf_amqp_0_10_method_queue_declare_auto_delete = -1;
+static int hf_amqp_0_10_method_queue_declare_arguments = -1;
+static int hf_amqp_0_10_method_queue_delete_if_unused = -1;
+static int hf_amqp_0_10_method_queue_delete_if_empty = -1;
+static int hf_amqp_0_10_method_file_qos_prefetch_size = -1;
+static int hf_amqp_0_10_method_file_qos_prefetch_count = -1;
+static int hf_amqp_0_10_method_file_qos_global = -1;
+static int hf_amqp_0_10_method_file_consumer_tag = -1;
+static int hf_amqp_0_10_method_file_consume_no_local = -1;
+static int hf_amqp_0_10_method_file_consume_no_ack = -1;
+static int hf_amqp_0_10_method_file_consume_exclusive = -1;
+static int hf_amqp_0_10_method_file_consume_nowait = -1;
+static int hf_amqp_0_10_method_file_consume_arguments = -1;
+static int hf_amqp_0_10_method_file_identifier = -1;
+static int hf_amqp_0_10_method_file_open_content_size = -1;
+static int hf_amqp_0_10_method_file_open_ok_staged_size = -1;
+static int hf_amqp_0_10_method_file_publish_exchange = -1;
+static int hf_amqp_0_10_method_file_publish_routing_key = -1;
+static int hf_amqp_0_10_method_file_publish_mandatory = -1;
+static int hf_amqp_0_10_method_file_publish_immediate = -1;
+static int hf_amqp_0_10_method_file_return_reply_code = -1;
+static int hf_amqp_0_10_method_file_return_reply_text = -1;
+static int hf_amqp_0_10_method_file_return_exchange = -1;
+static int hf_amqp_0_10_method_file_return_routing_key = -1;
+static int hf_amqp_0_10_method_file_deliver_consumer_tag = -1;
+static int hf_amqp_0_10_method_file_deliver_delivery_tag = -1;
+static int hf_amqp_0_10_method_file_deliver_redelivered = -1;
+static int hf_amqp_0_10_method_file_deliver_exchange = -1;
+static int hf_amqp_0_10_method_file_deliver_routing_key = -1;
+static int hf_amqp_0_10_method_file_ack_delivery_tag = -1;
+static int hf_amqp_0_10_method_file_ack_multiple = -1;
+static int hf_amqp_0_10_method_file_reject_delivery_tag = -1;
+static int hf_amqp_0_10_method_file_reject_requeue = -1;
+static int hf_amqp_0_10_method_stream_qos_prefetch_size = -1;
+static int hf_amqp_0_10_method_stream_qos_prefetch_count = -1;
+static int hf_amqp_0_10_method_stream_qos_consume_rate = -1;
+static int hf_amqp_0_10_method_stream_qos_global = -1;
+static int hf_amqp_0_10_method_stream_consumer_tag = -1;
+static int hf_amqp_0_10_method_stream_consume_no_local = -1;
+static int hf_amqp_0_10_method_stream_consume_exclusive = -1;
+static int hf_amqp_0_10_method_stream_consume_nowait = -1;
+static int hf_amqp_0_10_method_stream_consume_arguments = -1;
+static int hf_amqp_0_10_method_stream_publish_exchange = -1;
+static int hf_amqp_0_10_method_stream_publish_routing_key = -1;
+static int hf_amqp_0_10_method_stream_publish_mandatory = -1;
+static int hf_amqp_0_10_method_stream_publish_immediate = -1;
+static int hf_amqp_0_10_method_stream_return_reply_code = -1;
+static int hf_amqp_0_10_method_stream_return_reply_text = -1;
+static int hf_amqp_0_10_method_stream_return_exchange = -1;
+static int hf_amqp_0_10_method_stream_return_routing_key = -1;
+static int hf_amqp_0_10_method_stream_deliver_consumer_tag = -1;
+static int hf_amqp_0_10_method_stream_deliver_delivery_tag = -1;
+static int hf_amqp_0_10_method_stream_deliver_exchange = -1;
+static int hf_amqp_0_10_method_stream_deliver_queue = -1;
 static int hf_amqp_channel = -1;
-static int hf_amqp_length = -1;
-static int hf_amqp_method_class_id = -1;
+static int hf_amqp_0_9_type = -1;
+static int hf_amqp_0_9_length = -1;
+static int hf_amqp_0_9_method_class_id = -1;
 static int hf_amqp_method_connection_method_id = -1;
 static int hf_amqp_method_channel_method_id = -1;
 static int hf_amqp_method_access_method_id = -1;
@@ -566,8 +1103,10 @@ static int hf_amqp_method_arguments = -1;
 static int hf_amqp_method_connection_start_version_major = -1;
 static int hf_amqp_method_connection_start_version_minor = -1;
 static int hf_amqp_method_connection_start_server_properties = -1;
-static int hf_amqp_method_connection_start_mechanisms = -1;
-static int hf_amqp_method_connection_start_locales = -1;
+static int hf_amqp_0_9_method_connection_start_mechanisms = -1;
+static int hf_amqp_0_10_method_connection_start_mechanisms = -1;
+static int hf_amqp_0_9_method_connection_start_locales = -1;
+static int hf_amqp_0_10_method_connection_start_locales = -1;
 static int hf_amqp_method_connection_start_ok_client_properties = -1;
 static int hf_amqp_method_connection_start_ok_mechanism = -1;
 static int hf_amqp_method_connection_start_ok_response = -1;
@@ -575,18 +1114,27 @@ static int hf_amqp_method_connection_start_ok_locale = -1;
 static int hf_amqp_method_connection_secure_challenge = -1;
 static int hf_amqp_method_connection_secure_ok_response = -1;
 static int hf_amqp_method_connection_tune_channel_max = -1;
-static int hf_amqp_method_connection_tune_frame_max = -1;
-static int hf_amqp_method_connection_tune_heartbeat = -1;
+static int hf_amqp_0_9_method_connection_tune_frame_max = -1;
+static int hf_amqp_0_10_method_connection_tune_frame_max = -1;
+static int hf_amqp_0_9_method_connection_tune_heartbeat = -1;
+static int hf_amqp_0_10_method_connection_tune_heartbeat_min = -1;
+static int hf_amqp_0_10_method_connection_tune_heartbeat_max = -1;
 static int hf_amqp_method_connection_tune_ok_channel_max = -1;
-static int hf_amqp_method_connection_tune_ok_frame_max = -1;
+static int hf_amqp_0_9_method_connection_tune_ok_frame_max = -1;
+static int hf_amqp_0_10_method_connection_tune_ok_frame_max = -1;
 static int hf_amqp_method_connection_tune_ok_heartbeat = -1;
 static int hf_amqp_method_connection_open_virtual_host = -1;
-static int hf_amqp_method_connection_open_capabilities = -1;
-static int hf_amqp_method_connection_open_insist = -1;
-static int hf_amqp_method_connection_open_ok_known_hosts = -1;
+static int hf_amqp_0_9_method_connection_open_capabilities = -1;
+static int hf_amqp_0_10_method_connection_open_capabilities = -1;
+static int hf_amqp_0_9_method_connection_open_insist = -1;
+static int hf_amqp_0_10_method_connection_open_insist = -1;
+static int hf_amqp_0_9_method_connection_open_ok_known_hosts = -1;
+static int hf_amqp_0_10_method_connection_open_ok_known_hosts = -1;
 static int hf_amqp_method_connection_redirect_host = -1;
-static int hf_amqp_method_connection_redirect_known_hosts = -1;
-static int hf_amqp_method_connection_close_reply_code = -1;
+static int hf_amqp_0_9_method_connection_redirect_known_hosts = -1;
+static int hf_amqp_0_10_method_connection_redirect_known_hosts = -1;
+static int hf_amqp_0_9_method_connection_close_reply_code = -1;
+static int hf_amqp_0_10_method_connection_close_reply_code = -1;
 static int hf_amqp_method_connection_close_reply_text = -1;
 static int hf_amqp_method_connection_close_class_id = -1;
 static int hf_amqp_method_connection_close_method_id = -1;
@@ -809,37 +1357,327 @@ static int hf_amqp_init_version_major = -1;
 static int hf_amqp_init_version_minor = -1;
 
 static gint ett_amqp = -1;
+static gint ett_header = -1;
 static gint ett_args = -1;
 static gint ett_props = -1;
 static gint ett_field_table = -1;
 static gint ett_amqp_init = -1;
+static gint ett_amqp_0_10_map = -1;
+static gint ett_amqp_0_10_array = -1;
 
 /*  Various enumerations  */
 
-static const value_string amqp_frame_types [] = {
-    {AMQP_FRAME_TYPE_METHOD,             "Method"},
-    {AMQP_FRAME_TYPE_CONTENT_HEADER,     "Content header"},
-    {AMQP_FRAME_TYPE_CONTENT_BODY,       "Content body"},
-    {AMQP_FRAME_TYPE_OOB_METHOD,         "OOB Method"},
-    {AMQP_FRAME_TYPE_OOB_CONTENT_HEADER, "OOB Content header"},
-    {AMQP_FRAME_TYPE_OOB_CONTENT_BODY,   "OOB Content body"},
-    {AMQP_FRAME_TYPE_TRACE ,             "Trace"},
-    {AMQP_FRAME_TYPE_HEARTBEAT,          "Heartbeat"},
+static const value_string amqp_0_10_frame_position [] = {
+    {0x00,  "----"},
+    {0x01,  "---e"},
+    {0x02,  "--b-"},
+    {0x03,  "--be"},
+    {0x04,  "-E--"},
+    {0x05,  "-E-e"},
+    {0x06,  "-Eb-"},
+    {0x07,  "-Ebe"},
+    {0x08,  "B---"},
+    {0x09,  "B--e"},
+    {0x0a,  "B-b-"},
+    {0x0b,  "B-be"},
+    {0x0c,  "BE--"},
+    {0x0d,  "BE-e"},
+    {0x0e,  "BEb-"},
+    {0x0f,  "BEbe"},
+    {0, NULL}
+};
+
+static const value_string amqp_0_10_frame_types [] = {
+    {0,     "Control"},
+    {1,     "Command"},
+    {2,     "Header"},
+    {3,     "Body"},
+    {0, NULL}
+};
+
+static const value_string amqp_0_10_frame_tracks [] = {
+    {0,     "Control"},
+    {1,     "Command"},
+    {0, NULL}
+};
+
+static const value_string amqp_0_10_class [] = {
+    {AMQP_0_10_CLASS_CONNECTION,  "Connection"},
+    {AMQP_0_10_CLASS_SESSION,     "Session"},
+    {AMQP_0_10_CLASS_EXECUTION,   "Execution"},
+    {AMQP_0_10_CLASS_MESSAGE,     "Message"},
+    {AMQP_0_10_CLASS_TX,          "Tx"},
+    {AMQP_0_10_CLASS_DTX,         "Dtx"},
+    {AMQP_0_10_CLASS_EXCHANGE,    "Exchange"},
+    {AMQP_0_10_CLASS_QUEUE,       "Queue"},
+    {AMQP_0_10_CLASS_FILE,        "File"},
+    {AMQP_0_10_CLASS_STREAM,      "Stream"},
+    {0, NULL}
+};
+
+static const value_string amqp_0_10_connection_methods [] = {
+    {AMQP_0_10_METHOD_CONNECTION_START,     "connection.start"},
+    {AMQP_0_10_METHOD_CONNECTION_START_OK,  "connection.start-ok"},
+    {AMQP_0_10_METHOD_CONNECTION_SECURE,    "connection.secure"},
+    {AMQP_0_10_METHOD_CONNECTION_SECURE_OK, "connection.secure-ok"},
+    {AMQP_0_10_METHOD_CONNECTION_TUNE,      "connection.tune"},
+    {AMQP_0_10_METHOD_CONNECTION_TUNE_OK,   "connection.tune-ok"},
+    {AMQP_0_10_METHOD_CONNECTION_OPEN,      "connection.open"},
+    {AMQP_0_10_METHOD_CONNECTION_OPEN_OK,   "connection.open-ok"},
+    {AMQP_0_10_METHOD_CONNECTION_REDIRECT,  "connection.redirect"},
+    {AMQP_0_10_METHOD_CONNECTION_HEARTBEAT, "connection.heartbeat"},
+    {AMQP_0_10_METHOD_CONNECTION_CLOSE,     "connection.close"},
+    {AMQP_0_10_METHOD_CONNECTION_CLOSE_OK,  "connection.close-ok"},
+    {0, NULL}
+};
+
+static const value_string amqp_0_10_session_methods [] = {
+    {AMQP_0_10_METHOD_SESSION_ATTACH,           "session.attach"},
+    {AMQP_0_10_METHOD_SESSION_ATTACHED,         "session.attached"},
+    {AMQP_0_10_METHOD_SESSION_DETACH,           "session.detach"},
+    {AMQP_0_10_METHOD_SESSION_DETACHED,         "session.detached"},
+    {AMQP_0_10_METHOD_SESSION_REQUEST_TIMEOUT,  "session.request-timeout"},
+    {AMQP_0_10_METHOD_SESSION_TIMEOUT,          "session.timeout"},
+    {AMQP_0_10_METHOD_SESSION_COMMAND_POINT,    "session.command-point"},
+    {AMQP_0_10_METHOD_SESSION_EXPECTED,         "session.expected"},
+    {AMQP_0_10_METHOD_SESSION_CONFIRMED,        "session.confirmed"},
+    {AMQP_0_10_METHOD_SESSION_COMPLETED,        "session.completed"},
+    {AMQP_0_10_METHOD_SESSION_KNOWN_COMPLETED,  "session.known-completed"},
+    {AMQP_0_10_METHOD_SESSION_FLUSH,            "session.flush"},
+    {AMQP_0_10_METHOD_SESSION_GAP,              "session.gap"},
+    {0, NULL}
+};
+
+static const value_string amqp_0_10_execution_methods [] = {
+    {AMQP_0_10_METHOD_EXECUTION_SYNC,       "execution.sync"},
+    {AMQP_0_10_METHOD_EXECUTION_RESULT,     "execution.result"},
+    {AMQP_0_10_METHOD_EXECUTION_EXCEPTION,  "execution.exception"},
+    {0, NULL}
+};
+
+static const value_string amqp_0_10_message_methods [] = {
+    {AMQP_0_10_METHOD_MESSAGE_TRANSFER,      "message.transfer"},
+    {AMQP_0_10_METHOD_MESSAGE_ACCEPT,        "message.accept"},
+    {AMQP_0_10_METHOD_MESSAGE_REJECT,        "message.reject"},
+    {AMQP_0_10_METHOD_MESSAGE_RELEASE,       "message.release"},
+    {AMQP_0_10_METHOD_MESSAGE_ACQUIRE,       "message.acquire"},
+    {AMQP_0_10_METHOD_MESSAGE_RESUME,        "message.resume"},
+    {AMQP_0_10_METHOD_MESSAGE_SUBSCRIBE,     "message.subscribe"},
+    {AMQP_0_10_METHOD_MESSAGE_CANCEL,        "message.cancel"},
+    {AMQP_0_10_METHOD_MESSAGE_SET_FLOW_MODE, "message.set-flow-mode"},
+    {AMQP_0_10_METHOD_MESSAGE_FLOW,          "message.flow"},
+    {AMQP_0_10_METHOD_MESSAGE_FLUSH,         "message.flush"},
+    {AMQP_0_10_METHOD_MESSAGE_STOP,          "message.stop"},
+    {0, NULL}
+};
+
+static const value_string amqp_0_10_tx_methods [] = {
+    {AMQP_0_10_METHOD_TX_SELECT,    "tx.select"},
+    {AMQP_0_10_METHOD_TX_COMMIT,    "tx.commit"},
+    {AMQP_0_10_METHOD_TX_ROLLBACK,  "tx.rollback"},
+    {0, NULL}
+};
+
+static const value_string amqp_0_10_dtx_methods [] = {
+    {AMQP_0_10_METHOD_DTX_SELECT,       "dtx.select"},
+    {AMQP_0_10_METHOD_DTX_START,        "dtx.start"},
+    {AMQP_0_10_METHOD_DTX_END,          "dtx.end"},
+    {AMQP_0_10_METHOD_DTX_COMMIT,       "dtx.commit"},
+    {AMQP_0_10_METHOD_DTX_FORGET,       "dtx.forget"},
+    {AMQP_0_10_METHOD_DTX_GET_TIMEOUT,  "dtx.get-timeout"},
+    {AMQP_0_10_METHOD_DTX_PREPARE,      "dtx.prepare"},
+    {AMQP_0_10_METHOD_DTX_RECOVER,      "dtx.recover"},
+    {AMQP_0_10_METHOD_DTX_ROLLBACK,     "dtx.rollback"},
+    {AMQP_0_10_METHOD_DTX_SET_TIMEOUT,  "dtx.set-timeout"},
+    {0, NULL}
+};
+
+static const value_string amqp_0_10_exchange_methods [] = {
+    {AMQP_0_10_METHOD_EXCHANGE_DECLARE,  "exchange.declare"},
+    {AMQP_0_10_METHOD_EXCHANGE_DELETE,   "exchange.delete"},
+    {AMQP_0_10_METHOD_EXCHANGE_QUERY,    "exchange.query"},
+    {AMQP_0_10_METHOD_EXCHANGE_BIND,     "exchange.bind"},
+    {AMQP_0_10_METHOD_EXCHANGE_UNBIND,   "exchange.unbind"},
+    {AMQP_0_10_METHOD_EXCHANGE_BOUND,    "exchange.bound"},
+    {0, NULL}
+};
+
+static const value_string amqp_0_10_queue_methods [] = {
+    {AMQP_0_10_METHOD_QUEUE_DECLARE,  "queue.declare"},
+    {AMQP_0_10_METHOD_QUEUE_DELETE,   "queue.delete"},
+    {AMQP_0_10_METHOD_QUEUE_PURGE,    "queue.purge"},
+    {AMQP_0_10_METHOD_QUEUE_QUERY,    "queue.query"},
+    {0, NULL}
+};
+
+static const value_string amqp_0_10_file_methods [] = {
+    {AMQP_0_10_METHOD_FILE_QOS,         "file.qos"},
+    {AMQP_0_10_METHOD_FILE_QOS_OK,      "file.qos-ok"},
+    {AMQP_0_10_METHOD_FILE_CONSUME,     "file.consume"},
+    {AMQP_0_10_METHOD_FILE_CONSUME_OK,  "file.consume-ok"},
+    {AMQP_0_10_METHOD_FILE_CANCEL,      "file.cancel"},
+    {AMQP_0_10_METHOD_FILE_OPEN,        "file.open"},
+    {AMQP_0_10_METHOD_FILE_OPEN_OK,     "file.open-ok"},
+    {AMQP_0_10_METHOD_FILE_STAGE,       "file.stage"},
+    {AMQP_0_10_METHOD_FILE_PUBLISH,     "file.publish"},
+    {AMQP_0_10_METHOD_FILE_RETURN,      "file.return"},
+    {AMQP_0_10_METHOD_FILE_DELIVER,     "file.deliver"},
+    {AMQP_0_10_METHOD_FILE_ACK,         "file.ack"},
+    {AMQP_0_10_METHOD_FILE_REJECT,      "file.reject"},
+    {0, NULL}
+};
+
+static const value_string amqp_0_10_stream_methods [] = {
+    {AMQP_0_10_METHOD_STREAM_QOS,         "stream.qos"},
+    {AMQP_0_10_METHOD_STREAM_QOS_OK,      "stream.qos-ok"},
+    {AMQP_0_10_METHOD_STREAM_CONSUME,     "stream.consume"},
+    {AMQP_0_10_METHOD_STREAM_CONSUME_OK,  "stream.consume-ok"},
+    {AMQP_0_10_METHOD_STREAM_CANCEL,      "stream.cancel"},
+    {AMQP_0_10_METHOD_STREAM_PUBLISH,     "stream.publish"},
+    {AMQP_0_10_METHOD_STREAM_RETURN,      "stream.return"},
+    {AMQP_0_10_METHOD_STREAM_DELIVER,     "stream.deliver"},
+    {0, NULL}
+};
+
+static const value_string amqp_0_10_method_connection_close_reply_codes [] = {
+    {200,   "normal"},
+    {320,   "connection-forced"},
+    {402,   "invalid-path"},
+    {501,   "framing-error"},
+    {0, NULL}
+};
+
+static const true_false_string amqp_0_10_session_header_sync = {
+    "notification requested", "notification NOT requested"
+};
+
+static const value_string amqp_0_10_method_session_detached_codes [] = {
+    {0,    "normal"},
+    {1,    "session-busy"},
+    {2,    "transport-busy"},
+    {3,    "not-attached"},
+    {4,    "unknown-ids"},
+    {0, NULL}
+};
+
+static const value_string amqp_0_10_method_execution_exception_errors [] = {
+    {403,   "unauthorized-access"},
+    {404,   "not-found"},
+    {405,   "resource-locked"},
+    {406,   "precondition-failed"},
+    {408,   "resource-deleted"},
+    {409,   "illegal-state"},
+    {503,   "command-invalid"},
+    {506,   "resource-limit-exceeded"},
+    {530,   "not-allowed"},
+    {531,   "illegal-argument"},
+    {540,   "not-implemented"},
+    {541,   "internal-error"},
+    {542,   "invalid-argument"},
+    {0, NULL}
+};
+
+static const value_string amqp_0_10_message_transfer_accept_modes [] = {
+    {0,    "explicit"},
+    {1,    "none"},
+    {0, NULL}
+};
+
+static const value_string amqp_0_10_message_transfer_acquire_modes [] = {
+    {0,    "pre-acquired"},
+    {1,    "not-acquired"},
+    {0, NULL}
+};
+
+static const value_string amqp_0_10_message_transfer_reject_codes [] = {
+    {0,    "unspecified"},
+    {1,    "unroutable"},
+    {2,    "immediate"},
+    {0, NULL}
+};
+
+static const value_string amqp_0_10_message_flow_modes [] = {
+    {0,    "credit"},
+    {1,    "window"},
+    {0, NULL}
+};
+
+static const value_string amqp_0_10_message_credit_units [] = {
+    {0,    "message"},
+    {1,    "byte"},
+    {0, NULL}
+};
+
+static const value_string amqp_0_10_xa_status [] = {
+    {0,    "Normal execution completion. (xa-ok)"},
+    {1,    "The rollback was caused for an unspecified reason. (xa-rbrollback)"},
+    {2,    "A transaction branch took too long. (xa-rbtimeout)"},
+    {3,    "The transaction branch may have been heuristically completed. (xa-heurhaz)"},
+    {4,    "The transaction branch has been heuristically committed. (xa-heurcom)"},
+    {5,    "The transaction branch has been heuristically rolled back. (xa-heurrb)"},
+    {6,    "The transaction branch has been heuristically committed and rolled back. (xa-heurmix)"},
+    {7,    "The transaction branch was read-only and has been committed. (xa-rdonly)"},
+    {0, NULL}
+};
+
+static const value_string amqp_0_10_struct_delivery_properties_priorities [] = {
+    {0,    "lowest"},
+    {1,    "lower"},
+    {2,    "low"},
+    {3,    "below-average"},
+    {4,    "medium"},
+    {5,    "above-average"},
+    {6,    "high"},
+    {7,    "higher"},
+    {8,    "very-high"},
+    {9,    "highest"},
+    {0, NULL}
+};
+
+static const value_string amqp_0_10_struct_delivery_properties_modes [] = {
+    {1,    "non-persistent"},
+    {2,    "persistent"},
+    {0, NULL}
+};
+
+static const value_string amqp_0_10_file_return_codes [] = {
+    {311,    "content-too-large"},
+    {312,    "no-route"},
+    {313,    "no-consumers"},
+    {0, NULL}
+};
+
+static const value_string amqp_0_10_stream_return_codes [] = {
+    {311,    "content-too-large"},
+    {312,    "no-route"},
+    {313,    "no-consumers"},
+    {0, NULL}
+};
+
+static const value_string amqp_0_9_frame_types [] = {
+    {AMQP_0_9_FRAME_TYPE_METHOD,             "Method"},
+    {AMQP_0_9_FRAME_TYPE_CONTENT_HEADER,     "Content header"},
+    {AMQP_0_9_FRAME_TYPE_CONTENT_BODY,       "Content body"},
+    {AMQP_0_9_FRAME_TYPE_OOB_METHOD,         "OOB Method"},
+    {AMQP_0_9_FRAME_TYPE_OOB_CONTENT_HEADER, "OOB Content header"},
+    {AMQP_0_9_FRAME_TYPE_OOB_CONTENT_BODY,   "OOB Content body"},
+    {AMQP_0_9_FRAME_TYPE_TRACE ,             "Trace"},
+    {AMQP_0_9_FRAME_TYPE_HEARTBEAT,          "Heartbeat"},
     {0, NULL}
 };
 
-static const value_string amqp_method_classes [] = {
-    {10, "Connection"},
-    {20, "Channel"},
-    {30, "Access"},
-    {40, "Exchange"},
-    {50, "Queue"},
-    {60, "Basic"},
-    {70, "File"},
-    {80, "Stream"},
-    {90, "Tx"},
-    {100, "Dtx"},
-    {110, "Tunnel"},
+static const value_string amqp_0_9_method_classes [] = {
+    {AMQP_0_9_CLASS_CONNECTION, "Connection"},
+    {AMQP_0_9_CLASS_CHANNEL,    "Channel"},
+    {AMQP_0_9_CLASS_ACCESS,     "Access"},
+    {AMQP_0_9_CLASS_EXCHANGE,   "Exchange"},
+    {AMQP_0_9_CLASS_QUEUE,      "Queue"},
+    {AMQP_0_9_CLASS_BASIC,      "Basic"},
+    {AMQP_0_9_CLASS_FILE,       "File"},
+    {AMQP_0_9_CLASS_STREAM,     "Stream"},
+    {AMQP_0_9_CLASS_TX,         "Tx"},
+    {AMQP_0_9_CLASS_DTX,        "Dtx"},
+    {AMQP_0_9_CLASS_TUNNEL,     "Tunnel"},
     {0, NULL}
 };
 
@@ -973,22 +1811,140 @@ static const value_string amqp_method_tunnel_methods [] = {
     {0, NULL}
 };
 
+/*  AMQP 0-10 Type Info  */
+static struct amqp_typeinfo amqp_0_10_fixed_types[] = {
+    { 0x00, "bin8",    format_amqp_0_10_bin,     1 },
+    { 0x01, "int8",    format_amqp_0_10_int,     1 },
+    { 0x02, "uint8",   format_amqp_0_10_uint,    1 },
+    { 0x04, "char",    format_amqp_0_10_char,    1 },
+    { 0x08, "boolean", format_amqp_0_10_boolean, 1 },
+    { 0x10, "bin16",   format_amqp_0_10_bin,     2 },
+    { 0x11, "int16",   format_amqp_0_10_int,     2 },
+    { 0x12, "uint16",  format_amqp_0_10_uint,    2 },
+    { 0x20, "bin32",   format_amqp_0_10_bin,     4 },
+    { 0x21, "int32",   format_amqp_0_10_int,     4 },
+    { 0x22, "uint32",  format_amqp_0_10_uint,    4 },
+    { 0xff, "end", 0, 0 }
+};
+
+static struct amqp_typeinfo amqp_0_10_var_types[] = {
+    { 0x80, "vbin8",   format_amqp_0_10_vbin, 1 },
+    { 0x95, "str16",   format_amqp_0_10_str, 2 },
+    { 0xff, "end", 0, 0 }
+};
+
+
 /*  Main dissection routine  */
 
 static void
 dissect_amqp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
 {
+    conversation_t *conv;
+    amqp_conv *conn;
+    guint fixed_length;
+    guint (*length_getter)(packet_info *, tvbuff_t *, int);
+    dissector_t dissector;
+
+    /*  Minimal frame size is 8 bytes - smaller frames are malformed  */
+    if (tvb_reported_length (tvb) < 8) {
+        expert_add_info_format(pinfo, NULL, PI_MALFORMED, PI_ERROR,
+                               "Require frame at least 8 bytes long");
+        return;
+    }
+
+    /* Find (or build) conversation to remember the protocol version */
+    conv = find_or_create_conversation(pinfo);
+    conn = conversation_get_proto_data(conv, proto_amqp);
+    if (conn == NULL) {
+        conn = se_alloc0(sizeof(amqp_conv));
+        conversation_add_proto_data(conv, proto_amqp, conn);
+    }
+    check_amqp_version(tvb, conn);
+    switch(conn->version) {
+    case AMQP_V0_9:
+        length_getter = &get_amqp_0_9_message_len;
+        dissector = dissect_amqp_0_9_frame;
+        fixed_length = 7;
+        break;
+    case AMQP_V0_10:
+        length_getter = &get_amqp_0_10_message_len;
+        dissector = dissect_amqp_0_10_frame;
+        fixed_length = 8;
+        break;
+    default:
+        if (tree != 0 && check_col(pinfo->cinfo, COL_INFO)) {
+            col_append_str(pinfo->cinfo, COL_INFO, "AMQP (unknown version)");
+            col_set_fence(pinfo->cinfo, COL_INFO);
+        }
+        return;
+    }
+    tcp_dissect_pdus(tvb, pinfo, tree, TRUE, fixed_length,
+                     length_getter, dissector);
+}
+
+static void
+check_amqp_version(tvbuff_t *tvb, amqp_conv *conn)
+{
+    guint8 proto_major;
+    guint8 proto_minor;
+    guint32 f0_9_length;
+
+    /*
+     * If we already know and the version and this isn't a protocol header,
+     * return ok. 0-10 and up can run protocol headers in each direction,
+     * so if it looks like a protocol header, snag the version even if one
+     * is already recorded. Multi-protocol brokers can negotiate down.
+     */
+    if (conn->version != 0 && tvb_get_guint8(tvb, 0) != 'A')
+        return;
+
+    if (tvb_get_guint8(tvb, 0) == 'A' &&
+        tvb_get_guint8(tvb, 1) == 'M' &&
+        tvb_get_guint8(tvb, 2) == 'Q' &&
+        tvb_get_guint8(tvb, 3) == 'P') {
+
+        proto_major = tvb_get_guint8(tvb, 6);
+        proto_minor = tvb_get_guint8(tvb, 7);
+        if (proto_major == 0) {
+            if (proto_minor == 9)
+                conn->version = AMQP_V0_9;
+            else if (proto_minor == 10)
+                conn->version = AMQP_V0_10;
+        }
+        return;
+    }
+
     /*
-     * XXX - the minimum amount of data needed to get the message
-     * length differs from protocol version to protocol version.
-     * It's 7 bytes for version 0-9.
+     * It's not a protocol header and the AMQP version isn't known. Try to
+     * deduce it from the content. First indicator is the frame length. 0-9
+     * has a 32-bit length in octets 3-7. If the frame length is the same
+     * as the PDU length and there's a frame end where it should be, this
+     * is 0-9. Else assume 0-10.
      */
-    tcp_dissect_pdus(tvb, pinfo, tree, TRUE, 7,
-        get_amqp_message_len, dissect_amqp_frame);
+    f0_9_length = tvb_get_ntohl(tvb, 3) + 7 + 1; /* Add header and end */
+    if (f0_9_length == tvb_reported_length(tvb) &&
+        tvb_get_guint8(tvb, f0_9_length - 1) == 0xCE)
+        conn->version = AMQP_V0_9;
+    else
+        conn->version = AMQP_V0_10;
+    return;
+}
+
+static guint
+get_amqp_0_10_message_len(packet_info *pinfo _U_, tvbuff_t *tvb, int offset)
+{
+    /*  Heuristic - protocol initialisation frame starts with 'AMQP'  */
+    if (tvb_get_guint8(tvb, offset + 0) == 'A' &&
+        tvb_get_guint8(tvb, offset + 1) == 'M' &&
+        tvb_get_guint8(tvb, offset + 2) == 'Q' &&
+        tvb_get_guint8(tvb, offset + 3) == 'P')
+        return 8;
+
+    return (guint) tvb_get_ntohs(tvb, offset + 2);
 }
 
 static guint
-get_amqp_message_len(packet_info *pinfo _U_, tvbuff_t *tvb, int offset)
+get_amqp_0_9_message_len(packet_info *pinfo _U_, tvbuff_t *tvb, int offset)
 {
     guint32 length;
 
@@ -1012,18 +1968,19 @@ get_amqp_message_len(packet_info *pinfo _U_, tvbuff_t *tvb, int offset)
     return length + 8;
 }
 
-/*  Dissection routine for AMQP field tables  */
+/*  Dissection routine for AMQP 0-9 field tables  */
 
 static void
-dissect_amqp_field_table(tvbuff_t *tvb, int offset, guint length, proto_item *item)
+dissect_amqp_0_9_field_table(tvbuff_t *tvb, packet_info *pinfo, int offset, guint length, proto_item *item)
 {
-    proto_item *field_table_tree;
+    proto_tree *field_table_tree;
     guint namelen, vallen;
     guint8 type;
     const char *name;
     const char *typename;
     const char *value;
     int field_start;
+    proto_item *ti;
 
     field_table_tree = proto_item_add_subtree(item, ett_amqp);
 
@@ -1080,61 +2037,3735 @@ dissect_amqp_field_table(tvbuff_t *tvb, int offset, guint length, proto_item *it
             offset += 8;
             length -= 8;
             break;
-        case 'F':
-            /*  TODO: make it recursive here  */
-            typename =  "field table";
-            if (length < 4)
-                goto too_short;
-            vallen = tvb_get_ntohl(tvb, offset);
-            offset += 4;
-            length -= 4;
-            value = "...";
-            if (length < vallen)
-                goto too_short;
-            offset += vallen;
-            length -= vallen;
+        case 'F':
+            /*  TODO: make it recursive here  */
+            typename =  "field table";
+            if (length < 4)
+                goto too_short;
+            vallen = tvb_get_ntohl(tvb, offset);
+            offset += 4;
+            length -= 4;
+            value = "...";
+            if (length < vallen)
+                goto too_short;
+            offset += vallen;
+            length -= vallen;
+            break;
+        case 'V':
+            typename = "void";
+            value = "";
+            break;
+        default:
+            typename = "";
+            value = NULL;
+            break;
+        }
+
+        if (value != NULL)
+            proto_tree_add_none_format(field_table_tree, hf_amqp_field, tvb,
+                                       field_start, offset - field_start,
+                                       "%s (%s): %s", name, typename,
+                                       value);
+        else
+            proto_tree_add_none_format(field_table_tree, hf_amqp_field, tvb,
+                                       field_start, offset - field_start,
+                                       "%s: unknown type %x (%c)",
+                                       name, type, type);
+    }
+    return;
+
+too_short:
+    ti = proto_tree_add_text(field_table_tree, tvb, field_start,
+                        offset - field_start,
+                        "Field is cut off by the end of the field table");
+    expert_add_info_format(pinfo, ti,
+                           PI_PROTOCOL, PI_ERROR,
+                           "Field is cut off by the end of the field table");
+    return;
+}
+
+/*  Dissection routine for AMQP 0-10 maps  */
+
+static void
+dissect_amqp_0_10_map(tvbuff_t *tvb,
+                      int offset,          /* Start of map in tvb */
+                      int bound,           /* How far into tvb we can go */
+                      int length,          /* Length of map */
+                      proto_item *item)
+{
+    proto_item *map_tree;
+    guint namelen, size;
+    guint8 type;
+    const char *name;
+    const char *typename;
+    const char *value;
+    gint field_start, field_length;
+    guint32 field_count;
+    type_formatter formatter;
+
+    field_length = 0;
+    map_tree = proto_item_add_subtree(item, ett_amqp_0_10_map);
+    field_count = tvb_get_ntohl(tvb, offset);
+    AMQP_INCREMENT(offset, 4, bound);
+    length -= 4;
+    proto_item_append_text(item, " (%d entries)", field_count);
+    while (field_count > 0 && length > 0) {
+        field_start = offset;
+        namelen = tvb_get_guint8(tvb, offset);
+        AMQP_INCREMENT(offset, 1, bound);
+        length -= 1;
+        name = (char*) tvb_get_ephemeral_string(tvb, offset, namelen);
+        AMQP_INCREMENT(offset, namelen, bound);
+        length -= namelen;
+        type = tvb_get_guint8(tvb, offset);
+        AMQP_INCREMENT(offset, 1, bound);
+        length -= 1;
+        if (get_amqp_0_10_type_formatter(type, &typename, &formatter, &size)) {
+            field_length = formatter(tvb, offset, bound, size, &value);
+            proto_tree_add_none_format(map_tree,
+                                       hf_amqp_field,
+                                       tvb,
+                                       field_start,
+                                       field_length,
+                                       "%s (%s): %s",
+                                       name, typename, value);
+            AMQP_INCREMENT(offset, field_length, bound);
+            length -= field_length;
+        }
+        else {
+            switch (type) {
+            case AMQP_0_10_TYPE_MAP:
+            case AMQP_0_10_TYPE_LIST:
+            case AMQP_0_10_TYPE_ARRAY:
+                field_length = tvb_get_ntohl(tvb, offset);
+                proto_tree_add_none_format(map_tree, hf_amqp_field,
+                                           tvb, field_start, field_length,
+                                           "%s (composite): %d bytes",
+                                           name, field_length);
+                AMQP_INCREMENT(offset, field_length, bound);
+                length -= field_length;
+                break;
+
+            default:
+                typename = "unimplemented";
+                if ((type & 0x80) == 0) {
+                    field_length = 2 ^ ((type & 0x70) >> 4);
+                }
+                else if ((type & 0xd0) == 0xd0) {
+                    field_length = 9;
+                }
+                else if ((type & 0xc0) == 0xc0) {
+                    field_length = 5;
+                }
+                else if ((type & 0x80) == 0x80) {
+                    switch (2 ^ ((type & 0x70) >> 4)) {
+                    case 1:
+                        field_length += tvb_get_guint8(tvb, offset);
+                        break;
+                    case 2:
+                        field_length += tvb_get_ntohs(tvb, offset);
+                        break;
+                    case 4:
+                        field_length += tvb_get_ntohl(tvb, offset);
+                        break;
+                    default:
+                        field_length = 1;    /* Reserved... skip 1 */
+                        typename = "reserved";
+                        break;
+                    }
+                }
+                else {
+                    field_length = 1;    /* Reserved... skip 1 */
+                    typename = "reserved";
+                }
+                proto_tree_add_none_format(map_tree, hf_amqp_field,
+                                           tvb, field_start, field_length,
+                                           "%s (%s): %d bytes",
+                                           name, typename, field_length);
+                AMQP_INCREMENT(offset, field_length, bound);
+                length -= field_length;
+            }
+        }
+
+        field_count -= 1;
+    }
+}
+
+/*  Dissection routine for AMQP 0-10 maps  */
+
+static void
+dissect_amqp_0_10_array(tvbuff_t *tvb,
+                        int offset,          /* Start of array in tvb */
+                        int bound,           /* How far into tvb we can go */
+                        int length,          /* Length of array */
+                        proto_item *item)
+{
+    proto_item *array_tree;
+    proto_item *sub;
+    guint8 type;
+    guint16 len16;
+    const char *typename;
+    const char *value;
+    int element_start;
+    int externally_formatted;
+    guint32 element_count;
+    guint32 struct_length;
+
+    array_tree = 0;
+    type = tvb_get_guint8(tvb, offset);
+    AMQP_INCREMENT(offset, 1, bound);
+    length -= 1;
+    element_count = tvb_get_ntohl(tvb, offset);
+    AMQP_INCREMENT(offset, 4, bound);
+    length -= 4;
+    proto_item_append_text(item, " (%d elements)", element_count);
+    if (element_count > 1)
+        array_tree = proto_item_add_subtree(item, ett_amqp_0_10_array);
+    while (element_count > 0 && length > 0) {
+        element_start = offset;
+        externally_formatted = 0;
+        switch (type) {
+        case AMQP_0_10_TYPE_STR16:
+            typename = "str16";
+            len16 = tvb_get_ntohs(tvb, offset);
+            AMQP_INCREMENT(offset, 2, bound);
+            length -= 2;
+            value = (char*) tvb_get_ephemeral_string(tvb, offset, len16);
+            AMQP_INCREMENT(offset, len16, bound);
+            length -= len16;
+            break;
+
+        case AMQP_0_10_TYPE_STRUCT32:
+            typename = "struct32";
+            externally_formatted = 1;
+            struct_length = tvb_get_ntohl(tvb, offset);
+            AMQP_INCREMENT(offset, 4, bound);
+            length -= 4;
+            /*
+             * Always add a tree for structs - the struct formatter will
+             * change the item text to the struct type then add elements to it.
+             */
+            if (array_tree == 0)
+                array_tree = proto_item_add_subtree(item, ett_amqp_0_10_array);
+            sub = proto_tree_add_none_format(array_tree, hf_amqp_field, tvb,
+                                             element_start,
+                                             offset - element_start,
+                                             "(%s): ", typename);
+            dissect_amqp_0_10_struct32(tvb, sub, offset, struct_length);
+            AMQP_INCREMENT(offset, struct_length, bound);
+            length -= struct_length;
+            break;
+
+        default:
+            typename = 0;
+            value = "";
+        }
+
+        element_count -= 1;
+        if (externally_formatted)
+            continue;
+
+        if (array_tree != 0) {
+            if (typename != 0)
+                proto_tree_add_none_format(array_tree, hf_amqp_field, tvb,
+                                           element_start,
+                                           offset - element_start,
+                                           "(%s): %s",
+                                           typename,
+                                           value);
+            else
+                proto_tree_add_none_format(array_tree, hf_amqp_field, tvb,
+                                           element_start,
+                                           offset - element_start,
+                                           "(unknown type %d)",
+                                           type);
+        }
+        else {
+            if (typename != 0)
+                proto_item_append_text(item, ": (%s): %s", typename, value);
+            else
+                proto_item_append_text(item, ": (unknown type %d)", type);
+        }
+    }
+}
+
+static void
+dissect_amqp_0_10_xid (tvbuff_t *tvb,
+                       int offset,
+                       guint16 xid_length,
+                       proto_item *ti)
+{
+    proto_item *xid_tree;
+    guint8 flag1, flag2;
+    guint8 len8;
+    int max_length;
+
+    max_length = offset + xid_length;
+    xid_tree = proto_item_add_subtree(ti, ett_args);
+    flag1 = tvb_get_guint8(tvb, offset);
+    flag2 = tvb_get_guint8(tvb, offset+1);
+    proto_tree_add_item(xid_tree, hf_amqp_0_10_argument_packing_flags,
+                        tvb, offset, 2, FALSE);
+    AMQP_INCREMENT(offset, 2, max_length);
+    if (flag1 & 0x01) {
+        /*  format (uint32) */
+        proto_tree_add_item(xid_tree,
+                            hf_amqp_0_10_dtx_xid_format,
+                            tvb, offset, 4, FALSE);
+        AMQP_INCREMENT(offset, 4, max_length);
+    }
+    if (flag1 & 0x02) {
+        /* global-id (vbin8) */
+        len8 = tvb_get_guint8(tvb, offset);
+        if ((offset + 1 + len8) > max_length)
+            THROW(ReportedBoundsError);
+        proto_tree_add_item(xid_tree,
+                            hf_amqp_0_10_dtx_xid_global_id,
+                            tvb, offset + 1, len8, FALSE);
+        AMQP_INCREMENT(offset, (1 + len8), max_length);            
+    }
+    if (flag1 & 0x04) {
+        /* branch-id (vbin8) */
+        len8 = tvb_get_guint8(tvb, offset);
+        if ((offset + 1 + len8) > max_length)
+            THROW(ReportedBoundsError);
+        proto_tree_add_item(xid_tree,
+                            hf_amqp_0_10_dtx_xid_branch_id,
+                            tvb, offset + 1, len8, FALSE);
+        AMQP_INCREMENT(offset, (1 + len8), max_length);            
+    }
+}
+
+/*  Dissection routine for AMQP 0-10 frames  */
+
+static void
+dissect_amqp_0_10_connection(tvbuff_t *tvb,
+                             packet_info *pinfo,
+                             proto_tree *tree,
+                             int offset, guint16 length)
+{
+    proto_item *args_tree;
+    proto_item *ti;
+    proto_item *flags_item;
+    guint8 method;
+    guint8 flag1, flag2;           /* args struct packing flags */
+    guint32 arg_length;
+    int flags_offset;
+    const gchar* method_name;
+
+    method = tvb_get_guint8(tvb, offset+1);
+    method_name = match_strval(method, amqp_0_10_connection_methods);
+    if (method_name == NULL)
+        method_name = "<invalid connection method>";
+    if (check_col(pinfo->cinfo, COL_INFO)) {
+        col_append_str(pinfo->cinfo, COL_INFO, method_name);
+        col_append_str(pinfo->cinfo, COL_INFO, " ");
+        col_set_fence(pinfo->cinfo, COL_INFO);
+    }
+
+    proto_tree_add_item(tree, hf_amqp_0_10_connection_method,
+                        tvb, offset+1, 1, FALSE);              
+    ti = proto_tree_add_item(tree, hf_amqp_method_arguments,
+                             tvb, offset + 2, length - 2, FALSE);
+    args_tree = proto_item_add_subtree(ti, ett_args);
+    AMQP_INCREMENT(offset, 2, length);
+    /*
+     * The flag bits are a simple bit string, not a net-byte-order
+     * field. tvb_get_bits16() doesn't know how to do little-endian
+     * at this time, so just pick out two bytes.
+     */
+    flags_offset = offset;
+    flag1 = tvb_get_guint8(tvb, offset);
+    flag2 = tvb_get_guint8(tvb, offset+1);
+    flags_item = proto_tree_add_item(args_tree,
+                                     hf_amqp_0_10_argument_packing_flags,
+                                     tvb, offset, 2, FALSE);
+    AMQP_INCREMENT(offset, 2, length);    
+    switch (method) {
+    case AMQP_0_10_METHOD_CONNECTION_START:
+        if ((flag1 & ~0x07) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {
+            /*  server-properties (map)  */
+            arg_length = tvb_get_ntohl(tvb, offset);
+            AMQP_INCREMENT(offset, 4, length);
+            ti = proto_tree_add_item(args_tree,
+                                     hf_amqp_method_connection_start_server_properties,
+                                     tvb,
+                                     offset,
+                                     arg_length, FALSE);
+            dissect_amqp_0_10_map (tvb,
+                                   offset,
+                                   offset + arg_length,
+                                   arg_length,
+                                   ti);
+            AMQP_INCREMENT(offset, arg_length, length);
+        }
+        if (flag1 & 0x02) {
+            /*  mechanisms (str16-array)  */
+            arg_length = tvb_get_ntohl(tvb, offset);
+            AMQP_INCREMENT(offset, 4, length);
+            ti = proto_tree_add_item(args_tree,
+                                     hf_amqp_0_10_method_connection_start_mechanisms,
+                                     tvb,
+                                     offset,
+                                     arg_length, FALSE);
+            dissect_amqp_0_10_array (tvb,
+                                     offset,
+                                     offset + arg_length,
+                                     arg_length,
+                                     ti);
+            AMQP_INCREMENT(offset, arg_length, length);
+        }
+        if (flag1 & 0x04) {
+            /*  locales (str16-array)  */
+            arg_length = tvb_get_ntohl(tvb, offset);
+            AMQP_INCREMENT(offset, 4, length);
+            ti = proto_tree_add_item(args_tree,
+                                     hf_amqp_0_10_method_connection_start_locales,
+                                     tvb,
+                                     offset,
+                                     arg_length, FALSE);
+            dissect_amqp_0_10_array (tvb,
+                                     offset,
+                                     offset + arg_length,
+                                     arg_length,
+                                     ti);
+            AMQP_INCREMENT(offset, arg_length, length);
+        }
+        break;
+
+    case AMQP_0_10_METHOD_CONNECTION_START_OK:
+        if ((flag1 & ~0x0f) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {
+            /*  client-properties (map)  */
+            arg_length = tvb_get_ntohl(tvb, offset);
+            AMQP_INCREMENT(offset, 4, length);
+            ti = proto_tree_add_item(args_tree,
+                                     hf_amqp_method_connection_start_ok_client_properties,
+                                     tvb,
+                                     offset,
+                                     arg_length, FALSE);
+            dissect_amqp_0_10_map (tvb,
+                                   offset,
+                                   offset + arg_length,
+                                   arg_length,
+                                   ti);
+            AMQP_INCREMENT(offset, arg_length, length);
+        }
+        if (flag1 & 0x02) {
+            /*  mechanism (str8)  */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_method_connection_start_ok_mechanism,
+                                tvb, offset + 1, tvb_get_guint8(tvb, offset),
+                                FALSE);
+            AMQP_INCREMENT(offset, 1 + tvb_get_guint8(tvb, offset), length);
+        }
+        if (flag1 & 0x04) {
+            /*  response (vbin32)  */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_method_connection_start_ok_response,
+                                tvb, offset + 4, tvb_get_ntohl(tvb, offset),
+                                FALSE);
+            AMQP_INCREMENT(offset, 4 + tvb_get_ntohl(tvb, offset), length);
+        }
+        if (flag1 & 0x08) {
+            /*  locale (str8)  */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_method_connection_start_ok_locale,
+                                tvb, offset + 1, tvb_get_guint8(tvb, offset),
+                                FALSE);
+            AMQP_INCREMENT(offset, 1 + tvb_get_guint8(tvb, offset), length);
+        }
+        break;
+
+    case AMQP_0_10_METHOD_CONNECTION_SECURE:
+        if ((flag1 & ~0x01) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {
+            /*  challenge (vbin32)  */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_method_connection_secure_challenge,
+                                tvb, offset + 4, tvb_get_ntohl(tvb, offset),
+                                FALSE);
+            AMQP_INCREMENT(offset, 4 + tvb_get_ntohl(tvb, offset), length);
+        }
+        break;
+
+    case AMQP_0_10_METHOD_CONNECTION_SECURE_OK:
+        if ((flag1 & ~0x01) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {
+            /*  response (vbin32)  */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_method_connection_secure_ok_response,
+                                tvb, offset + 4, tvb_get_ntohl(tvb, offset),
+                                FALSE);
+            AMQP_INCREMENT(offset, 4 + tvb_get_ntohl(tvb, offset), length);
+        }
+        break;
+
+    case AMQP_0_10_METHOD_CONNECTION_TUNE:
+        if ((flag1 & ~0x0f) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {
+            /*  channel-max (uint16)  */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_method_connection_tune_channel_max,
+                                tvb, offset, 2, FALSE);
+            AMQP_INCREMENT(offset, 2, length);
+        }
+        if (flag1 & 0x02) {
+            /*  max-frame-size (uint16)  */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_connection_tune_frame_max,
+                                tvb, offset, 2, FALSE);
+            AMQP_INCREMENT(offset, 2, length);
+        }
+        if (flag1 & 0x04) {
+            /*  heartbeat-min (uint16)  */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_connection_tune_heartbeat_min,
+                                tvb, offset, 2, FALSE);
+            AMQP_INCREMENT(offset, 2, length);
+        }
+        if (flag1 & 0x08) {
+            /*  heartbeat-max (uint16)  */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_connection_tune_heartbeat_max,
+                                tvb, offset, 2, FALSE);
+            AMQP_INCREMENT(offset, 2, length);
+        }
+        break;
+
+    case AMQP_0_10_METHOD_CONNECTION_TUNE_OK:
+        if ((flag1 & ~0x07) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {
+            /*  channel-max (uint16)  */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_method_connection_tune_ok_channel_max,
+                                tvb, offset, 2, FALSE);
+            AMQP_INCREMENT(offset, 2, length);
+        }
+        if (flag1 & 0x02) {
+            /*  max-frame-size (uint16)  */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_connection_tune_ok_frame_max,
+                                tvb, offset, 2, FALSE);
+            AMQP_INCREMENT(offset, 2, length);
+        }
+        if (flag1 & 0x04) {
+            /*  heartbeat (uint16)  */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_method_connection_tune_ok_heartbeat,
+                                tvb, offset, 2, FALSE);
+            AMQP_INCREMENT(offset, 2, length);
+        }
+        break;
+
+    case AMQP_0_10_METHOD_CONNECTION_OPEN:
+        if ((flag1 & ~0x07) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {
+            /*  virtual-host (str8)  */
+            ti = proto_tree_add_item(args_tree,
+                                     hf_amqp_method_connection_open_virtual_host,
+                                     tvb,
+                                     offset + 1,
+                                     tvb_get_guint8(tvb, offset), FALSE);
+            AMQP_INCREMENT(offset, tvb_get_guint8(tvb, offset) + 1, length);
+        }
+        if (flag1 & 0x02) {
+            /*  capabilities (str16-array)  */
+            arg_length = tvb_get_ntohl(tvb, offset);
+            AMQP_INCREMENT(offset, 4, length);
+            ti = proto_tree_add_item(args_tree,
+                                     hf_amqp_0_10_method_connection_open_capabilities,
+                                     tvb,
+                                     offset,
+                                     arg_length, FALSE);
+            dissect_amqp_0_10_array (tvb,
+                                     offset,
+                                     offset + arg_length,
+                                     arg_length,
+                                     ti);
+            AMQP_INCREMENT(offset, arg_length, length);
+        }
+        /*
+         * 3rd argument is an optional bit, insist.
+         */
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_method_connection_open_insist,
+                            tvb, flags_offset, 1, FALSE);
+        break;
+
+    case AMQP_0_10_METHOD_CONNECTION_OPEN_OK:
+        if ((flag1 & ~0x01) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {
+            /*  known-hosts (amqp-host-array)  */
+            arg_length = tvb_get_ntohl(tvb, offset);
+            AMQP_INCREMENT(offset, 4, length);
+            ti = proto_tree_add_item(args_tree,
+                                     hf_amqp_0_10_method_connection_open_ok_known_hosts,
+                                     tvb,
+                                     offset,
+                                     arg_length, FALSE);
+            dissect_amqp_0_10_array (tvb,
+                                     offset,
+                                     offset + arg_length,
+                                     arg_length,
+                                     ti);
+            AMQP_INCREMENT(offset, arg_length, length);
+        }
+        break;
+
+    case AMQP_0_10_METHOD_CONNECTION_REDIRECT:
+        if ((flag1 & ~0x03) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {
+            /*  host (amqp-host-url [str16])  */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_method_connection_redirect_host,
+                                tvb, offset + 2, tvb_get_ntohs(tvb, offset),
+                                FALSE);
+            AMQP_INCREMENT(offset, 2 + tvb_get_ntohs(tvb, offset), length);
+        }
+        if (flag1 & 0x02) {
+            /*  known-hosts (amqp-host-array)  */
+            arg_length = tvb_get_ntohl(tvb, offset);
+            AMQP_INCREMENT(offset, 4, length);
+            ti = proto_tree_add_item(args_tree,
+                                     hf_amqp_0_10_method_connection_redirect_known_hosts,
+                                     tvb,
+                                     offset,
+                                     arg_length, FALSE);
+            dissect_amqp_0_10_array (tvb,
+                                     offset,
+                                     offset + arg_length,
+                                     arg_length,
+                                     ti);
+            AMQP_INCREMENT(offset, arg_length, length);
+        }
+        break;
+        
+    case AMQP_0_10_METHOD_CONNECTION_HEARTBEAT:
+        break;
+
+    case AMQP_0_10_METHOD_CONNECTION_CLOSE:
+        if ((flag1 & ~0x03) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {
+            /*  reply-code (uint16)  */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_connection_close_reply_code,
+                                tvb, offset, 2, FALSE);
+            AMQP_INCREMENT(offset, 2, length);
+        }
+        if (flag1 & 0x02) {
+            /*  reply-text (str8)  */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_method_connection_close_reply_text,
+                                tvb, offset + 1, tvb_get_guint8(tvb, offset),
+                                FALSE);
+            AMQP_INCREMENT(offset, 1 + tvb_get_guint8(tvb, offset), length);
+        }
+        break;
+        
+    case AMQP_0_10_METHOD_CONNECTION_CLOSE_OK:
+        break;
+    }
+}
+
+static void
+dissect_amqp_0_10_session(tvbuff_t *tvb,
+                          packet_info *pinfo,
+                          proto_tree *tree,
+                          int offset, guint16 length)
+{
+    proto_item *args_tree;
+    proto_item *ti;
+    proto_item *flags_item;
+    guint8 method;
+    guint8 flag1, flag2;
+    guint16 size;
+    guint32 array_size;
+    int flags_offset;
+    const gchar* method_name;
+
+    method = tvb_get_guint8(tvb, offset+1);
+    method_name = match_strval(method, amqp_0_10_session_methods);
+    if (method_name == NULL)
+        method_name = "<invalid session method>";
+    if (check_col(pinfo->cinfo, COL_INFO)) {
+        col_append_str(pinfo->cinfo, COL_INFO, method_name);
+        col_append_str(pinfo->cinfo, COL_INFO, " ");
+        col_set_fence(pinfo->cinfo, COL_INFO);
+    }
+
+    proto_tree_add_item(tree, hf_amqp_0_10_session_method,
+                        tvb, offset+1, 1, FALSE);              
+    AMQP_INCREMENT(offset, 2, length);
+
+    ti = proto_tree_add_item(tree, hf_amqp_method_arguments,
+                             tvb, offset, length - 2, FALSE);
+    args_tree = proto_item_add_subtree(ti, ett_args);
+    /*
+     * The flag bits are a simple bit string, not a net-byte-order
+     * field. tvb_get_bits16() doesn't know how to do little-endian
+     * at this time, so just pick out two bytes.
+     */
+    flags_offset = offset;
+    flag1 = tvb_get_guint8(tvb, offset);
+    flag2 = tvb_get_guint8(tvb, offset+1);
+    flags_item = proto_tree_add_item(args_tree,
+                                     hf_amqp_0_10_argument_packing_flags,
+                                     tvb, offset, 2, FALSE);
+    AMQP_INCREMENT(offset, 2, length);
+    switch (method) {
+    case AMQP_0_10_METHOD_SESSION_ATTACH:
+        if ((flag1 & ~0x03) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {
+            /*  name (vbin16)  */
+            size = tvb_get_ntohs(tvb, offset);
+            AMQP_INCREMENT(offset, 2, length);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_session_attach_name,
+                                tvb, offset, size, FALSE);
+            AMQP_INCREMENT(offset, size, length);
+        }
+        /*
+         * 2nd argument is an optional bit, force.
+         */
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_method_session_attach_force,
+                            tvb, flags_offset, 1, FALSE);
+        break;
+
+    case AMQP_0_10_METHOD_SESSION_ATTACHED:
+    case AMQP_0_10_METHOD_SESSION_DETACH:
+        if ((flag1 != 0x01) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {
+            /*  name (vbin16)  */
+            size = tvb_get_ntohs(tvb, offset);
+            AMQP_INCREMENT(offset, 2, length);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_session_attach_name,
+                                tvb, offset, size, FALSE);
+            AMQP_INCREMENT(offset, size, length);
+        }
+        break;
+
+    case AMQP_0_10_METHOD_SESSION_DETACHED:
+        if ((flag1 & ~0x03) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {
+            /*  name (vbin16)  */
+            size = tvb_get_ntohs(tvb, offset);
+            AMQP_INCREMENT(offset, 2, length);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_session_attach_name,
+                                tvb, offset, size, FALSE);
+            AMQP_INCREMENT(offset, size, length);
+        }
+        if (flag1 & 0x02) {
+            /*  code (detach-code [uint8]) */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_session_detached_code,
+                                tvb, offset, 1, FALSE);
+            AMQP_INCREMENT(offset, 1, length);
+        }
+        break;
+
+    case AMQP_0_10_METHOD_SESSION_REQUEST_TIMEOUT:
+    case AMQP_0_10_METHOD_SESSION_TIMEOUT:
+        if ((flag1 & ~0x01) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {
+            /*  timeout (uint32)  */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_session_timeout,
+                                tvb, offset, 4, FALSE);
+            AMQP_INCREMENT(offset, 4, length);
+        }
+        break;
+
+    case AMQP_0_10_METHOD_SESSION_COMMAND_POINT:
+        if ((flag1 & ~0x03) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {
+            /*  command-id (sequence-no [uint32])  */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_session_command_point_id,
+                                tvb, offset, 4, FALSE);
+            AMQP_INCREMENT(offset, 4, length);
+        }
+        if (flag1 & 0x02) {
+            /*  command-offset (uint64) */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_session_command_point_offset,
+                                tvb, offset, 8, FALSE);
+            AMQP_INCREMENT(offset, 8, length);
+        }
+        break;
+
+    case AMQP_0_10_METHOD_SESSION_EXPECTED:
+        if ((flag1 & ~0x03) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {
+            /*  commands (commands [sequence-set])  */
+            size = tvb_get_ntohs(tvb, offset);
+            if ((offset + 2 + size) > length)
+                THROW(ReportedBoundsError);
+            ti = proto_tree_add_item(args_tree,
+                                     hf_amqp_0_10_method_session_commands,
+                                     tvb, offset, size + 2, FALSE);
+            AMQP_INCREMENT(offset, 2, length);
+            format_amqp_0_10_sequence_set(tvb, offset, size, ti);
+            AMQP_INCREMENT(offset, size + 2, length);
+        }
+        if (flag1 & 0x02) {
+            /*  fragments (command-fragments [array of command-fragment]) */
+            array_size = tvb_get_ntohl(tvb, offset);
+            if ((offset + 4 + array_size) > length)
+                THROW(ReportedBoundsError);
+            ti = proto_tree_add_item(args_tree,
+                                     hf_amqp_0_10_method_session_fragments,
+                                     tvb, offset, array_size + 4, FALSE);
+            AMQP_INCREMENT(offset, 4, length);
+            dissect_amqp_0_10_array(tvb,
+                                    offset,
+                                    offset + array_size,
+                                    length,
+                                    ti);
+            AMQP_INCREMENT(offset, array_size, length);
+        }
+        break;
+
+    case AMQP_0_10_METHOD_SESSION_CONFIRMED:
+        if ((flag1 & ~0x03) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {
+            /*  commands (commands [sequence-set])  */
+            size = tvb_get_ntohs(tvb, offset);
+            if ((offset + 2 + size) > length)
+                THROW(ReportedBoundsError);
+            ti = proto_tree_add_item(args_tree,
+                                     hf_amqp_0_10_method_session_commands,
+                                     tvb, offset, size + 2, FALSE);
+            AMQP_INCREMENT(offset, 2, length);
+            format_amqp_0_10_sequence_set(tvb, offset, size, ti);
+            AMQP_INCREMENT(offset, size + 2, length);
+        }
+        if (flag1 & 0x02) {
+            /*  fragments (command-fragments [array of command-fragment]) */
+            array_size = tvb_get_ntohl(tvb, offset);
+            if ((offset + 4 + array_size) > length)
+                THROW(ReportedBoundsError);
+            ti = proto_tree_add_item(args_tree,
+                                     hf_amqp_0_10_method_session_fragments,
+                                     tvb, offset, array_size + 4, FALSE);
+            AMQP_INCREMENT(offset, 4, length);
+            dissect_amqp_0_10_array(tvb,
+                                    offset,
+                                    offset + array_size,
+                                    length,
+                                    ti);
+            AMQP_INCREMENT(offset, array_size, length);
+        }
+        break;
+
+    case AMQP_0_10_METHOD_SESSION_COMPLETED:
+        if ((flag1 & ~0x03) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {
+            /*  commands (commands [sequence-set])  */
+            size = tvb_get_ntohs(tvb, offset);
+            if ((offset + 2 + size) > length)
+                THROW(ReportedBoundsError);
+            ti = proto_tree_add_item(args_tree,
+                                     hf_amqp_0_10_method_session_commands,
+                                     tvb, offset, size + 2, FALSE);
+            AMQP_INCREMENT(offset, 2, length);
+            format_amqp_0_10_sequence_set(tvb, offset, size, ti);
+            AMQP_INCREMENT(offset, size, length);
+        }
+        /*
+         * 2nd argument is an optional bit, timely-reply.
+         */
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_method_session_completed_timely,
+                            tvb, flags_offset, 1, FALSE);
+        break;
+
+    case AMQP_0_10_METHOD_SESSION_KNOWN_COMPLETED:
+        if ((flag1 & ~0x01) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {
+            /*  commands (commands [sequence-set])  */
+            size = tvb_get_ntohs(tvb, offset);
+            if ((offset + 2 + size) > length)
+                THROW(ReportedBoundsError);
+            ti = proto_tree_add_item(args_tree,
+                                     hf_amqp_0_10_method_session_commands,
+                                     tvb, offset, size + 2, FALSE);
+            AMQP_INCREMENT(offset, 2, length);
+            format_amqp_0_10_sequence_set(tvb, offset, size, ti);
+            AMQP_INCREMENT(offset, size, length);
+        }
+        break;
+
+    case AMQP_0_10_METHOD_SESSION_FLUSH:
+        if ((flag1 & ~0x07) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_method_session_flush_expected,
+                            tvb, flags_offset, 1, FALSE);
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_method_session_flush_confirmed,
+                            tvb, flags_offset, 1, FALSE);
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_method_session_flush_completed,
+                            tvb, flags_offset, 1, FALSE);
+        break;
+
+    case AMQP_0_10_METHOD_SESSION_GAP:
+        if ((flag1 & ~0x01) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {
+            /*  commands (commands [sequence-set])  */
+            size = tvb_get_ntohs(tvb, offset);
+            if ((offset + 2 + size) > length)
+                THROW(ReportedBoundsError);
+            ti = proto_tree_add_item(args_tree,
+                                     hf_amqp_0_10_method_session_commands,
+                                     tvb, offset, size + 2, FALSE);
+            AMQP_INCREMENT(offset, 2, length);
+            format_amqp_0_10_sequence_set(tvb, offset, size, ti);
+            AMQP_INCREMENT(offset, size + 2, length);
+        }
+        break;
+
+    }
+}
+
+static void
+dissect_amqp_0_10_execution(tvbuff_t *tvb,
+                            packet_info *pinfo,
+                            proto_tree *tree,
+                            int offset, guint16 length)
+{
+    proto_item *args_tree;
+    proto_item *ti;
+    proto_item *flags_item;
+    guint8 class = 0, method;
+    guint8 flag1, flag2;
+    guint16 size;
+    guint32 struct_size;
+    int class_hf, flags_offset;
+    const gchar* method_name;
+
+    method = tvb_get_guint8(tvb, offset+1);
+    method_name = match_strval(method, amqp_0_10_execution_methods);
+    if (method_name == NULL)
+        method_name = "<invalid execution method>";
+    if (check_col(pinfo->cinfo, COL_INFO)) {
+        col_append_str(pinfo->cinfo, COL_INFO, method_name);
+        col_append_str(pinfo->cinfo, COL_INFO, " ");
+        col_set_fence(pinfo->cinfo, COL_INFO);
+    }
+
+    proto_tree_add_item(tree, hf_amqp_0_10_execution_method,
+                        tvb, offset+1, 1, FALSE);              
+    AMQP_INCREMENT(offset, 2, length);
+    /*
+     * Session header is 2 bytes; one that tells it's 1 byte long, then
+     * the byte itself. Bit 0 is sync.
+     */
+    flag1 = tvb_get_guint8(tvb, offset);
+    flag2 = tvb_get_guint8(tvb, offset+1);
+    if (flag1 != 1 || (flag2 & 0xfe) != 0)
+        proto_tree_add_text(tree, tvb, offset, 2, "Invalid session header");
+    else
+        proto_tree_add_item(tree, hf_amqp_0_10_session_header_sync,
+                            tvb, offset + 1, 1, FALSE);
+    AMQP_INCREMENT(offset, 2, length);
+
+    ti = proto_tree_add_item(tree, hf_amqp_method_arguments,
+                             tvb, offset, length - 4, FALSE);
+    args_tree = proto_item_add_subtree(ti, ett_args);
+    /*
+     * The flag bits are a simple bit string, not a net-byte-order
+     * field. tvb_get_bits16() doesn't know how to do little-endian
+     * at this time, so just pick out two bytes.
+     */
+    flags_offset = offset;
+    flag1 = tvb_get_guint8(tvb, offset);
+    flag2 = tvb_get_guint8(tvb, offset+1);
+    flags_item = proto_tree_add_item(args_tree,
+                                     hf_amqp_0_10_argument_packing_flags,
+                                     tvb, offset, 2, FALSE);
+    AMQP_INCREMENT(offset, 2, length);
+    switch (method) {
+    case AMQP_0_10_METHOD_EXECUTION_SYNC:
+        if (flag1 != 0 || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        break;
+
+    case AMQP_0_10_METHOD_EXECUTION_RESULT:
+        if ((flag1 & ~0x03) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {
+            /*  command-id (sequence-no [uint32])  */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_execution_command_id,
+                                tvb, offset, 4, FALSE);
+            AMQP_INCREMENT(offset, 4, length);
+        }
+        if (flag1 & 0x02) {
+            /*  value (struct32) */
+            struct_size = tvb_get_ntohl(tvb, offset);
+            AMQP_INCREMENT(offset, 4, length);
+            if ((offset + struct_size) > length)
+                THROW(ReportedBoundsError);
+            ti = proto_tree_add_item(args_tree,
+                                     hf_amqp_0_10_undissected_struct32,
+                                     tvb, offset, struct_size, FALSE);
+            dissect_amqp_0_10_struct32(tvb, ti, offset, struct_size);
+            AMQP_INCREMENT(offset, struct_size, length);
+        }
+        break;
+
+    case AMQP_0_10_METHOD_EXECUTION_EXCEPTION:
+        if ((flag1 & ~0x7f) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {
+            /* error-code (error-code [uint16]) */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_execution_exception_error,
+                                tvb, offset, 2, FALSE);
+            AMQP_INCREMENT(offset, 2, length);
+        }
+        if (flag1 & 0x02) {
+            /*  command-id (sequence-no [uint32])  */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_execution_command_id,
+                                tvb, offset, 4, FALSE);
+            AMQP_INCREMENT(offset, 4, length);
+        }
+        if (flag1 & 0x04) {
+            /*  class-code (uint8) */
+            class = tvb_get_guint8(tvb, offset);
+            proto_tree_add_item(args_tree, hf_amqp_0_10_class,
+                                tvb, offset, 1, FALSE);
+            AMQP_INCREMENT(offset, 1, length);
+        }
+        if (flag1 & 0x08) {
+            /*  command-code (uint8) */
+            switch(class) {
+            case AMQP_0_10_CLASS_CONNECTION:
+                class_hf = hf_amqp_0_10_connection_method;
+                break;
+            case AMQP_0_10_CLASS_SESSION:
+                class_hf = hf_amqp_0_10_session_method;
+                break;
+            case AMQP_0_10_CLASS_EXECUTION:
+                class_hf = hf_amqp_0_10_execution_method;
+                break;
+            case AMQP_0_10_CLASS_MESSAGE:
+                class_hf = hf_amqp_0_10_message_method;
+                break;
+            case AMQP_0_10_CLASS_TX:
+                class_hf = hf_amqp_0_10_tx_method;
+                break;
+            case AMQP_0_10_CLASS_DTX:
+                class_hf = hf_amqp_0_10_dtx_method;
+                break;
+            case AMQP_0_10_CLASS_EXCHANGE:
+                class_hf = hf_amqp_0_10_exchange_method;
+                break;
+            case AMQP_0_10_CLASS_QUEUE:
+                class_hf = hf_amqp_0_10_queue_method;
+                break;
+            case AMQP_0_10_CLASS_FILE:
+                class_hf = hf_amqp_0_10_file_method;
+                break;
+            case AMQP_0_10_CLASS_STREAM:
+                class_hf = hf_amqp_0_10_stream_method;
+                break;
+            default:
+                class_hf = -1;
+                break;
+            }
+            if (class_hf != -1)
+                proto_tree_add_item(args_tree, class_hf,
+                                    tvb, offset, 1, FALSE);
+            else
+                expert_add_info_format(pinfo, args_tree, PI_PROTOCOL, PI_WARN,
+                                       "Invalid class code %x", class);
+            AMQP_INCREMENT(offset, 1, length);
+        }
+        if (flag1 & 0x10) {
+            /*  field-index (uint8) */
+            proto_tree_add_item(args_tree, hf_amqp_0_10_method_execution_field_index,
+                                tvb, offset, 1, FALSE);
+            AMQP_INCREMENT(offset, 1, length);
+        }
+        if (flag1 & 0x20) {
+            /*  description (str16) */
+            size = tvb_get_ntohs(tvb, offset);
+            if ((offset + 2 + size) > length)
+                THROW(ReportedBoundsError);
+            proto_tree_add_item(args_tree, hf_amqp_0_10_method_execution_description,
+                                tvb, offset + 2, size, FALSE);
+            AMQP_INCREMENT(offset, (2 + size), length);
+        }
+        if (flag1 & 0x40) {
+            /*  error-info (map) */
+            struct_size = tvb_get_ntohl(tvb, offset);
+            AMQP_INCREMENT(offset, 4, length);
+            ti = proto_tree_add_item(args_tree,
+                                     hf_amqp_0_10_method_execution_error_info,
+                                     tvb,
+                                     offset,
+                                     struct_size, FALSE);
+            dissect_amqp_0_10_map (tvb,
+                                   offset,
+                                   offset + struct_size,
+                                   struct_size,
+                                   ti);
+            AMQP_INCREMENT(offset, struct_size, length);
+        }
+        break;
+    }
+}
+
+static void
+dissect_amqp_0_10_message(tvbuff_t *tvb,
+                          packet_info *pinfo,
+                          proto_tree *tree,
+                          int offset, guint16 length)
+{
+    proto_item *args_tree;
+    proto_item *ti;
+    proto_item *flags_item;
+    guint8 method, str_size;
+    guint8 flag1, flag2;
+    guint16 size;
+    guint32 map_size;
+    int flags_offset;
+    const gchar* method_name;
+
+    method = tvb_get_guint8(tvb, offset+1);
+    method_name = match_strval(method, amqp_0_10_message_methods);
+    if (method_name == NULL)
+        method_name = "<invalid message method>";
+    if (check_col(pinfo->cinfo, COL_INFO)) {
+        col_append_str(pinfo->cinfo, COL_INFO, method_name);
+        col_append_str(pinfo->cinfo, COL_INFO, " ");
+        col_set_fence(pinfo->cinfo, COL_INFO);
+    }
+
+    proto_tree_add_item(tree, hf_amqp_0_10_message_method,
+                        tvb, offset+1, 1, FALSE);              
+    AMQP_INCREMENT(offset, 2, length);
+    /*
+     * Session header is 2 bytes; one that tells it's 1 byte long, then
+     * the byte itself. Bit 0 is sync.
+     */
+    flag1 = tvb_get_guint8(tvb, offset);
+    flag2 = tvb_get_guint8(tvb, offset+1);
+    if (flag1 != 1 || (flag2 & 0xfe) != 0)
+        proto_tree_add_text(tree, tvb, offset, 2, "Invalid session header");
+    else
+        proto_tree_add_item(tree, hf_amqp_0_10_session_header_sync,
+                            tvb, offset + 1, 1, FALSE);
+    AMQP_INCREMENT(offset, 2, length);
+
+    ti = proto_tree_add_item(tree, hf_amqp_method_arguments,
+                             tvb, offset, length - 4, FALSE);
+    args_tree = proto_item_add_subtree(ti, ett_args);
+    /*
+     * The flag bits are a simple bit string, not a net-byte-order
+     * field. tvb_get_bits16() doesn't know how to do little-endian
+     * at this time, so just pick out two bytes.
+     */
+    flags_offset = offset;
+    flag1 = tvb_get_guint8(tvb, offset);
+    flag2 = tvb_get_guint8(tvb, offset+1);
+    flags_item = proto_tree_add_item(args_tree,
+                                     hf_amqp_0_10_argument_packing_flags,
+                                     tvb, offset, 2, FALSE);
+    AMQP_INCREMENT(offset, 2, length);
+    switch (method) {
+    case AMQP_0_10_METHOD_MESSAGE_TRANSFER:
+        if ((flag1 & ~0x07) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {     /* destination (str8) */
+            str_size = tvb_get_guint8(tvb, offset);
+            if ((offset + 1 + str_size) > length)
+                THROW(ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_message_transfer_destination,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        if (flag1 & 0x02) {     /* accept-mode (accept-mode [uint8]) */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_message_transfer_accept_mode,
+                                tvb, offset, 1, FALSE);
+            AMQP_INCREMENT(offset, 1, length);            
+        }
+        if (flag1 & 0x04) {     /* acquire-mode (acquire-mode [uint8]) */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_message_transfer_acquire_mode,
+                                tvb, offset, 1, FALSE);
+            AMQP_INCREMENT(offset, 1, length);            
+        }
+        break;
+
+    case AMQP_0_10_METHOD_MESSAGE_ACCEPT:
+        if ((flag1 & ~0x01) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {
+            /*  transfers (session.commands [sequence-set])  */
+            size = tvb_get_ntohs(tvb, offset);
+            if ((offset + 2 + size) > length)
+                THROW(ReportedBoundsError);
+            ti = proto_tree_add_item(args_tree,
+                                     hf_amqp_0_10_method_message_accept_transfers,
+                                     tvb, offset, size + 2, FALSE);
+            AMQP_INCREMENT(offset, 2, length);
+            format_amqp_0_10_sequence_set(tvb, offset, size, ti);
+            AMQP_INCREMENT(offset, size, length);
+        }
+        break;
+
+    case AMQP_0_10_METHOD_MESSAGE_REJECT:
+        if ((flag1 & ~0x07) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {
+            /*  transfers (session.commands [sequence-set])  */
+            size = tvb_get_ntohs(tvb, offset);
+            THROW_ON(((offset + 2 + size) > length), ReportedBoundsError);
+            ti = proto_tree_add_item(args_tree,
+                                     hf_amqp_0_10_method_message_accept_transfers,
+                                     tvb, offset, size + 2, FALSE);
+            AMQP_INCREMENT(offset, 2, length);
+            format_amqp_0_10_sequence_set(tvb, offset, size, ti);
+            AMQP_INCREMENT(offset, size, length);
+        }
+        if (flag1 & 0x02) {     /* reject-code (reject-code [uint16]) */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_message_transfer_reject_code,
+                                tvb, offset, 2, FALSE);
+            AMQP_INCREMENT(offset, 2, length);            
+        }
+        if (flag1 & 0x04) {     /* text (str8) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_message_reject_text,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        break;
+
+    case AMQP_0_10_METHOD_MESSAGE_RELEASE:
+        if ((flag1 & ~0x03) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {
+            /*  transfers (session.commands [sequence-set])  */
+            size = tvb_get_ntohs(tvb, offset);
+            THROW_ON(((offset + 2 + size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_message_accept_transfers,
+                                tvb, offset, size + 2, FALSE);
+            AMQP_INCREMENT(offset, 2, length);
+            format_amqp_0_10_sequence_set(tvb, offset, size, ti);
+            AMQP_INCREMENT(offset, size, length);
+        }
+        /*
+         * 2nd argument is an optional bit, set-redelivered.
+         */
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_method_message_release_set_redelivered,
+                            tvb, flags_offset, 1, FALSE);
+        break;
+
+    case AMQP_0_10_METHOD_MESSAGE_ACQUIRE:
+        if ((flag1 & ~0x01) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {
+            /*  transfers (session.commands [sequence-set])  */
+            size = tvb_get_ntohs(tvb, offset);
+            THROW_ON(((offset + 2 + size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_message_accept_transfers,
+                                tvb, offset, size + 2, FALSE);
+            AMQP_INCREMENT(offset, 2, length);
+            format_amqp_0_10_sequence_set(tvb, offset, size, ti);
+            AMQP_INCREMENT(offset, size, length);
+        }
+        break;
+
+    case AMQP_0_10_METHOD_MESSAGE_RESUME:
+        if ((flag1 & ~0x03) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {
+            /*  destination (destination [str8]) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_message_dest,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, 1 + str_size, length);
+        }
+        if (flag1 & 0x02) {
+            /*  resume-id (resume-id [str16]) */
+            size = tvb_get_ntohs(tvb, offset);
+            THROW_ON(((offset + 2 + size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_message_resume_id,
+                                tvb, offset + 2, size, FALSE);
+            AMQP_INCREMENT(offset, 2 + size, length);
+        }
+        break;
+
+    case AMQP_0_10_METHOD_MESSAGE_SUBSCRIBE:
+        if (flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {
+            /*  queue (queue.name [str8]) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_message_subscribe_queue,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, 1 + str_size, length);
+        }
+        if (flag1 & 0x02) {
+            /*  destination (destination [str8]) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_message_dest,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, 1 + str_size, length);
+        }
+        if (flag1 & 0x04) {     /* accept-mode (accept-mode [uint8]) */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_message_transfer_accept_mode,
+                                tvb, offset, 1, FALSE);
+            AMQP_INCREMENT(offset, 1, length);            
+        }
+        if (flag1 & 0x08) {     /* acquire-mode (acquire-mode [uint8]) */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_message_transfer_acquire_mode,
+                                tvb, offset, 1, FALSE);
+            AMQP_INCREMENT(offset, 1, length);            
+        }
+        /*
+         * 5th argument is an optional bit, exclusive.
+         */
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_method_message_subscribe_exclusive,
+                            tvb, flags_offset, 1, FALSE);
+        if (flag1 & 0x20) {
+            /*  resume-id (resume-id [str16]) */
+            size = tvb_get_ntohs(tvb, offset);
+            THROW_ON(((offset + 2 + size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_message_resume_id,
+                                tvb, offset, 2 + size, FALSE);
+            AMQP_INCREMENT(offset, 2 + size, length);
+        }
+        if (flag1 & 0x40) {
+            /*  resume-ttl (uint64) */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_message_subscribe_resume_ttl,
+                                tvb, offset, 8, FALSE);
+            AMQP_INCREMENT(offset, 8, length);
+        }
+        if (flag1 & 0x80) {
+            /*  arguments (map) */
+            map_size = tvb_get_ntohl(tvb, offset);
+            THROW_ON(((offset + 4 + map_size) > length), ReportedBoundsError);
+            ti = proto_tree_add_item(args_tree,
+                                     hf_amqp_0_10_method_message_subscribe_args,
+                                     tvb,
+                                     offset,
+                                     4 + map_size, FALSE);
+            dissect_amqp_0_10_map (tvb,
+                                   offset + 4,
+                                   offset + 4 + map_size,
+                                   map_size,
+                                   ti);
+            AMQP_INCREMENT(offset, 4 + map_size, length);
+        }
+        break;
+
+    case AMQP_0_10_METHOD_MESSAGE_CANCEL:
+        if ((flag1 & ~0x01) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {
+            /*  destination (destination [str8]) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_message_dest,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, 1 + str_size, length);
+        }
+        break;
+
+    case AMQP_0_10_METHOD_MESSAGE_SET_FLOW_MODE:
+        if ((flag1 & ~0x03) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {
+            /*  destination (destination [str8]) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_message_dest,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, 1 + str_size, length);
+        }
+        if (flag1 & 0x02) {
+            /*  flow-mode (flow-mode [uint8]) */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_message_flow_mode,
+                                tvb, offset, 1, FALSE);
+            AMQP_INCREMENT(offset, 1, length);
+        }
+        break;
+
+    case AMQP_0_10_METHOD_MESSAGE_FLOW:
+        if ((flag1 & ~0x07) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {
+            /*  destination (destination [str8]) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_message_dest,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, 1 + str_size, length);
+        }
+        if (flag1 & 0x02) {
+            /*  unit (credit-unit [uint8]) */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_message_credit_unit,
+                                tvb, offset, 1, FALSE);
+            AMQP_INCREMENT(offset, 1, length);
+        }
+        if (flag1 & 0x04) {
+            /*  value (uint32) */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_message_credit_value,
+                                tvb, offset, 4, FALSE);
+            AMQP_INCREMENT(offset, 4, length);
+        }
+        break;
+
+    case AMQP_0_10_METHOD_MESSAGE_FLUSH:
+        if ((flag1 & ~0x01) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {
+            /*  destination (destination [str8]) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_message_dest,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, 1 + str_size, length);
+        }
+        break;
+
+    case AMQP_0_10_METHOD_MESSAGE_STOP:
+        if ((flag1 & ~0x01) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {
+            /*  destination (destination [str8]) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_message_dest,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, 1 + str_size, length);
+        }
+        break;
+    }
+}
+
+static void
+dissect_amqp_0_10_tx(tvbuff_t *tvb,
+                     packet_info *pinfo,
+                     proto_tree *tree,
+                     int offset, guint16 length)
+{
+    guint8 method;
+    guint8 flag1, flag2;
+    const gchar* method_name;
+
+    method = tvb_get_guint8(tvb, offset+1);
+    method_name = match_strval(method, amqp_0_10_tx_methods);
+    if (method_name == NULL)
+        method_name = "<invalid tx method>";
+    if (check_col(pinfo->cinfo, COL_INFO)) {
+        col_append_str(pinfo->cinfo, COL_INFO, method_name);
+        col_append_str(pinfo->cinfo, COL_INFO, " ");
+        col_set_fence(pinfo->cinfo, COL_INFO);
+    }
+
+    proto_tree_add_item(tree, hf_amqp_0_10_tx_method,
+                        tvb, offset+1, 1, FALSE);              
+    AMQP_INCREMENT(offset, 2, length);
+    /*
+     * Session header is 2 bytes; one that tells it's 1 byte long, then
+     * the byte itself. Bit 0 is sync.
+     */
+    flag1 = tvb_get_guint8(tvb, offset);
+    flag2 = tvb_get_guint8(tvb, offset+1);
+    if (flag1 != 1 || (flag2 & 0xfe) != 0)
+        proto_tree_add_text(tree, tvb, offset, 2, "Invalid session header");
+    else
+        proto_tree_add_item(tree, hf_amqp_0_10_session_header_sync,
+                            tvb, offset + 1, 1, FALSE);
+    AMQP_INCREMENT(offset, 2, length);
+
+    /* No args on any method in this class */
+}
+
+static void
+dissect_amqp_0_10_dtx(tvbuff_t *tvb,
+                      packet_info *pinfo,
+                      proto_tree *tree,
+                      int offset, guint16 length)
+{
+    proto_item *args_tree;
+    proto_item *ti;
+    proto_item *flags_item;
+    guint8 method;
+    guint8 flag1, flag2;
+    guint16 xid_length;
+    int flags_offset;
+    const gchar* method_name;
+
+    method = tvb_get_guint8(tvb, offset+1);
+    method_name = match_strval(method, amqp_0_10_dtx_methods);
+    if (method_name == NULL)
+        method_name = "<invalid dtx method>";
+    if (check_col(pinfo->cinfo, COL_INFO)) {
+        col_append_str(pinfo->cinfo, COL_INFO, method_name);
+        col_append_str(pinfo->cinfo, COL_INFO, " ");
+        col_set_fence(pinfo->cinfo, COL_INFO);
+    }
+
+    proto_tree_add_item(tree, hf_amqp_0_10_dtx_method,
+                        tvb, offset+1, 1, FALSE);              
+    AMQP_INCREMENT(offset, 2, length);
+    /*
+     * Session header is 2 bytes; one that tells it's 1 byte long, then
+     * the byte itself. Bit 0 is sync.
+     */
+    flag1 = tvb_get_guint8(tvb, offset);
+    flag2 = tvb_get_guint8(tvb, offset+1);
+    if (flag1 != 1 || (flag2 & 0xfe) != 0)
+        proto_tree_add_text(tree, tvb, offset, 2, "Invalid session header");
+    else
+        proto_tree_add_item(tree, hf_amqp_0_10_session_header_sync,
+                            tvb, offset + 1, 1, FALSE);
+    AMQP_INCREMENT(offset, 2, length);
+
+    /* No args for dtx.select or dtx.recover */
+    if (method == AMQP_0_10_METHOD_DTX_SELECT ||
+        method == AMQP_0_10_METHOD_DTX_RECOVER)
+        return;
+
+    ti = proto_tree_add_item(tree, hf_amqp_method_arguments,
+                             tvb, offset, length - 4, FALSE);
+    args_tree = proto_item_add_subtree(ti, ett_args);
+
+    /*
+     * The flag bits are a simple bit string, not a net-byte-order
+     * field. tvb_get_bits16() doesn't know how to do little-endian
+     * at this time, so just pick out two bytes.
+     */
+    flags_offset = offset;
+    flag1 = tvb_get_guint8(tvb, offset);
+    flag2 = tvb_get_guint8(tvb, offset+1);
+    flags_item = proto_tree_add_item(args_tree,
+                                     hf_amqp_0_10_argument_packing_flags,
+                                     tvb, offset, 2, FALSE);
+    AMQP_INCREMENT(offset, 2, length);
+    switch (method) {
+    case AMQP_0_10_METHOD_DTX_START:
+        if ((flag1 & ~0x07) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {     /* xid (xid) */
+            xid_length = tvb_get_ntohs(tvb, offset);
+            AMQP_INCREMENT(offset, 2, length);
+            THROW_ON(((offset + xid_length) > length), ReportedBoundsError);
+            ti = proto_tree_add_item(args_tree,
+                                     hf_amqp_0_10_dtx_xid,
+                                     tvb,
+                                     offset - 2,
+                                     xid_length + 2, FALSE);
+            dissect_amqp_0_10_xid (tvb,
+                                   offset,
+                                   xid_length,
+                                   ti);
+            AMQP_INCREMENT(offset, xid_length, length);
+        }
+        /*
+         * 2nd, 3rd arguments are optional bits.
+         */
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_method_dtx_start_join,
+                            tvb, flags_offset, 1, FALSE);
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_method_dtx_start_resume,
+                            tvb, flags_offset, 1, FALSE);
+
+        break;
+
+    case AMQP_0_10_METHOD_DTX_END:
+        if ((flag1 & ~0x07) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {     /* xid (xid) */
+            xid_length = tvb_get_ntohs(tvb, offset);
+            AMQP_INCREMENT(offset, 2, length);
+            THROW_ON(((offset + xid_length) > length), ReportedBoundsError);
+            ti = proto_tree_add_item(args_tree,
+                                     hf_amqp_0_10_dtx_xid,
+                                     tvb,
+                                     offset - 2,
+                                     xid_length + 2, FALSE);
+            dissect_amqp_0_10_xid (tvb,
+                                   offset,
+                                   xid_length,
+                                   ti);
+            AMQP_INCREMENT(offset, xid_length, length);
+        }
+        /*
+         * 2nd, 3rd arguments are optional bits.
+         */
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_method_dtx_end_fail,
+                            tvb, flags_offset, 1, FALSE);
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_method_dtx_end_suspend,
+                            tvb, flags_offset, 1, FALSE);
+        break;
+
+    case AMQP_0_10_METHOD_DTX_COMMIT:
+        if ((flag1 & ~0x03) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {     /* xid (xid) */
+            xid_length = tvb_get_ntohs(tvb, offset);
+            AMQP_INCREMENT(offset, 2, length);
+            THROW_ON(((offset + xid_length) > length), ReportedBoundsError);
+            ti = proto_tree_add_item(args_tree,
+                                     hf_amqp_0_10_dtx_xid,
+                                     tvb,
+                                     offset - 2,
+                                     xid_length + 2, FALSE);
+            dissect_amqp_0_10_xid (tvb,
+                                   offset,
+                                   xid_length,
+                                   ti);
+            AMQP_INCREMENT(offset, xid_length, length);
+        }
+        /*
+         * 2nd argument is an optional bit.
+         */
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_method_dtx_commit_one_phase,
+                            tvb, flags_offset, 1, FALSE);
+        break;
+
+    case AMQP_0_10_METHOD_DTX_FORGET:
+    case AMQP_0_10_METHOD_DTX_GET_TIMEOUT:
+    case AMQP_0_10_METHOD_DTX_PREPARE:
+    case AMQP_0_10_METHOD_DTX_ROLLBACK:
+        if ((flag1 & ~0x01) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {     /* xid (xid) */
+            xid_length = tvb_get_ntohs(tvb, offset);
+            AMQP_INCREMENT(offset, 2, length);
+            THROW_ON(((offset + xid_length) > length), ReportedBoundsError);
+            ti = proto_tree_add_item(args_tree,
+                                     hf_amqp_0_10_dtx_xid,
+                                     tvb,
+                                     offset - 2,
+                                     xid_length + 2, FALSE);
+            dissect_amqp_0_10_xid (tvb,
+                                   offset,
+                                   xid_length,
+                                   ti);
+            AMQP_INCREMENT(offset, xid_length, length);
+        }
+        break;
+
+    case AMQP_0_10_METHOD_DTX_SET_TIMEOUT:
+        if ((flag1 & ~0x03) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {     /* xid (xid) */
+            xid_length = tvb_get_ntohs(tvb, offset);
+            AMQP_INCREMENT(offset, 2, length);
+            THROW_ON(((offset + xid_length) > length), ReportedBoundsError);
+            ti = proto_tree_add_item(args_tree,
+                                     hf_amqp_0_10_dtx_xid,
+                                     tvb,
+                                     offset - 2,
+                                     xid_length + 2, FALSE);
+            dissect_amqp_0_10_xid (tvb,
+                                   offset,
+                                   xid_length,
+                                   ti);
+            AMQP_INCREMENT(offset, xid_length, length);
+        }
+        if (flag1 & 0x02) {    /* timeout (uint32) */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_dtx_set_timeout_timeout,
+                                tvb, offset, 4, FALSE);
+            AMQP_INCREMENT(offset, 4, length);            
+        }
+        break;
+
+    }
+}
+
+static void
+dissect_amqp_0_10_exchange(tvbuff_t *tvb,
+                           packet_info *pinfo,
+                           proto_tree *tree,
+                           int offset, guint16 length)
+{
+    proto_item *args_tree;
+    proto_item *ti;
+    proto_item *flags_item;
+    guint8 method;
+    guint8 flag1, flag2;
+    guint8 str_size;
+    guint32 map_length;
+    int flags_offset;
+    const gchar* method_name;
+
+    method = tvb_get_guint8(tvb, offset+1);
+    method_name = match_strval(method, amqp_0_10_exchange_methods);
+    if (method_name == NULL)
+        method_name = "<invalid exchange method>";
+    if (check_col(pinfo->cinfo, COL_INFO)) {
+        col_append_str(pinfo->cinfo, COL_INFO, method_name);
+        col_append_str(pinfo->cinfo, COL_INFO, " ");
+        col_set_fence(pinfo->cinfo, COL_INFO);
+    }
+
+    proto_tree_add_item(tree, hf_amqp_0_10_exchange_method,
+                        tvb, offset+1, 1, FALSE);              
+    AMQP_INCREMENT(offset, 2, length);
+    /*
+     * Session header is 2 bytes; one that tells it's 1 byte long, then
+     * the byte itself. Bit 0 is sync.
+     */
+    flag1 = tvb_get_guint8(tvb, offset);
+    flag2 = tvb_get_guint8(tvb, offset+1);
+    if (flag1 != 1 || (flag2 & 0xfe) != 0)
+        proto_tree_add_text(tree, tvb, offset, 2, "Invalid session header");
+    else
+        proto_tree_add_item(tree, hf_amqp_0_10_session_header_sync,
+                            tvb, offset + 1, 1, FALSE);
+    AMQP_INCREMENT(offset, 2, length);
+
+    ti = proto_tree_add_item(tree, hf_amqp_method_arguments,
+                             tvb, offset, length - 4, FALSE);
+    args_tree = proto_item_add_subtree(ti, ett_args);
+
+    /*
+     * The flag bits are a simple bit string, not a net-byte-order
+     * field. tvb_get_bits16() doesn't know how to do little-endian
+     * at this time, so just pick out two bytes.
+     */
+    flags_offset = offset;
+    flag1 = tvb_get_guint8(tvb, offset);
+    flag2 = tvb_get_guint8(tvb, offset+1);
+    flags_item = proto_tree_add_item(args_tree,
+                                     hf_amqp_0_10_argument_packing_flags,
+                                     tvb, offset, 2, FALSE);
+    AMQP_INCREMENT(offset, 2, length);
+    switch (method) {
+    case AMQP_0_10_METHOD_EXCHANGE_DECLARE:
+        if ((flag1 & ~0x7f) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {     /* exchange (name [str8]) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_exchange_declare_exchange,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        if (flag1 & 0x02) {     /* type (str8) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_exchange_declare_type,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        if (flag1 & 0x04) {     /* alternate-exchange (name [str8]) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_exchange_declare_alt_exchange,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        /*
+         * 4th-6th arguments are optional bits.
+         */
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_method_exchange_declare_passive,
+                            tvb, flags_offset, 1, FALSE);
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_method_exchange_declare_durable,
+                            tvb, flags_offset, 1, FALSE);
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_method_exchange_declare_auto_delete,
+                            tvb, flags_offset, 1, FALSE);
+        if (flag1 & 0x40) {     /* arguments (map) */
+            map_length = tvb_get_ntohl(tvb, offset);
+            AMQP_INCREMENT(offset, 4, length);
+            THROW_ON(((offset + map_length) > length), ReportedBoundsError);
+            ti = proto_tree_add_item(args_tree,
+                                     hf_amqp_0_10_method_exchange_declare_arguments,
+                                     tvb,
+                                     offset - 4,
+                                     map_length + 4, FALSE);
+            dissect_amqp_0_10_map (tvb,
+                                   offset,
+                                   offset + map_length,
+                                   map_length,
+                                   ti);
+            AMQP_INCREMENT(offset, map_length, length);
+        }
+        break;
+
+    case AMQP_0_10_METHOD_EXCHANGE_DELETE:
+        if ((flag1 & ~0x03) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {     /* exchange (name [str8]) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_exchange_declare_exchange,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        /*
+         * 2nd argument is an optional bit.
+         */
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_method_exchange_delete_if_unused,
+                            tvb, flags_offset, 1, FALSE);
+        break;
+
+    case AMQP_0_10_METHOD_EXCHANGE_QUERY:
+        if ((flag1 & ~0x01) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {     /* exchange (name [str8]) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_exchange_declare_exchange,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        break;
+
+    case AMQP_0_10_METHOD_EXCHANGE_BIND:
+        if ((flag1 & ~0x0f) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {     /* queue (queue.name [str8]) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_exchange_bind_queue,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        if (flag1 & 0x02) {     /* exchange (name [str8]) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_exchange_declare_exchange,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        if (flag1 & 0x04) {     /* binding-key (str8) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_exchange_binding_key,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        if (flag1 & 0x08) {     /* arguments (map) */
+            map_length = tvb_get_ntohl(tvb, offset);
+            AMQP_INCREMENT(offset, 4, length);
+            THROW_ON(((offset + map_length) > length), ReportedBoundsError);
+            ti = proto_tree_add_item(args_tree,
+                                     hf_amqp_0_10_method_exchange_declare_arguments,
+                                     tvb,
+                                     offset - 4,
+                                     map_length + 4, FALSE);
+            dissect_amqp_0_10_map (tvb,
+                                   offset,
+                                   offset + map_length,
+                                   map_length,
+                                   ti);
+            AMQP_INCREMENT(offset, map_length, length);
+        }
+        break;
+
+    case AMQP_0_10_METHOD_EXCHANGE_UNBIND:
+        if ((flag1 & ~0x07) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {     /* queue (queue.name [str8]) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_exchange_bind_queue,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        if (flag1 & 0x02) {     /* exchange (name [str8]) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_exchange_declare_exchange,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        if (flag1 & 0x04) {     /* binding-key (str8) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_exchange_binding_key,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        break;
+
+    case AMQP_0_10_METHOD_EXCHANGE_BOUND:
+        if ((flag1 & ~0x0f) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {     /* exchange (name [str8]) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_exchange_declare_exchange,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        if (flag1 & 0x02) {     /* queue (queue.name [str8]) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_exchange_bind_queue,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        if (flag1 & 0x04) {     /* binding-key (str8) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_exchange_binding_key,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        if (flag1 & 0x08) {     /* arguments (map) */
+            map_length = tvb_get_ntohl(tvb, offset);
+            AMQP_INCREMENT(offset, 4, length);
+            THROW_ON(((offset + map_length) > length), ReportedBoundsError);
+            ti = proto_tree_add_item(args_tree,
+                                     hf_amqp_0_10_method_exchange_declare_arguments,
+                                     tvb,
+                                     offset - 4,
+                                     map_length + 4, FALSE);
+            dissect_amqp_0_10_map (tvb,
+                                   offset,
+                                   offset + map_length,
+                                   map_length,
+                                   ti);
+            AMQP_INCREMENT(offset, map_length, length);
+        }
+        break;
+    }
+}
+
+static void
+dissect_amqp_0_10_queue(tvbuff_t *tvb,
+                        packet_info *pinfo,
+                        proto_tree *tree,
+                        int offset, guint16 length)
+{
+    proto_item *args_tree;
+    proto_item *ti;
+    proto_item *flags_item;
+    guint8 method;
+    guint8 flag1, flag2;
+    guint8 str_size;
+    guint32 map_length;
+    int flags_offset;
+    const gchar* method_name;
+
+    method = tvb_get_guint8(tvb, offset+1);
+    method_name = match_strval(method, amqp_0_10_queue_methods);
+    if (method_name == NULL)
+        method_name = "<invalid queue method>";
+    if (check_col(pinfo->cinfo, COL_INFO)) {
+        col_append_str(pinfo->cinfo, COL_INFO, method_name);
+        col_append_str(pinfo->cinfo, COL_INFO, " ");
+        col_set_fence(pinfo->cinfo, COL_INFO);
+    }
+
+    proto_tree_add_item(tree, hf_amqp_0_10_queue_method,
+                        tvb, offset+1, 1, FALSE);              
+    AMQP_INCREMENT(offset, 2, length);
+    /*
+     * Session header is 2 bytes; one that tells it's 1 byte long, then
+     * the byte itself. Bit 0 is sync.
+     */
+    flag1 = tvb_get_guint8(tvb, offset);
+    flag2 = tvb_get_guint8(tvb, offset+1);
+    if (flag1 != 1 || (flag2 & 0xfe) != 0)
+        proto_tree_add_text(tree, tvb, offset, 2, "Invalid session header");
+    else
+        proto_tree_add_item(tree, hf_amqp_0_10_session_header_sync,
+                            tvb, offset + 1, 1, FALSE);
+    AMQP_INCREMENT(offset, 2, length);
+
+    ti = proto_tree_add_item(tree, hf_amqp_method_arguments,
+                             tvb, offset, length - 4, FALSE);
+    args_tree = proto_item_add_subtree(ti, ett_args);
+
+    /*
+     * The flag bits are a simple bit string, not a net-byte-order
+     * field. tvb_get_bits16() doesn't know how to do little-endian
+     * at this time, so just pick out two bytes.
+     */
+    flags_offset = offset;
+    flag1 = tvb_get_guint8(tvb, offset);
+    flag2 = tvb_get_guint8(tvb, offset+1);
+    flags_item = proto_tree_add_item(args_tree,
+                                     hf_amqp_0_10_argument_packing_flags,
+                                     tvb, offset, 2, FALSE);
+    AMQP_INCREMENT(offset, 2, length);
+    switch (method) {
+    case AMQP_0_10_METHOD_QUEUE_DECLARE:
+        if ((flag1 & ~0x7f) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {     /* queue (name [str8]) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_queue_name,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        if (flag1 & 0x02) {     /* alternate-exchange (exchange.name [str8]) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_queue_alt_exchange,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        /*
+         * 3rd-6th arguments are optional bits.
+         */
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_method_queue_declare_passive,
+                            tvb, flags_offset, 1, FALSE);
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_method_queue_declare_durable,
+                            tvb, flags_offset, 1, FALSE);
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_method_queue_declare_exclusive,
+                            tvb, flags_offset, 1, FALSE);
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_method_queue_declare_auto_delete,
+                            tvb, flags_offset, 1, FALSE);
+        if (flag1 & 0x40) {     /* arguments (map) */
+            map_length = tvb_get_ntohl(tvb, offset);
+            AMQP_INCREMENT(offset, 4, length);
+            THROW_ON(((offset + map_length) > length), ReportedBoundsError);
+            ti = proto_tree_add_item(args_tree,
+                                     hf_amqp_0_10_method_queue_declare_arguments,
+                                     tvb,
+                                     offset - 4,
+                                     map_length + 4, FALSE);
+            dissect_amqp_0_10_map (tvb,
+                                   offset,
+                                   offset + map_length,
+                                   map_length,
+                                   ti);
+            AMQP_INCREMENT(offset, map_length, length);
+        }
+        break;
+
+    case AMQP_0_10_METHOD_QUEUE_DELETE:
+        if ((flag1 & ~0x07) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {     /* queue (name [str8]) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_queue_name,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        /*
+         * 2nd-3rd arguments are optional bits.
+         */
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_method_queue_delete_if_unused,
+                            tvb, flags_offset, 1, FALSE);
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_method_queue_delete_if_empty,
+                            tvb, flags_offset, 1, FALSE);
+        break;
+
+    case AMQP_0_10_METHOD_QUEUE_PURGE:
+        if ((flag1 & ~0x01) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {     /* queue (name [str8]) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_queue_name,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        break;
+
+    case AMQP_0_10_METHOD_QUEUE_QUERY:
+        if ((flag1 & ~0x01) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {     /* queue (name [str8]) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_queue_name,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        break;
+    }
+}
+
+static void
+dissect_amqp_0_10_file(tvbuff_t *tvb,
+                       packet_info *pinfo,
+                       proto_tree *tree,
+                       int offset, guint16 length)
+{
+    proto_item *args_tree;
+    proto_item *ti;
+    proto_item *flags_item;
+    guint8 method;
+    guint8 flag1, flag2;
+    guint8 str_size;
+    guint32 map_length;
+    int flags_offset;
+    const gchar* method_name;
+
+    method = tvb_get_guint8(tvb, offset+1);
+    method_name = match_strval(method, amqp_0_10_file_methods);
+    if (method_name == NULL)
+        method_name = "<invalid file method>";
+    if (check_col(pinfo->cinfo, COL_INFO)) {
+        col_append_str(pinfo->cinfo, COL_INFO, method_name);
+        col_append_str(pinfo->cinfo, COL_INFO, " ");
+        col_set_fence(pinfo->cinfo, COL_INFO);
+    }
+
+    proto_tree_add_item(tree, hf_amqp_0_10_file_method,
+                        tvb, offset+1, 1, FALSE);              
+    AMQP_INCREMENT(offset, 2, length);
+    /*
+     * Session header is 2 bytes; one that tells it's 1 byte long, then
+     * the byte itself. Bit 0 is sync.
+     */
+    flag1 = tvb_get_guint8(tvb, offset);
+    flag2 = tvb_get_guint8(tvb, offset+1);
+    if (flag1 != 1 || (flag2 & 0xfe) != 0)
+        proto_tree_add_text(tree, tvb, offset, 2, "Invalid session header");
+    else
+        proto_tree_add_item(tree, hf_amqp_0_10_session_header_sync,
+                            tvb, offset + 1, 1, FALSE);
+    AMQP_INCREMENT(offset, 2, length);
+
+    ti = proto_tree_add_item(tree, hf_amqp_method_arguments,
+                             tvb, offset, length - 4, FALSE);
+    args_tree = proto_item_add_subtree(ti, ett_args);
+
+    /*
+     * The flag bits are a simple bit string, not a net-byte-order
+     * field. tvb_get_bits16() doesn't know how to do little-endian
+     * at this time, so just pick out two bytes.
+     */
+    flags_offset = offset;
+    flag1 = tvb_get_guint8(tvb, offset);
+    flag2 = tvb_get_guint8(tvb, offset+1);
+    flags_item = proto_tree_add_item(args_tree,
+                                     hf_amqp_0_10_argument_packing_flags,
+                                     tvb, offset, 2, FALSE);
+    AMQP_INCREMENT(offset, 2, length);
+    switch (method) {
+    case AMQP_0_10_METHOD_FILE_QOS:
+        if ((flag1 & ~0x07) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {     /* prefetch-size (uint32) */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_file_qos_prefetch_size,
+                                tvb, offset, 4, FALSE);
+            AMQP_INCREMENT(offset, 4, length);            
+        }
+        if (flag1 & 0x02) {     /* prefetch-count (uint16) */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_file_qos_prefetch_count,
+                                tvb, offset, 2, FALSE);
+            AMQP_INCREMENT(offset, 2, length);            
+        }
+        /*
+         * 3rd argument is an optional bit.
+         */
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_method_file_qos_global,
+                            tvb, flags_offset, 1, FALSE);
+        break;
+
+    case AMQP_0_10_METHOD_FILE_QOS_OK:
+    case AMQP_0_10_METHOD_FILE_STAGE:
+        /* No args */
+        break;
+
+    case AMQP_0_10_METHOD_FILE_CONSUME:
+        if ((flag1 & ~0x7f) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {     /* queue (queue.name [str8]) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) <= length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_queue_name,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        if (flag1 & 0x02) {     /* consumer-tag (str8) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_file_consumer_tag,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        /*
+         * 3rd-6th arguments are optional bits.
+         */
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_method_file_consume_no_local,
+                            tvb, flags_offset, 1, FALSE);
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_method_file_consume_no_ack,
+                            tvb, flags_offset, 1, FALSE);
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_method_file_consume_exclusive,
+                            tvb, flags_offset, 1, FALSE);
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_method_file_consume_nowait,
+                            tvb, flags_offset, 1, FALSE);
+        if (flag1 & 0x40) {     /* arguments (map) */
+            map_length = tvb_get_ntohl(tvb, offset);
+            AMQP_INCREMENT(offset, 4, length);
+            THROW_ON(((offset + map_length) > length), ReportedBoundsError);
+            ti = proto_tree_add_item(args_tree,
+                                     hf_amqp_0_10_method_file_consume_arguments,
+                                     tvb,
+                                     offset - 4,
+                                     map_length + 4, FALSE);
+            dissect_amqp_0_10_map (tvb,
+                                   offset,
+                                   offset + map_length,
+                                   map_length,
+                                   ti);
+            AMQP_INCREMENT(offset, map_length, length);
+        }
+        break;
+
+    case AMQP_0_10_METHOD_FILE_CONSUME_OK:
+    case AMQP_0_10_METHOD_FILE_CANCEL:
+        if ((flag1 & ~0x01) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {     /* consumer-tag (str8) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_file_consumer_tag,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        break;
+
+    case AMQP_0_10_METHOD_FILE_OPEN:
+        if ((flag1 & ~0x03) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {     /* identifier (str8) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_file_identifier,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        if (flag1 & 0x02) {     /* content-size (uint64) */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_file_open_content_size,
+                                tvb, offset, 8, FALSE);
+            AMQP_INCREMENT(offset, 8, length);            
+        }
+        break;
+
+    case AMQP_0_10_METHOD_FILE_OPEN_OK:
+        if ((flag1 & ~0x01) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {     /* staged-size (uint64) */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_file_open_ok_staged_size,
+                                tvb, offset, 8, FALSE);
+            AMQP_INCREMENT(offset, 8, length);            
+        }
+        break;
+
+    case AMQP_0_10_METHOD_FILE_PUBLISH:
+        if ((flag1 & ~0x1f) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {     /* exchange (exchange.name [str8]) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_file_publish_exchange,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        if (flag1 & 0x02) {     /* routing-key (str8) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_file_publish_routing_key,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        /*
+         * 3rd-4th arguments are optional bits.
+         */
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_method_file_publish_mandatory,
+                            tvb, flags_offset, 1, FALSE);
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_method_file_publish_immediate,
+                            tvb, flags_offset, 1, FALSE);
+        if (flag1 & 0x10) {     /* identifier (str8) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_file_identifier,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        break;
+
+    case AMQP_0_10_METHOD_FILE_RETURN:
+        if ((flag1 & ~0x0f) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {     /* reply-code (return-code [uint16]) */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_file_return_reply_code,
+                                tvb, offset, 2, FALSE);
+            AMQP_INCREMENT(offset, 2, length);            
+        }
+        if (flag1 & 0x02) {     /* reply-text (str8) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_file_return_reply_text,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        if (flag1 & 0x04) {     /* exchange (exchange.name [str8]) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_file_return_exchange,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        if (flag1 & 0x08) {     /* routing-key (str8) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_file_return_routing_key,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        break;
+
+    case AMQP_0_10_METHOD_FILE_DELIVER:
+        if ((flag1 & ~0x3f) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {     /* consumer-tag (str8) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_file_deliver_consumer_tag,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        if (flag1 & 0x02) {     /* delivery-tag (uint64) */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_file_deliver_delivery_tag,
+                                tvb, offset, 8, FALSE);
+            AMQP_INCREMENT(offset, 8, length);            
+        }
+        /*
+         * 3rd argument is an optional bit.
+         */
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_method_file_deliver_redelivered,
+                            tvb, flags_offset, 1, FALSE);
+        if (flag1 & 0x08) {     /* exchange (exchange.name [str8]) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_file_deliver_exchange,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        if (flag1 & 0x10) {     /* routing-key (str8) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_file_deliver_routing_key,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        if (flag1 & 0x20) {     /* identifier (str8) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_file_identifier,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        break;
+
+    case AMQP_0_10_METHOD_FILE_ACK:
+        if ((flag1 & ~0x03) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {     /* delivery-tag (uint64) */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_file_ack_delivery_tag,
+                                tvb, offset, 8, FALSE);
+            AMQP_INCREMENT(offset, 8, length);            
+        }
+        /*
+         * 2nd argument is an optional bit.
+         */
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_method_file_ack_multiple,
+                            tvb, flags_offset, 1, FALSE);
+        break;
+
+    case AMQP_0_10_METHOD_FILE_REJECT:
+        if ((flag1 & ~0x03) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {     /* delivery-tag (uint64) */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_file_reject_delivery_tag,
+                                tvb, offset, 8, FALSE);
+            AMQP_INCREMENT(offset, 8, length);            
+        }
+        /*
+         * 2nd argument is an optional bit.
+         */
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_method_file_reject_requeue,
+                            tvb, flags_offset, 1, FALSE);
+        break;
+    }
+}
+
+static void
+dissect_amqp_0_10_stream(tvbuff_t *tvb,
+                         packet_info *pinfo,
+                         proto_tree *tree,
+                         int offset, guint16 length)
+{
+    proto_item *args_tree;
+    proto_item *ti;
+    proto_item *flags_item;
+    guint8 method;
+    guint8 flag1, flag2;
+    guint8 str_size;
+    guint32 map_length;
+    int flags_offset;
+    const gchar* method_name;
+
+    method = tvb_get_guint8(tvb, offset+1);
+    method_name = match_strval(method, amqp_0_10_stream_methods);
+    if (method_name == NULL)
+        method_name = "<invalid stream method>";
+    if (check_col(pinfo->cinfo, COL_INFO)) {
+        col_append_str(pinfo->cinfo, COL_INFO, method_name);
+        col_append_str(pinfo->cinfo, COL_INFO, " ");
+        col_set_fence(pinfo->cinfo, COL_INFO);
+    }
+
+    proto_tree_add_item(tree, hf_amqp_0_10_stream_method,
+                        tvb, offset+1, 1, FALSE);              
+    AMQP_INCREMENT(offset, 2, length);
+    /*
+     * Session header is 2 bytes; one that tells it's 1 byte long, then
+     * the byte itself. Bit 0 is sync.
+     */
+    flag1 = tvb_get_guint8(tvb, offset);
+    flag2 = tvb_get_guint8(tvb, offset+1);
+    if (flag1 != 1 || (flag2 & 0xfe) != 0)
+        proto_tree_add_text(tree, tvb, offset, 2, "Invalid session header");
+    else
+        proto_tree_add_item(tree, hf_amqp_0_10_session_header_sync,
+                            tvb, offset + 1, 1, FALSE);
+    AMQP_INCREMENT(offset, 2, length);
+
+    ti = proto_tree_add_item(tree, hf_amqp_method_arguments,
+                             tvb, offset, length - 4, FALSE);
+    args_tree = proto_item_add_subtree(ti, ett_args);
+
+    /*
+     * The flag bits are a simple bit string, not a net-byte-order
+     * field. tvb_get_bits16() doesn't know how to do little-endian
+     * at this time, so just pick out two bytes.
+     */
+    flags_offset = offset;
+    flag1 = tvb_get_guint8(tvb, offset);
+    flag2 = tvb_get_guint8(tvb, offset+1);
+    flags_item = proto_tree_add_item(args_tree,
+                                     hf_amqp_0_10_argument_packing_flags,
+                                     tvb, offset, 2, FALSE);
+    AMQP_INCREMENT(offset, 2, length);
+    switch (method) {
+    case AMQP_0_10_METHOD_STREAM_QOS:
+        if ((flag1 & ~0x0f) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {     /* prefetch-size (uint32) */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_stream_qos_prefetch_size,
+                                tvb, offset, 4, FALSE);
+            AMQP_INCREMENT(offset, 4, length);            
+        }
+        if (flag1 & 0x02) {     /* prefetch-count (uint16) */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_stream_qos_prefetch_count,
+                                tvb, offset, 2, FALSE);
+            AMQP_INCREMENT(offset, 2, length);            
+        }
+        if (flag1 & 0x04) {     /* consume-rate (uint32) */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_stream_qos_prefetch_size,
+                                tvb, offset, 4, FALSE);
+            AMQP_INCREMENT(offset, 4, length);            
+        }
+        /*
+         * 4th argument is an optional bit.
+         */
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_method_stream_qos_global,
+                            tvb, flags_offset, 1, FALSE);
+        break;
+
+    case AMQP_0_10_METHOD_STREAM_QOS_OK:
+        /* No args */
+        break;
+
+    case AMQP_0_10_METHOD_STREAM_CONSUME:
+        if ((flag1 & ~0x3f) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {     /* queue (queue.name [str8]) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_queue_name,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        if (flag1 & 0x02) {     /* consumer-tag (str8) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_stream_consumer_tag,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        /*
+         * 3rd-5th arguments are optional bits.
+         */
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_method_stream_consume_no_local,
+                            tvb, flags_offset, 1, FALSE);
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_method_stream_consume_exclusive,
+                            tvb, flags_offset, 1, FALSE);
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_method_stream_consume_nowait,
+                            tvb, flags_offset, 1, FALSE);
+        if (flag1 & 0x20) {     /* arguments (map) */
+            map_length = tvb_get_ntohl(tvb, offset);
+            AMQP_INCREMENT(offset, 4, length);
+            THROW_ON(((offset + map_length) > length), ReportedBoundsError);
+            ti = proto_tree_add_item(args_tree,
+                                     hf_amqp_0_10_method_stream_consume_arguments,
+                                     tvb,
+                                     offset - 4,
+                                     map_length + 4, FALSE);
+            dissect_amqp_0_10_map (tvb,
+                                   offset,
+                                   offset + map_length,
+                                   map_length,
+                                   ti);
+            AMQP_INCREMENT(offset, map_length, length);
+        }
+        break;
+
+    case AMQP_0_10_METHOD_STREAM_CONSUME_OK:
+    case AMQP_0_10_METHOD_STREAM_CANCEL:
+        if ((flag1 & ~0x01) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {     /* consumer-tag (str8) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_stream_consumer_tag,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        break;
+
+    case AMQP_0_10_METHOD_STREAM_PUBLISH:
+        if ((flag1 & ~0x0f) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {     /* exchange (exchange.name [str8]) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) <= length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_stream_publish_exchange,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        if (flag1 & 0x02) {     /* routing-key (str8) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_stream_publish_routing_key,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        /*
+         * 3rd-4th arguments are optional bits.
+         */
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_method_stream_publish_mandatory,
+                            tvb, flags_offset, 1, FALSE);
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_method_stream_publish_immediate,
+                            tvb, flags_offset, 1, FALSE);
+        break;
+
+    case AMQP_0_10_METHOD_STREAM_RETURN:
+        if ((flag1 & ~0x0f) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {     /* reply-code (return-code [uint16]) */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_stream_return_reply_code,
+                                tvb, offset, 2, FALSE);
+            AMQP_INCREMENT(offset, 2, length);            
+        }
+        if (flag1 & 0x02) {     /* reply-text (str8) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_stream_return_reply_text,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        if (flag1 & 0x04) {     /* exchange (exchange.name [str8]) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_stream_return_exchange,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        if (flag1 & 0x08) {     /* routing-key (str8) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_stream_return_routing_key,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        break;
+
+    case AMQP_0_10_METHOD_STREAM_DELIVER:
+        if ((flag1 & ~0x0f) || flag2 != 0)
+            proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+        if (flag1 & 0x01) {     /* consumer-tag (str8) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_stream_deliver_consumer_tag,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        if (flag1 & 0x02) {     /* delivery-tag (uint64) */
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_stream_deliver_delivery_tag,
+                                tvb, offset, 8, FALSE);
+            AMQP_INCREMENT(offset, 8, length);            
+        }
+        if (flag1 & 0x04) {     /* exchange (exchange.name [str8]) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_stream_deliver_exchange,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        if (flag1 & 0x08) {     /* queue (queue.name [str8]) */
+            str_size = tvb_get_guint8(tvb, offset);
+            THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_method_stream_deliver_queue,
+                                tvb, offset + 1, str_size, FALSE);
+            AMQP_INCREMENT(offset, (1 + str_size), length);            
+        }
+        break;
+    }
+}
+
+static void
+dissect_amqp_0_10_struct_delivery_properties(tvbuff_t *tvb,
+                                             proto_tree *tree,
+                                             int offset,
+                                             guint32 struct_length)
+{
+    proto_item *args_tree;
+    proto_item *flags_item;
+    guint8 flag1, flag2;
+    guint8 len8;
+    guint16 len16;
+    guint64 timestamp;
+    int flags_offset;
+    int max_length;
+    nstime_t tv;
+
+    max_length = offset + struct_length;
+    args_tree = proto_item_add_subtree(tree, ett_args);
+    AMQP_INCREMENT(offset, 2, max_length);  /* Skip class and struct codes */
+    flags_offset = offset;
+    flag1 = tvb_get_guint8(tvb, offset);
+    flag2 = tvb_get_guint8(tvb, offset+1);
+    flags_item = proto_tree_add_item(args_tree,
+                                     hf_amqp_0_10_argument_packing_flags,
+                                     tvb, offset, 2, FALSE);
+    if (flag2 & ~0x0f)
+        proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+    AMQP_INCREMENT(offset, 2, max_length);
+
+    /* First 3 fields are bits */
+    proto_tree_add_item(args_tree,
+                        hf_amqp_0_10_struct_delivery_properties_discard_unroutable,
+                        tvb, flags_offset, 1, FALSE);
+    proto_tree_add_item(args_tree,
+                        hf_amqp_0_10_struct_delivery_properties_immediate,
+                        tvb, flags_offset, 1, FALSE);
+    proto_tree_add_item(args_tree,
+                        hf_amqp_0_10_struct_delivery_properties_redelivered,
+                        tvb, flags_offset, 1, FALSE);
+    if (flag1 & 0x08) {
+        /* delivery-priority (delivery-priority [uint8]) */
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_struct_delivery_properties_priority,
+                            tvb, offset, 1, FALSE);
+        AMQP_INCREMENT(offset, 1, max_length);
+    }
+    if (flag1 & 0x10) {
+        /* delivery-mode (delivery-mode [uint8]) */
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_struct_delivery_properties_mode,
+                            tvb, offset, 1, FALSE);
+        AMQP_INCREMENT(offset, 1, max_length);
+    }
+    if (flag1 & 0x20) {
+        /* ttl (uint64) */
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_struct_delivery_properties_ttl,
+                            tvb, offset, 8, FALSE);
+        AMQP_INCREMENT(offset, 8, max_length);
+    }
+    if (flag1 & 0x40) {
+        /* timestamp (datetime [uint64]) */
+        timestamp = tvb_get_ntoh64(tvb, offset);
+        tv.secs = (time_t)timestamp;
+        tv.nsecs = 0;
+        proto_tree_add_time(args_tree,
+                            hf_amqp_0_10_struct_delivery_properties_timestamp,
+                            tvb, offset, 8, &tv);
+        AMQP_INCREMENT(offset, 8, max_length);
+    }
+    if (flag1 & 0x80) {
+        /* expiration (datetime [uint64]) */
+        timestamp = tvb_get_ntoh64(tvb, offset);
+        tv.secs = (time_t)timestamp;
+        tv.nsecs = 0;
+        proto_tree_add_time(args_tree,
+                            hf_amqp_0_10_struct_delivery_properties_expiration,
+                            tvb, offset, 8, &tv);
+        AMQP_INCREMENT(offset, 8, max_length);
+    }
+    if (flag2 & 0x01) {
+        /* exchange (exchange.name [str8]) */
+        len8 = tvb_get_guint8(tvb, offset);
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_struct_delivery_properties_exchange,
+                            tvb, offset + 1, len8, FALSE);
+        AMQP_INCREMENT(offset, (1 + len8), max_length);
+    }
+    if (flag2 & 0x02) {
+        /* routing-key (str8) */
+        len8 = tvb_get_guint8(tvb, offset);
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_struct_delivery_properties_routing_key,
+                            tvb, offset + 1, len8, FALSE);
+        AMQP_INCREMENT(offset, (1 + len8), max_length);
+    }
+    if (flag2 & 0x04) {
+        /*  resume-id (resume-id [str16]) */
+        len16 = tvb_get_ntohs(tvb, offset);
+        THROW_ON(((offset + 2 + len16) > max_length), ReportedBoundsError);
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_method_message_resume_id,
+                            tvb, offset + 2, len16, FALSE);
+        AMQP_INCREMENT(offset, (2 + len16), max_length);
+    }
+    if (flag2 & 0x08) {
+        /*  resume-ttl (uint64) */
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_struct_delivery_properties_resume_ttl,
+                            tvb, offset, 8, FALSE);
+        AMQP_INCREMENT(offset, 8, max_length);
+    }
+}
+
+static void
+dissect_amqp_0_10_struct_fragment_properties(tvbuff_t *tvb,
+                                             proto_tree *tree,
+                                             int offset,
+                                             guint32 struct_length)
+{
+    proto_item *args_tree;
+    proto_item *flags_item;
+    guint8 flag1, flag2;
+    int flags_offset;
+    int max_length;
+
+    max_length = offset + struct_length;
+    args_tree = proto_item_add_subtree(tree, ett_args);
+    AMQP_INCREMENT(offset, 2, max_length);  /* Skip class and struct codes */
+    flags_offset = offset;
+    flag1 = tvb_get_guint8(tvb, offset);
+    flag2 = tvb_get_guint8(tvb, offset+1);
+    flags_item = proto_tree_add_item(args_tree,
+                                     hf_amqp_0_10_argument_packing_flags,
+                                     tvb, offset, 2, FALSE);
+    if ((flag1 & ~0x07) || flag2 != 0)
+        proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+    AMQP_INCREMENT(offset, 2, max_length);
+
+    /* First 2 fields are bits */
+    proto_tree_add_item(args_tree,
+                        hf_amqp_0_10_struct_fragment_properties_first,
+                        tvb, flags_offset, 1, FALSE);
+    proto_tree_add_item(args_tree,
+                        hf_amqp_0_10_struct_fragment_properties_last,
+                        tvb, flags_offset, 1, FALSE);
+    if (flag1 & 0x04) {
+        /* fragment-size (uint64) */
+        proto_tree_add_item(args_tree,
+                            hf_amqp_0_10_struct_fragment_properties_size,
+                            tvb, offset, 8, FALSE);
+        AMQP_INCREMENT(offset, 8, max_length);
+    }
+}
+
+static void
+dissect_amqp_0_10_struct_message_properties(tvbuff_t *tvb,
+                                            proto_tree *tree,
+                                            int offset,
+                                            guint32 struct_length)
+{
+    proto_item *ti;
+    proto_item *frag;
+    proto_item *args_tree;
+    proto_item *flags_item, *subflags_item;
+    guint8 flag1, flag2;
+    guint8 subflag1, subflag2;
+    guint8 len8;
+    guint16 len16;
+    guint32 map_length;
+    e_guid_t uuid;
+    int flags_offset, subflags_offset;
+    int max_length;
+
+    max_length = offset + struct_length;
+    frag = proto_item_add_subtree(tree, ett_args);
+    AMQP_INCREMENT(offset, 2, max_length);  /* Skip class and struct codes */
+    flags_offset = offset;
+    flag1 = tvb_get_guint8(tvb, offset);
+    flag2 = tvb_get_guint8(tvb, offset+1);
+    flags_item = proto_tree_add_item(frag,
+                                     hf_amqp_0_10_argument_packing_flags,
+                                     tvb, offset, 2, FALSE);
+    if (flag2 & ~0x01)
+        proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+    AMQP_INCREMENT(offset, 2, max_length);
+    if (flag1 & 0x01) {
+        /*  content-length (uint64) */
+        proto_tree_add_item(frag,
+                            hf_amqp_0_10_struct_message_properties_content_len,
+                            tvb, offset, 8, FALSE);
+        AMQP_INCREMENT(offset, 8, max_length);
+    }
+    if (flag1 & 0x02) {
+        /* message-id (uuid) */
+        tvb_get_guid(tvb, offset, &uuid, FALSE);
+        proto_tree_add_guid(frag,
+                            hf_amqp_0_10_struct_message_properties_message_id,
+                            tvb, offset, 16, &uuid);
+        AMQP_INCREMENT(offset, 16, max_length);
+    }
+    if (flag1 & 0x04) {
+        /* correlation-id (vbin16) */
+        len16 = tvb_get_ntohs(tvb, offset);
+        proto_tree_add_item(frag,
+                            hf_amqp_0_10_struct_message_properties_correlation,
+                            tvb, offset + 2, len16, FALSE);
+        AMQP_INCREMENT(offset, (2 + len16), max_length);
+    }
+    if (flag1 & 0x08) {
+        /* reply-to (reply-to) */
+        /* This is another struct, length 2, packing 2 */
+        len16 = tvb_get_ntohs(tvb, offset);
+        AMQP_INCREMENT(offset, 2, max_length);
+        ti = proto_tree_add_item(frag,
+                                 hf_amqp_0_10_struct_message_properties_reply_to,
+                                 tvb, offset, len16, FALSE);
+        args_tree = proto_item_add_subtree(ti, ett_args);
+        subflags_item = proto_tree_add_item(args_tree,
+                                            hf_amqp_0_10_argument_packing_flags,
+                                            tvb, offset, 2, FALSE);
+        subflags_offset = offset;
+        subflag1 = tvb_get_guint8(tvb, offset);
+        subflag2 = tvb_get_guint8(tvb, offset + 1);
+        if ((subflag1 & ~0x03) || subflag2 != 0)
+            proto_item_set_expert_flags(subflags_item, PI_PROTOCOL, PI_WARN);
+        AMQP_INCREMENT(offset, 2, max_length);
+        if (subflag1 & 0x01) {
+            /* exchange (str8) */
+            len8 = tvb_get_guint8(tvb, offset);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_struct_reply_to_exchange,
+                                tvb, offset + 1, len8, FALSE);
+            AMQP_INCREMENT(offset, (1 + len8), max_length);
+        }
+        if (subflag1 & 0x02) {
+            /* routing-key (str8) */
+            len8 = tvb_get_guint8(tvb, offset);
+            proto_tree_add_item(args_tree,
+                                hf_amqp_0_10_struct_reply_to_routing_key,
+                                tvb, offset + 1, len8, FALSE);
+            AMQP_INCREMENT(offset, (1 + len8), max_length);
+        }
+    }
+    if (flag1 & 0x10) {
+        /* content-type (str8) */
+        len8 = tvb_get_guint8(tvb, offset);
+        proto_tree_add_item(frag,
+                            hf_amqp_0_10_struct_message_properties_content_type,
+                            tvb, offset + 1, len8, FALSE);
+        AMQP_INCREMENT(offset, (1 + len8), max_length);
+    }
+    if (flag1 & 0x20) {
+        /* content-encoding (str8) */
+        len8 = tvb_get_guint8(tvb, offset);
+        proto_tree_add_item(frag,
+                            hf_amqp_0_10_struct_message_properties_content_encoding,
+                            tvb, offset + 1, len8, FALSE);
+        AMQP_INCREMENT(offset, (1 + len8), max_length);
+    }
+    if (flag1 & 0x40) {
+        /* user-id (vbin16 ) */
+        len16 = tvb_get_ntohs(tvb, offset);
+        proto_tree_add_item(frag,
+                            hf_amqp_0_10_struct_message_properties_user_id,
+                            tvb, offset + 2, len16, FALSE);
+        AMQP_INCREMENT(offset, (2 + len16), max_length);
+    }
+    if (flag1 & 0x80) {
+        /* app-id (vbin16 ) */
+        len16 = tvb_get_ntohs(tvb, offset);
+        proto_tree_add_item(frag,
+                            hf_amqp_0_10_struct_message_properties_app_id,
+                            tvb, offset + 2, len16, FALSE);
+        AMQP_INCREMENT(offset, (2 + len16), max_length);
+    }
+    if (flag2 & 0x01) {
+        /* application-headers (map) */
+        map_length = tvb_get_ntohl(tvb, offset);
+        AMQP_INCREMENT(offset, 4, max_length);
+        ti = proto_tree_add_item(frag,
+                                 hf_amqp_0_10_struct_message_properties_application_headers,
+                                 tvb,
+                                 offset,
+                                 map_length, FALSE);
+        dissect_amqp_0_10_map (tvb,
+                               offset,
+                               offset + map_length,
+                               map_length,
+                               ti);
+        AMQP_INCREMENT(offset, map_length, max_length);
+    }
+}
+
+static void
+dissect_amqp_0_10_struct_exchange_query_result(tvbuff_t *tvb,
+                                               proto_item *tree,
+                                               int offset,
+                                               guint32 struct_length)
+{
+    proto_item *ti;
+    proto_item *result;
+    proto_item *flags_item;
+    guint8 flag1, flag2;
+    guint8 len8;
+    guint32 map_length;
+    int flags_offset;
+    int max_length;
+
+    max_length = offset + struct_length;
+    result = proto_item_add_subtree(tree, ett_args);
+    AMQP_INCREMENT(offset, 2, max_length);  /* Skip class and struct codes */
+    flags_offset = offset;
+    flag1 = tvb_get_guint8(tvb, offset);
+    flag2 = tvb_get_guint8(tvb, offset+1);
+    flags_item = proto_tree_add_item(result,
+                                     hf_amqp_0_10_argument_packing_flags,
+                                     tvb, offset, 2, FALSE);
+    if (flag2 & ~0x0f)
+        proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+    AMQP_INCREMENT(offset, 2, max_length);
+    if (flag1 & 0x01) {
+        /*  type (str8) */
+        len8 = tvb_get_guint8(tvb, offset);
+        THROW_ON(((offset + 1 + len8) > max_length), ReportedBoundsError);
+        proto_tree_add_item(result,
+                            hf_amqp_0_10_method_exchange_declare_type,
+                            tvb, offset + 1, len8, FALSE);
+        AMQP_INCREMENT(offset, (1 + len8), max_length);            
+    }
+    proto_tree_add_item(result,
+                        hf_amqp_0_10_struct_exchange_query_result_durable,
+                        tvb, flags_offset, 1, FALSE);
+    proto_tree_add_item(result,
+                        hf_amqp_0_10_struct_exchange_query_result_not_found,
+                        tvb, flags_offset, 1, FALSE);
+    if (flag1 & 0x08) {
+        /*  arguments (map) */
+        map_length = tvb_get_ntohl(tvb, offset);
+        AMQP_INCREMENT(offset, 4, max_length);
+        THROW_ON(((offset + (int)map_length) > max_length), ReportedBoundsError);
+        ti = proto_tree_add_item(result,
+                                 hf_amqp_0_10_method_exchange_declare_arguments,
+                                 tvb,
+                                 offset - 4,
+                                 map_length + 4, FALSE);
+        dissect_amqp_0_10_map (tvb,
+                               offset,
+                               offset + map_length,
+                               map_length,
+                               ti);
+        AMQP_INCREMENT(offset, map_length, max_length);
+    }
+}
+
+static void
+dissect_amqp_0_10_struct_queue_query_result(tvbuff_t *tvb,
+                                            proto_item *tree,
+                                            int offset,
+                                            guint32 struct_length)
+{
+    proto_item *ti;
+    proto_item *result;
+    proto_item *flags_item;    
+    guint8 flag1, flag2;
+    guint8 len8;
+    guint32 map_length;
+    int flags_offset;
+    int max_length;
+
+    max_length = offset + struct_length;
+    result = proto_item_add_subtree(tree, ett_args);
+    AMQP_INCREMENT(offset, 2, max_length);  /* Skip class and struct codes */
+    flags_offset = offset;
+    flag1 = tvb_get_guint8(tvb, offset);
+    flag2 = tvb_get_guint8(tvb, offset+1);
+    flags_item = proto_tree_add_item(result,
+                                     hf_amqp_0_10_argument_packing_flags,
+                                     tvb, offset, 2, FALSE);
+
+    if (flag2 != 0)
+        proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+    AMQP_INCREMENT(offset, 2, max_length);
+    if (flag1 & 0x01) {
+        /*  queue (name [str8]) */
+        len8 = tvb_get_guint8(tvb, offset);
+        THROW_ON(((offset + 1 + len8) > max_length), ReportedBoundsError);
+        proto_tree_add_item(result,
+                            hf_amqp_0_10_method_queue_name,
+                            tvb, offset + 1, len8, FALSE);
+        AMQP_INCREMENT(offset, (1 + len8), max_length);            
+    }
+    if (flag1 & 0x02) {     /* alternate-exchange (exchange.name [str8]) */
+        len8 = tvb_get_guint8(tvb, offset);
+        THROW_ON(((offset + 1 + len8) > max_length), ReportedBoundsError);
+        proto_tree_add_item(result,
+                            hf_amqp_0_10_method_queue_alt_exchange,
+                            tvb, offset + 1, len8, FALSE);
+        AMQP_INCREMENT(offset, (1 + len8), max_length);            
+    }
+    /*
+     * 3rd-5th arguments are optional bits.
+     */
+    proto_tree_add_item(result,
+                        hf_amqp_0_10_struct_queue_query_result_durable,
+                        tvb, flags_offset, 1, FALSE);
+    proto_tree_add_item(result,
+                        hf_amqp_0_10_struct_queue_query_result_exclusive,
+                        tvb, flags_offset, 1, FALSE);
+    proto_tree_add_item(result,
+                        hf_amqp_0_10_struct_queue_query_result_auto_delete,
+                        tvb, flags_offset, 1, FALSE);
+    if (flag1 & 0x20) {     /* arguments (map) */
+        map_length = tvb_get_ntohl(tvb, offset);
+        AMQP_INCREMENT(offset, 4, max_length);
+        THROW_ON(((offset + (int)map_length) > max_length), ReportedBoundsError);
+        ti = proto_tree_add_item(result,
+                                 hf_amqp_0_10_method_queue_declare_arguments,
+                                 tvb,
+                                 offset - 4,
+                                 map_length + 4, FALSE);
+        dissect_amqp_0_10_map (tvb,
+                               offset,
+                               offset + map_length,
+                               map_length,
+                               ti);
+        AMQP_INCREMENT(offset, (int)map_length, max_length);
+    }
+    if (flag1 & 0x40) {     /* message-count (uint32) */
+        proto_tree_add_item(result,
+                            hf_amqp_0_10_struct_queue_query_result_message_count,
+                            tvb, offset, 4, FALSE);
+        AMQP_INCREMENT(offset, 4, max_length);
+    }
+    if (flag1 & 0x80) {     /* subscriber-count (uint32) */
+        proto_tree_add_item(result,
+                            hf_amqp_0_10_struct_queue_query_result_subscriber_count,
+                            tvb, offset, 4, FALSE);
+        AMQP_INCREMENT(offset, 4, max_length);
+    }
+}
+
+static void
+dissect_amqp_0_10_struct_file_properties(tvbuff_t *tvb,
+                                         proto_tree *tree,
+                                         int offset,
+                                         guint32 struct_length)
+{
+    proto_item *ti;
+    proto_item *props;
+    proto_item *flags_item;
+    guint8 flag1, flag2;
+    guint8 len8;
+    guint32 map_length;
+    guint64 timestamp;
+    int flags_offset;
+    int max_length;
+    nstime_t tv;
+
+    max_length = offset + struct_length;
+    props = proto_item_add_subtree(tree, ett_args);
+    AMQP_INCREMENT(offset, 2, max_length);  /* Skip class and struct codes */
+    flags_offset = offset;
+    flag1 = tvb_get_guint8(tvb, offset);
+    flag2 = tvb_get_guint8(tvb, offset+1);
+    flags_item = proto_tree_add_item(props,
+                                     hf_amqp_0_10_argument_packing_flags,
+                                     tvb, offset, 2, FALSE);
+    if (flag2 & ~0x01)
+        proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+    AMQP_INCREMENT(offset, 2, max_length);
+    if (flag1 & 0x01) {
+        /*  content-type (str8) */
+        len8 = tvb_get_guint8(tvb, offset);
+        proto_tree_add_item(props,
+                            hf_amqp_0_10_struct_file_properties_content_type,
+                            tvb, offset + 1, len8, FALSE);
+        AMQP_INCREMENT(offset, (1 + len8), max_length);
+    }
+    if (flag1 & 0x02) {
+        /*  content-encoding (str8) */
+        len8 = tvb_get_guint8(tvb, offset);
+        proto_tree_add_item(props,
+                            hf_amqp_0_10_struct_file_properties_content_encoding,
+                            tvb, offset + 1, len8, FALSE);
+        AMQP_INCREMENT(offset, (1 + len8), max_length);
+    }
+    if (flag1 & 0x04) {
+        /* headers (map) */
+        map_length = tvb_get_ntohl(tvb, offset);
+        AMQP_INCREMENT(offset, 4, max_length);
+        ti = proto_tree_add_item(props,
+                                 hf_amqp_0_10_struct_file_properties_headers,
+                                 tvb,
+                                 offset,
+                                 map_length, FALSE);
+        dissect_amqp_0_10_map (tvb,
+                               offset,
+                               offset + map_length,
+                               map_length,
+                               ti);
+        AMQP_INCREMENT(offset, map_length, max_length);
+    }
+    if (flag1 & 0x08) {
+        /* priority (uint8) */
+        proto_tree_add_item(props,
+                            hf_amqp_0_10_struct_file_properties_priority,
+                            tvb, offset, 1, FALSE);
+        AMQP_INCREMENT(offset, 1, max_length);
+    }
+    if (flag1 & 0x10) {
+        /* reply-to (str8) */
+        len8 = tvb_get_guint8(tvb, offset);
+        proto_tree_add_item(props,
+                            hf_amqp_0_10_struct_file_properties_reply_to,
+                            tvb, offset + 1, len8, FALSE);
+        AMQP_INCREMENT(offset, (1 + len8), max_length);
+    }
+    if (flag1 & 0x20) {
+        /* message-id (str8) */
+        len8 = tvb_get_guint8(tvb, offset);
+        proto_tree_add_item(props,
+                            hf_amqp_0_10_struct_file_properties_message_id,
+                            tvb, offset + 1, len8, FALSE);
+        AMQP_INCREMENT(offset, (1 + len8), max_length);
+    }
+    if (flag1 & 0x40) {
+        /* filename (str8) */
+        len8 = tvb_get_guint8(tvb, offset);
+        proto_tree_add_item(props,
+                            hf_amqp_0_10_struct_file_properties_filename,
+                            tvb, offset + 1, len8, FALSE);
+        AMQP_INCREMENT(offset, (1 + len8), max_length);
+    }
+    if (flag1 & 0x80) {
+        /* timestamp (datetime [uint64]) */
+        timestamp = tvb_get_ntoh64(tvb, offset);
+        tv.secs = (time_t)timestamp;
+        tv.nsecs = 0;
+        proto_tree_add_time(props,
+                            hf_amqp_0_10_struct_file_properties_timestamp,
+                            tvb, offset, 8, &tv);
+        AMQP_INCREMENT(offset, 8, max_length);
+    }
+    if (flag2 & 0x01) {
+        /* cluster-id (str8) */
+        len8 = tvb_get_guint8(tvb, offset);
+        proto_tree_add_item(props,
+                            hf_amqp_0_10_struct_file_properties_cluster_id,
+                            tvb, offset + 1, len8, FALSE);
+        AMQP_INCREMENT(offset, (1 + len8), max_length);
+    }
+}
+
+static void
+dissect_amqp_0_10_struct_stream_properties(tvbuff_t *tvb,
+                                           proto_tree *tree,
+                                           int offset,
+                                           guint32 struct_length)
+{
+    proto_item *ti;
+    proto_item *props;
+    proto_item *flags_item;
+    guint8 flag1, flag2;
+    guint8 len8;
+    guint32 map_length;
+    guint64 timestamp;
+    int flags_offset;
+    int max_length;
+    nstime_t tv;
+
+    max_length = offset + struct_length;
+    props = proto_item_add_subtree(tree, ett_args);
+    AMQP_INCREMENT(offset, 2, max_length);  /* Skip class and struct codes */
+    flags_offset = offset;
+    flag1 = tvb_get_guint8(tvb, offset);
+    flag2 = tvb_get_guint8(tvb, offset+1);
+    flags_item = proto_tree_add_item(props,
+                                     hf_amqp_0_10_argument_packing_flags,
+                                     tvb, offset, 2, FALSE);
+    if ((flag1 & ~0x1f) || flag2 != 0)
+        proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
+    AMQP_INCREMENT(offset, 2, max_length);
+    if (flag1 & 0x01) {
+        /*  content-type (str8) */
+        len8 = tvb_get_guint8(tvb, offset);
+        proto_tree_add_item(props,
+                            hf_amqp_0_10_struct_stream_properties_content_type,
+                            tvb, offset + 1, len8, FALSE);
+        AMQP_INCREMENT(offset, (1 + len8), max_length);
+    }
+    if (flag1 & 0x02) {
+        /*  content-encoding (str8) */
+        len8 = tvb_get_guint8(tvb, offset);
+        proto_tree_add_item(props,
+                            hf_amqp_0_10_struct_stream_properties_content_encoding,
+                            tvb, offset + 1, len8, FALSE);
+        AMQP_INCREMENT(offset, (1 + len8), max_length);
+    }
+    if (flag1 & 0x04) {
+        /* headers (map) */
+        map_length = tvb_get_ntohl(tvb, offset);
+        AMQP_INCREMENT(offset, 4, max_length);
+        ti = proto_tree_add_item(props,
+                                 hf_amqp_0_10_struct_stream_properties_headers,
+                                 tvb,
+                                 offset,
+                                 map_length, FALSE);
+        dissect_amqp_0_10_map (tvb,
+                               offset,
+                               offset + map_length,
+                               map_length,
+                               ti);
+        AMQP_INCREMENT(offset, map_length, max_length);
+    }
+    if (flag1 & 0x08) {
+        /* priority (uint8) */
+        proto_tree_add_item(props,
+                            hf_amqp_0_10_struct_stream_properties_priority,
+                            tvb, offset, 1, FALSE);
+        AMQP_INCREMENT(offset, 1, max_length);
+    }
+    if (flag1 & 0x10) {
+        /* timestamp (datetime [uint64]) */
+        timestamp = tvb_get_ntoh64(tvb, offset);
+        tv.secs = (time_t)timestamp;
+        tv.nsecs = 0;
+        proto_tree_add_time(props,
+                            hf_amqp_0_10_struct_stream_properties_timestamp,
+                            tvb, offset, 8, &tv);
+        AMQP_INCREMENT(offset, 8, max_length);
+    }
+}
+
+static void
+dissect_amqp_0_10_struct32(tvbuff_t *tvb,
+                           proto_tree *tree,
+                           int offset,
+                           guint32 struct_length)
+{
+    guint8 class_code;
+    guint8 struct_code;
+    guint8 flag1, flag2;
+    guint16 size;
+    guint16 value;
+    guint32 array_length;
+    guint32 consumed;
+    proto_tree *ti;
+    proto_tree *result;
+
+    consumed = 0;
+    class_code = tvb_get_guint8(tvb, offset);
+    struct_code = tvb_get_guint8(tvb, offset + 1);
+    switch(class_code) {
+    case AMQP_0_10_CLASS_MESSAGE:
+        switch (struct_code) {
+        case AMQP_0_10_STRUCT_MESSAGE_DELIVERY_PROPERTIES:
+            proto_item_set_text(tree, "message.delivery-properties");
+            dissect_amqp_0_10_struct_delivery_properties(tvb,
+                                                         tree,
+                                                         offset,
+                                                         struct_length);
+            break;
+        case AMQP_0_10_STRUCT_MESSAGE_FRAGMENT_PROPERTIES:
+            proto_item_set_text(tree, "message.fragment-properties");
+            dissect_amqp_0_10_struct_fragment_properties(tvb,
+                                                         tree,
+                                                         offset,
+                                                         struct_length);
+            break;
+        case AMQP_0_10_STRUCT_MESSAGE_MESSAGE_PROPERTIES:
+            proto_item_set_text(tree, "message.message-properties");
+            dissect_amqp_0_10_struct_message_properties(tvb,
+                                                        tree,
+                                                        offset,
+                                                        struct_length);
+            break;
+        case AMQP_0_10_STRUCT_MESSAGE_ACQUIRED:
+            proto_item_set_text(tree, "message.acquired");
+            result = proto_item_add_subtree(tree, ett_args);
+            AMQP_INCREMENT(consumed, 2, struct_length);  /* Class/type codes */
+            offset += 2;
+            flag1 = tvb_get_guint8(tvb, offset);
+            flag2 = tvb_get_guint8(tvb, offset+1);
+            proto_tree_add_item(result, hf_amqp_0_10_argument_packing_flags,
+                                tvb, offset, 2, FALSE);
+            AMQP_INCREMENT(consumed, 2, struct_length);
+            offset += 2;
+            if (flag1 & 0x01) {
+                /*  transfers (commands [sequence-set])  */
+                size = tvb_get_ntohs(tvb, offset);
+                THROW_ON(((consumed + size) > struct_length), ReportedBoundsError);
+                ti = proto_tree_add_item(result,
+                                         hf_amqp_0_10_struct_acquired_transfers,
+                                         tvb, offset, size + 2, FALSE);
+                format_amqp_0_10_sequence_set(tvb, offset + 2, size, ti);
+            }
+            break;
+        case AMQP_0_10_STRUCT_MESSAGE_RESUME_RESULT:
+            proto_item_set_text(tree, "message.resume-result");
+            result = proto_item_add_subtree(tree, ett_args);
+            AMQP_INCREMENT(consumed, 2, struct_length);  /* Class/type codes */
+            offset += 2;
+            flag1 = tvb_get_guint8(tvb, offset);
+            flag2 = tvb_get_guint8(tvb, offset+1);
+            proto_tree_add_item(result, hf_amqp_0_10_argument_packing_flags,
+                                tvb, offset, 2, FALSE);
+            AMQP_INCREMENT(consumed, 2, struct_length);
+            offset += 2;
+            if (flag1 & 0x01) {
+                /*  offset (uint64)  */
+                proto_tree_add_item(result,
+                                    hf_amqp_0_10_struct_resume_result_offset,
+                                    tvb, offset, 8, FALSE);
+            }
+            break;
+        }
+        break;
+
+    case AMQP_0_10_CLASS_DTX:
+        switch (struct_code) {
+        case AMQP_0_10_STRUCT_DTX_XA_RESULT:
+            AMQP_INCREMENT(consumed, 2, struct_length);  /* Class/type codes */
+            offset += 2;
+            flag1 = tvb_get_guint8(tvb, offset);
+            flag2 = tvb_get_guint8(tvb, offset+1);
+            AMQP_INCREMENT(consumed, 2, struct_length);  /* Packing bytes */
+            offset += 2;
+            value = tvb_get_ntohs(tvb, offset);
+            AMQP_INCREMENT(consumed, 2, struct_length);  /* xa status value */
+            offset += 2;
+            proto_item_set_text(tree, "dtx.xa-status: %s",
+                                val_to_str(value,
+                                           amqp_0_10_xa_status,
+                                           "Invalid xa-status %d"));
+            break;
+
+        case AMQP_0_10_STRUCT_DTX_RECOVER_RESULT:
+            proto_item_set_text(tree, "dtx.recover-result");
+            AMQP_INCREMENT(consumed, 2, struct_length);  /* Class/type codes */
+            offset += 2;
+            flag1 = tvb_get_guint8(tvb, offset);
+            flag2 = tvb_get_guint8(tvb, offset+1);
+            AMQP_INCREMENT(consumed, 2, struct_length);  /* Packing bytes */
+            offset += 2;
+            array_length = tvb_get_ntohl(tvb, offset);
+            AMQP_INCREMENT(consumed, 4, struct_length);
+            offset += 4;
+            dissect_amqp_0_10_array(tvb,
+                                    offset,
+                                    offset + array_length,
+                                    array_length,
+                                    tree);
+            break;
+        }
+        break;
+
+    case AMQP_0_10_CLASS_EXCHANGE:
+        switch (struct_code) {
+        case AMQP_0_10_STRUCT_EXCHANGE_QUERY_RESULT:
+            proto_item_set_text(tree, "exchange.exchange-query-result");
+            dissect_amqp_0_10_struct_exchange_query_result(tvb,
+                                                           tree,
+                                                           offset,
+                                                           struct_length);
+            break;
+
+        case AMQP_0_10_STRUCT_EXCHANGE_BOUND_RESULT:
+            proto_item_set_text(tree, "exchange.exchange-bound-result");
+            result = proto_item_add_subtree(tree, ett_args);
+            AMQP_INCREMENT(consumed, 2, struct_length);  /* Class/type codes */
+            offset += 2;
+            proto_tree_add_item(result,
+                                hf_amqp_0_10_struct_exchange_bound_result_exchange_not_found,
+                                tvb, offset, 1, FALSE);
+            proto_tree_add_item(result,
+                                hf_amqp_0_10_struct_exchange_bound_result_queue_not_found,
+                                tvb, offset, 1, FALSE);
+            proto_tree_add_item(result,
+                                hf_amqp_0_10_struct_exchange_bound_result_queue_not_matched,
+                                tvb, offset, 1, FALSE);
+            proto_tree_add_item(result,
+                                hf_amqp_0_10_struct_exchange_bound_result_key_not_matched,
+                                tvb, offset, 1, FALSE);
+            proto_tree_add_item(result,
+                                hf_amqp_0_10_struct_exchange_bound_result_args_not_matched,
+                                tvb, offset, 1, FALSE);
+            break;
+        }
+        break;
+
+    case AMQP_0_10_CLASS_QUEUE:
+        switch (struct_code) {
+        case AMQP_0_10_STRUCT_QUEUE_QUERY_RESULT:
+            proto_item_set_text(tree, "queue.queue-query-result");
+            dissect_amqp_0_10_struct_queue_query_result(tvb,
+                                                        tree,
+                                                        offset,
+                                                        struct_length);
+            break;
+        }
+        break;
+
+    case AMQP_0_10_CLASS_FILE:
+        switch (struct_code) {
+        case AMQP_0_10_STRUCT_FILE_PROPERTIES:
+            proto_item_set_text(tree, "file.file-properties");
+            dissect_amqp_0_10_struct_file_properties(tvb,
+                                                     tree,
+                                                     offset,
+                                                     struct_length);
+            break;
+        }
+        break;
+
+    case AMQP_0_10_CLASS_STREAM:
+        switch (struct_code) {
+        case AMQP_0_10_STRUCT_STREAM_PROPERTIES:
+            proto_item_set_text(tree, "stream.stream-properties");
+            dissect_amqp_0_10_struct_stream_properties(tvb,
+                                                       tree,
+                                                       offset,
+                                                       struct_length);
+            break;
+        }
+        break;
+    }
+}
+
+static void
+dissect_amqp_0_10_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
+{
+    proto_item *ti;
+    proto_item *amqp_tree;
+    guint8 frame_type;
+    guint8 proto_major;
+    guint8 proto_minor;
+    guint16 length;
+    guint32 struct_length;
+    int offset;
+    emem_strbuf_t *strbuf;
+    conversation_t *conv;
+    amqp_conv *conn;
+
+    /* Find (or build) conversation to remember the protocol version */
+    conv = find_or_create_conversation(pinfo);
+    conn = conversation_get_proto_data(conv, proto_amqp);
+
+    col_set_str(pinfo->cinfo, COL_PROTOCOL, "AMQP");
+    col_clear(pinfo->cinfo, COL_INFO);
+
+    if (tree) {
+        /*  Heuristic - protocol initialisation frame starts with 'AMQP'  */
+        if (tvb_get_guint8(tvb, 0) == 'A' &&
+            tvb_get_guint8(tvb, 1) == 'M' &&
+            tvb_get_guint8(tvb, 2) == 'Q' &&
+            tvb_get_guint8(tvb, 3) == 'P') {
+
+            proto_major = tvb_get_guint8(tvb, 6);
+            proto_minor = tvb_get_guint8(tvb, 7);
+            if (check_col(pinfo->cinfo, COL_INFO)) {
+                strbuf = ep_strbuf_new_label("");
+                ep_strbuf_append_printf(strbuf,
+                                        "Protocol-Header %d-%d ",
+                                        proto_major,
+                                        proto_minor);
+                col_append_str(pinfo->cinfo, COL_INFO, strbuf->str);
+                col_set_fence(pinfo->cinfo, COL_INFO);
+            }
+
+            ti = proto_tree_add_item(tree, proto_amqp, tvb, 0, -1, FALSE);
+            amqp_tree = proto_item_add_subtree(ti, ett_amqp_init);
+            proto_tree_add_item(amqp_tree, hf_amqp_init_protocol, tvb, 0, 4, FALSE);
+            proto_tree_add_item(amqp_tree, hf_amqp_init_id_major, tvb, 4, 1, FALSE);
+            proto_tree_add_item(amqp_tree, hf_amqp_init_id_minor, tvb, 5, 1, FALSE);
+            proto_tree_add_item(amqp_tree, hf_amqp_init_version_major, tvb, 6, 1, FALSE);
+            proto_tree_add_item(amqp_tree, hf_amqp_init_version_minor, tvb, 7, 1, FALSE);
+
+            return;
+        }
+
+        /* Protocol frame */
+        ti = proto_tree_add_item(tree, proto_amqp, tvb, 0, -1, FALSE);
+        amqp_tree = proto_item_add_subtree(ti, ett_amqp);
+        proto_tree_add_item(amqp_tree, hf_amqp_0_10_format, tvb, 0, 1, FALSE);
+        proto_tree_add_item(amqp_tree, hf_amqp_0_10_position, tvb, 0, 1, FALSE);
+        frame_type = tvb_get_guint8(tvb, 1);
+        proto_tree_add_item(amqp_tree, hf_amqp_0_10_type, tvb, 1, 1, FALSE);
+        proto_tree_add_item(amqp_tree, hf_amqp_0_10_size, tvb, 2, 2, FALSE);
+        proto_tree_add_item(amqp_tree, hf_amqp_0_10_track, tvb, 5, 1, FALSE);
+        proto_tree_add_item(amqp_tree, hf_amqp_channel, tvb, 6, 2, FALSE);
+        length = tvb_get_ntohs(tvb, 2);
+        offset = 12;
+        THROW_ON((length <= 13), ReportedBoundsError);
+
+        switch(frame_type) {
+        case AMQP_0_10_FRAME_COMMAND:
+          /* Fall through */
+        case AMQP_0_10_FRAME_CONTROL:
+            proto_tree_add_item(amqp_tree, hf_amqp_0_10_class, tvb, offset+0, 1, FALSE);
+            switch(tvb_get_guint8(tvb, offset + 0)) {
+            case AMQP_0_10_CLASS_CONNECTION:
+                dissect_amqp_0_10_connection(tvb, pinfo, amqp_tree,
+                                             offset, length);
+                break;
+            case AMQP_0_10_CLASS_SESSION:
+                dissect_amqp_0_10_session(tvb, pinfo, amqp_tree,
+                                          offset, length);
+                break;
+            case AMQP_0_10_CLASS_EXECUTION:
+                dissect_amqp_0_10_execution(tvb, pinfo, amqp_tree,
+                                            offset, length);
+                break;
+            case AMQP_0_10_CLASS_MESSAGE:
+                dissect_amqp_0_10_message(tvb, pinfo, amqp_tree,
+                                          offset, length);
+                break;
+            case AMQP_0_10_CLASS_TX:
+                dissect_amqp_0_10_tx(tvb, pinfo, amqp_tree,
+                                     offset, length);
+                break;
+            case AMQP_0_10_CLASS_DTX:
+                dissect_amqp_0_10_dtx(tvb, pinfo, amqp_tree,
+                                      offset, length);
+                break;
+            case AMQP_0_10_CLASS_EXCHANGE:
+                dissect_amqp_0_10_exchange(tvb, pinfo, amqp_tree,
+                                           offset, length);
+                break;
+            case AMQP_0_10_CLASS_QUEUE:
+                dissect_amqp_0_10_queue(tvb, pinfo, amqp_tree,
+                                        offset, length);
+                break;
+            case AMQP_0_10_CLASS_FILE:
+                dissect_amqp_0_10_file(tvb, pinfo, amqp_tree,
+                                       offset, length);
+                break;
+            case AMQP_0_10_CLASS_STREAM:
+                dissect_amqp_0_10_stream(tvb, pinfo, amqp_tree,
+                                         offset, length);
+                break;
+            default:
+              expert_add_info_format(pinfo, amqp_tree, PI_PROTOCOL, PI_ERROR,
+                                     "Unknown command/control class %d",
+                                     tvb_get_guint8(tvb, offset + 0));
+            }
+            break;
+
+        case AMQP_0_10_FRAME_HEADER:
+            if (check_col(pinfo->cinfo, COL_INFO)) {
+                col_append_str(pinfo->cinfo, COL_INFO, "header ");
+                col_set_fence(pinfo->cinfo, COL_INFO);
+            }
+            do {
+                struct_length = tvb_get_ntohl(tvb, offset);
+                AMQP_INCREMENT(offset, 4, length);
+                THROW_ON((offset + struct_length > length), ReportedBoundsError);
+                
+                ti = proto_tree_add_item(amqp_tree,
+                                         hf_amqp_0_10_undissected_struct32,
+                                         tvb, offset, struct_length, FALSE);
+                dissect_amqp_0_10_struct32(tvb, ti, offset, struct_length);
+                AMQP_INCREMENT(offset, struct_length, length);
+            } while (offset < length);
             break;
-        case 'V':
-            typename = "void";
-            value = "";
+
+        case AMQP_0_10_FRAME_BODY:
+            if (check_col(pinfo->cinfo, COL_INFO)) {
+                col_append_str(pinfo->cinfo, COL_INFO, "message-body ");
+                col_set_fence(pinfo->cinfo, COL_INFO);
+            }
+            proto_tree_add_item(amqp_tree,
+                                hf_amqp_0_10_message_body,
+                                tvb, offset, length - 12, FALSE);
             break;
+
         default:
-            typename = "";
-            value = NULL;
-            break;
+            expert_add_info_format(pinfo, amqp_tree, PI_PROTOCOL, PI_ERROR,
+                                   "Unknown frame type %d", frame_type);
         }
-
-        if (value != NULL)
-            proto_tree_add_none_format(field_table_tree, hf_amqp_field, tvb,
-                                       field_start, offset - field_start,
-                                       "%s (%s): %s", name, typename,
-                                       value);
-        else
-            proto_tree_add_none_format(field_table_tree, hf_amqp_field, tvb,
-                                       field_start, offset - field_start,
-                                       "%s: unknown type %x (%c)",
-                                       name, type, type);
     }
-    return;
-
-too_short:
-    proto_tree_add_text(field_table_tree, tvb, field_start,
-                        offset - field_start,
-                        "Field is cut off by the end of the field table");
-    return;
 }
 
-/*  Dissection routine for AMQP frames  */
+/*  Dissection routine for AMQP 0-9 frames  */
 
 static void
-dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
+dissect_amqp_0_9_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
 {
     proto_item *ti;
     proto_item *amqp_tree;
     proto_item *args_tree;
     proto_item *prop_tree;
+    guint8 proto_major;
+    guint8 proto_minor;
     guint length;
     int offset;
+    emem_strbuf_t *strbuf;
     guint8 frame_type;
     guint16 class_id, method_id;
 
@@ -1142,33 +5773,24 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
     col_clear(pinfo->cinfo, COL_INFO);
 
     if (tree) {
-
         /*  Heuristic - protocol initialisation frame starts with 'AMQP'  */
         if (tvb_get_guint8(tvb, 0) == 'A' &&
               tvb_get_guint8(tvb, 1) == 'M' &&
               tvb_get_guint8(tvb, 2) == 'Q' &&
               tvb_get_guint8(tvb, 3) == 'P') {
 
+            proto_major = tvb_get_guint8(tvb, 6);
+            proto_minor = tvb_get_guint8(tvb, 7);
             if (check_col(pinfo->cinfo, COL_INFO)) {
-                col_append_str(pinfo->cinfo, COL_INFO, "Protocol-Header ");
+                strbuf = ep_strbuf_new_label("");
+                ep_strbuf_append_printf(strbuf,
+                                        "Protocol-Header %u-%u",
+                                        proto_major,
+                                        proto_minor);
+                col_append_str(pinfo->cinfo, COL_INFO, strbuf->str);
                 col_set_fence(pinfo->cinfo, COL_INFO);
             }
 
-            /*
-             * XXX - unless we can heuristically determine the protocol
-             * version by looking at the header for frames other than
-             * the protocol initialization frame, we would:
-             *
-             *  need to remember the major and minor version, associate
-             *  it with the connection, and properly dissect different
-             *  versions of the protocol;
-             *
-             *  have some way of specifying the version for traces
-             *  where we don't capture the protocol initialization
-             *  frame (e.g., a preference);
-             *
-             *  reject protocol versions we don't understand.
-             */
             ti = proto_tree_add_item(tree, proto_amqp, tvb, 0, -1, FALSE);
             amqp_tree = proto_item_add_subtree(ti, ett_amqp_init);
             proto_tree_add_item(amqp_tree, hf_amqp_init_protocol, tvb, 0, 4, FALSE);
@@ -1183,17 +5805,17 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
         ti = proto_tree_add_item(tree, proto_amqp, tvb, 0, -1, FALSE);
         amqp_tree = proto_item_add_subtree(ti, ett_amqp);
         frame_type = tvb_get_guint8(tvb, 0);
-        proto_tree_add_item(amqp_tree, hf_amqp_type, tvb, 0, 1, FALSE);
+        proto_tree_add_item(amqp_tree, hf_amqp_0_9_type, tvb, 0, 1, FALSE);
         proto_tree_add_item(amqp_tree, hf_amqp_channel, tvb, 1, 2, FALSE);
-        proto_tree_add_item(amqp_tree, hf_amqp_length, tvb, 3, 4, FALSE);
+        proto_tree_add_item(amqp_tree, hf_amqp_0_9_length, tvb, 3, 4, FALSE);
         length = tvb_get_ntohl(tvb, 3);
         switch (frame_type) {
-        case AMQP_FRAME_TYPE_METHOD:
+        case AMQP_0_9_FRAME_TYPE_METHOD:
             class_id = tvb_get_ntohs(tvb, 7);
-            proto_tree_add_item(amqp_tree, hf_amqp_method_class_id,
+            proto_tree_add_item(amqp_tree, hf_amqp_0_9_method_class_id,
                 tvb, 7, 2, FALSE);
             switch (class_id) {
-            case AMQP_CLASS_CONNECTION:
+            case AMQP_0_9_CLASS_CONNECTION:
                 method_id = tvb_get_ntohs(tvb, 9);
                 proto_tree_add_item(amqp_tree, hf_amqp_method_connection_method_id,
                     tvb, 9, 2, FALSE);
@@ -1201,26 +5823,26 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                     tvb, 11, length - 4, FALSE);
                 args_tree = proto_item_add_subtree(ti, ett_args);
                 switch (method_id) {
-                case AMQP_METHOD_CONNECTION_START:
-                    offset = dissect_amqp_method_connection_start(tvb,
-                        11, args_tree);
+                case AMQP_0_9_METHOD_CONNECTION_START:
+                    offset = dissect_amqp_0_9_method_connection_start(tvb,
+                        pinfo, 11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
                             "Connection.Start ");
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_CONNECTION_START_OK:
-                    offset = dissect_amqp_method_connection_start_ok(tvb,
-                        11, args_tree);
+                case AMQP_0_9_METHOD_CONNECTION_START_OK:
+                    offset = dissect_amqp_0_9_method_connection_start_ok(tvb,
+                        pinfo, 11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
                             "Connection.Start-Ok ");
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_CONNECTION_SECURE:
-                    offset = dissect_amqp_method_connection_secure(tvb,
+                case AMQP_0_9_METHOD_CONNECTION_SECURE:
+                    offset = dissect_amqp_0_9_method_connection_secure(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1228,8 +5850,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_CONNECTION_SECURE_OK:
-                    offset = dissect_amqp_method_connection_secure_ok(tvb,
+                case AMQP_0_9_METHOD_CONNECTION_SECURE_OK:
+                    offset = dissect_amqp_0_9_method_connection_secure_ok(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1237,8 +5859,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_CONNECTION_TUNE:
-                    offset = dissect_amqp_method_connection_tune(tvb,
+                case AMQP_0_9_METHOD_CONNECTION_TUNE:
+                    offset = dissect_amqp_0_9_method_connection_tune(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1246,8 +5868,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_CONNECTION_TUNE_OK:
-                    offset = dissect_amqp_method_connection_tune_ok(tvb,
+                case AMQP_0_9_METHOD_CONNECTION_TUNE_OK:
+                    offset = dissect_amqp_0_9_method_connection_tune_ok(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1255,8 +5877,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_CONNECTION_OPEN:
-                    offset = dissect_amqp_method_connection_open(tvb,
+                case AMQP_0_9_METHOD_CONNECTION_OPEN:
+                    offset = dissect_amqp_0_9_method_connection_open(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1264,8 +5886,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_CONNECTION_OPEN_OK:
-                    offset = dissect_amqp_method_connection_open_ok(tvb,
+                case AMQP_0_9_METHOD_CONNECTION_OPEN_OK:
+                    offset = dissect_amqp_0_9_method_connection_open_ok(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1273,8 +5895,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_CONNECTION_REDIRECT:
-                    offset = dissect_amqp_method_connection_redirect(tvb,
+                case AMQP_0_9_METHOD_CONNECTION_REDIRECT:
+                    offset = dissect_amqp_0_9_method_connection_redirect(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1282,8 +5904,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_CONNECTION_CLOSE:
-                    offset = dissect_amqp_method_connection_close(tvb,
+                case AMQP_0_9_METHOD_CONNECTION_CLOSE:
+                    offset = dissect_amqp_0_9_method_connection_close(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1291,8 +5913,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_CONNECTION_CLOSE_OK:
-                    offset = dissect_amqp_method_connection_close_ok(tvb,
+                case AMQP_0_9_METHOD_CONNECTION_CLOSE_OK:
+                    offset = dissect_amqp_0_9_method_connection_close_ok(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1301,13 +5923,13 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                     }
                     break;
                 default:
-                    col_append_fstr(pinfo->cinfo, COL_INFO,
-                        "Unknown method-id Connection.%u ", method_id);
-                    col_set_fence(pinfo->cinfo, COL_INFO);
-                    break;
+                    expert_add_info_format(pinfo, amqp_tree,
+                                           PI_PROTOCOL, PI_ERROR,
+                                           "Unknown connection method %u",
+                                           method_id);
                 }
                 break;
-            case AMQP_CLASS_CHANNEL:
+            case AMQP_0_9_CLASS_CHANNEL:
                 method_id = tvb_get_ntohs(tvb, 9);
                 proto_tree_add_item(amqp_tree, hf_amqp_method_channel_method_id,
                     tvb, 9, 2, FALSE);
@@ -1315,8 +5937,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                     tvb, 11, length - 4, FALSE);
                 args_tree = proto_item_add_subtree(ti, ett_args);
                 switch (method_id) {
-                case AMQP_METHOD_CHANNEL_OPEN:
-                    offset = dissect_amqp_method_channel_open(tvb,
+                case AMQP_0_9_METHOD_CHANNEL_OPEN:
+                    offset = dissect_amqp_0_9_method_channel_open(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1324,8 +5946,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_CHANNEL_OPEN_OK:
-                    offset = dissect_amqp_method_channel_open_ok(tvb,
+                case AMQP_0_9_METHOD_CHANNEL_OPEN_OK:
+                    offset = dissect_amqp_0_9_method_channel_open_ok(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1333,8 +5955,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_CHANNEL_FLOW:
-                    offset = dissect_amqp_method_channel_flow(tvb,
+                case AMQP_0_9_METHOD_CHANNEL_FLOW:
+                    offset = dissect_amqp_0_9_method_channel_flow(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1342,8 +5964,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_CHANNEL_FLOW_OK:
-                    offset = dissect_amqp_method_channel_flow_ok(tvb,
+                case AMQP_0_9_METHOD_CHANNEL_FLOW_OK:
+                    offset = dissect_amqp_0_9_method_channel_flow_ok(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1351,8 +5973,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_CHANNEL_CLOSE:
-                    offset = dissect_amqp_method_channel_close(tvb,
+                case AMQP_0_9_METHOD_CHANNEL_CLOSE:
+                    offset = dissect_amqp_0_9_method_channel_close(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1360,8 +5982,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_CHANNEL_CLOSE_OK:
-                    offset = dissect_amqp_method_channel_close_ok(tvb,
+                case AMQP_0_9_METHOD_CHANNEL_CLOSE_OK:
+                    offset = dissect_amqp_0_9_method_channel_close_ok(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1369,8 +5991,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_CHANNEL_RESUME:
-                    offset = dissect_amqp_method_channel_resume(tvb,
+                case AMQP_0_9_METHOD_CHANNEL_RESUME:
+                    offset = dissect_amqp_0_9_method_channel_resume(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1378,8 +6000,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_CHANNEL_PING:
-                    offset = dissect_amqp_method_channel_ping(tvb,
+                case AMQP_0_9_METHOD_CHANNEL_PING:
+                    offset = dissect_amqp_0_9_method_channel_ping(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1387,8 +6009,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_CHANNEL_PONG:
-                    offset = dissect_amqp_method_channel_pong(tvb,
+                case AMQP_0_9_METHOD_CHANNEL_PONG:
+                    offset = dissect_amqp_0_9_method_channel_pong(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1396,8 +6018,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_CHANNEL_OK:
-                    offset = dissect_amqp_method_channel_ok(tvb,
+                case AMQP_0_9_METHOD_CHANNEL_OK:
+                    offset = dissect_amqp_0_9_method_channel_ok(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1406,13 +6028,13 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                     }
                     break;
                 default:
-                    col_append_fstr(pinfo->cinfo, COL_INFO,
-                        "Unknown method-id Channel.%u ", method_id);
-                    col_set_fence(pinfo->cinfo, COL_INFO);
-                    break;
+                    expert_add_info_format(pinfo, amqp_tree,
+                                           PI_PROTOCOL, PI_ERROR,
+                                           "Unknown channel method %u",
+                                           method_id);
                 }
                 break;
-            case AMQP_CLASS_ACCESS:
+            case AMQP_0_9_CLASS_ACCESS:
                 method_id = tvb_get_ntohs(tvb, 9);
                 proto_tree_add_item(amqp_tree, hf_amqp_method_access_method_id,
                     tvb, 9, 2, FALSE);
@@ -1420,8 +6042,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                     tvb, 11, length - 4, FALSE);
                 args_tree = proto_item_add_subtree(ti, ett_args);
                 switch (method_id) {
-                case AMQP_METHOD_ACCESS_REQUEST:
-                    offset = dissect_amqp_method_access_request(tvb,
+                case AMQP_0_9_METHOD_ACCESS_REQUEST:
+                    offset = dissect_amqp_0_9_method_access_request(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1429,8 +6051,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_ACCESS_REQUEST_OK:
-                    offset = dissect_amqp_method_access_request_ok(tvb,
+                case AMQP_0_9_METHOD_ACCESS_REQUEST_OK:
+                    offset = dissect_amqp_0_9_method_access_request_ok(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1439,13 +6061,13 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                     }
                     break;
                 default:
-                    col_append_fstr(pinfo->cinfo, COL_INFO,
-                        "Unknown method-id Access.%u ", method_id);
-                    col_set_fence(pinfo->cinfo, COL_INFO);
-                    break;
+                    expert_add_info_format(pinfo, amqp_tree,
+                                           PI_PROTOCOL, PI_ERROR,
+                                           "Unknown access method %u",
+                                           method_id);
                 }
                 break;
-            case AMQP_CLASS_EXCHANGE:
+            case AMQP_0_9_CLASS_EXCHANGE:
                 method_id = tvb_get_ntohs(tvb, 9);
                 proto_tree_add_item(amqp_tree, hf_amqp_method_exchange_method_id,
                     tvb, 9, 2, FALSE);
@@ -1453,17 +6075,17 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                     tvb, 11, length - 4, FALSE);
                 args_tree = proto_item_add_subtree(ti, ett_args);
                 switch (method_id) {
-                case AMQP_METHOD_EXCHANGE_DECLARE:
-                    offset = dissect_amqp_method_exchange_declare(tvb,
-                        11, args_tree);
+                case AMQP_0_9_METHOD_EXCHANGE_DECLARE:
+                    offset = dissect_amqp_0_9_method_exchange_declare(tvb,
+                        pinfo, 11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
                             "Exchange.Declare ");
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_EXCHANGE_DECLARE_OK:
-                    offset = dissect_amqp_method_exchange_declare_ok(tvb,
+                case AMQP_0_9_METHOD_EXCHANGE_DECLARE_OK:
+                    offset = dissect_amqp_0_9_method_exchange_declare_ok(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1471,8 +6093,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_EXCHANGE_DELETE:
-                    offset = dissect_amqp_method_exchange_delete(tvb,
+                case AMQP_0_9_METHOD_EXCHANGE_DELETE:
+                    offset = dissect_amqp_0_9_method_exchange_delete(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1480,8 +6102,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_EXCHANGE_DELETE_OK:
-                    offset = dissect_amqp_method_exchange_delete_ok(tvb,
+                case AMQP_0_9_METHOD_EXCHANGE_DELETE_OK:
+                    offset = dissect_amqp_0_9_method_exchange_delete_ok(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1490,13 +6112,13 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                     }
                     break;
                 default:
-                    col_append_fstr(pinfo->cinfo, COL_INFO,
-                        "Unknown method-id Exchange.%u ", method_id);
-                    col_set_fence(pinfo->cinfo, COL_INFO);
-                    break;
+                    expert_add_info_format(pinfo, amqp_tree,
+                                           PI_PROTOCOL, PI_ERROR,
+                                           "Unknown exchange method %u",
+                                           method_id);
                 }
                 break;
-            case AMQP_CLASS_QUEUE:
+            case AMQP_0_9_CLASS_QUEUE:
                 method_id = tvb_get_ntohs(tvb, 9);
                 proto_tree_add_item(amqp_tree, hf_amqp_method_queue_method_id,
                     tvb, 9, 2, FALSE);
@@ -1504,17 +6126,17 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                     tvb, 11, length - 4, FALSE);
                 args_tree = proto_item_add_subtree(ti, ett_args);
                 switch (method_id) {
-                case AMQP_METHOD_QUEUE_DECLARE:
-                    offset = dissect_amqp_method_queue_declare(tvb,
-                        11, args_tree);
+                case AMQP_0_9_METHOD_QUEUE_DECLARE:
+                    offset = dissect_amqp_0_9_method_queue_declare(tvb,
+                        pinfo, 11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
                             "Queue.Declare ");
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_QUEUE_DECLARE_OK:
-                    offset = dissect_amqp_method_queue_declare_ok(tvb,
+                case AMQP_0_9_METHOD_QUEUE_DECLARE_OK:
+                    offset = dissect_amqp_0_9_method_queue_declare_ok(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1522,17 +6144,17 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_QUEUE_BIND:
-                    offset = dissect_amqp_method_queue_bind(tvb,
-                        11, args_tree);
+                case AMQP_0_9_METHOD_QUEUE_BIND:
+                    offset = dissect_amqp_0_9_method_queue_bind(tvb,
+                        pinfo, 11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
                             "Queue.Bind ");
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_QUEUE_BIND_OK:
-                    offset = dissect_amqp_method_queue_bind_ok(tvb,
+                case AMQP_0_9_METHOD_QUEUE_BIND_OK:
+                    offset = dissect_amqp_0_9_method_queue_bind_ok(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1540,17 +6162,17 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_QUEUE_UNBIND:
-                    offset = dissect_amqp_method_queue_unbind(tvb,
-                        11, args_tree);
+                case AMQP_0_9_METHOD_QUEUE_UNBIND:
+                    offset = dissect_amqp_0_9_method_queue_unbind(tvb,
+                        pinfo, 11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
                             "Queue.Unbind ");
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_QUEUE_UNBIND_OK:
-                    offset = dissect_amqp_method_queue_unbind_ok(tvb,
+                case AMQP_0_9_METHOD_QUEUE_UNBIND_OK:
+                    offset = dissect_amqp_0_9_method_queue_unbind_ok(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1558,8 +6180,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_QUEUE_PURGE:
-                    offset = dissect_amqp_method_queue_purge(tvb,
+                case AMQP_0_9_METHOD_QUEUE_PURGE:
+                    offset = dissect_amqp_0_9_method_queue_purge(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1567,8 +6189,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_QUEUE_PURGE_OK:
-                    offset = dissect_amqp_method_queue_purge_ok(tvb,
+                case AMQP_0_9_METHOD_QUEUE_PURGE_OK:
+                    offset = dissect_amqp_0_9_method_queue_purge_ok(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1576,8 +6198,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_QUEUE_DELETE:
-                    offset = dissect_amqp_method_queue_delete(tvb,
+                case AMQP_0_9_METHOD_QUEUE_DELETE:
+                    offset = dissect_amqp_0_9_method_queue_delete(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1585,8 +6207,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_QUEUE_DELETE_OK:
-                    offset = dissect_amqp_method_queue_delete_ok(tvb,
+                case AMQP_0_9_METHOD_QUEUE_DELETE_OK:
+                    offset = dissect_amqp_0_9_method_queue_delete_ok(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1595,13 +6217,13 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                     }
                     break;
                 default:
-                    col_append_fstr(pinfo->cinfo, COL_INFO,
-                        "Unknown method-id Queue.%u ", method_id);
-                    col_set_fence(pinfo->cinfo, COL_INFO);
-                    break;
+                    expert_add_info_format(pinfo, amqp_tree,
+                                           PI_PROTOCOL, PI_ERROR,
+                                           "Unknown queue method %u",
+                                           method_id);
                 }
                 break;
-            case AMQP_CLASS_BASIC:
+            case AMQP_0_9_CLASS_BASIC:
                 method_id = tvb_get_ntohs(tvb, 9);
                 proto_tree_add_item(amqp_tree, hf_amqp_method_basic_method_id,
                     tvb, 9, 2, FALSE);
@@ -1609,8 +6231,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                     tvb, 11, length - 4, FALSE);
                 args_tree = proto_item_add_subtree(ti, ett_args);
                 switch (method_id) {
-                case AMQP_METHOD_BASIC_QOS:
-                    offset = dissect_amqp_method_basic_qos(tvb,
+                case AMQP_0_9_METHOD_BASIC_QOS:
+                    offset = dissect_amqp_0_9_method_basic_qos(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1618,8 +6240,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_BASIC_QOS_OK:
-                    offset = dissect_amqp_method_basic_qos_ok(tvb,
+                case AMQP_0_9_METHOD_BASIC_QOS_OK:
+                    offset = dissect_amqp_0_9_method_basic_qos_ok(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1627,17 +6249,17 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_BASIC_CONSUME:
-                    offset = dissect_amqp_method_basic_consume(tvb,
-                        11, args_tree);
+                case AMQP_0_9_METHOD_BASIC_CONSUME:
+                    offset = dissect_amqp_0_9_method_basic_consume(tvb,
+                        pinfo, 11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
                             "Basic.Consume ");
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_BASIC_CONSUME_OK:
-                    offset = dissect_amqp_method_basic_consume_ok(tvb,
+                case AMQP_0_9_METHOD_BASIC_CONSUME_OK:
+                    offset = dissect_amqp_0_9_method_basic_consume_ok(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1645,8 +6267,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_BASIC_CANCEL:
-                    offset = dissect_amqp_method_basic_cancel(tvb,
+                case AMQP_0_9_METHOD_BASIC_CANCEL:
+                    offset = dissect_amqp_0_9_method_basic_cancel(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1654,8 +6276,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_BASIC_CANCEL_OK:
-                    offset = dissect_amqp_method_basic_cancel_ok(tvb,
+                case AMQP_0_9_METHOD_BASIC_CANCEL_OK:
+                    offset = dissect_amqp_0_9_method_basic_cancel_ok(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1663,8 +6285,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_BASIC_PUBLISH:
-                    offset = dissect_amqp_method_basic_publish(tvb,
+                case AMQP_0_9_METHOD_BASIC_PUBLISH:
+                    offset = dissect_amqp_0_9_method_basic_publish(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1672,8 +6294,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_BASIC_RETURN:
-                    offset = dissect_amqp_method_basic_return(tvb,
+                case AMQP_0_9_METHOD_BASIC_RETURN:
+                    offset = dissect_amqp_0_9_method_basic_return(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1681,8 +6303,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_BASIC_DELIVER:
-                    offset = dissect_amqp_method_basic_deliver(tvb,
+                case AMQP_0_9_METHOD_BASIC_DELIVER:
+                    offset = dissect_amqp_0_9_method_basic_deliver(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1690,8 +6312,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_BASIC_GET:
-                    offset = dissect_amqp_method_basic_get(tvb,
+                case AMQP_0_9_METHOD_BASIC_GET:
+                    offset = dissect_amqp_0_9_method_basic_get(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1699,8 +6321,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_BASIC_GET_OK:
-                    offset = dissect_amqp_method_basic_get_ok(tvb,
+                case AMQP_0_9_METHOD_BASIC_GET_OK:
+                    offset = dissect_amqp_0_9_method_basic_get_ok(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1708,8 +6330,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_BASIC_GET_EMPTY:
-                    offset = dissect_amqp_method_basic_get_empty(tvb,
+                case AMQP_0_9_METHOD_BASIC_GET_EMPTY:
+                    offset = dissect_amqp_0_9_method_basic_get_empty(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1717,8 +6339,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_BASIC_ACK:
-                    offset = dissect_amqp_method_basic_ack(tvb,
+                case AMQP_0_9_METHOD_BASIC_ACK:
+                    offset = dissect_amqp_0_9_method_basic_ack(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1726,8 +6348,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_BASIC_REJECT:
-                    offset = dissect_amqp_method_basic_reject(tvb,
+                case AMQP_0_9_METHOD_BASIC_REJECT:
+                    offset = dissect_amqp_0_9_method_basic_reject(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1735,8 +6357,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_BASIC_RECOVER:
-                    offset = dissect_amqp_method_basic_recover(tvb,
+                case AMQP_0_9_METHOD_BASIC_RECOVER:
+                    offset = dissect_amqp_0_9_method_basic_recover(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1745,13 +6367,13 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                     }
                     break;
                 default:
-                    col_append_fstr(pinfo->cinfo, COL_INFO,
-                        "Unknown method-id Basic.%u ", method_id);
-                    col_set_fence(pinfo->cinfo, COL_INFO);
-                    break;
+                    expert_add_info_format(pinfo, amqp_tree,
+                                           PI_PROTOCOL, PI_ERROR,
+                                           "Unknown basic method %u",
+                                           method_id);
                 }
                 break;
-            case AMQP_CLASS_FILE:
+            case AMQP_0_9_CLASS_FILE:
                 method_id = tvb_get_ntohs(tvb, 9);
                 proto_tree_add_item(amqp_tree, hf_amqp_method_file_method_id,
                     tvb, 9, 2, FALSE);
@@ -1759,8 +6381,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                     tvb, 11, length - 4, FALSE);
                 args_tree = proto_item_add_subtree(ti, ett_args);
                 switch (method_id) {
-                case AMQP_METHOD_FILE_QOS:
-                    offset = dissect_amqp_method_file_qos(tvb,
+                case AMQP_0_9_METHOD_FILE_QOS:
+                    offset = dissect_amqp_0_9_method_file_qos(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1768,8 +6390,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_FILE_QOS_OK:
-                    offset = dissect_amqp_method_file_qos_ok(tvb,
+                case AMQP_0_9_METHOD_FILE_QOS_OK:
+                    offset = dissect_amqp_0_9_method_file_qos_ok(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1777,17 +6399,17 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_FILE_CONSUME:
-                    offset = dissect_amqp_method_file_consume(tvb,
-                        11, args_tree);
+                case AMQP_0_9_METHOD_FILE_CONSUME:
+                    offset = dissect_amqp_0_9_method_file_consume(tvb,
+                        pinfo, 11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
                             "File.Consume ");
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_FILE_CONSUME_OK:
-                    offset = dissect_amqp_method_file_consume_ok(tvb,
+                case AMQP_0_9_METHOD_FILE_CONSUME_OK:
+                    offset = dissect_amqp_0_9_method_file_consume_ok(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1795,8 +6417,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_FILE_CANCEL:
-                    offset = dissect_amqp_method_file_cancel(tvb,
+                case AMQP_0_9_METHOD_FILE_CANCEL:
+                    offset = dissect_amqp_0_9_method_file_cancel(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1804,8 +6426,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_FILE_CANCEL_OK:
-                    offset = dissect_amqp_method_file_cancel_ok(tvb,
+                case AMQP_0_9_METHOD_FILE_CANCEL_OK:
+                    offset = dissect_amqp_0_9_method_file_cancel_ok(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1813,8 +6435,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_FILE_OPEN:
-                    offset = dissect_amqp_method_file_open(tvb,
+                case AMQP_0_9_METHOD_FILE_OPEN:
+                    offset = dissect_amqp_0_9_method_file_open(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1822,8 +6444,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_FILE_OPEN_OK:
-                    offset = dissect_amqp_method_file_open_ok(tvb,
+                case AMQP_0_9_METHOD_FILE_OPEN_OK:
+                    offset = dissect_amqp_0_9_method_file_open_ok(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1831,8 +6453,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_FILE_STAGE:
-                    offset = dissect_amqp_method_file_stage(tvb,
+                case AMQP_0_9_METHOD_FILE_STAGE:
+                    offset = dissect_amqp_0_9_method_file_stage(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1840,8 +6462,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_FILE_PUBLISH:
-                    offset = dissect_amqp_method_file_publish(tvb,
+                case AMQP_0_9_METHOD_FILE_PUBLISH:
+                    offset = dissect_amqp_0_9_method_file_publish(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1849,8 +6471,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_FILE_RETURN:
-                    offset = dissect_amqp_method_file_return(tvb,
+                case AMQP_0_9_METHOD_FILE_RETURN:
+                    offset = dissect_amqp_0_9_method_file_return(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1858,8 +6480,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_FILE_DELIVER:
-                    offset = dissect_amqp_method_file_deliver(tvb,
+                case AMQP_0_9_METHOD_FILE_DELIVER:
+                    offset = dissect_amqp_0_9_method_file_deliver(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1867,8 +6489,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_FILE_ACK:
-                    offset = dissect_amqp_method_file_ack(tvb,
+                case AMQP_0_9_METHOD_FILE_ACK:
+                    offset = dissect_amqp_0_9_method_file_ack(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1876,8 +6498,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_FILE_REJECT:
-                    offset = dissect_amqp_method_file_reject(tvb,
+                case AMQP_0_9_METHOD_FILE_REJECT:
+                    offset = dissect_amqp_0_9_method_file_reject(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1886,13 +6508,13 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                     }
                     break;
                 default:
-                    col_append_fstr(pinfo->cinfo, COL_INFO,
-                        "Unknown method-id File.%u ", method_id);
-                    col_set_fence(pinfo->cinfo, COL_INFO);
-                    break;
+                    expert_add_info_format(pinfo, amqp_tree,
+                                           PI_PROTOCOL, PI_ERROR,
+                                           "Unknown file method %u",
+                                           method_id);
                 }
                 break;
-            case AMQP_CLASS_STREAM:
+            case AMQP_0_9_CLASS_STREAM:
                 method_id = tvb_get_ntohs(tvb, 9);
                 proto_tree_add_item(amqp_tree, hf_amqp_method_stream_method_id,
                     tvb, 9, 2, FALSE);
@@ -1900,8 +6522,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                     tvb, 11, length - 4, FALSE);
                 args_tree = proto_item_add_subtree(ti, ett_args);
                 switch (method_id) {
-                case AMQP_METHOD_STREAM_QOS:
-                    offset = dissect_amqp_method_stream_qos(tvb,
+                case AMQP_0_9_METHOD_STREAM_QOS:
+                    offset = dissect_amqp_0_9_method_stream_qos(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1909,8 +6531,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_STREAM_QOS_OK:
-                    offset = dissect_amqp_method_stream_qos_ok(tvb,
+                case AMQP_0_9_METHOD_STREAM_QOS_OK:
+                    offset = dissect_amqp_0_9_method_stream_qos_ok(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1918,17 +6540,17 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_STREAM_CONSUME:
-                    offset = dissect_amqp_method_stream_consume(tvb,
-                        11, args_tree);
+                case AMQP_0_9_METHOD_STREAM_CONSUME:
+                    offset = dissect_amqp_0_9_method_stream_consume(tvb,
+                        pinfo, 11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
                             "Stream.Consume ");
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_STREAM_CONSUME_OK:
-                    offset = dissect_amqp_method_stream_consume_ok(tvb,
+                case AMQP_0_9_METHOD_STREAM_CONSUME_OK:
+                    offset = dissect_amqp_0_9_method_stream_consume_ok(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1936,8 +6558,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_STREAM_CANCEL:
-                    offset = dissect_amqp_method_stream_cancel(tvb,
+                case AMQP_0_9_METHOD_STREAM_CANCEL:
+                    offset = dissect_amqp_0_9_method_stream_cancel(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1945,8 +6567,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_STREAM_CANCEL_OK:
-                    offset = dissect_amqp_method_stream_cancel_ok(tvb,
+                case AMQP_0_9_METHOD_STREAM_CANCEL_OK:
+                    offset = dissect_amqp_0_9_method_stream_cancel_ok(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1954,8 +6576,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
                     break;
-                case AMQP_METHOD_STREAM_PUBLISH:
-                    offset = dissect_amqp_method_stream_publish(tvb,
+                case AMQP_0_9_METHOD_STREAM_PUBLISH:
+                    offset = dissect_amqp_0_9_method_stream_publish(tvb,
                         11, args_tree);
                     if (check_col(pinfo->cinfo, COL_INFO)) {
                         col_append_str(pinfo->cinfo, COL_INFO,
@@ -1963,8 +6585,8 @@ dissect_amqp_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                         col_set_fence(pinfo->cinfo, COL_INFO);
                     }
               &nb