/* packet-mq.c
 * Routines for IBM WebSphere MQ packet dissection
 *
 * metatech <metatechbe@gmail.com>
 * robionekenobi <robionekenobi@bluewin.ch>
 *
 * $Id$
 *
 * Wireshark - Network traffic analyzer
 * By Gerald Combs <gerald@wireshark.org>
 * Copyright 1998 Gerald Combs
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

/*  WebSphere MQ in a nutshell
 *
 *   IBM WebSphere MQ (formerly IBM MQSeries) is an asynchronous proprietary messaging middleware that is
 *    based on message queues.
 *   MQ can run on more than 35 platforms, amongst which UNIX, Windows and mainframes.
 *   MQ can be transported on top of TCP, UDP, HTTP, NetBIOS, SPX, SNA LU 6.2, DECnet.
 *   MQ has language bindings for C, C++, Java, .NET, COBOL, PL/I, OS/390 assembler, TAL, Visual Basic.
 *
 *   The basic MQ topology is on one side the queue manager which hosts the queues.  On the other side the
 *   applications connect to the queue manager, open a queue, and put or get messages to/from that queue.
 *
 *   The MQ middleware allows very generic operations (send, receive) and can be compared to the
 *   socket API in terms of genericity, but it is more abstract and offers higher-level functionalities
 *   (eg transactions, ...)
 *
 *   The MQ middleware is not really intended to be run over public networks between parties
 *   that do not know each other in advance, but is rather used on private corporate networks
 *   between business applications (it can be compared to a database server for that aspect).
 *
 *   The wire format of an MQ segment is a sequence of structures.
 *   Most structures start with a 4-letter struct identifier.
 *   MQ is a fixed-sized format, most fields have maximum lengths defined in the MQ API.
 *   MQ is popular on mainframes because it was available before TCP/IP.
 *   MQ supports both ASCII-based and EBCDIC-based character sets.
 *
 *   MQ API documentation is called "WebSphere MQ Application Programming Reference"
 *
 *   Possible structures combinations :
 *   TSH [ ID ^ UID ^ CONN ^ INQ ^ OD ]
 *   TSH MSH XQH MD [ PAYLOAD ]
 *   TSH [OD] MD [ GMO ^ PMO ] [ [XQH MD] PAYLOAD ]
 *   TSH [ SPQU ^ SPPU ^ SPGU ^ SPAU [ SPQI ^ SPQO ^ SPPI ^ SPPO ^ SPGI ^ SPGO ^ SPAI ^ SPAO]]
 *   TSH [ XA ] [ XINFO | XID ]
 *   where PAYLOAD = [ DH ] [ DLH ] [ MDE ] BUFF
 *
 *   This dissector is a beta version.  To be improved
 *   - Translate the integers/flags into their descriptions
 *   - Find the semantics of the unknown fields
 *   - Display EBCDIC strings as ASCII
 *   - Packets which structures built on different platforms
 */

#include "config.h"

#include <glib.h>

#include <epan/packet.h>
#include <epan/exceptions.h>
#include <epan/conversation.h>
#include <epan/reassemble.h>

#include <epan/dissectors/packet-windows-common.h>
#include <epan/dissectors/packet-dcerpc.h>
#include <epan/expert.h>
#include <epan/dissector_filters.h>
#include <epan/show_exception.h>

#include <epan/prefs.h>
#include <epan/wmem/wmem.h>
#include <epan/strutil.h>

#include "packet-tcp.h"
#include "packet-mq.h"

static int proto_mq = -1;
static int hf_mq_tsh_StructID = -1;
static int hf_mq_tsh_mqseglen = -1;
static int hf_mq_tsh_convid = -1;
static int hf_mq_tsh_requestid = -1;
static int hf_mq_tsh_byteorder = -1;
static int hf_mq_tsh_opcode = -1;
static int hf_mq_tsh_ctlflgs1 = -1;

static int hf_mq_tsh_ctlflgs2 = -1;
static int hf_mq_tsh_luwid = -1;
static int hf_mq_tsh_encoding = -1;

static int hf_mq_tsh_ccsid = -1;
static int hf_mq_tsh_reserved = -1;

/* Transmission Segment Control Flags 1 */
static int hf_mq_tsh_tcf_confirmreq = -1;
static int hf_mq_tsh_tcf_error = -1;
static int hf_mq_tsh_tcf_reqclose = -1;
static int hf_mq_tsh_tcf_closechann = -1;
static int hf_mq_tsh_tcf_first = -1;
static int hf_mq_tsh_tcf_last = -1;
static int hf_mq_tsh_tcf_reqacc = -1;
static int hf_mq_tsh_tcf_dlq = -1;
static const int *pf_flds_tcf[] =
{
	&hf_mq_tsh_tcf_dlq       ,
	&hf_mq_tsh_tcf_reqacc    ,
	&hf_mq_tsh_tcf_last      ,
	&hf_mq_tsh_tcf_first     ,
	&hf_mq_tsh_tcf_closechann,
	&hf_mq_tsh_tcf_reqclose  ,
	&hf_mq_tsh_tcf_error     ,
	&hf_mq_tsh_tcf_confirmreq,
	NULL
};

/* Transmission Segment Control Flags 2 */
static int hf_mq_tsh_tcf2_HdrComp  = -1;
static int hf_mq_tsh_tcf2_MsgComp  = -1;
static int hf_mq_tsh_tcf2_CSH      = -1;
static int hf_mq_tsh_tcf2_CmitIntv = -1;
static const int *pf_flds_tcf2[] =
{
	&hf_mq_tsh_tcf2_CmitIntv,
	&hf_mq_tsh_tcf2_CSH     ,
	&hf_mq_tsh_tcf2_MsgComp ,
	&hf_mq_tsh_tcf2_HdrComp ,
	NULL
};

static int hf_mq_api_replylen = -1;
static int hf_mq_api_compcode = -1;
static int hf_mq_api_reascode = -1;
static int hf_mq_api_objecthdl = -1;
static int hf_mq_socket_conversid = -1;
static int hf_mq_socket_requestid = -1;
static int hf_mq_socket_type = -1;
static int hf_mq_socket_parm1 = -1;
static int hf_mq_socket_parm2 = -1;
static int hf_mq_msh_StructID = -1;
static int hf_mq_msh_seqnum = -1;
static int hf_mq_msh_datalength = -1;
static int hf_mq_msh_unknown1 = -1;
static int hf_mq_msh_msglength = -1;
static int hf_mq_xqh_StructID = -1;
static int hf_mq_xqh_version = -1;
static int hf_mq_xqh_remoteq = -1;
static int hf_mq_xqh_remoteqmgr = -1;

static int hf_mq_id_StructID = -1;
static int hf_mq_id_FapLevel = -1;
static int hf_mq_id_icf1 = -1;
static int hf_mq_id_Eicf1 = -1;
static int hf_mq_id_ief1 = -1;
static int hf_mq_id_Reserved = -1;
static int hf_mq_id_MaxMsgBatch = -1;
static int hf_mq_id_MaxTrSize = -1;
static int hf_mq_id_MaxMsgSize = -1;
static int hf_mq_id_SeqWrapVal = -1;
static int hf_mq_id_channel = -1;
static int hf_mq_id_icf2 = -1;
static int hf_mq_id_Eicf2 = -1;
static int hf_mq_id_ccsid = -1;
static int hf_mq_id_qmgrname = -1;
static int hf_mq_id_HBInterval = -1;
static int hf_mq_id_EFLLength = -1;
static int hf_mq_id_ief2 = -1;
static int hf_mq_id_Reserved1 = -1;
static int hf_mq_id_HdrCprsLst = -1;
static int hf_mq_id_MsgCprsLst = -1;
static int hf_mq_id_Reserved2 = -1;
static int hf_mq_id_SSLKeyRst = -1;
static int hf_mq_id_ConvBySkt = -1;
static int hf_mq_id_icf3 = -1;
static int hf_mq_id_Eicf3 = -1;
static int hf_mq_id_Reserved3 = -1;
static int hf_mq_id_ProcessId = -1;
static int hf_mq_id_ThreadId = -1;
static int hf_mq_id_TraceId = -1;
static int hf_mq_id_ProdId = -1;
static int hf_mq_id_mqmid = -1;

/* Initial Data Capability Flag 1 */
static int hf_mq_id_icf1_msgseq = -1;
static int hf_mq_id_icf1_convcap = -1;
static int hf_mq_id_icf1_splitmsg = -1;
static int hf_mq_id_icf1_RqstInit = -1;
static int hf_mq_id_icf1_RqstSecu = -1;
static int hf_mq_id_icf1_mqreq = -1;
static int hf_mq_id_icf1_svrsec = -1;
static int hf_mq_id_icf1_runtime = -1;
static const int *pf_flds_icf1[] =
{
	&hf_mq_id_icf1_runtime ,
	&hf_mq_id_icf1_svrsec  ,
	&hf_mq_id_icf1_mqreq   ,
	&hf_mq_id_icf1_RqstSecu,
	&hf_mq_id_icf1_RqstInit,
	&hf_mq_id_icf1_splitmsg,
	&hf_mq_id_icf1_convcap ,
	&hf_mq_id_icf1_msgseq  ,
	NULL
};

/* Initial Data Error Flag 1 */
static int hf_mq_id_ief1_ccsid = -1;
static int hf_mq_id_ief1_enc = -1;
static int hf_mq_id_ief1_mxtrsz = -1;
static int hf_mq_id_ief1_fap = -1;
static int hf_mq_id_ief1_mxmsgsz = -1;
static int hf_mq_id_ief1_mxmsgpb = -1;
static int hf_mq_id_ief1_seqwrap = -1;
static int hf_mq_id_ief1_hbint = -1;
static const int *pf_flds_ief1[] =
{
	&hf_mq_id_ief1_hbint  ,
	&hf_mq_id_ief1_seqwrap,
	&hf_mq_id_ief1_mxmsgpb,
	&hf_mq_id_ief1_mxmsgsz,
	&hf_mq_id_ief1_fap    ,
	&hf_mq_id_ief1_mxtrsz ,
	&hf_mq_id_ief1_enc    ,
	&hf_mq_id_ief1_ccsid  ,
	NULL
};

/* Initial Data Capability Flag 2 */
static int hf_mq_id_icf2_CanDstLst = -1;
static int hf_mq_id_icf2_FstMsgReq = -1;
static int hf_mq_id_icf2_RespConv  = -1;
static int hf_mq_id_icf2_XARequest = -1;
static int hf_mq_id_icf2_XARunTApp = -1;
static int hf_mq_id_icf2_SPIRqst   = -1;
static int hf_mq_id_icf2_DualUOW   = -1;
static int hf_mq_id_icf2_CanTrcRte = -1;
static const int *pf_flds_icf2[] =
{
	&hf_mq_id_icf2_CanTrcRte,
	&hf_mq_id_icf2_SPIRqst  ,
	&hf_mq_id_icf2_XARunTApp,
	&hf_mq_id_icf2_XARequest,
	&hf_mq_id_icf2_DualUOW  ,
	&hf_mq_id_icf2_RespConv ,
	&hf_mq_id_icf2_FstMsgReq,
	&hf_mq_id_icf2_CanDstLst,
	NULL
};

/* Initial Data Error Flag 2 */
static int hf_mq_id_ief2_HdrCmpLst = -1;
static int hf_mq_id_ief2_MsgCmpLst = -1;
static int hf_mq_id_ief2_SSLReset  = -1;
static const int *pf_flds_ief2[] =
{
	&hf_mq_id_ief2_HdrCmpLst,
	&hf_mq_id_ief2_MsgCmpLst,
	&hf_mq_id_ief2_SSLReset ,
	NULL
};

/* Initial Data Capability Flag 3 */
static int hf_mq_id_icf3_CanMsgPrp = -1;
static int hf_mq_id_icf3_Unknown02 = -1;
static const int *pf_flds_icf3[] =
{
	&hf_mq_id_icf3_Unknown02,
	&hf_mq_id_icf3_CanMsgPrp,
	NULL
};

static int hf_mq_uid_StructID = -1;
static int hf_mq_uid_userid = -1;
static int hf_mq_uid_password = -1;
static int hf_mq_uid_longuserid = -1;
static int hf_mq_sidlen = -1;
static int hf_mq_sidtyp = -1;
static int hf_mq_securityid = -1;

static int hf_mq_conn_QMgr = -1;
static int hf_mq_conn_appname = -1;
static int hf_mq_conn_apptype = -1;
static int hf_mq_conn_acttoken = -1;
static int hf_mq_conn_version = -1;
static int hf_mq_conn_options = -1;
static int hf_mq_fcno_StructID = -1;
static int hf_mq_fcno_msgid = -1;
static int hf_mq_fcno_mqmid = -1;
static int hf_mq_fcno_unknown00 = -1;
static int hf_mq_fcno_unknown01 = -1;
static int hf_mq_fcno_unknown02 = -1;

static int hf_mq_inq_nbsel = -1;
static int hf_mq_inq_nbint = -1;
static int hf_mq_inq_charlen = -1;
static int hf_mq_inq_sel = -1;
static int hf_mq_inq_intvalue = -1;
static int hf_mq_inq_charvalues = -1;

static int hf_mq_spi_verb = -1;
static int hf_mq_spi_version = -1;
static int hf_mq_spi_length = -1;
static int hf_mq_spi_base_StructID = -1;
static int hf_mq_spi_base_version = -1;
static int hf_mq_spi_base_length = -1;
static int hf_mq_spi_spqo_nbverb = -1;
static int hf_mq_spi_spqo_verbid = -1;
static int hf_mq_spi_spqo_maxiover = -1;
static int hf_mq_spi_spqo_maxinver = -1;
static int hf_mq_spi_spqo_maxouver = -1;
static int hf_mq_spi_spqo_flags = -1;
static int hf_mq_spi_spai_mode = -1;
static int hf_mq_spi_spai_unknown1 = -1;
static int hf_mq_spi_spai_unknown2 = -1;
static int hf_mq_spi_spai_msgid = -1;
static int hf_mq_spi_spgi_batchsz = -1;
static int hf_mq_spi_spgi_batchint = -1;
static int hf_mq_spi_spgi_maxmsgsz = -1;
static int hf_mq_spi_spgo_options = -1;
static int hf_mq_spi_spgo_size = -1;

static int hf_mq_spi_opt_blank = -1;
static int hf_mq_spi_opt_syncp = -1;
static int hf_mq_spi_opt_deferred = -1;
static const int *pf_flds_spiopt[] =
{
	&hf_mq_spi_opt_deferred,
	&hf_mq_spi_opt_syncp,
	&hf_mq_spi_opt_blank,
	NULL
};

static int hf_mq_put_length = -1;

static int hf_mq_close_options = -1;
static int hf_mq_close_options_DELETE                 = -1;
static int hf_mq_close_options_DELETE_PURGE           = -1;
static int hf_mq_close_options_KEEP_SUB               = -1;
static int hf_mq_close_options_REMOVE_SUB             = -1;
static int hf_mq_close_options_QUIESCE                = -1;
static const int *pf_flds_clsopt[] =
{
	&hf_mq_close_options_QUIESCE     ,
	&hf_mq_close_options_REMOVE_SUB  ,
	&hf_mq_close_options_KEEP_SUB    ,
	&hf_mq_close_options_DELETE_PURGE,
	&hf_mq_close_options_DELETE      ,
	NULL
};

static int hf_mq_open_options = -1;
static int hf_mq_open_options_INPUT_SHARED = -1;
static int hf_mq_open_options_INPUT_AS_Q_DEF = -1;
static int hf_mq_open_options_INPUT_EXCLUSIVE = -1;
static int hf_mq_open_options_BROWSE = -1;
static int hf_mq_open_options_OUTPUT = -1;
static int hf_mq_open_options_INQUIRE = -1;
static int hf_mq_open_options_SET = -1;
static int hf_mq_open_options_SAVE_ALL_CTX = -1;
static int hf_mq_open_options_PASS_IDENT_CTX = -1;
static int hf_mq_open_options_PASS_ALL_CTX = -1;
static int hf_mq_open_options_SET_IDENT_CTX = -1;
static int hf_mq_open_options_SET_ALL_CONTEXT = -1;
static int hf_mq_open_options_ALT_USER_AUTH = -1;
static int hf_mq_open_options_FAIL_IF_QUIESC = -1;
static int hf_mq_open_options_BIND_ON_OPEN = -1;
static int hf_mq_open_options_BIND_NOT_FIXED = -1;
static int hf_mq_open_options_RESOLVE_NAMES = -1;
static int hf_mq_open_options_CO_OP = -1;
static int hf_mq_open_options_RESOLVE_LOCAL_Q = -1;
static int hf_mq_open_options_NO_READ_AHEAD = -1;
static int hf_mq_open_options_READ_AHEAD = -1;
static int hf_mq_open_options_NO_MULTICAST = -1;
static int hf_mq_open_options_BIND_ON_GROUP = -1;
static const int *pf_flds_opnopt[] =
{
	&hf_mq_open_options_BIND_ON_GROUP  ,
	&hf_mq_open_options_NO_MULTICAST   ,
	&hf_mq_open_options_READ_AHEAD     ,
	&hf_mq_open_options_NO_READ_AHEAD  ,
	&hf_mq_open_options_RESOLVE_LOCAL_Q,
	&hf_mq_open_options_CO_OP          ,
	&hf_mq_open_options_RESOLVE_NAMES  ,
	&hf_mq_open_options_BIND_NOT_FIXED ,
	&hf_mq_open_options_BIND_ON_OPEN   ,
	&hf_mq_open_options_FAIL_IF_QUIESC ,
	&hf_mq_open_options_ALT_USER_AUTH  ,
	&hf_mq_open_options_SET_ALL_CONTEXT,
	&hf_mq_open_options_SET_IDENT_CTX  ,
	&hf_mq_open_options_PASS_ALL_CTX   ,
	&hf_mq_open_options_PASS_IDENT_CTX ,
	&hf_mq_open_options_SAVE_ALL_CTX   ,
	&hf_mq_open_options_SET            ,
	&hf_mq_open_options_INQUIRE        ,
	&hf_mq_open_options_OUTPUT         ,
	&hf_mq_open_options_BROWSE         ,
	&hf_mq_open_options_INPUT_EXCLUSIVE,
	&hf_mq_open_options_INPUT_SHARED   ,
	&hf_mq_open_options_INPUT_AS_Q_DEF ,
	NULL
};

static int hf_mq_fopa_StructID = -1;
static int hf_mq_fopa_version = -1;
static int hf_mq_fopa_length = -1;
static int hf_mq_fopa_unknown1 = -1;
static int hf_mq_fopa_unknown2 = -1;
static int hf_mq_fopa_unknown3 = -1;
static int hf_mq_fopa_qprotect = -1;
static int hf_mq_fopa_unknown4 = -1;
static int hf_mq_fopa_unknown5 = -1;

static int hf_mq_ping_length = -1;
static int hf_mq_ping_buffer = -1;
static int hf_mq_reset_length = -1;
static int hf_mq_reset_seqnum = -1;
static int hf_mq_status_length = -1;
static int hf_mq_status_code = -1;
static int hf_mq_status_value = -1;

static int hf_mq_caut_StructID = -1;
static int hf_mq_caut_AuthType = -1;
static int hf_mq_caut_UsrMaxLen = -1;
static int hf_mq_caut_PwdMaxLen = -1;
static int hf_mq_caut_UsrLength = -1;
static int hf_mq_caut_PwdLength = -1;
static int hf_mq_caut_usr = -1;
static int hf_mq_caut_psw = -1;

static int hf_mq_od_StructID = -1;
static int hf_mq_od_version = -1;
static int hf_mq_od_objecttype = -1;
static int hf_mq_od_objectname = -1;
static int hf_mq_od_objqmgrname = -1;
static int hf_mq_od_dynqname = -1;
static int hf_mq_od_altuserid = -1;
static int hf_mq_od_recspresent = -1;
static int hf_mq_od_knowndstcnt = -1;
static int hf_mq_od_unknowdstcnt = -1;
static int hf_mq_od_invaldstcnt = -1;
static int hf_mq_od_objrecofs = -1;
static int hf_mq_od_resprecofs = -1;
static int hf_mq_od_objrecptr = -1;
static int hf_mq_od_resprecptr = -1;
static int hf_mq_od_altsecurid = -1;
static int hf_mq_od_resolvqname = -1;
static int hf_mq_od_resolvqmgrnm = -1;
static int hf_mq_od_resolvobjtyp = -1;

static int hf_mq_or_objname = -1;
static int hf_mq_or_objqmgrname = -1;
static int hf_mq_rr_compcode = -1;
static int hf_mq_rr_reascode = -1;
static int hf_mq_pmr_msgid = -1;
static int hf_mq_pmr_correlid = -1;
static int hf_mq_pmr_groupid = -1;
static int hf_mq_pmr_feedback = -1;
static int hf_mq_pmr_acttoken = -1;
static int hf_mq_md_StructID = -1;
static int hf_mq_md_version = -1;
static int hf_mq_md_report = -1;
static int hf_mq_md_msgtype = -1;
static int hf_mq_md_expiry = -1;
static int hf_mq_md_feedback = -1;
static int hf_mq_md_encoding = -1;
static int hf_mq_md_ccsid = -1;
static int hf_mq_md_format = -1;
static int hf_mq_md_priority = -1;
static int hf_mq_md_persistence = -1;
static int hf_mq_md_msgid = -1;
static int hf_mq_md_correlid = -1;
static int hf_mq_md_backoutcnt = -1;
static int hf_mq_md_replytoq = -1;
static int hf_mq_md_replytoqmgr = -1;
static int hf_mq_md_userid = -1;
static int hf_mq_md_acttoken = -1;
static int hf_mq_md_appliddata = -1;
static int hf_mq_md_putappltype = -1;
static int hf_mq_md_putapplname = -1;
static int hf_mq_md_putdate = -1;
static int hf_mq_md_puttime = -1;
static int hf_mq_md_apporigdata = -1;
static int hf_mq_md_groupid = -1;
static int hf_mq_md_msgseqnumber = -1;
static int hf_mq_md_offset = -1;
static int hf_mq_md_msgflags = -1;
static int hf_mq_md_origlen = -1;
static int hf_mq_dlh_StructID = -1;
static int hf_mq_dlh_version = -1;
static int hf_mq_dlh_reason = -1;
static int hf_mq_dlh_destq = -1;
static int hf_mq_dlh_destqmgr = -1;
static int hf_mq_dlh_encoding = -1;
static int hf_mq_dlh_ccsid = -1;
static int hf_mq_dlh_format = -1;
static int hf_mq_dlh_putappltype = -1;
static int hf_mq_dlh_putapplname = -1;
static int hf_mq_dlh_putdate = -1;
static int hf_mq_dlh_puttime = -1;
static int hf_mq_dh_putmsgrecfld = -1;
static int hf_mq_dh_recspresent = -1;
static int hf_mq_dh_objrecofs = -1;
static int hf_mq_dh_putmsgrecofs = -1;
static int hf_mq_gmo_StructID = -1;
static int hf_mq_gmo_version = -1;
static int hf_mq_gmo_options = -1;
static int hf_mq_gmo_waitinterval = -1;
static int hf_mq_gmo_signal1 = -1;
static int hf_mq_gmo_signal2 = -1;
static int hf_mq_gmo_resolvqname = -1;
static int hf_mq_gmo_matchoptions = -1;
static int hf_mq_gmo_groupstatus = -1;
static int hf_mq_gmo_segmstatus = -1;
static int hf_mq_gmo_segmentation = -1;
static int hf_mq_gmo_reserved = -1;
static int hf_mq_gmo_msgtoken = -1;
static int hf_mq_gmo_returnedlen = -1;

static int hf_mq_gmo_options_PROPERTIES_COMPATIBILITY = -1;
static int hf_mq_gmo_options_PROPERTIES_IN_HANDLE = -1;
static int hf_mq_gmo_options_NO_PROPERTIES = -1;
static int hf_mq_gmo_options_PROPERTIES_FORCE_MQRFH2 = -1;
static int hf_mq_gmo_options_UNMARKED_BROWSE_MSG = -1;
static int hf_mq_gmo_options_UNMARK_BROWSE_HANDLE = -1;
static int hf_mq_gmo_options_UNMARK_BROWSE_CO_OP = -1;
static int hf_mq_gmo_options_MARK_BROWSE_CO_OP = -1;
static int hf_mq_gmo_options_MARK_BROWSE_HANDLE = -1;
static int hf_mq_gmo_options_ALL_SEGMENTS_AVAILABLE = -1;
static int hf_mq_gmo_options_ALL_MSGS_AVAILABLE = -1;
static int hf_mq_gmo_options_COMPLETE_MSG = -1;
static int hf_mq_gmo_options_LOGICAL_ORDER = -1;
static int hf_mq_gmo_options_CONVERT = -1;
static int hf_mq_gmo_options_FAIL_IF_QUIESCING = -1;
static int hf_mq_gmo_options_SYNCPOINT_IF_PERSISTENT = -1;
static int hf_mq_gmo_options_BROWSE_MSG_UNDER_CURSOR = -1;
static int hf_mq_gmo_options_UNLOCK = -1;
static int hf_mq_gmo_options_LOCK = -1;
static int hf_mq_gmo_options_MSG_UNDER_CURSOR = -1;
static int hf_mq_gmo_options_MARK_SKIP_BACKOUT = -1;
static int hf_mq_gmo_options_ACCEPT_TRUNCATED_MSG = -1;
static int hf_mq_gmo_options_BROWSE_NEXT = -1;
static int hf_mq_gmo_options_BROWSE_FIRST = -1;
static int hf_mq_gmo_options_SET_SIGNAL = -1;
static int hf_mq_gmo_options_NO_SYNCPOINT = -1;
static int hf_mq_gmo_options_SYNCPOINT = -1;
static int hf_mq_gmo_options_WAIT = -1;
static const int *pf_flds_gmoopt[] =
{
	&hf_mq_gmo_options_PROPERTIES_COMPATIBILITY,
	&hf_mq_gmo_options_PROPERTIES_IN_HANDLE    ,
	&hf_mq_gmo_options_NO_PROPERTIES           ,
	&hf_mq_gmo_options_PROPERTIES_FORCE_MQRFH2 ,
	&hf_mq_gmo_options_UNMARKED_BROWSE_MSG     ,
	&hf_mq_gmo_options_UNMARK_BROWSE_HANDLE    ,
	&hf_mq_gmo_options_UNMARK_BROWSE_CO_OP     ,
	&hf_mq_gmo_options_MARK_BROWSE_CO_OP       ,
	&hf_mq_gmo_options_MARK_BROWSE_HANDLE      ,
	&hf_mq_gmo_options_ALL_SEGMENTS_AVAILABLE  ,
	&hf_mq_gmo_options_ALL_MSGS_AVAILABLE      ,
	&hf_mq_gmo_options_COMPLETE_MSG            ,
	&hf_mq_gmo_options_LOGICAL_ORDER           ,
	&hf_mq_gmo_options_CONVERT                 ,
	&hf_mq_gmo_options_FAIL_IF_QUIESCING       ,
	&hf_mq_gmo_options_SYNCPOINT_IF_PERSISTENT ,
	&hf_mq_gmo_options_BROWSE_MSG_UNDER_CURSOR ,
	&hf_mq_gmo_options_UNLOCK                  ,
	&hf_mq_gmo_options_LOCK                    ,
	&hf_mq_gmo_options_MSG_UNDER_CURSOR        ,
	&hf_mq_gmo_options_MARK_SKIP_BACKOUT       ,
	&hf_mq_gmo_options_ACCEPT_TRUNCATED_MSG    ,
	&hf_mq_gmo_options_BROWSE_NEXT             ,
	&hf_mq_gmo_options_BROWSE_FIRST            ,
	&hf_mq_gmo_options_SET_SIGNAL              ,
	&hf_mq_gmo_options_NO_SYNCPOINT            ,
	&hf_mq_gmo_options_SYNCPOINT               ,
	&hf_mq_gmo_options_WAIT                    ,
	NULL
};

static int hf_mq_gmo_matchoptions_MATCH_MSG_TOKEN = -1;
static int hf_mq_gmo_matchoptions_MATCH_OFFSET = -1;
static int hf_mq_gmo_matchoptions_MATCH_MSG_SEQ_NUMBER = -1;
static int hf_mq_gmo_matchoptions_MATCH_GROUP_ID = -1;
static int hf_mq_gmo_matchoptions_MATCH_CORREL_ID = -1;
static int hf_mq_gmo_matchoptions_MATCH_MSG_ID = -1;
static const int *pf_flds_mtchopt[] =
{
	&hf_mq_gmo_matchoptions_MATCH_MSG_TOKEN     ,
	&hf_mq_gmo_matchoptions_MATCH_OFFSET        ,
	&hf_mq_gmo_matchoptions_MATCH_MSG_SEQ_NUMBER,
	&hf_mq_gmo_matchoptions_MATCH_GROUP_ID      ,
	&hf_mq_gmo_matchoptions_MATCH_CORREL_ID     ,
	&hf_mq_gmo_matchoptions_MATCH_MSG_ID        ,
	NULL
};

static int hf_mq_lpoo_StructID = -1;
static int hf_mq_lpoo_version = -1;
static int hf_mq_lpoo_options = -1;
static int hf_mq_lpoo_lpiopts = -1;
static int hf_mq_lpoo_defpersist = -1;
static int hf_mq_lpoo_defputresptype = -1;
static int hf_mq_lpoo_defreadahead = -1;
static int hf_mq_lpoo_qprotect = -1;
static int hf_mq_lpoo_unknown6 = -1;
/*static int hf_mq_lpoo_unknown7 = -1;*/
static int hf_mq_lpoo_xtradata = -1;

static int hf_mq_lpoo_lpiopts_SAVE_IDENTITY_CTXT = -1;
static int hf_mq_lpoo_lpiopts_SAVE_ORIGIN_CTXT = -1 ;
static int hf_mq_lpoo_lpiopts_SAVE_USER_CTXT = -1;
static const int *pf_flds_lpooopt[] =
{
	&hf_mq_lpoo_lpiopts_SAVE_IDENTITY_CTXT,
	&hf_mq_lpoo_lpiopts_SAVE_ORIGIN_CTXT,
	&hf_mq_lpoo_lpiopts_SAVE_USER_CTXT,
	NULL
};


static int hf_mq_charv_vsptr = -1;
static int hf_mq_charv_vsoffset = -1;
static int hf_mq_charv_vsbufsize = -1;
static int hf_mq_charv_vslength = -1;
static int hf_mq_charv_vsccsid = -1;
static int hf_mq_charv_vsvalue = -1;

static int hf_mq_pmo_StructID = -1;
static int hf_mq_pmo_version = -1;
static int hf_mq_pmo_options = -1;
static int hf_mq_pmo_timeout = -1;
static int hf_mq_pmo_context = -1;
static int hf_mq_pmo_knowndstcnt = -1;
static int hf_mq_pmo_unkndstcnt = -1;
static int hf_mq_pmo_invaldstcnt = -1;
static int hf_mq_pmo_resolvqname = -1;
static int hf_mq_pmo_resolvqmgr = -1;
static int hf_mq_pmo_recspresent = -1;
static int hf_mq_pmo_putmsgrecfld = -1;
static int hf_mq_pmo_putmsgrecofs = -1;
static int hf_mq_pmo_resprecofs = -1;
static int hf_mq_pmo_putmsgrecptr = -1;
static int hf_mq_pmo_resprecptr = -1;
static int hf_mq_head_StructID = -1;
static int hf_mq_head_version = -1;
static int hf_mq_head_length = -1;
static int hf_mq_head_encoding = -1;
static int hf_mq_head_ccsid = -1;
static int hf_mq_head_format = -1;
static int hf_mq_head_flags = -1;
static int hf_mq_head_struct = -1;
static int hf_mq_xa_length = -1;
static int hf_mq_xa_returnvalue = -1;
static int hf_mq_xa_tmflags = -1;
static int hf_mq_xa_rmid = -1;
static int hf_mq_xa_count = -1;
static int hf_mq_xa_xid_formatid = -1;
static int hf_mq_xa_xid_glbxid_len = -1;
static int hf_mq_xa_xid_brq_length = -1;
static int hf_mq_xa_xid_globalxid = -1;
static int hf_mq_xa_xid_brq = -1;
static int hf_mq_xa_xainfo_length = -1;
static int hf_mq_xa_xainfo_value = -1;

static int hf_mq_pmo_options_NOT_OWN_SUBS = -1;
static int hf_mq_pmo_options_SUPPRESS_REPLYTO = -1;
static int hf_mq_pmo_options_SCOPE_QMGR = -1;
static int hf_mq_pmo_options_MD_FOR_OUTPUT_ONLY = -1;
static int hf_mq_pmo_options_RETAIN = -1;
static int hf_mq_pmo_options_WARN_IF_NO_SUBS_MATCHED = -1;
static int hf_mq_pmo_options_RESOLVE_LOCAL_Q = -1;
static int hf_mq_pmo_options_SYNC_RESPONSE = -1;
static int hf_mq_pmo_options_ASYNC_RESPONSE = -1;
static int hf_mq_pmo_options_LOGICAL_ORDER = -1;
static int hf_mq_pmo_options_NO_CONTEXT = -1;
static int hf_mq_pmo_options_FAIL_IF_QUIESCING = -1;
static int hf_mq_pmo_options_ALTERNATE_USER_AUTHORITY = -1;
static int hf_mq_pmo_options_SET_ALL_CONTEXT = -1;
static int hf_mq_pmo_options_SET_IDENTITY_CONTEXT = -1;
static int hf_mq_pmo_options_PASS_ALL_CONTEXT = -1;
static int hf_mq_pmo_options_PASS_IDENTITY_CONTEXT = -1;
static int hf_mq_pmo_options_NEW_CORREL_ID = -1;
static int hf_mq_pmo_options_NEW_MSG_ID = -1;
static int hf_mq_pmo_options_DEFAULT_CONTEXT = -1;
static int hf_mq_pmo_options_NO_SYNCPOINT = -1;
static int hf_mq_pmo_options_SYNCPOINT = -1;
static const int *pf_flds_pmoopt[] =
{
	&hf_mq_pmo_options_NOT_OWN_SUBS            ,
	&hf_mq_pmo_options_SUPPRESS_REPLYTO        ,
	&hf_mq_pmo_options_SCOPE_QMGR              ,
	&hf_mq_pmo_options_MD_FOR_OUTPUT_ONLY      ,
	&hf_mq_pmo_options_RETAIN                  ,
	&hf_mq_pmo_options_WARN_IF_NO_SUBS_MATCHED ,
	&hf_mq_pmo_options_RESOLVE_LOCAL_Q         ,
	&hf_mq_pmo_options_SYNC_RESPONSE           ,
	&hf_mq_pmo_options_ASYNC_RESPONSE          ,
	&hf_mq_pmo_options_LOGICAL_ORDER           ,
	&hf_mq_pmo_options_NO_CONTEXT              ,
	&hf_mq_pmo_options_FAIL_IF_QUIESCING       ,
	&hf_mq_pmo_options_ALTERNATE_USER_AUTHORITY,
	&hf_mq_pmo_options_SET_ALL_CONTEXT         ,
	&hf_mq_pmo_options_SET_IDENTITY_CONTEXT    ,
	&hf_mq_pmo_options_PASS_ALL_CONTEXT        ,
	&hf_mq_pmo_options_PASS_IDENTITY_CONTEXT   ,
	&hf_mq_pmo_options_NEW_CORREL_ID           ,
	&hf_mq_pmo_options_NEW_MSG_ID              ,
	&hf_mq_pmo_options_DEFAULT_CONTEXT         ,
	&hf_mq_pmo_options_NO_SYNCPOINT            ,
	&hf_mq_pmo_options_SYNCPOINT               ,
	NULL
};

static int hf_mq_xa_tmflags_join = -1;
static int hf_mq_xa_tmflags_endrscan = -1;
static int hf_mq_xa_tmflags_startrscan = -1;
static int hf_mq_xa_tmflags_suspend = -1;
static int hf_mq_xa_tmflags_success = -1;
static int hf_mq_xa_tmflags_resume = -1;
static int hf_mq_xa_tmflags_fail = -1;
static int hf_mq_xa_tmflags_onephase = -1;
static const int *pf_flds_tmflags[] =
{
	&hf_mq_xa_tmflags_onephase  ,
	&hf_mq_xa_tmflags_fail      ,
	&hf_mq_xa_tmflags_resume    ,
	&hf_mq_xa_tmflags_success   ,
	&hf_mq_xa_tmflags_suspend   ,
	&hf_mq_xa_tmflags_startrscan,
	&hf_mq_xa_tmflags_endrscan  ,
	&hf_mq_xa_tmflags_join      ,
	NULL
};

static int hf_mq_msgreq_version = -1;
static int hf_mq_msgreq_handle = -1;
static int hf_mq_msgreq_RecvBytes = -1;
static int hf_mq_msgreq_RqstBytes = -1;
static int hf_mq_msgreq_MaxMsgLen = -1;
static int hf_mq_msgreq_WaitIntrv = -1;
static int hf_mq_msgreq_QueStatus = -1;
static int hf_mq_msgreq_RqstFlags = -1;
static int hf_mq_msgreq_GlbMsgIdx = -1;
static int hf_mq_msgreq_SelectIdx = -1;
static int hf_mq_msgreq_MQMDVers = -1;
static int hf_mq_msgreq_ccsid = -1;
static int hf_mq_msgreq_encoding = -1;
static int hf_mq_msgreq_MsgSeqNum = -1;
static int hf_mq_msgreq_offset = -1;
static int hf_mq_msgreq_mtchMsgId = -1;
static int hf_mq_msgreq_mtchCorId = -1;
static int hf_mq_msgreq_mtchGrpid = -1;
static int hf_mq_msgreq_mtchMsgTk = -1;

static int hf_mq_msgasy_version = -1;
static int hf_mq_msgasy_handle = -1;
static int hf_mq_msgasy_MsgIndex = -1;
static int hf_mq_msgasy_GlbMsgIdx = -1;
static int hf_mq_msgasy_SegLength = -1;
static int hf_mq_msgasy_SeleIndex = -1;
static int hf_mq_msgasy_SegmIndex = -1;
static int hf_mq_msgasy_ReasonCod = -1;
static int hf_mq_msgasy_ActMsgLen = -1;
static int hf_mq_msgasy_TotMsgLen = -1;
static int hf_mq_msgasy_MsgToken = -1;
static int hf_mq_msgasy_Status = -1;
static int hf_mq_msgasy_resolQNLn = -1;
static int hf_mq_msgasy_resolQNme = -1;
static int hf_mq_msgasy_padding = -1;

static int hf_mq_notif_vers   = -1;
static int hf_mq_notif_handle = -1;
static int hf_mq_notif_code   = -1;
static int hf_mq_notif_value  = -1;

static gint ett_mq = -1;
static gint ett_mq_tsh = -1;
static gint ett_mq_tsh_tcf = -1;
static gint ett_mq_tsh_tcf2 = -1;
static gint ett_mq_api = -1;
static gint ett_mq_socket = -1;
static gint ett_mq_caut = -1;
static gint ett_mq_msh = -1;
static gint ett_mq_xqh = -1;
static gint ett_mq_id = -1;
static gint ett_mq_id_icf1 = -1;
static gint ett_mq_id_icf2 = -1;
static gint ett_mq_id_icf3 = -1;
static gint ett_mq_id_ief1 = -1;
static gint ett_mq_id_ief2 = -1;
static gint ett_mq_uid = -1;
static gint ett_mq_conn = -1;
static gint ett_mq_fcno = -1;
static gint ett_mq_msg = -1;
static gint ett_mq_inq = -1;
static gint ett_mq_spi = -1;
static gint ett_mq_spi_base = -1; /* Factorisation of common SPI items */
static gint ett_mq_spi_options = -1;
static gint ett_mq_put = -1;
static gint ett_mq_open = -1;
static gint ett_mq_open_option = -1;
static gint ett_mq_close_option = -1;
static gint ett_mq_fopa = -1;
static gint ett_mq_ping = -1;
static gint ett_mq_reset = -1;
static gint ett_mq_status = -1;
static gint ett_mq_od = -1;
static gint ett_mq_od_objstr = -1;
static gint ett_mq_od_selstr = -1;
static gint ett_mq_od_resobjstr = -1;
static gint ett_mq_or = -1;
static gint ett_mq_rr = -1;
static gint ett_mq_pmr = -1;
static gint ett_mq_md = -1;
static gint ett_mq_mde = -1;
static gint ett_mq_dlh = -1;
static gint ett_mq_dh = -1;
static gint ett_mq_gmo = -1;
static gint ett_mq_gmo_option = -1;
static gint ett_mq_gmo_matchoption = -1;
static gint ett_mq_pmo = -1;
static gint ett_mq_pmo_option = -1;

static gint ett_mq_lpoo = -1;
static gint ett_mq_lpoo_options = -1;
static gint ett_mq_lpoo_lpiopts = -1;

static gint ett_mq_head = -1; /* Factorisation of common Header structure items (DH, MDE, CIH, IIH, RFH, RMH, WIH */
static gint ett_mq_xa = -1;
static gint ett_mq_xa_tmflags = -1;
static gint ett_mq_xa_xid = -1;
static gint ett_mq_xa_info = -1;
static gint ett_mq_charv = -1;
static gint ett_mq_reaasemb = -1;
static gint ett_mq_notif = -1;

static dissector_handle_t mq_tcp_handle;
static dissector_handle_t mq_spx_handle;
static dissector_handle_t data_handle;
static dissector_handle_t mqpcf_handle;

static heur_dissector_list_t mq_heur_subdissector_list;

static gboolean mq_desegment = TRUE;
static gboolean mq_reassembly = TRUE;

static gboolean mq_in_reassembly = FALSE;

static reassembly_table mq_reassembly_table;

#define MQ_PORT_TCP    1414
#define MQ_SOCKET_SPX  0x5E86

#define MQ_XPT_TCP      0x02
#define MQ_XPT_NETBIOS  0x03
#define MQ_XPT_SPX      0x04
#define MQ_XPT_HTTP     0x07

#define MQ_STRUCTID_NULL          0x00000000

#define MQ_STRUCTID_CIH           0x43494820
#define MQ_STRUCTID_DH            0x44482020
#define MQ_STRUCTID_DLH           0x444C4820
#define MQ_STRUCTID_GMO           0x474D4F20
#define MQ_STRUCTID_ID            0x49442020
#define MQ_STRUCTID_IIH           0x49494820
#define MQ_STRUCTID_MD            0x4D442020
#define MQ_STRUCTID_MDE           0x4D444520
#define MQ_STRUCTID_MSH           0x4D534820
#define MQ_STRUCTID_OD            0x4F442020
#define MQ_STRUCTID_PMO           0x504D4F20
#define MQ_STRUCTID_RFH           0x52464820
#define MQ_STRUCTID_RMH           0x524D4820
#define MQ_STRUCTID_TM            0x544D2020
#define MQ_STRUCTID_TMC2          0x544D4332
#define MQ_STRUCTID_CAUT          0x43415554

#define MQ_STRUCTID_TSH           0x54534820
#define MQ_STRUCTID_TSHC          0x54534843
#define MQ_STRUCTID_TSHM          0x5453484D

#define MQ_MASK_TSHx              0xffffff00
#define MQ_STRUCTID_TSHx          0x54534800 /* TSHx */

#define MQ_STRUCTID_SPxx          0x53500000 /* SPxx */
#define MQ_STRUCTID_UID           0x55494420
#define MQ_STRUCTID_WIH           0x57494820
#define MQ_STRUCTID_XQH           0x58514820
#define MQ_STRUCTID_FOPA          0x464F5041

#define MQ_STRUCTID_CIH_EBCDIC    0xC3C9C840
#define MQ_STRUCTID_DH_EBCDIC     0xC4C84040
#define MQ_STRUCTID_DLH_EBCDIC    0xC4D3C840
#define MQ_STRUCTID_GMO_EBCDIC    0xC7D4D640
#define MQ_STRUCTID_ID_EBCDIC     0xC9C44040
#define MQ_STRUCTID_IIH_EBCDIC    0xC9C9C840
#define MQ_STRUCTID_MD_EBCDIC     0xD4C44040
#define MQ_STRUCTID_MDE_EBCDIC    0xD4C4C540
#define MQ_STRUCTID_MSH_EBCDIC    0xD4E2C840
#define MQ_STRUCTID_OD_EBCDIC     0xD6C44040
#define MQ_STRUCTID_PMO_EBCDIC    0xD7D4D640
#define MQ_STRUCTID_RFH_EBCDIC    0xD9C6C840
#define MQ_STRUCTID_RMH_EBCDIC    0xD9D4C840
#define MQ_STRUCTID_TM_EBCDIC     0xE3D44040
#define MQ_STRUCTID_TMC2_EBCDIC   0xE3D4C3F2
#define MQ_STRUCTID_CAUT_EBCDIC   0xC3C1E4E3

#define MQ_STRUCTID_TSH_EBCDIC    0xE3E2C840
#define MQ_STRUCTID_TSHC_EBCDIC   0xE3E2C8C3
#define MQ_STRUCTID_TSHM_EBCDIC   0xE3E2C8D4
#define MQ_STRUCTID_TSHx_EBCDIC   0xE3E2C800

#define MQ_STRUCTID_UID_EBCDIC    0xE4C9C440
#define MQ_STRUCTID_WIH_EBCDIC    0xE6C9C840
#define MQ_STRUCTID_XQH_EBCDIC    0xE7D8C840
#define MQ_STRUCTID_FOPA_EBCDIC   0xD64FD7C1

#define MQ_MASK_SPxx              0xffff0000
#define MQ_MASK_SPxZ              0xffff00ff

#define MQ_STRUCTID_SPxx          0x53500000 /* SPxx */
#define MQ_STRUCTID_SPxU          0x53500055 /* SPxU */
#define MQ_STRUCTID_SPxI          0x53500049 /* SPxI */
#define MQ_STRUCTID_SPxO          0x5350004F /* SPxO */

#define MQ_STRUCTID_SPQU          0x53505155 /* SPI Query InOut */
#define MQ_STRUCTID_SPQI          0x53505149 /* SPI Query In */
#define MQ_STRUCTID_SPQO          0x5350514F /* SPI Query Out */
#define MQ_STRUCTID_SPPU          0x53505055 /* SPI Put InOut */
#define MQ_STRUCTID_SPPI          0x53505049 /* SPI Put In */
#define MQ_STRUCTID_SPPO          0x5350504F /* SPI Put Out */
#define MQ_STRUCTID_SPGU          0x53504755 /* SPI Get InOut */
#define MQ_STRUCTID_SPGI          0x53504749 /* SPI Get In */
#define MQ_STRUCTID_SPGO          0x5350474F /* SPI Get Out */
#define MQ_STRUCTID_SPAU          0x53504155 /* SPI Activate InOut */
#define MQ_STRUCTID_SPAI          0x53504149 /* SPI Activate In */
#define MQ_STRUCTID_SPAO          0x5350414F /* SPI Activate Out */
#define MQ_STRUCTID_SPOU          0x53504F55 /* SPI InOut */
#define MQ_STRUCTID_SPOI          0x53504F49 /* SPI In */
#define MQ_STRUCTID_SPOO          0x53504F4F /* SPI Out */
#define MQ_STRUCTID_LPOO          0x4C504F4F /* LPOO */
#define MQ_STRUCTID_FCNO          0x46434E4F /* FCNO */

#define MQ_STRUCTID_SPxx_EBCDIC   0xE2D70000 /* SPxx */
#define MQ_STRUCTID_SPxU_EBCDIC   0xE2D700E4 /* SPxU */
#define MQ_STRUCTID_SPxI_EBCDIC   0xE2D700C9 /* SPxI */
#define MQ_STRUCTID_SPxO_EBCDIC   0xE2D700D6 /* SPxO */

#define MQ_STRUCTID_SPQU_EBCDIC   0xE2D7D8E4 /* SPI Query InOut */
#define MQ_STRUCTID_SPQI_EBCDIC   0xE2D7D8C9 /* SPI Query In */
#define MQ_STRUCTID_SPQO_EBCDIC   0xE2D7D8D6 /* SPI Query Out */
#define MQ_STRUCTID_SPPU_EBCDIC   0xE2D7D7E4 /* SPI Put InOut */
#define MQ_STRUCTID_SPPI_EBCDIC   0xE2D7D7C9 /* SPI Put In */
#define MQ_STRUCTID_SPPO_EBCDIC   0xE2D7D7D6 /* SPI Put Out */
#define MQ_STRUCTID_SPGU_EBCDIC   0xE2D7C7E4 /* SPI Get InOut */
#define MQ_STRUCTID_SPGI_EBCDIC   0xE2D7C7C9 /* SPI Get In */
#define MQ_STRUCTID_SPGO_EBCDIC   0xE2D7C7D6 /* SPI Get Out */
#define MQ_STRUCTID_SPAU_EBCDIC   0xE2D7C1E4 /* SPI Activate InOut */
#define MQ_STRUCTID_SPAI_EBCDIC   0xE2D7C1C9 /* SPI Activate In */
#define MQ_STRUCTID_SPAO_EBCDIC   0xE2D7C1D6 /* SPI Activate Out */
#define MQ_STRUCTID_SPOU_EBCDIC   0xE2D7D6E4 /* SPI InOut */
#define MQ_STRUCTID_SPOI_EBCDIC   0xE2D7D6C9 /* SPI In */
#define MQ_STRUCTID_SPOO_EBCDIC   0xE2D7D6D6 /* SPI Out */
#define MQ_STRUCTID_LPOO_EBCDIC   0xD3D7D6D6 /* LPOO */
#define MQ_STRUCTID_FCNO_EBCDIC   0xC6C3D5D6 /* FCNO */

#define MQ_TST_INITIAL            0x01
#define MQ_TST_RESYNC             0x02
#define MQ_TST_RESET              0x03
#define MQ_TST_MESSAGE            0x04
#define MQ_TST_STATUS             0x05
#define MQ_TST_SECURITY           0x06
#define MQ_TST_PING               0x07
#define MQ_TST_USERID             0x08
#define MQ_TST_HEARTBEAT          0x09
#define MQ_TST_CONAUTH_INFO       0x0A
#define MQ_TST_RENEGOTIATE_DATA   0x0B
#define MQ_TST_SOCKET_ACTION      0x0C
#define MQ_TST_ASYNC_MESSAGE      0x0D
#define MQ_TST_REQUEST_MSGS       0x0E
#define MQ_TST_NOTIFICATION       0x0F
#define MQ_TST_MQCONN             0x81
#define MQ_TST_MQDISC             0x82
#define MQ_TST_MQOPEN             0x83
#define MQ_TST_MQCLOSE            0x84
#define MQ_TST_MQGET              0x85
#define MQ_TST_MQPUT              0x86
#define MQ_TST_MQPUT1             0x87
#define MQ_TST_MQSET              0x88
#define MQ_TST_MQINQ              0x89
#define MQ_TST_MQCMIT             0x8A
#define MQ_TST_MQBACK             0x8B
#define MQ_TST_SPI                0x8C
#define MQ_TST_MQSTAT             0x8D
#define MQ_TST_MQSUB              0x8E
#define MQ_TST_MQSUBRQ            0x8F
#define MQ_TST_MQCONN_REPLY       0x91
#define MQ_TST_MQDISC_REPLY       0x92
#define MQ_TST_MQOPEN_REPLY       0x93
#define MQ_TST_MQCLOSE_REPLY      0x94
#define MQ_TST_MQGET_REPLY        0x95
#define MQ_TST_MQPUT_REPLY        0x96
#define MQ_TST_MQPUT1_REPLY       0x97
#define MQ_TST_MQSET_REPLY        0x98
#define MQ_TST_MQINQ_REPLY        0x99
#define MQ_TST_MQCMIT_REPLY       0x9A
#define MQ_TST_MQBACK_REPLY       0x9B
#define MQ_TST_SPI_REPLY          0x9C
#define MQ_TST_MQSTAT_REPLY       0x9D
#define MQ_TST_MQSUB_REPLY        0x9E
#define MQ_TST_MQSUBRQ_REPLY      0x9F
#define MQ_TST_XA_START           0xA1
#define MQ_TST_XA_END             0xA2
#define MQ_TST_XA_OPEN            0xA3
#define MQ_TST_XA_CLOSE           0xA4
#define MQ_TST_XA_PREPARE         0xA5
#define MQ_TST_XA_COMMIT          0xA6
#define MQ_TST_XA_ROLLBACK        0xA7
#define MQ_TST_XA_FORGET          0xA8
#define MQ_TST_XA_RECOVER         0xA9
#define MQ_TST_XA_COMPLETE        0xAA
#define MQ_TST_XA_START_REPLY     0xB1
#define MQ_TST_XA_END_REPLY       0xB2
#define MQ_TST_XA_OPEN_REPLY      0xB3
#define MQ_TST_XA_CLOSE_REPLY     0xB4
#define MQ_TST_XA_PREPARE_REPLY   0xB5
#define MQ_TST_XA_COMMIT_REPLY    0xB6
#define MQ_TST_XA_ROLLBACK_REPLY  0xB7
#define MQ_TST_XA_FORGET_REPLY    0xB8
#define MQ_TST_XA_RECOVER_REPLY   0xB9
#define MQ_TST_XA_COMPLETE_REPLY  0xBA

#define MQ_SPI_QUERY              0x01
#define MQ_SPI_PUT                0x02
#define MQ_SPI_GET                0x03
#define MQ_SPI_ACTIVATE           0x04
#define MQ_SPI_OPEN               0x0C

#define MQ_SPI_ACTIVATE_ENABLE    0x01
#define MQ_SPI_ACTIVATE_DISABLE   0x02

#define MQ_SPI_OPTIONS_BLANK_PADDED  0x01
#define MQ_SPI_OPTIONS_SYNCPOINT     0x02
#define MQ_SPI_OPTIONS_DEFERRED      0x04

#define MQ_TCF_CONFIRM_REQUEST    0x01
#define MQ_TCF_ERROR              0x02
#define MQ_TCF_REQUEST_CLOSE      0x04
#define MQ_TCF_CLOSE_CHANNEL      0x08
#define MQ_TCF_FIRST              0x10
#define MQ_TCF_LAST               0x20
#define MQ_TCF_REQUEST_ACCEPTED   0x40
#define MQ_TCF_DLQ_USED           0x80

#define MQ_TCF2_HDRCOMP           0x01
#define MQ_TCF2_MSGCOMP           0x02
#define MQ_TCF2_CSH               0x04
#define MQ_TCF2_CMIT_INTERVAL     0x08

#define MQ_ICF1_MSG_SEQ            0x01
#define MQ_ICF1_CONVERSION_CAPABLE 0x02
#define MQ_ICF1_SPLIT_MESSAGE      0x04
#define MQ_ICF1_REQUEST_INITIATION 0x08
#define MQ_ICF1_REQUEST_SECURITY   0x10
#define MQ_ICF1_MQREQUEST          0x20
#define MQ_ICF1_SVRCONN_SECURITY   0x40
#define MQ_ICF1_RUNTIME            0x80

#define MQ_ICF2_DIST_LIST_CAPABLE      0x01
#define MQ_ICF2_FAST_MESSAGES_REQUIRED 0x02
#define MQ_ICF2_RESPONDER_CONVERSION   0x04
#define MQ_ICF2_DUAL_UOW               0x08
#define MQ_ICF2_XAREQUEST              0x10
#define MQ_ICF2_XARUNTIME_APP          0x20
#define MQ_ICF2_SPIREQUEST             0x40
#define MQ_ICF2_TRACE_ROUTE_CAPABLE    0x80

#define MQ_ICF3_MSG_PROP_CAPABLE       0x01
#define MQ_ICF3_UNKNOWNX02             0x02

#define MQ_IEF1_CCSID                  0x01
#define MQ_IEF1_ENCODING               0x02
#define MQ_IEF1_MAX_TRANSMISSION_SIZE  0x04
#define MQ_IEF1_FAP_LEVEL              0x08
#define MQ_IEF1_MAX_MSG_SIZE           0x10
#define MQ_IEF1_MAX_MSG_PER_BATCH      0x20
#define MQ_IEF1_SEQ_WRAP_VALUE         0x40
#define MQ_IEF1_HEARTBEAT_INTERVAL     0x80

#define MQ_IEF2_HDRCOMPLIST           0x01
#define MQ_IEF2_MSGCOMPLIST           0x02
#define MQ_IEF2_SSL_RESET             0x04

#define MQ_BIG_ENDIAN          0x01
#define MQ_LITTLE_ENDIAN       0x02

#define MQ_CONN_VERSION        0x01
#define MQ_CONNX_VERSION       0x03

#define MQ_STATUS_ERR_NO_CHANNEL              0x01
#define MQ_STATUS_ERR_CHANNEL_WRONG_TYPE      0x02
#define MQ_STATUS_ERR_QM_UNAVAILABLE          0x03
#define MQ_STATUS_ERR_MSG_SEQUENCE_ERROR      0x04
#define MQ_STATUS_ERR_QM_TERMINATING          0x05
#define MQ_STATUS_ERR_CAN_NOT_STORE           0x06
#define MQ_STATUS_ERR_USER_CLOSED             0x07
#define MQ_STATUS_ERR_TIMEOUT_EXPIRED         0x08
#define MQ_STATUS_ERR_TARGET_Q_UNKNOWN        0x09
#define MQ_STATUS_ERR_PROTOCOL_SEGMENT_TYPE   0x0A
#define MQ_STATUS_ERR_PROTOCOL_LENGTH_ERROR   0x0B
#define MQ_STATUS_ERR_PROTOCOL_INVALID_DATA   0x0C
#define MQ_STATUS_ERR_PROTOCOL_SEGMENT_ERROR  0x0D
#define MQ_STATUS_ERR_PROTOCOL_ID_ERROR       0x0E
#define MQ_STATUS_ERR_PROTOCOL_MSH_ERROR      0x0F
#define MQ_STATUS_ERR_PROTOCOL_GENERAL        0x10
#define MQ_STATUS_ERR_BATCH_FAILURE           0x11
#define MQ_STATUS_ERR_MESSAGE_LENGTH_ERROR    0x12
#define MQ_STATUS_ERR_SEGMENT_NUMBER_ERROR    0x13
#define MQ_STATUS_ERR_SECURITY_FAILURE        0x14
#define MQ_STATUS_ERR_WRAP_VALUE_ERROR        0x15
#define MQ_STATUS_ERR_CHANNEL_UNAVAILABLE     0x16
#define MQ_STATUS_ERR_CLOSED_BY_EXIT          0x17
#define MQ_STATUS_ERR_CIPHER_SPEC             0x18
#define MQ_STATUS_ERR_PEER_NAME               0x19
#define MQ_STATUS_ERR_SSL_CLIENT_CERTIFICATE  0x1A
#define MQ_STATUS_ERR_RMT_RSRCS_IN_RECOVERY   0x1B
#define MQ_STATUS_ERR_SSL_REFRESHING          0x1C
#define MQ_STATUS_ERR_INVALID_HOBJ            0x1D
#define MQ_STATUS_ERR_CONV_ID_ERROR           0x1E
#define MQ_STATUS_ERR_SOCKET_ACTION_TYPE      0x1F
#define MQ_STATUS_ERR_STANDBY_Q_MGR           0x20

#define MQ_STATUS_ERR_CCSID_NOT_SUPPORTED     0xF0
#define MQ_STATUS_ERR_ENCODING_INVALID        0xF1
#define MQ_STATUS_ERR_FAP_LEVEL               0xF2
#define MQ_STATUS_ERR_NEGOTIATION_FAILED      0xF3

/* These errors codes are documented in javax.transaction.xa.XAException */
#define MQ_XA_RBROLLBACK   100
#define MQ_XA_RBCOMMFAIL   101
#define MQ_XA_RBDEADLOCK   102
#define MQ_XA_RBINTEGRITY  103
#define MQ_XA_RBOTHER      104
#define MQ_XA_RBPROTO      105
#define MQ_XA_RBTIMEOUT    106
#define MQ_XA_RBTRANSIENT  107
#define MQ_XA_NOMIGRATE    9
#define MQ_XA_HEURHAZ      8
#define MQ_XA_HEURCOM      7
#define MQ_XA_HEURRB       6
#define MQ_XA_HEURMIX      5
#define MQ_XA_RETRY        4
#define MQ_XA_RDONLY       3
#define MQ_XA_OK           0
#define MQ_XAER_ASYNC      -2
#define MQ_XAER_RMERR      -3
#define MQ_XAER_NOTA       -4
#define MQ_XAER_INVAL      -5
#define MQ_XAER_PROTO      -6
#define MQ_XAER_RMFAIL     -7
#define MQ_XAER_DUPID      -8
#define MQ_XAER_OUTSIDE    -9

/* These flags are documented in javax.transaction.xa.XAResource */
#define MQ_XA_TMNOFLAGS     0
#define MQ_XA_TMJOIN        0x200000
#define MQ_XA_TMENDRSCAN    0x800000
#define MQ_XA_TMSTARTRSCAN  0x1000000
#define MQ_XA_TMSUSPEND     0x2000000
#define MQ_XA_TMSUCCESS     0x4000000
#define MQ_XA_TMRESUME      0x8000000
#define MQ_XA_TMFAIL        0x20000000
#define MQ_XA_TMONEPHASE    0x40000000

#define MQ_PMRF_NONE              0x00
#define MQ_PMRF_MSG_ID            0x01
#define MQ_PMRF_CORREL_ID         0x02
#define MQ_PMRF_GROUP_ID          0x04
#define MQ_PMRF_FEEDBACK          0x08
#define MQ_PMRF_ACCOUNTING_TOKEN  0x10

/* MQ structures */
/* Undocumented structures */
#define MQ_TEXT_TSH						"Transmission Segment Header"
#define MQ_TEXT_TSHC					"Transmission Segment Header Common"
#define MQ_TEXT_TSHM					"Transmission Segment Header Multiplexed"
#define MQ_TEXT_FCNO					"F Connect Option"
#define MQ_TEXT_API						"API Header"
#define MQ_TEXT_SOCKET					"Socket Action"
#define MQ_TEXT_ID						"Initial Data"
#define MQ_TEXT_UID						"User Id Data"
#define MQ_TEXT_MSH						"Message Segment Header"
#define MQ_TEXT_CAUT					"Connection Authority"
#define MQ_TEXT_CONN					"MQCONN"
#define MQ_TEXT_INQ						"MQINQ/MQSET"
#define MQ_TEXT_PUT						"MQPUT/MQGET"
#define MQ_TEXT_OPEN					"MQOPEN/MQCLOSE"
#define MQ_TEXT_REQMSG					"REQUEST MESSAGE"
#define MQ_TEXT_ASYMSG					"ASYNC MESSAGE"
#define MQ_TEXT_NOTIFICATION			"NOTIFICATION"
#define MQ_TEXT_BIND_READAHEAD_AS_Q_DEF "Bind/Read Ahead As Q Def"
#define MQ_TEXT_IMMEDIATE_NONE			"Close Immediate/No option"
#define MQ_TEXT_MQPMO_NONE				"Resp as Q Def/Resp as Topic Def/None"
#define MQ_TEXT_MQGMO_NONE				"No Wait/Prop as Q Def/None"
#define MQ_TEXT_MQMO_NONE				"None"
#define MQ_TEXT_LPOOOPT_NONE			"None"

#define MQ_TEXT_PING  "PING"
#define MQ_TEXT_RESET "RESET"
#define MQ_TEXT_STAT  "STATUS"
#define MQ_TEXT_SPI   "SPI"
#define MQ_TEXT_XA    "XA"
#define MQ_TEXT_XID   "Xid"
#define MQ_TEXT_XINF  "XA_info"

#define MQ_TEXT_SPQU  "SPI Query InOut"
#define MQ_TEXT_SPQI  "SPI Query In"
#define MQ_TEXT_SPQO  "SPI Query Out"
#define MQ_TEXT_SPPU  "SPI Put InOut"
#define MQ_TEXT_SPPI  "SPI Put In"
#define MQ_TEXT_SPPO  "SPI Put Out"
#define MQ_TEXT_SPGU  "SPI Get InOut"
#define MQ_TEXT_SPGI  "SPI Get In"
#define MQ_TEXT_SPGO  "SPI Get Out"
#define MQ_TEXT_SPAU  "SPI Activate InOut"
#define MQ_TEXT_SPAI  "SPI Activate In"
#define MQ_TEXT_SPAO  "SPI Activate Out"
#define MQ_TEXT_SPOU  "SPI InOut"
#define MQ_TEXT_SPOI  "SPI In"
#define MQ_TEXT_SPOO  "SPI Out"
#define MQ_TEXT_LPOO  "LPOO"
#define MQ_TEXT_FOPA  "FOPA"

/* Documented structures with structid */
#define MQ_TEXT_CIH  "CICS bridge Header"
#define MQ_TEXT_DH   "Distribution Header"
#define MQ_TEXT_DLH  "Dead-Letter Header"
#define MQ_TEXT_GMO  "Get Message Options"
#define MQ_TEXT_IIH  "IMS Information Header"
#define MQ_TEXT_MD   "Message Descriptor"
#define MQ_TEXT_MDE  "Message Descriptor Extension"
#define MQ_TEXT_OD   "Object Descriptor"
#define MQ_TEXT_PMO  "Put Message Options"
#define MQ_TEXT_RMH  "Reference Message Header"
#define MQ_TEXT_TM   "Trigger Message"
#define MQ_TEXT_TMC2 "Trigger Message 2 (character format)"
#define MQ_TEXT_WIH  "Work Information Header"
#define MQ_TEXT_XQH  "Transmission Queue Header"

/* Documented structures without structid */
#define MQ_TEXT_OR   "Object Record"
#define MQ_TEXT_PMR  "Put Message Record"
#define MQ_TEXT_RR   "Response Record"

#define MQ_NC_GET_INHIBITED          1
#define MQ_NC_GET_ALLOWED            2
#define MQ_NC_CONN_STATE             3
#define MQ_NC_CONN_STATE_REPLY       4
#define MQ_NC_Q_STATE                5
#define MQ_NC_Q_STATE_REPLY          6
#define MQ_NC_QM_QUIESCING           7
#define MQ_NC_TXN_ALLOWED            8
#define MQ_NC_TXN_REVOKE             9
#define MQ_NC_TXN_REVOKE_REPLY      10
#define MQ_NC_CHECK_MSG             11
#define MQ_NC_BROWSE_FIRST          12
#define MQ_NC_MESSAGE_TOO_LARGE     13
#define MQ_NC_STREAMING_FAILURE     14
#define MQ_NC_CLIENT_ASYNC_EMPTY    15
#define MQ_NC_STREAMING_TXN_PAUSED  16
#define MQ_NC_RECONNECTION_COMPLETE 17

DEF_VALSB(notifcode)
	DEF_VALS2(NC_GET_INHIBITED,		 "GET_INHIBITED"),
	DEF_VALS2(NC_GET_ALLOWED,		 "GET_ALLOWED"),
	DEF_VALS2(NC_CONN_STATE,		 "CONN_STATE"),
	DEF_VALS2(NC_CONN_STATE_REPLY,	 "CONN_STATE_REPLY"),
	DEF_VALS2(NC_Q_STATE,			 "Q_STATE"),
	DEF_VALS2(NC_Q_STATE_REPLY,		 "Q_STATE_REPLY"),
	DEF_VALS2(NC_QM_QUIESCING,		 "QM_QUIESCING"),
	DEF_VALS2(NC_TXN_ALLOWED,		 "TXN_ALLOWED"),
	DEF_VALS2(NC_TXN_REVOKE,		 "TXN_REVOKE"),
	DEF_VALS2(NC_TXN_REVOKE_REPLY,	 "TXN_REVOKE_REPLY"),
	DEF_VALS2(NC_CHECK_MSG,			 "CHECK_MSG"),
	DEF_VALS2(NC_BROWSE_FIRST,		 "BROWSE_FIRST"),
	DEF_VALS2(NC_MESSAGE_TOO_LARGE,	 "MESSAGE_TOO_LARGE"),
	DEF_VALS2(NC_STREAMING_FAILURE,	 "STREAMING_FAILURE"),
	DEF_VALS2(NC_CLIENT_ASYNC_EMPTY, "CLIENT_ASYNC_EMPTY"),
DEF_VALSE;

DEF_VALSB(opcode)
	DEF_VALS2(TST_INITIAL,			 "INITIAL_DATA"),
	DEF_VALS2(TST_RESYNC,			 "RESYNC_DATA"),
	DEF_VALS2(TST_RESET,			 "RESET_DATA"),
	DEF_VALS2(TST_MESSAGE,			 "MESSAGE_DATA"),
	DEF_VALS2(TST_STATUS,			 "STATUS_DATA"),
	DEF_VALS2(TST_SECURITY,			 "SECURITY_DATA"),
	DEF_VALS2(TST_PING,				 "PING_DATA"),
	DEF_VALS2(TST_USERID,			 "USERID_DATA"),
	DEF_VALS2(TST_HEARTBEAT,		 "HEARTBEAT"),
	DEF_VALS2(TST_CONAUTH_INFO,		 "CONAUTH_INFO"),
	DEF_VALS2(TST_RENEGOTIATE_DATA,	 "RENEGOTIATE_DATA"),
	DEF_VALS2(TST_SOCKET_ACTION,	 "SOCKET_ACTION"),
	DEF_VALS2(TST_ASYNC_MESSAGE,	 "ASYNC_MESSAGE"),
	DEF_VALS2(TST_REQUEST_MSGS,		 "REQUEST_MSGS"),
	DEF_VALS2(TST_NOTIFICATION,		 "NOTIFICATION"),
	DEF_VALS2(TST_MQCONN,			 "MQCONN"),
	DEF_VALS2(TST_MQDISC,			 "MQDISC"),
	DEF_VALS2(TST_MQOPEN,			 "MQOPEN"),
	DEF_VALS2(TST_MQCLOSE,			 "MQCLOSE"),
	DEF_VALS2(TST_MQGET,			 "MQGET"),
	DEF_VALS2(TST_MQPUT,			 "MQPUT"),
	DEF_VALS2(TST_MQPUT1,			 "MQPUT1"),
	DEF_VALS2(TST_MQSET,			 "MQSET"),
	DEF_VALS2(TST_MQINQ,			 "MQINQ"),
	DEF_VALS2(TST_MQCMIT,			 "MQCMIT"),
	DEF_VALS2(TST_MQBACK,			 "MQBACK"),
	DEF_VALS2(TST_SPI,				 "SPI"),
	DEF_VALS2(TST_MQSTAT,			 "MQSTAT"),
	DEF_VALS2(TST_MQSUB,			 "MQSUB"),
	DEF_VALS2(TST_MQSUBRQ,			 "MQSUBRQ"),
	DEF_VALS2(TST_MQCONN_REPLY,		 "MQCONN_REPLY"),
	DEF_VALS2(TST_MQDISC_REPLY,		 "MQDISC_REPLY"),
	DEF_VALS2(TST_MQOPEN_REPLY,		 "MQOPEN_REPLY"),
	DEF_VALS2(TST_MQCLOSE_REPLY,	 "MQCLOSE_REPLY"),
	DEF_VALS2(TST_MQGET_REPLY,		 "MQGET_REPLY"),
	DEF_VALS2(TST_MQPUT_REPLY,		 "MQPUT_REPLY"),
	DEF_VALS2(TST_MQPUT1_REPLY,		 "MQPUT1_REPLY"),
	DEF_VALS2(TST_MQSET_REPLY,		 "MQSET_REPLY"),
	DEF_VALS2(TST_MQINQ_REPLY,		 "MQINQ_REPLY"),
	DEF_VALS2(TST_MQCMIT_REPLY,		 "MQCMIT_REPLY"),
	DEF_VALS2(TST_MQBACK_REPLY,		 "MQBACK_REPLY"),
	DEF_VALS2(TST_SPI_REPLY,		 "SPI_REPLY"),
	DEF_VALS2(TST_MQSTAT_REPLY,		 "MQSTAT_REPLY"),
	DEF_VALS2(TST_MQSUB_REPLY,		 "MQSUB_REPLY"),
	DEF_VALS2(TST_MQSUBRQ_REPLY,	 "MQSUBRQ_REPLY"),
	DEF_VALS2(TST_XA_START,			 "XA_START"),
	DEF_VALS2(TST_XA_END,			 "XA_END"),
	DEF_VALS2(TST_XA_OPEN,			 "XA_OPEN"),
	DEF_VALS2(TST_XA_CLOSE,			 "XA_CLOSE"),
	DEF_VALS2(TST_XA_PREPARE,		 "XA_PREPARE"),
	DEF_VALS2(TST_XA_COMMIT,		 "XA_COMMIT"),
	DEF_VALS2(TST_XA_ROLLBACK,		 "XA_ROLLBACK"),
	DEF_VALS2(TST_XA_FORGET,		 "XA_FORGET"),
	DEF_VALS2(TST_XA_RECOVER,		 "XA_RECOVER"),
	DEF_VALS2(TST_XA_COMPLETE,		 "XA_COMPLETE"),
	DEF_VALS2(TST_XA_START_REPLY,	 "XA_START_REPLY"),
	DEF_VALS2(TST_XA_END_REPLY,		 "XA_END_REPLY"),
	DEF_VALS2(TST_XA_OPEN_REPLY,	 "XA_OPEN_REPLY"),
	DEF_VALS2(TST_XA_CLOSE_REPLY,	 "XA_CLOSE_REPLY"),
	DEF_VALS2(TST_XA_PREPARE_REPLY,	 "XA_PREPARE_REPLY"),
	DEF_VALS2(TST_XA_COMMIT_REPLY,	 "XA_COMMIT_REPLY"),
	DEF_VALS2(TST_XA_ROLLBACK_REPLY, "XA_ROLLBACK_REPLY"),
	DEF_VALS2(TST_XA_FORGET_REPLY,	 "XA_FORGET_REPLY"),
	DEF_VALS2(TST_XA_RECOVER_REPLY,	 "XA_RECOVER_REPLY"),
	DEF_VALS2(TST_XA_COMPLETE_REPLY, "XA_COMPLETE_REPLY"),
DEF_VALSE;

DEF_VALSB(spi_verbs)
	DEF_VALS2(SPI_QUERY,	"QUERY"),
	DEF_VALS2(SPI_PUT,		"PUT"),
	DEF_VALS2(SPI_GET,		"GET"),
	DEF_VALS2(SPI_ACTIVATE, "ACTIVATE"),
	DEF_VALS2(SPI_OPEN,		"OPEN"),
DEF_VALSE;

DEF_VALSB(spi_activate)
	DEF_VALS2(SPI_ACTIVATE_ENABLE,	"ENABLE"),
	DEF_VALS2(SPI_ACTIVATE_DISABLE, "DISABLE"),
DEF_VALSE;

DEF_VALSB(status)
	DEF_VALS2(STATUS_ERR_NO_CHANNEL,			 "NO_CHANNEL"),
	DEF_VALS2(STATUS_ERR_CHANNEL_WRONG_TYPE,	 "CHANNEL_WRONG_TYPE"),
	DEF_VALS2(STATUS_ERR_QM_UNAVAILABLE,		 "QM_UNAVAILABLE"),
	DEF_VALS2(STATUS_ERR_MSG_SEQUENCE_ERROR,	 "MSG_SEQUENCE_ERROR"),
	DEF_VALS2(STATUS_ERR_QM_TERMINATING,		 "QM_TERMINATING"),
	DEF_VALS2(STATUS_ERR_CAN_NOT_STORE,			 "CAN_NOT_STORE"),
	DEF_VALS2(STATUS_ERR_USER_CLOSED,			 "USER_CLOSED"),
	DEF_VALS2(STATUS_ERR_PROTOCOL_SEGMENT_TYPE,	 "REMOTE_PROTOCOL_ERROR"),
	DEF_VALS2(STATUS_ERR_PROTOCOL_LENGTH_ERROR,	 "BIND_FAILED"),
	DEF_VALS2(STATUS_ERR_PROTOCOL_INVALID_DATA,	 "MSGWRAP_DIFFERENT"),
	DEF_VALS2(STATUS_ERR_PROTOCOL_ID_ERROR,		 "REMOTE_CHANNEL_UNAVAILABLE"),
	DEF_VALS2(STATUS_ERR_PROTOCOL_MSH_ERROR,	 "TERMINATED_BY_REMOTE_EXIT"),
	DEF_VALS2(STATUS_ERR_PROTOCOL_GENERAL,		 "PROTOCOL_GENERAL"),
	DEF_VALS2(STATUS_ERR_BATCH_FAILURE,			 "BATCH_FAILURE"),
	DEF_VALS2(STATUS_ERR_MESSAGE_LENGTH_ERROR,	 "MESSAGE_LENGTH_ERROR"),
	DEF_VALS2(STATUS_ERR_SEGMENT_NUMBER_ERROR,	 "SEGMENT_NUMBER_ERROR"),
	DEF_VALS2(STATUS_ERR_SECURITY_FAILURE,		 "SECURITY_FAILURE"),
	DEF_VALS2(STATUS_ERR_WRAP_VALUE_ERROR,		 "WRAP_VALUE_ERROR"),
	DEF_VALS2(STATUS_ERR_CHANNEL_UNAVAILABLE,	 "CHANNEL_UNAVAILABLE"),
	DEF_VALS2(STATUS_ERR_CLOSED_BY_EXIT,		 "CLOSED_BY_EXIT"),
	DEF_VALS2(STATUS_ERR_CIPHER_SPEC,			 "CIPHER_SPEC"),
	DEF_VALS2(STATUS_ERR_PEER_NAME,				 "PEER_NAME"),
	DEF_VALS2(STATUS_ERR_SSL_CLIENT_CERTIFICATE, "SSL_CLIENT_CERTIFICATE"),
	DEF_VALS2(STATUS_ERR_RMT_RSRCS_IN_RECOVERY,	 "RMT_RSRCS_IN_RECOVERY"),
	DEF_VALS2(STATUS_ERR_SSL_REFRESHING,		 "SSL_REFRESHING"),
	DEF_VALS2(STATUS_ERR_INVALID_HOBJ,			 "INVALID_HOBJ"),
	DEF_VALS2(STATUS_ERR_CONV_ID_ERROR,			 "CONV_ID_ERROR"),
	DEF_VALS2(STATUS_ERR_SOCKET_ACTION_TYPE,	 "SOCKET_ACTION_TYPE"),
	DEF_VALS2(STATUS_ERR_STANDBY_Q_MGR,			 "STANDBY_Q_MGR"),

	DEF_VALS2(STATUS_ERR_CCSID_NOT_SUPPORTED,	 "CCSID_NOT_SUPPORTED"),
	DEF_VALS2(STATUS_ERR_ENCODING_INVALID,		 "ENCODING_INVALID"),
	DEF_VALS2(STATUS_ERR_FAP_LEVEL,				 "FAP_LEVEL"),
	DEF_VALS2(STATUS_ERR_NEGOTIATION_FAILED,	 "NEGOTIATION_FAILED"),
DEF_VALSE;

DEF_VALSB(xaer)
	DEF_VALS2(XA_RBROLLBACK,  "XA_RBROLLBACK"),
	DEF_VALS2(XA_RBCOMMFAIL,  "XA_RBCOMMFAIL"),
	DEF_VALS2(XA_RBDEADLOCK,  "XA_RBDEADLOCK"),
	DEF_VALS2(XA_RBINTEGRITY, "XA_RBINTEGRITY"),
	DEF_VALS2(XA_RBOTHER,	  "XA_RBOTHER"),
	DEF_VALS2(XA_RBPROTO,	  "XA_RBPROTO"),
	DEF_VALS2(XA_RBTIMEOUT,	  "XA_RBTIMEOUT"),
	DEF_VALS2(XA_RBTRANSIENT, "XA_RBTRANSIENT"),
	DEF_VALS2(XA_NOMIGRATE,	  "XA_NOMIGRATE"),
	DEF_VALS2(XA_HEURHAZ,	  "XA_HEURHAZ"),
	DEF_VALS2(XA_HEURCOM,	  "XA_HEURCOM"),
	DEF_VALS2(XA_HEURRB,	  "XA_HEURRB"),
	DEF_VALS2(XA_HEURMIX,	  "XA_HEURMIX"),
	DEF_VALS2(XA_RETRY,		  "XA_RETRY"),
	DEF_VALS2(XA_RDONLY,	  "XA_RDONLY"),
	DEF_VALS2(XA_OK,		  "XA_OK"),
	DEF_VALS2(XAER_ASYNC,	  "XAER_ASYNC"),
	DEF_VALS2(XAER_RMERR,	  "XAER_RMERR"),
	DEF_VALS2(XAER_NOTA,	  "XAER_NOTA"),
	DEF_VALS2(XAER_INVAL,	  "XAER_INVAL"),
	DEF_VALS2(XAER_PROTO,	  "XAER_PROTO"),
	DEF_VALS2(XAER_RMFAIL,	  "XAER_RMFAIL"),
	DEF_VALS2(XAER_DUPID,	  "XAER_DUPID"),
	DEF_VALS2(XAER_OUTSIDE,	  "XAER_OUTSIDE"),
DEF_VALSE;

DEF_VALSB(StructID)
	DEF_VALS2(STRUCTID_CIH,			 MQ_TEXT_CIH),
	DEF_VALS2(STRUCTID_DH,			 MQ_TEXT_DH),
	DEF_VALS2(STRUCTID_DLH,			 MQ_TEXT_DLH),
	DEF_VALS2(STRUCTID_GMO,			 MQ_TEXT_GMO),
	DEF_VALS2(STRUCTID_ID,			 MQ_TEXT_ID),
	DEF_VALS2(STRUCTID_IIH,			 MQ_TEXT_IIH),
	DEF_VALS2(STRUCTID_MD,			 MQ_TEXT_MD),
	DEF_VALS2(STRUCTID_MDE,			 MQ_TEXT_MDE),
	DEF_VALS2(STRUCTID_MSH,			 MQ_TEXT_MSH),
	DEF_VALS2(STRUCTID_OD,			 MQ_TEXT_OD),
	DEF_VALS2(STRUCTID_PMO,			 MQ_TEXT_PMO),
	DEF_VALS2(STRUCTID_RMH,			 MQ_TEXT_RMH),
	DEF_VALS2(STRUCTID_TM,			 MQ_TEXT_TM),
	DEF_VALS2(STRUCTID_TMC2,		 MQ_TEXT_TMC2),
	DEF_VALS2(STRUCTID_CAUT,		 MQ_TEXT_CAUT),
	DEF_VALS2(STRUCTID_TSH,			 MQ_TEXT_TSH),
	DEF_VALS2(STRUCTID_TSHC,		 MQ_TEXT_TSHC),
	DEF_VALS2(STRUCTID_TSHM,		 MQ_TEXT_TSHM),
	DEF_VALS2(STRUCTID_UID,			 MQ_TEXT_UID),
	DEF_VALS2(STRUCTID_WIH,			 MQ_TEXT_WIH),
	DEF_VALS2(STRUCTID_XQH,			 MQ_TEXT_XQH),
	DEF_VALS2(STRUCTID_SPQU ,		 MQ_TEXT_SPQU),
	DEF_VALS2(STRUCTID_SPQI ,		 MQ_TEXT_SPQI),
	DEF_VALS2(STRUCTID_SPQO ,		 MQ_TEXT_SPQO),
	DEF_VALS2(STRUCTID_SPPU ,		 MQ_TEXT_SPPU),
	DEF_VALS2(STRUCTID_SPPI ,		 MQ_TEXT_SPPI),
	DEF_VALS2(STRUCTID_SPPO ,		 MQ_TEXT_SPPO),
	DEF_VALS2(STRUCTID_SPGU ,		 MQ_TEXT_SPGU),
	DEF_VALS2(STRUCTID_SPGI ,		 MQ_TEXT_SPGI),
	DEF_VALS2(STRUCTID_SPGO ,		 MQ_TEXT_SPGO),
	DEF_VALS2(STRUCTID_SPAU ,		 MQ_TEXT_SPAU),
	DEF_VALS2(STRUCTID_SPAI ,		 MQ_TEXT_SPAI),
	DEF_VALS2(STRUCTID_SPAO ,		 MQ_TEXT_SPAO),
	DEF_VALS2(STRUCTID_SPOU ,		 MQ_TEXT_SPOU),
	DEF_VALS2(STRUCTID_SPOI ,		 MQ_TEXT_SPOI),
	DEF_VALS2(STRUCTID_SPOO ,		 MQ_TEXT_SPOO),
	DEF_VALS2(STRUCTID_LPOO ,		 MQ_TEXT_LPOO),
	DEF_VALS2(STRUCTID_FOPA ,		 MQ_TEXT_FOPA),
	DEF_VALS2(STRUCTID_FCNO ,		 MQ_TEXT_FCNO),
	DEF_VALS2(STRUCTID_CIH_EBCDIC,	 MQ_TEXT_CIH),
	DEF_VALS2(STRUCTID_DH_EBCDIC,	 MQ_TEXT_DH),
	DEF_VALS2(STRUCTID_DLH_EBCDIC,	 MQ_TEXT_DLH),
	DEF_VALS2(STRUCTID_GMO_EBCDIC,	 MQ_TEXT_GMO),
	DEF_VALS2(STRUCTID_ID_EBCDIC,	 MQ_TEXT_ID),
	DEF_VALS2(STRUCTID_IIH_EBCDIC,	 MQ_TEXT_IIH),
	DEF_VALS2(STRUCTID_MD_EBCDIC,	 MQ_TEXT_MD),
	DEF_VALS2(STRUCTID_MDE_EBCDIC,	 MQ_TEXT_MDE),
	DEF_VALS2(STRUCTID_OD_EBCDIC,	 MQ_TEXT_OD),
	DEF_VALS2(STRUCTID_PMO_EBCDIC,	 MQ_TEXT_PMO),
	DEF_VALS2(STRUCTID_RMH_EBCDIC,	 MQ_TEXT_RMH),
	DEF_VALS2(STRUCTID_TM_EBCDIC,	 MQ_TEXT_TM),
	DEF_VALS2(STRUCTID_TMC2_EBCDIC,	 MQ_TEXT_TMC2),
	DEF_VALS2(STRUCTID_CAUT_EBCDIC,	 MQ_TEXT_CAUT),
	DEF_VALS2(STRUCTID_TSH_EBCDIC,	 MQ_TEXT_TSH),
	DEF_VALS2(STRUCTID_TSHC_EBCDIC,	 MQ_TEXT_TSHC),
	DEF_VALS2(STRUCTID_TSHM_EBCDIC,	 MQ_TEXT_TSHM),
	DEF_VALS2(STRUCTID_UID_EBCDIC,	 MQ_TEXT_UID),
	DEF_VALS2(STRUCTID_WIH_EBCDIC,	 MQ_TEXT_WIH),
	DEF_VALS2(STRUCTID_XQH_EBCDIC,	 MQ_TEXT_XQH),
	DEF_VALS2(STRUCTID_SPQU_EBCDIC,	 MQ_TEXT_SPQU),
	DEF_VALS2(STRUCTID_SPQI_EBCDIC,	 MQ_TEXT_SPQI),
	DEF_VALS2(STRUCTID_SPQO_EBCDIC,	 MQ_TEXT_SPQO),
	DEF_VALS2(STRUCTID_SPPU_EBCDIC,	 MQ_TEXT_SPPU),
	DEF_VALS2(STRUCTID_SPPI_EBCDIC,	 MQ_TEXT_SPPI),
	DEF_VALS2(STRUCTID_SPPO_EBCDIC,	 MQ_TEXT_SPPO),
	DEF_VALS2(STRUCTID_SPGU_EBCDIC,	 MQ_TEXT_SPGU),
	DEF_VALS2(STRUCTID_SPGI_EBCDIC,	 MQ_TEXT_SPGI),
	DEF_VALS2(STRUCTID_SPGO_EBCDIC,	 MQ_TEXT_SPGO),
	DEF_VALS2(STRUCTID_SPAU_EBCDIC,	 MQ_TEXT_SPAU),
	DEF_VALS2(STRUCTID_SPAI_EBCDIC,	 MQ_TEXT_SPAI),
	DEF_VALS2(STRUCTID_SPAO_EBCDIC,	 MQ_TEXT_SPAO),
	DEF_VALS2(STRUCTID_SPOU_EBCDIC,	 MQ_TEXT_SPOU),
	DEF_VALS2(STRUCTID_SPOI_EBCDIC,	 MQ_TEXT_SPOI),
	DEF_VALS2(STRUCTID_SPOO_EBCDIC,	 MQ_TEXT_SPOO),
	DEF_VALS2(STRUCTID_LPOO_EBCDIC,	 MQ_TEXT_LPOO),
	DEF_VALS2(STRUCTID_FOPA_EBCDIC,	 MQ_TEXT_FOPA),
	DEF_VALS2(STRUCTID_FCNO_EBCDIC , MQ_TEXT_FCNO),
DEF_VALSE;

DEF_VALSB(byteorder)
	DEF_VALS2(LITTLE_ENDIAN, "Little endian"),
	DEF_VALS2(BIG_ENDIAN,	 "Big endian"),
DEF_VALSE;

DEF_VALSB(conn_version)
	DEF_VALS2(CONN_VERSION,  "MQCONN"),
	DEF_VALS2(CONNX_VERSION, "MQCONNX"),
DEF_VALSE;

DEF_VALSB(sidtype)
	DEF_VALS1(MQSIDT_NONE),
	DEF_VALS1(MQSIDT_NT_SECURITY_ID),
	DEF_VALS1(MQSIDT_WAS_SECURITY_ID),
DEF_VALSE;

static gint dissect_mq_encoding(proto_tree *tree, int hfindex, tvbuff_t *tvb, const gint start, gint length, const guint encoding)
{
	gchar  sEnc[128] = "";
	gchar *pEnc;
	guint  uEnc;

	if (length == 2)
	{
		uEnc = (gint)tvb_get_guint16_endian(tvb, start, encoding);
	}
	else
	{
		uEnc = tvb_get_guint32_endian(tvb, start, encoding);
	}
	pEnc = sEnc;

#define CHECK_ENC(M, T) ((uEnc & M) == T)
#define DOPRT(A) pEnc += g_snprintf(pEnc, (gulong)(sizeof(sEnc)-1-(pEnc-sEnc)), A);
	if (CHECK_ENC(MQ_MQENC_FLOAT_MASK, MQ_MQENC_FLOAT_UNDEFINED))
	{
		DOPRT("FLT_UNDEFINED");
	}
	else if (CHECK_ENC(MQ_MQENC_FLOAT_MASK, MQ_MQENC_FLOAT_IEEE_NORMAL))
	{
		DOPRT("FLT_IEEE_NORMAL");
	}
	else if (CHECK_ENC(MQ_MQENC_FLOAT_MASK, MQ_MQENC_FLOAT_IEEE_REVERSED))
	{
		DOPRT("FLT_IEEE_REVERSED");
	}
	else if (CHECK_ENC(MQ_MQENC_FLOAT_MASK, MQ_MQENC_FLOAT_S390))
	{
		DOPRT("FLT_S390");
	}
	else if (CHECK_ENC(MQ_MQENC_FLOAT_MASK, MQ_MQENC_FLOAT_TNS))
	{
		DOPRT("FLT_TNS");
	} else
	{
		DOPRT("FLT_UNKNOWN");
	}

	DOPRT("/");
	if (CHECK_ENC(MQ_MQENC_DECIMAL_MASK, MQ_MQENC_DECIMAL_UNDEFINED))
	{
		DOPRT("DEC_UNDEFINED");
	}
	else if (CHECK_ENC(MQ_MQENC_DECIMAL_MASK, MQ_MQENC_DECIMAL_NORMAL))
	{
		DOPRT("DEC_NORMAL");
	}
	else if (CHECK_ENC(MQ_MQENC_DECIMAL_MASK, MQ_MQENC_DECIMAL_REVERSED))
	{
		DOPRT("DEC_REVERSED");
	}
	else
	{
		DOPRT("DEC_UNKNOWN");
	}

	DOPRT("/");
	if (CHECK_ENC(MQ_MQENC_INTEGER_MASK, MQ_MQENC_INTEGER_UNDEFINED))
	{
		DOPRT("INT_UNDEFINED");
	}
	else if (CHECK_ENC(MQ_MQENC_INTEGER_MASK, MQ_MQENC_INTEGER_NORMAL))
	{
		DOPRT("INT_NORMAL");
	}
	else if (CHECK_ENC(MQ_MQENC_INTEGER_MASK, MQ_MQENC_INTEGER_REVERSED))
	{
		DOPRT("INT_REVERSED");
	}
	else
	{
		DOPRT("INT_UNKNOWN");
	}
#undef CHECK_ENC
#undef DOPRT

	proto_tree_add_uint_format_value(tree, hfindex, tvb, start, length, uEnc,
		"%8x-%d (%s)", uEnc, uEnc, sEnc);

	return length;
}

static gint dissect_mq_MQMO(tvbuff_t *tvb, proto_tree *mq_tree, gint offset, gint ett_subtree, mq_parm_t *p_mq_parm)
{
	guint        uMoOpt;

	uMoOpt = tvb_get_guint32_endian(tvb, offset, p_mq_parm->mq_int_enc);

	if (uMoOpt == 0)
	{
		proto_item  *ti;
		proto_tree  *mq_tree_sub;
		ti = proto_tree_add_item(mq_tree, hf_mq_gmo_matchoptions, tvb, offset, 4, p_mq_parm->mq_int_enc); /* ENC_BIG_ENDIAN); */
		mq_tree_sub = proto_item_add_subtree(ti, ett_subtree);
		proto_tree_add_text(mq_tree_sub, tvb, offset, 4, MQ_TEXT_MQMO_NONE);
	}
	else
	{
		proto_tree_add_bitmask(mq_tree, tvb, offset, hf_mq_gmo_matchoptions, ett_subtree, pf_flds_mtchopt, p_mq_parm->mq_int_enc);
	}
	return 4;
}
static gint dissect_mq_LPOO_LPIOPTS(tvbuff_t *tvb, proto_tree *mq_tree, gint offset, gint ett_subtree, mq_parm_t *p_mq_parm)
{
	guint        uLpiOpts;

	uLpiOpts = tvb_get_guint32_endian(tvb, offset, p_mq_parm->mq_int_enc);

	if (uLpiOpts == 0)
	{
		proto_item  *ti;
		proto_tree  *mq_tree_sub;
		ti = proto_tree_add_item(mq_tree, hf_mq_lpoo_lpiopts, tvb, offset, 4, p_mq_parm->mq_int_enc);
		mq_tree_sub = proto_item_add_subtree(ti, ett_subtree);
		proto_tree_add_text(mq_tree_sub, tvb, offset, 4, MQ_TEXT_LPOOOPT_NONE);
	}
	else
	{
		proto_tree_add_bitmask(mq_tree, tvb, offset, hf_mq_lpoo_lpiopts, ett_subtree, pf_flds_lpooopt, p_mq_parm->mq_int_enc);
	}
	return 4;
}
static gint dissect_mq_MQGMO(tvbuff_t *tvb, proto_tree *mq_tree, gint offset, gint ett_subtree, mq_parm_t *p_mq_parm)
{
	guint        uGmoOpt;

	uGmoOpt = tvb_get_guint32_endian(tvb, offset, p_mq_parm->mq_int_enc);

	if (uGmoOpt == 0)
	{
		proto_item  *ti;
		proto_tree  *mq_tree_sub;
		ti = proto_tree_add_item(mq_tree, hf_mq_gmo_options, tvb, offset, 4, p_mq_parm->mq_int_enc); /* ENC_BIG_ENDIAN); */
		mq_tree_sub = proto_item_add_subtree(ti, ett_subtree);
		proto_tree_add_text(mq_tree_sub, tvb, offset, 4, MQ_TEXT_MQGMO_NONE);
	}
	else
	{
		proto_tree_add_bitmask(mq_tree, tvb, offset, hf_mq_gmo_options, ett_subtree, pf_flds_gmoopt, p_mq_parm->mq_int_enc);
	}
	return 4;
}

static gint dissect_mq_MQPMO(tvbuff_t *tvb, proto_tree *mq_tree, gint offset, gint ett_subtree, mq_parm_t *p_mq_parm)
{
	guint        uPmoOpt;

	uPmoOpt = tvb_get_guint32_endian(tvb, offset, p_mq_parm->mq_int_enc);

	if (uPmoOpt == 0)
	{
		proto_item  *ti;
		proto_tree  *mq_tree_sub;
		ti = proto_tree_add_item(mq_tree, hf_mq_pmo_options, tvb, offset, 4, p_mq_parm->mq_int_enc); /* ENC_BIG_ENDIAN); */
		mq_tree_sub = proto_item_add_subtree(ti, ett_subtree);
		proto_tree_add_text(mq_tree_sub, tvb, offset, 4, MQ_TEXT_MQPMO_NONE);
	}
	else
	{
		proto_tree_add_bitmask(mq_tree, tvb, offset, hf_mq_pmo_options, ett_subtree, pf_flds_pmoopt, p_mq_parm->mq_int_enc);
	}
	return 4;
}

static gint dissect_mq_MQOO(tvbuff_t *tvb, proto_tree *mq_tree, gint offset, gint ett_subtree, gint hfindex, mq_parm_t *p_mq_parm)
{
	guint        uOpenOpt;

	uOpenOpt = tvb_get_guint32_endian(tvb, offset, p_mq_parm->mq_int_enc);

	if (uOpenOpt == 0)
	{
		proto_item  *ti;
		proto_tree  *mq_tree_sub;
		ti = proto_tree_add_item(mq_tree, hfindex, tvb, offset, 4, p_mq_parm->mq_int_enc);
		mq_tree_sub = proto_item_add_subtree(ti, ett_subtree);
		proto_tree_add_text(mq_tree_sub, tvb, offset, 4, MQ_TEXT_BIND_READAHEAD_AS_Q_DEF);
	}
	else
	{
		proto_tree_add_bitmask(mq_tree, tvb, offset, hfindex, ett_subtree, pf_flds_opnopt, p_mq_parm->mq_int_enc);
	}
	return 4;
}
static gint dissect_mq_MQCO(tvbuff_t *tvb, proto_tree *mq_tree, gint offset, mq_parm_t *p_mq_parm)
{
	guint        iCloseOpt;

	iCloseOpt = tvb_get_guint32_endian(tvb, offset, p_mq_parm->mq_int_enc);

	if (iCloseOpt == 0)
	{
		proto_item  *ti;
		proto_tree  *mq_tree_sub;
		ti = proto_tree_add_item(mq_tree, hf_mq_close_options, tvb, offset, 4, p_mq_parm->mq_int_enc);
		mq_tree_sub = proto_item_add_subtree(ti, ett_mq_close_option);
		proto_tree_add_text(mq_tree_sub, tvb, offset, 4, MQ_TEXT_IMMEDIATE_NONE);
	}
	else
	{
		proto_tree_add_bitmask(mq_tree, tvb, offset, hf_mq_close_options, ett_mq_close_option, pf_flds_clsopt, ENC_BIG_ENDIAN);
	}
	return 4;
}
static gint dissect_mq_charv(tvbuff_t *tvb, proto_tree *tree, gint offset, gint iSize, gint idx, guint8 *pStr, mq_parm_t *p_mq_parm)
{
	proto_item *ti;
	proto_tree *mq_tree_sub;
	guint32		lStr;
	guint32		oStr;
	gint32		eStr;
	guint8	   *sStr;
	static guint8 sEmpty[]	= "[Empty]";

	lStr = tvb_get_guint32_endian(tvb, offset + 12, p_mq_parm->mq_int_enc);
	oStr = tvb_get_guint32_endian(tvb, offset +  4, p_mq_parm->mq_int_enc);
	eStr = tvb_get_guint32_endian(tvb, offset + 16, p_mq_parm->mq_int_enc);
	if (lStr && oStr)
	{
		sStr = tvb_get_string_enc(wmem_packet_scope(), tvb, oStr, lStr, p_mq_parm->mq_str_enc);
	}
	else
		sStr = NULL;

	ti = proto_tree_add_text(tree, tvb, offset, iSize, "%s - %s", pStr, (sStr) ? sStr : sEmpty);
	mq_tree_sub = proto_item_add_subtree(ti, idx);
	proto_tree_add_item(mq_tree_sub, hf_mq_charv_vsptr,		tvb, offset,      4, p_mq_parm->mq_int_enc);
	proto_tree_add_item(mq_tree_sub, hf_mq_charv_vsoffset,	tvb, offset +  4, 4, p_mq_parm->mq_int_enc);
	proto_tree_add_item(mq_tree_sub, hf_mq_charv_vsbufsize, tvb, offset +  8, 4, p_mq_parm->mq_int_enc);
	proto_tree_add_item(mq_tree_sub, hf_mq_charv_vslength,	tvb, offset + 12, 4, p_mq_parm->mq_int_enc);
	proto_tree_add_item(mq_tree_sub, hf_mq_charv_vsccsid,	tvb, offset + 16, 4, p_mq_parm->mq_int_enc);
	proto_tree_add_item(mq_tree_sub, hf_mq_charv_vsvalue,	tvb, oStr, lStr, (eStr == 500) ? ENC_EBCDIC : ENC_ASCII);

	return 20;
}
static gint dissect_mq_pmr(tvbuff_t *tvb, proto_tree *tree, gint offset, gint iNbrRecords, gint offsetPMR, guint32 recFlags, mq_parm_t *p_mq_parm)
{
	gint iSizePMR1 = 0;
	gint iSizePMR  = 0;

	iSizePMR1 =  ((((recFlags & MQ_PMRF_MSG_ID) != 0) * 24)
		+(((recFlags & MQ_PMRF_CORREL_ID) != 0) * 24)
		+(((recFlags & MQ_PMRF_GROUP_ID) != 0) * 24)
		+(((recFlags & MQ_PMRF_FEEDBACK) != 0) * 4)
		+(((recFlags & MQ_PMRF_ACCOUNTING_TOKEN) != 0) * 32));

	if (offsetPMR != 0 && iSizePMR1 != 0)
	{
		iSizePMR = iNbrRecords * iSizePMR1;
		if (tvb_length_remaining(tvb, offset) >= iSizePMR)
		{
			if (tree)
			{
				gint iOffsetPMR = 0;
				gint iRecord = 0;
				for (iRecord = 0; iRecord < iNbrRecords; iRecord++)
				{
					proto_item *ti = proto_tree_add_text(tree, tvb, offset + iOffsetPMR, iSizePMR1, MQ_TEXT_PMR);
					proto_tree *mq_tree = proto_item_add_subtree(ti, ett_mq_pmr);
					if ((recFlags & MQ_PMRF_MSG_ID) != 0)
					{
						proto_tree_add_item(mq_tree, hf_mq_pmr_msgid, tvb, offset + iOffsetPMR, 24, ENC_NA);
						iOffsetPMR += 24;
					}
					if ((recFlags & MQ_PMRF_CORREL_ID) != 0)
					{
						proto_tree_add_item(mq_tree, hf_mq_pmr_correlid, tvb, offset + iOffsetPMR, 24, ENC_NA);
						iOffsetPMR += 24;
					}
					if ((recFlags & MQ_PMRF_GROUP_ID) != 0)
					{
						proto_tree_add_item(mq_tree, hf_mq_pmr_groupid, tvb, offset + iOffsetPMR, 24, ENC_NA);
						iOffsetPMR += 24;
					}
					if ((recFlags & MQ_PMRF_FEEDBACK) != 0)
					{
						proto_tree_add_item(mq_tree, hf_mq_pmr_feedback, tvb, offset + iOffsetPMR, 4, p_mq_parm->mq_int_enc);
						iOffsetPMR += 4;
					}
					if ((recFlags & MQ_PMRF_ACCOUNTING_TOKEN) != 0)
					{
						proto_tree_add_item(mq_tree, hf_mq_pmr_acttoken, tvb, offset + iOffsetPMR, 32, ENC_NA);
						iOffsetPMR += 32;
					}
				}
			}
		}
		else iSizePMR = 0;
	}
	return iSizePMR;
}
static gint dissect_mq_or(tvbuff_t *tvb, proto_tree *tree, gint offset, gint iNbrRecords, gint offsetOR, mq_parm_t *p_mq_parm)
{
	gint iSizeOR = 0;
	if (offsetOR != 0)
	{
		iSizeOR = iNbrRecords * 96;
		if (tvb_length_remaining(tvb, offset) >= iSizeOR)
		{
			if (tree)
			{
				gint iOffsetOR = 0;
				gint iRecord = 0;
				for (iRecord = 0; iRecord < iNbrRecords ; iRecord++)
				{
					proto_item *ti = proto_tree_add_text(tree, tvb, offset + iOffsetOR, 96, MQ_TEXT_OR);
					proto_tree *mq_tree = proto_item_add_subtree(ti, ett_mq_or);
					proto_tree_add_item(mq_tree, hf_mq_or_objname, tvb, offset + iOffsetOR, 48, p_mq_parm->mq_str_enc);
					proto_tree_add_item(mq_tree, hf_mq_or_objqmgrname, tvb, offset + iOffsetOR + 48, 48, p_mq_parm->mq_str_enc);
					iOffsetOR += 96;
				}
			}
		}
		else iSizeOR = 0;
	}
	return iSizeOR;
}
static gint dissect_mq_rr(tvbuff_t *tvb, proto_tree *tree, gint offset, gint iNbrRecords, gint offsetRR, mq_parm_t *p_mq_parm)
{
	gint iSizeRR = 0;
	if (offsetRR != 0)
	{
		iSizeRR = iNbrRecords * 8;
		if (tvb_length_remaining(tvb, offset) >= iSizeRR)
		{
			if (tree)
			{
				gint iOffsetRR = 0;
				gint iRecord = 0;
				for (iRecord = 0; iRecord < iNbrRecords; iRecord++)
				{
					proto_item *ti = proto_tree_add_text(tree, tvb, offset + iOffsetRR, 8, MQ_TEXT_RR);
					proto_tree *mq_tree = proto_item_add_subtree(ti, ett_mq_rr);
					proto_tree_add_item(mq_tree, hf_mq_rr_compcode, tvb, offset + iOffsetRR, 4, p_mq_parm->mq_int_enc);
					proto_tree_add_item(mq_tree, hf_mq_rr_reascode, tvb, offset + iOffsetRR + 4, 4, p_mq_parm->mq_int_enc);
					iOffsetRR += 8;
				}
			}
		}
		else iSizeRR = 0;
	}
	return iSizeRR;
}
static gint dissect_mq_gmo(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint offset, mq_parm_t *p_mq_parm)
{
	gint iSize = 0;

	p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
	if (p_mq_parm->mq_strucID == MQ_STRUCTID_GMO || p_mq_parm->mq_strucID == MQ_STRUCTID_GMO_EBCDIC)
	{
		guint32 iVersion = 0;
		iVersion = tvb_get_guint32_endian(tvb, offset + 4, p_mq_parm->mq_int_enc);
		/* Compute length according to version */
		switch (iVersion)
		{
		case 1: iSize = 72; break;
		case 2: iSize = 80; break;
		case 3: iSize = 100; break;
		}

		if (iSize != 0 && tvb_length_remaining(tvb, offset) >= iSize)
		{
			guint8 *sQueue;
			sQueue = tvb_get_string_enc(wmem_packet_scope(), tvb, offset + 24, 48, p_mq_parm->mq_str_enc);
			if (strip_trailing_blanks(sQueue, 48) > 0)
			{
				col_append_fstr(pinfo->cinfo, COL_INFO, " Q=%s", sQueue);
			}

			if (tree)
			{
				proto_tree *mq_tree;
				proto_item *ti;

				ti = proto_tree_add_text(tree, tvb, offset, iSize, MQ_TEXT_GMO);
				mq_tree = proto_item_add_subtree(ti, ett_mq_gmo);

				proto_tree_add_item(mq_tree, hf_mq_gmo_StructID, tvb, offset, 4, p_mq_parm->mq_str_enc);
				proto_tree_add_item(mq_tree, hf_mq_gmo_version, tvb, offset + 4, 4, p_mq_parm->mq_int_enc);

				dissect_mq_MQGMO(tvb, mq_tree, offset + 8, ett_mq_gmo_option, p_mq_parm);

				proto_tree_add_item(mq_tree, hf_mq_gmo_waitinterval, tvb, offset + 12, 4, p_mq_parm->mq_int_enc);
				proto_tree_add_item(mq_tree, hf_mq_gmo_signal1, tvb, offset + 16, 4, p_mq_parm->mq_int_enc);
				proto_tree_add_item(mq_tree, hf_mq_gmo_signal2, tvb, offset + 20, 4, p_mq_parm->mq_int_enc);
				proto_tree_add_item(mq_tree, hf_mq_gmo_resolvqname, tvb, offset + 24, 48, p_mq_parm->mq_str_enc);

				if (iVersion >= 2)
				{
					/*proto_tree_add_item(mq_tree, hf_mq_gmo_matchoptions, tvb, offset + 72, 4, ENC_BIG_ENDIAN);*/
					dissect_mq_MQMO(tvb, mq_tree, offset + 8, ett_mq_gmo_matchoption, p_mq_parm);

					proto_tree_add_item(mq_tree, hf_mq_gmo_groupstatus, tvb, offset + 76, 1, ENC_BIG_ENDIAN);
					proto_tree_add_item(mq_tree, hf_mq_gmo_segmstatus, tvb, offset + 77, 1, ENC_BIG_ENDIAN);
					proto_tree_add_item(mq_tree, hf_mq_gmo_segmentation, tvb, offset + 78, 1, ENC_BIG_ENDIAN);
					proto_tree_add_item(mq_tree, hf_mq_gmo_reserved, tvb, offset + 79, 1, ENC_BIG_ENDIAN);
				}

				if (iVersion >= 3)
				{
					proto_tree_add_item(mq_tree, hf_mq_gmo_msgtoken, tvb, offset + 80, 16, ENC_NA);
					proto_tree_add_item(mq_tree, hf_mq_gmo_returnedlen, tvb, offset + 96, 4, p_mq_parm->mq_int_enc);
				}
			}
		}
	}
	return iSize;
}

static gint dissect_mq_pmo(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint offset, mq_parm_t *p_mq_parm, gint *iDistributionListSize)
{
	gint iSize = 0;

	p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
	if (p_mq_parm->mq_strucID == MQ_STRUCTID_PMO || p_mq_parm->mq_strucID == MQ_STRUCTID_PMO_EBCDIC)
	{
		guint32 iVersion = 0;
		iVersion = tvb_get_guint32_endian(tvb, offset + 4, p_mq_parm->mq_int_enc);
		/* Compute length according to version */
		switch (iVersion)
		{
		case 1: iSize = 128; break;
		case 2: iSize = 152;break;
		}

		if (iSize != 0 && tvb_length_remaining(tvb, offset) >= iSize)
		{
			guint8 *sQueue;

			sQueue = tvb_get_string_enc(wmem_packet_scope(), tvb, offset + 32, 48, p_mq_parm->mq_str_enc);
			if (strip_trailing_blanks(sQueue, 48) > 0)
			{
				col_append_fstr(pinfo->cinfo, COL_INFO, " Q=%s", sQueue);
			}

			if (tree)
			{
				proto_tree  *mq_tree;
				proto_item  *ti;

				ti = proto_tree_add_text(tree, tvb, offset, iSize, MQ_TEXT_PMO);
				mq_tree = proto_item_add_subtree(ti, ett_mq_pmo);
				proto_tree_add_item(mq_tree, hf_mq_pmo_StructID, tvb, offset, 4, p_mq_parm->mq_str_enc);
				proto_tree_add_item(mq_tree, hf_mq_pmo_version, tvb, offset + 4, 4, p_mq_parm->mq_int_enc);

				dissect_mq_MQPMO(tvb, mq_tree, offset + 8, ett_mq_pmo_option, p_mq_parm);

				proto_tree_add_item(mq_tree, hf_mq_pmo_timeout, tvb, offset + 12, 4, p_mq_parm->mq_int_enc);
				proto_tree_add_item(mq_tree, hf_mq_pmo_context, tvb, offset + 16, 4, p_mq_parm->mq_int_enc);
				proto_tree_add_item(mq_tree, hf_mq_pmo_knowndstcnt, tvb, offset + 20, 4, p_mq_parm->mq_int_enc);
				proto_tree_add_item(mq_tree, hf_mq_pmo_unkndstcnt, tvb, offset + 24, 4, p_mq_parm->mq_int_enc);
				proto_tree_add_item(mq_tree, hf_mq_pmo_invaldstcnt, tvb, offset + 28, 4, p_mq_parm->mq_int_enc);
				proto_tree_add_item(mq_tree, hf_mq_pmo_resolvqname, tvb, offset + 32, 48, p_mq_parm->mq_str_enc);
				proto_tree_add_item(mq_tree, hf_mq_pmo_resolvqmgr, tvb, offset + 80, 48, p_mq_parm->mq_str_enc);

				if (iVersion >= 2)
				{
					proto_tree_add_item(mq_tree, hf_mq_pmo_recspresent, tvb, offset + 128, 4, p_mq_parm->mq_int_enc);
					proto_tree_add_item(mq_tree, hf_mq_pmo_putmsgrecfld, tvb, offset + 132, 4, p_mq_parm->mq_int_enc);
					proto_tree_add_item(mq_tree, hf_mq_pmo_putmsgrecofs, tvb, offset + 136, 4, p_mq_parm->mq_int_enc);
					proto_tree_add_item(mq_tree, hf_mq_pmo_resprecofs, tvb, offset + 140, 4, p_mq_parm->mq_int_enc);
					proto_tree_add_item(mq_tree, hf_mq_pmo_putmsgrecptr, tvb, offset + 144, 4, p_mq_parm->mq_int_enc);
					proto_tree_add_item(mq_tree, hf_mq_pmo_resprecptr, tvb, offset + 148, 4, p_mq_parm->mq_int_enc);
				}
			}
			if (iVersion >= 2)
			{
				gint iNbrRecords = 0;
				guint32 iRecFlags = 0;

				iNbrRecords = tvb_get_guint32_endian(tvb, offset + 128, p_mq_parm->mq_int_enc);
				iRecFlags = tvb_get_guint32_endian(tvb, offset + 132, p_mq_parm->mq_int_enc);

				if (iNbrRecords > 0)
				{
					gint iOffsetPMR = 0;
					gint iOffsetRR = 0;

					*iDistributionListSize = iNbrRecords;
					iOffsetPMR = tvb_get_guint32_endian(tvb, offset + 136, p_mq_parm->mq_int_enc);
					iOffsetRR  = tvb_get_guint32_endian(tvb, offset + 140, p_mq_parm->mq_int_enc);
					iSize += dissect_mq_pmr(tvb, tree, offset + iSize, iNbrRecords, iOffsetPMR, iRecFlags, p_mq_parm);
					iSize += dissect_mq_rr(tvb, tree, offset + iSize, iNbrRecords, iOffsetRR, p_mq_parm);
				}
			}
		}
	}
	return iSize;
}

static gint dissect_mq_od(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint offset, mq_parm_t *p_mq_parm, gint *iDistributionListSize)
{
	gint iSize = 0;

	p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
	if (p_mq_parm->mq_strucID == MQ_STRUCTID_OD || p_mq_parm->mq_strucID == MQ_STRUCTID_OD_EBCDIC)
	{
		/* The OD struct can be present in several messages at different levels */
		guint32 iVersion = 0;
		iVersion = tvb_get_guint32_endian(tvb, offset + 4, p_mq_parm->mq_int_enc);
		/* Compute length according to version */
		switch (iVersion)
		{
		case 1: iSize = 168; break;
		case 2: iSize = 200; break;
		case 3: iSize = 336; break;
		case 4: iSize = 336+3*20+4; break;
		}

		if (iSize != 0 && tvb_length_remaining(tvb, offset) >= iSize)
		{
			gint	 iNbrRecords = 0;
			guint8	*sObj;
			guint32	 uTyp;

			if (iVersion >= 2)
				iNbrRecords = tvb_get_guint32_endian(tvb, offset + 168, p_mq_parm->mq_int_enc);

			uTyp = tvb_get_guint32_endian(tvb, offset + 8, p_mq_parm->mq_int_enc);
			sObj = tvb_get_string_enc(wmem_packet_scope(), tvb, offset + 12, 48, p_mq_parm->mq_str_enc);
			col_append_fstr(pinfo->cinfo, COL_INFO, " Typ=%s", try_val_to_str(uTyp, GET_VALSV(objtype)));
			if (strip_trailing_blanks(sObj, 48) > 0)
			{
				col_append_fstr(pinfo->cinfo, COL_INFO, " Obj=%s", sObj);
			}

			if (tree)
			{
				proto_tree  *mq_tree;
				proto_item  *ti;

				ti = proto_tree_add_text(tree, tvb, offset, iSize, MQ_TEXT_OD);
				mq_tree = proto_item_add_subtree(ti, ett_mq_od);

				proto_tree_add_item(mq_tree, hf_mq_od_StructID,	   tvb, offset,        4, p_mq_parm->mq_str_enc);
				proto_tree_add_item(mq_tree, hf_mq_od_version,	   tvb, offset +   4,  4, p_mq_parm->mq_int_enc);
				proto_tree_add_item(mq_tree, hf_mq_od_objecttype,  tvb, offset +   8,  4, p_mq_parm->mq_int_enc);
				proto_tree_add_item(mq_tree, hf_mq_od_objectname,  tvb, offset +  12, 48, p_mq_parm->mq_str_enc);
				proto_tree_add_item(mq_tree, hf_mq_od_objqmgrname, tvb, offset +  60, 48, p_mq_parm->mq_str_enc);
				proto_tree_add_item(mq_tree, hf_mq_od_dynqname,	   tvb, offset + 108, 48, p_mq_parm->mq_str_enc);
				proto_tree_add_item(mq_tree, hf_mq_od_altuserid,   tvb, offset + 156, 12, p_mq_parm->mq_str_enc);

				if (iVersion >= 2)
				{
					proto_tree_add_item(mq_tree, hf_mq_od_recspresent,	tvb, offset + 168, 4, p_mq_parm->mq_int_enc);
					proto_tree_add_item(mq_tree, hf_mq_od_knowndstcnt,	tvb, offset + 172, 4, p_mq_parm->mq_int_enc);
					proto_tree_add_item(mq_tree, hf_mq_od_unknowdstcnt, tvb, offset + 176, 4, p_mq_parm->mq_int_enc);
					proto_tree_add_item(mq_tree, hf_mq_od_invaldstcnt,	tvb, offset + 180, 4, p_mq_parm->mq_int_enc);
					proto_tree_add_item(mq_tree, hf_mq_od_objrecofs,	tvb, offset + 184, 4, p_mq_parm->mq_int_enc);
					proto_tree_add_item(mq_tree, hf_mq_od_resprecofs,	tvb, offset + 188, 4, p_mq_parm->mq_int_enc);
					proto_tree_add_item(mq_tree, hf_mq_od_objrecptr,	tvb, offset + 192, 4, p_mq_parm->mq_int_enc);
					proto_tree_add_item(mq_tree, hf_mq_od_resprecptr,	tvb, offset + 196, 4, p_mq_parm->mq_int_enc);
				}
				if (iVersion >= 3)
				{
					proto_tree_add_item(mq_tree, hf_mq_od_altsecurid,	tvb, offset + 200, 40, p_mq_parm->mq_str_enc);
					proto_tree_add_item(mq_tree, hf_mq_od_resolvqname,	tvb, offset + 240, 48, p_mq_parm->mq_str_enc);
					proto_tree_add_item(mq_tree, hf_mq_od_resolvqmgrnm, tvb, offset + 288, 48, p_mq_parm->mq_str_enc);
				}
				if (iVersion >= 4)
				{
					dissect_mq_charv(tvb, mq_tree, offset+336, 20, ett_mq_od_objstr,    (guint8 *)"Object string",          p_mq_parm);
					dissect_mq_charv(tvb, mq_tree, offset+356, 20, ett_mq_od_selstr,    (guint8 *)"Selection string",       p_mq_parm);
					dissect_mq_charv(tvb, mq_tree, offset+376, 20, ett_mq_od_resobjstr, (guint8 *)"Resolved object string", p_mq_parm);
					proto_tree_add_item(mq_tree, hf_mq_od_resolvobjtyp, tvb, offset + 396, 4, p_mq_parm->mq_int_enc);
				}
			}
			if (iNbrRecords > 0)
			{
				gint iOffsetOR = 0;
				gint iOffsetRR = 0;

				*iDistributionListSize = iNbrRecords;
				iOffsetOR = tvb_get_guint32_endian(tvb, offset + 184, p_mq_parm->mq_int_enc);
				iOffsetRR = tvb_get_guint32_endian(tvb, offset + 188, p_mq_parm->mq_int_enc);

				iSize += dissect_mq_or(tvb, tree, offset, iNbrRecords, iOffsetOR, p_mq_parm);
				iSize += dissect_mq_rr(tvb, tree, offset, iNbrRecords, iOffsetRR, p_mq_parm);
			}
		}
	}
	return iSize;
}

static gint dissect_mq_xid(tvbuff_t *tvb, proto_tree *tree, mq_parm_t *p_mq_parm, gint offset)
{
	gint iSizeXid = 0;
	if (tvb_length_remaining(tvb, offset) >= 6)
	{
		guint8 iXidLength = 0;
		guint8 iBqLength  = 0;

		iXidLength = tvb_get_guint8(tvb, offset + 4);
		iBqLength  = tvb_get_guint8(tvb, offset + 5);
		iSizeXid   = 6 + iXidLength + iBqLength;

		if (tvb_length_remaining(tvb, offset) >= iSizeXid)
		{
			if (tree)
			{
				proto_tree  *mq_tree;
				proto_item  *ti;

				ti = proto_tree_add_text(tree, tvb, offset, iSizeXid, MQ_TEXT_XID);
				mq_tree = proto_item_add_subtree(ti, ett_mq_xa_xid);

				proto_tree_add_item(mq_tree, hf_mq_xa_xid_formatid,	  tvb, offset,                  4, p_mq_parm->mq_int_enc);
				proto_tree_add_item(mq_tree, hf_mq_xa_xid_glbxid_len, tvb, offset + 4,              1, p_mq_parm->mq_int_enc);
				proto_tree_add_item(mq_tree, hf_mq_xa_xid_brq_length, tvb, offset + 5,              1, p_mq_parm->mq_int_enc);
				proto_tree_add_item(mq_tree, hf_mq_xa_xid_globalxid,  tvb, offset + 6,              iXidLength, ENC_NA);
				proto_tree_add_item(mq_tree, hf_mq_xa_xid_brq,		  tvb, offset + 6 + iXidLength, iBqLength,  ENC_NA);
			}
			iSizeXid += (4 - (iSizeXid % 4)) % 4; /* Pad for alignment with 4 byte word boundary */
			if (tvb_length_remaining(tvb, offset) < iSizeXid)
				iSizeXid = 0;
		}
		else iSizeXid = 0;
	}
	return iSizeXid;
}

static gint dissect_mq_sid(tvbuff_t *tvb, proto_tree *tree, mq_parm_t *p_mq_parm, gint offset)
{
	guint8	iSIDL;
	guint8	iSID;
	guint8 *sid_str;
	gint	bOffset	= offset;

	iSIDL = tvb_get_guint8(tvb, offset);
	proto_tree_add_item(tree, hf_mq_sidlen, tvb, offset, 1, p_mq_parm->mq_int_enc);
	offset++;
	if (iSIDL > 0)
	{
		iSID = tvb_get_guint8(tvb, offset);
		proto_tree_add_item(tree, hf_mq_sidtyp, tvb, offset, 1, p_mq_parm->mq_int_enc);
		offset++;
		if (iSID == MQ_MQSIDT_NT_SECURITY_ID)
		{
			offset = dissect_nt_sid(tvb, offset, tree, "SID", (char **)&sid_str, -1);
		}
		else
		{
			proto_tree_add_item(tree, hf_mq_securityid, tvb, offset, 40, ENC_NA);
			offset += 40;
		}
	}
	return offset - bOffset;
}
static gint dissect_mq_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *mqroot_tree, gint offset, mq_parm_t *p_mq_parm)
{
	guint8 iFAPLvl;
	gint   iSize;

	iFAPLvl = tvb_get_guint8(tvb, offset + 4);

	if (iFAPLvl < 4)
		iSize = 44;
	else if (iFAPLvl < 10)
		iSize = 102;
	else
		iSize = 208;

	if (iSize != 0 && tvb_length_remaining(tvb, offset) >= iSize)
	{
		guint8 *sChannel;
		sChannel = tvb_get_string_enc(wmem_packet_scope(), tvb, offset + 24, 20, p_mq_parm->mq_str_enc);
		col_append_fstr(pinfo->cinfo, COL_INFO, " FAPLvl=%d", iFAPLvl);
		if (strip_trailing_blanks(sChannel, 20) > 0)
		{
			col_append_fstr(pinfo->cinfo, COL_INFO, ", CHL=%s", sChannel);
		}
		if (iFAPLvl >= 4)
		{
			guint8 *sQMgr;
			sQMgr = tvb_get_string_enc(wmem_packet_scope(), tvb, offset + 48, 48, p_mq_parm->mq_str_enc);
			if (strip_trailing_blanks(sQMgr, 48) > 0)
			{
				col_append_fstr(pinfo->cinfo, COL_INFO, ", QM=%s", sQMgr);
			}
			p_mq_parm->mq_id_ccsid.ccsid = (guint32)tvb_get_guint16_endian(tvb, offset +  46,  p_mq_parm->mq_int_enc);
		}
		if (mqroot_tree)
		{
			proto_item *ti = proto_tree_add_text(mqroot_tree, tvb, offset, iSize, MQ_TEXT_ID);
			proto_tree *mq_tree = proto_item_add_subtree(ti, ett_mq_id);

			proto_tree_add_item(mq_tree, hf_mq_id_StructID, tvb, offset, 4, p_mq_parm->mq_str_enc);
			proto_tree_add_item(mq_tree, hf_mq_id_FapLevel, tvb, offset + 4, 1, ENC_BIG_ENDIAN);

			/* ID Capability flags 1 */
			proto_tree_add_bitmask(mq_tree, tvb, offset + 44, hf_mq_id_icf1, ett_mq_id_icf1, pf_flds_icf1, ENC_BIG_ENDIAN);
			proto_tree_add_item(mq_tree, hf_mq_id_Eicf1, tvb, offset + 6, 1, ENC_BIG_ENDIAN);

			/* Error flags 1*/
			proto_tree_add_bitmask(mq_tree, tvb, offset + 7, hf_mq_id_ief1, ett_mq_id_ief1, pf_flds_ief1, ENC_BIG_ENDIAN);

			proto_tree_add_item(mq_tree, hf_mq_id_Reserved,	   tvb, offset +  8,  2, p_mq_parm->mq_int_enc);
			proto_tree_add_item(mq_tree, hf_mq_id_MaxMsgBatch, tvb, offset + 10,  2, p_mq_parm->mq_int_enc);
			proto_tree_add_item(mq_tree, hf_mq_id_MaxTrSize,   tvb, offset + 12,  4, p_mq_parm->mq_int_enc);
			proto_tree_add_item(mq_tree, hf_mq_id_MaxMsgSize,  tvb, offset + 16,  4, p_mq_parm->mq_int_enc);
			proto_tree_add_item(mq_tree, hf_mq_id_SeqWrapVal,  tvb, offset + 20,  4, p_mq_parm->mq_int_enc);
			proto_tree_add_item(mq_tree, hf_mq_id_channel,	   tvb, offset + 24, 20, p_mq_parm->mq_str_enc);

			if (iFAPLvl >= 4)
			{
				/* ID Capability flags 2 */
				proto_tree_add_bitmask(mq_tree, tvb, offset + 44, hf_mq_id_icf2, ett_mq_id_icf2, pf_flds_icf2, ENC_BIG_ENDIAN);
				proto_tree_add_item(mq_tree, hf_mq_id_Eicf2, tvb, offset + 45, 1, ENC_BIG_ENDIAN);

				proto_tree_add_item(mq_tree, hf_mq_id_ccsid     , tvb, offset +  46,  2, p_mq_parm->mq_int_enc);
				proto_tree_add_item(mq_tree, hf_mq_id_qmgrname  , tvb, offset +  48, 48, p_mq_parm->mq_str_enc);
				proto_tree_add_item(mq_tree, hf_mq_id_HBInterval, tvb, offset +  96,  4, p_mq_parm->mq_int_enc);
				proto_tree_add_item(mq_tree, hf_mq_id_EFLLength , tvb, offset + 100,  2, p_mq_parm->mq_int_enc);
				if (iFAPLvl >= 10)
				{
					/* Error flags 2*/
					proto_tree_add_bitmask(mq_tree, tvb, offset + 102, hf_mq_id_ief2, ett_mq_id_ief2, pf_flds_ief2, ENC_BIG_ENDIAN);
					proto_tree_add_item(mq_tree, hf_mq_id_Reserved1 , tvb, offset + 103,  1, ENC_BIG_ENDIAN);

					proto_tree_add_item(mq_tree, hf_mq_id_HdrCprsLst, tvb, offset + 104,  2, p_mq_parm->mq_int_enc);
					proto_tree_add_item(mq_tree, hf_mq_id_MsgCprsLst, tvb, offset + 106, 16, p_mq_parm->mq_int_enc);
					proto_tree_add_item(mq_tree, hf_mq_id_Reserved2 , tvb, offset + 122,  2, p_mq_parm->mq_int_enc);
					proto_tree_add_item(mq_tree, hf_mq_id_SSLKeyRst , tvb, offset + 124,  4, p_mq_parm->mq_int_enc);
					proto_tree_add_item(mq_tree, hf_mq_id_ConvBySkt , tvb, offset + 128,  4, p_mq_parm->mq_int_enc);

					/* ID Capability flags 3 */
					proto_tree_add_bitmask(mq_tree, tvb, offset + 132, hf_mq_id_icf3, ett_mq_id_icf3, pf_flds_icf3, ENC_BIG_ENDIAN);
					proto_tree_add_item(mq_tree, hf_mq_id_Eicf3, tvb, offset + 133, 1, ENC_BIG_ENDIAN);

					proto_tree_add_item(mq_tree, hf_mq_id_Reserved3, tvb, offset + 134,  2, p_mq_parm->mq_int_enc);
					proto_tree_add_item(mq_tree, hf_mq_id_ProcessId, tvb, offset + 136,  4, p_mq_parm->mq_int_enc);
					proto_tree_add_item(mq_tree, hf_mq_id_ThreadId , tvb, offset + 140,  4, p_mq_parm->mq_int_enc);
					proto_tree_add_item(mq_tree, hf_mq_id_TraceId  , tvb, offset + 144,  4, p_mq_parm->mq_int_enc);
					proto_tree_add_item(mq_tree, hf_mq_id_ProdId   , tvb, offset + 148, 12, p_mq_parm->mq_str_enc);
					proto_tree_add_item(mq_tree, hf_mq_id_mqmid    , tvb, offset + 160, 48, p_mq_parm->mq_str_enc);
				}
			}
		}
	}
	return iSize;
}
static gint dissect_mq_md(tvbuff_t *tvb, proto_tree *tree, gint offset, mq_parm_t *p_mq_parm, gboolean bDecode)
{
	gint iSize = 0;

	p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
	if (p_mq_parm->mq_strucID == MQ_STRUCTID_MD || p_mq_parm->mq_strucID == MQ_STRUCTID_MD_EBCDIC)
	{
		guint32 iVersion = 0;
		iVersion = tvb_get_guint32_endian(tvb, offset + 4, p_mq_parm->mq_int_enc);
		/* Compute length according to version */
		switch (iVersion)
		{
		case 1: iSize = 324; break;
		case 2: iSize = 364; break;
		}

		if (bDecode && iSize != 0 && tvb_length_remaining(tvb, offset) >= iSize)
		{
			p_mq_parm->iOfsEnc = offset + 24;
			p_mq_parm->iOfsCcs = offset + 28;
			p_mq_parm->iOfsFmt = offset + 32;

			p_mq_parm->mq_md_ccsid.encod = tvb_get_guint32_endian(tvb, offset +  24,  p_mq_parm->mq_int_enc);
			p_mq_parm->mq_md_ccsid.ccsid = tvb_get_guint32_endian(tvb, offset +  28,  p_mq_parm->mq_int_enc);
			if (tree)
			{
				proto_item *ti = proto_tree_add_text(tree, tvb, offset, iSize, MQ_TEXT_MD);
				proto_tree *mq_tree = proto_item_add_subtree(ti, ett_mq_md);

				proto_tree_add_item(mq_tree, hf_mq_md_StructID,	   tvb, offset,        4, p_mq_parm->mq_str_enc);
				proto_tree_add_item(mq_tree, hf_mq_md_version,	   tvb, offset +   4,  4, p_mq_parm->mq_int_enc);
				proto_tree_add_item(mq_tree, hf_mq_md_report,	   tvb, offset +   8,  4, p_mq_parm->mq_int_enc);
				proto_tree_add_item(mq_tree, hf_mq_md_msgtype,	   tvb, offset +  12,  4, p_mq_parm->mq_int_enc);
				proto_tree_add_item(mq_tree, hf_mq_md_expiry,	   tvb, offset +  16,  4, p_mq_parm->mq_int_enc);
				proto_tree_add_item(mq_tree, hf_mq_md_feedback,	   tvb, offset +  20,  4, p_mq_parm->mq_int_enc);
				dissect_mq_encoding(mq_tree, hf_mq_md_encoding,	   tvb, offset +  24,  4, p_mq_parm->mq_int_enc);
				proto_tree_add_item(mq_tree, hf_mq_md_ccsid,	   tvb, offset +  28,  4, p_mq_parm->mq_int_enc);
				proto_tree_add_item(mq_tree, hf_mq_md_format,	   tvb, offset +  32,  8, p_mq_parm->mq_str_enc);
				proto_tree_add_item(mq_tree, hf_mq_md_priority,	   tvb, offset +  40,  4, p_mq_parm->mq_int_enc);
				proto_tree_add_item(mq_tree, hf_mq_md_persistence, tvb, offset +  44,  4, p_mq_parm->mq_int_enc);
				proto_tree_add_item(mq_tree, hf_mq_md_msgid,	   tvb, offset +  48, 24, ENC_NA);
				proto_tree_add_item(mq_tree, hf_mq_md_correlid,	   tvb, offset +  72, 24, ENC_NA);
				proto_tree_add_item(mq_tree, hf_mq_md_backoutcnt,  tvb, offset +  96,  4, p_mq_parm->mq_int_enc);
				proto_tree_add_item(mq_tree, hf_mq_md_replytoq,	   tvb, offset + 100, 48, p_mq_parm->mq_str_enc);
				proto_tree_add_item(mq_tree, hf_mq_md_replytoqmgr, tvb, offset + 148, 48, p_mq_parm->mq_str_enc);
				proto_tree_add_item(mq_tree, hf_mq_md_userid,	   tvb, offset + 196, 12, p_mq_parm->mq_str_enc);
				proto_tree_add_item(mq_tree, hf_mq_md_acttoken,	   tvb, offset + 208, 32, ENC_NA);
				proto_tree_add_item(mq_tree, hf_mq_md_appliddata,  tvb, offset + 240, 32, p_mq_parm->mq_str_enc);
				proto_tree_add_item(mq_tree, hf_mq_md_putappltype, tvb, offset + 272,  4, p_mq_parm->mq_int_enc);
				proto_tree_add_item(mq_tree, hf_mq_md_putapplname, tvb, offset + 276, 28, p_mq_parm->mq_str_enc);
				proto_tree_add_item(mq_tree, hf_mq_md_putdate,	   tvb, offset + 304,  8, p_mq_parm->mq_str_enc);
				proto_tree_add_item(mq_tree, hf_mq_md_puttime,	   tvb, offset + 312,  8, p_mq_parm->mq_str_enc);
				proto_tree_add_item(mq_tree, hf_mq_md_apporigdata, tvb, offset + 320,  4, p_mq_parm->mq_str_enc);

				if (iVersion >= 2)
				{
					proto_tree_add_item(mq_tree, hf_mq_md_groupid,		tvb, offset + 324, 24, ENC_NA);
					proto_tree_add_item(mq_tree, hf_mq_md_msgseqnumber, tvb, offset + 348,  4, p_mq_parm->mq_int_enc);
					proto_tree_add_item(mq_tree, hf_mq_md_offset,		tvb, offset + 352,  4, p_mq_parm->mq_int_enc);
					proto_tree_add_item(mq_tree, hf_mq_md_msgflags,		tvb, offset + 356,  4, p_mq_parm->mq_int_enc);
					proto_tree_add_item(mq_tree, hf_mq_md_origlen,		tvb, offset + 360,  4, p_mq_parm->mq_int_enc);
				}
			}
		}
	}
	return iSize;
}
static gint dissect_mq_fopa(tvbuff_t *tvb, proto_tree *tree, gint offset, mq_parm_t *p_mq_parm)
{
	gint iSize = 0;

	p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
	if (p_mq_parm->mq_strucID == MQ_STRUCTID_FOPA || p_mq_parm->mq_strucID == MQ_STRUCTID_FOPA_EBCDIC)
	{
		iSize = tvb_get_guint32_endian(tvb, offset+8, p_mq_parm->mq_int_enc);
		if (iSize != 0 && tvb_length_remaining(tvb, offset) >= iSize)
		{
			if (tree)
			{
				proto_item *ti = proto_tree_add_text(tree, tvb, offset, iSize, MQ_TEXT_FOPA);
				proto_tree *mq_tree = proto_item_add_subtree(ti, ett_mq_fopa);

				proto_tree_add_item(mq_tree, hf_mq_fopa_StructID, tvb, offset,      4, p_mq_parm->mq_str_enc);
				proto_tree_add_item(mq_tree, hf_mq_fopa_version,  tvb, offset +  4, 4, p_mq_parm->mq_int_enc);
				proto_tree_add_item(mq_tree, hf_mq_fopa_length,	  tvb, offset +  8, 4, p_mq_parm->mq_int_enc);
				proto_tree_add_item(mq_tree, hf_mq_fopa_unknown1, tvb, offset + 12, 4, p_mq_parm->mq_int_enc);
				proto_tree_add_item(mq_tree, hf_mq_fopa_unknown2, tvb, offset + 16, 4, p_mq_parm->mq_int_enc);
				proto_tree_add_item(mq_tree, hf_mq_fopa_unknown3, tvb, offset + 20, 8, p_mq_parm->mq_str_enc);
				if (iSize > 28)
				{
					proto_tree_add_item(mq_tree, hf_mq_fopa_qprotect, tvb, offset + 28, 48, p_mq_parm->mq_int_enc);
					proto_tree_add_item(mq_tree, hf_mq_fopa_unknown4, tvb, offset + 76, 4, p_mq_parm->mq_int_enc);
					proto_tree_add_item(mq_tree, hf_mq_fopa_unknown5, tvb, offset + 80, 4, p_mq_parm->mq_int_enc);
				}
			}
		}
	}
	return iSize;
}
static void dissect_mq_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
	gint	   offset				 = 0;
	guint32	   iSegmentLength		 = 0;
	guint32	   iSizePayload			 = 0;
	gint	   iSizeMD				 = 0;
	gboolean   bPayload				 = FALSE;
	gboolean   bEBCDIC				 = FALSE;
	gint	   iDistributionListSize = 0;
	mq_parm_t *p_mq_parm;

	p_mq_parm = wmem_new0(wmem_packet_scope(), mq_parm_t);

	p_mq_parm->mq_strucID = MQ_STRUCTID_NULL;
	p_mq_parm->mq_int_enc = ENC_BIG_ENDIAN;
	p_mq_parm->mq_str_enc = ENC_UTF_8|ENC_NA;

	col_set_str(pinfo->cinfo, COL_PROTOCOL, "MQ");

	p_mq_parm->iOfsEnc = 0;
	p_mq_parm->iOfsFmt = 0;
	p_mq_parm->iOfsCcs = 0;
	if (tvb_length(tvb) >= 4)
	{
		p_mq_parm->mq_strucID = tvb_get_ntohl(tvb, offset);
		if (((p_mq_parm->mq_strucID & MQ_MASK_TSHx) == MQ_STRUCTID_TSHx ||
		     (p_mq_parm->mq_strucID & MQ_MASK_TSHx) == MQ_STRUCTID_TSHx_EBCDIC)
			&& tvb_length_remaining(tvb, offset) >= 28)
		{
			proto_tree *mq_tree		= NULL;
			proto_tree *mqroot_tree = NULL;
			proto_item *ti			= NULL;

			/* An MQ packet always starts with this structure*/
			gint iSizeTSH = 28;
			gint iSizeMPF = 0;  /* Size Of Multiplexed Field */

			if ((p_mq_parm->mq_strucID & MQ_MASK_TSHx) == MQ_STRUCTID_TSHx_EBCDIC)
			{
				bEBCDIC = TRUE;
				p_mq_parm->mq_str_enc = ENC_EBCDIC|ENC_NA;
			}

			iSegmentLength = tvb_get_ntohl(tvb, offset + 4);

			if (p_mq_parm->mq_strucID == MQ_STRUCTID_TSHM || p_mq_parm->mq_strucID == MQ_STRUCTID_TSHM_EBCDIC)
			{
				if (tvb_length_remaining(tvb, offset) < 36)
					return;
				iSizeMPF += 8;
				iSizeTSH  = 36;
			}
			p_mq_parm->mq_opcode = tvb_get_guint8(tvb, offset + iSizeMPF + 9);

			if (p_mq_parm->mq_opcode == MQ_TST_REQUEST_MSGS || p_mq_parm->mq_opcode == MQ_TST_ASYNC_MESSAGE)
			{
				p_mq_parm->iOfsEnc = offset + iSizeMPF + 20;
				p_mq_parm->iOfsCcs = offset + iSizeMPF + 24;
				p_mq_parm->iOfsFmt = offset ;
			}
			p_mq_parm->mq_int_enc = (tvb_get_guint8(tvb, offset + iSizeMPF + 8) == MQ_LITTLE_ENDIAN ? ENC_LITTLE_ENDIAN : ENC_BIG_ENDIAN);
			p_mq_parm->mq_ctlf1 = tvb_get_guint8(tvb, offset + iSizeMPF + 10);
			p_mq_parm->mq_ctlf2 = tvb_get_guint8(tvb, offset + iSizeMPF + 11);

			p_mq_parm->mq_tsh_ccsid.encod = tvb_get_guint32_endian(tvb, offset + iSizeMPF + 20, p_mq_parm->mq_int_enc);
			p_mq_parm->mq_tsh_ccsid.ccsid = tvb_get_guint16_endian(tvb, offset + iSizeMPF + 24, p_mq_parm->mq_int_enc);

			if (p_mq_parm->mq_tsh_ccsid.ccsid == 500 && !bEBCDIC)
			{
				bEBCDIC = TRUE;
				p_mq_parm->mq_str_enc = ENC_EBCDIC|ENC_NA;
			}

			if (!mq_in_reassembly)
			{
				col_clear(pinfo->cinfo, COL_INFO);
				col_append_sep_fstr(pinfo->cinfo, COL_INFO, " | ", "%-17s", val_to_str(p_mq_parm->mq_opcode, mq_opcode_vals, "Unknown (0x%02x)"));
				col_set_fence(pinfo->cinfo, COL_INFO);
			}

			if (tree)
			{
				if (p_mq_parm->mq_opcode!=MQ_TST_ASYNC_MESSAGE)
				{
					ti = proto_tree_add_item(tree, proto_mq, tvb, offset, -1, ENC_NA);
					proto_item_append_text(ti, " (%s)", val_to_str(p_mq_parm->mq_opcode, mq_opcode_vals, "Unknown (0x%02x)"));
					if (bEBCDIC == TRUE)
						proto_item_append_text(ti, " (EBCDIC)");
					mqroot_tree = proto_item_add_subtree(ti, ett_mq);
				}
				else
				{
					mqroot_tree = tree;
				}

				ti = proto_tree_add_text(mqroot_tree, tvb, offset, iSizeTSH, MQ_TEXT_TSH);
				mq_tree = proto_item_add_subtree(ti, ett_mq_tsh);

				proto_tree_add_item(mq_tree, hf_mq_tsh_StructID, tvb, offset + 0, 4, p_mq_parm->mq_str_enc);
				proto_tree_add_item(mq_tree, hf_mq_tsh_mqseglen, tvb, offset + 4, 4, ENC_BIG_ENDIAN);

				if (iSizeTSH == 36)
				{
					proto_tree_add_item(mq_tree, hf_mq_tsh_convid,    tvb, offset +  8, 4, ENC_BIG_ENDIAN);
					proto_tree_add_item(mq_tree, hf_mq_tsh_requestid, tvb, offset + 12, 4, ENC_BIG_ENDIAN);
				}

				proto_tree_add_item(mq_tree, hf_mq_tsh_byteorder, tvb, offset + iSizeMPF + 8, 1, ENC_BIG_ENDIAN);
				proto_tree_add_item(mq_tree, hf_mq_tsh_opcode,    tvb, offset + iSizeMPF + 9, 1, ENC_BIG_ENDIAN);

				proto_tree_add_bitmask(mq_tree, tvb, offset + iSizeMPF + 10, hf_mq_tsh_ctlflgs1, ett_mq_tsh_tcf, pf_flds_tcf, ENC_BIG_ENDIAN);
				proto_tree_add_bitmask(mq_tree, tvb, offset + iSizeMPF + 11, hf_mq_tsh_ctlflgs2, ett_mq_tsh_tcf2, pf_flds_tcf2, ENC_BIG_ENDIAN);

				proto_tree_add_item(mq_tree, hf_mq_tsh_luwid,    tvb, offset + iSizeMPF + 12, 8, ENC_NA);
				dissect_mq_encoding(mq_tree, hf_mq_tsh_encoding, tvb, offset + iSizeMPF + 20, 4, p_mq_parm->mq_int_enc);
				proto_tree_add_item(mq_tree, hf_mq_tsh_ccsid,    tvb, offset + iSizeMPF + 24, 2, p_mq_parm->mq_int_enc);
				proto_tree_add_item(mq_tree, hf_mq_tsh_reserved, tvb, offset + iSizeMPF + 26, 2, p_mq_parm->mq_int_enc);
			}
			offset += iSizeTSH;

			/* Now dissect the embedded structures */
			if (tvb_length_remaining(tvb, offset) >= 4)
			{
				p_mq_parm->mq_strucID = tvb_get_ntohl(tvb, offset);
				if (((p_mq_parm->mq_ctlf1 & MQ_TCF_FIRST) != 0) || p_mq_parm->mq_opcode < 0x80)
				{
					/* First MQ segment (opcodes below 0x80 never span several TSH) */
					gint iSizeAPI = 16;
					if (p_mq_parm->mq_opcode >= 0x80 && p_mq_parm->mq_opcode <= 0x9F && tvb_length_remaining(tvb, offset) >= 16)
					{
						guint32 iReturnCode = 0;
						guint32 iHdl = 0;
						iReturnCode = tvb_get_guint32_endian(tvb, offset + 8, p_mq_parm->mq_int_enc);
						iHdl = tvb_get_guint32_endian(tvb, offset + 12, p_mq_parm->mq_int_enc);
						if (iHdl != 0 && iHdl != 0xffffffff)
							col_append_fstr(pinfo->cinfo, COL_INFO, " Hdl=0x%08x", iHdl);
						if (iReturnCode != 0)
							col_append_fstr(pinfo->cinfo, COL_INFO, " [RC=%d]", iReturnCode);

						if (tree)
						{
							ti = proto_tree_add_text(mqroot_tree, tvb, offset, iSizeAPI, MQ_TEXT_API);
							mq_tree = proto_item_add_subtree(ti, ett_mq_api);

							proto_tree_add_item(mq_tree, hf_mq_api_replylen,  tvb, offset,      4, ENC_BIG_ENDIAN);
							proto_tree_add_item(mq_tree, hf_mq_api_compcode,  tvb, offset +  4, 4, p_mq_parm->mq_int_enc);
							proto_tree_add_item(mq_tree, hf_mq_api_reascode,  tvb, offset +  8, 4, p_mq_parm->mq_int_enc);
							proto_tree_add_item(mq_tree, hf_mq_api_objecthdl, tvb, offset + 12, 4, p_mq_parm->mq_int_enc);
						}
						offset += iSizeAPI;
						p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
					}
					if ((p_mq_parm->mq_strucID == MQ_STRUCTID_MSH || p_mq_parm->mq_strucID == MQ_STRUCTID_MSH_EBCDIC) && tvb_length_remaining(tvb, offset) >= 20)
					{
						gint iSize = 20;
						iSizePayload = tvb_get_guint32_endian(tvb, offset + 16, p_mq_parm->mq_int_enc);
						bPayload = TRUE;
						if (tree)
						{
							ti = proto_tree_add_text(mqroot_tree, tvb, offset, iSize, MQ_TEXT_MSH);
							mq_tree = proto_item_add_subtree(ti, ett_mq_msh);

							proto_tree_add_item(mq_tree, hf_mq_msh_StructID,   tvb, offset +  0, 4, p_mq_parm->mq_str_enc);
							proto_tree_add_item(mq_tree, hf_mq_msh_seqnum,	   tvb, offset +  4, 4, p_mq_parm->mq_int_enc);
							proto_tree_add_item(mq_tree, hf_mq_msh_datalength, tvb, offset +  8, 4, p_mq_parm->mq_int_enc);
							proto_tree_add_item(mq_tree, hf_mq_msh_unknown1,   tvb, offset + 12, 4, p_mq_parm->mq_int_enc);
							proto_tree_add_item(mq_tree, hf_mq_msh_msglength,  tvb, offset + 16, 4, p_mq_parm->mq_int_enc);
						}
						offset += iSize;
					}
					else if (p_mq_parm->mq_opcode == MQ_TST_CONAUTH_INFO && tvb_length_remaining(tvb, offset) >= 20)
					{
						gint iSize = 24;
						gint iUsr  = 0;
						gint iPsw  = 0;

						iUsr = tvb_get_guint32_endian(tvb, offset + 16, p_mq_parm->mq_int_enc);
						iPsw = tvb_get_guint32_endian(tvb, offset + 20, p_mq_parm->mq_int_enc);

						if (tree)
						{
							ti = proto_tree_add_text(mqroot_tree, tvb, offset, iSize, MQ_TEXT_CAUT);
							mq_tree = proto_item_add_subtree(ti, ett_mq_caut);

							proto_tree_add_item(mq_tree, hf_mq_caut_StructID,  tvb, offset,      4, p_mq_parm->mq_str_enc);
							proto_tree_add_item(mq_tree, hf_mq_caut_AuthType,  tvb, offset +  4, 4, p_mq_parm->mq_int_enc);
							proto_tree_add_item(mq_tree, hf_mq_caut_UsrMaxLen, tvb, offset +  8, 4, p_mq_parm->mq_int_enc);
							proto_tree_add_item(mq_tree, hf_mq_caut_PwdMaxLen, tvb, offset + 12, 4, p_mq_parm->mq_int_enc);
							proto_tree_add_item(mq_tree, hf_mq_caut_UsrLength, tvb, offset + 16, 4, p_mq_parm->mq_int_enc);
							proto_tree_add_item(mq_tree, hf_mq_caut_PwdLength, tvb, offset + 20, 4, p_mq_parm->mq_int_enc);

							if (iUsr)
								proto_tree_add_item(mq_tree, hf_mq_caut_usr, tvb, offset + 24,        iUsr, p_mq_parm->mq_str_enc);
							if (iPsw)
								proto_tree_add_item(mq_tree, hf_mq_caut_psw, tvb, offset + 24 + iUsr, iPsw, p_mq_parm->mq_str_enc);
}
						offset += iSize + iUsr + iPsw;
						p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
					}
					else if (p_mq_parm->mq_opcode == MQ_TST_SOCKET_ACTION && tvb_length_remaining(tvb, offset) >= 20)
					{
						gint iSize = 20;
						if (tree)
						{
							ti = proto_tree_add_text(mqroot_tree, tvb, offset, iSizeAPI, MQ_TEXT_SOCKET);
							mq_tree = proto_item_add_subtree(ti, ett_mq_socket);

							proto_tree_add_item(mq_tree, hf_mq_socket_conversid, tvb, offset,      4, p_mq_parm->mq_int_enc);
							proto_tree_add_item(mq_tree, hf_mq_socket_requestid, tvb, offset +  4, 4, p_mq_parm->mq_int_enc);
							proto_tree_add_item(mq_tree, hf_mq_socket_type,      tvb, offset +  8, 4, p_mq_parm->mq_int_enc);
							proto_tree_add_item(mq_tree, hf_mq_socket_parm1,     tvb, offset + 12, 4, p_mq_parm->mq_int_enc);
							proto_tree_add_item(mq_tree, hf_mq_socket_parm2,     tvb, offset + 16, 4, p_mq_parm->mq_int_enc);
						}
						offset += iSize;
						p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
					}
					else if (p_mq_parm->mq_opcode == MQ_TST_STATUS && tvb_length_remaining(tvb, offset) >= 8)
					{
						/* Some status are 28 bytes long and some are 36 bytes long */
						gint iStatus	   = 0;
						gint iStatusLength = 0;

						iStatus = tvb_get_guint32_endian(tvb, offset + 4, p_mq_parm->mq_int_enc);
						iStatusLength = tvb_get_guint32_endian(tvb, offset, p_mq_parm->mq_int_enc);

						if (tvb_length_remaining(tvb, offset) >= iStatusLength)
						{
							if (iStatus != 0)
								col_append_fstr(pinfo->cinfo, COL_INFO, " Code=%s", val_to_str(iStatus, GET_VALSV(status), "Unknown (0x%08x)"));

							if (tree)
							{
								ti = proto_tree_add_text(mqroot_tree, tvb, offset, 8, MQ_TEXT_STAT);
								mq_tree = proto_item_add_subtree(ti, ett_mq_status);

								proto_tree_add_item(mq_tree, hf_mq_status_length, tvb, offset,     4, p_mq_parm->mq_int_enc);
								proto_tree_add_item(mq_tree, hf_mq_status_code,   tvb, offset + 4, 4, p_mq_parm->mq_int_enc);

								if (iStatusLength >= 12)
									proto_tree_add_item(mq_tree, hf_mq_status_value, tvb, offset + 8, 4, p_mq_parm->mq_int_enc);
							}
							offset += iStatusLength;
						}
					}
					else if (p_mq_parm->mq_opcode == MQ_TST_PING && tvb_length_remaining(tvb, offset) > 4)
					{
						if (tree)
						{
							ti = proto_tree_add_text(mqroot_tree, tvb, offset, -1, MQ_TEXT_PING);
							mq_tree = proto_item_add_subtree(ti, ett_mq_ping);

							proto_tree_add_item(mq_tree, hf_mq_ping_length, tvb, offset,      4, p_mq_parm->mq_int_enc);
							proto_tree_add_item(mq_tree, hf_mq_ping_buffer, tvb, offset + 4, -1, ENC_NA);
						}
						offset = tvb_length(tvb);
					}
					else if (p_mq_parm->mq_opcode == MQ_TST_RESET && tvb_length_remaining(tvb, offset) >= 8)
					{
						if (tree)
						{
							ti = proto_tree_add_text(mqroot_tree, tvb, offset, -1, MQ_TEXT_RESET);
							mq_tree = proto_item_add_subtree(ti, ett_mq_reset);

							proto_tree_add_item(mq_tree, hf_mq_reset_length, tvb, offset,     4, p_mq_parm->mq_int_enc);
							proto_tree_add_item(mq_tree, hf_mq_reset_seqnum, tvb, offset + 4, 4, p_mq_parm->mq_int_enc);
						}
						offset = tvb_length(tvb);
					}
					else if ((p_mq_parm->mq_opcode == MQ_TST_MQOPEN || p_mq_parm->mq_opcode == MQ_TST_MQCLOSE ||
						 p_mq_parm->mq_opcode == MQ_TST_MQOPEN_REPLY || p_mq_parm->mq_opcode == MQ_TST_MQCLOSE_REPLY)
						 && tvb_length_remaining(tvb, offset) >= 4)
					{
						offset += dissect_mq_od(tvb, pinfo, mqroot_tree, offset, p_mq_parm, &iDistributionListSize);
						if (tree)
						{
							ti = proto_tree_add_text(mqroot_tree, tvb, offset, 4, MQ_TEXT_OPEN);
							mq_tree = proto_item_add_subtree(ti, ett_mq_open);
							if (p_mq_parm->mq_opcode == MQ_TST_MQOPEN || p_mq_parm->mq_opcode == MQ_TST_MQOPEN_REPLY)
							{
								dissect_mq_MQOO(tvb, mq_tree, offset, ett_mq_open_option, hf_mq_open_options, p_mq_parm);
							}
							if (p_mq_parm->mq_opcode == MQ_TST_MQCLOSE || p_mq_parm->mq_opcode == MQ_TST_MQCLOSE_REPLY)
							{
								dissect_mq_MQCO(tvb, mq_tree, offset, p_mq_parm);
							}
						}
						offset += 4;
						p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
						offset += dissect_mq_fopa(tvb, mqroot_tree, offset, p_mq_parm);
					}
					else if ((p_mq_parm->mq_opcode == MQ_TST_MQCONN || p_mq_parm->mq_opcode == MQ_TST_MQCONN_REPLY) &&
						tvb_length_remaining(tvb, offset) > 0)
					{
						gint iSizeCONN = 0;
						gint nofs;

						/*iSizeCONN = ((iVersionID == 4 || iVersionID == 6) ? 120 : 112);*/ /* guess */
						/* The iVersionID is available in the previous ID segment, we should keep a state
						* Instead we rely on the segment length announced in the TSH */
						/* The MQCONN structure is special because it does not start with a structid */
						iSizeCONN = iSegmentLength - iSizeTSH - iSizeAPI;
						if (iSizeCONN != 112 && iSizeCONN != 120 && iSizeCONN != 260 && iSizeCONN != 332)
							iSizeCONN = 0;

						if (iSizeCONN != 0 && tvb_length_remaining(tvb, offset) >= iSizeCONN)
						{
							guint8 *sApplicationName;
							guint8 *sQMgr;
							sApplicationName = format_text_chr(tvb_get_string_enc(wmem_packet_scope(), tvb, offset + 48, 28, p_mq_parm->mq_str_enc), 28, '.');
							if (strip_trailing_blanks(sApplicationName, 28) > 0)
							{
								col_append_fstr(pinfo->cinfo, COL_INFO, " App=%s", sApplicationName);
							}
							sQMgr = format_text_chr(tvb_get_string_enc(wmem_packet_scope(), tvb, offset, 48, p_mq_parm->mq_str_enc), 28, '.');
							if (strip_trailing_blanks(sQMgr, 48) > 0)
							{
								col_append_fstr(pinfo->cinfo, COL_INFO, " QM=%s", sQMgr);
							}

#define do_proto_add_item(a, b) b; nofs += a;
							nofs = offset;
							if (tree)
							{
								ti = proto_tree_add_text(mqroot_tree, tvb, offset, iSizeCONN, MQ_TEXT_CONN);
								mq_tree = proto_item_add_subtree(ti, ett_mq_conn);

								do_proto_add_item(48, proto_tree_add_item(mq_tree, hf_mq_conn_QMgr    , tvb, nofs, 48, p_mq_parm->mq_str_enc));
								do_proto_add_item(28, proto_tree_add_item(mq_tree, hf_mq_conn_appname , tvb, nofs, 28, p_mq_parm->mq_str_enc));
								do_proto_add_item( 4, proto_tree_add_item(mq_tree, hf_mq_conn_apptype , tvb, nofs,  4, p_mq_parm->mq_int_enc));
								do_proto_add_item(32, proto_tree_add_item(mq_tree, hf_mq_conn_acttoken, tvb, nofs, 32, ENC_NA));

								if (iSizeCONN >= 120)
								{
									do_proto_add_item(4, proto_tree_add_item(mq_tree, hf_mq_conn_version, tvb, nofs, 4, p_mq_parm->mq_int_enc));
									do_proto_add_item(4, proto_tree_add_item(mq_tree, hf_mq_conn_options, tvb, nofs, 4, p_mq_parm->mq_int_enc));
								}
								if (iSizeCONN >= 260)
								{
									proto_tree  *mq_tree_sub;

									ti =  proto_tree_add_text(mq_tree, tvb, nofs, iSizeCONN - nofs, MQ_TEXT_FCNO);
									mq_tree_sub = proto_item_add_subtree(ti, ett_mq_fcno);

									do_proto_add_item(  4, proto_tree_add_item(mq_tree_sub, hf_mq_fcno_StructID , tvb, nofs, 4, p_mq_parm->mq_str_enc));
									do_proto_add_item(  4, proto_tree_add_item(mq_tree_sub, hf_mq_fcno_unknown00, tvb, nofs, 4, p_mq_parm->mq_int_enc));
									do_proto_add_item(  4, proto_tree_add_item(mq_tree_sub, hf_mq_fcno_unknown01, tvb, nofs, 4, p_mq_parm->mq_int_enc));

									if (iSizeCONN == 260)
									{
										do_proto_add_item( 12, proto_tree_add_item(mq_tree_sub, hf_mq_fcno_msgid    , tvb, nofs, 12, p_mq_parm->mq_str_enc));
										do_proto_add_item( 48, proto_tree_add_item(mq_tree_sub, hf_mq_fcno_mqmid    , tvb, nofs, 48, p_mq_parm->mq_str_enc));
										do_proto_add_item( 68, proto_tree_add_item(mq_tree_sub, hf_mq_fcno_unknown02, tvb, nofs, 68, ENC_NA));
									}
									if (iSizeCONN >= 332)
									{
										do_proto_add_item(152, proto_tree_add_item(mq_tree_sub, hf_mq_fcno_msgid    , tvb, nofs, 152, p_mq_parm->mq_str_enc));
										proto_tree_add_item(mq_tree_sub, hf_mq_fcno_mqmid    , tvb, nofs, 48, p_mq_parm->mq_int_enc);
									}
								}
							}
#undef do_proto_add_item
							offset += iSizeCONN;
						}
					}
					else if ((p_mq_parm->mq_opcode == MQ_TST_MQINQ || p_mq_parm->mq_opcode == MQ_TST_MQINQ_REPLY || p_mq_parm->mq_opcode == MQ_TST_MQSET) && tvb_length_remaining(tvb, offset) >= 12)
					{
						/* The MQINQ/MQSET structure is special because it does not start with a structid */
						gint iNbSelectors;
						gint iNbIntegers;
						gint iCharLen;
						gint iOffsetINQ;
						gint iSelector;

						iNbSelectors = tvb_get_guint32_endian(tvb, offset    , p_mq_parm->mq_int_enc);
						iNbIntegers  = tvb_get_guint32_endian(tvb, offset + 4, p_mq_parm->mq_int_enc);
						iCharLen     = tvb_get_guint32_endian(tvb, offset + 8, p_mq_parm->mq_int_enc);

						if (tree)
						{
							ti = proto_tree_add_text(mqroot_tree, tvb, offset, -1, MQ_TEXT_INQ);
							mq_tree = proto_item_add_subtree(ti, ett_mq_inq);

							proto_tree_add_item(mq_tree, hf_mq_inq_nbsel,	tvb, offset,     4, p_mq_parm->mq_int_enc);
							proto_tree_add_item(mq_tree, hf_mq_inq_nbint,	tvb, offset + 4, 4, p_mq_parm->mq_int_enc);
							proto_tree_add_item(mq_tree, hf_mq_inq_charlen, tvb, offset + 8, 4, p_mq_parm->mq_int_enc);
						}
						iOffsetINQ = 12;
						if (tvb_length_remaining(tvb, offset + iOffsetINQ) >= iNbSelectors * 4)
						{
							if (tree)
							{
								for (iSelector = 0; iSelector < iNbSelectors; iSelector++)
								{
									proto_tree_add_item(mq_tree, hf_mq_inq_sel, tvb, offset + iOffsetINQ + iSelector * 4, 4, p_mq_parm->mq_int_enc);
								}
							}
							iOffsetINQ += iNbSelectors * 4;
							if (p_mq_parm->mq_opcode == MQ_TST_MQINQ_REPLY || p_mq_parm->mq_opcode == MQ_TST_MQSET)
							{
								gint iSizeINQValues;
								iSizeINQValues = iNbIntegers * 4 + iCharLen;
								if (tvb_length_remaining(tvb, offset + iOffsetINQ) >= iSizeINQValues)
								{
									gint iInteger;
									if (tree)
									{
										for (iInteger = 0; iInteger < iNbIntegers; iInteger++)
										{
											proto_tree_add_item(mq_tree, hf_mq_inq_intvalue, tvb, offset + iOffsetINQ + iInteger * 4, 4, p_mq_parm->mq_int_enc);
										}
									}
									iOffsetINQ += iNbIntegers * 4;
									if (iCharLen != 0)
									{
										if (tree)
										{
											proto_tree_add_item(mq_tree, hf_mq_inq_charvalues, tvb, offset + iOffsetINQ, iCharLen, p_mq_parm->mq_str_enc);
										}
									}
								}
							}
						}
						offset += tvb_length(tvb);
					}
					else if (p_mq_parm->mq_opcode == MQ_TST_NOTIFICATION)
					{
						gint iHdl;

						iHdl = tvb_get_guint32_endian(tvb, offset+4, p_mq_parm->mq_int_enc);

						col_append_fstr(pinfo->cinfo, COL_INFO, " Hdl=0x%08x", iHdl);

						if (tree)
						{
							ti = proto_tree_add_text(mqroot_tree, tvb, offset, -1, MQ_TEXT_NOTIFICATION);
							mq_tree = proto_item_add_subtree(ti, ett_mq_notif);

							proto_tree_add_item(mq_tree, hf_mq_notif_vers,	 tvb, offset,      4, p_mq_parm->mq_int_enc);
							proto_tree_add_item(mq_tree, hf_mq_notif_handle, tvb, offset +  4, 4, p_mq_parm->mq_int_enc);
							proto_tree_add_item(mq_tree, hf_mq_notif_code,	 tvb, offset +  8, 4, p_mq_parm->mq_int_enc);
							proto_tree_add_item(mq_tree, hf_mq_notif_value,	 tvb, offset + 12, 4, p_mq_parm->mq_int_enc);
						}
						offset+=16;
						p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
					}
					else if (p_mq_parm->mq_opcode == MQ_TST_REQUEST_MSGS)
					{
						gint iHdl;
						gint iFlags;
						gint iGlbMsgIdx;
						gint iMaxMsgLen;
						gint xOfs;
						gint iOpt;

						xOfs       = 0;
						iHdl       = tvb_get_guint32_endian(tvb, offset +  4, p_mq_parm->mq_int_enc);
						iMaxMsgLen = tvb_get_guint32_endian(tvb, offset + 16, p_mq_parm->mq_int_enc);
						iFlags     = tvb_get_guint32_endian(tvb, offset + 32, p_mq_parm->mq_int_enc);
						iGlbMsgIdx = tvb_get_guint32_endian(tvb, offset + 36, p_mq_parm->mq_int_enc);
						if (iFlags & 0x00000010)
						{
							p_mq_parm->mq_msgreq_ccsid.encod = tvb_get_guint32_endian(tvb, offset + 44, p_mq_parm->mq_int_enc);
							p_mq_parm->mq_msgreq_ccsid.ccsid = tvb_get_guint32_endian(tvb, offset + 48, p_mq_parm->mq_int_enc);
						}
						col_append_fstr(pinfo->cinfo, COL_INFO, " Hdl=0x%08x GlbMsgIdx=%d, MaxLen=%d",
							iHdl, iGlbMsgIdx, iMaxMsgLen);

						if (tree)
						{
							ti = proto_tree_add_text(mqroot_tree, tvb, offset, -1, MQ_TEXT_REQMSG);
							mq_tree = proto_item_add_subtree(ti, ett_mq_msg);

							proto_tree_add_item(mq_tree, hf_mq_msgreq_version,	 tvb, offset     ,  4, p_mq_parm->mq_int_enc);
							proto_tree_add_item(mq_tree, hf_mq_msgreq_handle,	 tvb, offset +  4,  4, p_mq_parm->mq_int_enc);
							proto_tree_add_item(mq_tree, hf_mq_msgreq_RecvBytes, tvb, offset +  8,  4, p_mq_parm->mq_int_enc);
							proto_tree_add_item(mq_tree, hf_mq_msgreq_RqstBytes, tvb, offset + 12,  4, p_mq_parm->mq_int_enc);
							proto_tree_add_item(mq_tree, hf_mq_msgreq_MaxMsgLen, tvb, offset + 16,  4, p_mq_parm->mq_int_enc);
							dissect_mq_MQGMO(tvb, mq_tree, offset + 20, ett_mq_gmo_option, p_mq_parm);

							proto_tree_add_item(mq_tree, hf_mq_msgreq_WaitIntrv, tvb, offset + 24,  4, p_mq_parm->mq_int_enc);
							proto_tree_add_item(mq_tree, hf_mq_msgreq_QueStatus, tvb, offset + 28,  4, p_mq_parm->mq_int_enc);
							proto_tree_add_item(mq_tree, hf_mq_msgreq_RqstFlags, tvb, offset + 32,  4, p_mq_parm->mq_int_enc);
							proto_tree_add_item(mq_tree, hf_mq_msgreq_GlbMsgIdx, tvb, offset + 36,  4, p_mq_parm->mq_int_enc);

							if (iFlags & 0x00000010)
							{
								proto_tree_add_item(mq_tree, hf_mq_msgreq_SelectIdx, tvb, offset + 40,  2, p_mq_parm->mq_int_enc);
								proto_tree_add_item(mq_tree, hf_mq_msgreq_MQMDVers,  tvb, offset + 42,  2, p_mq_parm->mq_int_enc);
								proto_tree_add_item(mq_tree, hf_mq_msgreq_ccsid,	 tvb, offset + 44,  4, p_mq_parm->mq_int_enc);
								dissect_mq_encoding(mq_tree, hf_mq_msgreq_encoding,	 tvb, offset + 48,  4, p_mq_parm->mq_int_enc);
								proto_tree_add_item(mq_tree, hf_mq_msgreq_MsgSeqNum, tvb, offset + 52,  4, p_mq_parm->mq_int_enc);
								proto_tree_add_item(mq_tree, hf_mq_msgreq_offset,	 tvb, offset + 56,  4, p_mq_parm->mq_int_enc);
								dissect_mq_MQMO(tvb, mq_tree, offset + 60, ett_mq_gmo_matchoption, p_mq_parm);
								iOpt = tvb_get_guint32_endian(tvb, offset + 60, p_mq_parm->mq_int_enc);

								if (iOpt & MQ_MQMO_MATCH_MSG_ID)
								{
									proto_tree_add_item(mq_tree, hf_mq_msgreq_mtchMsgId, tvb, offset + 64 + xOfs, 24, p_mq_parm->mq_str_enc);
									xOfs += 24;
								}
								if (iOpt & MQ_MQMO_MATCH_CORREL_ID)
								{
									proto_tree_add_item(mq_tree, hf_mq_msgreq_mtchCorId, tvb, offset + 64 + xOfs, 24, p_mq_parm->mq_str_enc);
									xOfs += 24;
								}
								if (iOpt & MQ_MQMO_MATCH_GROUP_ID)
								{
									proto_tree_add_item(mq_tree, hf_mq_msgreq_mtchGrpid, tvb, offset + 64 + xOfs, 24, p_mq_parm->mq_str_enc);
									xOfs += 24;
								}
								if (iOpt & MQ_MQMO_MATCH_MSG_TOKEN)
								{
									proto_tree_add_item(mq_tree, hf_mq_msgreq_mtchMsgTk, tvb, offset + 64 + xOfs, 16, p_mq_parm->mq_str_enc);
									xOfs += 16;
								}
							}
						}
						offset += (iFlags & 0x00000010) ? (64+xOfs) : 40;
						p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
					}
					else if (p_mq_parm->mq_opcode == MQ_TST_ASYNC_MESSAGE)
					{
						gint  iSegmIndex;
						gint  iGlbMsgIdx;
						gint  iPadLen;
						gint  iSegLength;
						gint8 iStrLen;
						gint  iHdl;
						gint  iHdrL;

						iHdl       = tvb_get_guint32_endian(tvb, offset +  4, p_mq_parm->mq_int_enc);
						iGlbMsgIdx = tvb_get_guint32_endian(tvb, offset + 12, p_mq_parm->mq_int_enc);
						iSegLength = tvb_get_guint32_endian(tvb, offset + 16, p_mq_parm->mq_int_enc);
						iSegmIndex = tvb_get_guint16_endian(tvb, offset + 20, p_mq_parm->mq_int_enc);

						if (iSegmIndex == 0)
						{
							iStrLen = tvb_get_guint8(tvb, offset + 54);
							iPadLen = (2+1+iStrLen) % 4;
							iPadLen = (iPadLen) ? 4-iPadLen : 0;
						}
						else
						{
							iPadLen = 0;
							iStrLen = 0;
						}

						iHdrL = (iSegmIndex == 0) ? (54+1+iStrLen+iPadLen) : 24;

						if (!mq_in_reassembly)
						{
							col_append_fstr(pinfo->cinfo, COL_INFO, " Hdl=0x%08x GlbMsgIdx=%d, SegIdx=%d, SegLen=%d",
								iHdl, iGlbMsgIdx, iSegmIndex, iSegLength);
						}

						if (tree)
						{
							ti = proto_tree_add_text(mqroot_tree, tvb, offset, iHdrL, MQ_TEXT_ASYMSG);
							mq_tree = proto_item_add_subtree(ti, ett_mq_msg);

							proto_tree_add_item(mq_tree, hf_mq_msgasy_version  , tvb, offset     , 4, p_mq_parm->mq_int_enc);
							proto_tree_add_item(mq_tree, hf_mq_msgasy_handle   , tvb, offset +  4, 4, p_mq_parm->mq_int_enc);
							proto_tree_add_item(mq_tree, hf_mq_msgasy_MsgIndex , tvb, offset +  8, 4, p_mq_parm->mq_int_enc);
							proto_tree_add_item(mq_tree, hf_mq_msgasy_GlbMsgIdx, tvb, offset + 12, 4, p_mq_parm->mq_int_enc);
							proto_tree_add_item(mq_tree, hf_mq_msgasy_SegLength, tvb, offset + 16, 4, p_mq_parm->mq_int_enc);
							proto_tree_add_item(mq_tree, hf_mq_msgasy_SegmIndex, tvb, offset + 20, 2, p_mq_parm->mq_int_enc);
							proto_tree_add_item(mq_tree, hf_mq_msgasy_SeleIndex, tvb, offset + 22, 2, p_mq_parm->mq_int_enc);
							if (p_mq_parm->mq_ctlf1 & MQ_TCF_FIRST)
							{
								proto_tree_add_item(mq_tree, hf_mq_msgasy_ReasonCod , tvb, offset + 24,  4, p_mq_parm->mq_int_enc);
								proto_tree_add_item(mq_tree, hf_mq_msgasy_ActMsgLen , tvb, offset + 28,  4, p_mq_parm->mq_int_enc);
								proto_tree_add_item(mq_tree, hf_mq_msgasy_TotMsgLen , tvb, offset + 32,  4, p_mq_parm->mq_int_enc);
								proto_tree_add_item(mq_tree, hf_mq_msgasy_MsgToken  , tvb, offset + 36, 16, p_mq_parm->mq_int_enc);
								proto_tree_add_item(mq_tree, hf_mq_msgasy_Status    , tvb, offset + 52,  2, p_mq_parm->mq_int_enc);
								proto_tree_add_item(mq_tree, hf_mq_msgasy_resolQNLn , tvb, offset + 54,  1, ENC_NA);
								proto_tree_add_item(mq_tree, hf_mq_msgasy_resolQNme , tvb, offset + 55, iStrLen, p_mq_parm->mq_str_enc);
								if (iPadLen)
									proto_tree_add_item(mq_tree, hf_mq_msgasy_padding  , tvb, offset + 55 + iStrLen, iPadLen, p_mq_parm->mq_str_enc);
							}
						}
						offset+=iHdrL;
						p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;

						iSizePayload = tvb_length_remaining(tvb, offset);
						bPayload = (iSizePayload>0);
					}
					else if ((p_mq_parm->mq_opcode == MQ_TST_SPI || p_mq_parm->mq_opcode == MQ_TST_SPI_REPLY) && tvb_length_remaining(tvb, offset) >= 12)
					{
						gint	iOffsetSPI = 0;
						guint32 iSpiVerb   = 0;

						p_mq_parm->iOfsEnc = offset + 12;
						p_mq_parm->iOfsCcs = offset + 16;
						p_mq_parm->iOfsFmt = offset + 20;

						iSpiVerb = tvb_get_guint32_endian(tvb, offset, p_mq_parm->mq_int_enc);
						col_append_fstr(pinfo->cinfo, COL_INFO, " (%s)", val_to_str(iSpiVerb, mq_spi_verbs_vals, "Unknown (0x%08x)"));

						if (tree)
						{
							ti = proto_tree_add_text(mqroot_tree, tvb, offset, 12, MQ_TEXT_SPI);
							mq_tree = proto_item_add_subtree(ti, ett_mq_spi);

							proto_tree_add_item(mq_tree, hf_mq_spi_verb,	tvb, offset,     4, p_mq_parm->mq_int_enc);
							proto_tree_add_item(mq_tree, hf_mq_spi_version, tvb, offset + 4, 4, p_mq_parm->mq_int_enc);
							proto_tree_add_item(mq_tree, hf_mq_spi_length,	tvb, offset + 8, 4, p_mq_parm->mq_int_enc);
						}

						offset += 12;
						p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
						if (((p_mq_parm->mq_strucID & MQ_MASK_SPxZ) == MQ_STRUCTID_SPxU ||
							(p_mq_parm->mq_strucID & MQ_MASK_SPxZ) == MQ_STRUCTID_SPxU_EBCDIC)
							&& tvb_length_remaining(tvb, offset) >= 12)
						{
							gint iSizeSPIMD = 0;
							if (tree)
							{
								guint8 *sStructId;
								sStructId = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, 4, ((p_mq_parm->mq_strucID & MQ_MASK_SPxx) == MQ_STRUCTID_SPxx) ? ENC_ASCII : ENC_EBCDIC);
								ti = proto_tree_add_text(mqroot_tree, tvb, offset, 12, "%s", sStructId);
								mq_tree = proto_item_add_subtree(ti, ett_mq_spi_base);

								proto_tree_add_item(mq_tree, hf_mq_spi_base_StructID, tvb, offset,     4, p_mq_parm->mq_str_enc);
								proto_tree_add_item(mq_tree, hf_mq_spi_base_version,  tvb, offset + 4, 4, p_mq_parm->mq_int_enc);
								proto_tree_add_item(mq_tree, hf_mq_spi_base_length,	  tvb, offset + 8, 4, p_mq_parm->mq_int_enc);
							}
							offset += 12;
							p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;

							if ((iSizeSPIMD = dissect_mq_md(tvb, mqroot_tree, offset, p_mq_parm, TRUE)) != 0)
							{
								offset += iSizeSPIMD;
								offset += dissect_mq_gmo(tvb, pinfo, mqroot_tree, offset, p_mq_parm);
								offset += dissect_mq_pmo(tvb, pinfo, mqroot_tree, offset, p_mq_parm, &iDistributionListSize);
								p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
							}

							offset += dissect_mq_od(tvb, pinfo, mqroot_tree, offset, p_mq_parm, &iDistributionListSize);

							if (((p_mq_parm->mq_strucID & MQ_MASK_SPxZ) == MQ_STRUCTID_SPxO ||
								(p_mq_parm->mq_strucID & MQ_MASK_SPxZ) == MQ_STRUCTID_SPxO_EBCDIC ||
								(p_mq_parm->mq_strucID & MQ_MASK_SPxZ) == MQ_STRUCTID_SPxI ||
								(p_mq_parm->mq_strucID & MQ_MASK_SPxZ) == MQ_STRUCTID_SPxI_EBCDIC)
								&& tvb_length_remaining(tvb, offset) >= 12)
							{
								if (tree)
								{
									/* Dissect the common part of these structures */
									guint8 *sStructId;
									sStructId = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, 4, ((p_mq_parm->mq_strucID & MQ_MASK_SPxx) == MQ_STRUCTID_SPxx) ? ENC_ASCII : ENC_EBCDIC);
									ti = proto_tree_add_text(mqroot_tree, tvb, offset, -1, "%s", sStructId);
									mq_tree = proto_item_add_subtree(ti, ett_mq_spi_base);

									proto_tree_add_item(mq_tree, hf_mq_spi_base_StructID, tvb, offset, 4, p_mq_parm->mq_str_enc);
									proto_tree_add_item(mq_tree, hf_mq_spi_base_version,  tvb, offset + 4, 4, p_mq_parm->mq_int_enc);
									proto_tree_add_item(mq_tree, hf_mq_spi_base_length,	  tvb, offset + 8, 4, p_mq_parm->mq_int_enc);
								}

								if ((p_mq_parm->mq_strucID == MQ_STRUCTID_SPQO || p_mq_parm->mq_strucID == MQ_STRUCTID_SPQO_EBCDIC)
									&& tvb_length_remaining(tvb, offset) >= 16)
								{
									if (tree)
									{
										gint iVerbNumber = 0;
										proto_tree_add_item(mq_tree, hf_mq_spi_spqo_nbverb, tvb, offset + 12, 4, p_mq_parm->mq_int_enc);
										iVerbNumber = tvb_get_guint32_endian(tvb, offset + 12, p_mq_parm->mq_int_enc);

										if (tvb_length_remaining(tvb, offset) >= iVerbNumber * 20 + 16)
										{
											gint iVerb = 0;
											iOffsetSPI = offset + 16;
											for (iVerb = 0; iVerb < iVerbNumber; iVerb++)
											{
												proto_tree_add_item(mq_tree, hf_mq_spi_spqo_verbid,	  tvb, iOffsetSPI,      4, p_mq_parm->mq_int_enc);
												proto_tree_add_item(mq_tree, hf_mq_spi_spqo_maxiover, tvb, iOffsetSPI +  4, 4, p_mq_parm->mq_int_enc);
												proto_tree_add_item(mq_tree, hf_mq_spi_spqo_maxinver, tvb, iOffsetSPI +  8, 4, p_mq_parm->mq_int_enc);
												proto_tree_add_item(mq_tree, hf_mq_spi_spqo_maxouver, tvb, iOffsetSPI + 12, 4, p_mq_parm->mq_int_enc);
												proto_tree_add_item(mq_tree, hf_mq_spi_spqo_flags,	  tvb, iOffsetSPI + 16, 4, p_mq_parm->mq_int_enc);
												iOffsetSPI += 20;
											}
											offset += iVerbNumber * 20 + 16;
										}
									}
								}
								else if ((p_mq_parm->mq_strucID == MQ_STRUCTID_SPAI || p_mq_parm->mq_strucID == MQ_STRUCTID_SPAI_EBCDIC)
									&& tvb_length_remaining(tvb, offset) >= 136)
								{
									if (tree)
									{
										proto_tree_add_item(mq_tree, hf_mq_spi_spai_mode,	  tvb, offset +  12,  4, p_mq_parm->mq_int_enc);
										proto_tree_add_item(mq_tree, hf_mq_spi_spai_unknown1, tvb, offset +  16, 48, p_mq_parm->mq_str_enc);
										proto_tree_add_item(mq_tree, hf_mq_spi_spai_unknown2, tvb, offset +  64, 48, p_mq_parm->mq_str_enc);
										proto_tree_add_item(mq_tree, hf_mq_spi_spai_msgid,	  tvb, offset + 112, 24, p_mq_parm->mq_str_enc);
									}
									offset += 136;
								}
								else if ((p_mq_parm->mq_strucID == MQ_STRUCTID_SPGI || p_mq_parm->mq_strucID == MQ_STRUCTID_SPGI_EBCDIC)
									&& tvb_length_remaining(tvb, offset) >= 24)
								{
									if (tree)
									{
										proto_tree_add_item(mq_tree, hf_mq_spi_spgi_batchsz,  tvb, offset + 12, 4, p_mq_parm->mq_int_enc);
										proto_tree_add_item(mq_tree, hf_mq_spi_spgi_batchint, tvb, offset + 16, 4, p_mq_parm->mq_int_enc);
										proto_tree_add_item(mq_tree, hf_mq_spi_spgi_maxmsgsz, tvb, offset + 20, 4, p_mq_parm->mq_int_enc);
									}
									offset += 24;
								}
								else if ((p_mq_parm->mq_strucID == MQ_STRUCTID_SPGO || p_mq_parm->mq_strucID == MQ_STRUCTID_SPPI ||
									p_mq_parm->mq_strucID == MQ_STRUCTID_SPGO_EBCDIC || p_mq_parm->mq_strucID == MQ_STRUCTID_SPPI_EBCDIC)
									&& tvb_length_remaining(tvb, offset) >= 20)
								{
									if (tree)
									{
										proto_tree_add_bitmask(mq_tree, tvb, offset + 12, hf_mq_spi_spgo_options, ett_mq_spi_options, pf_flds_spiopt, ENC_BIG_ENDIAN);
										proto_tree_add_item(mq_tree, hf_mq_spi_spgo_size, tvb, offset + 16, 4, p_mq_parm->mq_int_enc);
									}
									iSizePayload = tvb_get_guint32_endian(tvb, offset + 16, p_mq_parm->mq_int_enc);
									offset += 20;
									bPayload = TRUE;
								}
								else
								{
									offset += 12;
								}
								p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
							}
						}
					}
					else if ((p_mq_parm->mq_opcode >= 0xA0 && p_mq_parm->mq_opcode <= 0xB9) && tvb_length_remaining(tvb, offset) >= 16)
					{
						/* The XA structures are special because they do not start with a structid */
						if (tree)
						{
							ti = proto_tree_add_text(mqroot_tree, tvb, offset, 16, "%s (%s)", MQ_TEXT_XA,
								val_to_str(p_mq_parm->mq_opcode, mq_opcode_vals, "Unknown (0x%02x)"));
							mq_tree = proto_item_add_subtree(ti, ett_mq_xa);

							proto_tree_add_item(mq_tree, hf_mq_xa_length,      tvb, offset,     4, ENC_BIG_ENDIAN);
							proto_tree_add_item(mq_tree, hf_mq_xa_returnvalue, tvb, offset + 4, 4, p_mq_parm->mq_int_enc);

							proto_tree_add_bitmask(mq_tree, tvb, offset + 8, hf_mq_xa_tmflags, ett_mq_xa_tmflags, pf_flds_tmflags, ENC_BIG_ENDIAN);

							proto_tree_add_item(mq_tree, hf_mq_xa_rmid, tvb, offset + 12, 4, p_mq_parm->mq_int_enc);
						}
						offset += 16;
						if (p_mq_parm->mq_opcode == MQ_TST_XA_START || p_mq_parm->mq_opcode == MQ_TST_XA_END || p_mq_parm->mq_opcode == MQ_TST_XA_PREPARE
							|| p_mq_parm->mq_opcode == MQ_TST_XA_COMMIT || p_mq_parm->mq_opcode == MQ_TST_XA_ROLLBACK || p_mq_parm->mq_opcode == MQ_TST_XA_FORGET
							|| p_mq_parm->mq_opcode == MQ_TST_XA_COMPLETE)
						{
							gint iSizeXid = 0;
							if ((iSizeXid = dissect_mq_xid(tvb, mqroot_tree, p_mq_parm, offset)) != 0)
								offset += iSizeXid;
						}
						else if ((p_mq_parm->mq_opcode == MQ_TST_XA_OPEN || p_mq_parm->mq_opcode == MQ_TST_XA_CLOSE)
							&& tvb_length_remaining(tvb, offset) >= 1)
						{
							guint8 iXAInfoLength = 0;
							iXAInfoLength = tvb_get_guint8(tvb, offset);
							if (tvb_length_remaining(tvb, offset) >= iXAInfoLength + 1)
							{
								if (tree)
								{
									ti = proto_tree_add_text(mqroot_tree, tvb, offset, iXAInfoLength + 1, MQ_TEXT_XINF);
									mq_tree = proto_item_add_subtree(ti, ett_mq_xa_info);

									proto_tree_add_item(mq_tree, hf_mq_xa_xainfo_length, tvb, offset,     1, ENC_BIG_ENDIAN);
									proto_tree_add_item(mq_tree, hf_mq_xa_xainfo_value,  tvb, offset + 1, iXAInfoLength, p_mq_parm->mq_str_enc);
								}
							}
							offset += 1 + iXAInfoLength;
						}
						else if ((p_mq_parm->mq_opcode == MQ_TST_XA_RECOVER || p_mq_parm->mq_opcode == MQ_TST_XA_RECOVER_REPLY)
							&& tvb_length_remaining(tvb, offset) >= 4)
						{
							gint iNbXid = 0;
							iNbXid = tvb_get_guint32_endian(tvb, offset, p_mq_parm->mq_int_enc);
							if (tree)
							{
								proto_tree_add_item(mq_tree, hf_mq_xa_count, tvb, offset, 4, p_mq_parm->mq_int_enc);
							}
							offset += 4;
							if (p_mq_parm->mq_opcode == MQ_TST_XA_RECOVER_REPLY)
							{
								gint iXid = 0;
								for (iXid = 0; iXid < iNbXid; iXid++)
								{
									gint iSizeXid = 0;
									if ((iSizeXid = dissect_mq_xid(tvb, mqroot_tree, p_mq_parm, offset)) != 0)
										offset += iSizeXid;
									else
										break;
								}
							}
						}
					}
					if ((p_mq_parm->mq_strucID == MQ_STRUCTID_LPOO || p_mq_parm->mq_strucID == MQ_STRUCTID_LPOO_EBCDIC) && tvb_length_remaining(tvb, offset) >= 32)
					{
						guint iVersion;
						guint iXtraData = 0;
						gint  iSize		= 32;
						iVersion = tvb_get_guint32_endian(tvb, offset+4, p_mq_parm->mq_int_enc);
						if (iVersion >= 3)
						{
							iSize += 56;
							iXtraData = tvb_get_guint32_endian(tvb, offset + 84, p_mq_parm->mq_int_enc);
						}

						if (iSize != 0 && tvb_length_remaining(tvb, offset) >= iSize)
						{
							if (tree)
							{
								ti = proto_tree_add_text(mqroot_tree, tvb, offset, iSize, MQ_TEXT_LPOO);
								mq_tree = proto_item_add_subtree(ti, ett_mq_lpoo);

								proto_tree_add_item(mq_tree, hf_mq_lpoo_StructID, tvb, offset,     4, p_mq_parm->mq_str_enc);
								proto_tree_add_item(mq_tree, hf_mq_lpoo_version,  tvb, offset + 4, 4, p_mq_parm->mq_int_enc);

								dissect_mq_MQOO(tvb, mq_tree, offset+8, ett_mq_lpoo_options, hf_mq_lpoo_options, p_mq_parm);

								dissect_mq_LPOO_LPIOPTS(tvb, mq_tree, offset+16, ett_mq_lpoo_lpiopts, p_mq_parm);
								proto_tree_add_item(mq_tree, hf_mq_lpoo_defpersist,		tvb, offset + 20, 4, p_mq_parm->mq_int_enc);
								proto_tree_add_item(mq_tree, hf_mq_lpoo_defputresptype, tvb, offset + 24, 4, p_mq_parm->mq_int_enc);
								proto_tree_add_item(mq_tree, hf_mq_lpoo_defreadahead,	tvb, offset + 28, 4, p_mq_parm->mq_int_enc);
								if (iVersion >= 3)
								{
									proto_tree_add_item(mq_tree, hf_mq_lpoo_qprotect,   tvb, offset + 32, 48, p_mq_parm->mq_int_enc);
									proto_tree_add_item(mq_tree, hf_mq_lpoo_unknown6,   tvb, offset + 80,  4, p_mq_parm->mq_int_enc);
									/*proto_tree_add_item(mq_tree, hf_mq_lpoo_unknown7,   tvb, offset + 84,  2, p_mq_parm->mq_int_enc);*/
									proto_tree_add_item(mq_tree, hf_mq_lpoo_xtradata,   tvb, offset + 84,  4, p_mq_parm->mq_int_enc);
								}
							}
							offset += iSize;
							p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
							if (iXtraData>0)
							{
								if (p_mq_parm->mq_opcode == MQ_TST_SPI_REPLY)
								{
									bPayload		   = TRUE;
									iSizePayload	   = iXtraData;
									p_mq_parm->iOfsFmt = (offset-iSize);
								}
							}
						}
					}
					if ((p_mq_parm->mq_strucID == MQ_STRUCTID_ID || p_mq_parm->mq_strucID == MQ_STRUCTID_ID_EBCDIC) && tvb_length_remaining(tvb, offset) >= 5)
					{
						offset += dissect_mq_id(tvb, pinfo, mqroot_tree, offset, p_mq_parm);
						p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
					}
					if ((p_mq_parm->mq_strucID == MQ_STRUCTID_UID || p_mq_parm->mq_strucID == MQ_STRUCTID_UID_EBCDIC) && tvb_length_remaining(tvb, offset) > 0)
					{
						gint iSizeUID;
						/* iSizeUID = (iVersionID < 5 ? 28 : 132);  guess */
						/* The iVersionID is available in the previous ID segment, we should keep a state *
						 * Instead we rely on the segment length announced in the TSH */
						iSizeUID = iSegmentLength - iSizeTSH;
						if (iSizeUID != 28 && iSizeUID != 132)
							iSizeUID = 0;

						if (iSizeUID != 0 && tvb_length_remaining(tvb, offset) >= iSizeUID)
						{
							guint8 *sUserId;
							sUserId = tvb_get_string_enc(wmem_packet_scope(), tvb, offset + 4, 12, p_mq_parm->mq_str_enc);
							if (strip_trailing_blanks(sUserId, 12) > 0)
							{
								col_append_fstr(pinfo->cinfo, COL_INFO, " User=%s", sUserId);
							}

							if (tree)
							{
								ti = proto_tree_add_text(mqroot_tree, tvb, offset, iSizeUID, MQ_TEXT_UID);
								mq_tree = proto_item_add_subtree(ti, ett_mq_uid);

								proto_tree_add_item(mq_tree, hf_mq_uid_StructID, tvb, offset,       4, p_mq_parm->mq_str_enc);
								proto_tree_add_item(mq_tree, hf_mq_uid_userid,   tvb, offset +  4, 12, p_mq_parm->mq_str_enc);
								proto_tree_add_item(mq_tree, hf_mq_uid_password, tvb, offset + 16, 12, p_mq_parm->mq_str_enc);
							}

							if (iSizeUID == 132)
							{
								if (tree)
								{
									proto_tree_add_item(mq_tree, hf_mq_uid_longuserid, tvb, offset + 28, 64, p_mq_parm->mq_str_enc);
									dissect_mq_sid(tvb, mq_tree, p_mq_parm, offset + 92);
								}
							}
						}
						offset += iSizeUID;
						p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
					}

					offset += dissect_mq_od(tvb, pinfo, mqroot_tree, offset, p_mq_parm, &iDistributionListSize);

					if ((iSizeMD = dissect_mq_md(tvb, mqroot_tree, offset, p_mq_parm, TRUE)) != 0)
					{
						gint iSizeGMO = 0;
						gint iSizePMO = 0;
						offset += iSizeMD;

						if ((iSizeGMO = dissect_mq_gmo(tvb, pinfo, mqroot_tree, offset, p_mq_parm)) != 0)
						{
							offset   += iSizeGMO;
							bPayload  = TRUE;
						}
						else if ((iSizePMO = dissect_mq_pmo(tvb, pinfo, mqroot_tree, offset, p_mq_parm, &iDistributionListSize)) != 0)
						{
							offset   += iSizePMO;
							bPayload  = TRUE;
						}
						if (tvb_length_remaining(tvb, offset) >= 4)
						{
							if (bPayload == TRUE && (p_mq_parm->mq_opcode != MQ_TST_ASYNC_MESSAGE))
							{
								iSizePayload = tvb_get_guint32_endian(tvb, offset, p_mq_parm->mq_int_enc);
								if (tree)
								{
									ti = proto_tree_add_text(mqroot_tree, tvb, offset, 4, MQ_TEXT_PUT);
									mq_tree = proto_item_add_subtree(ti, ett_mq_put);
									proto_tree_add_item(mq_tree, hf_mq_put_length, tvb, offset, 4, p_mq_parm->mq_int_enc);
								}
								offset += 4;
							}
						}
					}
					if (iDistributionListSize > 0)
					{
						col_append_fstr(pinfo->cinfo, COL_INFO, " (Distribution List, Size=%d)", iDistributionListSize);
					}
					if (bPayload == TRUE)
					{
						if (iSizePayload != 0 && tvb_length_remaining(tvb, offset) > 0)
						{
							/* For the following header structures, each structure has a "format" field
							which announces the type of the following structure.  For dissection we
							do not use it and rely on the structid instead. */
							guint32 iHeadersLength = 0;
							if (tvb_length_remaining(tvb, offset) >= 4)
							{
								gint iSizeMD2 = 0;
								p_mq_parm->mq_strucID = tvb_get_ntohl(tvb, offset);

								if ((p_mq_parm->mq_strucID == MQ_STRUCTID_XQH || p_mq_parm->mq_strucID == MQ_STRUCTID_XQH_EBCDIC) && tvb_length_remaining(tvb, offset) >= 104)
								{
									/* if MD.format == MQXMIT */
									gint iSizeXQH = 104;
									if (tree)
									{
										ti = proto_tree_add_text(mqroot_tree, tvb, offset, iSizeXQH, MQ_TEXT_XQH);
										mq_tree = proto_item_add_subtree(ti, ett_mq_xqh);

										proto_tree_add_item(mq_tree, hf_mq_xqh_StructID,   tvb, offset,       4, p_mq_parm->mq_str_enc);
										proto_tree_add_item(mq_tree, hf_mq_xqh_version,	   tvb, offset +  4,  4, p_mq_parm->mq_int_enc);
										proto_tree_add_item(mq_tree, hf_mq_xqh_remoteq,	   tvb, offset +  8, 48, p_mq_parm->mq_str_enc);
										proto_tree_add_item(mq_tree, hf_mq_xqh_remoteqmgr, tvb, offset + 56, 48, p_mq_parm->mq_str_enc);
									}
									offset += iSizeXQH;
									iHeadersLength += iSizeXQH;

									if ((iSizeMD2 = dissect_mq_md(tvb, mqroot_tree, offset, p_mq_parm, TRUE)) != 0)
									{
										offset += iSizeMD2;
										iHeadersLength += iSizeMD2;
									}

									p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
								}
								if ((p_mq_parm->mq_strucID == MQ_STRUCTID_DH || p_mq_parm->mq_strucID == MQ_STRUCTID_DH_EBCDIC) && tvb_length_remaining(tvb, offset) >= 48)
								{
									/* if MD.format == MQHDIST */
									gint	iSizeDH		= 48;
									gint	iNbrRecords = 0;
									guint32 iRecFlags	= 0;

									iNbrRecords = tvb_get_guint32_endian(tvb, offset + 36, p_mq_parm->mq_int_enc);
									iRecFlags = tvb_get_guint32_endian(tvb, offset + 32, p_mq_parm->mq_int_enc);
									p_mq_parm->iOfsEnc = offset + 12;
									p_mq_parm->iOfsCcs = offset + 16;
									p_mq_parm->iOfsFmt = offset + 20;

									p_mq_parm->mq_head_ccsid.encod = tvb_get_guint32_endian(tvb, offset + 12, p_mq_parm->mq_int_enc);
									p_mq_parm->mq_head_ccsid.ccsid = tvb_get_guint32_endian(tvb, offset + 16, p_mq_parm->mq_int_enc);

									if (tree)
									{
										ti = proto_tree_add_text(mqroot_tree, tvb, offset, iSizeDH, MQ_TEXT_DH);
										mq_tree = proto_item_add_subtree(ti, ett_mq_dh);

										proto_tree_add_item(mq_tree, hf_mq_head_StructID,	tvb, offset,      4, p_mq_parm->mq_str_enc);
										proto_tree_add_item(mq_tree, hf_mq_head_version,	tvb, offset +  4, 4, p_mq_parm->mq_int_enc);
										proto_tree_add_item(mq_tree, hf_mq_head_length,		tvb, offset +  8, 4, p_mq_parm->mq_int_enc);
										dissect_mq_encoding(mq_tree, hf_mq_head_encoding,	tvb, offset + 12, 4, p_mq_parm->mq_int_enc);
										proto_tree_add_item(mq_tree, hf_mq_head_ccsid,		tvb, offset + 16, 4, p_mq_parm->mq_int_enc);
										proto_tree_add_item(mq_tree, hf_mq_head_format,		tvb, offset + 20, 8, p_mq_parm->mq_str_enc);
										proto_tree_add_item(mq_tree, hf_mq_head_flags,		tvb, offset + 28, 4, p_mq_parm->mq_int_enc);
										proto_tree_add_item(mq_tree, hf_mq_dh_putmsgrecfld, tvb, offset + 32, 4, p_mq_parm->mq_int_enc);
										proto_tree_add_item(mq_tree, hf_mq_dh_recspresent,	tvb, offset + 36, 4, p_mq_parm->mq_int_enc);
										proto_tree_add_item(mq_tree, hf_mq_dh_objrecofs ,	tvb, offset + 40, 4, p_mq_parm->mq_int_enc);
										proto_tree_add_item(mq_tree, hf_mq_dh_putmsgrecofs, tvb, offset + 44, 4, p_mq_parm->mq_int_enc);
									}
									offset += iSizeDH;
									iHeadersLength += iSizeDH;

									if (iNbrRecords > 0)
									{
										gint iOffsetOR	= 0;
										gint iOffsetPMR = 0;
										gint iSizeORPMR = 0;

										iOffsetOR =	 tvb_get_guint32_endian(tvb, offset - iSizeDH + 40, p_mq_parm->mq_int_enc);
										iOffsetPMR = tvb_get_guint32_endian(tvb, offset - iSizeDH + 44, p_mq_parm->mq_int_enc);
										if ((iSizeORPMR = dissect_mq_or(tvb, mqroot_tree, offset, iNbrRecords, iOffsetOR, p_mq_parm)) != 0)
										{
											offset += iSizeORPMR;
											iHeadersLength += iSizeORPMR;
										}
										if ((iSizeORPMR = dissect_mq_pmr(tvb, mqroot_tree, offset, iNbrRecords, iOffsetPMR, iRecFlags, p_mq_parm)) != 0)
										{
											offset += iSizeORPMR;
											iHeadersLength += iSizeORPMR;
										}
									}

									p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
								}
								if ((p_mq_parm->mq_strucID == MQ_STRUCTID_DLH || p_mq_parm->mq_strucID == MQ_STRUCTID_DLH_EBCDIC) && tvb_length_remaining(tvb, offset) >= 172)
								{
									/* if MD.format == MQDEAD */
									gint iSizeDLH = 172;
									p_mq_parm->iOfsEnc = offset + 108;
									p_mq_parm->iOfsCcs = offset + 112;
									p_mq_parm->iOfsFmt = offset + 116;

									p_mq_parm->mq_dlh_ccsid.encod = tvb_get_guint32_endian(tvb, offset + 108, p_mq_parm->mq_int_enc);
									p_mq_parm->mq_dlh_ccsid.ccsid = tvb_get_guint32_endian(tvb, offset + 112, p_mq_parm->mq_int_enc);

									if (tree)
									{
										ti = proto_tree_add_text(mqroot_tree, tvb, offset, iSizeDLH, MQ_TEXT_DLH);
										mq_tree = proto_item_add_subtree(ti, ett_mq_dlh);

										proto_tree_add_item(mq_tree, hf_mq_dlh_StructID,	tvb, offset,        4, p_mq_parm->mq_str_enc);
										proto_tree_add_item(mq_tree, hf_mq_dlh_version,		tvb, offset +   4,  4, p_mq_parm->mq_int_enc);
										proto_tree_add_item(mq_tree, hf_mq_dlh_reason,		tvb, offset +   8,  4, p_mq_parm->mq_int_enc);
										proto_tree_add_item(mq_tree, hf_mq_dlh_destq,		tvb, offset +  12, 48, p_mq_parm->mq_str_enc);
										proto_tree_add_item(mq_tree, hf_mq_dlh_destqmgr,	tvb, offset +  60, 48, p_mq_parm->mq_str_enc);
										dissect_mq_encoding(mq_tree, hf_mq_dlh_encoding,	tvb, offset + 108,  4, p_mq_parm->mq_int_enc);
										proto_tree_add_item(mq_tree, hf_mq_dlh_ccsid,		tvb, offset + 112,  4, p_mq_parm->mq_int_enc);
										proto_tree_add_item(mq_tree, hf_mq_dlh_format,		tvb, offset + 116,  8, p_mq_parm->mq_str_enc);
										proto_tree_add_item(mq_tree, hf_mq_dlh_putappltype, tvb, offset + 124,  4, p_mq_parm->mq_int_enc);
										proto_tree_add_item(mq_tree, hf_mq_dlh_putapplname, tvb, offset + 128, 28, p_mq_parm->mq_str_enc);
										proto_tree_add_item(mq_tree, hf_mq_dlh_putdate,		tvb, offset + 156,  8, p_mq_parm->mq_str_enc);
										proto_tree_add_item(mq_tree, hf_mq_dlh_puttime,		tvb, offset + 164,  8, p_mq_parm->mq_str_enc);
									}
									offset += iSizeDLH;
									iHeadersLength += iSizeDLH;
									p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
								}
								if ((p_mq_parm->mq_strucID == MQ_STRUCTID_MDE || p_mq_parm->mq_strucID == MQ_STRUCTID_MDE_EBCDIC) && tvb_length_remaining(tvb, offset) >= 72)
								{
									/* if MD.format == MQHMDE */
									gint iSizeMDE = 72;
									p_mq_parm->iOfsEnc = offset + 12;
									p_mq_parm->iOfsCcs = offset + 16;
									p_mq_parm->iOfsFmt = offset + 20;
									if (tree)
									{
										ti = proto_tree_add_text(mqroot_tree, tvb, offset, iSizeMDE, MQ_TEXT_MDE);
										mq_tree = proto_item_add_subtree(ti, ett_mq_mde);

										proto_tree_add_item(mq_tree, hf_mq_head_StructID,	tvb, offset,       4, p_mq_parm->mq_str_enc);
										proto_tree_add_item(mq_tree, hf_mq_head_version,	tvb, offset +  4,  4, p_mq_parm->mq_int_enc);
										proto_tree_add_item(mq_tree, hf_mq_head_length,		tvb, offset +  8,  4, p_mq_parm->mq_int_enc);
										dissect_mq_encoding(mq_tree, hf_mq_head_encoding,	tvb, offset + 12,  4, p_mq_parm->mq_int_enc);
										proto_tree_add_item(mq_tree, hf_mq_head_ccsid,		tvb, offset + 16,  4, p_mq_parm->mq_int_enc);
										proto_tree_add_item(mq_tree, hf_mq_head_format,		tvb, offset + 20,  8, p_mq_parm->mq_str_enc);
										proto_tree_add_item(mq_tree, hf_mq_head_flags,		tvb, offset + 28,  4, p_mq_parm->mq_int_enc);
										proto_tree_add_item(mq_tree, hf_mq_md_groupid,		tvb, offset + 32, 24, ENC_NA);
										proto_tree_add_item(mq_tree, hf_mq_md_msgseqnumber, tvb, offset + 56,  4, p_mq_parm->mq_int_enc);
										proto_tree_add_item(mq_tree, hf_mq_md_offset,		tvb, offset + 60,  4, p_mq_parm->mq_int_enc);
										proto_tree_add_item(mq_tree, hf_mq_md_msgflags,		tvb, offset + 64,  4, p_mq_parm->mq_int_enc);
										proto_tree_add_item(mq_tree, hf_mq_md_origlen,		tvb, offset + 68,  4, p_mq_parm->mq_int_enc);
									}
									offset += iSizeMDE;
									iHeadersLength += iSizeMDE;
									p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
								}
								if ((p_mq_parm->mq_strucID == MQ_STRUCTID_CIH || p_mq_parm->mq_strucID == MQ_STRUCTID_CIH_EBCDIC
									|| p_mq_parm->mq_strucID == MQ_STRUCTID_IIH || p_mq_parm->mq_strucID == MQ_STRUCTID_IIH_EBCDIC
									|| p_mq_parm->mq_strucID == MQ_STRUCTID_RFH || p_mq_parm->mq_strucID == MQ_STRUCTID_RFH_EBCDIC
									|| p_mq_parm->mq_strucID == MQ_STRUCTID_RMH || p_mq_parm->mq_strucID == MQ_STRUCTID_RMH_EBCDIC
									|| p_mq_parm->mq_strucID == MQ_STRUCTID_WIH || p_mq_parm->mq_strucID == MQ_STRUCTID_WIH_EBCDIC)
									&& tvb_length_remaining(tvb, offset) >= 12)
								{
									/* Dissect the generic part of the other pre-defined headers */
									/* We assume that only one such header is present */
									gint iSizeHeader = 0;
									iSizeHeader = (gint) tvb_get_guint32_endian(tvb, offset + 8, p_mq_parm->mq_int_enc);
									/* XXX - 32 is inferred from the code below.  What's the
									* correct minimum? */
									if (iSizeHeader <= 32)
										THROW(ReportedBoundsError);

									if (tvb_length_remaining(tvb, offset) >= iSizeHeader)
									{
										p_mq_parm->iOfsEnc = offset + 12;
										p_mq_parm->iOfsCcs = offset + 16;
										p_mq_parm->iOfsFmt = offset + 20;
										if (tree)
										{
											ti = proto_tree_add_text(mqroot_tree, tvb, offset, iSizeHeader, "%s", val_to_str(p_mq_parm->mq_strucID, mq_StructID_vals, "Unknown (0x%08x)"));
											mq_tree = proto_item_add_subtree(ti, ett_mq_head);

											proto_tree_add_item(mq_tree, hf_mq_head_StructID, tvb, offset,      4, p_mq_parm->mq_str_enc);
											proto_tree_add_item(mq_tree, hf_mq_head_version,  tvb, offset +  4, 4, p_mq_parm->mq_int_enc);
											proto_tree_add_item(mq_tree, hf_mq_head_length,	  tvb, offset +  8, 4, p_mq_parm->mq_int_enc);
											dissect_mq_encoding(mq_tree, hf_mq_head_encoding, tvb, offset + 12, 4, p_mq_parm->mq_int_enc);
											proto_tree_add_item(mq_tree, hf_mq_head_ccsid,	  tvb, offset + 16, 4, p_mq_parm->mq_int_enc);
											proto_tree_add_item(mq_tree, hf_mq_head_format,	  tvb, offset + 20, 8, p_mq_parm->mq_str_enc);
											proto_tree_add_item(mq_tree, hf_mq_head_flags,	  tvb, offset + 28, 4, p_mq_parm->mq_int_enc);
											proto_tree_add_item(mq_tree, hf_mq_head_struct,	  tvb, offset + 32, iSizeHeader - 32, ENC_NA);

										}
										offset += iSizeHeader;
										iHeadersLength += iSizeHeader;
										p_mq_parm->mq_strucID = (tvb_length_remaining(tvb, offset) >= 4) ? tvb_get_ntohl(tvb, offset) : MQ_STRUCTID_NULL;
									}
								}
							}

							col_append_fstr(pinfo->cinfo, COL_INFO, " (%d bytes)", iSizePayload - iHeadersLength);

							if (!mq_in_reassembly)
							{
								/* Call subdissector for the payload */
								tvbuff_t *next_tvb;
#if 0
								struct mqinfo *mqinfo;
								mqinfo = wmem_new0(wmem_packet_scope(), struct mqinfo);
								/* Format, encoding and character set are "data type" information, not subprotocol information */
								mqinfo->encoding = tvb_get_guint32_endian(tvb, p_mq_parm->iOfsEnc, p_mq_parm->mq_int_enc);
								mqinfo->ccsid    = tvb_get_guint32_endian(tvb, p_mq_parm->iOfsCcs, p_mq_parm->mq_int_enc);
								memcpy(mqinfo->format,
									tvb_get_string_enc(wmem_packet_scope(), tvb, p_mq_parm->iOfsFmt, sizeof(mqinfo->format), p_mq_parm->mq_str_enc),
									sizeof(mqinfo->format));
#endif
								p_mq_parm->mq_cur_ccsid.encod = tvb_get_guint32_endian(tvb, p_mq_parm->iOfsEnc, p_mq_parm->mq_int_enc);
								p_mq_parm->mq_cur_ccsid.ccsid = tvb_get_guint32_endian(tvb, p_mq_parm->iOfsCcs, p_mq_parm->mq_int_enc);
								memcpy(p_mq_parm->mq_format,
									tvb_get_string_enc(wmem_packet_scope(), tvb, p_mq_parm->iOfsFmt, sizeof(p_mq_parm->mq_format), p_mq_parm->mq_str_enc),
									sizeof(p_mq_parm->mq_format));

								next_tvb = tvb_new_subset_remaining(tvb, offset);
								if (!dissector_try_heuristic(mq_heur_subdissector_list, next_tvb, pinfo, mqroot_tree, p_mq_parm))
									call_dissector(data_handle, next_tvb, pinfo, mqroot_tree);
							}
							else
							{
								tvbuff_t *next_tvb;
								next_tvb = tvb_new_subset_remaining(tvb, offset);
								call_dissector(data_handle, next_tvb, pinfo, mqroot_tree);
							}
						}
						offset = tvb_length(tvb);
					}
					/* After all recognised structures have been dissected, process remaining structure*/
					if (tvb_length_remaining(tvb, offset) >= 4)
					{
						p_mq_parm->mq_strucID = tvb_get_ntohl(tvb, offset);
						if (tree)
						{
							proto_tree_add_text(mqroot_tree, tvb, offset, -1, "%s", val_to_str(p_mq_parm->mq_strucID, mq_StructID_vals, "Unknown (0x%08x)"));
						}
					}
				}
				else
				{
					/* This is a MQ segment continuation (if MQ reassembly is not enabled) */
					col_append_str(pinfo->cinfo, COL_INFO, " [Unreassembled MQ]");
					call_dissector(data_handle, tvb_new_subset_remaining(tvb, offset), pinfo, tree);
				}
			}
		}
		else
		{
			/* This packet is a TCP continuation of a segment (if desegmentation is not enabled) */
			col_append_str(pinfo->cinfo, COL_INFO, " [Undesegmented]");
			if (tree)
			{
				proto_tree_add_item(tree, proto_mq, tvb, offset, -1, ENC_NA);
			}
			call_dissector(data_handle, tvb_new_subset_remaining(tvb, offset), pinfo, tree);
		}
	}
}

static int reassemble_mq(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
{
	mq_parm_t mq_parm;

	/* Reassembly of the MQ messages that span several PDU (several TSH) */
	/* Typically a TCP PDU is 1460 bytes and a MQ PDU is 32766 bytes */
	if (tvb_length(tvb) < 28)
        return 0;

	memset(&mq_parm, 0, sizeof(mq_parm_t));
	mq_parm.mq_strucID = tvb_get_ntohl(tvb, 0);

	if ( (mq_parm.mq_strucID & MQ_MASK_TSHx) == MQ_STRUCTID_TSHx || (mq_parm.mq_strucID & MQ_MASK_TSHx) == MQ_STRUCTID_TSHx_EBCDIC )
	{
		guint8   iCtlF		= 0;
		gint32   iSegL		= 0;
		gint32   iBegL		= 0;
		gint32   iEnco		= 0;
		gint32   iMulS		= 0;
		gint32   iHdrL		= 0;
		gint32   iNxtP		= 0;
		guint8   iOpcd		= 0;
		gboolean bSeg1st	= FALSE;
		gboolean bSegLst	= FALSE;
		gboolean bMore		= FALSE;

		gint32	 iHdl       = 0;
		gint32	 iGlbMsgIdx = 0;
		gint32	 iSegLength = 0;
		gint16	 iSegmIndex = 0;

		guint32	 uStrL		= 0;
		guint32	 uPadL		= 0;

		/* TSHM structure as 8 bytes more after the length (convid/requestid) */
		if (mq_parm.mq_strucID == MQ_STRUCTID_TSHM || mq_parm.mq_strucID == MQ_STRUCTID_TSHM_EBCDIC)
			iMulS = 8;

		/* Get the Encoding scheme */
		iEnco	= (tvb_get_guint8(tvb,  8 + iMulS) == MQ_LITTLE_ENDIAN ? ENC_LITTLE_ENDIAN : ENC_BIG_ENDIAN);
		/* Get the Operation Code */
		iOpcd	= tvb_get_guint8( tvb,  9 + iMulS);
		/* Get the Control Flag */
		iCtlF	= tvb_get_guint8( tvb, 10 + iMulS);
		/* Get the Semgnet Length */
		iSegL	= tvb_get_ntohl ( tvb, 4);
		/* First Segment ? */
		bSeg1st = ((iCtlF & MQ_TCF_FIRST) != 0);
		/* Last Segment */
		bSegLst = ((iCtlF & MQ_TCF_LAST) != 0);

		mq_in_reassembly = FALSE;

		if ((iOpcd > 0x80 && !(bSeg1st && bSegLst)) || iOpcd == MQ_TST_ASYNC_MESSAGE)
		{
			proto_tree *mq_tree = NULL;

			/* Optimisation : only fragmented segments go through the reassembly process */
			/*
			  It seems that after a PUT on a Queue, when doing a GET, MQ first get
			  a small part of the response (4096 bytes)
			  The response contain the number of bytes returned for this request (ActMsgLen)
			  and the total number of bytes of this reply	(TotMsgLen)

			  this mean the flow seems to be :

			  PUT
			  REQUEST_MSG (MaxLen=4096)
			  ASYNC_MSG (1st/Lst Segment, ActMsgLen=4096, TotMsgLen=279420)
			  as ActMsgLen!=TotMsgLen, this mean the MSG is not complete, we only receive some of 279420 bytes
			  REQUEST_MSG (MaxLen=279420)
			  ASYNC_MSG (1st Segment, SegIndex=0 ActMsgLen=279420, TotMsgLen=279420)
			  ASYNC_MSG (Mid Segment, SegIndex=1)
			  ASYNC_MSG (Mid Segment, SegIndex=2)
			  .
			  ASYNC_MSG (Lst Segment, SegIndex=n)
			  End of reassembling (we have 279420 bytes to decode)
			*/

			if (mq_reassembly)
			{
				fragment_head *fd_head;
				guint32 iConnectionId = (pinfo->srcport + pinfo->destport);
				iHdrL = 28 + iMulS;

				/* Get the MQ Handle of the Object */
				iHdl = tvb_get_guint32_endian(tvb, iHdrL + 4, iEnco);
				/* Get the Global Message Index */
				iGlbMsgIdx = tvb_get_guint32_endian(tvb, iHdrL + 12, iEnco);
				/* Get the Segment Length */
				iSegLength = tvb_get_guint32_endian(tvb, iHdrL + 16, iEnco);
				/* Get the Segment Index */
				iSegmIndex = tvb_get_guint16_endian(tvb, iHdrL +20, iEnco);

				/*
				  if SegmIndex == 0, it has 54 bytes + the length and padding
				  of a variable string at the end of the Header
				*/

				if (iSegmIndex == 0)
				{
					uStrL = tvb_get_guint8(tvb, iHdrL + 54);
					uPadL = ((((2+1+uStrL)/4)+1)*4)-(2+1+uStrL);
				}
				bMore = !bSegLst;
				/*
				  First segment has a longer header
				*/
				iNxtP  = iHdrL + ((bSeg1st) ? (54 + 1 + uStrL + uPadL) : (24));
				iNxtP += dissect_mq_md(tvb, NULL, iNxtP, &mq_parm, FALSE);

				/*
				  if it is the 1st Segment, it means we are
				  of the beginning of a reassembling. We must take the whole segment (with tSHM, and headers)
				*/
				iBegL = (bSeg1st) ? 0 : iNxtP;

				fd_head = fragment_add_seq_next(&mq_reassembly_table,
					tvb, iBegL,
					pinfo, iConnectionId, NULL,
					iSegL - iBegL, bMore);

				if (tree)
				{
					proto_item *ti = proto_tree_add_item(tree, proto_mq, tvb, 0, -1, ENC_NA);
					if (bMore)
					{
						proto_item_append_text(ti, " [%s of a Reassembled MQ Segment] Hdl=0x%08x GlbMsgIdx=%d, SegIdx=%d, SegLen=%d",
							val_to_str(iOpcd, mq_opcode_vals, "Unknown (0x%02x)"),
							iHdl, iGlbMsgIdx, iSegmIndex, iSegLength);
					}
					else
					{
						proto_item_append_text(ti, " %s Hdl=0x%08x GlbMsgIdx=%d, SegIdx=%d, SegLen=%d",
							val_to_str(iOpcd, mq_opcode_vals, "Unknown (0x%02x)"),
							iHdl, iGlbMsgIdx, iSegmIndex, iSegLength);
					}
					mq_tree = proto_item_add_subtree(ti, ett_mq_reaasemb);
				}
				else
				{
					mq_tree = tree;
				}

				if (fd_head != NULL && pinfo->fd->num == fd_head->reassembled_in)
				{
					tvbuff_t *next_tvb;

					/* Reassembly finished */
					if (fd_head->next != NULL)
					{
						/* 2 or more fragments */
						next_tvb = tvb_new_chain(tvb, fd_head->tvb_data);
						add_new_data_source(pinfo, next_tvb, "Reassembled MQ");
					}
					else
					{
						/* Only 1 fragment */
						next_tvb = tvb;
					}
					dissect_mq_pdu(next_tvb, pinfo, mq_tree);
					return tvb_length(tvb);
				}
				else
				{
					mq_in_reassembly = TRUE;
					/* Reassembly in progress */
					col_set_str(pinfo->cinfo, COL_PROTOCOL, "MQ");
					col_add_fstr(pinfo->cinfo, COL_INFO, "[%s of a Reassembled MQ Segment] Hdl=0x%08x GlbMsgIdx=%d, SegIdx=%d, SegLen=%d",
						val_to_str(iOpcd, mq_opcode_vals, "Unknown (0x%02x)"),
						iHdl, iGlbMsgIdx, iSegmIndex, iSegLength);
					dissect_mq_pdu(tvb, pinfo, mq_tree);
					return tvb_length(tvb);
				}
			}
			else
			{
				dissect_mq_pdu(tvb, pinfo, mq_tree);   /* XXX: mq_tree always NULL ?? */
				if (bSeg1st)
				{
					/* MQ segment is the first of a unreassembled series */
					col_append_str(pinfo->cinfo, COL_INFO, " [Unreassembled MQ]");
				}
				return tvb_length(tvb);
			}
		}
		/* Reassembly not enabled or non-fragmented message */
		dissect_mq_pdu(tvb, pinfo, tree);
	}

	return tvb_length(tvb);
}

static guint get_mq_pdu_len(packet_info *pinfo _U_, tvbuff_t *tvb, int offset)
{
	if (tvb_length_remaining(tvb, offset) >= 8)
	{
		guint32 mq_strucID = tvb_get_ntohl(tvb, 0);
		if ( (mq_strucID & MQ_MASK_TSHx) == MQ_STRUCTID_TSHx || (mq_strucID & MQ_MASK_TSHx) == MQ_STRUCTID_TSHx_EBCDIC )
		{
			return tvb_get_ntohl(tvb, offset + 4);
		}
	}
	return 0;
}

static int dissect_mq_tcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
	tcp_dissect_pdus(tvb, pinfo, tree, mq_desegment, 28, get_mq_pdu_len, reassemble_mq, data);
	return tvb_length(tvb);
}

static void dissect_mq_spx(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
	/* Since SPX has no standard desegmentation, MQ cannot be performed as well */
	dissect_mq_pdu(tvb, pinfo, tree);
}

static gboolean dissect_mq_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint iProto, void *data)
{
	if (tvb_length(tvb) >= 28)
	{
		guint32 mq_strucID = tvb_get_ntohl(tvb, 0);
		if ( (mq_strucID & MQ_MASK_TSHx) == MQ_STRUCTID_TSHx || (mq_strucID & MQ_MASK_TSHx) == MQ_STRUCTID_TSHx_EBCDIC )
		{
			/* Register this dissector for this conversation */
			conversation_t  *conversation;

			conversation = find_or_create_conversation(pinfo);
			if (iProto == MQ_XPT_TCP)
				conversation_set_dissector(conversation, mq_tcp_handle);

			/* Dissect the packet */
			reassemble_mq(tvb, pinfo, tree, data);
			return TRUE;
		}
	}
	return FALSE;
}

static gboolean	dissect_mq_heur_tcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
{
	return dissect_mq_heur(tvb, pinfo, tree, MQ_XPT_TCP, NULL);
}

static gboolean	dissect_mq_heur_netbios(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
{
	return dissect_mq_heur(tvb, pinfo, tree, MQ_XPT_NETBIOS, NULL);
}

static gboolean	dissect_mq_heur_http(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
{
	return dissect_mq_heur(tvb, pinfo, tree, MQ_XPT_HTTP, NULL);
}

static void mq_init(void)
{
	reassembly_table_init(&mq_reassembly_table,
		&addresses_reassembly_table_functions);
}

void proto_register_mq(void)
{
	static hf_register_info hf[] =
	{
		{ &hf_mq_tsh_StructID , {"StructID..", "mq.tsh.structid", FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL }},
		{ &hf_mq_tsh_mqseglen , {"MQSegmLen.", "mq.tsh.seglength", FT_UINT32, BASE_DEC, NULL, 0x0, "TSH MQ Segment length", HFILL }},
		{ &hf_mq_tsh_convid   , {"Convers ID", "mq.tsh.convid", FT_UINT32, BASE_DEC, NULL, 0x0, "TSH Conversation ID", HFILL }},
		{ &hf_mq_tsh_requestid, {"Request ID", "mq.tsh.requestid", FT_UINT32, BASE_DEC, NULL, 0x0, "TSH Request ID", HFILL }},
		{ &hf_mq_tsh_byteorder, {"Byte order", "mq.tsh.byteorder", FT_UINT8, BASE_HEX, VALS(GET_VALSV(byteorder)), 0x0, "TSH Byte order", HFILL }},
		{ &hf_mq_tsh_opcode   , {"SegmType..", "mq.tsh.type", FT_UINT8, BASE_HEX, VALS(GET_VALSV(opcode)), 0x0, "TSH MQ segment type", HFILL }},
		{ &hf_mq_tsh_ctlflgs1 , {"Ctl Flag 1", "mq.tsh.cflags1", FT_UINT8, BASE_HEX, NULL, 0x0, "TSH Control flags 1", HFILL }},
		{ &hf_mq_tsh_ctlflgs2 , {"Ctl Flag 2", "mq.tsh.cflags2", FT_UINT8, BASE_HEX, NULL, 0x0, "TSH Control flags 2", HFILL }},
		{ &hf_mq_tsh_luwid    , {"LUW Ident.", "mq.tsh.luwid", FT_BYTES, BASE_NONE, NULL, 0x0, "TSH logical unit of work identifier", HFILL }},
		{ &hf_mq_tsh_encoding , {"Encoding..", "mq.tsh.encoding", FT_UINT32, BASE_DEC, NULL, 0x0, "TSH Encoding", HFILL }},
		{ &hf_mq_tsh_ccsid    , {"CCSID.....", "mq.tsh.ccsid", FT_INT16, BASE_DEC | BASE_RANGE_STRING, RVALS(&GET_VALRV(ccsid)), 0x0, "TSH CCSID", HFILL }},
		{ &hf_mq_tsh_reserved , {"Reserved..", "mq.tsh.reserved", FT_UINT16, BASE_HEX, NULL, 0x0, "TSH Reserved", HFILL }},

		{ &hf_mq_tsh_tcf_confirmreq, {"Confirm Req", "mq.tsh.tcf.confirmreq", FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_TCF_CONFIRM_REQUEST, "TSH TCF Confirm request", HFILL }},
		{ &hf_mq_tsh_tcf_error     , {"Error", "mq.tsh.tcf.error", FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_TCF_ERROR, "TSH TCF Error", HFILL }},
		{ &hf_mq_tsh_tcf_reqclose  , {"Req close", "mq.tsh.tcf.reqclose", FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_TCF_REQUEST_CLOSE, "TSH TCF Request close", HFILL }},
		{ &hf_mq_tsh_tcf_closechann, {"Close Chnl", "mq.tsh.tcf.closechann", FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_TCF_CLOSE_CHANNEL, "TSH TCF Close channel", HFILL }},
		{ &hf_mq_tsh_tcf_first     , {"First Seg", "mq.tsh.tcf.first", FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_TCF_FIRST, "TSH TCF First", HFILL }},
		{ &hf_mq_tsh_tcf_last      , {"Last Seg", "mq.tsh.tcf.last", FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_TCF_LAST, "TSH TCF Last", HFILL }},
		{ &hf_mq_tsh_tcf_reqacc    , {"Req accept", "mq.tsh.tcf.reqacc", FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_TCF_REQUEST_ACCEPTED, "TSH TCF Request accepted", HFILL }},
		{ &hf_mq_tsh_tcf_dlq       , {"DLQ used", "mq.tsh.tcf.dlq", FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_TCF_DLQ_USED, "TSH TCF DLQ used", HFILL }},

		{ &hf_mq_tsh_tcf2_HdrComp  , {"HDR Comp", "mq.tsh.tcf2.hdrcomp", FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_TCF2_HDRCOMP      , "TSH TCF2 Header Compressed", HFILL }},
		{ &hf_mq_tsh_tcf2_MsgComp  , {"MSG Comp", "mq.tsh.tcf2.msgcomp", FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_TCF2_MSGCOMP      , "TSH TCF2 Message Compressed", HFILL }},
		{ &hf_mq_tsh_tcf2_CSH      , {"CSH", "mq.tsh.tcf2.csh"    , FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_TCF2_CSH          , "TSH TCF2 CSH", HFILL }},
		{ &hf_mq_tsh_tcf2_CmitIntv , {"ComitIntvl", "mq.tsh.tcf.cmitintv", FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_TCF2_CMIT_INTERVAL, "TSH TCF2 Commit Interval", HFILL }},

		{ &hf_mq_api_replylen , {"Reply len..", "mq.api.replylength", FT_UINT32, BASE_DEC, NULL, 0x0, "API Reply length", HFILL }},
		{ &hf_mq_api_compcode , {"Compl Code.", "mq.api.completioncode", FT_UINT32, BASE_DEC, VALS(GET_VALSV(mqcc)), 0x0, "API Completion code", HFILL }},
		{ &hf_mq_api_reascode , {"Reason Code", "mq.api.reasoncode", FT_UINT32, BASE_DEC, VALS(GET_VALSV(mqrc)), 0x0, "API Reason code", HFILL }},
		{ &hf_mq_api_objecthdl, {"Object Hdl.", "mq.api.hobj", FT_UINT32, BASE_HEX, NULL, 0x0, "API Object handle", HFILL }},

		{ &hf_mq_socket_conversid, {"ConversId", "mq.socket.conversid", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, "Socket Conversation Id", HFILL }},
		{ &hf_mq_socket_requestid, {"RequestId", "mq.socket.requestid", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, "Socket Request Id", HFILL }},
		{ &hf_mq_socket_type     , {"Type.....", "mq.socket.type", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, "Socket Type", HFILL }},
		{ &hf_mq_socket_parm1    , {"Parm1....", "mq.socket.parm1", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, "Socket Parameter 1", HFILL }},
		{ &hf_mq_socket_parm2    , {"Parm2....", "mq.socket.parm2", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, "Socket Parameter 2", HFILL }},

		{ &hf_mq_caut_StructID , {"StructID." , "mq.caut.structid" , FT_STRINGZ, BASE_NONE   , NULL, 0x0, NULL, HFILL }},
		{ &hf_mq_caut_AuthType , {"AuthType." , "mq.caut.authtype" , FT_UINT32 , BASE_HEX_DEC, NULL, 0x0, "CAUT Authority Type", HFILL }},
		{ &hf_mq_caut_UsrMaxLen, {"UsrMaxLen", "mq.caut.usrmaxlen", FT_UINT32 , BASE_HEX_DEC, NULL, 0x0, "CAUT userid Maximum length", HFILL }},
		{ &hf_mq_caut_PwdMaxLen, {"PwdMaxLen", "mq.caut.pwdmaxlen", FT_UINT32 , BASE_HEX_DEC, NULL, 0x0, "CAUT password Maximum length", HFILL }},
		{ &hf_mq_caut_UsrLength, {"UsrLength", "mq.caut.usrlength", FT_UINT32 , BASE_HEX_DEC, NULL, 0x0, "CAUT userid length", HFILL }},
		{ &hf_mq_caut_PwdLength, {"PwdLength", "mq.caut.pswlength", FT_UINT32 , BASE_HEX_DEC, NULL, 0x0, "CAUT password length", HFILL }},
		{ &hf_mq_caut_usr      , {"userid...", "mq.msh.userid"    , FT_STRINGZ, BASE_NONE   , NULL, 0x0, "CAUT UserId", HFILL }},
		{ &hf_mq_caut_psw      , {"password.", "mq.msh.password"  , FT_STRINGZ, BASE_NONE   , NULL, 0x0, "CAUT Password", HFILL }},

		{ &hf_mq_msh_StructID  , {"StructID", "mq.msh.structid", FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL }},
		{ &hf_mq_msh_seqnum    , {"Seq Numb", "mq.msh.seqnum", FT_UINT32, BASE_DEC, NULL, 0x0, "MSH sequence number", HFILL }},
		{ &hf_mq_msh_datalength, {"Buf len.", "mq.msh.buflength", FT_UINT32, BASE_DEC, NULL, 0x0, "MSH buffer length", HFILL }},
		{ &hf_mq_msh_unknown1  , {"Unknown1", "mq.msh.unknown1", FT_UINT32, BASE_HEX, NULL, 0x0, "MSH unknown1", HFILL }},
		{ &hf_mq_msh_msglength , {"Msg len.", "mq.msh.msglength", FT_UINT32, BASE_DEC, NULL, 0x0, "MSH message length", HFILL }},

		{ &hf_mq_xqh_StructID  , {"StructID", "mq.xqh.structid", FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL }},
		{ &hf_mq_xqh_version   , {"Version.", "mq.xqh.version", FT_UINT32, BASE_DEC, NULL, 0x0, "XQH version", HFILL }},
		{ &hf_mq_xqh_remoteq   , {"Remote Q", "mq.xqh.remoteq", FT_STRINGZ, BASE_NONE, NULL, 0x0, "XQH remote queue", HFILL }},
		{ &hf_mq_xqh_remoteqmgr, {"Rmt QMgr", "mq.xqh.remoteqmgr", FT_STRINGZ, BASE_NONE, NULL, 0x0, "XQH remote queue manager", HFILL }},

		{ &hf_mq_id_StructID   , {"Structid..", "mq.id.structid", FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL }},
		{ &hf_mq_id_FapLevel   , {"FAP level.", "mq.id.level", FT_UINT8, BASE_DEC, NULL, 0x0, "ID Formats And Protocols level", HFILL }},
		{ &hf_mq_id_icf1       , {"CapFlag1..", "mq.id.idflags", FT_UINT8, BASE_HEX, NULL, 0x0, "ID Capability Flags 1", HFILL }},
		{ &hf_mq_id_Eicf1      , {"ECapFlag1.", "mq.id.ideflags", FT_UINT8, BASE_HEX, NULL, 0x0, "ID E Capability Flags 1", HFILL }},
		{ &hf_mq_id_ief1       , {"IniErrFlg1", "mq.id.ief", FT_UINT8, BASE_HEX, NULL, 0x0, "ID Initial Error Flags 1", HFILL }},
		{ &hf_mq_id_Reserved   , {"Reserved..", "mq.id.unknown04", FT_UINT16, BASE_HEX, NULL, 0x0, "ID Reserved", HFILL }},
		{ &hf_mq_id_MaxMsgBatch, {"MaxMsgBtch", "mq.id.MaxMsgBatch", FT_UINT16, BASE_DEC, NULL, 0x0, "ID max msg per batch", HFILL }},
		{ &hf_mq_id_MaxTrSize  , {"MaxTrSize.", "mq.id.MaxTrSize", FT_UINT32, BASE_DEC, NULL, 0x0, "ID max trans size", HFILL }},
		{ &hf_mq_id_MaxMsgSize , {"MaxMsgSize", "mq.id.maxmsgsize", FT_UINT32, BASE_DEC, NULL, 0x0, "ID max msg size", HFILL }},
		{ &hf_mq_id_SeqWrapVal , {"SeqWrapVal", "mq.id.seqwrap", FT_UINT32, BASE_DEC, NULL, 0x0, "ID seq wrap value", HFILL }},
		{ &hf_mq_id_channel    , {"ChannelNme", "mq.id.channelname", FT_STRINGZ, BASE_NONE, NULL, 0x0, "ID channel name", HFILL }},
		{ &hf_mq_id_icf2       , {"CapFlag2..", "mq.id.idflags2", FT_UINT8, BASE_HEX, NULL, 0x0, "ID Capability flags 2", HFILL }},
		{ &hf_mq_id_Eicf2      , {"ECapFlag2.", "mq.id.ideflags2", FT_UINT8, BASE_HEX, NULL, 0x0, "ID E Capabitlity flags 2", HFILL }},
		{ &hf_mq_id_ccsid      , {"ccsid.....", "mq.id.ccsid", FT_INT16, BASE_DEC | BASE_RANGE_STRING, RVALS(&GET_VALRV(ccsid)), 0x0, "ID Coded Character Set ID", HFILL }},
		{ &hf_mq_id_qmgrname   , {"QMgrName..", "mq.id.qm", FT_STRINGZ, BASE_NONE, NULL, 0x0, "ID Queue Manager Name", HFILL }},
		{ &hf_mq_id_HBInterval , {"HBInterval", "mq.id.hbint", FT_UINT32, BASE_DEC, NULL, 0x0, "ID Heartbeat interval", HFILL }},
		{ &hf_mq_id_EFLLength  , {"EFLLength.", "mq.id.efllength", FT_UINT16, BASE_HEX_DEC, NULL, 0x0, "ID EFL Length", HFILL }},
		{ &hf_mq_id_ief2       , {"IniErrFlg2", "mq.id.inierrflg2", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, "ID Initial Error Flags 2", HFILL }},
		{ &hf_mq_id_Reserved1  , {"Reserved1.", "mq.id.reserved1", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, "ID Reserved 1", HFILL }},
		{ &hf_mq_id_HdrCprsLst , {"HdrCprsLst", "mq.id.hdrcprslst", FT_BYTES, BASE_NONE, NULL, 0x0, "ID Hdr Cprs Lst", HFILL }},
		{ &hf_mq_id_MsgCprsLst , {"MsgCprsLst", "mq.id.msgcprslst", FT_BYTES, BASE_NONE, NULL, 0x0, "ID Msg Cprs Lst", HFILL }},
		{ &hf_mq_id_Reserved2  , {"Reserved2.", "mq.id.reserved2", FT_UINT16, BASE_HEX_DEC, NULL, 0x0, "ID Reserved 2", HFILL }},
		{ &hf_mq_id_SSLKeyRst  , {"SSLKeyRst.", "mq.id.sslkeyrst", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, "ID SSL Key Reset", HFILL }},
		{ &hf_mq_id_ConvBySkt  , {"ConvBySkt.", "mq.id.convbyskt", FT_INT32, BASE_DEC, NULL, 0x0, "ID Conv Per Socket", HFILL }},
		{ &hf_mq_id_icf3       , {"CapFlag3..", "mq.id.idflags3", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, "ID Capability flags 3", HFILL }},
		{ &hf_mq_id_Eicf3      , {"ECapFlag3.", "mq.id.ideflags3", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, "ID E Capability flags 3", HFILL }},
		{ &hf_mq_id_Reserved3  , {"Reserved3.", "mq.id.reserved3", FT_UINT16, BASE_HEX_DEC, NULL, 0x0, "ID Reserved 3", HFILL }},
		{ &hf_mq_id_ProcessId  , {"ProcessId.", "mq.id.processid", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, "ID Process Identifier", HFILL }},
		{ &hf_mq_id_ThreadId   , {"ThreadId..", "mq.id.threadid", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, "ID Thread Identifier", HFILL }},
		{ &hf_mq_id_TraceId    , {"TraceId...", "mq.id.traceid", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, "ID Trace Identifier", HFILL }},
		{ &hf_mq_id_ProdId     , {"ProdId....", "mq.id.prodid", FT_STRINGZ, BASE_NONE, NULL, 0x0, "ID Product Identifier", HFILL }},
		{ &hf_mq_id_mqmid      , {"MQM ID....", "mq.id.mqmid", FT_STRINGZ, BASE_NONE, NULL, 0x0, "ID MQM ID", HFILL }},

		{ &hf_mq_id_icf1_msgseq  , {"Message sequence", "mq.id.icf.msgseq"  , FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_ICF1_MSG_SEQ, "ID ICF Message sequence", HFILL }},
		{ &hf_mq_id_icf1_convcap , {"Conversion capable", "mq.id.icf.convcap" , FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_ICF1_CONVERSION_CAPABLE, "ID ICF Conversion capable", HFILL }},
		{ &hf_mq_id_icf1_splitmsg, {"Split messages", "mq.id.icf.splitmsg", FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_ICF1_SPLIT_MESSAGE, "ID ICF Split message", HFILL }},
		{ &hf_mq_id_icf1_RqstInit, {"Request Initiation", "mq.id.icf.rqstinit", FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_ICF1_REQUEST_INITIATION, "ID ICF Request Initiation", HFILL }},
		{ &hf_mq_id_icf1_RqstSecu, {"Request Security", "mq.id.icf.rqstsecu", FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_ICF1_REQUEST_SECURITY, "ID ICF Request Security", HFILL }},
		{ &hf_mq_id_icf1_mqreq   , {"MQ request", "mq.id.icf.mqreq"   , FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_ICF1_MQREQUEST, "ID ICF MQ request", HFILL }},
		{ &hf_mq_id_icf1_svrsec  , {"Srvr Con security", "mq.id.icf.svrsec"  , FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_ICF1_SVRCONN_SECURITY, "ID ICF Server connection security", HFILL }},
		{ &hf_mq_id_icf1_runtime , {"Runtime applic", "mq.id.icf.runtime" , FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_ICF1_RUNTIME, "ID ICF Runtime application", HFILL }},

		{ &hf_mq_id_icf2_CanDstLst, {"DistListCapable", "mq.id.icf2.distlistcap"   , FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_ICF2_DIST_LIST_CAPABLE, "ID ICF2 Distribution List Capable", HFILL }},
		{ &hf_mq_id_icf2_FstMsgReq, {"Fast Msg Reqrd", "mq.id.icf2.fastmsgrqrd"   , FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_ICF2_FAST_MESSAGES_REQUIRED, "ID ICF2 Fast Message Required", HFILL }},
		{ &hf_mq_id_icf2_RespConv , {"RspndrConversion", "mq.id.icf2.respndrconvers", FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_ICF2_RESPONDER_CONVERSION, "ID ICF2 Responder Conversion", HFILL }},
		{ &hf_mq_id_icf2_XARequest, {"XARequest", "mq.id.icf2.xarequest"     , FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_ICF2_XAREQUEST, "ID ICF2 XA Request", HFILL }},
		{ &hf_mq_id_icf2_XARunTApp, {"XARunTypApp", "mq.id.icf2.xaruntypapp"   , FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_ICF2_XARUNTIME_APP, "ID ICF2 XA Runtime App", HFILL }},
		{ &hf_mq_id_icf2_SPIRqst  , {"SPIRequest", "mq.id.icf2.spirequest"    , FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_ICF2_SPIREQUEST, "ID ICF2 SPI Request", HFILL }},
		{ &hf_mq_id_icf2_DualUOW  , {"DualUOW", "mq.id.icf2.dualuow"       , FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_ICF2_DUAL_UOW, "ID ICF2 Dual UOW", HFILL }},
		{ &hf_mq_id_icf2_CanTrcRte, {"Trace Rte Capab", "mq.id.icf2.cantraceroute" , FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_ICF2_TRACE_ROUTE_CAPABLE, "ID ICF2 Trace Route Capable", HFILL }},

		{ &hf_mq_id_icf3_CanMsgPrp, {"Msg Property Cap", "mq.id.icf.msgprpcap", FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_ICF3_MSG_PROP_CAPABLE, "ID ICF3 Message PropertyCapable", HFILL }},
		{ &hf_mq_id_icf3_Unknown02, {"Unknownx02", "mq.id.icf.unknown02", FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_ICF3_UNKNOWNX02, "ID ICF3 Unknown Falg x02", HFILL }},

		{ &hf_mq_id_ief1_ccsid  , {"Invalid CCSID", "mq.id.ief1.ccsid", FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_IEF1_CCSID, "ID invalid CCSID", HFILL }},
		{ &hf_mq_id_ief1_enc    , {"Invalid encoding", "mq.id.ief1.enc", FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_IEF1_ENCODING, "ID invalid encoding", HFILL }},
		{ &hf_mq_id_ief1_mxtrsz , {"Invalid Max Trans Size", "mq.id.ief1.mxtrsz", FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_IEF1_MAX_TRANSMISSION_SIZE, "ID invalid maximum transmission size", HFILL }},
		{ &hf_mq_id_ief1_fap    , {"Invalid FAP level", "mq.id.ief1.fap", FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_IEF1_FAP_LEVEL, "ID invalid FAP level", HFILL }},
		{ &hf_mq_id_ief1_mxmsgsz, {"Invalid message size", "mq.id.ief1.mxmsgsz", FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_IEF1_MAX_MSG_SIZE, "ID invalid message size", HFILL }},
		{ &hf_mq_id_ief1_mxmsgpb, {"Invalid Max Msg batch", "mq.id.ief1.mxmsgpb", FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_IEF1_MAX_MSG_PER_BATCH, "ID maximum message per batch", HFILL }},
		{ &hf_mq_id_ief1_seqwrap, {"Invalid Seq Wrap Value", "mq.id.ief1.seqwrap", FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_IEF1_SEQ_WRAP_VALUE, "ID invalid sequence wrap value", HFILL }},
		{ &hf_mq_id_ief1_hbint  , {"Invalid HB interval", "mq.id.ief1.hbint", FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_IEF1_HEARTBEAT_INTERVAL, "ID invalid heartbeat interval", HFILL }},

		{ &hf_mq_id_ief2_HdrCmpLst, {"Invalid HDR CompLst", "mq.id.ief2.hdrcomplst", FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_IEF2_HDRCOMPLIST, "ID invalid Header Compression List", HFILL }},
		{ &hf_mq_id_ief2_MsgCmpLst, {"Invalid Msg CompLst", "mq.id.ief2.msgcomplst", FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_IEF2_MSGCOMPLIST, "ID invalid Message Compression List", HFILL }},
		{ &hf_mq_id_ief2_SSLReset , {"Invalid SSL Reset", "mq.id.ief2.sslreset"  , FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_IEF2_SSL_RESET  , "ID invalid SSL Reset", HFILL }},

		{ &hf_mq_uid_StructID  , {"Structid", "mq.uid.structid", FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL }},
		{ &hf_mq_uid_userid    , {"User ID.", "mq.uid.userid", FT_STRINGZ, BASE_NONE, NULL, 0x0, "UID structid", HFILL }},
		{ &hf_mq_uid_password  , {"Password", "mq.uid.password", FT_STRINGZ, BASE_NONE, NULL, 0x0, "UID password", HFILL }},
		{ &hf_mq_uid_longuserid, {"Long UID", "mq.uid.longuserid", FT_STRINGZ, BASE_NONE, NULL, 0x0, "UID long user id", HFILL }},

		{ &hf_mq_sidlen        , {"SID Len.", "mq.uid.sidlen", FT_UINT8, BASE_DEC, NULL, 0x0, "Sid Len", HFILL }},
		{ &hf_mq_sidtyp        , {"SIDType.", "mq.uid.sidtyp", FT_UINT8, BASE_DEC, VALS(GET_VALSV(sidtype)), 0x0, "Sid Typ", HFILL }},
		{ &hf_mq_securityid    , {"SecurID.", "mq.uid.securityid", FT_BYTES, BASE_NONE, NULL, 0x0, "Security ID", HFILL }},

		{ &hf_mq_conn_QMgr     , {"QMgr....", "mq.conn.qm", FT_STRINGZ, BASE_NONE, NULL, 0x0, "CONN queue manager", HFILL }},
		{ &hf_mq_conn_appname  , {"ApplName", "mq.conn.appname", FT_STRINGZ, BASE_NONE, NULL, 0x0, "CONN application name", HFILL }},
		{ &hf_mq_conn_apptype  , {"ApplType", "mq.conn.apptype", FT_INT32, BASE_DEC, VALS(GET_VALSV(mqat)), 0x0, "CONN application type", HFILL }},
		{ &hf_mq_conn_acttoken , {"AccntTok", "mq.conn.acttoken", FT_BYTES, BASE_NONE, NULL, 0x0, "CONN accounting token", HFILL }},
		{ &hf_mq_conn_version  , {"Version.", "mq.conn.version", FT_UINT32, BASE_DEC, VALS(mq_conn_version_vals), 0x0, "CONN version", HFILL }},
		{ &hf_mq_conn_options  , {"Options.", "mq.conn.options", FT_UINT32, BASE_HEX, NULL, 0x0, "CONN options", HFILL }},

		{ &hf_mq_fcno_StructID , {"StructId.", "mq.fcno.structid", FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL }},
		{ &hf_mq_fcno_unknown00, {"unknown00", "mq.fcno.unknown00", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, "FCNO unknown00", HFILL }},
		{ &hf_mq_fcno_unknown01, {"unknown01", "mq.fcno.unknown01", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, "FCNO unknown01", HFILL }},
		{ &hf_mq_fcno_unknown02, {"unknown02", "mq.fcno.unknown02", FT_BYTES, BASE_NONE, NULL, 0x0, "FCNO unknown02", HFILL }},
		{ &hf_mq_fcno_msgid    , {"msgid....", "mq.fcno.msgid", FT_STRINGZ, BASE_NONE, NULL, 0x0, "FCNO Msg ID", HFILL }},
		{ &hf_mq_fcno_mqmid    , {"MqmId....", "mq.fcno.mqmid", FT_STRINGZ, BASE_NONE, NULL, 0x0, "FCNO Mqm ID", HFILL }},

		{ &hf_mq_inq_nbsel     , {"Selector count..", "mq.inq.nbsel", FT_UINT32, BASE_DEC, NULL, 0x0, "INQ Selector count", HFILL }},
		{ &hf_mq_inq_nbint     , {"Integer count...", "mq.inq.nbint", FT_UINT32, BASE_DEC, NULL, 0x0, "INQ Integer count", HFILL }},
		{ &hf_mq_inq_charlen   , {"Character length", "mq.inq.charlen", FT_UINT32, BASE_DEC, NULL, 0x0, "INQ Character length", HFILL }},
		{ &hf_mq_inq_sel       , {"Selector........", "mq.inq.sel", FT_UINT32, BASE_DEC, VALS(GET_VALSV(selector)), 0x0, "INQ Selector", HFILL }},
		{ &hf_mq_inq_intvalue  , {"Integer value...", "mq.inq.intvalue", FT_UINT32, BASE_DEC, NULL, 0x0, "INQ Integer value", HFILL }},
		{ &hf_mq_inq_charvalues, {"Char values.....", "mq.inq.charvalues", FT_STRINGZ, BASE_NONE, NULL, 0x0, "INQ Character values", HFILL }},

		{ &hf_mq_spi_verb      , {"SPI Verb", "mq.spi.verb", FT_UINT32, BASE_DEC, VALS(GET_VALSV(spi_verbs)), 0x0, NULL, HFILL }},
		{ &hf_mq_spi_version   , {"Version", "mq.spi.version", FT_UINT32, BASE_DEC, NULL, 0x0, "SPI Version", HFILL }},
		{ &hf_mq_spi_length    , {"Max reply size", "mq.spi.replength", FT_UINT32, BASE_DEC, NULL, 0x0, "SPI Max reply size", HFILL }},

		{ &hf_mq_spi_base_StructID, {"SPI Structid", "mq.spib.structid", FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL }},
		{ &hf_mq_spi_base_version , {"Version", "mq.spib.version", FT_UINT32, BASE_DEC, NULL, 0x0, "SPI Base Version", HFILL }},
		{ &hf_mq_spi_base_length  , {"Length", "mq.spib.length", FT_UINT32, BASE_DEC, NULL, 0x0, "SPI Base Length", HFILL }},

		{ &hf_mq_spi_spqo_nbverb  , {"Number of verbs", "mq.spqo.nbverb", FT_UINT32, BASE_DEC, NULL, 0x0, "SPI Query Output Number of verbs", HFILL }},
		{ &hf_mq_spi_spqo_verbid  , {"Verb", "mq.spqo.verb", FT_UINT32, BASE_DEC, VALS(GET_VALSV(spi_verbs)), 0x0, "SPI Query Output VerbId", HFILL }},
		{ &hf_mq_spi_spqo_maxiover, {"Max InOut Version", "mq.spqo.maxiov", FT_UINT32, BASE_DEC, NULL, 0x0, "SPI Query Output Max InOut Version", HFILL }},
		{ &hf_mq_spi_spqo_maxinver, {"Max In Version", "mq.spqo.maxiv", FT_UINT32, BASE_DEC, NULL, 0x0, "SPI Query Output Max In Version", HFILL }},
		{ &hf_mq_spi_spqo_maxouver, {"Max Out Version", "mq.spqo.maxov", FT_UINT32, BASE_DEC, NULL, 0x0, "SPI Query Output Max Out Version", HFILL }},
		{ &hf_mq_spi_spqo_flags   , {"Flags", "mq.spqo.flags", FT_UINT32, BASE_DEC, NULL, 0x0, "SPI Query Output flags", HFILL }},

		{ &hf_mq_spi_spai_mode    , {"Mode", "mq.spai.mode", FT_UINT32, BASE_DEC, VALS(GET_VALSV(spi_activate)), 0x0, "SPI Activate Input mode", HFILL }},
		{ &hf_mq_spi_spai_unknown1, {"Unknown1", "mq.spai.unknown1", FT_STRINGZ, BASE_NONE, NULL, 0x0, "SPI Activate Input unknown1", HFILL }},
		{ &hf_mq_spi_spai_unknown2, {"Unknown2", "mq.spai.unknown2", FT_STRINGZ, BASE_NONE, NULL, 0x0, "SPI Activate Input unknown2", HFILL }},
		{ &hf_mq_spi_spai_msgid   , {"Message Id", "mq.spai.msgid", FT_STRINGZ, BASE_NONE, NULL, 0x0, "SPI Activate Input message id", HFILL }},
		{ &hf_mq_spi_spgi_batchsz , {"Batch size", "mq.spgi.batchsize", FT_UINT32, BASE_DEC, NULL, 0x0, "SPI Get Input batch size", HFILL }},
		{ &hf_mq_spi_spgi_batchint, {"Batch interval", "mq.spgi.batchint", FT_UINT32, BASE_DEC, NULL, 0x0, "SPI Get Input batch interval", HFILL }},
		{ &hf_mq_spi_spgi_maxmsgsz, {"Max message size", "mq.spgi.maxmsgsize", FT_UINT32, BASE_DEC, NULL, 0x0, "SPI Get Input max message size", HFILL }},

		{ &hf_mq_spi_spgo_options , {"Options", "mq.spgo.options", FT_UINT32, BASE_DEC, NULL, 0x0, "SPI Get Output options", HFILL }},
		{ &hf_mq_spi_spgo_size    , {"Size", "mq.spgo.size", FT_UINT32, BASE_DEC, NULL, 0x0, "SPI Get Output size", HFILL }},
		{ &hf_mq_spi_opt_blank    , {"Blank padded", "mq.spi.options.blank", FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_SPI_OPTIONS_BLANK_PADDED, "SPI Options blank padded", HFILL }},
		{ &hf_mq_spi_opt_syncp    , {"Syncpoint", "mq.spi.options.sync", FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_SPI_OPTIONS_SYNCPOINT, "SPI Options syncpoint", HFILL }},
		{ &hf_mq_spi_opt_deferred , {"Deferred", "mq.spi.options.deferred", FT_BOOLEAN, 8, TFS(&tfs_set_notset), MQ_SPI_OPTIONS_DEFERRED, "SPI Options deferred", HFILL }},

		{ &hf_mq_put_length       , {"Data length", "mq.put.length", FT_UINT32, BASE_DEC, NULL, 0x0, "PUT Data length", HFILL }},

		{ &hf_mq_close_options    , {"Options", "mq.close.options", FT_UINT32, BASE_HEX, NULL, 0x0, "CLOSE options", HFILL }},
		{ &hf_mq_close_options_DELETE      , {"DELETE", "mq.close.options.Delete", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQCO_DELETE, "CLOSE options DELETE", HFILL }},
		{ &hf_mq_close_options_DELETE_PURGE, {"DELETE_PURGE", "mq.close.options.DeletePurge", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQCO_DELETE_PURGE, "CLOSE options DELETE_PURGE", HFILL }},
		{ &hf_mq_close_options_KEEP_SUB    , {"KEEPSUB", "mq.close.options.KeepSub", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQCO_KEEP_SUB, "CLOSE options KEEP_SUB", HFILL }},
		{ &hf_mq_close_options_REMOVE_SUB  , {"REMOVE_SUB", "mq.close.options.RemoveSub", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQCO_REMOVE_SUB, "CLOSE options REMOVE_SUB", HFILL }},
		{ &hf_mq_close_options_QUIESCE     , {"QUIESCE", "mq.close.options.Quiesce", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQCO_QUIESCE, "CLOSE options QUIESCE", HFILL }},

		{ &hf_mq_open_options     , {"Options", "mq.open.options", FT_UINT32, BASE_HEX, NULL, 0x0, "OPEN options", HFILL }},
		{ &hf_mq_open_options_INPUT_AS_Q_DEF , {"INPUT_AS_Q_DEF", "mq.open.options.InputAsQDef", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQOO_INPUT_AS_Q_DEF, "OPEN options INPUT_AS_Q_DEF", HFILL }},
		{ &hf_mq_open_options_INPUT_SHARED   , {"INPUT_SHARED", "mq.open.options.InputShared", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQOO_INPUT_SHARED, "OPEN options INPUT_SHARED", HFILL }},
		{ &hf_mq_open_options_INPUT_EXCLUSIVE, {"INPUT_EXCLUSIVE", "mq.open.options.InputExclusive", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQOO_INPUT_EXCLUSIVE, "OPEN options INPUT_EXCLUSIVE", HFILL }},
		{ &hf_mq_open_options_BROWSE         , {"BROWSE", "mq.open.options.Browse", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQOO_BROWSE, "OPEN options BROWSE", HFILL }},
		{ &hf_mq_open_options_OUTPUT         , {"OUTPUT", "mq.open.options.Output", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQOO_OUTPUT, "OPEN options OUTPUT", HFILL }},
		{ &hf_mq_open_options_INQUIRE        , {"INQUIRE", "mq.open.options.Inquire", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQOO_INQUIRE, "OPEN options INQUIRE", HFILL }},
		{ &hf_mq_open_options_SET            , {"SET", "mq.open.options.Set", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQOO_SET, "OPEN options SET", HFILL }},
		{ &hf_mq_open_options_SAVE_ALL_CTX   , {"SAVE_ALL_CONTEXT", "mq.open.options.SaveAllContext", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQOO_SAVE_ALL_CONTEXT, "OPEN options SAVE_ALL_CONTEXT", HFILL }},
		{ &hf_mq_open_options_PASS_IDENT_CTX , {"PASS_IDENTITY_CONTEXT", "mq.open.options.PassIdentityContext", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQOO_PASS_IDENTITY_CONTEXT, "OPEN options PASS_IDENTITY_CONTEXT", HFILL }},
		{ &hf_mq_open_options_PASS_ALL_CTX   , {"PASS_ALL_CONTEXT", "mq.open.options.PassAllContext", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQOO_PASS_ALL_CONTEXT, "OPEN options PASS_ALL_CONTEXT", HFILL }},
		{ &hf_mq_open_options_SET_IDENT_CTX  , {"SET_IDENTITY_CONTEXT", "mq.open.options.SetIdentityContext", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQOO_SET_IDENTITY_CONTEXT, "OPEN options SET_IDENTITY_CONTEXT", HFILL }},
		{ &hf_mq_open_options_SET_ALL_CONTEXT, {"SET_ALL_CONTEXT", "mq.open.options.SetAllContext", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQOO_SET_ALL_CONTEXT, "OPEN options SET_ALL_CONTEXT", HFILL }},
		{ &hf_mq_open_options_ALT_USER_AUTH  , {"ALTERNATE_USER_AUTHORITY", "mq.open.options.AlternateUserAuthority", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQOO_ALTERNATE_USER_AUTHORITY, "OPEN options ALTERNATE_USER_AUTHORITY", HFILL }},
		{ &hf_mq_open_options_FAIL_IF_QUIESC , {"FAIL_IF_QUIESCING", "mq.open.options.FailIfQuiescing", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQOO_FAIL_IF_QUIESCING, "OPEN options FAIL_IF_QUIESCING", HFILL }},
		{ &hf_mq_open_options_BIND_ON_OPEN   , {"BIND_ON_OPEN", "mq.open.options.BindOnOpen", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQOO_BIND_ON_OPEN, "OPEN options BIND_ON_OPEN", HFILL }},
		{ &hf_mq_open_options_BIND_NOT_FIXED , {"BIND_NOT_FIXED", "mq.open.options.BindNotFixed", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQOO_BIND_NOT_FIXED, "OPEN options BIND_NOT_FIXED", HFILL }},
		{ &hf_mq_open_options_RESOLVE_NAMES  , {"RESOLVE_NAMES", "mq.open.options.ResolveNames", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQOO_RESOLVE_NAMES, "OPEN options RESOLVE_NAMES", HFILL }},
		{ &hf_mq_open_options_CO_OP          , {"CO_OP", "mq.open.options.CoOp", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQOO_CO_OP, "OPEN options CO_OP", HFILL }},
		{ &hf_mq_open_options_RESOLVE_LOCAL_Q, {"RESOLVE_LOCAL_Q", "mq.open.options.ResolveLocalQueueOrTopic", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQOO_RESOLVE_LOCAL_Q, "OPEN options RESOLVE_LOCAL_Q", HFILL }},
		{ &hf_mq_open_options_NO_READ_AHEAD  , {"NO_READ_AHEAD", "mq.open.options.NoReadAhead", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQOO_NO_READ_AHEAD, "OPEN options NO_READ_AHEAD", HFILL }},
		{ &hf_mq_open_options_READ_AHEAD     , {"READ_AHEAD", "mq.open.options.ReadAhead", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQOO_READ_AHEAD, "OPEN options READ_AHEAD", HFILL }},
		{ &hf_mq_open_options_NO_MULTICAST   , {"NO_MULTICAST", "mq.open.options.NoMulticast", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQOO_NO_MULTICAST, "OPEN options NO_MULTICAST", HFILL }},
		{ &hf_mq_open_options_BIND_ON_GROUP  , {"BIND_ON_GROUP", "mq.open.options.BindOnGroup", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQOO_BIND_ON_GROUP, "OPEN options BIND_ON_GROUP", HFILL }},

		{ &hf_mq_fopa_StructID, {"StructId", "mq.fopa.structid", FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL }},
		{ &hf_mq_fopa_version , {"Version.", "mq.fopa.version", FT_UINT32, BASE_DEC, NULL, 0x0, "FOPA Version", HFILL }},
		{ &hf_mq_fopa_length  , {"Length..", "mq.fopa.length", FT_UINT32, BASE_DEC, NULL, 0x0, "FOPA Length", HFILL }},
		{ &hf_mq_fopa_unknown1, {"Unknown1", "mq.fopa.unknown1", FT_UINT32, BASE_HEX, NULL, 0x0, "FOPA unknown1", HFILL }},
		{ &hf_mq_fopa_unknown2, {"Unknown2", "mq.fopa.unknown2", FT_UINT32, BASE_HEX, NULL, 0x0, "FOPA unknown2", HFILL }},
		{ &hf_mq_fopa_unknown3, {"Unknown3", "mq.fopa.unknown3", FT_STRINGZ, BASE_NONE, NULL, 0x0, "FOPA unknown3", HFILL }},
		{ &hf_mq_fopa_qprotect, {"qprotect", "mq.fopa.qprotect", FT_STRINGZ, BASE_NONE, NULL, 0x0, "FOPA queue protection", HFILL }},
		{ &hf_mq_fopa_unknown4, {"Unknown4", "mq.fopa.unknown4", FT_UINT32, BASE_HEX, NULL, 0x0, "FOPA unknown4", HFILL }},
		{ &hf_mq_fopa_unknown5, {"Unknown5", "mq.fopa.unknown5", FT_UINT32, BASE_HEX, NULL, 0x0, "FOPA unknown5", HFILL }},

		{ &hf_mq_msgreq_version  , {"version..", "mq.msgreq.version"  , FT_UINT32, BASE_HEX_DEC, NULL, 0x0, "MSGREQ version", HFILL }},
		{ &hf_mq_msgreq_handle   , {"handle...", "mq.msgreq.handle"   , FT_UINT32, BASE_HEX, NULL, 0x0, "MSGREQ handle", HFILL }},
		{ &hf_mq_msgreq_RecvBytes, {"RecvBytes", "mq.msgreq.unknown1" , FT_UINT32, BASE_HEX_DEC, NULL, 0x0, "MSGREQ Received Bytes", HFILL }},
		{ &hf_mq_msgreq_RqstBytes, {"RqstBytes", "mq.msgreq.rqstbytes", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, "MSGREQ Requesed Bytes", HFILL }},
		{ &hf_mq_msgreq_MaxMsgLen, {"MaxMsgLen", "mq.msgreq.maxmsglen", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, "MSGREQ Maximum Msg Length", HFILL }},
		{ &hf_mq_msgreq_WaitIntrv, {"WaitIntrv", "mq.msgreq.waitintrv", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, "MSGREQ Wait Interval", HFILL }},
		{ &hf_mq_msgreq_QueStatus, {"QueStatus", "mq.msgreq.questatus", FT_UINT32, BASE_HEX    , NULL, 0x0, "MSGREQ Queue Status", HFILL }},
		{ &hf_mq_msgreq_RqstFlags, {"RqstFlags", "mq.msgreq.rqstflags", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, "MSGREQ Request Flags", HFILL }},
		{ &hf_mq_msgreq_GlbMsgIdx, {"GlbMsgIdx", "mq.msgreq.glbmsgidx", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, "MSGREQ Global Message Index", HFILL }},
		{ &hf_mq_msgreq_SelectIdx, {"SelectIdx", "mq.msgreq.selectIdx", FT_UINT16, BASE_HEX_DEC, NULL, 0x0, "MSGREQ Selection Index", HFILL }},
		{ &hf_mq_msgreq_MQMDVers , {"MQMDVers.", "mq.msgreq.mqmdvers" , FT_UINT16, BASE_HEX_DEC, NULL, 0x0, "MSGREQ MQMD Version", HFILL }},
		{ &hf_mq_msgreq_ccsid    , {"CCSID....", "mq.msgreq.ccsid"    , FT_INT32 , BASE_DEC | BASE_RANGE_STRING, RVALS(&GET_VALRV(ccsid)), 0x0, "MSGREQ ccsid", HFILL }},
		{ &hf_mq_msgreq_encoding , {"Encoding.", "mq.msgreq.encoding" , FT_UINT32, BASE_HEX_DEC, NULL, 0x0, "MSGREQ encoding", HFILL }},
		{ &hf_mq_msgreq_MsgSeqNum, {"MsgSeqNum", "mq.msgreq.msgseqnum", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, "MSGREQ Message Sequence Number", HFILL }},
		{ &hf_mq_msgreq_offset   , {"Offset...", "mq.msgreq.offset"   , FT_UINT32, BASE_HEX_DEC, NULL, 0x0, "MSGREQ Offset", HFILL }},
		{ &hf_mq_msgreq_mtchMsgId, {"mtchMsgId", "mq.msgreq.mtchMsgId", FT_BYTES , BASE_NONE   , NULL, 0x0, "MSGREQ match MsgID", HFILL }},
		{ &hf_mq_msgreq_mtchCorId, {"mtchCorID", "mq.msgreq.mtchcorid", FT_BYTES , BASE_NONE   , NULL, 0x0, "MSGREQ match Correlation Id", HFILL }},
		{ &hf_mq_msgreq_mtchGrpid, {"mtchGrpID", "mq.msgreq.mtchgrpid", FT_BYTES , BASE_NONE   , NULL, 0x0, "MSGREQ match Group ID", HFILL }},
		{ &hf_mq_msgreq_mtchMsgTk, {"mtchMsgTk", "mq.msgreq.mtchmsgtk", FT_BYTES , BASE_NONE   , NULL, 0x0, "MSGREQ match Message Token", HFILL }},

		{ &hf_mq_msgasy_version  , {"version..", "mq.msgasy.version"  , FT_UINT32, BASE_HEX_DEC, NULL, 0x0, "MSGASYNC version", HFILL }},
		{ &hf_mq_msgasy_handle   , {"handle...", "mq.msgasy.handle"   , FT_UINT32, BASE_HEX, NULL, 0x0, "MSGASYNC handle", HFILL }},
		{ &hf_mq_msgasy_MsgIndex , {"MsgIndex.", "mq.msgasy.msgindex" , FT_UINT32, BASE_HEX_DEC, NULL, 0x0, "MSGASYNC Message Index", HFILL }},
		{ &hf_mq_msgasy_GlbMsgIdx, {"GlbMsgIdx", "mq.msgasy.glbmsgidx", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, "MSGASYNC Global Message Index", HFILL }},
		{ &hf_mq_msgasy_SegLength, {"SegLength", "mq.msgasy.seglength", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, "MSGASYNC Segment Length", HFILL }},
		{ &hf_mq_msgasy_SegmIndex, {"SegmIndex", "mq.msgasy.segmindex", FT_UINT16, BASE_HEX_DEC, NULL, 0x0, "MSGASYNC Segment Index", HFILL }},
		{ &hf_mq_msgasy_SeleIndex, {"SeleIndex", "mq.msgasy.seleindex", FT_UINT16, BASE_HEX_DEC, NULL, 0x0, "MSGASYNC Selection Index", HFILL }},
		{ &hf_mq_msgasy_ReasonCod, {"ReasonCod", "mq.msgasy.reasoncod", FT_UINT32, BASE_HEX    , NULL, 0x0, "MSGASYNC Reason Code", HFILL }},
		{ &hf_mq_msgasy_ActMsgLen, {"ActMsgLen", "mq.msgasy.actmsglen", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, "MSGASYNC Actual Message Length", HFILL }},
		{ &hf_mq_msgasy_TotMsgLen, {"TotMsgLen", "mq.msgasy.totmsglen", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, "MSGASYNC Total Message Length", HFILL }},
		{ &hf_mq_msgasy_MsgToken , {"MsgToken.", "mq.msgasy.msgtoken" , FT_BYTES , BASE_NONE   , NULL, 0x0, "MSGASYNC Mesasage Token", HFILL }},
		{ &hf_mq_msgasy_Status   , {"status...", "mq.msgasy.status"   , FT_UINT16, BASE_HEX    , NULL, 0x0, "MSGASYNC Status", HFILL }},
		{ &hf_mq_msgasy_resolQNLn, {"resolQNLn", "mq.msgasy.resolqnln", FT_UINT8 , BASE_DEC    , NULL, 0x0, "MSGASYNC Resolved Queue Name Length", HFILL }},
		{ &hf_mq_msgasy_resolQNme, {"resolQNme", "mq.msgasy.resolqnme", FT_STRINGZ, BASE_NONE  , NULL, 0x0, "MSGASYNC Resolved Queue Name", HFILL }},
		{ &hf_mq_msgasy_padding  , {"Padding..", "mq.msgasy.padding"  , FT_BYTES , BASE_NONE   , NULL, 0x0, "MSGASYNC Padding", HFILL }},

		{ &hf_mq_notif_vers     , {"version.", "mq.notif.vers"  , FT_UINT32, BASE_HEX_DEC, NULL, 0x0, "NOTIFICATION version", HFILL }},
		{ &hf_mq_notif_handle   , {"handle..", "mq.notif.handle", FT_UINT32, BASE_HEX    , NULL, 0x0, "NOTIFICATION handle", HFILL }},
		{ &hf_mq_notif_code     , {"code....", "mq.notif.code"  , FT_UINT32, BASE_HEX_DEC, VALS(GET_VALSV(notifcode)), 0x0, "NOTIFICATION code", HFILL }},
		{ &hf_mq_notif_value    , {"value...", "mq.notif.value" , FT_UINT32, BASE_HEX_DEC, NULL, 0x0, "NOTIFICATION MQRC", HFILL }},

		{ &hf_mq_ping_length    , {"Length", "mq.ping.length", FT_UINT32, BASE_DEC, NULL, 0x0, "PING length", HFILL }},
		{ &hf_mq_ping_buffer    , {"Buffer", "mq.ping.buffer", FT_BYTES, BASE_NONE, NULL, 0x0, "PING buffer", HFILL }},

		{ &hf_mq_reset_length   , {"Length", "mq.reset.length", FT_UINT32, BASE_DEC, NULL, 0x0, "RESET length", HFILL }},
		{ &hf_mq_reset_seqnum   , {"SeqNum", "mq.reset.seqnum", FT_UINT32, BASE_DEC, NULL, 0x0, "RESET sequence number", HFILL }},

		{ &hf_mq_status_length  , {"Length", "mq.status.length", FT_UINT32, BASE_DEC, NULL, 0x0, "STATUS length", HFILL }},
		{ &hf_mq_status_code    , {"Code..", "mq.status.code"  , FT_UINT32, BASE_DEC, VALS(GET_VALSV(status)), 0x0, "STATUS code", HFILL }},
		{ &hf_mq_status_value   , {"Value.", "mq.status.value" , FT_UINT32, BASE_DEC, NULL, 0x0, "STATUS value", HFILL }},

		{ &hf_mq_od_StructID    , {"StructID.........", "mq.od.structid", FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL }},
		{ &hf_mq_od_version     , {"version..........", "mq.od.version", FT_UINT32, BASE_DEC, NULL, 0x0, "OD version", HFILL }},
		{ &hf_mq_od_objecttype  , {"ObjType..........", "mq.od.objtype", FT_UINT32, BASE_DEC, VALS(GET_VALSV(objtype)), 0x0, "OD object type", HFILL }},
		{ &hf_mq_od_objectname  , {"ObjName..........", "mq.od.objname", FT_STRINGZ, BASE_NONE, NULL, 0x0, "OD object name", HFILL }},
		{ &hf_mq_od_objqmgrname , {"ObjQMgr..........", "mq.od.objqmgrname", FT_STRINGZ, BASE_NONE, NULL, 0x0, "OD object queue manager name", HFILL }},
		{ &hf_mq_od_dynqname    , {"DynQName.........", "mq.od.dynqname", FT_STRINGZ, BASE_NONE, NULL, 0x0, "OD dynamic queue name", HFILL }},
		{ &hf_mq_od_altuserid   , {"AltUserID........", "mq.od.altuserid", FT_STRINGZ, BASE_NONE, NULL, 0x0, "OD alternate userid", HFILL }},
		{ &hf_mq_od_recspresent , {"NbrRecord........", "mq.od.nbrrec", FT_UINT32, BASE_DEC, NULL, 0x0, "OD number of records", HFILL }},
		{ &hf_mq_od_knowndstcnt , {"Known Dest Count.", "mq.od.kdestcount", FT_UINT32, BASE_DEC, NULL, 0x0, "OD known destination count", HFILL }},
		{ &hf_mq_od_unknowdstcnt, {"Unknown Dest Cnt.", "mq.od.udestcount", FT_UINT32, BASE_DEC, NULL, 0x0, "OD unknown destination count", HFILL }},
		{ &hf_mq_od_invaldstcnt , {"Invalid Dest Cnt.", "mq.od.idestcount", FT_UINT32, BASE_DEC, NULL, 0x0, "OD invalid destination count", HFILL }},
		{ &hf_mq_od_objrecofs   , {"Offset of 1st OR.", "mq.od.offsetor", FT_UINT32, BASE_DEC, NULL, 0x0, "OD offset of first OR", HFILL }},
		{ &hf_mq_od_resprecofs  , {"Offset of 1st RR.", "mq.od.offsetrr", FT_UINT32, BASE_DEC, NULL, 0x0, "OD offset of first RR", HFILL }},
		{ &hf_mq_od_objrecptr   , {"Addr   of 1st OR.", "mq.od.addror", FT_UINT32, BASE_HEX, NULL, 0x0, "OD address of first OR", HFILL }},
		{ &hf_mq_od_resprecptr  , {"Addr   of 1st RR.", "mq.od.addrrr", FT_UINT32, BASE_HEX, NULL, 0x0, "OD address of first RR", HFILL }},
		{ &hf_mq_od_altsecurid  , {"Alt security id..", "mq.od.altsecid", FT_STRINGZ, BASE_NONE, NULL, 0x0, "OD alternate security id", HFILL }},
		{ &hf_mq_od_resolvqname , {"Resolved Q Name..", "mq.od.resolvq", FT_STRINGZ, BASE_NONE, NULL, 0x0, "OD resolved queue name", HFILL }},
		{ &hf_mq_od_resolvqmgrnm, {"Resolved QMgrName", "mq.od.resolvqmgr", FT_STRINGZ, BASE_NONE, NULL, 0x0, "OD resolved queue manager name", HFILL }},
		{ &hf_mq_od_resolvobjtyp, {"Resolv Obj Type..", "mq.od.resolvedobjtype", FT_UINT32, BASE_DEC, VALS(GET_VALSV(objtype)), 0x0, "OD resolved object type", HFILL }},

		{ &hf_mq_or_objname     , {"Object name...", "mq.or.objname", FT_STRINGZ, BASE_NONE, NULL, 0x0, "OR object name", HFILL }},
		{ &hf_mq_or_objqmgrname , {"Object QMgr Nm", "mq.or.objqmgrname", FT_STRINGZ, BASE_NONE, NULL, 0x0, "OR object queue manager name", HFILL }},

		{ &hf_mq_rr_compcode    , {"Comp Code", "mq.rr.completioncode", FT_UINT32, BASE_DEC, NULL, 0x0, "OR completion code", HFILL }},
		{ &hf_mq_rr_reascode    , {"Reas Code", "mq.rr.reasoncode", FT_UINT32, BASE_DEC, NULL, 0x0, "OR reason code", HFILL }},

		{ &hf_mq_pmr_msgid      , {"Message Id", "mq.pmr.msgid", FT_BYTES, BASE_NONE, NULL, 0x0, "PMR Message Id", HFILL }},
		{ &hf_mq_pmr_correlid   , {"Correlation Id", "mq.pmr.correlid", FT_BYTES, BASE_NONE, NULL, 0x0, "PMR Correlation Id", HFILL }},
		{ &hf_mq_pmr_groupid    , {"GroupId", "mq.pmr.groupid", FT_BYTES, BASE_NONE, NULL, 0x0, "PMR GroupId", HFILL }},
		{ &hf_mq_pmr_feedback   , {"Feedback", "mq.pmr.feedback", FT_UINT32, BASE_DEC, NULL, 0x0, "PMR Feedback", HFILL }},
		{ &hf_mq_pmr_acttoken   , {"Accounting token", "mq.pmr.acttoken", FT_BYTES, BASE_NONE, NULL, 0x0, "PMR accounting token", HFILL }},

		{ &hf_mq_md_StructID    , {"StructID.", "mq.md.structid", FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL }},
		{ &hf_mq_md_version     , {"Version..", "mq.md.version", FT_UINT32, BASE_DEC, NULL, 0x0, "MD version", HFILL }},
		{ &hf_mq_md_report      , {"Report...", "mq.md.report", FT_UINT32, BASE_DEC, NULL, 0x0, "MD report", HFILL }},
		{ &hf_mq_md_msgtype     , {"Msg Type.", "mq.md.msgtype", FT_UINT32, BASE_DEC, NULL, 0x0, "MD message type", HFILL }},
		{ &hf_mq_md_expiry      , {"Expiry  .", "mq.md.expiry", FT_INT32, BASE_DEC, NULL, 0x0, "MD expiry", HFILL }},
		{ &hf_mq_md_feedback    , {"Feedback.", "mq.md.feedback", FT_UINT32, BASE_DEC, NULL, 0x0, "MD feedback", HFILL }},
		{ &hf_mq_md_encoding    , {"Encoding.", "mq.md.encoding", FT_UINT32, BASE_DEC, NULL, 0x0, "MD encoding", HFILL }},
		{ &hf_mq_md_ccsid       , {"CCSID....", "mq.md.ccsid", FT_INT32, BASE_DEC | BASE_RANGE_STRING, RVALS(&GET_VALRV(ccsid)), 0x0, "MD character set", HFILL }},
		{ &hf_mq_md_format      , {"Format...", "mq.md.format", FT_STRINGZ, BASE_NONE, NULL, 0x0, "MD format", HFILL }},
		{ &hf_mq_md_priority    , {"Priority.", "mq.md.priority", FT_INT32, BASE_DEC, NULL, 0x0, "MD priority", HFILL }},
		{ &hf_mq_md_persistence , {"Persist..", "mq.md.persistence", FT_UINT32, BASE_DEC, NULL, 0x0, "MD persistence", HFILL }},
		{ &hf_mq_md_msgid       , {"Msg ID...", "mq.md.msgid", FT_BYTES, BASE_NONE, NULL, 0x0, "MD Message Id", HFILL }},
		{ &hf_mq_md_correlid    , {"CorrelID.", "mq.md.correlid", FT_BYTES, BASE_NONE, NULL, 0x0, "MD Correlation Id", HFILL }},
		{ &hf_mq_md_backoutcnt  , {"BackoCnt.", "mq.md.backount", FT_UINT32, BASE_DEC, NULL, 0x0, "MD Backout count", HFILL }},
		{ &hf_mq_md_replytoq    , {"ReplyToQ.", "mq.md.replytoq", FT_STRINGZ, BASE_NONE, NULL, 0x0, "MD ReplyTo queue", HFILL }},
		{ &hf_mq_md_replytoqmgr , {"RepToQMgr", "mq.md.replytoqmgr", FT_STRINGZ, BASE_NONE, NULL, 0x0, "MD ReplyTo queue manager", HFILL }},
		{ &hf_mq_md_userid      , {"UserId...", "mq.md.userid", FT_STRINGZ, BASE_NONE, NULL, 0x0, "MD UserId", HFILL }},
		{ &hf_mq_md_acttoken    , {"AccntTok.", "mq.md.acttoken", FT_BYTES, BASE_NONE, NULL, 0x0, "MD accounting token", HFILL }},
		{ &hf_mq_md_appliddata  , {"AppIdData", "mq.md.appldata", FT_STRINGZ, BASE_NONE, NULL, 0x0, "MD Put applicationId data", HFILL }},
		{ &hf_mq_md_putappltype , {"PutAppTyp", "mq.md.appltype", FT_INT32, BASE_DEC, VALS(GET_VALSV(mqat)), 0x0, "MD Put application type", HFILL }},
		{ &hf_mq_md_putapplname , {"PutAppNme", "mq.md.applname", FT_STRINGZ, BASE_NONE, NULL, 0x0, "MD Put application name", HFILL }},
		{ &hf_mq_md_putdate     , {"PutDatGMT", "mq.md.date", FT_STRINGZ, BASE_NONE, NULL, 0x0, "MD Put date", HFILL }},
		{ &hf_mq_md_puttime     , {"PutTimGMT", "mq.md.time", FT_STRINGZ, BASE_NONE, NULL, 0x0, "MD Put time", HFILL }},
		{ &hf_mq_md_apporigdata , {"AppOriDat", "mq.md.origdata", FT_STRINGZ, BASE_NONE, NULL, 0x0, "MD Application original data", HFILL }},
		{ &hf_mq_md_groupid     , {"GroupId..", "mq.md.groupid", FT_BYTES, BASE_NONE, NULL, 0x0, "MD GroupId", HFILL }},
		{ &hf_mq_md_msgseqnumber, {"MsgSeqNum", "mq.md.msgseqnumber", FT_UINT32, BASE_DEC, NULL, 0x0, "MD Message sequence number", HFILL }},
		{ &hf_mq_md_offset      , {"Offset...", "mq.md.offset", FT_UINT32, BASE_DEC, NULL, 0x0, "MD Offset", HFILL }},
		{ &hf_mq_md_msgflags    , {"Msg flags", "mq.md.msgflags", FT_UINT32, BASE_HEX, NULL, 0x0, "MD Message flags", HFILL }},
		{ &hf_mq_md_origlen     , {"Orig len.", "mq.md.origlength", FT_INT32, BASE_DEC, NULL, 0x0, "MD Original length", HFILL }},

		{ &hf_mq_dlh_StructID   , {"StructID.", "mq.dlh.structid", FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL }},
		{ &hf_mq_dlh_version    , {"Version..", "mq.dlh.version", FT_UINT32, BASE_DEC, NULL, 0x0, "DLH version", HFILL }},
		{ &hf_mq_dlh_reason     , {"Reason...", "mq.dlh.reason", FT_UINT32, BASE_DEC, NULL, 0x0, "DLH reason", HFILL }},
		{ &hf_mq_dlh_destq      , {"Dest Q...", "mq.dlh.destq", FT_STRINGZ, BASE_NONE, NULL, 0x0, "DLH destination queue", HFILL }},
		{ &hf_mq_dlh_destqmgr   , {"DestQMgr.", "mq.dlh.destqmgr", FT_STRINGZ, BASE_NONE, NULL, 0x0, "DLH destination queue manager", HFILL }},
		{ &hf_mq_dlh_encoding   , {"Encoding.", "mq.dlh.encoding", FT_UINT32, BASE_DEC, NULL, 0x0, "DLH encoding", HFILL }},
		{ &hf_mq_dlh_ccsid      , {"CCSID....", "mq.dlh.ccsid", FT_INT32, BASE_DEC | BASE_RANGE_STRING, RVALS(&GET_VALRV(ccsid)), 0x0, "DLH character set", HFILL }},
		{ &hf_mq_dlh_format     , {"Format...", "mq.dlh.format", FT_STRINGZ, BASE_NONE, NULL, 0x0, "DLH format", HFILL }},
		{ &hf_mq_dlh_putappltype, {"PutAppTyp", "mq.dlh.putappltype", FT_INT32, BASE_DEC, VALS(GET_VALSV(mqat)), 0x0, "DLH put application type", HFILL }},
		{ &hf_mq_dlh_putapplname, {"PutAppNme", "mq.dlh.putapplname", FT_STRINGZ, BASE_NONE, NULL, 0x0, "DLH put application name", HFILL }},
		{ &hf_mq_dlh_putdate    , {"PutDatGMT", "mq.dlh.putdate", FT_STRINGZ, BASE_NONE, NULL, 0x0, "DLH put date", HFILL }},
		{ &hf_mq_dlh_puttime    , {"PutTimGMT", "mq.dlh.puttime", FT_STRINGZ, BASE_NONE, NULL, 0x0, "DLH put time", HFILL }},
		{ &hf_mq_dh_putmsgrecfld, {"Flags PMR", "mq.dh.flagspmr", FT_UINT32, BASE_DEC, NULL, 0x0, "DH flags PMR", HFILL }},
		{ &hf_mq_dh_recspresent , {"NumOfRecs", "mq.dh.nbrrec", FT_UINT32, BASE_DEC, NULL, 0x0, "DH number of records", HFILL }},
		{ &hf_mq_dh_objrecofs   , {"Ofs1stOR.", "mq.dh.offsetor", FT_UINT32, BASE_DEC, NULL, 0x0, "DH offset of first OR", HFILL }},
		{ &hf_mq_dh_putmsgrecofs, {"Ofs1stPMR", "mq.dh.offsetpmr", FT_UINT32, BASE_DEC, NULL, 0x0, "DH offset of first PMR", HFILL }},

		{ &hf_mq_gmo_StructID   , {"StructID.", "mq.gmo.structid", FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL }},
		{ &hf_mq_gmo_version    , {"Version..", "mq.gmo.version", FT_UINT32, BASE_DEC, NULL, 0x0, "GMO version", HFILL }},
		{ &hf_mq_gmo_options    , {"GetMsgOpt", "mq.gmo.getmsgopt", FT_UINT32, BASE_HEX, NULL, 0x0, "GMO Get Message Options", HFILL }},

		{ &hf_mq_gmo_options_PROPERTIES_COMPATIBILITY, {"PROPERTIES_COMPATIBILITY", "mq.gmo.options.PROPERTIES_COMPATIBILITY", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQGMO_PROPERTIES_COMPATIBILITY, "GMO options PROPERTIES_COMPATIBILITY", HFILL }},
		{ &hf_mq_gmo_options_PROPERTIES_IN_HANDLE    , {"PROPERTIES_IN_HANDLE", "mq.gmo.options.PROPERTIES_IN_HANDLE", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQGMO_PROPERTIES_IN_HANDLE , "GMO options PROPERTIES_IN_HANDLE", HFILL }},
		{ &hf_mq_gmo_options_NO_PROPERTIES           , {"NO_PROPERTIES", "mq.gmo.options.NO_PROPERTIES", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQGMO_NO_PROPERTIES , "GMO options NO_PROPERTIES", HFILL }},
		{ &hf_mq_gmo_options_PROPERTIES_FORCE_MQRFH2 , {"PROPERTIES_FORCE_MQRFH2", "mq.gmo.options.PROPERTIES_FORCE_MQRFH2", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQGMO_PROPERTIES_FORCE_MQRFH2 , "GMO options PROPERTIES_FORCE_MQRFH2", HFILL }},
		{ &hf_mq_gmo_options_UNMARKED_BROWSE_MSG     , {"UNMARKED_BROWSE_MSG", "mq.gmo.options.UNMARKED_BROWSE_MSG", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQGMO_UNMARKED_BROWSE_MSG , "GMO options UNMARKED_BROWSE_MSG", HFILL }},
		{ &hf_mq_gmo_options_UNMARK_BROWSE_HANDLE    , {"UNMARK_BROWSE_HANDLE", "mq.gmo.options.UNMARK_BROWSE_HANDLE", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQGMO_UNMARK_BROWSE_HANDLE , "GMO options UNMARK_BROWSE_HANDLE", HFILL }},
		{ &hf_mq_gmo_options_UNMARK_BROWSE_CO_OP     , {"UNMARK_BROWSE_CO_OP", "mq.gmo.options.UNMARK_BROWSE_CO_OP", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQGMO_UNMARK_BROWSE_CO_OP , "GMO options UNMARK_BROWSE_CO_OP", HFILL }},
		{ &hf_mq_gmo_options_MARK_BROWSE_CO_OP       , {"MARK_BROWSE_CO_OP", "mq.gmo.options.MARK_BROWSE_CO_OP", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQGMO_MARK_BROWSE_CO_OP , "GMO options MARK_BROWSE_CO_OP", HFILL }},
		{ &hf_mq_gmo_options_MARK_BROWSE_HANDLE      , {"MARK_BROWSE_HANDLE", "mq.gmo.options.MARK_BROWSE_HANDLE", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQGMO_MARK_BROWSE_HANDLE , "GMO options MARK_BROWSE_HANDLE", HFILL }},
		{ &hf_mq_gmo_options_ALL_SEGMENTS_AVAILABLE  , {"ALL_SEGMENTS_AVAILABLE", "mq.gmo.options.ALL_SEGMENTS_AVAILABLE", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQGMO_ALL_SEGMENTS_AVAILABLE , "GMO options ALL_SEGMENTS_AVAILABLE", HFILL }},
		{ &hf_mq_gmo_options_ALL_MSGS_AVAILABLE      , {"ALL_MSGS_AVAILABLE", "mq.gmo.options.ALL_MSGS_AVAILABLE", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQGMO_ALL_MSGS_AVAILABLE , "GMO options ALL_MSGS_AVAILABLE", HFILL }},
		{ &hf_mq_gmo_options_COMPLETE_MSG            , {"COMPLETE_MSG", "mq.gmo.options.COMPLETE_MSG", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQGMO_COMPLETE_MSG , "GMO options COMPLETE_MSG", HFILL }},
		{ &hf_mq_gmo_options_LOGICAL_ORDER           , {"LOGICAL_ORDER", "mq.gmo.options.LOGICAL_ORDER", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQGMO_LOGICAL_ORDER , "GMO options LOGICAL_ORDER", HFILL }},
		{ &hf_mq_gmo_options_CONVERT                 , {"CONVERT", "mq.gmo.options.CONVERT", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQGMO_CONVERT , "GMO options CONVERT", HFILL }},
		{ &hf_mq_gmo_options_FAIL_IF_QUIESCING       , {"FAIL_IF_QUIESCING", "mq.gmo.options.FAIL_IF_QUIESCING", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQGMO_FAIL_IF_QUIESCING , "GMO options FAIL_IF_QUIESCING", HFILL }},
		{ &hf_mq_gmo_options_SYNCPOINT_IF_PERSISTENT , {"SYNCPOINT_IF_PERSISTENT", "mq.gmo.options.SYNCPOINT_IF_PERSISTENT", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQGMO_SYNCPOINT_IF_PERSISTENT , "GMO options SYNCPOINT_IF_PERSISTENT", HFILL }},
		{ &hf_mq_gmo_options_BROWSE_MSG_UNDER_CURSOR , {"BROWSE_MSG_UNDER_CURSOR", "mq.gmo.options.BROWSE_MSG_UNDER_CURSOR", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQGMO_BROWSE_MSG_UNDER_CURSOR , "GMO options BROWSE_MSG_UNDER_CURSOR", HFILL }},
		{ &hf_mq_gmo_options_UNLOCK                  , {"UNLOCK", "mq.gmo.options.UNLOCK", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQGMO_UNLOCK , "GMO options UNLOCK", HFILL }},
		{ &hf_mq_gmo_options_LOCK                    , {"LOCK", "mq.gmo.options.LOCK", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQGMO_LOCK , "GMO options LOCK", HFILL }},
		{ &hf_mq_gmo_options_MSG_UNDER_CURSOR        , {"MSG_UNDER_CURSOR", "mq.gmo.options.MSG_UNDER_CURSOR", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQGMO_MSG_UNDER_CURSOR , "GMO options MSG_UNDER_CURSOR", HFILL }},
		{ &hf_mq_gmo_options_MARK_SKIP_BACKOUT       , {"MARK_SKIP_BACKOUT", "mq.gmo.options.MARK_SKIP_BACKOUT", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQGMO_MARK_SKIP_BACKOUT , "GMO options MARK_SKIP_BACKOUT", HFILL }},
		{ &hf_mq_gmo_options_ACCEPT_TRUNCATED_MSG    , {"ACCEPT_TRUNCATED_MSG", "mq.gmo.options.ACCEPT_TRUNCATED_MSG", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQGMO_ACCEPT_TRUNCATED_MSG , "GMO options ACCEPT_TRUNCATED_MSG", HFILL }},
		{ &hf_mq_gmo_options_BROWSE_NEXT             , {"BROWSE_NEXT", "mq.gmo.options.BROWSE_NEXT", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQGMO_BROWSE_NEXT , "GMO options BROWSE_NEXT", HFILL }},
		{ &hf_mq_gmo_options_BROWSE_FIRST            , {"BROWSE_FIRST", "mq.gmo.options.BROWSE_FIRST", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQGMO_BROWSE_FIRST , "GMO options BROWSE_FIRST", HFILL }},
		{ &hf_mq_gmo_options_SET_SIGNAL              , {"SET_SIGNAL", "mq.gmo.options.SET_SIGNAL", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQGMO_SET_SIGNAL , "GMO options SET_SIGNAL", HFILL }},
		{ &hf_mq_gmo_options_NO_SYNCPOINT            , {"NO_SYNCPOINT", "mq.gmo.options.NO_SYNCPOINT", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQGMO_NO_SYNCPOINT , "GMO options NO_SYNCPOINT", HFILL }},
		{ &hf_mq_gmo_options_SYNCPOINT               , {"SYNCPOINT", "mq.gmo.options.SYNCPOINT", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQGMO_SYNCPOINT , "GMO options SYNCPOINT", HFILL }},
		{ &hf_mq_gmo_options_WAIT                    , {"WAIT", "mq.gmo.options.WAIT", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQGMO_WAIT , "GMO options WAIT", HFILL }},

		{ &hf_mq_gmo_waitinterval, {"WaitIntv.", "mq.gmo.waitint", FT_INT32, BASE_DEC, NULL, 0x0, "GMO wait interval", HFILL }},
		{ &hf_mq_gmo_signal1     , {"Signal 1.", "mq.gmo.signal1", FT_UINT32, BASE_HEX, NULL, 0x0, "GMO signal 1", HFILL }},
		{ &hf_mq_gmo_signal2     , {"Signal 2.", "mq.gmo.signal2", FT_UINT32, BASE_HEX, NULL, 0x0, "GMO signal 2", HFILL }},
		{ &hf_mq_gmo_resolvqname , {"ResQName.", "mq.gmo.resolvq", FT_STRINGZ, BASE_NONE, NULL, 0x0, "GMO resolved queue name", HFILL }},
		{ &hf_mq_gmo_matchoptions, {"MatchOpt.", "mq.gmo.matchopt", FT_UINT32, BASE_HEX, NULL, 0x0, "GMO match options", HFILL }},

		{ &hf_mq_gmo_matchoptions_MATCH_MSG_TOKEN     , {"MATCH_MSG_TOKEN", "mq.gmo.matchoptions.MATCH_MSG_TOKEN", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQMO_MATCH_MSG_TOKEN , "GMO matchoptions MATCH_MSG_TOKEN", HFILL }},
		{ &hf_mq_gmo_matchoptions_MATCH_OFFSET        , {"MATCH_OFFSET", "mq.gmo.matchoptions.MATCH_OFFSET", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQMO_MATCH_OFFSET , "GMO matchoptions MATCH_OFFSET", HFILL }},
		{ &hf_mq_gmo_matchoptions_MATCH_MSG_SEQ_NUMBER, {"MATCH_MSG_SEQ_NUMBER", "mq.gmo.matchoptions.MATCH_MSG_SEQ_NUMBER", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQMO_MATCH_MSG_SEQ_NUMBER, "GMO matchoptions MATCH_MSG_SEQ_NUMBER", HFILL }},
		{ &hf_mq_gmo_matchoptions_MATCH_GROUP_ID      , {"MATCH_GROUP_ID", "mq.gmo.matchoptions.MATCH_GROUP_ID", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQMO_MATCH_GROUP_ID , "GMO matchoptions MATCH_GROUP_ID", HFILL }},
		{ &hf_mq_gmo_matchoptions_MATCH_CORREL_ID     , {"MATCH_CORREL_ID", "mq.gmo.matchoptions.MATCH_CORREL_ID", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQMO_MATCH_CORREL_ID , "GMO matchoptions MATCH_CORREL_ID", HFILL }},
		{ &hf_mq_gmo_matchoptions_MATCH_MSG_ID        , {"MATCH_MSG_ID", "mq.gmo.matchoptions.MATCH_MSG_ID", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQMO_MATCH_MSG_ID , "GMO matchoptions MATCH_MSG_ID", HFILL }},

		{ &hf_mq_gmo_groupstatus , {"GrpStatus", "mq.gmo.grpstat", FT_UINT8, BASE_HEX, NULL, 0x0, "GMO group status", HFILL }},
		{ &hf_mq_gmo_segmstatus  , {"SegStatus", "mq.gmo.sgmtstat", FT_UINT8, BASE_HEX, NULL, 0x0, "GMO segment status", HFILL }},
		{ &hf_mq_gmo_segmentation, {"Segmentat", "mq.gmo.segmentation", FT_UINT8, BASE_HEX, NULL, 0x0, "GMO segmentation", HFILL }},
		{ &hf_mq_gmo_reserved    , {"Reserved.", "mq.gmo.reserved", FT_UINT8, BASE_HEX, NULL, 0x0, "GMO reserved", HFILL }},
		{ &hf_mq_gmo_msgtoken    , {"MsgToken.", "mq.gmo.msgtoken", FT_BYTES, BASE_NONE, NULL, 0x0, "GMO message token", HFILL }},
		{ &hf_mq_gmo_returnedlen , {"RtnLength", "mq.gmo.retlen", FT_INT32, BASE_DEC, NULL, 0x0, "GMO returned length", HFILL }},

		{ &hf_mq_lpoo_StructID      , {"StructID......", "mq.lpoo.structid", FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL }},
		{ &hf_mq_lpoo_version       , {"Version.......", "mq.lpoo.version", FT_UINT32, BASE_DEC, NULL, 0x0, "LPOO version", HFILL }},
		{ &hf_mq_lpoo_options       , {"Options.......", "mq.lpoo.options", FT_UINT32, BASE_HEX, NULL, 0x0, "LPOO options", HFILL }},
		{ &hf_mq_lpoo_lpiopts       , {"LpiOpts.......", "mq.lpoo.lpioopts", FT_UINT32, BASE_HEX, NULL, 0x0, "LPOO Lpi Options", HFILL }},

		{ &hf_mq_lpoo_lpiopts_SAVE_USER_CTXT    , {"SAVE_USER_CTXT", "mq.lpoo.opts.SAVE_USER_CTXT", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_LPOO_SAVE_USER_CTXT, "LPOO options SAVE_USER_CTXT", HFILL }},
		{ &hf_mq_lpoo_lpiopts_SAVE_ORIGIN_CTXT  , {"SAVE_ORIGIN_CTXT", "mq.lpoo.opts.SAVE_ORIGIN_CTXT", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_LPOO_SAVE_ORIGIN_CTXT, "LPOO options SAVE_ORIGIN_CTXT", HFILL }},
		{ &hf_mq_lpoo_lpiopts_SAVE_IDENTITY_CTXT, {"SAVE_IDENTITY_CTXT", "mq.lpoo.opts.SAVE_IDENTITY_CTXT", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_LPOO_SAVE_IDENTITY_CTXT, "LPOO options SAVE_IDENTITY_CTXT", HFILL }},

		{ &hf_mq_lpoo_defpersist    , {"DefPersitence.", "mq.lpoo.defpersist", FT_UINT32, BASE_HEX, NULL, 0x0, "LPOO Default Persitence", HFILL }},
		{ &hf_mq_lpoo_defputresptype, {"DefPutRespType", "mq.lpoo.defputresptype", FT_UINT32, BASE_HEX, NULL, 0x0, "LPOO Default Put Response Type", HFILL }},
		{ &hf_mq_lpoo_defreadahead  , {"DefReadAHead..", "mq.lpoo.defreadahead", FT_UINT32, BASE_HEX, NULL, 0x0, "LPOO Default Read AHead", HFILL }},

		{ &hf_mq_lpoo_qprotect      , {"qprotect......", "mq.lpoo.qprotect", FT_STRINGZ, BASE_NONE, NULL, 0x0, "LPOO queue protection", HFILL }},
		{ &hf_mq_lpoo_unknown6      , {"Unknown6......", "mq.lpoo.unknown6", FT_UINT32, BASE_HEX, NULL, 0x0, "LPOO unknown6", HFILL }},
		/*{ &hf_mq_lpoo_unknown7      , {"Unknown7......", "mq.lpoo.unknown7", FT_UINT16, BASE_HEX, NULL, 0x0, "LPOO unknown7", HFILL }},*/
		{ &hf_mq_lpoo_xtradata      , {"ExtraData.....", "mq.lpoo.extradata", FT_UINT32, BASE_DEC, NULL, 0x0, "LPOO Extra Data", HFILL }},

		{ &hf_mq_pmo_StructID    , {"StructID.", "mq.pmo.structid", FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL }},
		{ &hf_mq_pmo_version     , {"Version..", "mq.pmo.version", FT_UINT32, BASE_DEC, NULL, 0x0, "PMO version", HFILL }},
		{ &hf_mq_pmo_options     , {"Options..", "mq.pmo.options", FT_UINT32, BASE_HEX, NULL, 0x0, "PMO options", HFILL }},
		{ &hf_mq_pmo_options_NOT_OWN_SUBS            , {"NOT_OWN_SUBS", "mq.pmo.options.NOT_OWN_SUBS", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQPMO_NOT_OWN_SUBS , "PMO options NOT_OWN_SUBS", HFILL }},
		{ &hf_mq_pmo_options_SUPPRESS_REPLYTO        , {"SUPPRESS_REPLYTO", "mq.pmo.options.SUPPRESS_REPLYTO", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQPMO_SUPPRESS_REPLYTO , "PMO options SUPPRESS_REPLYTO", HFILL }},
		{ &hf_mq_pmo_options_SCOPE_QMGR              , {"SCOPE_QMGR", "mq.pmo.options.SCOPE_QMGR", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQPMO_SCOPE_QMGR , "PMO options SCOPE_QMGR", HFILL }},
		{ &hf_mq_pmo_options_MD_FOR_OUTPUT_ONLY      , {"MD_FOR_OUTPUT_ONLY", "mq.pmo.options.MD_FOR_OUTPUT_ONLY", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQPMO_MD_FOR_OUTPUT_ONLY , "PMO options MD_FOR_OUTPUT_ONLY", HFILL }},
		{ &hf_mq_pmo_options_RETAIN                  , {"RETAIN", "mq.pmo.options.RETAIN", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQPMO_RETAIN , "PMO options RETAIN", HFILL }},
		{ &hf_mq_pmo_options_WARN_IF_NO_SUBS_MATCHED , {"WARN_IF_NO_SUBS_MATCHED", "mq.pmo.options.WARN_IF_NO_SUBS_MATCHED", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQPMO_WARN_IF_NO_SUBS_MATCHED , "PMO options WARN_IF_NO_SUBS_MATCHED", HFILL }},
		{ &hf_mq_pmo_options_RESOLVE_LOCAL_Q         , {"RESOLVE_LOCAL_Q", "mq.pmo.options.RESOLVE_LOCAL_Q", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQPMO_RESOLVE_LOCAL_Q , "PMO options RESOLVE_LOCAL_Q", HFILL }},
		{ &hf_mq_pmo_options_SYNC_RESPONSE           , {"SYNC_RESPONSE", "mq.pmo.options.SYNC_RESPONSE", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQPMO_SYNC_RESPONSE , "PMO options SYNC_RESPONSE", HFILL }},
		{ &hf_mq_pmo_options_ASYNC_RESPONSE          , {"ASYNC_RESPONSE", "mq.pmo.options.ASYNC_RESPONSE", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQPMO_ASYNC_RESPONSE , "PMO options ASYNC_RESPONSE", HFILL }},
		{ &hf_mq_pmo_options_LOGICAL_ORDER           , {"LOGICAL_ORDER", "mq.pmo.options.LOGICAL_ORDER", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQPMO_LOGICAL_ORDER , "PMO options LOGICAL_ORDER", HFILL }},
		{ &hf_mq_pmo_options_NO_CONTEXT              , {"NO_CONTEXT", "mq.pmo.options.NO_CONTEXT", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQPMO_NO_CONTEXT , "PMO options NO_CONTEXT", HFILL }},
		{ &hf_mq_pmo_options_FAIL_IF_QUIESCING       , {"FAIL_IF_QUIESCING", "mq.pmo.options.FAIL_IF_QUIESCING", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQPMO_FAIL_IF_QUIESCING , "PMO options FAIL_IF_QUIESCING", HFILL }},
		{ &hf_mq_pmo_options_ALTERNATE_USER_AUTHORITY, {"ALTERNATE_USER_AUTHORITY", "mq.pmo.options.ALTERNATE_USER_AUTHORITY", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQPMO_ALTERNATE_USER_AUTHORITY , "PMO options ALTERNATE_USER_AUTHORITY", HFILL }},
		{ &hf_mq_pmo_options_SET_ALL_CONTEXT         , {"SET_ALL_CONTEXT", "mq.pmo.options.SET_ALL_CONTEXT", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQPMO_SET_ALL_CONTEXT , "PMO options SET_ALL_CONTEXT", HFILL }},
		{ &hf_mq_pmo_options_SET_IDENTITY_CONTEXT    , {"SET_IDENTITY_CONTEXT", "mq.pmo.options.SET_IDENTITY_CONTEXT", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQPMO_SET_IDENTITY_CONTEXT , "PMO options SET_IDENTITY_CONTEXT", HFILL }},
		{ &hf_mq_pmo_options_PASS_ALL_CONTEXT        , {"PASS_ALL_CONTEXT", "mq.pmo.options.PASS_ALL_CONTEXT", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQPMO_PASS_ALL_CONTEXT , "PMO options PASS_ALL_CONTEXT", HFILL }},
		{ &hf_mq_pmo_options_PASS_IDENTITY_CONTEXT   , {"PASS_IDENTITY_CONTEXT", "mq.pmo.options.PASS_IDENTITY_CONTEXT", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQPMO_PASS_IDENTITY_CONTEXT , "PMO options PASS_IDENTITY_CONTEXT", HFILL }},
		{ &hf_mq_pmo_options_NEW_CORREL_ID           , {"NEW_CORREL_ID", "mq.pmo.options.NEW_CORREL_ID", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQPMO_NEW_CORREL_ID , "PMO options NEW_CORREL_ID", HFILL }},
		{ &hf_mq_pmo_options_NEW_MSG_ID              , {"NEW_MSG_ID", "mq.pmo.options.NEW_MSG_ID", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQPMO_NEW_MSG_ID , "PMO options NEW_MSG_ID", HFILL }},
		{ &hf_mq_pmo_options_DEFAULT_CONTEXT         , {"DEFAULT_CONTEXT", "mq.pmo.options.DEFAULT_CONTEXT", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQPMO_DEFAULT_CONTEXT , "PMO options DEFAULT_CONTEXT", HFILL }},
		{ &hf_mq_pmo_options_NO_SYNCPOINT            , {"NO_SYNCPOINT", "mq.pmo.options.NO_SYNCPOINT", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQPMO_NO_SYNCPOINT , "PMO options NO_SYNCPOINT", HFILL }},
		{ &hf_mq_pmo_options_SYNCPOINT               , {"SYNCPOINT", "mq.pmo.options.SYNCPOINT", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_MQPMO_SYNCPOINT , "PMO options SYNCPOINT", HFILL }},

		{ &hf_mq_pmo_timeout     , {"Timeout..", "mq.pmo.timeout", FT_INT32, BASE_DEC, NULL, 0x0, "PMO time out", HFILL }},
		{ &hf_mq_pmo_context     , {"Context..", "mq.pmo.context", FT_UINT32, BASE_HEX, NULL, 0x0, "PMO context", HFILL }},
		{ &hf_mq_pmo_knowndstcnt , {"KnDstCnt.", "mq.pmo.kdstcount", FT_UINT32, BASE_DEC, NULL, 0x0, "PMO known destination count", HFILL }},
		{ &hf_mq_pmo_unkndstcnt  , {"UkDstCnt.", "mq.pmo.udestcount", FT_UINT32, BASE_DEC, NULL, 0x0, "PMO unknown destination count", HFILL }},
		{ &hf_mq_pmo_invaldstcnt , {"InDstCnt.", "mq.pmo.idestcount", FT_UINT32, BASE_DEC, NULL, 0x0, "PMO invalid destination count", HFILL }},
		{ &hf_mq_pmo_resolvqname , {"ResQName.", "mq.pmo.resolvq", FT_STRINGZ, BASE_NONE, NULL, 0x0, "PMO resolved queue name", HFILL }},
		{ &hf_mq_pmo_resolvqmgr  , {"ResQMgr..", "mq.pmo.resolvqmgr", FT_STRINGZ, BASE_NONE, NULL, 0x0, "PMO resolved queue manager name", HFILL }},
		{ &hf_mq_pmo_recspresent , {"NumRecs..", "mq.pmo.nbrrec", FT_UINT32, BASE_DEC, NULL, 0x0, "PMO number of records", HFILL }},
		{ &hf_mq_pmo_putmsgrecfld, {"PMR Flag.", "mq.pmo.flagspmr", FT_UINT32, BASE_HEX, NULL, 0x0, "PMO flags PMR fields", HFILL }},
		{ &hf_mq_pmo_putmsgrecofs, {"Ofs1stPMR", "mq.pmo.offsetpmr", FT_UINT32, BASE_DEC, NULL, 0x0, "PMO offset of first PMR", HFILL }},
		{ &hf_mq_pmo_resprecofs  , {"Off1stRR.", "mq.pmo.offsetrr", FT_UINT32, BASE_DEC, NULL, 0x0, "PMO offset of first RR", HFILL }},
		{ &hf_mq_pmo_putmsgrecptr, {"Adr1stPMR", "mq.pmo.addrrec", FT_UINT32, BASE_HEX, NULL, 0x0, "PMO address of first record", HFILL }},
		{ &hf_mq_pmo_resprecptr  , {"Adr1stRR.", "mq.pmo.addrres", FT_UINT32, BASE_HEX, NULL, 0x0, "PMO address of first response record", HFILL }},

		{ &hf_mq_head_StructID   , {"Structid", "mq.head.structid", FT_STRINGZ, BASE_NONE, NULL, 0x0, "Header structid", HFILL }},
		{ &hf_mq_head_version    , {"version.", "mq.head.version", FT_UINT32, BASE_DEC, NULL, 0x0, "Header version", HFILL }},
		{ &hf_mq_head_length     , {"Length..", "mq.head.length", FT_UINT32, BASE_DEC, NULL, 0x0, "Header length", HFILL }},
		{ &hf_mq_head_encoding   , {"Encoding", "mq.head.encoding", FT_UINT32, BASE_DEC, NULL, 0x0, "Header encoding", HFILL }},
		{ &hf_mq_head_ccsid      , {"CCSID...", "mq.head.ccsid", FT_INT32, BASE_DEC | BASE_RANGE_STRING, RVALS(&GET_VALRV(ccsid)), 0x0, "Header character set", HFILL }},
		{ &hf_mq_head_format     , {"Format..", "mq.head.format", FT_STRINGZ, BASE_NONE, NULL, 0x0, "Header format", HFILL }},
		{ &hf_mq_head_flags      , {"Flags...", "mq.head.flags", FT_UINT32, BASE_DEC, NULL, 0x0, "Header flags", HFILL }},
		{ &hf_mq_head_struct     , {"Struct..", "mq.head.struct", FT_BYTES, BASE_NONE, NULL, 0x0, "Header struct", HFILL }},

		{ &hf_mq_xa_length        , {"Length.......", "mq.xa.length", FT_UINT32, BASE_DEC, NULL, 0x0, "XA Length", HFILL }},
		{ &hf_mq_xa_returnvalue   , {"Return value.", "mq.xa.returnvalue", FT_INT32, BASE_DEC, VALS(mq_xaer_vals), 0x0, "XA Return Value", HFILL }},
		{ &hf_mq_xa_tmflags       , {"TransMgrFlags", "mq.xa.tmflags", FT_UINT32, BASE_HEX, NULL, 0x0, "XA Transaction Manager Flags", HFILL }},
		{ &hf_mq_xa_rmid          , {"ResourceMgrID", "mq.xa.rmid", FT_UINT32, BASE_DEC, NULL, 0x0, "XA Resource Manager ID", HFILL }},
		{ &hf_mq_xa_count         , {"Number of Xid", "mq.xa.nbxid", FT_UINT32, BASE_DEC, NULL, 0x0, "XA Number of Xid", HFILL }},
		{ &hf_mq_xa_tmflags_join      , {"JOIN", "mq.xa.tmflags.join", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_XA_TMJOIN, "XA TM Flags JOIN", HFILL }},
		{ &hf_mq_xa_tmflags_endrscan  , {"ENDRSCAN", "mq.xa.tmflags.endrscan", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_XA_TMENDRSCAN, "XA TM Flags ENDRSCAN", HFILL }},
		{ &hf_mq_xa_tmflags_startrscan, {"STARTRSCAN", "mq.xa.tmflags.startrscan", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_XA_TMSTARTRSCAN, "XA TM Flags STARTRSCAN", HFILL }},
		{ &hf_mq_xa_tmflags_suspend   , {"SUSPEND", "mq.xa.tmflags.suspend", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_XA_TMSUSPEND, "XA TM Flags SUSPEND", HFILL }},
		{ &hf_mq_xa_tmflags_success   , {"SUCCESS", "mq.xa.tmflags.success", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_XA_TMSUCCESS, "XA TM Flags SUCCESS", HFILL }},
		{ &hf_mq_xa_tmflags_resume    , {"RESUME", "mq.xa.tmflags.resume", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_XA_TMRESUME, "XA TM Flags RESUME", HFILL }},
		{ &hf_mq_xa_tmflags_fail      , {"FAIL", "mq.xa.tmflags.fail", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_XA_TMFAIL, "XA TM Flags FAIL", HFILL }},
		{ &hf_mq_xa_tmflags_onephase  , {"ONEPHASE", "mq.xa.tmflags.onephase", FT_BOOLEAN, 32, TFS(&tfs_set_notset), MQ_XA_TMONEPHASE, "XA TM Flags ONEPHASE", HFILL }},

		{ &hf_mq_xa_xid_formatid  , {"Format ID....", "mq.xa.xid.formatid", FT_INT32, BASE_DEC, NULL, 0x0, "XA Xid Format ID", HFILL }},
		{ &hf_mq_xa_xid_glbxid_len, {"GlbTransIDLen", "mq.xa.xid.gxidl", FT_UINT8, BASE_DEC, NULL, 0x0, "XA Xid Global TransactionId Length", HFILL }},
		{ &hf_mq_xa_xid_brq_length, {"BranchQualLen", "mq.xa.xid.bql", FT_UINT8, BASE_DEC, NULL, 0x0, "XA Xid Branch Qualifier Length", HFILL }},
		{ &hf_mq_xa_xid_globalxid , {"GlbTransactID", "mq.xa.xid.gxid", FT_BYTES, BASE_NONE, NULL, 0x0, "XA Xid Global TransactionId", HFILL }},
		{ &hf_mq_xa_xid_brq       , {"BranchQualif.", "mq.xa.xid.bq", FT_BYTES, BASE_NONE, NULL, 0x0, "XA Xid Branch Qualifier", HFILL }},
		{ &hf_mq_xa_xainfo_length , {"Length.......", "mq.xa.xainfo.length", FT_UINT8, BASE_DEC, NULL, 0x0, "XA XA_info Length", HFILL }},
		{ &hf_mq_xa_xainfo_value  , {"Value........", "mq.xa.xainfo.value", FT_STRINGZ, BASE_NONE, NULL, 0x0, "XA XA_info Value", HFILL }},

		{ &hf_mq_charv_vsptr      , {"VLStr Addr.", "mq.charv.vsptr", FT_UINT32, BASE_HEX, NULL, 0x0, "VS Address", HFILL }},
		{ &hf_mq_charv_vsoffset   , {"VLStr Offs.", "mq.charv.vsoffset", FT_UINT32, BASE_DEC, NULL, 0x0, "VS Offset", HFILL }},
		{ &hf_mq_charv_vsbufsize  , {"VLStr BufSz", "mq.charv.vsbufsize", FT_UINT32, BASE_DEC, NULL, 0x0, "VS BufSize", HFILL }},
		{ &hf_mq_charv_vslength   , {"VLStr Len..", "mq.charv.vslength", FT_UINT32, BASE_DEC, NULL, 0x0, "VS Length", HFILL }},
		{ &hf_mq_charv_vsccsid    , {"VLStr Ccsid", "mq.charv.vsccsid", FT_INT32, BASE_DEC, NULL, 0x0, "VS CCSID", HFILL }},
		{ &hf_mq_charv_vsvalue    , {"VLStr Value", "mq.charv.vsvalue", FT_STRINGZ, BASE_NONE, NULL, 0x0, "VS value", HFILL }}

	};
	static gint *ett[] =
	{
		&ett_mq,
		&ett_mq_tsh,
		&ett_mq_tsh_tcf,
		&ett_mq_tsh_tcf2,
		&ett_mq_api,
		&ett_mq_socket,
		&ett_mq_msh,
		&ett_mq_caut,
		&ett_mq_xqh,
		&ett_mq_id,
		&ett_mq_id_icf1,
		&ett_mq_id_icf2,
		&ett_mq_id_icf3,
		&ett_mq_id_ief1,
		&ett_mq_id_ief2,
		&ett_mq_uid,
		&ett_mq_conn,
		&ett_mq_msg,
		&ett_mq_notif,
		&ett_mq_inq,
		&ett_mq_spi,
		&ett_mq_spi_base,
		&ett_mq_spi_options,
		&ett_mq_put,
		&ett_mq_open,
		&ett_mq_open_option,
		&ett_mq_close_option,
		&ett_mq_ping,
		&ett_mq_reset,
		&ett_mq_status,
		&ett_mq_od,
		&ett_mq_od_objstr,
		&ett_mq_od_selstr,
		&ett_mq_od_resobjstr,
		&ett_mq_or,
		&ett_mq_rr,
		&ett_mq_pmr,
		&ett_mq_md,
		&ett_mq_mde,
		&ett_mq_dlh,
		&ett_mq_dh,
		&ett_mq_gmo,
		&ett_mq_gmo_option,
		&ett_mq_gmo_matchoption,
		&ett_mq_pmo,
		&ett_mq_pmo_option,
		&ett_mq_fcno,
		&ett_mq_fopa,
		&ett_mq_lpoo,
		&ett_mq_lpoo_options,
		&ett_mq_lpoo_lpiopts,
		&ett_mq_head,
		&ett_mq_xa,
		&ett_mq_xa_tmflags,
		&ett_mq_xa_xid,
		&ett_mq_xa_info,
		&ett_mq_charv,
		&ett_mq_reaasemb
	};

	module_t *mq_module;

	proto_mq = proto_register_protocol("WebSphere MQ", "MQ", "mq");
	proto_register_field_array(proto_mq, hf, array_length(hf));
	proto_register_subtree_array(ett, array_length(ett));

	register_heur_dissector_list("mq", &mq_heur_subdissector_list);
	register_init_routine(mq_init);

	mq_module = prefs_register_protocol(proto_mq, NULL);
	prefs_register_bool_preference(mq_module, "desegment",
		"Reassemble MQ messages spanning multiple TCP segments",
		"Whether the MQ dissector should reassemble messages spanning multiple TCP segments."
		" To use this option, you must also enable \"Allow subdissectors to reassemble TCP streams\" in the TCP protocol settings.",
		&mq_desegment);
	prefs_register_bool_preference(mq_module, "reassembly",
		"Reassemble segmented MQ messages",
		"Whether the MQ dissector should reassemble MQ messages spanning multiple TSH segments",
		&mq_reassembly);
}

void proto_reg_handoff_mq(void)
{
	/*  Unlike some protocol (HTTP, POP3, ...) that clearly map to a standard
	 *  class of applications (web browser, e-mail client, ...) and have a very well
	 *  known port number, the MQ applications are most often specific to a business application */

	mq_tcp_handle = new_create_dissector_handle(dissect_mq_tcp, proto_mq);
	mq_spx_handle = create_dissector_handle(dissect_mq_spx, proto_mq);

	dissector_add_handle("tcp.port", mq_tcp_handle);
	heur_dissector_add("tcp",     dissect_mq_heur_tcp, proto_mq);
	heur_dissector_add("netbios", dissect_mq_heur_netbios, proto_mq);
	heur_dissector_add("http",    dissect_mq_heur_http, proto_mq);
	dissector_add_uint("spx.socket", MQ_SOCKET_SPX, mq_spx_handle);
	data_handle  = find_dissector("data");
	mqpcf_handle = find_dissector("mqpcf");
}

/*
 * Editor modelines  -  http://www.wireshark.org/tools/modelines.html
 *
 * Local variables:
 * c-basic-offset: 4
 * tab-width: 4
 * indent-tabs-mode: t
 * End:
 *
 * vi: set shiftwidth=4 tabstop=4 noexpandtab:
 * :indentSize=4:tabSize=4:noTabs=false:
 */
