diff --git a/src/main/csharp/Commands/ConsumerInfo.cs b/src/main/csharp/Commands/ConsumerInfo.cs
index 79ab9cd..94f9fcb 100644
--- a/src/main/csharp/Commands/ConsumerInfo.cs
+++ b/src/main/csharp/Commands/ConsumerInfo.cs
@@ -40,6 +40,7 @@
         int maximumPendingMessageLimit;
         bool dispatchAsync;
         string selector;
+        string clientId;
         string subscriptionName;
         bool noLocal;
         bool exclusive;
@@ -81,6 +82,7 @@
                 "MaximumPendingMessageLimit = " + MaximumPendingMessageLimit + ", " + 
                 "DispatchAsync = " + DispatchAsync + ", " + 
                 "Selector = " + Selector + ", " + 
+                "ClientId = " + ClientId + ", " + 
                 "SubscriptionName = " + SubscriptionName + ", " + 
                 "NoLocal = " + NoLocal + ", " + 
                 "Exclusive = " + Exclusive + ", " + 
@@ -136,6 +138,12 @@
             set { this.selector = value; }
         }
 
+        public string ClientId
+        {
+            get { return clientId; }
+            set { this.clientId = value; }
+        }
+
         public string SubscriptionName
         {
             get { return subscriptionName; }
diff --git a/src/main/csharp/Commands/Message.cs b/src/main/csharp/Commands/Message.cs
index 1668bf0..4531622 100644
--- a/src/main/csharp/Commands/Message.cs
+++ b/src/main/csharp/Commands/Message.cs
@@ -65,6 +65,7 @@
         BrokerId[] cluster;
         long brokerInTime;
         long brokerOutTime;
+        bool jMSXGroupFirstForConsumer;
 
         private bool readOnlyMsgProperties;
         private bool readOnlyMsgBody;
@@ -142,7 +143,8 @@
                 "Droppable = " + Droppable + ", " + 
                 "Cluster = " + Cluster + ", " + 
                 "BrokerInTime = " + BrokerInTime + ", " + 
-                "BrokerOutTime = " + BrokerOutTime + " ]";
+                "BrokerOutTime = " + BrokerOutTime + ", " + 
+                "JMSXGroupFirstForConsumer = " + JMSXGroupFirstForConsumer + " ]";
         }
 
         public virtual int Size()
@@ -351,6 +353,12 @@
             set { this.brokerOutTime = value; }
         }
 
+        public bool JMSXGroupFirstForConsumer
+        {
+            get { return jMSXGroupFirstForConsumer; }
+            set { this.jMSXGroupFirstForConsumer = value; }
+        }
+
         public virtual bool ReadOnlyProperties
         {
             get { return this.readOnlyMsgProperties; }
diff --git a/src/main/csharp/Commands/MessageId.cs b/src/main/csharp/Commands/MessageId.cs
index 3938c10..ff0ed59 100644
--- a/src/main/csharp/Commands/MessageId.cs
+++ b/src/main/csharp/Commands/MessageId.cs
@@ -32,6 +32,7 @@
     {
         public const byte ID_MESSAGEID = 110;
 
+        string textView;
         ProducerId producerId;
         long producerSequenceId;
         long brokerSequenceId;
@@ -74,7 +75,21 @@
         {
             if(key == null) 
             {
-                key = producerId.ToString() + ":" + producerSequenceId + ":" + brokerSequenceId;
+                if (!String.IsNullOrEmpty(textView))
+                {
+                    if (textView.StartsWith("ID:"))
+                    {
+                        key = textView;
+                    }
+                    else
+                    {
+                        key = "ID:" + textView;
+                    }
+                }
+                else
+                {
+                    key = producerId.ToString() + ":" + producerSequenceId + ":" + brokerSequenceId;
+                }
             }
             
             return key;
@@ -97,6 +112,12 @@
             producerId = new ProducerId(messageKey);
         }
 
+        public string TextView
+        {
+            get { return textView; }
+            set { this.textView = value; }
+        }
+
         public ProducerId ProducerId
         {
             get { return producerId; }
@@ -119,6 +140,7 @@
         {
             int answer = 0;
 
+            answer = (answer * 37) + HashCode(TextView);
             answer = (answer * 37) + HashCode(ProducerId);
             answer = (answer * 37) + HashCode(ProducerSequenceId);
             answer = (answer * 37) + HashCode(BrokerSequenceId);
@@ -138,6 +160,10 @@
 
         public virtual bool Equals(MessageId that)
         {
+            if(!Equals(this.TextView, that.TextView))
+            {
+                return false;
+            }
             if(!Equals(this.ProducerId, that.ProducerId))
             {
                 return false;
diff --git a/src/main/csharp/Commands/NetworkBridgeFilter.cs b/src/main/csharp/Commands/NetworkBridgeFilter.cs
index d40f90e..766f633 100644
--- a/src/main/csharp/Commands/NetworkBridgeFilter.cs
+++ b/src/main/csharp/Commands/NetworkBridgeFilter.cs
@@ -31,8 +31,9 @@
     {
         public const byte ID_NETWORKBRIDGEFILTER = 91;
 
-        int networkTTL;
         BrokerId networkBrokerId;
+        int messageTTL;
+        int consumerTTL;
 
         ///
         /// <summery>
@@ -54,14 +55,9 @@
         public override string ToString()
         {
             return GetType().Name + "[ " + 
-                "NetworkTTL = " + NetworkTTL + ", " + 
-                "NetworkBrokerId = " + NetworkBrokerId + " ]";
-        }
-
-        public int NetworkTTL
-        {
-            get { return networkTTL; }
-            set { this.networkTTL = value; }
+                "NetworkBrokerId = " + NetworkBrokerId + ", " + 
+                "MessageTTL = " + MessageTTL + ", " + 
+                "ConsumerTTL = " + ConsumerTTL + " ]";
         }
 
         public BrokerId NetworkBrokerId
@@ -70,6 +66,18 @@
             set { this.networkBrokerId = value; }
         }
 
+        public int MessageTTL
+        {
+            get { return messageTTL; }
+            set { this.messageTTL = value; }
+        }
+
+        public int ConsumerTTL
+        {
+            get { return consumerTTL; }
+            set { this.consumerTTL = value; }
+        }
+
     };
 }
 
diff --git a/src/main/csharp/Commands/TransactionInfo.cs b/src/main/csharp/Commands/TransactionInfo.cs
index b7dbe18..4e71710 100644
--- a/src/main/csharp/Commands/TransactionInfo.cs
+++ b/src/main/csharp/Commands/TransactionInfo.cs
@@ -105,7 +105,7 @@
         /// <summery>
         ///  Allows a Visitor to visit this command and return a response to the
         ///  command based on the command type being visited.  The command will call
-        ///  the proper ProcessXXX method in the visitor.
+        ///  the proper processXXX method in the visitor.
         /// </summery>
         ///
         public override Response Visit(ICommandVisitor visitor)
diff --git a/src/main/csharp/Commands/XATransactionId.cs b/src/main/csharp/Commands/XATransactionId.cs
index 171f8bb..df7536b 100644
--- a/src/main/csharp/Commands/XATransactionId.cs
+++ b/src/main/csharp/Commands/XATransactionId.cs
@@ -15,6 +15,7 @@
  * limitations under the License.
  */
 
+using System;
 
 namespace Apache.NMS.ActiveMQ.Commands
 {
@@ -54,10 +55,10 @@
         ///
         public override string ToString()
         {
-            return GetType().Name + "[ " + 
-                "FormatId = " + FormatId + ", " + 
-                "GlobalTransactionId = " + GlobalTransactionId ?? System.Text.ASCIIEncoding.ASCII.GetString(GlobalTransactionId) + ", " + 
-                "BranchQualifier = " + BranchQualifier ?? System.Text.ASCIIEncoding.ASCII.GetString(BranchQualifier) + " ]";
+            return GetType().Name + "[ " +
+                "FormatId = " + FormatId + ", " +
+                "GlobalTransactionId = " + BitConverter.ToString(GlobalTransactionId).Replace("-", string.Empty) + ", " +
+                "BranchQualifier = " + System.Text.ASCIIEncoding.ASCII.GetString(BranchQualifier) + " ]";
         }
 
         public int FormatId
diff --git a/src/main/csharp/MessageConsumer.cs b/src/main/csharp/MessageConsumer.cs
index 3e4648f..3f9fd4d 100755
--- a/src/main/csharp/MessageConsumer.cs
+++ b/src/main/csharp/MessageConsumer.cs
@@ -139,6 +139,7 @@
 			this.info.Retroactive = session.Retroactive;
 			this.info.Exclusive = session.Exclusive;
 			this.info.Priority = session.Priority;
+			this.info.ClientId = session.Connection.ClientId;
 
 			// If the destination contained a URI query, then use it to set public properties
 			// on the ConsumerInfo
diff --git a/src/main/csharp/NetTxTransactionContext.cs b/src/main/csharp/NetTxTransactionContext.cs
index 0481173..e5869a2 100644
--- a/src/main/csharp/NetTxTransactionContext.cs
+++ b/src/main/csharp/NetTxTransactionContext.cs
@@ -1,611 +1,611 @@
-﻿/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Threading;
-using System.Transactions;
-using Apache.NMS.ActiveMQ.Commands;
-using Apache.NMS.ActiveMQ.Transactions;
-using Apache.NMS.Util;
-
-namespace Apache.NMS.ActiveMQ
-{
-    public sealed class NetTxTransactionContext : TransactionContext, ISinglePhaseNotification
-    {
-        private const int XA_OK = 0;
-        private const int XA_READONLY = 3;
-
-        private Enlistment currentEnlistment;
-
-        public NetTxTransactionContext(Session session) : base(session)
-        {
-        }
-
-        public override bool InLocalTransaction
-        {
-            get { return this.transactionId != null && this.currentEnlistment == null; }
-        }
-
-        public override void Begin()
-        {
-            throw new IllegalStateException("Local Transactions not supported in NetTx resources");
-        }
-
-        public override void Commit()
-        {
-            throw new IllegalStateException("Local Transactions not supported in NetTx resources");
-        }
-
-        public override void Rollback()
-        {
-            throw new IllegalStateException("Local Transactions not supported in NetTx resources");
-        }
-
-        #region Transaction Members used when dealing with .NET System Transactions.
-
-        // When DTC calls prepare we must then wait for either the TX to commit, rollback or
-        // be canceled because its in doubt.
-        private readonly ManualResetEvent dtcControlEvent = new ManualResetEvent(true);
-
-        // Once the DTC calls prepare we lock this object and don't unlock it again until
-        // the TX has either completed or terminated, the users of this class should use
-        // this sync point when the TX is a DTC version as opposed to a local one.
-        private readonly object syncObject = new Mutex();
-
-        public enum TxState
-        {
-            None = 0, Active = 1, Pending = 2
-        }
-
-        private TxState netTxState = TxState.None;
-
-        public object SyncRoot
-        {
-            get { return this.syncObject; }
-        }
-
-        public bool InNetTransaction
-        {
-            get { return this.transactionId != null && this.transactionId is XATransactionId; }
-        }
-
-        public TxState NetTxState
-        {
-            get
-            {
-                return this.netTxState;
-            }
-        }
-
-        public WaitHandle DtcWaitHandle
-        {
-            get { return dtcControlEvent; }
-        }
-
-        public void Begin(Transaction transaction)
-        {
-            lock (syncObject)
-            {
-                dtcControlEvent.Reset();
-
-                Tracer.Debug("Begin notification received");
-
-                if (InNetTransaction)
-                {
-                    throw new TransactionInProgressException("A Transaction is already in Progress");
-                }
-
-                try
-                {
-                    Guid rmId = ResourceManagerGuid;
-
-                    // Enlist this object in the transaction.
-                    this.currentEnlistment =
-                        transaction.EnlistDurable(rmId, this, EnlistmentOptions.None);
-
-                    // In case of a exception in the current method the transaction will be rolled back.
-                    // Until Begin Transaction is completed we consider to be in a rollback scenario.
-                    this.netTxState = TxState.Pending;
-
-                    Tracer.Debug("Enlisted in Durable Transaction with RM Id: " + rmId);
-
-                    TransactionInformation txInfo = transaction.TransactionInformation;
-
-                    XATransactionId xaId = new XATransactionId();
-                    this.transactionId = xaId;
-
-                    if (txInfo.DistributedIdentifier != Guid.Empty)
-                    {
-                        xaId.GlobalTransactionId = txInfo.DistributedIdentifier.ToByteArray();
-                        xaId.BranchQualifier = Encoding.UTF8.GetBytes(Guid.NewGuid().ToString());
-                    }
-                    else
-                    {
-                        xaId.GlobalTransactionId = Encoding.UTF8.GetBytes(txInfo.LocalIdentifier);
-                        xaId.BranchQualifier = Encoding.UTF8.GetBytes(Guid.NewGuid().ToString());
-                    }
-
-                    // Now notify the broker that a new XA'ish transaction has started.
-                    TransactionInfo info = new TransactionInfo();
-                    info.ConnectionId = this.connection.ConnectionId;
-                    info.TransactionId = this.transactionId;
-                    info.Type = (int)TransactionType.Begin;
-
-                    this.session.Connection.Oneway(info);
-
-                    // Begin Transaction is completed successfully. Change to transaction active state now.
-                    this.netTxState = TxState.Active;
-
-                    SignalTransactionStarted();
-
-                    if (Tracer.IsDebugEnabled)
-                    {
-                        Tracer.Debug("Began XA'ish Transaction:" + xaId.GlobalTransactionId);
-                    }
-                }
-                catch (Exception)
-                {
-                    // When in pending state the rollback will signal that a new transaction can be started. Otherwise do it here.
-                    if (netTxState != TxState.Pending)
-                    {
-                        netTxState = TxState.None;
-                        dtcControlEvent.Set();
-                    }
-                    throw;
-                }
-            }
-        }
-
-        public void Prepare(PreparingEnlistment preparingEnlistment)
-        {
-            lock (this.syncObject)
-            {
-                this.netTxState = TxState.Pending;
-
-                try
-                {
-                    Tracer.Debug("Prepare notification received for TX id: " + this.transactionId);
-
-                    BeforeEnd();
-
-                    // Before sending the request to the broker, log the recovery bits, if
-                    // this fails we can't prepare and the TX should be rolled back.
-                    RecoveryLogger.LogRecoveryInfo(this.transactionId as XATransactionId,
-                                                   preparingEnlistment.RecoveryInformation());
-
-                    // Inform the broker that work on the XA'sh TX Branch is complete.
-                    TransactionInfo info = new TransactionInfo();
-                    info.ConnectionId = this.connection.ConnectionId;
-                    info.TransactionId = this.transactionId;
-                    info.Type = (int)TransactionType.End;
-
-                    this.connection.CheckConnected();
-                    this.connection.SyncRequest(info);
-
-                    // Prepare the Transaction for commit.
-                    info.Type = (int)TransactionType.Prepare;
-                    IntegerResponse response = (IntegerResponse)this.connection.SyncRequest(info);
-                    if (response.Result == XA_READONLY)
-                    {
-                        Tracer.Debug("Transaction Prepare done and doesn't need a commit, TX id: " + this.transactionId);
-
-                        this.transactionId = null;
-                        this.currentEnlistment = null;
-
-                        // Read Only means there's nothing to recover because there was no
-                        // change on the broker.
-                        RecoveryLogger.LogRecovered(this.transactionId as XATransactionId);
-
-                        // if server responds that nothing needs to be done, then reply done.
-                        // otherwise the DTC will call Commit or Rollback but another transaction
-                        // can already be in progress and this one would be commited or rolled back 
-                        // immediately.
-                        preparingEnlistment.Done();
-
-                        // Done so commit won't be called.
-                        AfterCommit();
-
-                        // A Read-Only TX is considered closed at this point, DTC won't call us again.
-                        this.dtcControlEvent.Set();
-                    }
-                    else
-                    {
-                        Tracer.Debug("Transaction Prepare succeeded TX id: " + this.transactionId);
-
-                        // If work finished correctly, reply prepared
-                        preparingEnlistment.Prepared();
-                    }
-                }
-                catch (Exception ex)
-                {
-                    Tracer.DebugFormat("Transaction[{0}] Prepare failed with error: {1}",
-                                       this.transactionId, ex.Message);
-
-                    AfterRollback();
-                    preparingEnlistment.ForceRollback();
-                    try
-                    {
-                        this.connection.OnException(ex);
-                    }
-                    catch (Exception error)
-                    {
-                        Tracer.Error(error.ToString());
-                    }
-
-                    this.currentEnlistment = null;
-                    this.transactionId = null;
-                    this.netTxState = TxState.None;
-                    this.dtcControlEvent.Set();
-                }
-            }
-        }
-
-        public void Commit(Enlistment enlistment)
-        {
-            lock (this.syncObject)
-            {
-                try
-                {
-                    Tracer.Debug("Commit notification received for TX id: " + this.transactionId);
-
-                    if (this.transactionId != null)
-                    {
-                        // Now notify the broker that a new XA'ish transaction has completed.
-                        TransactionInfo info = new TransactionInfo();
-                        info.ConnectionId = this.connection.ConnectionId;
-                        info.TransactionId = this.transactionId;
-                        info.Type = (int)TransactionType.CommitTwoPhase;
-
-                        this.connection.CheckConnected();
-                        this.connection.SyncRequest(info);
-
-                        Tracer.Debug("Transaction Commit Done TX id: " + this.transactionId);
-
-                        RecoveryLogger.LogRecovered(this.transactionId as XATransactionId);
-
-                        // if server responds that nothing needs to be done, then reply done.
-                        enlistment.Done();
-
-                        AfterCommit();
-                    }
-                }
-                catch (Exception ex)
-                {
-                    Tracer.DebugFormat("Transaction[{0}] Commit failed with error: {1}",
-                                       this.transactionId, ex.Message);
-                    try
-                    {
-                        this.connection.OnException(ex);
-                    }
-                    catch (Exception error)
-                    {
-                        Tracer.Error(error.ToString());
-                    }
-                }
-                finally
-                {
-                    this.currentEnlistment = null;
-                    this.transactionId = null;
-                    this.netTxState = TxState.None;
-
-                    CountDownLatch latch = this.recoveryComplete;
-                    if (latch != null)
-                    {
-                        latch.countDown();
-                    }
-
-                    this.dtcControlEvent.Set();
-                }
-            }
-        }
-
-        public void SinglePhaseCommit(SinglePhaseEnlistment enlistment)
-        {
-            lock (this.syncObject)
-            {
-                try
-                {
-                    Tracer.Debug("Single Phase Commit notification received for TX id: " + this.transactionId);
-
-                    if (this.transactionId != null)
-                    {
-                        BeforeEnd();
-
-                        // Now notify the broker that a new XA'ish transaction has completed.
-                        TransactionInfo info = new TransactionInfo();
-                        info.ConnectionId = this.connection.ConnectionId;
-                        info.TransactionId = this.transactionId;
-                        info.Type = (int)TransactionType.CommitOnePhase;
-
-                        this.connection.CheckConnected();
-                        this.connection.SyncRequest(info);
-
-                        Tracer.Debug("Transaction Single Phase Commit Done TX id: " + this.transactionId);
-
-                        // if server responds that nothing needs to be done, then reply done.
-                        enlistment.Done();
-
-                        AfterCommit();
-                    }
-                }
-                catch (Exception ex)
-                {
-                    Tracer.DebugFormat("Transaction[{0}] Single Phase Commit failed with error: {1}",
-                                       this.transactionId, ex.Message);
-                    AfterRollback();
-                    enlistment.Done();
-                    try
-                    {
-                        this.connection.OnException(ex);
-                    }
-                    catch (Exception error)
-                    {
-                        Tracer.Error(error.ToString());
-                    }
-                }
-                finally
-                {
-                    this.currentEnlistment = null;
-                    this.transactionId = null;
-                    this.netTxState = TxState.None;
-
-                    this.dtcControlEvent.Set();
-                }
-            }
-        }
-
-        public void Rollback(Enlistment enlistment)
-        {
-            lock (this.syncObject)
-            {
-                try
-                {
-                    Tracer.Debug("Rollback notification received for TX id: " + this.transactionId);
-
-                    if (this.transactionId != null)
-                    {
-                        BeforeEnd();
-
-                        // Now notify the broker that a new XA'ish transaction has started.
-                        TransactionInfo info = new TransactionInfo();
-                        info.ConnectionId = this.connection.ConnectionId;
-                        info.TransactionId = this.transactionId;
-                        info.Type = (int)TransactionType.End;
-
-                        this.connection.CheckConnected();
-                        this.connection.SyncRequest(info);
-
-                        info.Type = (int)TransactionType.Rollback;
-                        this.connection.CheckConnected();
-                        this.connection.SyncRequest(info);
-
-                        Tracer.Debug("Transaction Rollback Done TX id: " + this.transactionId);
-
-                        RecoveryLogger.LogRecovered(this.transactionId as XATransactionId);
-
-                        // if server responds that nothing needs to be done, then reply done.
-                        enlistment.Done();
-
-                        AfterRollback();
-                    }
-                }
-                catch (Exception ex)
-                {
-                    Tracer.DebugFormat("Transaction[{0}] Rollback failed with error: {1}",
-                                       this.transactionId, ex.Message);
-                    AfterRollback();
-                    try
-                    {
-                        this.connection.OnException(ex);
-                    }
-                    catch (Exception error)
-                    {
-                        Tracer.Error(error.ToString());
-                    }
-                }
-                finally
-                {
-                    this.currentEnlistment = null;
-                    this.transactionId = null;
-                    this.netTxState = TxState.None;
-
-                    CountDownLatch latch = this.recoveryComplete;
-                    if (latch != null)
-                    {
-                        latch.countDown();
-                    }
-
-                    this.dtcControlEvent.Set();
-                }
-            }
-        }
-
-        public void InDoubt(Enlistment enlistment)
-        {
-            lock (syncObject)
-            {
-                try
-                {
-                    Tracer.Debug("In Doubt notification received for TX id: " + this.transactionId);
-
-                    BeforeEnd();
-
-                    // Now notify the broker that Rollback should be performed.
-                    TransactionInfo info = new TransactionInfo();
-                    info.ConnectionId = this.connection.ConnectionId;
-                    info.TransactionId = this.transactionId;
-                    info.Type = (int)TransactionType.End;
-
-                    this.connection.CheckConnected();
-                    this.connection.SyncRequest(info);
-
-                    info.Type = (int)TransactionType.Rollback;
-                    this.connection.CheckConnected();
-                    this.connection.SyncRequest(info);
-
-                    Tracer.Debug("InDoubt Transaction Rollback Done TX id: " + this.transactionId);
-
-                    RecoveryLogger.LogRecovered(this.transactionId as XATransactionId);
-
-                    // if server responds that nothing needs to be done, then reply done.
-                    enlistment.Done();
-
-                    AfterRollback();
-                }
-                finally
-                {
-                    this.currentEnlistment = null;
-                    this.transactionId = null;
-                    this.netTxState = TxState.None;
-
-                    CountDownLatch latch = this.recoveryComplete;
-                    if (latch != null)
-                    {
-                        latch.countDown();
-                    }
-
-                    this.dtcControlEvent.Set();
-                }
-            }
-        }
-
-        #endregion
-
-        #region Distributed Transaction Recovery Bits
-
-        private volatile CountDownLatch recoveryComplete;
-
-        /// <summary>
-        /// Should be called from NetTxSession when created to check if any TX
-        /// data is stored for recovery and whether the Broker has matching info
-        /// stored.  If an Transaction is found that belongs to this client and is
-        /// still alive on the Broker it will be recovered, otherwise the stored 
-        /// data should be cleared.
-        /// </summary>
-        public void InitializeDtcTxContext()
-        {
-            // initialize the logger with the current Resource Manager Id
-            RecoveryLogger.Initialize(ResourceManagerId);
-
-            KeyValuePair<XATransactionId, byte[]>[] localRecoverables = RecoveryLogger.GetRecoverables();
-            if (localRecoverables.Length == 0)
-            {
-                Tracer.Debug("Did not detect any open DTC transaction records on disk.");
-                // No local data so anything stored on the broker can't be recovered here.
-                return;
-            }
-
-            XATransactionId[] recoverables = TryRecoverBrokerTXIds();
-            if (recoverables.Length == 0)
-            {
-                Tracer.Debug("Did not detect any recoverable transactions at Broker.");
-                // Broker has no recoverable data so nothing to do here, delete the 
-                // old recovery log as its stale.
-                RecoveryLogger.Purge();
-                return;
-            }
-
-            List<KeyValuePair<XATransactionId, byte[]>> matches = new List<KeyValuePair<XATransactionId, byte[]>>();
-
-            foreach (XATransactionId recoverable in recoverables)
-            {
-                foreach (KeyValuePair<XATransactionId, byte[]> entry in localRecoverables)
-                {
-                    if (entry.Key.Equals(recoverable))
-                    {
-                        Tracer.DebugFormat("Found a matching TX on Broker to stored Id: {0} reenlisting.", entry.Key);
-                        matches.Add(entry);
-                    }
-                }
-            }
-
-            if (matches.Count != 0)
-            {
-                this.recoveryComplete = new CountDownLatch(matches.Count);
-
-                foreach (KeyValuePair<XATransactionId, byte[]> recoverable in matches)
-                {
-                    this.transactionId = recoverable.Key;
-                    Tracer.Info("Reenlisting recovered TX with Id: " + this.transactionId);
-                    this.currentEnlistment =
-                        TransactionManager.Reenlist(ResourceManagerGuid, recoverable.Value, this);
-                }
-
-                this.recoveryComplete.await();
-                Tracer.Debug("All Recovered TX enlistments Reports complete, Recovery Complete.");
-                TransactionManager.RecoveryComplete(ResourceManagerGuid);
-                return;
-            }
-
-            // The old recovery information doesn't match what's on the broker so we
-            // should discard it as its stale now.
-            RecoveryLogger.Purge();
-        }
-
-        private XATransactionId[] TryRecoverBrokerTXIds()
-        {
-            Tracer.Debug("Checking for Recoverable Transactions on Broker.");
-
-            TransactionInfo info = new TransactionInfo();
-            info.ConnectionId = this.session.Connection.ConnectionId;
-            info.Type = (int)TransactionType.Recover;
-
-            this.connection.CheckConnected();
-            DataArrayResponse response = this.connection.SyncRequest(info) as DataArrayResponse;
-
-            if (response != null && response.Data.Length > 0)
-            {
-                Tracer.DebugFormat("Broker reports there are {0} recoverable XA Transactions", response.Data.Length);
-
-                List<XATransactionId> recovered = new List<XATransactionId>();
-
-                foreach (DataStructure ds in response.Data)
-                {
-                    XATransactionId xid = ds as XATransactionId;
-                    if (xid != null)
-                    {
-                        recovered.Add(xid);
-                    }
-                }
-
-                return recovered.ToArray();
-            }
-
-            return new XATransactionId[0];
-        }
-
-        #endregion
-
-        internal IRecoveryLogger RecoveryLogger
-        {
-            get { return (this.connection as NetTxConnection).RecoveryPolicy.RecoveryLogger; }
-        }
-
-        internal string ResourceManagerId
-        {
-            get { return (this.connection as NetTxConnection).ResourceManagerGuid.ToString(); }
-        }
-
-        internal Guid ResourceManagerGuid
-        {
-            get { return (this.connection as NetTxConnection).ResourceManagerGuid; }
-        }
-
-    }
-}
+﻿/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading;
+using System.Transactions;
+using Apache.NMS.ActiveMQ.Commands;
+using Apache.NMS.ActiveMQ.Transactions;
+using Apache.NMS.Util;
+
+namespace Apache.NMS.ActiveMQ
+{
+    public sealed class NetTxTransactionContext : TransactionContext, ISinglePhaseNotification
+    {
+        private const int XA_OK = 0;
+        private const int XA_READONLY = 3;
+
+        private Enlistment currentEnlistment;
+
+        public NetTxTransactionContext(Session session) : base(session)
+        {
+        }
+
+        public override bool InLocalTransaction
+        {
+            get { return this.transactionId != null && this.currentEnlistment == null; }
+        }
+
+        public override void Begin()
+        {
+            throw new IllegalStateException("Local Transactions not supported in NetTx resources");
+        }
+
+        public override void Commit()
+        {
+            throw new IllegalStateException("Local Transactions not supported in NetTx resources");
+        }
+
+        public override void Rollback()
+        {
+            throw new IllegalStateException("Local Transactions not supported in NetTx resources");
+        }
+
+        #region Transaction Members used when dealing with .NET System Transactions.
+
+        // When DTC calls prepare we must then wait for either the TX to commit, rollback or
+        // be canceled because its in doubt.
+        private readonly ManualResetEvent dtcControlEvent = new ManualResetEvent(true);
+
+        // Once the DTC calls prepare we lock this object and don't unlock it again until
+        // the TX has either completed or terminated, the users of this class should use
+        // this sync point when the TX is a DTC version as opposed to a local one.
+        private readonly object syncObject = new Mutex();
+
+        public enum TxState
+        {
+            None = 0, Active = 1, Pending = 2
+        }
+
+        private TxState netTxState = TxState.None;
+
+        public object SyncRoot
+        {
+            get { return this.syncObject; }
+        }
+
+        public bool InNetTransaction
+        {
+            get { return this.transactionId != null && this.transactionId is XATransactionId; }
+        }
+
+        public TxState NetTxState
+        {
+            get
+            {
+                return this.netTxState;
+            }
+        }
+
+        public WaitHandle DtcWaitHandle
+        {
+            get { return dtcControlEvent; }
+        }
+
+        public void Begin(Transaction transaction)
+        {
+            lock (syncObject)
+            {
+                dtcControlEvent.Reset();
+
+                Tracer.Debug("Begin notification received");
+
+                if (InNetTransaction)
+                {
+                    throw new TransactionInProgressException("A Transaction is already in Progress");
+                }
+
+                try
+                {
+                    Guid rmId = ResourceManagerGuid;
+
+                    // Enlist this object in the transaction.
+                    this.currentEnlistment =
+                        transaction.EnlistDurable(rmId, this, EnlistmentOptions.None);
+
+                    // In case of a exception in the current method the transaction will be rolled back.
+                    // Until Begin Transaction is completed we consider to be in a rollback scenario.
+                    this.netTxState = TxState.Pending;
+
+                    Tracer.Debug("Enlisted in Durable Transaction with RM Id: " + rmId);
+
+                    TransactionInformation txInfo = transaction.TransactionInformation;
+
+                    XATransactionId xaId = new XATransactionId();
+                    this.transactionId = xaId;
+
+                    if (txInfo.DistributedIdentifier != Guid.Empty)
+                    {
+                        xaId.GlobalTransactionId = txInfo.DistributedIdentifier.ToByteArray();
+                        xaId.BranchQualifier = Encoding.UTF8.GetBytes(Guid.NewGuid().ToString());
+                    }
+                    else
+                    {
+                        xaId.GlobalTransactionId = Encoding.UTF8.GetBytes(txInfo.LocalIdentifier);
+                        xaId.BranchQualifier = Encoding.UTF8.GetBytes(Guid.NewGuid().ToString());
+                    }
+
+                    // Now notify the broker that a new XA'ish transaction has started.
+                    TransactionInfo info = new TransactionInfo();
+                    info.ConnectionId = this.connection.ConnectionId;
+                    info.TransactionId = this.transactionId;
+                    info.Type = (int)TransactionType.Begin;
+
+                    this.session.Connection.Oneway(info);
+
+                    // Begin Transaction is completed successfully. Change to transaction active state now.
+                    this.netTxState = TxState.Active;
+
+                    SignalTransactionStarted();
+
+                    if (Tracer.IsDebugEnabled)
+                    {
+                        Tracer.Debug("Began XA'ish Transaction:" + xaId);
+                    }
+                }
+                catch (Exception)
+                {
+                    // When in pending state the rollback will signal that a new transaction can be started. Otherwise do it here.
+                    if (netTxState != TxState.Pending)
+                    {
+                        netTxState = TxState.None;
+                        dtcControlEvent.Set();
+                    }
+                    throw;
+                }
+            }
+        }
+
+        public void Prepare(PreparingEnlistment preparingEnlistment)
+        {
+            lock (this.syncObject)
+            {
+                this.netTxState = TxState.Pending;
+
+                try
+                {
+                    Tracer.Debug("Prepare notification received for TX id: " + this.transactionId);
+
+                    BeforeEnd();
+
+                    // Before sending the request to the broker, log the recovery bits, if
+                    // this fails we can't prepare and the TX should be rolled back.
+                    RecoveryLogger.LogRecoveryInfo(this.transactionId as XATransactionId,
+                                                   preparingEnlistment.RecoveryInformation());
+
+                    // Inform the broker that work on the XA'sh TX Branch is complete.
+                    TransactionInfo info = new TransactionInfo();
+                    info.ConnectionId = this.connection.ConnectionId;
+                    info.TransactionId = this.transactionId;
+                    info.Type = (int)TransactionType.End;
+
+                    this.connection.CheckConnected();
+                    this.connection.SyncRequest(info);
+
+                    // Prepare the Transaction for commit.
+                    info.Type = (int)TransactionType.Prepare;
+                    IntegerResponse response = (IntegerResponse)this.connection.SyncRequest(info);
+                    if (response.Result == XA_READONLY)
+                    {
+                        Tracer.Debug("Transaction Prepare done and doesn't need a commit, TX id: " + this.transactionId);
+
+                        this.transactionId = null;
+                        this.currentEnlistment = null;
+
+                        // Read Only means there's nothing to recover because there was no
+                        // change on the broker.
+                        RecoveryLogger.LogRecovered(this.transactionId as XATransactionId);
+
+                        // if server responds that nothing needs to be done, then reply done.
+                        // otherwise the DTC will call Commit or Rollback but another transaction
+                        // can already be in progress and this one would be commited or rolled back 
+                        // immediately.
+                        preparingEnlistment.Done();
+
+                        // Done so commit won't be called.
+                        AfterCommit();
+
+                        // A Read-Only TX is considered closed at this point, DTC won't call us again.
+                        this.dtcControlEvent.Set();
+                    }
+                    else
+                    {
+                        Tracer.Debug("Transaction Prepare succeeded TX id: " + this.transactionId);
+
+                        // If work finished correctly, reply prepared
+                        preparingEnlistment.Prepared();
+                    }
+                }
+                catch (Exception ex)
+                {
+                    Tracer.DebugFormat("Transaction[{0}] Prepare failed with error: {1}",
+                                       this.transactionId, ex.Message);
+
+                    AfterRollback();
+                    preparingEnlistment.ForceRollback();
+                    try
+                    {
+                        this.connection.OnException(ex);
+                    }
+                    catch (Exception error)
+                    {
+                        Tracer.Error(error.ToString());
+                    }
+
+                    this.currentEnlistment = null;
+                    this.transactionId = null;
+                    this.netTxState = TxState.None;
+                    this.dtcControlEvent.Set();
+                }
+            }
+        }
+
+        public void Commit(Enlistment enlistment)
+        {
+            lock (this.syncObject)
+            {
+                try
+                {
+                    Tracer.Debug("Commit notification received for TX id: " + this.transactionId);
+
+                    if (this.transactionId != null)
+                    {
+                        // Now notify the broker that a new XA'ish transaction has completed.
+                        TransactionInfo info = new TransactionInfo();
+                        info.ConnectionId = this.connection.ConnectionId;
+                        info.TransactionId = this.transactionId;
+                        info.Type = (int)TransactionType.CommitTwoPhase;
+
+                        this.connection.CheckConnected();
+                        this.connection.SyncRequest(info);
+
+                        Tracer.Debug("Transaction Commit Done TX id: " + this.transactionId);
+
+                        RecoveryLogger.LogRecovered(this.transactionId as XATransactionId);
+
+                        // if server responds that nothing needs to be done, then reply done.
+                        enlistment.Done();
+
+                        AfterCommit();
+                    }
+                }
+                catch (Exception ex)
+                {
+                    Tracer.DebugFormat("Transaction[{0}] Commit failed with error: {1}",
+                                       this.transactionId, ex.Message);
+                    try
+                    {
+                        this.connection.OnException(ex);
+                    }
+                    catch (Exception error)
+                    {
+                        Tracer.Error(error.ToString());
+                    }
+                }
+                finally
+                {
+                    this.currentEnlistment = null;
+                    this.transactionId = null;
+                    this.netTxState = TxState.None;
+
+                    CountDownLatch latch = this.recoveryComplete;
+                    if (latch != null)
+                    {
+                        latch.countDown();
+                    }
+
+                    this.dtcControlEvent.Set();
+                }
+            }
+        }
+
+        public void SinglePhaseCommit(SinglePhaseEnlistment enlistment)
+        {
+            lock (this.syncObject)
+            {
+                try
+                {
+                    Tracer.Debug("Single Phase Commit notification received for TX id: " + this.transactionId);
+
+                    if (this.transactionId != null)
+                    {
+                        BeforeEnd();
+
+                        // Now notify the broker that a new XA'ish transaction has completed.
+                        TransactionInfo info = new TransactionInfo();
+                        info.ConnectionId = this.connection.ConnectionId;
+                        info.TransactionId = this.transactionId;
+                        info.Type = (int)TransactionType.CommitOnePhase;
+
+                        this.connection.CheckConnected();
+                        this.connection.SyncRequest(info);
+
+                        Tracer.Debug("Transaction Single Phase Commit Done TX id: " + this.transactionId);
+
+                        // if server responds that nothing needs to be done, then reply done.
+                        enlistment.Done();
+
+                        AfterCommit();
+                    }
+                }
+                catch (Exception ex)
+                {
+                    Tracer.DebugFormat("Transaction[{0}] Single Phase Commit failed with error: {1}",
+                                       this.transactionId, ex.Message);
+                    AfterRollback();
+                    enlistment.Done();
+                    try
+                    {
+                        this.connection.OnException(ex);
+                    }
+                    catch (Exception error)
+                    {
+                        Tracer.Error(error.ToString());
+                    }
+                }
+                finally
+                {
+                    this.currentEnlistment = null;
+                    this.transactionId = null;
+                    this.netTxState = TxState.None;
+
+                    this.dtcControlEvent.Set();
+                }
+            }
+        }
+
+        public void Rollback(Enlistment enlistment)
+        {
+            lock (this.syncObject)
+            {
+                try
+                {
+                    Tracer.Debug("Rollback notification received for TX id: " + this.transactionId);
+
+                    if (this.transactionId != null)
+                    {
+                        BeforeEnd();
+
+                        // Now notify the broker that a new XA'ish transaction has started.
+                        TransactionInfo info = new TransactionInfo();
+                        info.ConnectionId = this.connection.ConnectionId;
+                        info.TransactionId = this.transactionId;
+                        info.Type = (int)TransactionType.End;
+
+                        this.connection.CheckConnected();
+                        this.connection.SyncRequest(info);
+
+                        info.Type = (int)TransactionType.Rollback;
+                        this.connection.CheckConnected();
+                        this.connection.SyncRequest(info);
+
+                        Tracer.Debug("Transaction Rollback Done TX id: " + this.transactionId);
+
+                        RecoveryLogger.LogRecovered(this.transactionId as XATransactionId);
+
+                        // if server responds that nothing needs to be done, then reply done.
+                        enlistment.Done();
+
+                        AfterRollback();
+                    }
+                }
+                catch (Exception ex)
+                {
+                    Tracer.DebugFormat("Transaction[{0}] Rollback failed with error: {1}",
+                                       this.transactionId, ex.Message);
+                    AfterRollback();
+                    try
+                    {
+                        this.connection.OnException(ex);
+                    }
+                    catch (Exception error)
+                    {
+                        Tracer.Error(error.ToString());
+                    }
+                }
+                finally
+                {
+                    this.currentEnlistment = null;
+                    this.transactionId = null;
+                    this.netTxState = TxState.None;
+
+                    CountDownLatch latch = this.recoveryComplete;
+                    if (latch != null)
+                    {
+                        latch.countDown();
+                    }
+
+                    this.dtcControlEvent.Set();
+                }
+            }
+        }
+
+        public void InDoubt(Enlistment enlistment)
+        {
+            lock (syncObject)
+            {
+                try
+                {
+                    Tracer.Debug("In Doubt notification received for TX id: " + this.transactionId);
+
+                    BeforeEnd();
+
+                    // Now notify the broker that Rollback should be performed.
+                    TransactionInfo info = new TransactionInfo();
+                    info.ConnectionId = this.connection.ConnectionId;
+                    info.TransactionId = this.transactionId;
+                    info.Type = (int)TransactionType.End;
+
+                    this.connection.CheckConnected();
+                    this.connection.SyncRequest(info);
+
+                    info.Type = (int)TransactionType.Rollback;
+                    this.connection.CheckConnected();
+                    this.connection.SyncRequest(info);
+
+                    Tracer.Debug("InDoubt Transaction Rollback Done TX id: " + this.transactionId);
+
+                    RecoveryLogger.LogRecovered(this.transactionId as XATransactionId);
+
+                    // if server responds that nothing needs to be done, then reply done.
+                    enlistment.Done();
+
+                    AfterRollback();
+                }
+                finally
+                {
+                    this.currentEnlistment = null;
+                    this.transactionId = null;
+                    this.netTxState = TxState.None;
+
+                    CountDownLatch latch = this.recoveryComplete;
+                    if (latch != null)
+                    {
+                        latch.countDown();
+                    }
+
+                    this.dtcControlEvent.Set();
+                }
+            }
+        }
+
+        #endregion
+
+        #region Distributed Transaction Recovery Bits
+
+        private volatile CountDownLatch recoveryComplete;
+
+        /// <summary>
+        /// Should be called from NetTxSession when created to check if any TX
+        /// data is stored for recovery and whether the Broker has matching info
+        /// stored.  If an Transaction is found that belongs to this client and is
+        /// still alive on the Broker it will be recovered, otherwise the stored 
+        /// data should be cleared.
+        /// </summary>
+        public void InitializeDtcTxContext()
+        {
+            // initialize the logger with the current Resource Manager Id
+            RecoveryLogger.Initialize(ResourceManagerId);
+
+            KeyValuePair<XATransactionId, byte[]>[] localRecoverables = RecoveryLogger.GetRecoverables();
+            if (localRecoverables.Length == 0)
+            {
+                Tracer.Debug("Did not detect any open DTC transaction records on disk.");
+                // No local data so anything stored on the broker can't be recovered here.
+                return;
+            }
+
+            XATransactionId[] recoverables = TryRecoverBrokerTXIds();
+            if (recoverables.Length == 0)
+            {
+                Tracer.Debug("Did not detect any recoverable transactions at Broker.");
+                // Broker has no recoverable data so nothing to do here, delete the 
+                // old recovery log as its stale.
+                RecoveryLogger.Purge();
+                return;
+            }
+
+            List<KeyValuePair<XATransactionId, byte[]>> matches = new List<KeyValuePair<XATransactionId, byte[]>>();
+
+            foreach (XATransactionId recoverable in recoverables)
+            {
+                foreach (KeyValuePair<XATransactionId, byte[]> entry in localRecoverables)
+                {
+                    if (entry.Key.Equals(recoverable))
+                    {
+                        Tracer.DebugFormat("Found a matching TX on Broker to stored Id: {0} reenlisting.", entry.Key);
+                        matches.Add(entry);
+                    }
+                }
+            }
+
+            if (matches.Count != 0)
+            {
+                this.recoveryComplete = new CountDownLatch(matches.Count);
+
+                foreach (KeyValuePair<XATransactionId, byte[]> recoverable in matches)
+                {
+                    this.transactionId = recoverable.Key;
+                    Tracer.Info("Reenlisting recovered TX with Id: " + this.transactionId);
+                    this.currentEnlistment =
+                        TransactionManager.Reenlist(ResourceManagerGuid, recoverable.Value, this);
+                }
+
+                this.recoveryComplete.await();
+                Tracer.Debug("All Recovered TX enlistments Reports complete, Recovery Complete.");
+                TransactionManager.RecoveryComplete(ResourceManagerGuid);
+                return;
+            }
+
+            // The old recovery information doesn't match what's on the broker so we
+            // should discard it as its stale now.
+            RecoveryLogger.Purge();
+        }
+
+        private XATransactionId[] TryRecoverBrokerTXIds()
+        {
+            Tracer.Debug("Checking for Recoverable Transactions on Broker.");
+
+            TransactionInfo info = new TransactionInfo();
+            info.ConnectionId = this.session.Connection.ConnectionId;
+            info.Type = (int)TransactionType.Recover;
+
+            this.connection.CheckConnected();
+            DataArrayResponse response = this.connection.SyncRequest(info) as DataArrayResponse;
+
+            if (response != null && response.Data.Length > 0)
+            {
+                Tracer.DebugFormat("Broker reports there are {0} recoverable XA Transactions", response.Data.Length);
+
+                List<XATransactionId> recovered = new List<XATransactionId>();
+
+                foreach (DataStructure ds in response.Data)
+                {
+                    XATransactionId xid = ds as XATransactionId;
+                    if (xid != null)
+                    {
+                        recovered.Add(xid);
+                    }
+                }
+
+                return recovered.ToArray();
+            }
+
+            return new XATransactionId[0];
+        }
+
+        #endregion
+
+        internal IRecoveryLogger RecoveryLogger
+        {
+            get { return (this.connection as NetTxConnection).RecoveryPolicy.RecoveryLogger; }
+        }
+
+        internal string ResourceManagerId
+        {
+            get { return (this.connection as NetTxConnection).ResourceManagerGuid.ToString(); }
+        }
+
+        internal Guid ResourceManagerGuid
+        {
+            get { return (this.connection as NetTxConnection).ResourceManagerGuid; }
+        }
+
+    }
+}
diff --git a/src/main/csharp/OpenWire/OpenWireFormat.cs b/src/main/csharp/OpenWire/OpenWireFormat.cs
index 0b3565f..00205bf 100755
--- a/src/main/csharp/OpenWire/OpenWireFormat.cs
+++ b/src/main/csharp/OpenWire/OpenWireFormat.cs
@@ -59,7 +59,7 @@
             PreferredWireFormatInfo.MaxInactivityDuration = 30000;
             PreferredWireFormatInfo.MaxInactivityDurationInitialDelay = 10000;
             PreferredWireFormatInfo.CacheSize = 0;
-            PreferredWireFormatInfo.Version = 9;
+            PreferredWireFormatInfo.Version = 10;
 
             dataMarshallers = new BaseDataStreamMarshaller[256];
             Version = 1;
diff --git a/src/main/csharp/OpenWire/V10/ActiveMQBlobMessageMarshaller.cs b/src/main/csharp/OpenWire/V10/ActiveMQBlobMessageMarshaller.cs
new file mode 100644
index 0000000..207c3ae
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/ActiveMQBlobMessageMarshaller.cs
@@ -0,0 +1,124 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for ActiveMQBlobMessage
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for ActiveMQBlobMessage
+    /// </summary>
+    class ActiveMQBlobMessageMarshaller : ActiveMQMessageMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new ActiveMQBlobMessage();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return ActiveMQBlobMessage.ID_ACTIVEMQBLOBMESSAGE;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            ActiveMQBlobMessage info = (ActiveMQBlobMessage)o;
+            info.RemoteBlobUrl = TightUnmarshalString(dataIn, bs);
+            info.MimeType = TightUnmarshalString(dataIn, bs);
+            info.DeletedByBroker = bs.ReadBoolean();
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+            ActiveMQBlobMessage info = (ActiveMQBlobMessage)o;
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+            rc += TightMarshalString1(info.RemoteBlobUrl, bs);
+            rc += TightMarshalString1(info.MimeType, bs);
+            bs.WriteBoolean(info.DeletedByBroker);
+
+            return rc + 0;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            ActiveMQBlobMessage info = (ActiveMQBlobMessage)o;
+            TightMarshalString2(info.RemoteBlobUrl, dataOut, bs);
+            TightMarshalString2(info.MimeType, dataOut, bs);
+            bs.ReadBoolean();
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            ActiveMQBlobMessage info = (ActiveMQBlobMessage)o;
+            info.RemoteBlobUrl = LooseUnmarshalString(dataIn);
+            info.MimeType = LooseUnmarshalString(dataIn);
+            info.DeletedByBroker = dataIn.ReadBoolean();
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            ActiveMQBlobMessage info = (ActiveMQBlobMessage)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            LooseMarshalString(info.RemoteBlobUrl, dataOut);
+            LooseMarshalString(info.MimeType, dataOut);
+            dataOut.Write(info.DeletedByBroker);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/ActiveMQBytesMessageMarshaller.cs b/src/main/csharp/OpenWire/V10/ActiveMQBytesMessageMarshaller.cs
new file mode 100644
index 0000000..0827f14
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/ActiveMQBytesMessageMarshaller.cs
@@ -0,0 +1,100 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for ActiveMQBytesMessage
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for ActiveMQBytesMessage
+    /// </summary>
+    class ActiveMQBytesMessageMarshaller : ActiveMQMessageMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new ActiveMQBytesMessage();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return ActiveMQBytesMessage.ID_ACTIVEMQBYTESMESSAGE;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+
+            return rc + 0;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/ActiveMQDestinationMarshaller.cs b/src/main/csharp/OpenWire/V10/ActiveMQDestinationMarshaller.cs
new file mode 100644
index 0000000..6d51f00
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/ActiveMQDestinationMarshaller.cs
@@ -0,0 +1,99 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for ActiveMQDestination
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for ActiveMQDestination
+    /// </summary>
+    abstract class ActiveMQDestinationMarshaller : BaseDataStreamMarshaller
+    {
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            ActiveMQDestination info = (ActiveMQDestination)o;
+            info.PhysicalName = TightUnmarshalString(dataIn, bs);
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+            ActiveMQDestination info = (ActiveMQDestination)o;
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+            rc += TightMarshalString1(info.PhysicalName, bs);
+
+            return rc + 0;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            ActiveMQDestination info = (ActiveMQDestination)o;
+            TightMarshalString2(info.PhysicalName, dataOut, bs);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            ActiveMQDestination info = (ActiveMQDestination)o;
+            info.PhysicalName = LooseUnmarshalString(dataIn);
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            ActiveMQDestination info = (ActiveMQDestination)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            LooseMarshalString(info.PhysicalName, dataOut);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/ActiveMQMapMessageMarshaller.cs b/src/main/csharp/OpenWire/V10/ActiveMQMapMessageMarshaller.cs
new file mode 100644
index 0000000..5d47cef
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/ActiveMQMapMessageMarshaller.cs
@@ -0,0 +1,100 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for ActiveMQMapMessage
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for ActiveMQMapMessage
+    /// </summary>
+    class ActiveMQMapMessageMarshaller : ActiveMQMessageMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new ActiveMQMapMessage();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return ActiveMQMapMessage.ID_ACTIVEMQMAPMESSAGE;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+
+            return rc + 0;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/ActiveMQMessageMarshaller.cs b/src/main/csharp/OpenWire/V10/ActiveMQMessageMarshaller.cs
new file mode 100644
index 0000000..3c2725c
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/ActiveMQMessageMarshaller.cs
@@ -0,0 +1,127 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for ActiveMQMessage
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for ActiveMQMessage
+    /// </summary>
+    class ActiveMQMessageMarshaller : MessageMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new ActiveMQMessage();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return ActiveMQMessage.ID_ACTIVEMQMESSAGE;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            ActiveMQMessage info = (ActiveMQMessage)o;
+
+            info.BeforeUnmarshall(wireFormat);
+
+
+            info.AfterUnmarshall(wireFormat);
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+            ActiveMQMessage info = (ActiveMQMessage)o;
+
+            info.BeforeMarshall(wireFormat);
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+
+            return rc + 0;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            ActiveMQMessage info = (ActiveMQMessage)o;
+
+            info.AfterMarshall(wireFormat);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            ActiveMQMessage info = (ActiveMQMessage)o;
+
+            info.BeforeUnmarshall(wireFormat);
+
+
+            info.AfterUnmarshall(wireFormat);
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            ActiveMQMessage info = (ActiveMQMessage)o;
+
+            info.BeforeMarshall(wireFormat);
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+
+            info.AfterMarshall(wireFormat);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/ActiveMQObjectMessageMarshaller.cs b/src/main/csharp/OpenWire/V10/ActiveMQObjectMessageMarshaller.cs
new file mode 100644
index 0000000..7cc239c
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/ActiveMQObjectMessageMarshaller.cs
@@ -0,0 +1,100 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for ActiveMQObjectMessage
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for ActiveMQObjectMessage
+    /// </summary>
+    class ActiveMQObjectMessageMarshaller : ActiveMQMessageMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new ActiveMQObjectMessage();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return ActiveMQObjectMessage.ID_ACTIVEMQOBJECTMESSAGE;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+
+            return rc + 0;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/ActiveMQQueueMarshaller.cs b/src/main/csharp/OpenWire/V10/ActiveMQQueueMarshaller.cs
new file mode 100644
index 0000000..91c3b3a
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/ActiveMQQueueMarshaller.cs
@@ -0,0 +1,100 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for ActiveMQQueue
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for ActiveMQQueue
+    /// </summary>
+    class ActiveMQQueueMarshaller : ActiveMQDestinationMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new ActiveMQQueue();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return ActiveMQQueue.ID_ACTIVEMQQUEUE;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+
+            return rc + 0;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/ActiveMQStreamMessageMarshaller.cs b/src/main/csharp/OpenWire/V10/ActiveMQStreamMessageMarshaller.cs
new file mode 100644
index 0000000..95eb41c
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/ActiveMQStreamMessageMarshaller.cs
@@ -0,0 +1,100 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for ActiveMQStreamMessage
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for ActiveMQStreamMessage
+    /// </summary>
+    class ActiveMQStreamMessageMarshaller : ActiveMQMessageMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new ActiveMQStreamMessage();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return ActiveMQStreamMessage.ID_ACTIVEMQSTREAMMESSAGE;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+
+            return rc + 0;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/ActiveMQTempDestinationMarshaller.cs b/src/main/csharp/OpenWire/V10/ActiveMQTempDestinationMarshaller.cs
new file mode 100644
index 0000000..48f444a
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/ActiveMQTempDestinationMarshaller.cs
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for ActiveMQTempDestination
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for ActiveMQTempDestination
+    /// </summary>
+    abstract class ActiveMQTempDestinationMarshaller : ActiveMQDestinationMarshaller
+    {
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+
+            return rc + 0;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/ActiveMQTempQueueMarshaller.cs b/src/main/csharp/OpenWire/V10/ActiveMQTempQueueMarshaller.cs
new file mode 100644
index 0000000..2909fe8
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/ActiveMQTempQueueMarshaller.cs
@@ -0,0 +1,100 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for ActiveMQTempQueue
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for ActiveMQTempQueue
+    /// </summary>
+    class ActiveMQTempQueueMarshaller : ActiveMQTempDestinationMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new ActiveMQTempQueue();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return ActiveMQTempQueue.ID_ACTIVEMQTEMPQUEUE;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+
+            return rc + 0;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/ActiveMQTempTopicMarshaller.cs b/src/main/csharp/OpenWire/V10/ActiveMQTempTopicMarshaller.cs
new file mode 100644
index 0000000..ec77db3
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/ActiveMQTempTopicMarshaller.cs
@@ -0,0 +1,100 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for ActiveMQTempTopic
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for ActiveMQTempTopic
+    /// </summary>
+    class ActiveMQTempTopicMarshaller : ActiveMQTempDestinationMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new ActiveMQTempTopic();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return ActiveMQTempTopic.ID_ACTIVEMQTEMPTOPIC;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+
+            return rc + 0;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/ActiveMQTextMessageMarshaller.cs b/src/main/csharp/OpenWire/V10/ActiveMQTextMessageMarshaller.cs
new file mode 100644
index 0000000..fed1e42
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/ActiveMQTextMessageMarshaller.cs
@@ -0,0 +1,100 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for ActiveMQTextMessage
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for ActiveMQTextMessage
+    /// </summary>
+    class ActiveMQTextMessageMarshaller : ActiveMQMessageMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new ActiveMQTextMessage();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return ActiveMQTextMessage.ID_ACTIVEMQTEXTMESSAGE;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+
+            return rc + 0;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/ActiveMQTopicMarshaller.cs b/src/main/csharp/OpenWire/V10/ActiveMQTopicMarshaller.cs
new file mode 100644
index 0000000..ecd77ed
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/ActiveMQTopicMarshaller.cs
@@ -0,0 +1,100 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for ActiveMQTopic
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for ActiveMQTopic
+    /// </summary>
+    class ActiveMQTopicMarshaller : ActiveMQDestinationMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new ActiveMQTopic();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return ActiveMQTopic.ID_ACTIVEMQTOPIC;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+
+            return rc + 0;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/BaseCommandMarshaller.cs b/src/main/csharp/OpenWire/V10/BaseCommandMarshaller.cs
new file mode 100644
index 0000000..179d602
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/BaseCommandMarshaller.cs
@@ -0,0 +1,103 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for BaseCommand
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for BaseCommand
+    /// </summary>
+    abstract class BaseCommandMarshaller : BaseDataStreamMarshaller
+    {
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            BaseCommand info = (BaseCommand)o;
+            info.CommandId = dataIn.ReadInt32();
+            info.ResponseRequired = bs.ReadBoolean();
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+            BaseCommand info = (BaseCommand)o;
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+            bs.WriteBoolean(info.ResponseRequired);
+
+            return rc + 4;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            BaseCommand info = (BaseCommand)o;
+            dataOut.Write(info.CommandId);
+            bs.ReadBoolean();
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            BaseCommand info = (BaseCommand)o;
+            info.CommandId = dataIn.ReadInt32();
+            info.ResponseRequired = dataIn.ReadBoolean();
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            BaseCommand info = (BaseCommand)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            dataOut.Write(info.CommandId);
+            dataOut.Write(info.ResponseRequired);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/BrokerIdMarshaller.cs b/src/main/csharp/OpenWire/V10/BrokerIdMarshaller.cs
new file mode 100644
index 0000000..1f476be
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/BrokerIdMarshaller.cs
@@ -0,0 +1,114 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for BrokerId
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for BrokerId
+    /// </summary>
+    class BrokerIdMarshaller : BaseDataStreamMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new BrokerId();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return BrokerId.ID_BROKERID;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            BrokerId info = (BrokerId)o;
+            info.Value = TightUnmarshalString(dataIn, bs);
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+            BrokerId info = (BrokerId)o;
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+            rc += TightMarshalString1(info.Value, bs);
+
+            return rc + 0;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            BrokerId info = (BrokerId)o;
+            TightMarshalString2(info.Value, dataOut, bs);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            BrokerId info = (BrokerId)o;
+            info.Value = LooseUnmarshalString(dataIn);
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            BrokerId info = (BrokerId)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            LooseMarshalString(info.Value, dataOut);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/BrokerInfoMarshaller.cs b/src/main/csharp/OpenWire/V10/BrokerInfoMarshaller.cs
new file mode 100644
index 0000000..aa3e036
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/BrokerInfoMarshaller.cs
@@ -0,0 +1,191 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for BrokerInfo
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for BrokerInfo
+    /// </summary>
+    class BrokerInfoMarshaller : BaseCommandMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new BrokerInfo();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return BrokerInfo.ID_BROKERINFO;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            BrokerInfo info = (BrokerInfo)o;
+            info.BrokerId = (BrokerId) TightUnmarshalCachedObject(wireFormat, dataIn, bs);
+            info.BrokerURL = TightUnmarshalString(dataIn, bs);
+
+            if (bs.ReadBoolean()) {
+                short size = dataIn.ReadInt16();
+                BrokerInfo[] value = new BrokerInfo[size];
+                for( int i=0; i < size; i++ ) {
+                    value[i] = (BrokerInfo) TightUnmarshalNestedObject(wireFormat,dataIn, bs);
+                }
+                info.PeerBrokerInfos = value;
+            }
+            else {
+                info.PeerBrokerInfos = null;
+            }
+            info.BrokerName = TightUnmarshalString(dataIn, bs);
+            info.SlaveBroker = bs.ReadBoolean();
+            info.MasterBroker = bs.ReadBoolean();
+            info.FaultTolerantConfiguration = bs.ReadBoolean();
+            info.DuplexConnection = bs.ReadBoolean();
+            info.NetworkConnection = bs.ReadBoolean();
+            info.ConnectionId = TightUnmarshalLong(wireFormat, dataIn, bs);
+            info.BrokerUploadUrl = TightUnmarshalString(dataIn, bs);
+            info.NetworkProperties = TightUnmarshalString(dataIn, bs);
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+            BrokerInfo info = (BrokerInfo)o;
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+            rc += TightMarshalCachedObject1(wireFormat, (DataStructure)info.BrokerId, bs);
+            rc += TightMarshalString1(info.BrokerURL, bs);
+            rc += TightMarshalObjectArray1(wireFormat, info.PeerBrokerInfos, bs);
+            rc += TightMarshalString1(info.BrokerName, bs);
+            bs.WriteBoolean(info.SlaveBroker);
+            bs.WriteBoolean(info.MasterBroker);
+            bs.WriteBoolean(info.FaultTolerantConfiguration);
+            bs.WriteBoolean(info.DuplexConnection);
+            bs.WriteBoolean(info.NetworkConnection);
+            rc += TightMarshalLong1(wireFormat, info.ConnectionId, bs);
+            rc += TightMarshalString1(info.BrokerUploadUrl, bs);
+            rc += TightMarshalString1(info.NetworkProperties, bs);
+
+            return rc + 0;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            BrokerInfo info = (BrokerInfo)o;
+            TightMarshalCachedObject2(wireFormat, (DataStructure)info.BrokerId, dataOut, bs);
+            TightMarshalString2(info.BrokerURL, dataOut, bs);
+            TightMarshalObjectArray2(wireFormat, info.PeerBrokerInfos, dataOut, bs);
+            TightMarshalString2(info.BrokerName, dataOut, bs);
+            bs.ReadBoolean();
+            bs.ReadBoolean();
+            bs.ReadBoolean();
+            bs.ReadBoolean();
+            bs.ReadBoolean();
+            TightMarshalLong2(wireFormat, info.ConnectionId, dataOut, bs);
+            TightMarshalString2(info.BrokerUploadUrl, dataOut, bs);
+            TightMarshalString2(info.NetworkProperties, dataOut, bs);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            BrokerInfo info = (BrokerInfo)o;
+            info.BrokerId = (BrokerId) LooseUnmarshalCachedObject(wireFormat, dataIn);
+            info.BrokerURL = LooseUnmarshalString(dataIn);
+
+            if (dataIn.ReadBoolean()) {
+                short size = dataIn.ReadInt16();
+                BrokerInfo[] value = new BrokerInfo[size];
+                for( int i=0; i < size; i++ ) {
+                    value[i] = (BrokerInfo) LooseUnmarshalNestedObject(wireFormat,dataIn);
+                }
+                info.PeerBrokerInfos = value;
+            }
+            else {
+                info.PeerBrokerInfos = null;
+            }
+            info.BrokerName = LooseUnmarshalString(dataIn);
+            info.SlaveBroker = dataIn.ReadBoolean();
+            info.MasterBroker = dataIn.ReadBoolean();
+            info.FaultTolerantConfiguration = dataIn.ReadBoolean();
+            info.DuplexConnection = dataIn.ReadBoolean();
+            info.NetworkConnection = dataIn.ReadBoolean();
+            info.ConnectionId = LooseUnmarshalLong(wireFormat, dataIn);
+            info.BrokerUploadUrl = LooseUnmarshalString(dataIn);
+            info.NetworkProperties = LooseUnmarshalString(dataIn);
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            BrokerInfo info = (BrokerInfo)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            LooseMarshalCachedObject(wireFormat, (DataStructure)info.BrokerId, dataOut);
+            LooseMarshalString(info.BrokerURL, dataOut);
+            LooseMarshalObjectArray(wireFormat, info.PeerBrokerInfos, dataOut);
+            LooseMarshalString(info.BrokerName, dataOut);
+            dataOut.Write(info.SlaveBroker);
+            dataOut.Write(info.MasterBroker);
+            dataOut.Write(info.FaultTolerantConfiguration);
+            dataOut.Write(info.DuplexConnection);
+            dataOut.Write(info.NetworkConnection);
+            LooseMarshalLong(wireFormat, info.ConnectionId, dataOut);
+            LooseMarshalString(info.BrokerUploadUrl, dataOut);
+            LooseMarshalString(info.NetworkProperties, dataOut);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/ConnectionControlMarshaller.cs b/src/main/csharp/OpenWire/V10/ConnectionControlMarshaller.cs
new file mode 100644
index 0000000..696ff18
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/ConnectionControlMarshaller.cs
@@ -0,0 +1,162 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for ConnectionControl
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for ConnectionControl
+    /// </summary>
+    class ConnectionControlMarshaller : BaseCommandMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new ConnectionControl();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return ConnectionControl.ID_CONNECTIONCONTROL;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            ConnectionControl info = (ConnectionControl)o;
+            info.Close = bs.ReadBoolean();
+            info.Exit = bs.ReadBoolean();
+            info.FaultTolerant = bs.ReadBoolean();
+            info.Resume = bs.ReadBoolean();
+            info.Suspend = bs.ReadBoolean();
+            info.ConnectedBrokers = TightUnmarshalString(dataIn, bs);
+            info.ReconnectTo = TightUnmarshalString(dataIn, bs);
+            info.RebalanceConnection = bs.ReadBoolean();
+            info.Token = ReadBytes(dataIn, bs.ReadBoolean());
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+            ConnectionControl info = (ConnectionControl)o;
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+            bs.WriteBoolean(info.Close);
+            bs.WriteBoolean(info.Exit);
+            bs.WriteBoolean(info.FaultTolerant);
+            bs.WriteBoolean(info.Resume);
+            bs.WriteBoolean(info.Suspend);
+            rc += TightMarshalString1(info.ConnectedBrokers, bs);
+            rc += TightMarshalString1(info.ReconnectTo, bs);
+            bs.WriteBoolean(info.RebalanceConnection);
+            bs.WriteBoolean(info.Token!=null);
+            rc += info.Token==null ? 0 : info.Token.Length+4;
+
+            return rc + 0;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            ConnectionControl info = (ConnectionControl)o;
+            bs.ReadBoolean();
+            bs.ReadBoolean();
+            bs.ReadBoolean();
+            bs.ReadBoolean();
+            bs.ReadBoolean();
+            TightMarshalString2(info.ConnectedBrokers, dataOut, bs);
+            TightMarshalString2(info.ReconnectTo, dataOut, bs);
+            bs.ReadBoolean();
+            if(bs.ReadBoolean()) {
+                dataOut.Write(info.Token.Length);
+                dataOut.Write(info.Token);
+            }
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            ConnectionControl info = (ConnectionControl)o;
+            info.Close = dataIn.ReadBoolean();
+            info.Exit = dataIn.ReadBoolean();
+            info.FaultTolerant = dataIn.ReadBoolean();
+            info.Resume = dataIn.ReadBoolean();
+            info.Suspend = dataIn.ReadBoolean();
+            info.ConnectedBrokers = LooseUnmarshalString(dataIn);
+            info.ReconnectTo = LooseUnmarshalString(dataIn);
+            info.RebalanceConnection = dataIn.ReadBoolean();
+            info.Token = ReadBytes(dataIn, dataIn.ReadBoolean());
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            ConnectionControl info = (ConnectionControl)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            dataOut.Write(info.Close);
+            dataOut.Write(info.Exit);
+            dataOut.Write(info.FaultTolerant);
+            dataOut.Write(info.Resume);
+            dataOut.Write(info.Suspend);
+            LooseMarshalString(info.ConnectedBrokers, dataOut);
+            LooseMarshalString(info.ReconnectTo, dataOut);
+            dataOut.Write(info.RebalanceConnection);
+            dataOut.Write(info.Token!=null);
+            if(info.Token!=null) {
+               dataOut.Write(info.Token.Length);
+               dataOut.Write(info.Token);
+            }
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/ConnectionErrorMarshaller.cs b/src/main/csharp/OpenWire/V10/ConnectionErrorMarshaller.cs
new file mode 100644
index 0000000..e9b704b
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/ConnectionErrorMarshaller.cs
@@ -0,0 +1,119 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for ConnectionError
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for ConnectionError
+    /// </summary>
+    class ConnectionErrorMarshaller : BaseCommandMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new ConnectionError();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return ConnectionError.ID_CONNECTIONERROR;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            ConnectionError info = (ConnectionError)o;
+            info.Exception = TightUnmarshalBrokerError(wireFormat, dataIn, bs);
+            info.ConnectionId = (ConnectionId) TightUnmarshalNestedObject(wireFormat, dataIn, bs);
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+            ConnectionError info = (ConnectionError)o;
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+            rc += TightMarshalBrokerError1(wireFormat, info.Exception, bs);
+        rc += TightMarshalNestedObject1(wireFormat, (DataStructure)info.ConnectionId, bs);
+
+            return rc + 0;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            ConnectionError info = (ConnectionError)o;
+            TightMarshalBrokerError2(wireFormat, info.Exception, dataOut, bs);
+            TightMarshalNestedObject2(wireFormat, (DataStructure)info.ConnectionId, dataOut, bs);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            ConnectionError info = (ConnectionError)o;
+            info.Exception = LooseUnmarshalBrokerError(wireFormat, dataIn);
+            info.ConnectionId = (ConnectionId) LooseUnmarshalNestedObject(wireFormat, dataIn);
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            ConnectionError info = (ConnectionError)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            LooseMarshalBrokerError(wireFormat, info.Exception, dataOut);
+            LooseMarshalNestedObject(wireFormat, (DataStructure)info.ConnectionId, dataOut);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/ConnectionIdMarshaller.cs b/src/main/csharp/OpenWire/V10/ConnectionIdMarshaller.cs
new file mode 100644
index 0000000..0b10633
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/ConnectionIdMarshaller.cs
@@ -0,0 +1,114 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for ConnectionId
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for ConnectionId
+    /// </summary>
+    class ConnectionIdMarshaller : BaseDataStreamMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new ConnectionId();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return ConnectionId.ID_CONNECTIONID;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            ConnectionId info = (ConnectionId)o;
+            info.Value = TightUnmarshalString(dataIn, bs);
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+            ConnectionId info = (ConnectionId)o;
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+            rc += TightMarshalString1(info.Value, bs);
+
+            return rc + 0;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            ConnectionId info = (ConnectionId)o;
+            TightMarshalString2(info.Value, dataOut, bs);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            ConnectionId info = (ConnectionId)o;
+            info.Value = LooseUnmarshalString(dataIn);
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            ConnectionId info = (ConnectionId)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            LooseMarshalString(info.Value, dataOut);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/ConnectionInfoMarshaller.cs b/src/main/csharp/OpenWire/V10/ConnectionInfoMarshaller.cs
new file mode 100644
index 0000000..d6d6712
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/ConnectionInfoMarshaller.cs
@@ -0,0 +1,186 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for ConnectionInfo
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for ConnectionInfo
+    /// </summary>
+    class ConnectionInfoMarshaller : BaseCommandMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new ConnectionInfo();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return ConnectionInfo.ID_CONNECTIONINFO;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            ConnectionInfo info = (ConnectionInfo)o;
+            info.ConnectionId = (ConnectionId) TightUnmarshalCachedObject(wireFormat, dataIn, bs);
+            info.ClientId = TightUnmarshalString(dataIn, bs);
+            info.Password = TightUnmarshalString(dataIn, bs);
+            info.UserName = TightUnmarshalString(dataIn, bs);
+
+            if (bs.ReadBoolean()) {
+                short size = dataIn.ReadInt16();
+                BrokerId[] value = new BrokerId[size];
+                for( int i=0; i < size; i++ ) {
+                    value[i] = (BrokerId) TightUnmarshalNestedObject(wireFormat,dataIn, bs);
+                }
+                info.BrokerPath = value;
+            }
+            else {
+                info.BrokerPath = null;
+            }
+            info.BrokerMasterConnector = bs.ReadBoolean();
+            info.Manageable = bs.ReadBoolean();
+            info.ClientMaster = bs.ReadBoolean();
+            info.FaultTolerant = bs.ReadBoolean();
+            info.FailoverReconnect = bs.ReadBoolean();
+            info.ClientIp = TightUnmarshalString(dataIn, bs);
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+            ConnectionInfo info = (ConnectionInfo)o;
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+            rc += TightMarshalCachedObject1(wireFormat, (DataStructure)info.ConnectionId, bs);
+            rc += TightMarshalString1(info.ClientId, bs);
+            rc += TightMarshalString1(info.Password, bs);
+            rc += TightMarshalString1(info.UserName, bs);
+            rc += TightMarshalObjectArray1(wireFormat, info.BrokerPath, bs);
+            bs.WriteBoolean(info.BrokerMasterConnector);
+            bs.WriteBoolean(info.Manageable);
+            bs.WriteBoolean(info.ClientMaster);
+            bs.WriteBoolean(info.FaultTolerant);
+            bs.WriteBoolean(info.FailoverReconnect);
+            rc += TightMarshalString1(info.ClientIp, bs);
+
+            return rc + 0;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            ConnectionInfo info = (ConnectionInfo)o;
+            TightMarshalCachedObject2(wireFormat, (DataStructure)info.ConnectionId, dataOut, bs);
+            TightMarshalString2(info.ClientId, dataOut, bs);
+            TightMarshalString2(info.Password, dataOut, bs);
+            TightMarshalString2(info.UserName, dataOut, bs);
+            TightMarshalObjectArray2(wireFormat, info.BrokerPath, dataOut, bs);
+            bs.ReadBoolean();
+            bs.ReadBoolean();
+            bs.ReadBoolean();
+            bs.ReadBoolean();
+            bs.ReadBoolean();
+            TightMarshalString2(info.ClientIp, dataOut, bs);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            ConnectionInfo info = (ConnectionInfo)o;
+            info.ConnectionId = (ConnectionId) LooseUnmarshalCachedObject(wireFormat, dataIn);
+            info.ClientId = LooseUnmarshalString(dataIn);
+            info.Password = LooseUnmarshalString(dataIn);
+            info.UserName = LooseUnmarshalString(dataIn);
+
+            if (dataIn.ReadBoolean()) {
+                short size = dataIn.ReadInt16();
+                BrokerId[] value = new BrokerId[size];
+                for( int i=0; i < size; i++ ) {
+                    value[i] = (BrokerId) LooseUnmarshalNestedObject(wireFormat,dataIn);
+                }
+                info.BrokerPath = value;
+            }
+            else {
+                info.BrokerPath = null;
+            }
+            info.BrokerMasterConnector = dataIn.ReadBoolean();
+            info.Manageable = dataIn.ReadBoolean();
+            info.ClientMaster = dataIn.ReadBoolean();
+            info.FaultTolerant = dataIn.ReadBoolean();
+            info.FailoverReconnect = dataIn.ReadBoolean();
+            info.ClientIp = LooseUnmarshalString(dataIn);
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            ConnectionInfo info = (ConnectionInfo)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            LooseMarshalCachedObject(wireFormat, (DataStructure)info.ConnectionId, dataOut);
+            LooseMarshalString(info.ClientId, dataOut);
+            LooseMarshalString(info.Password, dataOut);
+            LooseMarshalString(info.UserName, dataOut);
+            LooseMarshalObjectArray(wireFormat, info.BrokerPath, dataOut);
+            dataOut.Write(info.BrokerMasterConnector);
+            dataOut.Write(info.Manageable);
+            dataOut.Write(info.ClientMaster);
+            dataOut.Write(info.FaultTolerant);
+            dataOut.Write(info.FailoverReconnect);
+            LooseMarshalString(info.ClientIp, dataOut);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/ConsumerControlMarshaller.cs b/src/main/csharp/OpenWire/V10/ConsumerControlMarshaller.cs
new file mode 100644
index 0000000..74e4c41
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/ConsumerControlMarshaller.cs
@@ -0,0 +1,143 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for ConsumerControl
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for ConsumerControl
+    /// </summary>
+    class ConsumerControlMarshaller : BaseCommandMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new ConsumerControl();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return ConsumerControl.ID_CONSUMERCONTROL;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            ConsumerControl info = (ConsumerControl)o;
+            info.Destination = (ActiveMQDestination) TightUnmarshalNestedObject(wireFormat, dataIn, bs);
+            info.Close = bs.ReadBoolean();
+            info.ConsumerId = (ConsumerId) TightUnmarshalNestedObject(wireFormat, dataIn, bs);
+            info.Prefetch = dataIn.ReadInt32();
+            info.Flush = bs.ReadBoolean();
+            info.Start = bs.ReadBoolean();
+            info.Stop = bs.ReadBoolean();
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+            ConsumerControl info = (ConsumerControl)o;
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+        rc += TightMarshalNestedObject1(wireFormat, (DataStructure)info.Destination, bs);
+            bs.WriteBoolean(info.Close);
+        rc += TightMarshalNestedObject1(wireFormat, (DataStructure)info.ConsumerId, bs);
+            bs.WriteBoolean(info.Flush);
+            bs.WriteBoolean(info.Start);
+            bs.WriteBoolean(info.Stop);
+
+            return rc + 4;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            ConsumerControl info = (ConsumerControl)o;
+            TightMarshalNestedObject2(wireFormat, (DataStructure)info.Destination, dataOut, bs);
+            bs.ReadBoolean();
+            TightMarshalNestedObject2(wireFormat, (DataStructure)info.ConsumerId, dataOut, bs);
+            dataOut.Write(info.Prefetch);
+            bs.ReadBoolean();
+            bs.ReadBoolean();
+            bs.ReadBoolean();
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            ConsumerControl info = (ConsumerControl)o;
+            info.Destination = (ActiveMQDestination) LooseUnmarshalNestedObject(wireFormat, dataIn);
+            info.Close = dataIn.ReadBoolean();
+            info.ConsumerId = (ConsumerId) LooseUnmarshalNestedObject(wireFormat, dataIn);
+            info.Prefetch = dataIn.ReadInt32();
+            info.Flush = dataIn.ReadBoolean();
+            info.Start = dataIn.ReadBoolean();
+            info.Stop = dataIn.ReadBoolean();
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            ConsumerControl info = (ConsumerControl)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            LooseMarshalNestedObject(wireFormat, (DataStructure)info.Destination, dataOut);
+            dataOut.Write(info.Close);
+            LooseMarshalNestedObject(wireFormat, (DataStructure)info.ConsumerId, dataOut);
+            dataOut.Write(info.Prefetch);
+            dataOut.Write(info.Flush);
+            dataOut.Write(info.Start);
+            dataOut.Write(info.Stop);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/ConsumerIdMarshaller.cs b/src/main/csharp/OpenWire/V10/ConsumerIdMarshaller.cs
new file mode 100644
index 0000000..1eb6962
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/ConsumerIdMarshaller.cs
@@ -0,0 +1,124 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for ConsumerId
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for ConsumerId
+    /// </summary>
+    class ConsumerIdMarshaller : BaseDataStreamMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new ConsumerId();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return ConsumerId.ID_CONSUMERID;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            ConsumerId info = (ConsumerId)o;
+            info.ConnectionId = TightUnmarshalString(dataIn, bs);
+            info.SessionId = TightUnmarshalLong(wireFormat, dataIn, bs);
+            info.Value = TightUnmarshalLong(wireFormat, dataIn, bs);
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+            ConsumerId info = (ConsumerId)o;
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+            rc += TightMarshalString1(info.ConnectionId, bs);
+            rc += TightMarshalLong1(wireFormat, info.SessionId, bs);
+            rc += TightMarshalLong1(wireFormat, info.Value, bs);
+
+            return rc + 0;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            ConsumerId info = (ConsumerId)o;
+            TightMarshalString2(info.ConnectionId, dataOut, bs);
+            TightMarshalLong2(wireFormat, info.SessionId, dataOut, bs);
+            TightMarshalLong2(wireFormat, info.Value, dataOut, bs);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            ConsumerId info = (ConsumerId)o;
+            info.ConnectionId = LooseUnmarshalString(dataIn);
+            info.SessionId = LooseUnmarshalLong(wireFormat, dataIn);
+            info.Value = LooseUnmarshalLong(wireFormat, dataIn);
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            ConsumerId info = (ConsumerId)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            LooseMarshalString(info.ConnectionId, dataOut);
+            LooseMarshalLong(wireFormat, info.SessionId, dataOut);
+            LooseMarshalLong(wireFormat, info.Value, dataOut);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/ConsumerInfoMarshaller.cs b/src/main/csharp/OpenWire/V10/ConsumerInfoMarshaller.cs
new file mode 100644
index 0000000..2c03b82
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/ConsumerInfoMarshaller.cs
@@ -0,0 +1,245 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for ConsumerInfo
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for ConsumerInfo
+    /// </summary>
+    class ConsumerInfoMarshaller : BaseCommandMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new ConsumerInfo();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return ConsumerInfo.ID_CONSUMERINFO;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            ConsumerInfo info = (ConsumerInfo)o;
+            info.ConsumerId = (ConsumerId) TightUnmarshalCachedObject(wireFormat, dataIn, bs);
+            info.Browser = bs.ReadBoolean();
+            info.Destination = (ActiveMQDestination) TightUnmarshalCachedObject(wireFormat, dataIn, bs);
+            info.PrefetchSize = dataIn.ReadInt32();
+            info.MaximumPendingMessageLimit = dataIn.ReadInt32();
+            info.DispatchAsync = bs.ReadBoolean();
+            info.Selector = TightUnmarshalString(dataIn, bs);
+            info.ClientId = TightUnmarshalString(dataIn, bs);
+            info.SubscriptionName = TightUnmarshalString(dataIn, bs);
+            info.NoLocal = bs.ReadBoolean();
+            info.Exclusive = bs.ReadBoolean();
+            info.Retroactive = bs.ReadBoolean();
+            info.Priority = dataIn.ReadByte();
+
+            if (bs.ReadBoolean()) {
+                short size = dataIn.ReadInt16();
+                BrokerId[] value = new BrokerId[size];
+                for( int i=0; i < size; i++ ) {
+                    value[i] = (BrokerId) TightUnmarshalNestedObject(wireFormat,dataIn, bs);
+                }
+                info.BrokerPath = value;
+            }
+            else {
+                info.BrokerPath = null;
+            }
+            info.AdditionalPredicate = (BooleanExpression) TightUnmarshalNestedObject(wireFormat, dataIn, bs);
+            info.NetworkSubscription = bs.ReadBoolean();
+            info.OptimizedAcknowledge = bs.ReadBoolean();
+            info.NoRangeAcks = bs.ReadBoolean();
+
+            if (bs.ReadBoolean()) {
+                short size = dataIn.ReadInt16();
+                ConsumerId[] value = new ConsumerId[size];
+                for( int i=0; i < size; i++ ) {
+                    value[i] = (ConsumerId) TightUnmarshalNestedObject(wireFormat,dataIn, bs);
+                }
+                info.NetworkConsumerPath = value;
+            }
+            else {
+                info.NetworkConsumerPath = null;
+            }
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+            ConsumerInfo info = (ConsumerInfo)o;
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+            rc += TightMarshalCachedObject1(wireFormat, (DataStructure)info.ConsumerId, bs);
+            bs.WriteBoolean(info.Browser);
+            rc += TightMarshalCachedObject1(wireFormat, (DataStructure)info.Destination, bs);
+            bs.WriteBoolean(info.DispatchAsync);
+            rc += TightMarshalString1(info.Selector, bs);
+            rc += TightMarshalString1(info.ClientId, bs);
+            rc += TightMarshalString1(info.SubscriptionName, bs);
+            bs.WriteBoolean(info.NoLocal);
+            bs.WriteBoolean(info.Exclusive);
+            bs.WriteBoolean(info.Retroactive);
+            rc += TightMarshalObjectArray1(wireFormat, info.BrokerPath, bs);
+        rc += TightMarshalNestedObject1(wireFormat, (DataStructure)info.AdditionalPredicate, bs);
+            bs.WriteBoolean(info.NetworkSubscription);
+            bs.WriteBoolean(info.OptimizedAcknowledge);
+            bs.WriteBoolean(info.NoRangeAcks);
+            rc += TightMarshalObjectArray1(wireFormat, info.NetworkConsumerPath, bs);
+
+            return rc + 9;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            ConsumerInfo info = (ConsumerInfo)o;
+            TightMarshalCachedObject2(wireFormat, (DataStructure)info.ConsumerId, dataOut, bs);
+            bs.ReadBoolean();
+            TightMarshalCachedObject2(wireFormat, (DataStructure)info.Destination, dataOut, bs);
+            dataOut.Write(info.PrefetchSize);
+            dataOut.Write(info.MaximumPendingMessageLimit);
+            bs.ReadBoolean();
+            TightMarshalString2(info.Selector, dataOut, bs);
+            TightMarshalString2(info.ClientId, dataOut, bs);
+            TightMarshalString2(info.SubscriptionName, dataOut, bs);
+            bs.ReadBoolean();
+            bs.ReadBoolean();
+            bs.ReadBoolean();
+            dataOut.Write(info.Priority);
+            TightMarshalObjectArray2(wireFormat, info.BrokerPath, dataOut, bs);
+            TightMarshalNestedObject2(wireFormat, (DataStructure)info.AdditionalPredicate, dataOut, bs);
+            bs.ReadBoolean();
+            bs.ReadBoolean();
+            bs.ReadBoolean();
+            TightMarshalObjectArray2(wireFormat, info.NetworkConsumerPath, dataOut, bs);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            ConsumerInfo info = (ConsumerInfo)o;
+            info.ConsumerId = (ConsumerId) LooseUnmarshalCachedObject(wireFormat, dataIn);
+            info.Browser = dataIn.ReadBoolean();
+            info.Destination = (ActiveMQDestination) LooseUnmarshalCachedObject(wireFormat, dataIn);
+            info.PrefetchSize = dataIn.ReadInt32();
+            info.MaximumPendingMessageLimit = dataIn.ReadInt32();
+            info.DispatchAsync = dataIn.ReadBoolean();
+            info.Selector = LooseUnmarshalString(dataIn);
+            info.ClientId = LooseUnmarshalString(dataIn);
+            info.SubscriptionName = LooseUnmarshalString(dataIn);
+            info.NoLocal = dataIn.ReadBoolean();
+            info.Exclusive = dataIn.ReadBoolean();
+            info.Retroactive = dataIn.ReadBoolean();
+            info.Priority = dataIn.ReadByte();
+
+            if (dataIn.ReadBoolean()) {
+                short size = dataIn.ReadInt16();
+                BrokerId[] value = new BrokerId[size];
+                for( int i=0; i < size; i++ ) {
+                    value[i] = (BrokerId) LooseUnmarshalNestedObject(wireFormat,dataIn);
+                }
+                info.BrokerPath = value;
+            }
+            else {
+                info.BrokerPath = null;
+            }
+            info.AdditionalPredicate = (BooleanExpression) LooseUnmarshalNestedObject(wireFormat, dataIn);
+            info.NetworkSubscription = dataIn.ReadBoolean();
+            info.OptimizedAcknowledge = dataIn.ReadBoolean();
+            info.NoRangeAcks = dataIn.ReadBoolean();
+
+            if (dataIn.ReadBoolean()) {
+                short size = dataIn.ReadInt16();
+                ConsumerId[] value = new ConsumerId[size];
+                for( int i=0; i < size; i++ ) {
+                    value[i] = (ConsumerId) LooseUnmarshalNestedObject(wireFormat,dataIn);
+                }
+                info.NetworkConsumerPath = value;
+            }
+            else {
+                info.NetworkConsumerPath = null;
+            }
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            ConsumerInfo info = (ConsumerInfo)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            LooseMarshalCachedObject(wireFormat, (DataStructure)info.ConsumerId, dataOut);
+            dataOut.Write(info.Browser);
+            LooseMarshalCachedObject(wireFormat, (DataStructure)info.Destination, dataOut);
+            dataOut.Write(info.PrefetchSize);
+            dataOut.Write(info.MaximumPendingMessageLimit);
+            dataOut.Write(info.DispatchAsync);
+            LooseMarshalString(info.Selector, dataOut);
+            LooseMarshalString(info.ClientId, dataOut);
+            LooseMarshalString(info.SubscriptionName, dataOut);
+            dataOut.Write(info.NoLocal);
+            dataOut.Write(info.Exclusive);
+            dataOut.Write(info.Retroactive);
+            dataOut.Write(info.Priority);
+            LooseMarshalObjectArray(wireFormat, info.BrokerPath, dataOut);
+            LooseMarshalNestedObject(wireFormat, (DataStructure)info.AdditionalPredicate, dataOut);
+            dataOut.Write(info.NetworkSubscription);
+            dataOut.Write(info.OptimizedAcknowledge);
+            dataOut.Write(info.NoRangeAcks);
+            LooseMarshalObjectArray(wireFormat, info.NetworkConsumerPath, dataOut);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/ControlCommandMarshaller.cs b/src/main/csharp/OpenWire/V10/ControlCommandMarshaller.cs
new file mode 100644
index 0000000..5089dab
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/ControlCommandMarshaller.cs
@@ -0,0 +1,114 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for ControlCommand
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for ControlCommand
+    /// </summary>
+    class ControlCommandMarshaller : BaseCommandMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new ControlCommand();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return ControlCommand.ID_CONTROLCOMMAND;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            ControlCommand info = (ControlCommand)o;
+            info.Command = TightUnmarshalString(dataIn, bs);
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+            ControlCommand info = (ControlCommand)o;
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+            rc += TightMarshalString1(info.Command, bs);
+
+            return rc + 0;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            ControlCommand info = (ControlCommand)o;
+            TightMarshalString2(info.Command, dataOut, bs);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            ControlCommand info = (ControlCommand)o;
+            info.Command = LooseUnmarshalString(dataIn);
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            ControlCommand info = (ControlCommand)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            LooseMarshalString(info.Command, dataOut);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/DataArrayResponseMarshaller.cs b/src/main/csharp/OpenWire/V10/DataArrayResponseMarshaller.cs
new file mode 100644
index 0000000..f3efbb8
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/DataArrayResponseMarshaller.cs
@@ -0,0 +1,136 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for DataArrayResponse
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for DataArrayResponse
+    /// </summary>
+    class DataArrayResponseMarshaller : ResponseMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new DataArrayResponse();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return DataArrayResponse.ID_DATAARRAYRESPONSE;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            DataArrayResponse info = (DataArrayResponse)o;
+
+            if (bs.ReadBoolean()) {
+                short size = dataIn.ReadInt16();
+                DataStructure[] value = new DataStructure[size];
+                for( int i=0; i < size; i++ ) {
+                    value[i] = (DataStructure) TightUnmarshalNestedObject(wireFormat,dataIn, bs);
+                }
+                info.Data = value;
+            }
+            else {
+                info.Data = null;
+            }
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+            DataArrayResponse info = (DataArrayResponse)o;
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+            rc += TightMarshalObjectArray1(wireFormat, info.Data, bs);
+
+            return rc + 0;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            DataArrayResponse info = (DataArrayResponse)o;
+            TightMarshalObjectArray2(wireFormat, info.Data, dataOut, bs);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            DataArrayResponse info = (DataArrayResponse)o;
+
+            if (dataIn.ReadBoolean()) {
+                short size = dataIn.ReadInt16();
+                DataStructure[] value = new DataStructure[size];
+                for( int i=0; i < size; i++ ) {
+                    value[i] = (DataStructure) LooseUnmarshalNestedObject(wireFormat,dataIn);
+                }
+                info.Data = value;
+            }
+            else {
+                info.Data = null;
+            }
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            DataArrayResponse info = (DataArrayResponse)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            LooseMarshalObjectArray(wireFormat, info.Data, dataOut);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/DataResponseMarshaller.cs b/src/main/csharp/OpenWire/V10/DataResponseMarshaller.cs
new file mode 100644
index 0000000..39bc221
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/DataResponseMarshaller.cs
@@ -0,0 +1,114 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for DataResponse
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for DataResponse
+    /// </summary>
+    class DataResponseMarshaller : ResponseMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new DataResponse();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return DataResponse.ID_DATARESPONSE;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            DataResponse info = (DataResponse)o;
+            info.Data = (DataStructure) TightUnmarshalNestedObject(wireFormat, dataIn, bs);
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+            DataResponse info = (DataResponse)o;
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+        rc += TightMarshalNestedObject1(wireFormat, (DataStructure)info.Data, bs);
+
+            return rc + 0;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            DataResponse info = (DataResponse)o;
+            TightMarshalNestedObject2(wireFormat, (DataStructure)info.Data, dataOut, bs);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            DataResponse info = (DataResponse)o;
+            info.Data = (DataStructure) LooseUnmarshalNestedObject(wireFormat, dataIn);
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            DataResponse info = (DataResponse)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            LooseMarshalNestedObject(wireFormat, (DataStructure)info.Data, dataOut);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/DestinationInfoMarshaller.cs b/src/main/csharp/OpenWire/V10/DestinationInfoMarshaller.cs
new file mode 100644
index 0000000..b3bce8a
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/DestinationInfoMarshaller.cs
@@ -0,0 +1,155 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for DestinationInfo
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for DestinationInfo
+    /// </summary>
+    class DestinationInfoMarshaller : BaseCommandMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new DestinationInfo();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return DestinationInfo.ID_DESTINATIONINFO;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            DestinationInfo info = (DestinationInfo)o;
+            info.ConnectionId = (ConnectionId) TightUnmarshalCachedObject(wireFormat, dataIn, bs);
+            info.Destination = (ActiveMQDestination) TightUnmarshalCachedObject(wireFormat, dataIn, bs);
+            info.OperationType = dataIn.ReadByte();
+            info.Timeout = TightUnmarshalLong(wireFormat, dataIn, bs);
+
+            if (bs.ReadBoolean()) {
+                short size = dataIn.ReadInt16();
+                BrokerId[] value = new BrokerId[size];
+                for( int i=0; i < size; i++ ) {
+                    value[i] = (BrokerId) TightUnmarshalNestedObject(wireFormat,dataIn, bs);
+                }
+                info.BrokerPath = value;
+            }
+            else {
+                info.BrokerPath = null;
+            }
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+            DestinationInfo info = (DestinationInfo)o;
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+            rc += TightMarshalCachedObject1(wireFormat, (DataStructure)info.ConnectionId, bs);
+            rc += TightMarshalCachedObject1(wireFormat, (DataStructure)info.Destination, bs);
+            rc += TightMarshalLong1(wireFormat, info.Timeout, bs);
+            rc += TightMarshalObjectArray1(wireFormat, info.BrokerPath, bs);
+
+            return rc + 1;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            DestinationInfo info = (DestinationInfo)o;
+            TightMarshalCachedObject2(wireFormat, (DataStructure)info.ConnectionId, dataOut, bs);
+            TightMarshalCachedObject2(wireFormat, (DataStructure)info.Destination, dataOut, bs);
+            dataOut.Write(info.OperationType);
+            TightMarshalLong2(wireFormat, info.Timeout, dataOut, bs);
+            TightMarshalObjectArray2(wireFormat, info.BrokerPath, dataOut, bs);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            DestinationInfo info = (DestinationInfo)o;
+            info.ConnectionId = (ConnectionId) LooseUnmarshalCachedObject(wireFormat, dataIn);
+            info.Destination = (ActiveMQDestination) LooseUnmarshalCachedObject(wireFormat, dataIn);
+            info.OperationType = dataIn.ReadByte();
+            info.Timeout = LooseUnmarshalLong(wireFormat, dataIn);
+
+            if (dataIn.ReadBoolean()) {
+                short size = dataIn.ReadInt16();
+                BrokerId[] value = new BrokerId[size];
+                for( int i=0; i < size; i++ ) {
+                    value[i] = (BrokerId) LooseUnmarshalNestedObject(wireFormat,dataIn);
+                }
+                info.BrokerPath = value;
+            }
+            else {
+                info.BrokerPath = null;
+            }
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            DestinationInfo info = (DestinationInfo)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            LooseMarshalCachedObject(wireFormat, (DataStructure)info.ConnectionId, dataOut);
+            LooseMarshalCachedObject(wireFormat, (DataStructure)info.Destination, dataOut);
+            dataOut.Write(info.OperationType);
+            LooseMarshalLong(wireFormat, info.Timeout, dataOut);
+            LooseMarshalObjectArray(wireFormat, info.BrokerPath, dataOut);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/DiscoveryEventMarshaller.cs b/src/main/csharp/OpenWire/V10/DiscoveryEventMarshaller.cs
new file mode 100644
index 0000000..95e3cef
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/DiscoveryEventMarshaller.cs
@@ -0,0 +1,119 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for DiscoveryEvent
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for DiscoveryEvent
+    /// </summary>
+    class DiscoveryEventMarshaller : BaseDataStreamMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new DiscoveryEvent();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return DiscoveryEvent.ID_DISCOVERYEVENT;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            DiscoveryEvent info = (DiscoveryEvent)o;
+            info.ServiceName = TightUnmarshalString(dataIn, bs);
+            info.BrokerName = TightUnmarshalString(dataIn, bs);
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+            DiscoveryEvent info = (DiscoveryEvent)o;
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+            rc += TightMarshalString1(info.ServiceName, bs);
+            rc += TightMarshalString1(info.BrokerName, bs);
+
+            return rc + 0;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            DiscoveryEvent info = (DiscoveryEvent)o;
+            TightMarshalString2(info.ServiceName, dataOut, bs);
+            TightMarshalString2(info.BrokerName, dataOut, bs);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            DiscoveryEvent info = (DiscoveryEvent)o;
+            info.ServiceName = LooseUnmarshalString(dataIn);
+            info.BrokerName = LooseUnmarshalString(dataIn);
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            DiscoveryEvent info = (DiscoveryEvent)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            LooseMarshalString(info.ServiceName, dataOut);
+            LooseMarshalString(info.BrokerName, dataOut);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/ExceptionResponseMarshaller.cs b/src/main/csharp/OpenWire/V10/ExceptionResponseMarshaller.cs
new file mode 100644
index 0000000..18438da
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/ExceptionResponseMarshaller.cs
@@ -0,0 +1,114 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for ExceptionResponse
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for ExceptionResponse
+    /// </summary>
+    class ExceptionResponseMarshaller : ResponseMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new ExceptionResponse();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return ExceptionResponse.ID_EXCEPTIONRESPONSE;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            ExceptionResponse info = (ExceptionResponse)o;
+            info.Exception = TightUnmarshalBrokerError(wireFormat, dataIn, bs);
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+            ExceptionResponse info = (ExceptionResponse)o;
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+            rc += TightMarshalBrokerError1(wireFormat, info.Exception, bs);
+
+            return rc + 0;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            ExceptionResponse info = (ExceptionResponse)o;
+            TightMarshalBrokerError2(wireFormat, info.Exception, dataOut, bs);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            ExceptionResponse info = (ExceptionResponse)o;
+            info.Exception = LooseUnmarshalBrokerError(wireFormat, dataIn);
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            ExceptionResponse info = (ExceptionResponse)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            LooseMarshalBrokerError(wireFormat, info.Exception, dataOut);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/FlushCommandMarshaller.cs b/src/main/csharp/OpenWire/V10/FlushCommandMarshaller.cs
new file mode 100644
index 0000000..4cfa473
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/FlushCommandMarshaller.cs
@@ -0,0 +1,100 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for FlushCommand
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for FlushCommand
+    /// </summary>
+    class FlushCommandMarshaller : BaseCommandMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new FlushCommand();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return FlushCommand.ID_FLUSHCOMMAND;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+
+            return rc + 0;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/IntegerResponseMarshaller.cs b/src/main/csharp/OpenWire/V10/IntegerResponseMarshaller.cs
new file mode 100644
index 0000000..c29e458
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/IntegerResponseMarshaller.cs
@@ -0,0 +1,112 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for IntegerResponse
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for IntegerResponse
+    /// </summary>
+    class IntegerResponseMarshaller : ResponseMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new IntegerResponse();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return IntegerResponse.ID_INTEGERRESPONSE;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            IntegerResponse info = (IntegerResponse)o;
+            info.Result = dataIn.ReadInt32();
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+
+            return rc + 4;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            IntegerResponse info = (IntegerResponse)o;
+            dataOut.Write(info.Result);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            IntegerResponse info = (IntegerResponse)o;
+            info.Result = dataIn.ReadInt32();
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            IntegerResponse info = (IntegerResponse)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            dataOut.Write(info.Result);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/JournalQueueAckMarshaller.cs b/src/main/csharp/OpenWire/V10/JournalQueueAckMarshaller.cs
new file mode 100644
index 0000000..22b72e2
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/JournalQueueAckMarshaller.cs
@@ -0,0 +1,119 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for JournalQueueAck
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for JournalQueueAck
+    /// </summary>
+    class JournalQueueAckMarshaller : BaseDataStreamMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new JournalQueueAck();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return JournalQueueAck.ID_JOURNALQUEUEACK;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            JournalQueueAck info = (JournalQueueAck)o;
+            info.Destination = (ActiveMQDestination) TightUnmarshalNestedObject(wireFormat, dataIn, bs);
+            info.MessageAck = (MessageAck) TightUnmarshalNestedObject(wireFormat, dataIn, bs);
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+            JournalQueueAck info = (JournalQueueAck)o;
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+        rc += TightMarshalNestedObject1(wireFormat, (DataStructure)info.Destination, bs);
+        rc += TightMarshalNestedObject1(wireFormat, (DataStructure)info.MessageAck, bs);
+
+            return rc + 0;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            JournalQueueAck info = (JournalQueueAck)o;
+            TightMarshalNestedObject2(wireFormat, (DataStructure)info.Destination, dataOut, bs);
+            TightMarshalNestedObject2(wireFormat, (DataStructure)info.MessageAck, dataOut, bs);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            JournalQueueAck info = (JournalQueueAck)o;
+            info.Destination = (ActiveMQDestination) LooseUnmarshalNestedObject(wireFormat, dataIn);
+            info.MessageAck = (MessageAck) LooseUnmarshalNestedObject(wireFormat, dataIn);
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            JournalQueueAck info = (JournalQueueAck)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            LooseMarshalNestedObject(wireFormat, (DataStructure)info.Destination, dataOut);
+            LooseMarshalNestedObject(wireFormat, (DataStructure)info.MessageAck, dataOut);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/JournalTopicAckMarshaller.cs b/src/main/csharp/OpenWire/V10/JournalTopicAckMarshaller.cs
new file mode 100644
index 0000000..bfdfad5
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/JournalTopicAckMarshaller.cs
@@ -0,0 +1,139 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for JournalTopicAck
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for JournalTopicAck
+    /// </summary>
+    class JournalTopicAckMarshaller : BaseDataStreamMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new JournalTopicAck();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return JournalTopicAck.ID_JOURNALTOPICACK;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            JournalTopicAck info = (JournalTopicAck)o;
+            info.Destination = (ActiveMQDestination) TightUnmarshalNestedObject(wireFormat, dataIn, bs);
+            info.MessageId = (MessageId) TightUnmarshalNestedObject(wireFormat, dataIn, bs);
+            info.MessageSequenceId = TightUnmarshalLong(wireFormat, dataIn, bs);
+            info.SubscritionName = TightUnmarshalString(dataIn, bs);
+            info.ClientId = TightUnmarshalString(dataIn, bs);
+            info.TransactionId = (TransactionId) TightUnmarshalNestedObject(wireFormat, dataIn, bs);
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+            JournalTopicAck info = (JournalTopicAck)o;
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+        rc += TightMarshalNestedObject1(wireFormat, (DataStructure)info.Destination, bs);
+        rc += TightMarshalNestedObject1(wireFormat, (DataStructure)info.MessageId, bs);
+            rc += TightMarshalLong1(wireFormat, info.MessageSequenceId, bs);
+            rc += TightMarshalString1(info.SubscritionName, bs);
+            rc += TightMarshalString1(info.ClientId, bs);
+        rc += TightMarshalNestedObject1(wireFormat, (DataStructure)info.TransactionId, bs);
+
+            return rc + 0;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            JournalTopicAck info = (JournalTopicAck)o;
+            TightMarshalNestedObject2(wireFormat, (DataStructure)info.Destination, dataOut, bs);
+            TightMarshalNestedObject2(wireFormat, (DataStructure)info.MessageId, dataOut, bs);
+            TightMarshalLong2(wireFormat, info.MessageSequenceId, dataOut, bs);
+            TightMarshalString2(info.SubscritionName, dataOut, bs);
+            TightMarshalString2(info.ClientId, dataOut, bs);
+            TightMarshalNestedObject2(wireFormat, (DataStructure)info.TransactionId, dataOut, bs);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            JournalTopicAck info = (JournalTopicAck)o;
+            info.Destination = (ActiveMQDestination) LooseUnmarshalNestedObject(wireFormat, dataIn);
+            info.MessageId = (MessageId) LooseUnmarshalNestedObject(wireFormat, dataIn);
+            info.MessageSequenceId = LooseUnmarshalLong(wireFormat, dataIn);
+            info.SubscritionName = LooseUnmarshalString(dataIn);
+            info.ClientId = LooseUnmarshalString(dataIn);
+            info.TransactionId = (TransactionId) LooseUnmarshalNestedObject(wireFormat, dataIn);
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            JournalTopicAck info = (JournalTopicAck)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            LooseMarshalNestedObject(wireFormat, (DataStructure)info.Destination, dataOut);
+            LooseMarshalNestedObject(wireFormat, (DataStructure)info.MessageId, dataOut);
+            LooseMarshalLong(wireFormat, info.MessageSequenceId, dataOut);
+            LooseMarshalString(info.SubscritionName, dataOut);
+            LooseMarshalString(info.ClientId, dataOut);
+            LooseMarshalNestedObject(wireFormat, (DataStructure)info.TransactionId, dataOut);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/JournalTraceMarshaller.cs b/src/main/csharp/OpenWire/V10/JournalTraceMarshaller.cs
new file mode 100644
index 0000000..073c9c9
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/JournalTraceMarshaller.cs
@@ -0,0 +1,114 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for JournalTrace
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for JournalTrace
+    /// </summary>
+    class JournalTraceMarshaller : BaseDataStreamMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new JournalTrace();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return JournalTrace.ID_JOURNALTRACE;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            JournalTrace info = (JournalTrace)o;
+            info.Message = TightUnmarshalString(dataIn, bs);
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+            JournalTrace info = (JournalTrace)o;
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+            rc += TightMarshalString1(info.Message, bs);
+
+            return rc + 0;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            JournalTrace info = (JournalTrace)o;
+            TightMarshalString2(info.Message, dataOut, bs);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            JournalTrace info = (JournalTrace)o;
+            info.Message = LooseUnmarshalString(dataIn);
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            JournalTrace info = (JournalTrace)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            LooseMarshalString(info.Message, dataOut);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/JournalTransactionMarshaller.cs b/src/main/csharp/OpenWire/V10/JournalTransactionMarshaller.cs
new file mode 100644
index 0000000..d9e64b0
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/JournalTransactionMarshaller.cs
@@ -0,0 +1,123 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for JournalTransaction
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for JournalTransaction
+    /// </summary>
+    class JournalTransactionMarshaller : BaseDataStreamMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new JournalTransaction();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return JournalTransaction.ID_JOURNALTRANSACTION;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            JournalTransaction info = (JournalTransaction)o;
+            info.TransactionId = (TransactionId) TightUnmarshalNestedObject(wireFormat, dataIn, bs);
+            info.Type = dataIn.ReadByte();
+            info.WasPrepared = bs.ReadBoolean();
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+            JournalTransaction info = (JournalTransaction)o;
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+        rc += TightMarshalNestedObject1(wireFormat, (DataStructure)info.TransactionId, bs);
+            bs.WriteBoolean(info.WasPrepared);
+
+            return rc + 1;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            JournalTransaction info = (JournalTransaction)o;
+            TightMarshalNestedObject2(wireFormat, (DataStructure)info.TransactionId, dataOut, bs);
+            dataOut.Write(info.Type);
+            bs.ReadBoolean();
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            JournalTransaction info = (JournalTransaction)o;
+            info.TransactionId = (TransactionId) LooseUnmarshalNestedObject(wireFormat, dataIn);
+            info.Type = dataIn.ReadByte();
+            info.WasPrepared = dataIn.ReadBoolean();
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            JournalTransaction info = (JournalTransaction)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            LooseMarshalNestedObject(wireFormat, (DataStructure)info.TransactionId, dataOut);
+            dataOut.Write(info.Type);
+            dataOut.Write(info.WasPrepared);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/KeepAliveInfoMarshaller.cs b/src/main/csharp/OpenWire/V10/KeepAliveInfoMarshaller.cs
new file mode 100644
index 0000000..e41b894
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/KeepAliveInfoMarshaller.cs
@@ -0,0 +1,100 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for KeepAliveInfo
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for KeepAliveInfo
+    /// </summary>
+    class KeepAliveInfoMarshaller : BaseCommandMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new KeepAliveInfo();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return KeepAliveInfo.ID_KEEPALIVEINFO;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+
+            return rc + 0;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/LastPartialCommandMarshaller.cs b/src/main/csharp/OpenWire/V10/LastPartialCommandMarshaller.cs
new file mode 100644
index 0000000..fd1bee4
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/LastPartialCommandMarshaller.cs
@@ -0,0 +1,100 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for LastPartialCommand
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for LastPartialCommand
+    /// </summary>
+    class LastPartialCommandMarshaller : PartialCommandMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new LastPartialCommand();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return LastPartialCommand.ID_LASTPARTIALCOMMAND;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+
+            return rc + 0;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/LocalTransactionIdMarshaller.cs b/src/main/csharp/OpenWire/V10/LocalTransactionIdMarshaller.cs
new file mode 100644
index 0000000..d1a5bdd
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/LocalTransactionIdMarshaller.cs
@@ -0,0 +1,119 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for LocalTransactionId
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for LocalTransactionId
+    /// </summary>
+    class LocalTransactionIdMarshaller : TransactionIdMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new LocalTransactionId();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return LocalTransactionId.ID_LOCALTRANSACTIONID;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            LocalTransactionId info = (LocalTransactionId)o;
+            info.Value = TightUnmarshalLong(wireFormat, dataIn, bs);
+            info.ConnectionId = (ConnectionId) TightUnmarshalCachedObject(wireFormat, dataIn, bs);
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+            LocalTransactionId info = (LocalTransactionId)o;
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+            rc += TightMarshalLong1(wireFormat, info.Value, bs);
+            rc += TightMarshalCachedObject1(wireFormat, (DataStructure)info.ConnectionId, bs);
+
+            return rc + 0;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            LocalTransactionId info = (LocalTransactionId)o;
+            TightMarshalLong2(wireFormat, info.Value, dataOut, bs);
+            TightMarshalCachedObject2(wireFormat, (DataStructure)info.ConnectionId, dataOut, bs);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            LocalTransactionId info = (LocalTransactionId)o;
+            info.Value = LooseUnmarshalLong(wireFormat, dataIn);
+            info.ConnectionId = (ConnectionId) LooseUnmarshalCachedObject(wireFormat, dataIn);
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            LocalTransactionId info = (LocalTransactionId)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            LooseMarshalLong(wireFormat, info.Value, dataOut);
+            LooseMarshalCachedObject(wireFormat, (DataStructure)info.ConnectionId, dataOut);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/MarshallerFactory.cs b/src/main/csharp/OpenWire/V10/MarshallerFactory.cs
new file mode 100644
index 0000000..b582f0a
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/MarshallerFactory.cs
@@ -0,0 +1,101 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ *
+ *  MarshallerFactory code for OpenWire Protocol Version 10
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Used to create marshallers for a specific version of the OpenWire protocol.
+    ///  Each non-abstract DataStructure object has a registered Marshaller that is
+    ///  created and added to the OpenWireFormat objects format collection.
+    /// </summary>
+    public class MarshallerFactory : IMarshallerFactory
+    {
+        /// <summery>
+        ///  Adds the Marshallers for this version of the OpenWire protocol to the 
+        ///  Collection of Marshallers stored in the OpenWireFormat class.
+        /// </summery>
+        public void configure(OpenWireFormat format) 
+        {
+            format.clearMarshallers();
+            format.addMarshaller(new ActiveMQBlobMessageMarshaller());
+            format.addMarshaller(new ActiveMQBytesMessageMarshaller());
+            format.addMarshaller(new ActiveMQMapMessageMarshaller());
+            format.addMarshaller(new ActiveMQMessageMarshaller());
+            format.addMarshaller(new ActiveMQObjectMessageMarshaller());
+            format.addMarshaller(new ActiveMQQueueMarshaller());
+            format.addMarshaller(new ActiveMQStreamMessageMarshaller());
+            format.addMarshaller(new ActiveMQTempQueueMarshaller());
+            format.addMarshaller(new ActiveMQTempTopicMarshaller());
+            format.addMarshaller(new ActiveMQTextMessageMarshaller());
+            format.addMarshaller(new ActiveMQTopicMarshaller());
+            format.addMarshaller(new BrokerIdMarshaller());
+            format.addMarshaller(new BrokerInfoMarshaller());
+            format.addMarshaller(new ConnectionControlMarshaller());
+            format.addMarshaller(new ConnectionErrorMarshaller());
+            format.addMarshaller(new ConnectionIdMarshaller());
+            format.addMarshaller(new ConnectionInfoMarshaller());
+            format.addMarshaller(new ConsumerControlMarshaller());
+            format.addMarshaller(new ConsumerIdMarshaller());
+            format.addMarshaller(new ConsumerInfoMarshaller());
+            format.addMarshaller(new ControlCommandMarshaller());
+            format.addMarshaller(new DataArrayResponseMarshaller());
+            format.addMarshaller(new DataResponseMarshaller());
+            format.addMarshaller(new DestinationInfoMarshaller());
+            format.addMarshaller(new DiscoveryEventMarshaller());
+            format.addMarshaller(new ExceptionResponseMarshaller());
+            format.addMarshaller(new FlushCommandMarshaller());
+            format.addMarshaller(new IntegerResponseMarshaller());
+            format.addMarshaller(new JournalQueueAckMarshaller());
+            format.addMarshaller(new JournalTopicAckMarshaller());
+            format.addMarshaller(new JournalTraceMarshaller());
+            format.addMarshaller(new JournalTransactionMarshaller());
+            format.addMarshaller(new KeepAliveInfoMarshaller());
+            format.addMarshaller(new LastPartialCommandMarshaller());
+            format.addMarshaller(new LocalTransactionIdMarshaller());
+            format.addMarshaller(new MessageAckMarshaller());
+            format.addMarshaller(new MessageDispatchMarshaller());
+            format.addMarshaller(new MessageDispatchNotificationMarshaller());
+            format.addMarshaller(new MessageIdMarshaller());
+            format.addMarshaller(new MessagePullMarshaller());
+            format.addMarshaller(new NetworkBridgeFilterMarshaller());
+            format.addMarshaller(new PartialCommandMarshaller());
+            format.addMarshaller(new ProducerAckMarshaller());
+            format.addMarshaller(new ProducerIdMarshaller());
+            format.addMarshaller(new ProducerInfoMarshaller());
+            format.addMarshaller(new RemoveInfoMarshaller());
+            format.addMarshaller(new RemoveSubscriptionInfoMarshaller());
+            format.addMarshaller(new ReplayCommandMarshaller());
+            format.addMarshaller(new ResponseMarshaller());
+            format.addMarshaller(new SessionIdMarshaller());
+            format.addMarshaller(new SessionInfoMarshaller());
+            format.addMarshaller(new ShutdownInfoMarshaller());
+            format.addMarshaller(new SubscriptionInfoMarshaller());
+            format.addMarshaller(new TransactionInfoMarshaller());
+            format.addMarshaller(new WireFormatInfoMarshaller());
+            format.addMarshaller(new XATransactionIdMarshaller());
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/MessageAckMarshaller.cs b/src/main/csharp/OpenWire/V10/MessageAckMarshaller.cs
new file mode 100644
index 0000000..47c0963
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/MessageAckMarshaller.cs
@@ -0,0 +1,147 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for MessageAck
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for MessageAck
+    /// </summary>
+    class MessageAckMarshaller : BaseCommandMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new MessageAck();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return MessageAck.ID_MESSAGEACK;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            MessageAck info = (MessageAck)o;
+            info.Destination = (ActiveMQDestination) TightUnmarshalCachedObject(wireFormat, dataIn, bs);
+            info.TransactionId = (TransactionId) TightUnmarshalCachedObject(wireFormat, dataIn, bs);
+            info.ConsumerId = (ConsumerId) TightUnmarshalCachedObject(wireFormat, dataIn, bs);
+            info.AckType = dataIn.ReadByte();
+            info.FirstMessageId = (MessageId) TightUnmarshalNestedObject(wireFormat, dataIn, bs);
+            info.LastMessageId = (MessageId) TightUnmarshalNestedObject(wireFormat, dataIn, bs);
+            info.MessageCount = dataIn.ReadInt32();
+            info.PoisonCause = TightUnmarshalBrokerError(wireFormat, dataIn, bs);
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+            MessageAck info = (MessageAck)o;
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+            rc += TightMarshalCachedObject1(wireFormat, (DataStructure)info.Destination, bs);
+            rc += TightMarshalCachedObject1(wireFormat, (DataStructure)info.TransactionId, bs);
+            rc += TightMarshalCachedObject1(wireFormat, (DataStructure)info.ConsumerId, bs);
+        rc += TightMarshalNestedObject1(wireFormat, (DataStructure)info.FirstMessageId, bs);
+        rc += TightMarshalNestedObject1(wireFormat, (DataStructure)info.LastMessageId, bs);
+            rc += TightMarshalBrokerError1(wireFormat, info.PoisonCause, bs);
+
+            return rc + 5;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            MessageAck info = (MessageAck)o;
+            TightMarshalCachedObject2(wireFormat, (DataStructure)info.Destination, dataOut, bs);
+            TightMarshalCachedObject2(wireFormat, (DataStructure)info.TransactionId, dataOut, bs);
+            TightMarshalCachedObject2(wireFormat, (DataStructure)info.ConsumerId, dataOut, bs);
+            dataOut.Write(info.AckType);
+            TightMarshalNestedObject2(wireFormat, (DataStructure)info.FirstMessageId, dataOut, bs);
+            TightMarshalNestedObject2(wireFormat, (DataStructure)info.LastMessageId, dataOut, bs);
+            dataOut.Write(info.MessageCount);
+            TightMarshalBrokerError2(wireFormat, info.PoisonCause, dataOut, bs);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            MessageAck info = (MessageAck)o;
+            info.Destination = (ActiveMQDestination) LooseUnmarshalCachedObject(wireFormat, dataIn);
+            info.TransactionId = (TransactionId) LooseUnmarshalCachedObject(wireFormat, dataIn);
+            info.ConsumerId = (ConsumerId) LooseUnmarshalCachedObject(wireFormat, dataIn);
+            info.AckType = dataIn.ReadByte();
+            info.FirstMessageId = (MessageId) LooseUnmarshalNestedObject(wireFormat, dataIn);
+            info.LastMessageId = (MessageId) LooseUnmarshalNestedObject(wireFormat, dataIn);
+            info.MessageCount = dataIn.ReadInt32();
+            info.PoisonCause = LooseUnmarshalBrokerError(wireFormat, dataIn);
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            MessageAck info = (MessageAck)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            LooseMarshalCachedObject(wireFormat, (DataStructure)info.Destination, dataOut);
+            LooseMarshalCachedObject(wireFormat, (DataStructure)info.TransactionId, dataOut);
+            LooseMarshalCachedObject(wireFormat, (DataStructure)info.ConsumerId, dataOut);
+            dataOut.Write(info.AckType);
+            LooseMarshalNestedObject(wireFormat, (DataStructure)info.FirstMessageId, dataOut);
+            LooseMarshalNestedObject(wireFormat, (DataStructure)info.LastMessageId, dataOut);
+            dataOut.Write(info.MessageCount);
+            LooseMarshalBrokerError(wireFormat, info.PoisonCause, dataOut);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/MessageDispatchMarshaller.cs b/src/main/csharp/OpenWire/V10/MessageDispatchMarshaller.cs
new file mode 100644
index 0000000..75dad06
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/MessageDispatchMarshaller.cs
@@ -0,0 +1,128 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for MessageDispatch
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for MessageDispatch
+    /// </summary>
+    class MessageDispatchMarshaller : BaseCommandMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new MessageDispatch();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return MessageDispatch.ID_MESSAGEDISPATCH;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            MessageDispatch info = (MessageDispatch)o;
+            info.ConsumerId = (ConsumerId) TightUnmarshalCachedObject(wireFormat, dataIn, bs);
+            info.Destination = (ActiveMQDestination) TightUnmarshalCachedObject(wireFormat, dataIn, bs);
+            info.Message = (Message) TightUnmarshalNestedObject(wireFormat, dataIn, bs);
+            info.RedeliveryCounter = dataIn.ReadInt32();
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+            MessageDispatch info = (MessageDispatch)o;
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+            rc += TightMarshalCachedObject1(wireFormat, (DataStructure)info.ConsumerId, bs);
+            rc += TightMarshalCachedObject1(wireFormat, (DataStructure)info.Destination, bs);
+        rc += TightMarshalNestedObject1(wireFormat, (DataStructure)info.Message, bs);
+
+            return rc + 4;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            MessageDispatch info = (MessageDispatch)o;
+            TightMarshalCachedObject2(wireFormat, (DataStructure)info.ConsumerId, dataOut, bs);
+            TightMarshalCachedObject2(wireFormat, (DataStructure)info.Destination, dataOut, bs);
+            TightMarshalNestedObject2(wireFormat, (DataStructure)info.Message, dataOut, bs);
+            dataOut.Write(info.RedeliveryCounter);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            MessageDispatch info = (MessageDispatch)o;
+            info.ConsumerId = (ConsumerId) LooseUnmarshalCachedObject(wireFormat, dataIn);
+            info.Destination = (ActiveMQDestination) LooseUnmarshalCachedObject(wireFormat, dataIn);
+            info.Message = (Message) LooseUnmarshalNestedObject(wireFormat, dataIn);
+            info.RedeliveryCounter = dataIn.ReadInt32();
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            MessageDispatch info = (MessageDispatch)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            LooseMarshalCachedObject(wireFormat, (DataStructure)info.ConsumerId, dataOut);
+            LooseMarshalCachedObject(wireFormat, (DataStructure)info.Destination, dataOut);
+            LooseMarshalNestedObject(wireFormat, (DataStructure)info.Message, dataOut);
+            dataOut.Write(info.RedeliveryCounter);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/MessageDispatchNotificationMarshaller.cs b/src/main/csharp/OpenWire/V10/MessageDispatchNotificationMarshaller.cs
new file mode 100644
index 0000000..0d20036
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/MessageDispatchNotificationMarshaller.cs
@@ -0,0 +1,129 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for MessageDispatchNotification
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for MessageDispatchNotification
+    /// </summary>
+    class MessageDispatchNotificationMarshaller : BaseCommandMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new MessageDispatchNotification();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return MessageDispatchNotification.ID_MESSAGEDISPATCHNOTIFICATION;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            MessageDispatchNotification info = (MessageDispatchNotification)o;
+            info.ConsumerId = (ConsumerId) TightUnmarshalCachedObject(wireFormat, dataIn, bs);
+            info.Destination = (ActiveMQDestination) TightUnmarshalCachedObject(wireFormat, dataIn, bs);
+            info.DeliverySequenceId = TightUnmarshalLong(wireFormat, dataIn, bs);
+            info.MessageId = (MessageId) TightUnmarshalNestedObject(wireFormat, dataIn, bs);
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+            MessageDispatchNotification info = (MessageDispatchNotification)o;
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+            rc += TightMarshalCachedObject1(wireFormat, (DataStructure)info.ConsumerId, bs);
+            rc += TightMarshalCachedObject1(wireFormat, (DataStructure)info.Destination, bs);
+            rc += TightMarshalLong1(wireFormat, info.DeliverySequenceId, bs);
+        rc += TightMarshalNestedObject1(wireFormat, (DataStructure)info.MessageId, bs);
+
+            return rc + 0;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            MessageDispatchNotification info = (MessageDispatchNotification)o;
+            TightMarshalCachedObject2(wireFormat, (DataStructure)info.ConsumerId, dataOut, bs);
+            TightMarshalCachedObject2(wireFormat, (DataStructure)info.Destination, dataOut, bs);
+            TightMarshalLong2(wireFormat, info.DeliverySequenceId, dataOut, bs);
+            TightMarshalNestedObject2(wireFormat, (DataStructure)info.MessageId, dataOut, bs);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            MessageDispatchNotification info = (MessageDispatchNotification)o;
+            info.ConsumerId = (ConsumerId) LooseUnmarshalCachedObject(wireFormat, dataIn);
+            info.Destination = (ActiveMQDestination) LooseUnmarshalCachedObject(wireFormat, dataIn);
+            info.DeliverySequenceId = LooseUnmarshalLong(wireFormat, dataIn);
+            info.MessageId = (MessageId) LooseUnmarshalNestedObject(wireFormat, dataIn);
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            MessageDispatchNotification info = (MessageDispatchNotification)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            LooseMarshalCachedObject(wireFormat, (DataStructure)info.ConsumerId, dataOut);
+            LooseMarshalCachedObject(wireFormat, (DataStructure)info.Destination, dataOut);
+            LooseMarshalLong(wireFormat, info.DeliverySequenceId, dataOut);
+            LooseMarshalNestedObject(wireFormat, (DataStructure)info.MessageId, dataOut);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/MessageIdMarshaller.cs b/src/main/csharp/OpenWire/V10/MessageIdMarshaller.cs
new file mode 100644
index 0000000..fba3d11
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/MessageIdMarshaller.cs
@@ -0,0 +1,129 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for MessageId
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for MessageId
+    /// </summary>
+    class MessageIdMarshaller : BaseDataStreamMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new MessageId();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return MessageId.ID_MESSAGEID;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            MessageId info = (MessageId)o;
+            info.TextView = TightUnmarshalString(dataIn, bs);
+            info.ProducerId = (ProducerId) TightUnmarshalCachedObject(wireFormat, dataIn, bs);
+            info.ProducerSequenceId = TightUnmarshalLong(wireFormat, dataIn, bs);
+            info.BrokerSequenceId = TightUnmarshalLong(wireFormat, dataIn, bs);
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+            MessageId info = (MessageId)o;
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+            rc += TightMarshalString1(info.TextView, bs);
+            rc += TightMarshalCachedObject1(wireFormat, (DataStructure)info.ProducerId, bs);
+            rc += TightMarshalLong1(wireFormat, info.ProducerSequenceId, bs);
+            rc += TightMarshalLong1(wireFormat, info.BrokerSequenceId, bs);
+
+            return rc + 0;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            MessageId info = (MessageId)o;
+            TightMarshalString2(info.TextView, dataOut, bs);
+            TightMarshalCachedObject2(wireFormat, (DataStructure)info.ProducerId, dataOut, bs);
+            TightMarshalLong2(wireFormat, info.ProducerSequenceId, dataOut, bs);
+            TightMarshalLong2(wireFormat, info.BrokerSequenceId, dataOut, bs);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            MessageId info = (MessageId)o;
+            info.TextView = LooseUnmarshalString(dataIn);
+            info.ProducerId = (ProducerId) LooseUnmarshalCachedObject(wireFormat, dataIn);
+            info.ProducerSequenceId = LooseUnmarshalLong(wireFormat, dataIn);
+            info.BrokerSequenceId = LooseUnmarshalLong(wireFormat, dataIn);
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            MessageId info = (MessageId)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            LooseMarshalString(info.TextView, dataOut);
+            LooseMarshalCachedObject(wireFormat, (DataStructure)info.ProducerId, dataOut);
+            LooseMarshalLong(wireFormat, info.ProducerSequenceId, dataOut);
+            LooseMarshalLong(wireFormat, info.BrokerSequenceId, dataOut);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/MessageMarshaller.cs b/src/main/csharp/OpenWire/V10/MessageMarshaller.cs
new file mode 100644
index 0000000..291c076
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/MessageMarshaller.cs
@@ -0,0 +1,301 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for Message
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for Message
+    /// </summary>
+    abstract class MessageMarshaller : BaseCommandMarshaller
+    {
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            Message info = (Message)o;
+            info.ProducerId = (ProducerId) TightUnmarshalCachedObject(wireFormat, dataIn, bs);
+            info.Destination = (ActiveMQDestination) TightUnmarshalCachedObject(wireFormat, dataIn, bs);
+            info.TransactionId = (TransactionId) TightUnmarshalCachedObject(wireFormat, dataIn, bs);
+            info.OriginalDestination = (ActiveMQDestination) TightUnmarshalCachedObject(wireFormat, dataIn, bs);
+            info.MessageId = (MessageId) TightUnmarshalNestedObject(wireFormat, dataIn, bs);
+            info.OriginalTransactionId = (TransactionId) TightUnmarshalCachedObject(wireFormat, dataIn, bs);
+            info.GroupID = TightUnmarshalString(dataIn, bs);
+            info.GroupSequence = dataIn.ReadInt32();
+            info.CorrelationId = TightUnmarshalString(dataIn, bs);
+            info.Persistent = bs.ReadBoolean();
+            info.Expiration = TightUnmarshalLong(wireFormat, dataIn, bs);
+            info.Priority = dataIn.ReadByte();
+            info.ReplyTo = (ActiveMQDestination) TightUnmarshalNestedObject(wireFormat, dataIn, bs);
+            info.Timestamp = TightUnmarshalLong(wireFormat, dataIn, bs);
+            info.Type = TightUnmarshalString(dataIn, bs);
+            info.Content = ReadBytes(dataIn, bs.ReadBoolean());
+            info.MarshalledProperties = ReadBytes(dataIn, bs.ReadBoolean());
+            info.DataStructure = (DataStructure) TightUnmarshalNestedObject(wireFormat, dataIn, bs);
+            info.TargetConsumerId = (ConsumerId) TightUnmarshalCachedObject(wireFormat, dataIn, bs);
+            info.Compressed = bs.ReadBoolean();
+            info.RedeliveryCounter = dataIn.ReadInt32();
+
+            if (bs.ReadBoolean()) {
+                short size = dataIn.ReadInt16();
+                BrokerId[] value = new BrokerId[size];
+                for( int i=0; i < size; i++ ) {
+                    value[i] = (BrokerId) TightUnmarshalNestedObject(wireFormat,dataIn, bs);
+                }
+                info.BrokerPath = value;
+            }
+            else {
+                info.BrokerPath = null;
+            }
+            info.Arrival = TightUnmarshalLong(wireFormat, dataIn, bs);
+            info.UserID = TightUnmarshalString(dataIn, bs);
+            info.RecievedByDFBridge = bs.ReadBoolean();
+            info.Droppable = bs.ReadBoolean();
+
+            if (bs.ReadBoolean()) {
+                short size = dataIn.ReadInt16();
+                BrokerId[] value = new BrokerId[size];
+                for( int i=0; i < size; i++ ) {
+                    value[i] = (BrokerId) TightUnmarshalNestedObject(wireFormat,dataIn, bs);
+                }
+                info.Cluster = value;
+            }
+            else {
+                info.Cluster = null;
+            }
+            info.BrokerInTime = TightUnmarshalLong(wireFormat, dataIn, bs);
+            info.BrokerOutTime = TightUnmarshalLong(wireFormat, dataIn, bs);
+            info.JMSXGroupFirstForConsumer = bs.ReadBoolean();
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+            Message info = (Message)o;
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+            rc += TightMarshalCachedObject1(wireFormat, (DataStructure)info.ProducerId, bs);
+            rc += TightMarshalCachedObject1(wireFormat, (DataStructure)info.Destination, bs);
+            rc += TightMarshalCachedObject1(wireFormat, (DataStructure)info.TransactionId, bs);
+            rc += TightMarshalCachedObject1(wireFormat, (DataStructure)info.OriginalDestination, bs);
+        rc += TightMarshalNestedObject1(wireFormat, (DataStructure)info.MessageId, bs);
+            rc += TightMarshalCachedObject1(wireFormat, (DataStructure)info.OriginalTransactionId, bs);
+            rc += TightMarshalString1(info.GroupID, bs);
+            rc += TightMarshalString1(info.CorrelationId, bs);
+            bs.WriteBoolean(info.Persistent);
+            rc += TightMarshalLong1(wireFormat, info.Expiration, bs);
+        rc += TightMarshalNestedObject1(wireFormat, (DataStructure)info.ReplyTo, bs);
+            rc += TightMarshalLong1(wireFormat, info.Timestamp, bs);
+            rc += TightMarshalString1(info.Type, bs);
+            bs.WriteBoolean(info.Content!=null);
+            rc += info.Content==null ? 0 : info.Content.Length+4;
+            bs.WriteBoolean(info.MarshalledProperties!=null);
+            rc += info.MarshalledProperties==null ? 0 : info.MarshalledProperties.Length+4;
+        rc += TightMarshalNestedObject1(wireFormat, (DataStructure)info.DataStructure, bs);
+            rc += TightMarshalCachedObject1(wireFormat, (DataStructure)info.TargetConsumerId, bs);
+            bs.WriteBoolean(info.Compressed);
+            rc += TightMarshalObjectArray1(wireFormat, info.BrokerPath, bs);
+            rc += TightMarshalLong1(wireFormat, info.Arrival, bs);
+            rc += TightMarshalString1(info.UserID, bs);
+            bs.WriteBoolean(info.RecievedByDFBridge);
+            bs.WriteBoolean(info.Droppable);
+            rc += TightMarshalObjectArray1(wireFormat, info.Cluster, bs);
+            rc += TightMarshalLong1(wireFormat, info.BrokerInTime, bs);
+            rc += TightMarshalLong1(wireFormat, info.BrokerOutTime, bs);
+            bs.WriteBoolean(info.JMSXGroupFirstForConsumer);
+
+            return rc + 9;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            Message info = (Message)o;
+            TightMarshalCachedObject2(wireFormat, (DataStructure)info.ProducerId, dataOut, bs);
+            TightMarshalCachedObject2(wireFormat, (DataStructure)info.Destination, dataOut, bs);
+            TightMarshalCachedObject2(wireFormat, (DataStructure)info.TransactionId, dataOut, bs);
+            TightMarshalCachedObject2(wireFormat, (DataStructure)info.OriginalDestination, dataOut, bs);
+            TightMarshalNestedObject2(wireFormat, (DataStructure)info.MessageId, dataOut, bs);
+            TightMarshalCachedObject2(wireFormat, (DataStructure)info.OriginalTransactionId, dataOut, bs);
+            TightMarshalString2(info.GroupID, dataOut, bs);
+            dataOut.Write(info.GroupSequence);
+            TightMarshalString2(info.CorrelationId, dataOut, bs);
+            bs.ReadBoolean();
+            TightMarshalLong2(wireFormat, info.Expiration, dataOut, bs);
+            dataOut.Write(info.Priority);
+            TightMarshalNestedObject2(wireFormat, (DataStructure)info.ReplyTo, dataOut, bs);
+            TightMarshalLong2(wireFormat, info.Timestamp, dataOut, bs);
+            TightMarshalString2(info.Type, dataOut, bs);
+            if(bs.ReadBoolean()) {
+                dataOut.Write(info.Content.Length);
+                dataOut.Write(info.Content);
+            }
+            if(bs.ReadBoolean()) {
+                dataOut.Write(info.MarshalledProperties.Length);
+                dataOut.Write(info.MarshalledProperties);
+            }
+            TightMarshalNestedObject2(wireFormat, (DataStructure)info.DataStructure, dataOut, bs);
+            TightMarshalCachedObject2(wireFormat, (DataStructure)info.TargetConsumerId, dataOut, bs);
+            bs.ReadBoolean();
+            dataOut.Write(info.RedeliveryCounter);
+            TightMarshalObjectArray2(wireFormat, info.BrokerPath, dataOut, bs);
+            TightMarshalLong2(wireFormat, info.Arrival, dataOut, bs);
+            TightMarshalString2(info.UserID, dataOut, bs);
+            bs.ReadBoolean();
+            bs.ReadBoolean();
+            TightMarshalObjectArray2(wireFormat, info.Cluster, dataOut, bs);
+            TightMarshalLong2(wireFormat, info.BrokerInTime, dataOut, bs);
+            TightMarshalLong2(wireFormat, info.BrokerOutTime, dataOut, bs);
+            bs.ReadBoolean();
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            Message info = (Message)o;
+            info.ProducerId = (ProducerId) LooseUnmarshalCachedObject(wireFormat, dataIn);
+            info.Destination = (ActiveMQDestination) LooseUnmarshalCachedObject(wireFormat, dataIn);
+            info.TransactionId = (TransactionId) LooseUnmarshalCachedObject(wireFormat, dataIn);
+            info.OriginalDestination = (ActiveMQDestination) LooseUnmarshalCachedObject(wireFormat, dataIn);
+            info.MessageId = (MessageId) LooseUnmarshalNestedObject(wireFormat, dataIn);
+            info.OriginalTransactionId = (TransactionId) LooseUnmarshalCachedObject(wireFormat, dataIn);
+            info.GroupID = LooseUnmarshalString(dataIn);
+            info.GroupSequence = dataIn.ReadInt32();
+            info.CorrelationId = LooseUnmarshalString(dataIn);
+            info.Persistent = dataIn.ReadBoolean();
+            info.Expiration = LooseUnmarshalLong(wireFormat, dataIn);
+            info.Priority = dataIn.ReadByte();
+            info.ReplyTo = (ActiveMQDestination) LooseUnmarshalNestedObject(wireFormat, dataIn);
+            info.Timestamp = LooseUnmarshalLong(wireFormat, dataIn);
+            info.Type = LooseUnmarshalString(dataIn);
+            info.Content = ReadBytes(dataIn, dataIn.ReadBoolean());
+            info.MarshalledProperties = ReadBytes(dataIn, dataIn.ReadBoolean());
+            info.DataStructure = (DataStructure) LooseUnmarshalNestedObject(wireFormat, dataIn);
+            info.TargetConsumerId = (ConsumerId) LooseUnmarshalCachedObject(wireFormat, dataIn);
+            info.Compressed = dataIn.ReadBoolean();
+            info.RedeliveryCounter = dataIn.ReadInt32();
+
+            if (dataIn.ReadBoolean()) {
+                short size = dataIn.ReadInt16();
+                BrokerId[] value = new BrokerId[size];
+                for( int i=0; i < size; i++ ) {
+                    value[i] = (BrokerId) LooseUnmarshalNestedObject(wireFormat,dataIn);
+                }
+                info.BrokerPath = value;
+            }
+            else {
+                info.BrokerPath = null;
+            }
+            info.Arrival = LooseUnmarshalLong(wireFormat, dataIn);
+            info.UserID = LooseUnmarshalString(dataIn);
+            info.RecievedByDFBridge = dataIn.ReadBoolean();
+            info.Droppable = dataIn.ReadBoolean();
+
+            if (dataIn.ReadBoolean()) {
+                short size = dataIn.ReadInt16();
+                BrokerId[] value = new BrokerId[size];
+                for( int i=0; i < size; i++ ) {
+                    value[i] = (BrokerId) LooseUnmarshalNestedObject(wireFormat,dataIn);
+                }
+                info.Cluster = value;
+            }
+            else {
+                info.Cluster = null;
+            }
+            info.BrokerInTime = LooseUnmarshalLong(wireFormat, dataIn);
+            info.BrokerOutTime = LooseUnmarshalLong(wireFormat, dataIn);
+            info.JMSXGroupFirstForConsumer = dataIn.ReadBoolean();
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            Message info = (Message)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            LooseMarshalCachedObject(wireFormat, (DataStructure)info.ProducerId, dataOut);
+            LooseMarshalCachedObject(wireFormat, (DataStructure)info.Destination, dataOut);
+            LooseMarshalCachedObject(wireFormat, (DataStructure)info.TransactionId, dataOut);
+            LooseMarshalCachedObject(wireFormat, (DataStructure)info.OriginalDestination, dataOut);
+            LooseMarshalNestedObject(wireFormat, (DataStructure)info.MessageId, dataOut);
+            LooseMarshalCachedObject(wireFormat, (DataStructure)info.OriginalTransactionId, dataOut);
+            LooseMarshalString(info.GroupID, dataOut);
+            dataOut.Write(info.GroupSequence);
+            LooseMarshalString(info.CorrelationId, dataOut);
+            dataOut.Write(info.Persistent);
+            LooseMarshalLong(wireFormat, info.Expiration, dataOut);
+            dataOut.Write(info.Priority);
+            LooseMarshalNestedObject(wireFormat, (DataStructure)info.ReplyTo, dataOut);
+            LooseMarshalLong(wireFormat, info.Timestamp, dataOut);
+            LooseMarshalString(info.Type, dataOut);
+            dataOut.Write(info.Content!=null);
+            if(info.Content!=null) {
+               dataOut.Write(info.Content.Length);
+               dataOut.Write(info.Content);
+            }
+            dataOut.Write(info.MarshalledProperties!=null);
+            if(info.MarshalledProperties!=null) {
+               dataOut.Write(info.MarshalledProperties.Length);
+               dataOut.Write(info.MarshalledProperties);
+            }
+            LooseMarshalNestedObject(wireFormat, (DataStructure)info.DataStructure, dataOut);
+            LooseMarshalCachedObject(wireFormat, (DataStructure)info.TargetConsumerId, dataOut);
+            dataOut.Write(info.Compressed);
+            dataOut.Write(info.RedeliveryCounter);
+            LooseMarshalObjectArray(wireFormat, info.BrokerPath, dataOut);
+            LooseMarshalLong(wireFormat, info.Arrival, dataOut);
+            LooseMarshalString(info.UserID, dataOut);
+            dataOut.Write(info.RecievedByDFBridge);
+            dataOut.Write(info.Droppable);
+            LooseMarshalObjectArray(wireFormat, info.Cluster, dataOut);
+            LooseMarshalLong(wireFormat, info.BrokerInTime, dataOut);
+            LooseMarshalLong(wireFormat, info.BrokerOutTime, dataOut);
+            dataOut.Write(info.JMSXGroupFirstForConsumer);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/MessagePullMarshaller.cs b/src/main/csharp/OpenWire/V10/MessagePullMarshaller.cs
new file mode 100644
index 0000000..0042ff8
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/MessagePullMarshaller.cs
@@ -0,0 +1,134 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for MessagePull
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for MessagePull
+    /// </summary>
+    class MessagePullMarshaller : BaseCommandMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new MessagePull();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return MessagePull.ID_MESSAGEPULL;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            MessagePull info = (MessagePull)o;
+            info.ConsumerId = (ConsumerId) TightUnmarshalCachedObject(wireFormat, dataIn, bs);
+            info.Destination = (ActiveMQDestination) TightUnmarshalCachedObject(wireFormat, dataIn, bs);
+            info.Timeout = TightUnmarshalLong(wireFormat, dataIn, bs);
+            info.CorrelationId = TightUnmarshalString(dataIn, bs);
+            info.MessageId = (MessageId) TightUnmarshalNestedObject(wireFormat, dataIn, bs);
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+            MessagePull info = (MessagePull)o;
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+            rc += TightMarshalCachedObject1(wireFormat, (DataStructure)info.ConsumerId, bs);
+            rc += TightMarshalCachedObject1(wireFormat, (DataStructure)info.Destination, bs);
+            rc += TightMarshalLong1(wireFormat, info.Timeout, bs);
+            rc += TightMarshalString1(info.CorrelationId, bs);
+        rc += TightMarshalNestedObject1(wireFormat, (DataStructure)info.MessageId, bs);
+
+            return rc + 0;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            MessagePull info = (MessagePull)o;
+            TightMarshalCachedObject2(wireFormat, (DataStructure)info.ConsumerId, dataOut, bs);
+            TightMarshalCachedObject2(wireFormat, (DataStructure)info.Destination, dataOut, bs);
+            TightMarshalLong2(wireFormat, info.Timeout, dataOut, bs);
+            TightMarshalString2(info.CorrelationId, dataOut, bs);
+            TightMarshalNestedObject2(wireFormat, (DataStructure)info.MessageId, dataOut, bs);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            MessagePull info = (MessagePull)o;
+            info.ConsumerId = (ConsumerId) LooseUnmarshalCachedObject(wireFormat, dataIn);
+            info.Destination = (ActiveMQDestination) LooseUnmarshalCachedObject(wireFormat, dataIn);
+            info.Timeout = LooseUnmarshalLong(wireFormat, dataIn);
+            info.CorrelationId = LooseUnmarshalString(dataIn);
+            info.MessageId = (MessageId) LooseUnmarshalNestedObject(wireFormat, dataIn);
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            MessagePull info = (MessagePull)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            LooseMarshalCachedObject(wireFormat, (DataStructure)info.ConsumerId, dataOut);
+            LooseMarshalCachedObject(wireFormat, (DataStructure)info.Destination, dataOut);
+            LooseMarshalLong(wireFormat, info.Timeout, dataOut);
+            LooseMarshalString(info.CorrelationId, dataOut);
+            LooseMarshalNestedObject(wireFormat, (DataStructure)info.MessageId, dataOut);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/NetworkBridgeFilterMarshaller.cs b/src/main/csharp/OpenWire/V10/NetworkBridgeFilterMarshaller.cs
new file mode 100644
index 0000000..14497c2
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/NetworkBridgeFilterMarshaller.cs
@@ -0,0 +1,122 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for NetworkBridgeFilter
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for NetworkBridgeFilter
+    /// </summary>
+    class NetworkBridgeFilterMarshaller : BaseDataStreamMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new NetworkBridgeFilter();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return NetworkBridgeFilter.ID_NETWORKBRIDGEFILTER;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            NetworkBridgeFilter info = (NetworkBridgeFilter)o;
+            info.NetworkBrokerId = (BrokerId) TightUnmarshalCachedObject(wireFormat, dataIn, bs);
+            info.MessageTTL = dataIn.ReadInt32();
+            info.ConsumerTTL = dataIn.ReadInt32();
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+            NetworkBridgeFilter info = (NetworkBridgeFilter)o;
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+            rc += TightMarshalCachedObject1(wireFormat, (DataStructure)info.NetworkBrokerId, bs);
+
+            return rc + 8;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            NetworkBridgeFilter info = (NetworkBridgeFilter)o;
+            TightMarshalCachedObject2(wireFormat, (DataStructure)info.NetworkBrokerId, dataOut, bs);
+            dataOut.Write(info.MessageTTL);
+            dataOut.Write(info.ConsumerTTL);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            NetworkBridgeFilter info = (NetworkBridgeFilter)o;
+            info.NetworkBrokerId = (BrokerId) LooseUnmarshalCachedObject(wireFormat, dataIn);
+            info.MessageTTL = dataIn.ReadInt32();
+            info.ConsumerTTL = dataIn.ReadInt32();
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            NetworkBridgeFilter info = (NetworkBridgeFilter)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            LooseMarshalCachedObject(wireFormat, (DataStructure)info.NetworkBrokerId, dataOut);
+            dataOut.Write(info.MessageTTL);
+            dataOut.Write(info.ConsumerTTL);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/PartialCommandMarshaller.cs b/src/main/csharp/OpenWire/V10/PartialCommandMarshaller.cs
new file mode 100644
index 0000000..9d074e5
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/PartialCommandMarshaller.cs
@@ -0,0 +1,126 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for PartialCommand
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for PartialCommand
+    /// </summary>
+    class PartialCommandMarshaller : BaseDataStreamMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new PartialCommand();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return PartialCommand.ID_PARTIALCOMMAND;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            PartialCommand info = (PartialCommand)o;
+            info.CommandId = dataIn.ReadInt32();
+            info.Data = ReadBytes(dataIn, bs.ReadBoolean());
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+            PartialCommand info = (PartialCommand)o;
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+            bs.WriteBoolean(info.Data!=null);
+            rc += info.Data==null ? 0 : info.Data.Length+4;
+
+            return rc + 4;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            PartialCommand info = (PartialCommand)o;
+            dataOut.Write(info.CommandId);
+            if(bs.ReadBoolean()) {
+                dataOut.Write(info.Data.Length);
+                dataOut.Write(info.Data);
+            }
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            PartialCommand info = (PartialCommand)o;
+            info.CommandId = dataIn.ReadInt32();
+            info.Data = ReadBytes(dataIn, dataIn.ReadBoolean());
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            PartialCommand info = (PartialCommand)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            dataOut.Write(info.CommandId);
+            dataOut.Write(info.Data!=null);
+            if(info.Data!=null) {
+               dataOut.Write(info.Data.Length);
+               dataOut.Write(info.Data);
+            }
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/ProducerAckMarshaller.cs b/src/main/csharp/OpenWire/V10/ProducerAckMarshaller.cs
new file mode 100644
index 0000000..99d4264
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/ProducerAckMarshaller.cs
@@ -0,0 +1,118 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for ProducerAck
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for ProducerAck
+    /// </summary>
+    class ProducerAckMarshaller : BaseCommandMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new ProducerAck();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return ProducerAck.ID_PRODUCERACK;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            ProducerAck info = (ProducerAck)o;
+            info.ProducerId = (ProducerId) TightUnmarshalNestedObject(wireFormat, dataIn, bs);
+            info.Size = dataIn.ReadInt32();
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+            ProducerAck info = (ProducerAck)o;
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+        rc += TightMarshalNestedObject1(wireFormat, (DataStructure)info.ProducerId, bs);
+
+            return rc + 4;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            ProducerAck info = (ProducerAck)o;
+            TightMarshalNestedObject2(wireFormat, (DataStructure)info.ProducerId, dataOut, bs);
+            dataOut.Write(info.Size);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            ProducerAck info = (ProducerAck)o;
+            info.ProducerId = (ProducerId) LooseUnmarshalNestedObject(wireFormat, dataIn);
+            info.Size = dataIn.ReadInt32();
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            ProducerAck info = (ProducerAck)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            LooseMarshalNestedObject(wireFormat, (DataStructure)info.ProducerId, dataOut);
+            dataOut.Write(info.Size);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/ProducerIdMarshaller.cs b/src/main/csharp/OpenWire/V10/ProducerIdMarshaller.cs
new file mode 100644
index 0000000..8e15a47
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/ProducerIdMarshaller.cs
@@ -0,0 +1,124 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for ProducerId
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for ProducerId
+    /// </summary>
+    class ProducerIdMarshaller : BaseDataStreamMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new ProducerId();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return ProducerId.ID_PRODUCERID;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            ProducerId info = (ProducerId)o;
+            info.ConnectionId = TightUnmarshalString(dataIn, bs);
+            info.Value = TightUnmarshalLong(wireFormat, dataIn, bs);
+            info.SessionId = TightUnmarshalLong(wireFormat, dataIn, bs);
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+            ProducerId info = (ProducerId)o;
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+            rc += TightMarshalString1(info.ConnectionId, bs);
+            rc += TightMarshalLong1(wireFormat, info.Value, bs);
+            rc += TightMarshalLong1(wireFormat, info.SessionId, bs);
+
+            return rc + 0;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            ProducerId info = (ProducerId)o;
+            TightMarshalString2(info.ConnectionId, dataOut, bs);
+            TightMarshalLong2(wireFormat, info.Value, dataOut, bs);
+            TightMarshalLong2(wireFormat, info.SessionId, dataOut, bs);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            ProducerId info = (ProducerId)o;
+            info.ConnectionId = LooseUnmarshalString(dataIn);
+            info.Value = LooseUnmarshalLong(wireFormat, dataIn);
+            info.SessionId = LooseUnmarshalLong(wireFormat, dataIn);
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            ProducerId info = (ProducerId)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            LooseMarshalString(info.ConnectionId, dataOut);
+            LooseMarshalLong(wireFormat, info.Value, dataOut);
+            LooseMarshalLong(wireFormat, info.SessionId, dataOut);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/ProducerInfoMarshaller.cs b/src/main/csharp/OpenWire/V10/ProducerInfoMarshaller.cs
new file mode 100644
index 0000000..d96d2a2
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/ProducerInfoMarshaller.cs
@@ -0,0 +1,155 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for ProducerInfo
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for ProducerInfo
+    /// </summary>
+    class ProducerInfoMarshaller : BaseCommandMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new ProducerInfo();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return ProducerInfo.ID_PRODUCERINFO;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            ProducerInfo info = (ProducerInfo)o;
+            info.ProducerId = (ProducerId) TightUnmarshalCachedObject(wireFormat, dataIn, bs);
+            info.Destination = (ActiveMQDestination) TightUnmarshalCachedObject(wireFormat, dataIn, bs);
+
+            if (bs.ReadBoolean()) {
+                short size = dataIn.ReadInt16();
+                BrokerId[] value = new BrokerId[size];
+                for( int i=0; i < size; i++ ) {
+                    value[i] = (BrokerId) TightUnmarshalNestedObject(wireFormat,dataIn, bs);
+                }
+                info.BrokerPath = value;
+            }
+            else {
+                info.BrokerPath = null;
+            }
+            info.DispatchAsync = bs.ReadBoolean();
+            info.WindowSize = dataIn.ReadInt32();
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+            ProducerInfo info = (ProducerInfo)o;
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+            rc += TightMarshalCachedObject1(wireFormat, (DataStructure)info.ProducerId, bs);
+            rc += TightMarshalCachedObject1(wireFormat, (DataStructure)info.Destination, bs);
+            rc += TightMarshalObjectArray1(wireFormat, info.BrokerPath, bs);
+            bs.WriteBoolean(info.DispatchAsync);
+
+            return rc + 4;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            ProducerInfo info = (ProducerInfo)o;
+            TightMarshalCachedObject2(wireFormat, (DataStructure)info.ProducerId, dataOut, bs);
+            TightMarshalCachedObject2(wireFormat, (DataStructure)info.Destination, dataOut, bs);
+            TightMarshalObjectArray2(wireFormat, info.BrokerPath, dataOut, bs);
+            bs.ReadBoolean();
+            dataOut.Write(info.WindowSize);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            ProducerInfo info = (ProducerInfo)o;
+            info.ProducerId = (ProducerId) LooseUnmarshalCachedObject(wireFormat, dataIn);
+            info.Destination = (ActiveMQDestination) LooseUnmarshalCachedObject(wireFormat, dataIn);
+
+            if (dataIn.ReadBoolean()) {
+                short size = dataIn.ReadInt16();
+                BrokerId[] value = new BrokerId[size];
+                for( int i=0; i < size; i++ ) {
+                    value[i] = (BrokerId) LooseUnmarshalNestedObject(wireFormat,dataIn);
+                }
+                info.BrokerPath = value;
+            }
+            else {
+                info.BrokerPath = null;
+            }
+            info.DispatchAsync = dataIn.ReadBoolean();
+            info.WindowSize = dataIn.ReadInt32();
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            ProducerInfo info = (ProducerInfo)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            LooseMarshalCachedObject(wireFormat, (DataStructure)info.ProducerId, dataOut);
+            LooseMarshalCachedObject(wireFormat, (DataStructure)info.Destination, dataOut);
+            LooseMarshalObjectArray(wireFormat, info.BrokerPath, dataOut);
+            dataOut.Write(info.DispatchAsync);
+            dataOut.Write(info.WindowSize);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/RemoveInfoMarshaller.cs b/src/main/csharp/OpenWire/V10/RemoveInfoMarshaller.cs
new file mode 100644
index 0000000..aae322e
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/RemoveInfoMarshaller.cs
@@ -0,0 +1,119 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for RemoveInfo
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for RemoveInfo
+    /// </summary>
+    class RemoveInfoMarshaller : BaseCommandMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new RemoveInfo();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return RemoveInfo.ID_REMOVEINFO;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            RemoveInfo info = (RemoveInfo)o;
+            info.ObjectId = (DataStructure) TightUnmarshalCachedObject(wireFormat, dataIn, bs);
+            info.LastDeliveredSequenceId = TightUnmarshalLong(wireFormat, dataIn, bs);
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+            RemoveInfo info = (RemoveInfo)o;
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+            rc += TightMarshalCachedObject1(wireFormat, (DataStructure)info.ObjectId, bs);
+            rc += TightMarshalLong1(wireFormat, info.LastDeliveredSequenceId, bs);
+
+            return rc + 0;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            RemoveInfo info = (RemoveInfo)o;
+            TightMarshalCachedObject2(wireFormat, (DataStructure)info.ObjectId, dataOut, bs);
+            TightMarshalLong2(wireFormat, info.LastDeliveredSequenceId, dataOut, bs);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            RemoveInfo info = (RemoveInfo)o;
+            info.ObjectId = (DataStructure) LooseUnmarshalCachedObject(wireFormat, dataIn);
+            info.LastDeliveredSequenceId = LooseUnmarshalLong(wireFormat, dataIn);
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            RemoveInfo info = (RemoveInfo)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            LooseMarshalCachedObject(wireFormat, (DataStructure)info.ObjectId, dataOut);
+            LooseMarshalLong(wireFormat, info.LastDeliveredSequenceId, dataOut);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/RemoveSubscriptionInfoMarshaller.cs b/src/main/csharp/OpenWire/V10/RemoveSubscriptionInfoMarshaller.cs
new file mode 100644
index 0000000..0846c1f
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/RemoveSubscriptionInfoMarshaller.cs
@@ -0,0 +1,124 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for RemoveSubscriptionInfo
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for RemoveSubscriptionInfo
+    /// </summary>
+    class RemoveSubscriptionInfoMarshaller : BaseCommandMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new RemoveSubscriptionInfo();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return RemoveSubscriptionInfo.ID_REMOVESUBSCRIPTIONINFO;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            RemoveSubscriptionInfo info = (RemoveSubscriptionInfo)o;
+            info.ConnectionId = (ConnectionId) TightUnmarshalCachedObject(wireFormat, dataIn, bs);
+            info.SubcriptionName = TightUnmarshalString(dataIn, bs);
+            info.ClientId = TightUnmarshalString(dataIn, bs);
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+            RemoveSubscriptionInfo info = (RemoveSubscriptionInfo)o;
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+            rc += TightMarshalCachedObject1(wireFormat, (DataStructure)info.ConnectionId, bs);
+            rc += TightMarshalString1(info.SubcriptionName, bs);
+            rc += TightMarshalString1(info.ClientId, bs);
+
+            return rc + 0;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            RemoveSubscriptionInfo info = (RemoveSubscriptionInfo)o;
+            TightMarshalCachedObject2(wireFormat, (DataStructure)info.ConnectionId, dataOut, bs);
+            TightMarshalString2(info.SubcriptionName, dataOut, bs);
+            TightMarshalString2(info.ClientId, dataOut, bs);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            RemoveSubscriptionInfo info = (RemoveSubscriptionInfo)o;
+            info.ConnectionId = (ConnectionId) LooseUnmarshalCachedObject(wireFormat, dataIn);
+            info.SubcriptionName = LooseUnmarshalString(dataIn);
+            info.ClientId = LooseUnmarshalString(dataIn);
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            RemoveSubscriptionInfo info = (RemoveSubscriptionInfo)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            LooseMarshalCachedObject(wireFormat, (DataStructure)info.ConnectionId, dataOut);
+            LooseMarshalString(info.SubcriptionName, dataOut);
+            LooseMarshalString(info.ClientId, dataOut);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/ReplayCommandMarshaller.cs b/src/main/csharp/OpenWire/V10/ReplayCommandMarshaller.cs
new file mode 100644
index 0000000..0e1da64
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/ReplayCommandMarshaller.cs
@@ -0,0 +1,116 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for ReplayCommand
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for ReplayCommand
+    /// </summary>
+    class ReplayCommandMarshaller : BaseCommandMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new ReplayCommand();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return ReplayCommand.ID_REPLAYCOMMAND;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            ReplayCommand info = (ReplayCommand)o;
+            info.FirstNakNumber = dataIn.ReadInt32();
+            info.LastNakNumber = dataIn.ReadInt32();
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+
+            return rc + 8;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            ReplayCommand info = (ReplayCommand)o;
+            dataOut.Write(info.FirstNakNumber);
+            dataOut.Write(info.LastNakNumber);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            ReplayCommand info = (ReplayCommand)o;
+            info.FirstNakNumber = dataIn.ReadInt32();
+            info.LastNakNumber = dataIn.ReadInt32();
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            ReplayCommand info = (ReplayCommand)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            dataOut.Write(info.FirstNakNumber);
+            dataOut.Write(info.LastNakNumber);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/ResponseMarshaller.cs b/src/main/csharp/OpenWire/V10/ResponseMarshaller.cs
new file mode 100644
index 0000000..2c10145
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/ResponseMarshaller.cs
@@ -0,0 +1,112 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for Response
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for Response
+    /// </summary>
+    class ResponseMarshaller : BaseCommandMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new Response();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return Response.ID_RESPONSE;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            Response info = (Response)o;
+            info.CorrelationId = dataIn.ReadInt32();
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+
+            return rc + 4;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            Response info = (Response)o;
+            dataOut.Write(info.CorrelationId);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            Response info = (Response)o;
+            info.CorrelationId = dataIn.ReadInt32();
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            Response info = (Response)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            dataOut.Write(info.CorrelationId);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/SessionIdMarshaller.cs b/src/main/csharp/OpenWire/V10/SessionIdMarshaller.cs
new file mode 100644
index 0000000..46e608c
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/SessionIdMarshaller.cs
@@ -0,0 +1,119 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for SessionId
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for SessionId
+    /// </summary>
+    class SessionIdMarshaller : BaseDataStreamMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new SessionId();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return SessionId.ID_SESSIONID;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            SessionId info = (SessionId)o;
+            info.ConnectionId = TightUnmarshalString(dataIn, bs);
+            info.Value = TightUnmarshalLong(wireFormat, dataIn, bs);
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+            SessionId info = (SessionId)o;
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+            rc += TightMarshalString1(info.ConnectionId, bs);
+            rc += TightMarshalLong1(wireFormat, info.Value, bs);
+
+            return rc + 0;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            SessionId info = (SessionId)o;
+            TightMarshalString2(info.ConnectionId, dataOut, bs);
+            TightMarshalLong2(wireFormat, info.Value, dataOut, bs);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            SessionId info = (SessionId)o;
+            info.ConnectionId = LooseUnmarshalString(dataIn);
+            info.Value = LooseUnmarshalLong(wireFormat, dataIn);
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            SessionId info = (SessionId)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            LooseMarshalString(info.ConnectionId, dataOut);
+            LooseMarshalLong(wireFormat, info.Value, dataOut);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/SessionInfoMarshaller.cs b/src/main/csharp/OpenWire/V10/SessionInfoMarshaller.cs
new file mode 100644
index 0000000..9c02d9f
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/SessionInfoMarshaller.cs
@@ -0,0 +1,114 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for SessionInfo
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for SessionInfo
+    /// </summary>
+    class SessionInfoMarshaller : BaseCommandMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new SessionInfo();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return SessionInfo.ID_SESSIONINFO;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            SessionInfo info = (SessionInfo)o;
+            info.SessionId = (SessionId) TightUnmarshalCachedObject(wireFormat, dataIn, bs);
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+            SessionInfo info = (SessionInfo)o;
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+            rc += TightMarshalCachedObject1(wireFormat, (DataStructure)info.SessionId, bs);
+
+            return rc + 0;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            SessionInfo info = (SessionInfo)o;
+            TightMarshalCachedObject2(wireFormat, (DataStructure)info.SessionId, dataOut, bs);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            SessionInfo info = (SessionInfo)o;
+            info.SessionId = (SessionId) LooseUnmarshalCachedObject(wireFormat, dataIn);
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            SessionInfo info = (SessionInfo)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            LooseMarshalCachedObject(wireFormat, (DataStructure)info.SessionId, dataOut);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/ShutdownInfoMarshaller.cs b/src/main/csharp/OpenWire/V10/ShutdownInfoMarshaller.cs
new file mode 100644
index 0000000..b072f34
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/ShutdownInfoMarshaller.cs
@@ -0,0 +1,100 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for ShutdownInfo
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for ShutdownInfo
+    /// </summary>
+    class ShutdownInfoMarshaller : BaseCommandMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new ShutdownInfo();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return ShutdownInfo.ID_SHUTDOWNINFO;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+
+            return rc + 0;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/SubscriptionInfoMarshaller.cs b/src/main/csharp/OpenWire/V10/SubscriptionInfoMarshaller.cs
new file mode 100644
index 0000000..1ba48e9
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/SubscriptionInfoMarshaller.cs
@@ -0,0 +1,134 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for SubscriptionInfo
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for SubscriptionInfo
+    /// </summary>
+    class SubscriptionInfoMarshaller : BaseDataStreamMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new SubscriptionInfo();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return SubscriptionInfo.ID_SUBSCRIPTIONINFO;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            SubscriptionInfo info = (SubscriptionInfo)o;
+            info.ClientId = TightUnmarshalString(dataIn, bs);
+            info.Destination = (ActiveMQDestination) TightUnmarshalCachedObject(wireFormat, dataIn, bs);
+            info.Selector = TightUnmarshalString(dataIn, bs);
+            info.SubcriptionName = TightUnmarshalString(dataIn, bs);
+            info.SubscribedDestination = (ActiveMQDestination) TightUnmarshalNestedObject(wireFormat, dataIn, bs);
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+            SubscriptionInfo info = (SubscriptionInfo)o;
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+            rc += TightMarshalString1(info.ClientId, bs);
+            rc += TightMarshalCachedObject1(wireFormat, (DataStructure)info.Destination, bs);
+            rc += TightMarshalString1(info.Selector, bs);
+            rc += TightMarshalString1(info.SubcriptionName, bs);
+        rc += TightMarshalNestedObject1(wireFormat, (DataStructure)info.SubscribedDestination, bs);
+
+            return rc + 0;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            SubscriptionInfo info = (SubscriptionInfo)o;
+            TightMarshalString2(info.ClientId, dataOut, bs);
+            TightMarshalCachedObject2(wireFormat, (DataStructure)info.Destination, dataOut, bs);
+            TightMarshalString2(info.Selector, dataOut, bs);
+            TightMarshalString2(info.SubcriptionName, dataOut, bs);
+            TightMarshalNestedObject2(wireFormat, (DataStructure)info.SubscribedDestination, dataOut, bs);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            SubscriptionInfo info = (SubscriptionInfo)o;
+            info.ClientId = LooseUnmarshalString(dataIn);
+            info.Destination = (ActiveMQDestination) LooseUnmarshalCachedObject(wireFormat, dataIn);
+            info.Selector = LooseUnmarshalString(dataIn);
+            info.SubcriptionName = LooseUnmarshalString(dataIn);
+            info.SubscribedDestination = (ActiveMQDestination) LooseUnmarshalNestedObject(wireFormat, dataIn);
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            SubscriptionInfo info = (SubscriptionInfo)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            LooseMarshalString(info.ClientId, dataOut);
+            LooseMarshalCachedObject(wireFormat, (DataStructure)info.Destination, dataOut);
+            LooseMarshalString(info.Selector, dataOut);
+            LooseMarshalString(info.SubcriptionName, dataOut);
+            LooseMarshalNestedObject(wireFormat, (DataStructure)info.SubscribedDestination, dataOut);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/TransactionIdMarshaller.cs b/src/main/csharp/OpenWire/V10/TransactionIdMarshaller.cs
new file mode 100644
index 0000000..4274639
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/TransactionIdMarshaller.cs
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for TransactionId
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for TransactionId
+    /// </summary>
+    abstract class TransactionIdMarshaller : BaseDataStreamMarshaller
+    {
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+
+            return rc + 0;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/TransactionInfoMarshaller.cs b/src/main/csharp/OpenWire/V10/TransactionInfoMarshaller.cs
new file mode 100644
index 0000000..0ce77a0
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/TransactionInfoMarshaller.cs
@@ -0,0 +1,123 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for TransactionInfo
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for TransactionInfo
+    /// </summary>
+    class TransactionInfoMarshaller : BaseCommandMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new TransactionInfo();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return TransactionInfo.ID_TRANSACTIONINFO;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            TransactionInfo info = (TransactionInfo)o;
+            info.ConnectionId = (ConnectionId) TightUnmarshalCachedObject(wireFormat, dataIn, bs);
+            info.TransactionId = (TransactionId) TightUnmarshalCachedObject(wireFormat, dataIn, bs);
+            info.Type = dataIn.ReadByte();
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+            TransactionInfo info = (TransactionInfo)o;
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+            rc += TightMarshalCachedObject1(wireFormat, (DataStructure)info.ConnectionId, bs);
+            rc += TightMarshalCachedObject1(wireFormat, (DataStructure)info.TransactionId, bs);
+
+            return rc + 1;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            TransactionInfo info = (TransactionInfo)o;
+            TightMarshalCachedObject2(wireFormat, (DataStructure)info.ConnectionId, dataOut, bs);
+            TightMarshalCachedObject2(wireFormat, (DataStructure)info.TransactionId, dataOut, bs);
+            dataOut.Write(info.Type);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            TransactionInfo info = (TransactionInfo)o;
+            info.ConnectionId = (ConnectionId) LooseUnmarshalCachedObject(wireFormat, dataIn);
+            info.TransactionId = (TransactionId) LooseUnmarshalCachedObject(wireFormat, dataIn);
+            info.Type = dataIn.ReadByte();
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            TransactionInfo info = (TransactionInfo)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            LooseMarshalCachedObject(wireFormat, (DataStructure)info.ConnectionId, dataOut);
+            LooseMarshalCachedObject(wireFormat, (DataStructure)info.TransactionId, dataOut);
+            dataOut.Write(info.Type);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/WireFormatInfoMarshaller.cs b/src/main/csharp/OpenWire/V10/WireFormatInfoMarshaller.cs
new file mode 100644
index 0000000..39707c4
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/WireFormatInfoMarshaller.cs
@@ -0,0 +1,148 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for WireFormatInfo
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for WireFormatInfo
+    /// </summary>
+    class WireFormatInfoMarshaller : BaseDataStreamMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new WireFormatInfo();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return WireFormatInfo.ID_WIREFORMATINFO;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            WireFormatInfo info = (WireFormatInfo)o;
+
+            info.BeforeUnmarshall(wireFormat);
+
+            info.Magic = ReadBytes(dataIn, 8);
+            info.Version = dataIn.ReadInt32();
+            info.MarshalledProperties = ReadBytes(dataIn, bs.ReadBoolean());
+
+            info.AfterUnmarshall(wireFormat);
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+            WireFormatInfo info = (WireFormatInfo)o;
+
+            info.BeforeMarshall(wireFormat);
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+            bs.WriteBoolean(info.MarshalledProperties!=null);
+            rc += info.MarshalledProperties==null ? 0 : info.MarshalledProperties.Length+4;
+
+            return rc + 12;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            WireFormatInfo info = (WireFormatInfo)o;
+            dataOut.Write(info.Magic, 0, 8);
+            dataOut.Write(info.Version);
+            if(bs.ReadBoolean()) {
+                dataOut.Write(info.MarshalledProperties.Length);
+                dataOut.Write(info.MarshalledProperties);
+            }
+
+            info.AfterMarshall(wireFormat);
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            WireFormatInfo info = (WireFormatInfo)o;
+
+            info.BeforeUnmarshall(wireFormat);
+
+            info.Magic = ReadBytes(dataIn, 8);
+            info.Version = dataIn.ReadInt32();
+            info.MarshalledProperties = ReadBytes(dataIn, dataIn.ReadBoolean());
+
+            info.AfterUnmarshall(wireFormat);
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            WireFormatInfo info = (WireFormatInfo)o;
+
+            info.BeforeMarshall(wireFormat);
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            dataOut.Write(info.Magic, 0, 8);
+            dataOut.Write(info.Version);
+            dataOut.Write(info.MarshalledProperties!=null);
+            if(info.MarshalledProperties!=null) {
+               dataOut.Write(info.MarshalledProperties.Length);
+               dataOut.Write(info.MarshalledProperties);
+            }
+
+            info.AfterMarshall(wireFormat);
+        }
+    }
+}
diff --git a/src/main/csharp/OpenWire/V10/XATransactionIdMarshaller.cs b/src/main/csharp/OpenWire/V10/XATransactionIdMarshaller.cs
new file mode 100644
index 0000000..63c5f4c
--- /dev/null
+++ b/src/main/csharp/OpenWire/V10/XATransactionIdMarshaller.cs
@@ -0,0 +1,139 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *
+ *  Marshaler code for OpenWire format for XATransactionId
+ *
+ *  NOTE!: This file is auto generated - do not modify!
+ *         if you need to make a change, please see the Java Classes
+ *         in the nms-activemq-openwire-generator module
+ *
+ */
+
+using System;
+using System.IO;
+
+using Apache.NMS.ActiveMQ.Commands;
+
+namespace Apache.NMS.ActiveMQ.OpenWire.V10
+{
+    /// <summary>
+    ///  Marshalling code for Open Wire Format for XATransactionId
+    /// </summary>
+    class XATransactionIdMarshaller : TransactionIdMarshaller
+    {
+        /// <summery>
+        ///  Creates an instance of the Object that this marshaller handles.
+        /// </summery>
+        public override DataStructure CreateObject() 
+        {
+            return new XATransactionId();
+        }
+
+        /// <summery>
+        ///  Returns the type code for the Object that this Marshaller handles..
+        /// </summery>
+        public override byte GetDataStructureType() 
+        {
+            return XATransactionId.ID_XATRANSACTIONID;
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs) 
+        {
+            base.TightUnmarshal(wireFormat, o, dataIn, bs);
+
+            XATransactionId info = (XATransactionId)o;
+            info.FormatId = dataIn.ReadInt32();
+            info.GlobalTransactionId = ReadBytes(dataIn, bs.ReadBoolean());
+            info.BranchQualifier = ReadBytes(dataIn, bs.ReadBoolean());
+        }
+
+        //
+        // Write the booleans that this object uses to a BooleanStream
+        //
+        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
+        {
+            XATransactionId info = (XATransactionId)o;
+
+            int rc = base.TightMarshal1(wireFormat, o, bs);
+            bs.WriteBoolean(info.GlobalTransactionId!=null);
+            rc += info.GlobalTransactionId==null ? 0 : info.GlobalTransactionId.Length+4;
+            bs.WriteBoolean(info.BranchQualifier!=null);
+            rc += info.BranchQualifier==null ? 0 : info.BranchQualifier.Length+4;
+
+            return rc + 4;
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
+        {
+            base.TightMarshal2(wireFormat, o, dataOut, bs);
+
+            XATransactionId info = (XATransactionId)o;
+            dataOut.Write(info.FormatId);
+            if(bs.ReadBoolean()) {
+                dataOut.Write(info.GlobalTransactionId.Length);
+                dataOut.Write(info.GlobalTransactionId);
+            }
+            if(bs.ReadBoolean()) {
+                dataOut.Write(info.BranchQualifier.Length);
+                dataOut.Write(info.BranchQualifier);
+            }
+        }
+
+        // 
+        // Un-marshal an object instance from the data input stream
+        // 
+        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn) 
+        {
+            base.LooseUnmarshal(wireFormat, o, dataIn);
+
+            XATransactionId info = (XATransactionId)o;
+            info.FormatId = dataIn.ReadInt32();
+            info.GlobalTransactionId = ReadBytes(dataIn, dataIn.ReadBoolean());
+            info.BranchQualifier = ReadBytes(dataIn, dataIn.ReadBoolean());
+        }
+
+        // 
+        // Write a object instance to data output stream
+        //
+        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
+        {
+
+            XATransactionId info = (XATransactionId)o;
+
+            base.LooseMarshal(wireFormat, o, dataOut);
+            dataOut.Write(info.FormatId);
+            dataOut.Write(info.GlobalTransactionId!=null);
+            if(info.GlobalTransactionId!=null) {
+               dataOut.Write(info.GlobalTransactionId.Length);
+               dataOut.Write(info.GlobalTransactionId);
+            }
+            dataOut.Write(info.BranchQualifier!=null);
+            if(info.BranchQualifier!=null) {
+               dataOut.Write(info.BranchQualifier.Length);
+               dataOut.Write(info.BranchQualifier);
+            }
+        }
+    }
+}
