Merge OpenFlowJava repository into OpenFlowPlugin
[openflowplugin.git] / openflowjava / openflow-protocol-impl / src / test / java / org / opendaylight / openflowjava / protocol / impl / serialization / factories / MultipartReplyMessageFactoryTest.java
diff --git a/openflowjava/openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/MultipartReplyMessageFactoryTest.java b/openflowjava/openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/MultipartReplyMessageFactoryTest.java
new file mode 100644 (file)
index 0000000..a6e18bd
--- /dev/null
@@ -0,0 +1,1496 @@
+/*
+ * Copyright (c) 2015 NetIDE Consortium and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.openflowjava.protocol.impl.serialization.factories;
+
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.UnpooledByteBufAllocator;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer;
+import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistry;
+import org.opendaylight.openflowjava.protocol.api.keys.MessageTypeKey;
+import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
+import org.opendaylight.openflowjava.protocol.impl.serialization.SerializerRegistryImpl;
+import org.opendaylight.openflowjava.protocol.impl.util.BufferHelper;
+import org.opendaylight.openflowjava.util.ByteBufUtils;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.ActionRelatedTableFeatureProperty;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.ActionRelatedTableFeaturePropertyBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.InstructionRelatedTableFeatureProperty;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.InstructionRelatedTableFeaturePropertyBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.NextTableRelatedTableFeatureProperty;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.NextTableRelatedTableFeaturePropertyBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.OxmRelatedTableFeatureProperty;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.OxmRelatedTableFeaturePropertyBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.table.features.properties.container.table.feature.properties.NextTableIds;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.table.features.properties.container.table.feature.properties.NextTableIdsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.OutputActionCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PopPbbCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PushVlanCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetNwTtlCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.output.action._case.OutputActionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.push.vlan._case.PushVlanActionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.set.nw.ttl._case.SetNwTtlActionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.ActionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice.ApplyActionsCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice.ClearActionsCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice.GotoTableCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice.MeterCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice.WriteActionsCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice.WriteMetadataCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice._goto.table._case.GotoTableBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice.apply.actions._case.ApplyActionsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice.meter._case.MeterBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice.write.actions._case.WriteActionsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice.write.metadata._case.WriteMetadataBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instructions.grouping.Instruction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instructions.grouping.InstructionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ActionType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.EtherType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupCapabilities;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupTypes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterBandType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterBandTypeBitmap;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterFlags;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartRequestFlags;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortConfig;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortFeatures;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortState;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableConfig;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableFeaturesPropType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.InPhyPort;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.InPort;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.IpEcn;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.IpProto;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OpenflowBasicClass;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OxmMatchType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntryBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.InPhyPortCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpEcnCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.in.phy.port._case.InPhyPortBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ip.ecn._case.IpEcnBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.MatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessage;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessageBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.buckets.grouping.BucketsList;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.buckets.grouping.BucketsListBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDropCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDscpRemarkCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.meter.band.drop._case.MeterBandDropBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.meter.band.dscp.remark._case.MeterBandDscpRemarkBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.MultipartReplyBody;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyAggregateCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyAggregateCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyDescCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyDescCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyFlowCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyFlowCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupDescCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupDescCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupFeaturesCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupFeaturesCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterConfigCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterConfigCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterFeaturesCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterFeaturesCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyPortDescCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyPortDescCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyPortStatsCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyPortStatsCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyQueueCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyQueueCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyTableCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyTableCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyTableFeaturesCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.aggregate._case.MultipartReplyAggregate;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.aggregate._case.MultipartReplyAggregateBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.desc._case.MultipartReplyDescBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.flow._case.MultipartReplyFlow;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.flow._case.MultipartReplyFlowBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.flow._case.multipart.reply.flow.FlowStats;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.flow._case.multipart.reply.flow.FlowStatsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.MultipartReplyGroup;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.MultipartReplyGroupBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.multipart.reply.group.GroupStats;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.multipart.reply.group.GroupStatsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.multipart.reply.group.group.stats.BucketStats;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.multipart.reply.group.group.stats.BucketStatsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.desc._case.MultipartReplyGroupDesc;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.desc._case.MultipartReplyGroupDescBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.desc._case.multipart.reply.group.desc.GroupDesc;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.desc._case.multipart.reply.group.desc.GroupDescBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.features._case.MultipartReplyGroupFeatures;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.features._case.MultipartReplyGroupFeaturesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter._case.MultipartReplyMeter;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter._case.MultipartReplyMeterBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter._case.multipart.reply.meter.MeterStats;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter._case.multipart.reply.meter.MeterStatsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter._case.multipart.reply.meter.meter.stats.MeterBandStats;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter._case.multipart.reply.meter.meter.stats.MeterBandStatsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.config._case.MultipartReplyMeterConfig;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.config._case.MultipartReplyMeterConfigBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.config._case.multipart.reply.meter.config.MeterConfig;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.config._case.multipart.reply.meter.config.MeterConfigBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.config._case.multipart.reply.meter.config.meter.config.Bands;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.config._case.multipart.reply.meter.config.meter.config.BandsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.features._case.MultipartReplyMeterFeatures;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.features._case.MultipartReplyMeterFeaturesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.desc._case.MultipartReplyPortDesc;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.desc._case.MultipartReplyPortDescBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.desc._case.multipart.reply.port.desc.Ports;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.desc._case.multipart.reply.port.desc.PortsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.stats._case.MultipartReplyPortStats;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.stats._case.MultipartReplyPortStatsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.stats._case.multipart.reply.port.stats.PortStats;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.stats._case.multipart.reply.port.stats.PortStatsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.queue._case.MultipartReplyQueue;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.queue._case.MultipartReplyQueueBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.queue._case.multipart.reply.queue.QueueStats;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.queue._case.multipart.reply.queue.QueueStatsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table._case.MultipartReplyTable;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table._case.MultipartReplyTableBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table._case.multipart.reply.table.TableStats;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table._case.multipart.reply.table.TableStatsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table.features._case.MultipartReplyTableFeaturesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table.features._case.multipart.reply.table.features.TableFeatures;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table.features._case.multipart.reply.table.features.TableFeaturesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.table.features.properties.grouping.TableFeatureProperties;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.table.features.properties.grouping.TableFeaturePropertiesBuilder;
+
+/**
+ * @author giuseppex.petralia@intel.com
+ *
+ */
+public class MultipartReplyMessageFactoryTest {
+    private static final byte MESSAGE_TYPE = 19;
+    private static final byte PADDING = 4;
+
+    private OFSerializer<MultipartReplyMessage> factory;
+
+    @Before
+    public void startUp() throws Exception {
+        SerializerRegistry registry = new SerializerRegistryImpl();
+        registry.init();
+        factory = registry
+                .getSerializer(new MessageTypeKey<>(EncodeConstants.OF13_VERSION_ID, MultipartReplyMessage.class));
+    }
+
+    @Test
+    public void testMultipartRequestTableFeaturesMessageFactory() throws Exception {
+        MultipartReplyMessageBuilder builder = new MultipartReplyMessageBuilder();
+        BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
+        builder.setFlags(new MultipartRequestFlags(true));
+        builder.setType(MultipartType.forValue(12));
+        MultipartReplyTableFeaturesCaseBuilder caseBuilder = new MultipartReplyTableFeaturesCaseBuilder();
+        MultipartReplyTableFeaturesBuilder featuresBuilder = new MultipartReplyTableFeaturesBuilder();
+        List<TableFeatures> tableFeaturesList = new ArrayList<>();
+        TableFeaturesBuilder tableFeaturesBuilder = new TableFeaturesBuilder();
+        tableFeaturesBuilder.setTableId((short) 8);
+        tableFeaturesBuilder.setName("AAAABBBBCCCCDDDDEEEEFFFFGGGG");
+        tableFeaturesBuilder.setMetadataMatch(new byte[] { 0x00, 0x01, 0x02, 0x03, 0x01, 0x04, 0x08, 0x01 });
+        tableFeaturesBuilder.setMetadataWrite(new byte[] { 0x00, 0x07, 0x01, 0x05, 0x01, 0x00, 0x03, 0x01 });
+        tableFeaturesBuilder.setConfig(new TableConfig(true));
+        tableFeaturesBuilder.setMaxEntries(65L);
+        List<TableFeatureProperties> properties = new ArrayList<>();
+        TableFeaturePropertiesBuilder propBuilder = new TableFeaturePropertiesBuilder();
+        propBuilder.setType(TableFeaturesPropType.OFPTFPTNEXTTABLES);
+        NextTableRelatedTableFeaturePropertyBuilder nextPropBuilder = new NextTableRelatedTableFeaturePropertyBuilder();
+        List<NextTableIds> nextIds = new ArrayList<>();
+        nextIds.add(new NextTableIdsBuilder().setTableId((short) 1).build());
+        nextIds.add(new NextTableIdsBuilder().setTableId((short) 2).build());
+        nextPropBuilder.setNextTableIds(nextIds);
+        propBuilder.addAugmentation(NextTableRelatedTableFeatureProperty.class, nextPropBuilder.build());
+        properties.add(propBuilder.build());
+        propBuilder = new TableFeaturePropertiesBuilder();
+        propBuilder.setType(TableFeaturesPropType.OFPTFPTNEXTTABLESMISS);
+        nextPropBuilder = new NextTableRelatedTableFeaturePropertyBuilder();
+        nextIds = new ArrayList<>();
+        nextPropBuilder.setNextTableIds(nextIds);
+        propBuilder.addAugmentation(NextTableRelatedTableFeatureProperty.class, nextPropBuilder.build());
+        properties.add(propBuilder.build());
+        propBuilder = new TableFeaturePropertiesBuilder();
+        propBuilder.setType(TableFeaturesPropType.OFPTFPTINSTRUCTIONS);
+        InstructionRelatedTableFeaturePropertyBuilder insPropBuilder = new InstructionRelatedTableFeaturePropertyBuilder();
+        List<Instruction> insIds = new ArrayList<>();
+        InstructionBuilder insBuilder = new InstructionBuilder();
+        insBuilder.setInstructionChoice(new WriteActionsCaseBuilder().build());
+        insIds.add(insBuilder.build());
+        insBuilder = new InstructionBuilder();
+        insBuilder.setInstructionChoice(new GotoTableCaseBuilder().build());
+        insIds.add(insBuilder.build());
+        insPropBuilder.setInstruction(insIds);
+        propBuilder.addAugmentation(InstructionRelatedTableFeatureProperty.class, insPropBuilder.build());
+        properties.add(propBuilder.build());
+        propBuilder = new TableFeaturePropertiesBuilder();
+        propBuilder.setType(TableFeaturesPropType.OFPTFPTINSTRUCTIONSMISS);
+        insPropBuilder = new InstructionRelatedTableFeaturePropertyBuilder();
+        insIds = new ArrayList<>();
+        insBuilder = new InstructionBuilder();
+        insBuilder.setInstructionChoice(new WriteMetadataCaseBuilder().build());
+        insIds.add(insBuilder.build());
+        insBuilder = new InstructionBuilder();
+        insBuilder.setInstructionChoice(new ApplyActionsCaseBuilder().build());
+        insIds.add(insBuilder.build());
+        insBuilder = new InstructionBuilder();
+        insBuilder.setInstructionChoice(new MeterCaseBuilder().build());
+        insIds.add(insBuilder.build());
+        insBuilder = new InstructionBuilder();
+        insBuilder.setInstructionChoice(new ClearActionsCaseBuilder().build());
+        insIds.add(insBuilder.build());
+        insBuilder = new InstructionBuilder();
+        insBuilder.setInstructionChoice(new GotoTableCaseBuilder().build());
+        insIds.add(insBuilder.build());
+        insPropBuilder.setInstruction(insIds);
+        propBuilder.addAugmentation(InstructionRelatedTableFeatureProperty.class, insPropBuilder.build());
+        properties.add(propBuilder.build());
+        tableFeaturesBuilder.setTableFeatureProperties(properties);
+        tableFeaturesList.add(tableFeaturesBuilder.build());
+        tableFeaturesBuilder = new TableFeaturesBuilder();
+        tableFeaturesBuilder.setTableId((short) 8);
+        tableFeaturesBuilder.setName("AAAABBBBCCCCDDDDEEEEFFFFGGGG");
+        byte[] metadataMatch = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x01, 0x04, 0x08, 0x01 };
+        tableFeaturesBuilder.setMetadataMatch(metadataMatch);
+        byte[] metadataWrite = new byte[] { 0x00, 0x07, 0x01, 0x05, 0x01, 0x00, 0x03, 0x01 };
+        tableFeaturesBuilder.setMetadataWrite(metadataWrite);
+        tableFeaturesBuilder.setConfig(new TableConfig(true));
+        tableFeaturesBuilder.setMaxEntries(67L);
+        properties = new ArrayList<>();
+        propBuilder = new TableFeaturePropertiesBuilder();
+        propBuilder.setType(TableFeaturesPropType.OFPTFPTWRITEACTIONS);
+        ActionRelatedTableFeaturePropertyBuilder actBuilder = new ActionRelatedTableFeaturePropertyBuilder();
+        List<Action> actions = new ArrayList<>();
+        ActionBuilder actionBuilder = new ActionBuilder();
+        actionBuilder.setActionChoice(new OutputActionCaseBuilder().build());
+        actions.add(actionBuilder.build());
+        actBuilder.setAction(actions);
+        propBuilder.addAugmentation(ActionRelatedTableFeatureProperty.class, actBuilder.build());
+        properties.add(propBuilder.build());
+        propBuilder = new TableFeaturePropertiesBuilder();
+        propBuilder.setType(TableFeaturesPropType.OFPTFPTWRITEACTIONSMISS);
+        actBuilder = new ActionRelatedTableFeaturePropertyBuilder();
+        actions = new ArrayList<>();
+        actBuilder.setAction(actions);
+        propBuilder.addAugmentation(ActionRelatedTableFeatureProperty.class, actBuilder.build());
+        properties.add(propBuilder.build());
+        propBuilder = new TableFeaturePropertiesBuilder();
+        propBuilder.setType(TableFeaturesPropType.OFPTFPTAPPLYACTIONS);
+        actBuilder = new ActionRelatedTableFeaturePropertyBuilder();
+        actions = new ArrayList<>();
+        actBuilder.setAction(actions);
+        propBuilder.addAugmentation(ActionRelatedTableFeatureProperty.class, actBuilder.build());
+        properties.add(propBuilder.build());
+        propBuilder = new TableFeaturePropertiesBuilder();
+        propBuilder.setType(TableFeaturesPropType.OFPTFPTAPPLYACTIONSMISS);
+        actBuilder = new ActionRelatedTableFeaturePropertyBuilder();
+        actions = new ArrayList<>();
+        actBuilder.setAction(actions);
+        propBuilder.addAugmentation(ActionRelatedTableFeatureProperty.class, actBuilder.build());
+        properties.add(propBuilder.build());
+        propBuilder = new TableFeaturePropertiesBuilder();
+        propBuilder.setType(TableFeaturesPropType.OFPTFPTMATCH);
+        OxmRelatedTableFeaturePropertyBuilder oxmBuilder = new OxmRelatedTableFeaturePropertyBuilder();
+        List<MatchEntry> entries = new ArrayList<>();
+        MatchEntryBuilder entriesBuilder = new MatchEntryBuilder();
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);
+        entriesBuilder.setOxmMatchField(InPhyPort.class);
+        entriesBuilder.setHasMask(false);
+        entries.add(entriesBuilder.build());
+        entriesBuilder = new MatchEntryBuilder();
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);
+        entriesBuilder.setOxmMatchField(InPort.class);
+        entriesBuilder.setHasMask(false);
+        entries.add(entriesBuilder.build());
+        oxmBuilder.setMatchEntry(entries);
+        propBuilder.addAugmentation(OxmRelatedTableFeatureProperty.class, oxmBuilder.build());
+        properties.add(propBuilder.build());
+        propBuilder = new TableFeaturePropertiesBuilder();
+        propBuilder.setType(TableFeaturesPropType.OFPTFPTWILDCARDS);
+        oxmBuilder = new OxmRelatedTableFeaturePropertyBuilder();
+        entries = new ArrayList<>();
+        oxmBuilder.setMatchEntry(entries);
+        propBuilder.addAugmentation(OxmRelatedTableFeatureProperty.class, oxmBuilder.build());
+        properties.add(propBuilder.build());
+        propBuilder = new TableFeaturePropertiesBuilder();
+        propBuilder.setType(TableFeaturesPropType.OFPTFPTWRITESETFIELD);
+        oxmBuilder = new OxmRelatedTableFeaturePropertyBuilder();
+        entries = new ArrayList<>();
+        oxmBuilder.setMatchEntry(entries);
+        propBuilder.addAugmentation(OxmRelatedTableFeatureProperty.class, oxmBuilder.build());
+        properties.add(propBuilder.build());
+        propBuilder = new TableFeaturePropertiesBuilder();
+        propBuilder.setType(TableFeaturesPropType.OFPTFPTWRITESETFIELDMISS);
+        oxmBuilder = new OxmRelatedTableFeaturePropertyBuilder();
+        entries = new ArrayList<>();
+        oxmBuilder.setMatchEntry(entries);
+        propBuilder.addAugmentation(OxmRelatedTableFeatureProperty.class, oxmBuilder.build());
+        properties.add(propBuilder.build());
+        propBuilder = new TableFeaturePropertiesBuilder();
+        propBuilder.setType(TableFeaturesPropType.OFPTFPTAPPLYSETFIELD);
+        oxmBuilder = new OxmRelatedTableFeaturePropertyBuilder();
+        entries = new ArrayList<>();
+        entriesBuilder = new MatchEntryBuilder();
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);
+        entriesBuilder.setOxmMatchField(IpProto.class);
+        entriesBuilder.setHasMask(false);
+        entries.add(entriesBuilder.build());
+        entriesBuilder = new MatchEntryBuilder();
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);
+        entriesBuilder.setOxmMatchField(IpEcn.class);
+        entriesBuilder.setHasMask(false);
+        entries.add(entriesBuilder.build());
+        oxmBuilder.setMatchEntry(entries);
+        propBuilder.addAugmentation(OxmRelatedTableFeatureProperty.class, oxmBuilder.build());
+        properties.add(propBuilder.build());
+        propBuilder = new TableFeaturePropertiesBuilder();
+        propBuilder.setType(TableFeaturesPropType.OFPTFPTAPPLYSETFIELDMISS);
+        oxmBuilder = new OxmRelatedTableFeaturePropertyBuilder();
+        entries = new ArrayList<>();
+        oxmBuilder.setMatchEntry(entries);
+        propBuilder.addAugmentation(OxmRelatedTableFeatureProperty.class, oxmBuilder.build());
+        properties.add(propBuilder.build());
+        tableFeaturesBuilder.setTableFeatureProperties(properties);
+        tableFeaturesList.add(tableFeaturesBuilder.build());
+        featuresBuilder.setTableFeatures(tableFeaturesList);
+        caseBuilder.setMultipartReplyTableFeatures(featuresBuilder.build());
+        builder.setMultipartReplyBody(caseBuilder.build());
+        MultipartReplyMessage message = builder.build();
+        ByteBuf serializedBuffer = UnpooledByteBufAllocator.DEFAULT.buffer();
+        factory.serialize(message, serializedBuffer);
+        BufferHelper.checkHeaderV13(serializedBuffer, MESSAGE_TYPE, 520);
+        Assert.assertEquals("Wrong type", MultipartType.OFPMPTABLEFEATURES.getIntValue(), serializedBuffer.readShort());
+        Assert.assertEquals("Wrong flags", message.getFlags(),
+                createMultipartRequestFlags(serializedBuffer.readShort()));
+        serializedBuffer.skipBytes(PADDING);
+
+        Assert.assertEquals("Wrong length", 232, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong registry-id", 8, serializedBuffer.readUnsignedByte());
+        serializedBuffer.skipBytes(5);
+        Assert.assertEquals("Wrong name", "AAAABBBBCCCCDDDDEEEEFFFFGGGG",
+                ByteBufUtils.decodeNullTerminatedString(serializedBuffer, 32));
+        byte[] metadataMatchOutput = new byte[metadataMatch.length];
+        serializedBuffer.readBytes(metadataMatchOutput);
+        Assert.assertArrayEquals("Wrong metadata-match", new byte[] { 0x00, 0x01, 0x02, 0x03, 0x01, 0x04, 0x08, 0x01 },
+                metadataMatchOutput);
+        serializedBuffer.skipBytes(64 - metadataMatch.length);
+        byte[] metadataWriteOutput = new byte[metadataWrite.length];
+        serializedBuffer.readBytes(metadataWriteOutput);
+        Assert.assertArrayEquals("Wrong metadata-write", new byte[] { 0x00, 0x07, 0x01, 0x05, 0x01, 0x00, 0x03, 0x01 },
+                metadataWriteOutput);
+        serializedBuffer.skipBytes(64 - metadataWrite.length);
+        Assert.assertEquals("Wrong config", 1, serializedBuffer.readUnsignedInt());
+        Assert.assertEquals("Wrong max-entries", 65, serializedBuffer.readUnsignedInt());
+        Assert.assertEquals("Wrong property type", 2, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong property length", 6, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong next-registry-id", 1, serializedBuffer.readUnsignedByte());
+        Assert.assertEquals("Wrong next-registry-id", 2, serializedBuffer.readUnsignedByte());
+        serializedBuffer.skipBytes(2);
+        Assert.assertEquals("Wrong property type", 3, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong property length", 4, serializedBuffer.readUnsignedShort());
+        serializedBuffer.skipBytes(4);
+        Assert.assertEquals("Wrong property type", 0, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong property length", 12, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong instruction type", 3, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong instruction length", 4, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong instruction type", 1, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong instruction length", 4, serializedBuffer.readUnsignedShort());
+        serializedBuffer.skipBytes(4);
+        Assert.assertEquals("Wrong property type", 1, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong property length", 24, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong instruction type", 2, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong instruction length", 4, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong instruction type", 4, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong instruction length", 4, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong instruction type", 6, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong instruction length", 4, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong instruction type", 5, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong instruction length", 4, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong instruction type", 1, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong instruction length", 4, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong length", 272, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong registry-id", 8, serializedBuffer.readUnsignedByte());
+        serializedBuffer.skipBytes(5);
+        Assert.assertEquals("Wrong name", "AAAABBBBCCCCDDDDEEEEFFFFGGGG",
+                ByteBufUtils.decodeNullTerminatedString(serializedBuffer, 32));
+        metadataMatchOutput = new byte[metadataMatch.length];
+        serializedBuffer.readBytes(metadataMatchOutput);
+        serializedBuffer.skipBytes(64 - metadataMatch.length);
+        Assert.assertArrayEquals("Wrong metadata-match", new byte[] { 0x00, 0x01, 0x02, 0x03, 0x01, 0x04, 0x08, 0x01 },
+                metadataMatchOutput);
+        metadataWriteOutput = new byte[metadataWrite.length];
+        serializedBuffer.readBytes(metadataWriteOutput);
+        serializedBuffer.skipBytes(64 - metadataWrite.length);
+        Assert.assertArrayEquals("Wrong metadata-write", new byte[] { 0x00, 0x07, 0x01, 0x05, 0x01, 0x00, 0x03, 0x01 },
+                metadataWriteOutput);
+        Assert.assertEquals("Wrong config", 1, serializedBuffer.readUnsignedInt());
+        Assert.assertEquals("Wrong max-entries", 67, serializedBuffer.readUnsignedInt());
+        Assert.assertEquals("Wrong property type", 4, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong property length", 8, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong action type", 0, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong action length", 4, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong property type", 5, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong property length", 4, serializedBuffer.readUnsignedShort());
+        serializedBuffer.skipBytes(4);
+        Assert.assertEquals("Wrong property type", 6, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong property length", 4, serializedBuffer.readUnsignedShort());
+        serializedBuffer.skipBytes(4);
+        Assert.assertEquals("Wrong property type", 7, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong property length", 4, serializedBuffer.readUnsignedShort());
+        serializedBuffer.skipBytes(4);
+        Assert.assertEquals("Wrong property type", 8, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong property length", 12, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong match class", 0x8000, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong match field&mask", 2, serializedBuffer.readUnsignedByte());
+        Assert.assertEquals("Wrong match length", 4, serializedBuffer.readUnsignedByte());
+        Assert.assertEquals("Wrong match class", 0x8000, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong match field&mask", 0, serializedBuffer.readUnsignedByte());
+        Assert.assertEquals("Wrong match length", 4, serializedBuffer.readUnsignedByte());
+        serializedBuffer.skipBytes(4);
+        Assert.assertEquals("Wrong property type", 10, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong property length", 4, serializedBuffer.readUnsignedShort());
+        serializedBuffer.skipBytes(4);
+        Assert.assertEquals("Wrong property type", 12, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong property length", 4, serializedBuffer.readUnsignedShort());
+        serializedBuffer.skipBytes(4);
+        Assert.assertEquals("Wrong property type", 13, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong property length", 4, serializedBuffer.readUnsignedShort());
+        serializedBuffer.skipBytes(4);
+        Assert.assertEquals("Wrong property type", 14, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong property length", 12, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong match class", 0x8000, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong match field&mask", 20, serializedBuffer.readUnsignedByte());
+        Assert.assertEquals("Wrong match length", 1, serializedBuffer.readUnsignedByte());
+        Assert.assertEquals("Wrong match class", 0x8000, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong match field&mask", 18, serializedBuffer.readUnsignedByte());
+        Assert.assertEquals("Wrong match length", 1, serializedBuffer.readUnsignedByte());
+        serializedBuffer.skipBytes(4);
+        Assert.assertEquals("Wrong property type", 15, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong property length", 4, serializedBuffer.readUnsignedShort());
+        serializedBuffer.skipBytes(4);
+        Assert.assertTrue("Unread data", serializedBuffer.readableBytes() == 0);
+    }
+
+    @Test
+    public void testPortDescSerialize() throws Exception {
+        MultipartReplyMessageBuilder builder = new MultipartReplyMessageBuilder();
+        BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
+        builder.setFlags(new MultipartRequestFlags(true));
+        builder.setType(MultipartType.forValue(13));
+        MultipartReplyPortDescCaseBuilder portDescCase = new MultipartReplyPortDescCaseBuilder();
+        MultipartReplyPortDescBuilder portDesc = new MultipartReplyPortDescBuilder();
+        portDesc.setPorts(createPortList());
+        portDescCase.setMultipartReplyPortDesc(portDesc.build());
+        builder.setMultipartReplyBody(portDescCase.build());
+        MultipartReplyMessage message = builder.build();
+        ByteBuf serializedBuffer = UnpooledByteBufAllocator.DEFAULT.buffer();
+        factory.serialize(message, serializedBuffer);
+        BufferHelper.checkHeaderV13(serializedBuffer, MESSAGE_TYPE, 80);
+        Assert.assertEquals("Wrong type", MultipartType.OFPMPPORTDESC.getIntValue(), serializedBuffer.readShort());
+        Assert.assertEquals("Wrong flags", message.getFlags(),
+                createMultipartRequestFlags(serializedBuffer.readShort()));
+        serializedBuffer.skipBytes(PADDING);
+        MultipartReplyPortDescCase body = (MultipartReplyPortDescCase) message.getMultipartReplyBody();
+        MultipartReplyPortDesc messageOutput = body.getMultipartReplyPortDesc();
+        Ports port = messageOutput.getPorts().get(0);
+        Assert.assertEquals("Wrong PortNo", port.getPortNo().intValue(), serializedBuffer.readUnsignedInt());
+        serializedBuffer.skipBytes(4);
+        byte[] address = new byte[6];
+        serializedBuffer.readBytes(address);
+        Assert.assertEquals("Wrong MacAddress", port.getHwAddr().getValue().toLowerCase(),
+                new MacAddress(ByteBufUtils.macAddressToString(address)).getValue().toLowerCase());
+        serializedBuffer.skipBytes(2);
+        byte[] name = new byte[16];
+        serializedBuffer.readBytes(name);
+        Assert.assertEquals("Wrong name", port.getName(), new String(name).trim());
+        Assert.assertEquals("Wrong config", port.getConfig(), createPortConfig(serializedBuffer.readInt()));
+        Assert.assertEquals("Wrong state", port.getState(), createPortState(serializedBuffer.readInt()));
+        Assert.assertEquals("Wrong current", port.getCurrentFeatures(), createPortFeatures(serializedBuffer.readInt()));
+        Assert.assertEquals("Wrong advertised", port.getAdvertisedFeatures(),
+                createPortFeatures(serializedBuffer.readInt()));
+        Assert.assertEquals("Wrong supported", port.getSupportedFeatures(),
+                createPortFeatures(serializedBuffer.readInt()));
+        Assert.assertEquals("Wrong peer", port.getPeerFeatures(), createPortFeatures(serializedBuffer.readInt()));
+        Assert.assertEquals("Wrong Current speed", port.getCurrSpeed().longValue(), serializedBuffer.readInt());
+        Assert.assertEquals("Wrong Max speed", port.getMaxSpeed().longValue(), serializedBuffer.readInt());
+    }
+
+    @Test
+    public void testMeterFeaturesSerialize() throws Exception {
+        MultipartReplyMessageBuilder builder = new MultipartReplyMessageBuilder();
+        BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
+        builder.setFlags(new MultipartRequestFlags(true));
+        builder.setType(MultipartType.forValue(11));
+        MultipartReplyMeterFeaturesCaseBuilder meterFeaturesCase = new MultipartReplyMeterFeaturesCaseBuilder();
+        MultipartReplyMeterFeaturesBuilder meterFeatures = new MultipartReplyMeterFeaturesBuilder();
+        meterFeatures.setMaxMeter(1L);
+        meterFeatures.setBandTypes(new MeterBandTypeBitmap(true, false));
+        meterFeatures.setCapabilities(new MeterFlags(true, false, true, false));
+        meterFeatures.setMaxBands((short) 1);
+        meterFeatures.setMaxColor((short) 1);
+        meterFeaturesCase.setMultipartReplyMeterFeatures(meterFeatures.build());
+        builder.setMultipartReplyBody(meterFeaturesCase.build());
+        MultipartReplyMessage message = builder.build();
+        ByteBuf serializedBuffer = UnpooledByteBufAllocator.DEFAULT.buffer();
+        factory.serialize(message, serializedBuffer);
+        BufferHelper.checkHeaderV13(serializedBuffer, MESSAGE_TYPE, 30);
+        Assert.assertEquals("Wrong type", MultipartType.OFPMPMETERFEATURES.getIntValue(), serializedBuffer.readShort());
+        Assert.assertEquals("Wrong flags", message.getFlags(),
+                createMultipartRequestFlags(serializedBuffer.readShort()));
+        serializedBuffer.skipBytes(PADDING);
+        MultipartReplyMeterFeaturesCase body = (MultipartReplyMeterFeaturesCase) message.getMultipartReplyBody();
+        MultipartReplyMeterFeatures messageOutput = body.getMultipartReplyMeterFeatures();
+        Assert.assertEquals("Wrong max meter", messageOutput.getMaxMeter().intValue(), serializedBuffer.readInt());
+        Assert.assertEquals("Wrong band type", messageOutput.getBandTypes(),
+                createMeterBandTypeBitmap(serializedBuffer.readInt()));
+        Assert.assertEquals("Wrong capabilities", messageOutput.getCapabilities(),
+                createMeterFlags(serializedBuffer.readShort()));
+        Assert.assertEquals("Wrong max bands", messageOutput.getMaxBands().shortValue(),
+                serializedBuffer.readUnsignedByte());
+        Assert.assertEquals("Wrong max color", messageOutput.getMaxColor().shortValue(),
+                serializedBuffer.readUnsignedByte());
+        serializedBuffer.skipBytes(2);
+    }
+
+    @Test
+    public void testMeterConfigSerialize() throws Exception {
+        MultipartReplyMessageBuilder builder = new MultipartReplyMessageBuilder();
+        BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
+        builder.setFlags(new MultipartRequestFlags(true));
+        builder.setType(MultipartType.forValue(10));
+        MultipartReplyMeterConfigCaseBuilder meterConfigCase = new MultipartReplyMeterConfigCaseBuilder();
+        MultipartReplyMeterConfigBuilder meterConfigBuilder = new MultipartReplyMeterConfigBuilder();
+        meterConfigBuilder.setMeterConfig(createMeterConfig());
+        meterConfigCase.setMultipartReplyMeterConfig(meterConfigBuilder.build());
+        builder.setMultipartReplyBody(meterConfigCase.build());
+        MultipartReplyMessage message = builder.build();
+        ByteBuf serializedBuffer = UnpooledByteBufAllocator.DEFAULT.buffer();
+        factory.serialize(message, serializedBuffer);
+        BufferHelper.checkHeaderV13(serializedBuffer, MESSAGE_TYPE, 48);
+        Assert.assertEquals("Wrong type", MultipartType.OFPMPMETERCONFIG.getIntValue(), serializedBuffer.readShort());
+        Assert.assertEquals("Wrong flags", message.getFlags(),
+                createMultipartRequestFlags(serializedBuffer.readShort()));
+        serializedBuffer.skipBytes(PADDING);
+        MultipartReplyMeterConfigCase body = (MultipartReplyMeterConfigCase) message.getMultipartReplyBody();
+        MultipartReplyMeterConfig messageOutput = body.getMultipartReplyMeterConfig();
+        MeterConfig meterConfig = messageOutput.getMeterConfig().get(0);
+        Assert.assertEquals("Wrong len", 32, serializedBuffer.readShort());
+        Assert.assertEquals("Wrong flags", meterConfig.getFlags(), createMeterFlags(serializedBuffer.readShort()));
+        Assert.assertEquals("Wrong meterId", meterConfig.getMeterId().getValue().intValue(),
+                serializedBuffer.readInt());
+        Assert.assertEquals("Wrong bands", meterConfig.getBands(), decodeBandsList(serializedBuffer));
+    }
+
+    @Test
+    public void testMeterSerialize() throws Exception {
+        MultipartReplyMessageBuilder builder = new MultipartReplyMessageBuilder();
+        BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
+        builder.setFlags(new MultipartRequestFlags(true));
+        builder.setType(MultipartType.forValue(9));
+        MultipartReplyMeterCaseBuilder meterCase = new MultipartReplyMeterCaseBuilder();
+        MultipartReplyMeterBuilder meter = new MultipartReplyMeterBuilder();
+        meter.setMeterStats(createMeterStats());
+        meterCase.setMultipartReplyMeter(meter.build());
+        builder.setMultipartReplyBody(meterCase.build());
+        MultipartReplyMessage message = builder.build();
+        ByteBuf serializedBuffer = UnpooledByteBufAllocator.DEFAULT.buffer();
+        factory.serialize(message, serializedBuffer);
+        BufferHelper.checkHeaderV13(serializedBuffer, MESSAGE_TYPE, 74);
+        Assert.assertEquals("Wrong type", MultipartType.OFPMPMETER.getIntValue(), serializedBuffer.readShort());
+        Assert.assertEquals("Wrong flags", message.getFlags(),
+                createMultipartRequestFlags(serializedBuffer.readShort()));
+        serializedBuffer.skipBytes(PADDING);
+        MultipartReplyMeterCase body = (MultipartReplyMeterCase) message.getMultipartReplyBody();
+        MultipartReplyMeter messageOutput = body.getMultipartReplyMeter();
+        MeterStats meterStats = messageOutput.getMeterStats().get(0);
+        Assert.assertEquals("Wrong meterId", meterStats.getMeterId().getValue().intValue(), serializedBuffer.readInt());
+        Assert.assertEquals("Wrong len", 58, serializedBuffer.readInt());
+        serializedBuffer.skipBytes(6);
+        Assert.assertEquals("Wrong flow count", meterStats.getFlowCount().intValue(), serializedBuffer.readInt());
+        Assert.assertEquals("Wrong packet in count", meterStats.getPacketInCount().longValue(),
+                serializedBuffer.readLong());
+        Assert.assertEquals("Wrong byte in count", meterStats.getByteInCount().longValue(),
+                serializedBuffer.readLong());
+        Assert.assertEquals("Wrong duration sec", meterStats.getDurationSec().intValue(), serializedBuffer.readInt());
+        Assert.assertEquals("Wrong duration nsec", meterStats.getDurationNsec().intValue(), serializedBuffer.readInt());
+        MeterBandStats meterBandStats = meterStats.getMeterBandStats().get(0);
+        Assert.assertEquals("Wrong packet in count", meterBandStats.getPacketBandCount().longValue(),
+                serializedBuffer.readLong());
+        Assert.assertEquals("Wrong byte in count", meterBandStats.getByteBandCount().longValue(),
+                serializedBuffer.readLong());
+    }
+
+    @Test
+    public void testGroupFeaturesSerialize() throws Exception {
+        MultipartReplyMessageBuilder builder = new MultipartReplyMessageBuilder();
+        BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
+        builder.setFlags(new MultipartRequestFlags(true));
+        builder.setType(MultipartType.forValue(8));
+        MultipartReplyGroupFeaturesCaseBuilder featureCase = new MultipartReplyGroupFeaturesCaseBuilder();
+        MultipartReplyGroupFeaturesBuilder feature = new MultipartReplyGroupFeaturesBuilder();
+        feature.setTypes(new GroupTypes(true, false, true, false));
+        feature.setCapabilities(new GroupCapabilities(true, false, true, true));
+        List<Long> maxGroups = new ArrayList<>();
+        maxGroups.add(1L);
+        maxGroups.add(2L);
+        maxGroups.add(3L);
+        maxGroups.add(4L);
+        feature.setMaxGroups(maxGroups);
+        feature.setActionsBitmap(createActionType());
+        featureCase.setMultipartReplyGroupFeatures(feature.build());
+        builder.setMultipartReplyBody(featureCase.build());
+        MultipartReplyMessage message = builder.build();
+        ByteBuf serializedBuffer = UnpooledByteBufAllocator.DEFAULT.buffer();
+        factory.serialize(message, serializedBuffer);
+        BufferHelper.checkHeaderV13(serializedBuffer, MESSAGE_TYPE, 56);
+        Assert.assertEquals("Wrong type", MultipartType.OFPMPGROUPFEATURES.getIntValue(), serializedBuffer.readShort());
+        Assert.assertEquals("Wrong flags", message.getFlags(),
+                createMultipartRequestFlags(serializedBuffer.readShort()));
+        serializedBuffer.skipBytes(PADDING);
+        MultipartReplyGroupFeaturesCase body = (MultipartReplyGroupFeaturesCase) message.getMultipartReplyBody();
+        MultipartReplyGroupFeatures messageOutput = body.getMultipartReplyGroupFeatures();
+        Assert.assertEquals("Wrong type", messageOutput.getTypes(), createGroupTypes(serializedBuffer.readInt()));
+        Assert.assertEquals("Wrong capabilities", messageOutput.getCapabilities(),
+                createGroupCapabilities(serializedBuffer.readInt()));
+        Assert.assertEquals("Wrong max groups", messageOutput.getMaxGroups().get(0).intValue(),
+                serializedBuffer.readInt());
+        Assert.assertEquals("Wrong max groups", messageOutput.getMaxGroups().get(1).intValue(),
+                serializedBuffer.readInt());
+        Assert.assertEquals("Wrong max groups", messageOutput.getMaxGroups().get(2).intValue(),
+                serializedBuffer.readInt());
+        Assert.assertEquals("Wrong max groups", messageOutput.getMaxGroups().get(3).intValue(),
+                serializedBuffer.readInt());
+        Assert.assertEquals("Wrong actions", messageOutput.getActionsBitmap().get(0),
+                createActionType(serializedBuffer.readInt()));
+        Assert.assertEquals("Wrong actions", messageOutput.getActionsBitmap().get(1),
+                createActionType(serializedBuffer.readInt()));
+        Assert.assertEquals("Wrong actions", messageOutput.getActionsBitmap().get(2),
+                createActionType(serializedBuffer.readInt()));
+        Assert.assertEquals("Wrong actions", messageOutput.getActionsBitmap().get(3),
+                createActionType(serializedBuffer.readInt()));
+    }
+
+    @Test
+    public void testGroupDescSerialize() throws Exception {
+        MultipartReplyMessageBuilder builder = new MultipartReplyMessageBuilder();
+        BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
+        builder.setFlags(new MultipartRequestFlags(true));
+        builder.setType(MultipartType.forValue(7));
+        MultipartReplyGroupDescCaseBuilder groupCase = new MultipartReplyGroupDescCaseBuilder();
+        MultipartReplyGroupDescBuilder group = new MultipartReplyGroupDescBuilder();
+        group.setGroupDesc(createGroupDesc());
+        groupCase.setMultipartReplyGroupDesc(group.build());
+        builder.setMultipartReplyBody(groupCase.build());
+        MultipartReplyMessage message = builder.build();
+        ByteBuf serializedBuffer = UnpooledByteBufAllocator.DEFAULT.buffer();
+        factory.serialize(message, serializedBuffer);
+        BufferHelper.checkHeaderV13(serializedBuffer, MESSAGE_TYPE, 64);
+        Assert.assertEquals("Wrong type", MultipartType.OFPMPGROUPDESC.getIntValue(), serializedBuffer.readShort());
+        Assert.assertEquals("Wrong flags", message.getFlags(),
+                createMultipartRequestFlags(serializedBuffer.readShort()));
+        serializedBuffer.skipBytes(PADDING);
+        MultipartReplyGroupDescCase body = (MultipartReplyGroupDescCase) message.getMultipartReplyBody();
+        MultipartReplyGroupDesc messageOutput = body.getMultipartReplyGroupDesc();
+        GroupDesc groupDesc = messageOutput.getGroupDesc().get(0);
+        Assert.assertEquals("Wrong length", 48, serializedBuffer.readShort());
+        Assert.assertEquals("Wrong type", groupDesc.getType().getIntValue(), serializedBuffer.readUnsignedByte());
+        serializedBuffer.skipBytes(1);
+        Assert.assertEquals("Wrong group id", groupDesc.getGroupId().getValue().intValue(), serializedBuffer.readInt());
+        BucketsList bucketList = groupDesc.getBucketsList().get(0);
+        Assert.assertEquals("Wrong length", 40, serializedBuffer.readShort());
+        Assert.assertEquals("Wrong weight", bucketList.getWeight().intValue(), serializedBuffer.readShort());
+        Assert.assertEquals("Wrong watch port", bucketList.getWatchPort().getValue().intValue(),
+                serializedBuffer.readInt());
+        Assert.assertEquals("Wrong watch group", bucketList.getWatchGroup().intValue(), serializedBuffer.readInt());
+        serializedBuffer.skipBytes(4);
+
+        Assert.assertEquals("Wrong action type", 0, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong action length", 16, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong action type", 45, serializedBuffer.readUnsignedInt());
+        Assert.assertEquals("Wrong action type", 55, serializedBuffer.readUnsignedShort());
+        serializedBuffer.skipBytes(6);
+        Assert.assertEquals("Wrong action type", 23, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong action length", 8, serializedBuffer.readUnsignedShort());
+        Assert.assertEquals("Wrong action type", 64, serializedBuffer.readUnsignedByte());
+        serializedBuffer.skipBytes(3);
+        Assert.assertTrue("Not all data were read", serializedBuffer.readableBytes() == 0);
+    }
+
+    @Test
+    public void testGroupSerialize() throws Exception {
+        MultipartReplyMessageBuilder builder = new MultipartReplyMessageBuilder();
+        BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
+        builder.setFlags(new MultipartRequestFlags(true));
+        builder.setType(MultipartType.forValue(6));
+        MultipartReplyGroupCaseBuilder groupCase = new MultipartReplyGroupCaseBuilder();
+        MultipartReplyGroupBuilder group = new MultipartReplyGroupBuilder();
+        group.setGroupStats(createGroupStats());
+        groupCase.setMultipartReplyGroup(group.build());
+        builder.setMultipartReplyBody(groupCase.build());
+        MultipartReplyMessage message = builder.build();
+        ByteBuf serializedBuffer = UnpooledByteBufAllocator.DEFAULT.buffer();
+        factory.serialize(message, serializedBuffer);
+        BufferHelper.checkHeaderV13(serializedBuffer, MESSAGE_TYPE, 72);
+        Assert.assertEquals("Wrong type", MultipartType.OFPMPGROUP.getIntValue(), serializedBuffer.readShort());
+        Assert.assertEquals("Wrong flags", message.getFlags(),
+                createMultipartRequestFlags(serializedBuffer.readShort()));
+        serializedBuffer.skipBytes(PADDING);
+        MultipartReplyGroupCase body = (MultipartReplyGroupCase) message.getMultipartReplyBody();
+        MultipartReplyGroup messageOutput = body.getMultipartReplyGroup();
+        GroupStats groupStats = messageOutput.getGroupStats().get(0);
+        Assert.assertEquals("Wrong length", 56, serializedBuffer.readShort());
+        serializedBuffer.skipBytes(2);
+        Assert.assertEquals("Wrong group id", groupStats.getGroupId().getValue().intValue(),
+                serializedBuffer.readInt());
+        Assert.assertEquals("Wrong ref count", groupStats.getRefCount().intValue(), serializedBuffer.readInt());
+        serializedBuffer.skipBytes(4);
+        Assert.assertEquals("Wrong Packet count", groupStats.getPacketCount().longValue(), serializedBuffer.readLong());
+        Assert.assertEquals("Wrong Byte count", groupStats.getByteCount().longValue(), serializedBuffer.readLong());
+        Assert.assertEquals("Wrong duration sec", groupStats.getDurationSec().intValue(), serializedBuffer.readInt());
+        Assert.assertEquals("Wrong duration nsec", groupStats.getDurationNsec().intValue(), serializedBuffer.readInt());
+        BucketStats bucketStats = groupStats.getBucketStats().get(0);
+        Assert.assertEquals("Wrong Packet count", bucketStats.getPacketCount().longValue(),
+                serializedBuffer.readLong());
+        Assert.assertEquals("Wrong Byte count", bucketStats.getByteCount().longValue(), serializedBuffer.readLong());
+    }
+
+    @Test
+    public void testQueueSerialize() throws Exception {
+        MultipartReplyMessageBuilder builder = new MultipartReplyMessageBuilder();
+        BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
+        builder.setFlags(new MultipartRequestFlags(true));
+        builder.setType(MultipartType.forValue(5));
+        MultipartReplyQueueCaseBuilder queueCase = new MultipartReplyQueueCaseBuilder();
+        MultipartReplyQueueBuilder queue = new MultipartReplyQueueBuilder();
+        queue.setQueueStats(createQueueStats());
+        queueCase.setMultipartReplyQueue(queue.build());
+        builder.setMultipartReplyBody(queueCase.build());
+        MultipartReplyMessage message = builder.build();
+        ByteBuf serializedBuffer = UnpooledByteBufAllocator.DEFAULT.buffer();
+        factory.serialize(message, serializedBuffer);
+        BufferHelper.checkHeaderV13(serializedBuffer, MESSAGE_TYPE, 56);
+        Assert.assertEquals("Wrong type", MultipartType.OFPMPQUEUE.getIntValue(), serializedBuffer.readShort());
+        Assert.assertEquals("Wrong flags", message.getFlags(),
+                createMultipartRequestFlags(serializedBuffer.readShort()));
+        serializedBuffer.skipBytes(PADDING);
+        MultipartReplyQueueCase body = (MultipartReplyQueueCase) message.getMultipartReplyBody();
+        MultipartReplyQueue messageOutput = body.getMultipartReplyQueue();
+        QueueStats queueStats = messageOutput.getQueueStats().get(0);
+        Assert.assertEquals("Wrong PortNo", queueStats.getPortNo().intValue(), serializedBuffer.readUnsignedInt());
+        Assert.assertEquals("Wrong queue id", queueStats.getQueueId().intValue(), serializedBuffer.readUnsignedInt());
+        Assert.assertEquals("Wrong tx bytes", queueStats.getTxBytes().longValue(), serializedBuffer.readLong());
+        Assert.assertEquals("Wrong tx packets", queueStats.getTxPackets().longValue(), serializedBuffer.readLong());
+        Assert.assertEquals("Wrong tx errors", queueStats.getTxErrors().longValue(), serializedBuffer.readLong());
+        Assert.assertEquals("Wrong duration sec", queueStats.getDurationSec().intValue(), serializedBuffer.readInt());
+        Assert.assertEquals("Wrong duration nsec", queueStats.getDurationNsec().intValue(), serializedBuffer.readInt());
+    }
+
+    @Test
+    public void testPortStatsSerialize() throws Exception {
+        MultipartReplyMessageBuilder builder = new MultipartReplyMessageBuilder();
+        BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
+        builder.setFlags(new MultipartRequestFlags(true));
+        builder.setType(MultipartType.forValue(4));
+        MultipartReplyPortStatsCaseBuilder portStatsCase = new MultipartReplyPortStatsCaseBuilder();
+        MultipartReplyPortStatsBuilder portStats = new MultipartReplyPortStatsBuilder();
+        portStats.setPortStats(createPortStats());
+        portStatsCase.setMultipartReplyPortStats(portStats.build());
+        builder.setMultipartReplyBody(portStatsCase.build());
+        MultipartReplyMessage message = builder.build();
+        ByteBuf serializedBuffer = UnpooledByteBufAllocator.DEFAULT.buffer();
+        factory.serialize(message, serializedBuffer);
+        BufferHelper.checkHeaderV13(serializedBuffer, MESSAGE_TYPE, 128);
+        Assert.assertEquals("Wrong type", MultipartType.OFPMPPORTSTATS.getIntValue(), serializedBuffer.readShort());
+        Assert.assertEquals("Wrong flags", message.getFlags(),
+                createMultipartRequestFlags(serializedBuffer.readShort()));
+        serializedBuffer.skipBytes(PADDING);
+        MultipartReplyPortStatsCase body = (MultipartReplyPortStatsCase) message.getMultipartReplyBody();
+        MultipartReplyPortStats messageOutput = body.getMultipartReplyPortStats();
+        PortStats portStatsOutput = messageOutput.getPortStats().get(0);
+        Assert.assertEquals("Wrong port no", portStatsOutput.getPortNo().intValue(), serializedBuffer.readInt());
+        serializedBuffer.skipBytes(4);
+        Assert.assertEquals("Wrong rx packets", portStatsOutput.getRxPackets().longValue(),
+                serializedBuffer.readLong());
+        Assert.assertEquals("Wrong tx packets", portStatsOutput.getTxPackets().longValue(),
+                serializedBuffer.readLong());
+        Assert.assertEquals("Wrong rx bytes", portStatsOutput.getRxBytes().longValue(), serializedBuffer.readLong());
+        Assert.assertEquals("Wrong tx bytes", portStatsOutput.getTxBytes().longValue(), serializedBuffer.readLong());
+        Assert.assertEquals("Wrong rx dropped", portStatsOutput.getRxDropped().longValue(),
+                serializedBuffer.readLong());
+        Assert.assertEquals("Wrong tx dropped", portStatsOutput.getTxDropped().longValue(),
+                serializedBuffer.readLong());
+        Assert.assertEquals("Wrong rx errors", portStatsOutput.getRxErrors().longValue(), serializedBuffer.readLong());
+        Assert.assertEquals("Wrong tx errors", portStatsOutput.getTxErrors().longValue(), serializedBuffer.readLong());
+        Assert.assertEquals("Wrong rx frame err", portStatsOutput.getRxFrameErr().longValue(),
+                serializedBuffer.readLong());
+        Assert.assertEquals("Wrong rx over err", portStatsOutput.getRxOverErr().longValue(),
+                serializedBuffer.readLong());
+        Assert.assertEquals("Wrong rx crc err", portStatsOutput.getRxCrcErr().longValue(), serializedBuffer.readLong());
+        Assert.assertEquals("Wrong collisions", portStatsOutput.getCollisions().longValue(),
+                serializedBuffer.readLong());
+        Assert.assertEquals("Wrong duration sec", portStatsOutput.getDurationSec().intValue(),
+                serializedBuffer.readInt());
+        Assert.assertEquals("Wrong duration nsec", portStatsOutput.getDurationNsec().intValue(),
+                serializedBuffer.readInt());
+    }
+
+    @Test
+    public void testTableSerialize() throws Exception {
+        MultipartReplyMessageBuilder builder = new MultipartReplyMessageBuilder();
+        BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
+        builder.setFlags(new MultipartRequestFlags(true));
+        builder.setType(MultipartType.forValue(3));
+        MultipartReplyTableCaseBuilder tableCase = new MultipartReplyTableCaseBuilder();
+        MultipartReplyTableBuilder table = new MultipartReplyTableBuilder();
+        table.setTableStats(createTableStats());
+        tableCase.setMultipartReplyTable(table.build());
+        builder.setMultipartReplyBody(tableCase.build());
+        MultipartReplyMessage message = builder.build();
+        ByteBuf serializedBuffer = UnpooledByteBufAllocator.DEFAULT.buffer();
+        factory.serialize(message, serializedBuffer);
+        BufferHelper.checkHeaderV13(serializedBuffer, MESSAGE_TYPE, 40);
+        Assert.assertEquals("Wrong type", MultipartType.OFPMPTABLE.getIntValue(), serializedBuffer.readShort());
+        Assert.assertEquals("Wrong flags", message.getFlags(),
+                createMultipartRequestFlags(serializedBuffer.readShort()));
+        serializedBuffer.skipBytes(PADDING);
+        MultipartReplyTableCase body = (MultipartReplyTableCase) message.getMultipartReplyBody();
+        MultipartReplyTable messageOutput = body.getMultipartReplyTable();
+        TableStats tableStats = messageOutput.getTableStats().get(0);
+        Assert.assertEquals("Wrong tableId", tableStats.getTableId().shortValue(), serializedBuffer.readUnsignedByte());
+        serializedBuffer.skipBytes(3);
+        Assert.assertEquals("Wrong active count", tableStats.getActiveCount().longValue(), serializedBuffer.readInt());
+        Assert.assertEquals("Wrong lookup count", tableStats.getLookupCount().longValue(), serializedBuffer.readLong());
+        Assert.assertEquals("Wrong matched count", tableStats.getMatchedCount().longValue(),
+                serializedBuffer.readLong());
+    }
+
+    @Test
+    public void testAggregateSerialize() throws Exception {
+        MultipartReplyMessageBuilder builder = new MultipartReplyMessageBuilder();
+        BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
+        builder.setFlags(new MultipartRequestFlags(true));
+        builder.setType(MultipartType.forValue(2));
+        MultipartReplyAggregateCaseBuilder aggregateCase = new MultipartReplyAggregateCaseBuilder();
+        MultipartReplyAggregateBuilder aggregate = new MultipartReplyAggregateBuilder();
+        aggregate.setPacketCount(BigInteger.valueOf(1L));
+        aggregate.setByteCount(BigInteger.valueOf(1L));
+        aggregate.setFlowCount(1L);
+        aggregateCase.setMultipartReplyAggregate(aggregate.build());
+        builder.setMultipartReplyBody(aggregateCase.build());
+        MultipartReplyMessage message = builder.build();
+        ByteBuf serializedBuffer = UnpooledByteBufAllocator.DEFAULT.buffer();
+        factory.serialize(message, serializedBuffer);
+        BufferHelper.checkHeaderV13(serializedBuffer, MESSAGE_TYPE, 40);
+        Assert.assertEquals("Wrong type", MultipartType.OFPMPAGGREGATE.getIntValue(), serializedBuffer.readShort());
+        Assert.assertEquals("Wrong flags", message.getFlags(),
+                createMultipartRequestFlags(serializedBuffer.readShort()));
+        serializedBuffer.skipBytes(PADDING);
+        MultipartReplyAggregateCase body = (MultipartReplyAggregateCase) message.getMultipartReplyBody();
+        MultipartReplyAggregate messageOutput = body.getMultipartReplyAggregate();
+        Assert.assertEquals("Wrong Packet count", messageOutput.getPacketCount().longValue(),
+                serializedBuffer.readLong());
+        Assert.assertEquals("Wrong Byte count", messageOutput.getByteCount().longValue(), serializedBuffer.readLong());
+        Assert.assertEquals("Wrong Flow count", messageOutput.getFlowCount().longValue(), serializedBuffer.readInt());
+        serializedBuffer.skipBytes(4);
+    }
+
+    @Test
+    public void testFlowSerialize() throws Exception {
+        MultipartReplyMessageBuilder builder = new MultipartReplyMessageBuilder();
+        BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
+        builder.setFlags(new MultipartRequestFlags(true));
+        builder.setType(MultipartType.forValue(1));
+        MultipartReplyFlowCaseBuilder flowCase = new MultipartReplyFlowCaseBuilder();
+        MultipartReplyFlowBuilder flow = new MultipartReplyFlowBuilder();
+        flow.setFlowStats(createFlowStats());
+        flowCase.setMultipartReplyFlow(flow.build());
+        builder.setMultipartReplyBody(flowCase.build());
+        MultipartReplyMessage message = builder.build();
+        ByteBuf serializedBuffer = UnpooledByteBufAllocator.DEFAULT.buffer();
+        factory.serialize(message, serializedBuffer);
+        BufferHelper.checkHeaderV13(serializedBuffer, MESSAGE_TYPE, 192);
+        Assert.assertEquals("Wrong type", MultipartType.OFPMPFLOW.getIntValue(), serializedBuffer.readShort());
+        Assert.assertEquals("Wrong flags", message.getFlags(),
+                createMultipartRequestFlags(serializedBuffer.readShort()));
+        serializedBuffer.skipBytes(PADDING);
+        testFlowBody(message.getMultipartReplyBody(), serializedBuffer);
+    }
+
+    @Test
+    public void testDescSerialize() throws Exception {
+        MultipartReplyMessageBuilder builder = new MultipartReplyMessageBuilder();
+        BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
+        builder.setFlags(new MultipartRequestFlags(true));
+        builder.setType(MultipartType.forValue(0));
+        MultipartReplyDescCaseBuilder descCase = new MultipartReplyDescCaseBuilder();
+        MultipartReplyDescBuilder desc = new MultipartReplyDescBuilder();
+        desc.setMfrDesc("Test");
+        desc.setHwDesc("Test");
+        desc.setSwDesc("Test");
+        desc.setSerialNum("12345");
+        desc.setDpDesc("Test");
+        descCase.setMultipartReplyDesc(desc.build());
+        builder.setMultipartReplyBody(descCase.build());
+        MultipartReplyMessage message = builder.build();
+        ByteBuf serializedBuffer = UnpooledByteBufAllocator.DEFAULT.buffer();
+        factory.serialize(message, serializedBuffer);
+        BufferHelper.checkHeaderV13(serializedBuffer, MESSAGE_TYPE, 1072);
+        Assert.assertEquals("Wrong type", MultipartType.OFPMPDESC.getIntValue(), serializedBuffer.readShort());
+        Assert.assertEquals("Wrong flags", message.getFlags(),
+                createMultipartRequestFlags(serializedBuffer.readShort()));
+        serializedBuffer.skipBytes(PADDING);
+        Assert.assertEquals("Wrong desc body", message.getMultipartReplyBody(), decodeDescBody(serializedBuffer));
+    }
+
+    private static void testFlowBody(MultipartReplyBody body, ByteBuf output) {
+        MultipartReplyFlowCase flowCase = (MultipartReplyFlowCase) body;
+        MultipartReplyFlow flow = flowCase.getMultipartReplyFlow();
+        FlowStats flowStats = flow.getFlowStats().get(0);
+        Assert.assertEquals("Wrong length", 176, output.readShort());
+        Assert.assertEquals("Wrong Table ID", flowStats.getTableId().intValue(), output.readUnsignedByte());
+        output.skipBytes(1);
+        Assert.assertEquals("Wrong duration sec", flowStats.getDurationSec().intValue(), output.readInt());
+        Assert.assertEquals("Wrong duration nsec", flowStats.getDurationNsec().intValue(), output.readInt());
+        Assert.assertEquals("Wrong priority", flowStats.getPriority().intValue(), output.readShort());
+        Assert.assertEquals("Wrong idle timeout", flowStats.getIdleTimeout().intValue(), output.readShort());
+        Assert.assertEquals("Wrong hard timeout", flowStats.getHardTimeout().intValue(), output.readShort());
+        output.skipBytes(6);
+        Assert.assertEquals("Wrong cookie", flowStats.getCookie().longValue(), output.readLong());
+        Assert.assertEquals("Wrong Packet count", flowStats.getPacketCount().longValue(), output.readLong());
+        Assert.assertEquals("Wrong Byte count", flowStats.getByteCount().longValue(), output.readLong());
+        Assert.assertEquals("Wrong match type", 1, output.readUnsignedShort());
+        output.skipBytes(EncodeConstants.SIZE_OF_SHORT_IN_BYTES);
+        Assert.assertEquals("Wrong oxm class", 0x8000, output.readUnsignedShort());
+        short fieldAndMask = output.readUnsignedByte();
+        Assert.assertEquals("Wrong oxm hasMask", 0, fieldAndMask & 1);
+        Assert.assertEquals("Wrong oxm field", 1, fieldAndMask >> 1);
+        output.skipBytes(EncodeConstants.SIZE_OF_BYTE_IN_BYTES);
+        Assert.assertEquals("Wrong oxm value", 42, output.readUnsignedInt());
+        Assert.assertEquals("Wrong oxm class", 0x8000, output.readUnsignedShort());
+        fieldAndMask = output.readUnsignedByte();
+        Assert.assertEquals("Wrong oxm hasMask", 0, fieldAndMask & 1);
+        Assert.assertEquals("Wrong oxm field", 9, fieldAndMask >> 1);
+        output.skipBytes(EncodeConstants.SIZE_OF_BYTE_IN_BYTES);
+        Assert.assertEquals("Wrong oxm value", 4, output.readUnsignedByte());
+        output.skipBytes(7);
+        Assert.assertEquals("Wrong instruction type", 1, output.readUnsignedShort());
+        Assert.assertEquals("Wrong instruction length", 8, output.readUnsignedShort());
+        Assert.assertEquals("Wrong instruction table-id", 5, output.readUnsignedByte());
+        output.skipBytes(3);
+        Assert.assertEquals("Wrong instruction type", 2, output.readUnsignedShort());
+        Assert.assertEquals("Wrong instruction length", 24, output.readUnsignedShort());
+        output.skipBytes(4);
+        byte[] actual = new byte[8];
+        output.readBytes(actual);
+        Assert.assertEquals("Wrong instruction metadata", "00 01 02 03 04 05 06 07",
+                ByteBufUtils.bytesToHexString(actual));
+        actual = new byte[8];
+        output.readBytes(actual);
+        Assert.assertEquals("Wrong instruction metadata-mask", "07 06 05 04 03 02 01 00",
+                ByteBufUtils.bytesToHexString(actual));
+        Assert.assertEquals("Wrong instruction type", 5, output.readUnsignedShort());
+        Assert.assertEquals("Wrong instruction length", 8, output.readUnsignedShort());
+        output.skipBytes(4);
+        Assert.assertEquals("Wrong instruction type", 6, output.readUnsignedShort());
+        Assert.assertEquals("Wrong instruction length", 8, output.readUnsignedShort());
+        Assert.assertEquals("Wrong instruction meter-id", 42, output.readUnsignedInt());
+        Assert.assertEquals("Wrong instruction type", 3, output.readUnsignedShort());
+        Assert.assertEquals("Wrong instruction length", 32, output.readUnsignedShort());
+        output.skipBytes(4);
+        Assert.assertEquals("Wrong action type", 0, output.readUnsignedShort());
+        Assert.assertEquals("Wrong action length", 16, output.readUnsignedShort());
+        Assert.assertEquals("Wrong action type", 45, output.readUnsignedInt());
+        Assert.assertEquals("Wrong action type", 55, output.readUnsignedShort());
+        output.skipBytes(6);
+        Assert.assertEquals("Wrong action type", 23, output.readUnsignedShort());
+        Assert.assertEquals("Wrong action length", 8, output.readUnsignedShort());
+        Assert.assertEquals("Wrong action type", 64, output.readUnsignedByte());
+        output.skipBytes(3);
+        Assert.assertEquals("Wrong instruction type", 4, output.readUnsignedShort());
+        Assert.assertEquals("Wrong instruction length", 24, output.readUnsignedShort());
+        output.skipBytes(4);
+        Assert.assertEquals("Wrong action type", 17, output.readUnsignedShort());
+        Assert.assertEquals("Wrong action length", 8, output.readUnsignedShort());
+        Assert.assertEquals("Wrong action ethertype", 14, output.readUnsignedShort());
+        output.skipBytes(2);
+        Assert.assertEquals("Wrong action type", 27, output.readUnsignedShort());
+        Assert.assertEquals("Wrong action length", 8, output.readUnsignedShort());
+        output.skipBytes(4);
+        Assert.assertTrue("Not all data were read", output.readableBytes() == 0);
+    }
+
+    private static List<Ports> createPortList() {
+        PortsBuilder builder = new PortsBuilder();
+        builder.setPortNo(1L);
+        builder.setHwAddr(new MacAddress("94:de:80:a6:61:40"));
+        builder.setName("Port name");
+        builder.setConfig(new PortConfig(true, false, true, false));
+        builder.setState(new PortState(true, false, true));
+        builder.setCurrentFeatures(new PortFeatures(true, false, true, false, true, false, true, false, true, false,
+                true, false, true, false, true, false));
+        builder.setAdvertisedFeatures(new PortFeatures(true, false, true, false, true, false, true, false, true, false,
+                true, false, true, false, true, false));
+        builder.setSupportedFeatures(new PortFeatures(true, false, true, false, true, false, true, false, true, false,
+                true, false, true, false, true, false));
+        builder.setPeerFeatures(new PortFeatures(true, false, true, false, true, false, true, false, true, false, true,
+                false, true, false, true, false));
+        builder.setCurrSpeed(1234L);
+        builder.setMaxSpeed(1234L);
+        List<Ports> list = new ArrayList<>();
+        list.add(builder.build());
+        return list;
+    }
+
+    private static PortConfig createPortConfig(long input) {
+        final Boolean _portDown = ((input) & (1 << 0)) > 0;
+        final Boolean _noRecv = ((input) & (1 << 2)) > 0;
+        final Boolean _noFwd = ((input) & (1 << 5)) > 0;
+        final Boolean _noPacketIn = ((input) & (1 << 6)) > 0;
+        return new PortConfig(_noFwd, _noPacketIn, _noRecv, _portDown);
+    }
+
+    private static PortFeatures createPortFeatures(long input) {
+        final Boolean _10mbHd = ((input) & (1 << 0)) > 0;
+        final Boolean _10mbFd = ((input) & (1 << 1)) > 0;
+        final Boolean _100mbHd = ((input) & (1 << 2)) > 0;
+        final Boolean _100mbFd = ((input) & (1 << 3)) > 0;
+        final Boolean _1gbHd = ((input) & (1 << 4)) > 0;
+        final Boolean _1gbFd = ((input) & (1 << 5)) > 0;
+        final Boolean _10gbFd = ((input) & (1 << 6)) > 0;
+        final Boolean _40gbFd = ((input) & (1 << 7)) > 0;
+        final Boolean _100gbFd = ((input) & (1 << 8)) > 0;
+        final Boolean _1tbFd = ((input) & (1 << 9)) > 0;
+        final Boolean _other = ((input) & (1 << 10)) > 0;
+        final Boolean _copper = ((input) & (1 << 11)) > 0;
+        final Boolean _fiber = ((input) & (1 << 12)) > 0;
+        final Boolean _autoneg = ((input) & (1 << 13)) > 0;
+        final Boolean _pause = ((input) & (1 << 14)) > 0;
+        final Boolean _pauseAsym = ((input) & (1 << 15)) > 0;
+        return new PortFeatures(_100gbFd, _100mbFd, _100mbHd, _10gbFd, _10mbFd, _10mbHd, _1gbFd, _1gbHd, _1tbFd,
+                _40gbFd, _autoneg, _copper, _fiber, _other, _pause, _pauseAsym);
+    }
+
+    private static PortState createPortState(long input) {
+        final Boolean one = ((input) & (1 << 0)) > 0;
+        final Boolean two = ((input) & (1 << 1)) > 0;
+        final Boolean three = ((input) & (1 << 2)) > 0;
+        return new PortState(two, one, three);
+    }
+
+    private static List<Bands> decodeBandsList(ByteBuf input) {
+        List<Bands> bandsList = new ArrayList<>();
+        BandsBuilder bandsBuilder = new BandsBuilder();
+        MeterBandDropCaseBuilder dropCaseBuilder = new MeterBandDropCaseBuilder();
+        MeterBandDropBuilder dropBand = new MeterBandDropBuilder();
+        dropBand.setType(MeterBandType.forValue(input.readUnsignedShort()));
+        input.skipBytes(Short.SIZE / Byte.SIZE);
+        dropBand.setRate(input.readUnsignedInt());
+        dropBand.setBurstSize(input.readUnsignedInt());
+        dropCaseBuilder.setMeterBandDrop(dropBand.build());
+        bandsList.add(bandsBuilder.setMeterBand(dropCaseBuilder.build()).build());
+        MeterBandDscpRemarkCaseBuilder dscpCaseBuilder = new MeterBandDscpRemarkCaseBuilder();
+        MeterBandDscpRemarkBuilder dscpRemarkBand = new MeterBandDscpRemarkBuilder();
+        dscpRemarkBand.setType(MeterBandType.forValue(input.readUnsignedShort()));
+        input.skipBytes(Short.SIZE / Byte.SIZE);
+        dscpRemarkBand.setRate(input.readUnsignedInt());
+        dscpRemarkBand.setBurstSize(input.readUnsignedInt());
+        dscpRemarkBand.setPrecLevel((short) 3);
+        dscpCaseBuilder.setMeterBandDscpRemark(dscpRemarkBand.build());
+        bandsList.add(bandsBuilder.setMeterBand(dscpCaseBuilder.build()).build());
+        return bandsList;
+    }
+
+    private static List<MeterConfig> createMeterConfig() {
+        MeterConfigBuilder builder = new MeterConfigBuilder();
+        builder.setFlags(new MeterFlags(true, false, true, false));
+        builder.setMeterId(new MeterId(1L));
+        builder.setBands(createBandsList());
+        List<MeterConfig> list = new ArrayList<>();
+        list.add(builder.build());
+        return list;
+    }
+
+    private static MeterBandTypeBitmap createMeterBandTypeBitmap(int input) {
+        final Boolean one = ((input) & (1 << 0)) > 0;
+        final Boolean two = ((input) & (1 << 1)) > 0;
+        return new MeterBandTypeBitmap(one, two);
+    }
+
+    private static List<Bands> createBandsList() {
+        List<Bands> bandsList = new ArrayList<>();
+        BandsBuilder bandsBuilder = new BandsBuilder();
+        MeterBandDropCaseBuilder dropCaseBuilder = new MeterBandDropCaseBuilder();
+        MeterBandDropBuilder dropBand = new MeterBandDropBuilder();
+        dropBand.setType(MeterBandType.OFPMBTDROP);
+        dropBand.setRate(1L);
+        dropBand.setBurstSize(2L);
+        dropCaseBuilder.setMeterBandDrop(dropBand.build());
+        bandsList.add(bandsBuilder.setMeterBand(dropCaseBuilder.build()).build());
+        MeterBandDscpRemarkCaseBuilder dscpCaseBuilder = new MeterBandDscpRemarkCaseBuilder();
+        MeterBandDscpRemarkBuilder dscpRemarkBand = new MeterBandDscpRemarkBuilder();
+        dscpRemarkBand.setType(MeterBandType.OFPMBTDSCPREMARK);
+        dscpRemarkBand.setRate(1L);
+        dscpRemarkBand.setBurstSize(2L);
+        dscpRemarkBand.setPrecLevel((short) 3);
+        dscpCaseBuilder.setMeterBandDscpRemark(dscpRemarkBand.build());
+        bandsList.add(bandsBuilder.setMeterBand(dscpCaseBuilder.build()).build());
+        return bandsList;
+    }
+
+    private static MeterFlags createMeterFlags(int input) {
+        final Boolean one = ((input) & (1 << 0)) > 0;
+        final Boolean two = ((input) & (1 << 1)) > 0;
+        final Boolean three = ((input) & (1 << 2)) > 0;
+        final Boolean four = ((input) & (1 << 3)) > 0;
+        return new MeterFlags(three, one, two, four);
+    }
+
+    private static List<MeterStats> createMeterStats() {
+        MeterStatsBuilder builder = new MeterStatsBuilder();
+        builder.setMeterId(new MeterId(1L));
+        builder.setFlowCount(1L);
+        builder.setPacketInCount(BigInteger.valueOf(1L));
+        builder.setByteInCount(BigInteger.valueOf(1L));
+        builder.setDurationSec(1L);
+        builder.setDurationNsec(1L);
+        builder.setMeterBandStats(createMeterBandStats());
+        List<MeterStats> list = new ArrayList<>();
+        list.add(builder.build());
+        return list;
+    }
+
+    private static List<MeterBandStats> createMeterBandStats() {
+        MeterBandStatsBuilder builder = new MeterBandStatsBuilder();
+        builder.setPacketBandCount(BigInteger.valueOf(1L));
+        builder.setByteBandCount(BigInteger.valueOf(1L));
+        List<MeterBandStats> list = new ArrayList<>();
+        list.add(builder.build());
+        return list;
+    }
+
+    private static ActionType createActionType(int input) {
+        final Boolean one = ((input) & (1 << 0)) > 0;
+        final Boolean two = ((input) & (1 << 1)) > 0;
+        final Boolean three = ((input) & (1 << 2)) > 0;
+        final Boolean four = ((input) & (1 << 3)) > 0;
+        final Boolean five = ((input) & (1 << 4)) > 0;
+        final Boolean six = ((input) & (1 << 5)) > 0;
+        final Boolean seven = ((input) & (1 << 6)) > 0;
+        final Boolean eight = ((input) & (1 << 7)) > 0;
+        final Boolean nine = ((input) & (1 << 8)) > 0;
+        final Boolean ten = ((input) & (1 << 9)) > 0;
+        final Boolean eleven = ((input) & (1 << 10)) > 0;
+        final Boolean twelve = ((input) & (1 << 11)) > 0;
+        final Boolean thirteen = ((input) & (1 << 12)) > 0;
+        final Boolean fourteen = ((input) & (1 << 13)) > 0;
+        final Boolean fifthteen = ((input) & (1 << 14)) > 0;
+        final Boolean sixteen = ((input) & (1 << 15)) > 0;
+        final Boolean seventeen = ((input) & (1 << 16)) > 0;
+        return new ActionType(three, two, five, thirteen, seventeen, eleven, one, nine, sixteen, seven, eight,
+                fifthteen, six, fourteen, four, twelve, ten);
+    }
+
+    private static GroupCapabilities createGroupCapabilities(int input) {
+        final Boolean one = ((input) & (1 << 0)) > 0;
+        final Boolean two = ((input) & (1 << 1)) > 0;
+        final Boolean three = ((input) & (1 << 2)) > 0;
+        final Boolean four = ((input) & (1 << 3)) > 0;
+        return new GroupCapabilities(three, four, two, one);
+    }
+
+    private static GroupTypes createGroupTypes(int input) {
+        final Boolean one = ((input) & (1 << 0)) > 0;
+        final Boolean two = ((input) & (1 << 1)) > 0;
+        final Boolean three = ((input) & (1 << 2)) > 0;
+        final Boolean four = ((input) & (1 << 3)) > 0;
+        return new GroupTypes(one, four, three, two);
+    }
+
+    private static List<ActionType> createActionType() {
+        ActionType actionType1 = new ActionType(true, false, true, false, true, false, true, false, true, false, true,
+                false, true, false, true, false, true);
+        ActionType actionType2 = new ActionType(true, false, false, false, true, false, true, false, true, false, true,
+                false, true, false, true, true, true);
+        ActionType actionType3 = new ActionType(true, false, true, false, true, false, true, false, true, false, true,
+                false, true, false, true, false, true);
+        ActionType actionType4 = new ActionType(true, false, true, false, true, false, true, false, true, false, true,
+                false, true, false, true, false, true);
+        List<ActionType> list = new ArrayList<>();
+        list.add(actionType1);
+        list.add(actionType2);
+        list.add(actionType3);
+        list.add(actionType4);
+        return list;
+
+    }
+
+    private static List<GroupDesc> createGroupDesc() {
+        GroupDescBuilder builder = new GroupDescBuilder();
+        builder.setType(GroupType.forValue(1));
+        builder.setGroupId(new GroupId(1L));
+        builder.setBucketsList(createBucketsList());
+        List<GroupDesc> list = new ArrayList<>();
+        list.add(builder.build());
+        return list;
+    }
+
+    private static List<GroupStats> createGroupStats() {
+        GroupStatsBuilder builder = new GroupStatsBuilder();
+        builder.setGroupId(new GroupId(1L));
+        builder.setRefCount(1L);
+        builder.setPacketCount(BigInteger.valueOf(1L));
+        builder.setByteCount(BigInteger.valueOf(1L));
+        builder.setDurationSec(1L);
+        builder.setDurationNsec(1L);
+        builder.setBucketStats(createBucketStats());
+        List<GroupStats> list = new ArrayList<>();
+        list.add(builder.build());
+        return list;
+    }
+
+    private static List<BucketsList> createBucketsList() {
+        BucketsListBuilder builder = new BucketsListBuilder();
+        builder.setWeight(1);
+        builder.setWatchPort(new PortNumber(1L));
+        builder.setWatchGroup(1L);
+        builder.setAction(createActionList());
+        List<BucketsList> list = new ArrayList<>();
+        list.add(builder.build());
+        return list;
+    }
+
+    private static List<Action> createActionList() {
+        List<Action> actions = new ArrayList<>();
+        ActionBuilder actionBuilder = new ActionBuilder();
+        OutputActionCaseBuilder caseBuilder = new OutputActionCaseBuilder();
+        OutputActionBuilder outputBuilder = new OutputActionBuilder();
+        outputBuilder.setPort(new PortNumber(45L));
+        outputBuilder.setMaxLength(55);
+        caseBuilder.setOutputAction(outputBuilder.build());
+        actionBuilder.setActionChoice(caseBuilder.build());
+        actions.add(actionBuilder.build());
+        actionBuilder = new ActionBuilder();
+        SetNwTtlCaseBuilder ttlCaseBuilder = new SetNwTtlCaseBuilder();
+        SetNwTtlActionBuilder ttlActionBuilder = new SetNwTtlActionBuilder();
+        ttlActionBuilder.setNwTtl((short) 64);
+        ttlCaseBuilder.setSetNwTtlAction(ttlActionBuilder.build());
+        actionBuilder.setActionChoice(ttlCaseBuilder.build());
+        actions.add(actionBuilder.build());
+        return actions;
+    }
+
+    private static List<BucketStats> createBucketStats() {
+        BucketStatsBuilder builder = new BucketStatsBuilder();
+        builder.setPacketCount(BigInteger.valueOf(1L));
+        builder.setByteCount(BigInteger.valueOf(1L));
+        List<BucketStats> list = new ArrayList<>();
+        list.add(builder.build());
+        return list;
+    }
+
+    private static List<QueueStats> createQueueStats() {
+        QueueStatsBuilder builder = new QueueStatsBuilder();
+        builder.setPortNo(1L);
+        builder.setQueueId(1L);
+        builder.setTxBytes(BigInteger.valueOf(1L));
+        builder.setTxPackets(BigInteger.valueOf(1L));
+        builder.setTxErrors(BigInteger.valueOf(1L));
+        builder.setDurationSec(1L);
+        builder.setDurationNsec(1L);
+        List<QueueStats> list = new ArrayList<>();
+        list.add(builder.build());
+        return list;
+    }
+
+    private static List<PortStats> createPortStats() {
+        PortStatsBuilder builder = new PortStatsBuilder();
+        builder.setPortNo(1L);
+        builder.setRxPackets(BigInteger.valueOf(1L));
+        builder.setTxPackets(BigInteger.valueOf(1L));
+        builder.setRxBytes(BigInteger.valueOf(1L));
+        builder.setTxBytes(BigInteger.valueOf(1L));
+        builder.setRxDropped(BigInteger.valueOf(1L));
+        builder.setTxDropped(BigInteger.valueOf(1L));
+        builder.setRxErrors(BigInteger.valueOf(1L));
+        builder.setTxErrors(BigInteger.valueOf(1L));
+        builder.setRxFrameErr(BigInteger.valueOf(1L));
+        builder.setRxOverErr(BigInteger.valueOf(1L));
+        builder.setRxCrcErr(BigInteger.valueOf(1L));
+        builder.setCollisions(BigInteger.valueOf(1L));
+        builder.setDurationSec(1L);
+        builder.setDurationNsec(1L);
+        List<PortStats> list = new ArrayList<PortStats>();
+        list.add(builder.build());
+        return list;
+    }
+
+    private static List<TableStats> createTableStats() {
+        TableStatsBuilder builder = new TableStatsBuilder();
+        builder.setTableId((short) 1);
+        builder.setActiveCount(1L);
+        builder.setLookupCount(BigInteger.valueOf(1L));
+        builder.setMatchedCount(BigInteger.valueOf(1L));
+        List<TableStats> list = new ArrayList<TableStats>();
+        list.add(builder.build());
+        return list;
+    }
+
+    private static List<FlowStats> createFlowStats() {
+        FlowStatsBuilder builder = new FlowStatsBuilder();
+        builder.setTableId((short) 1);
+        builder.setDurationSec(1L);
+        builder.setDurationNsec(1L);
+        builder.setPriority(1);
+        builder.setIdleTimeout(1);
+        builder.setHardTimeout(1);
+        builder.setCookie(BigInteger.valueOf(1234L));
+        builder.setPacketCount(BigInteger.valueOf(1234L));
+        builder.setByteCount(BigInteger.valueOf(1234L));
+        MatchBuilder matchBuilder = new MatchBuilder();
+        matchBuilder.setType(OxmMatchType.class);
+        List<MatchEntry> entries = new ArrayList<>();
+        MatchEntryBuilder entriesBuilder = new MatchEntryBuilder();
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);
+        entriesBuilder.setOxmMatchField(InPhyPort.class);
+        entriesBuilder.setHasMask(false);
+        InPhyPortCaseBuilder inPhyPortCaseBuilder = new InPhyPortCaseBuilder();
+        InPhyPortBuilder inPhyPortBuilder = new InPhyPortBuilder();
+        inPhyPortBuilder.setPortNumber(new PortNumber(42L));
+        inPhyPortCaseBuilder.setInPhyPort(inPhyPortBuilder.build());
+        entriesBuilder.setMatchEntryValue(inPhyPortCaseBuilder.build());
+        entries.add(entriesBuilder.build());
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);
+        entriesBuilder.setOxmMatchField(IpEcn.class);
+        entriesBuilder.setHasMask(false);
+        IpEcnCaseBuilder ipEcnCaseBuilder = new IpEcnCaseBuilder();
+        IpEcnBuilder ipEcnBuilder = new IpEcnBuilder();
+        ipEcnBuilder.setEcn((short) 4);
+        ipEcnCaseBuilder.setIpEcn(ipEcnBuilder.build());
+        entriesBuilder.setMatchEntryValue(ipEcnCaseBuilder.build());
+        entries.add(entriesBuilder.build());
+        matchBuilder.setMatchEntry(entries);
+        builder.setMatch(matchBuilder.build());
+        List<Instruction> instructions = new ArrayList<>();
+        // Goto_table instruction
+        InstructionBuilder builderInstruction = new InstructionBuilder();
+        GotoTableCaseBuilder gotoCaseBuilder = new GotoTableCaseBuilder();
+        GotoTableBuilder instructionBuilder = new GotoTableBuilder();
+        instructionBuilder.setTableId((short) 5);
+        gotoCaseBuilder.setGotoTable(instructionBuilder.build());
+        builderInstruction.setInstructionChoice(gotoCaseBuilder.build());
+        instructions.add(builderInstruction.build());
+        // Write_metadata instruction
+        builderInstruction = new InstructionBuilder();
+        WriteMetadataCaseBuilder metadataCaseBuilder = new WriteMetadataCaseBuilder();
+        WriteMetadataBuilder metadataBuilder = new WriteMetadataBuilder();
+        metadataBuilder.setMetadata(ByteBufUtils.hexStringToBytes("00 01 02 03 04 05 06 07"));
+        metadataBuilder.setMetadataMask(ByteBufUtils.hexStringToBytes("07 06 05 04 03 02 01 00"));
+        metadataCaseBuilder.setWriteMetadata(metadataBuilder.build());
+        builderInstruction.setInstructionChoice(metadataCaseBuilder.build());
+        instructions.add(builderInstruction.build());
+        // Clear_actions instruction
+        builderInstruction = new InstructionBuilder();
+        builderInstruction.setInstructionChoice(new ClearActionsCaseBuilder().build());
+        instructions.add(builderInstruction.build());
+        // Meter instruction
+        builderInstruction = new InstructionBuilder();
+        MeterCaseBuilder meterCaseBuilder = new MeterCaseBuilder();
+        MeterBuilder meterBuilder = new MeterBuilder();
+        meterBuilder.setMeterId(42L);
+        meterCaseBuilder.setMeter(meterBuilder.build());
+        builderInstruction.setInstructionChoice(meterCaseBuilder.build());
+        instructions.add(builderInstruction.build());
+        // Write_actions instruction
+        builderInstruction = new InstructionBuilder();
+        WriteActionsCaseBuilder writeActionsCaseBuilder = new WriteActionsCaseBuilder();
+        WriteActionsBuilder writeActionsBuilder = new WriteActionsBuilder();
+        List<Action> actions = new ArrayList<>();
+        ActionBuilder actionBuilder = new ActionBuilder();
+        OutputActionCaseBuilder caseBuilder = new OutputActionCaseBuilder();
+        OutputActionBuilder outputBuilder = new OutputActionBuilder();
+        outputBuilder.setPort(new PortNumber(45L));
+        outputBuilder.setMaxLength(55);
+        caseBuilder.setOutputAction(outputBuilder.build());
+        actionBuilder.setActionChoice(caseBuilder.build());
+        actions.add(actionBuilder.build());
+        actionBuilder = new ActionBuilder();
+        SetNwTtlCaseBuilder ttlCaseBuilder = new SetNwTtlCaseBuilder();
+        SetNwTtlActionBuilder ttlActionBuilder = new SetNwTtlActionBuilder();
+        ttlActionBuilder.setNwTtl((short) 64);
+        ttlCaseBuilder.setSetNwTtlAction(ttlActionBuilder.build());
+        actionBuilder.setActionChoice(ttlCaseBuilder.build());
+        actions.add(actionBuilder.build());
+        writeActionsBuilder.setAction(actions);
+        writeActionsCaseBuilder.setWriteActions(writeActionsBuilder.build());
+        builderInstruction.setInstructionChoice(writeActionsCaseBuilder.build());
+        instructions.add(builderInstruction.build());
+        // Apply_actions instruction
+        builderInstruction = new InstructionBuilder();
+        ApplyActionsCaseBuilder applyActionsCaseBuilder = new ApplyActionsCaseBuilder();
+        ApplyActionsBuilder applyActionsBuilder = new ApplyActionsBuilder();
+        actions = new ArrayList<>();
+        actionBuilder = new ActionBuilder();
+        PushVlanCaseBuilder vlanCaseBuilder = new PushVlanCaseBuilder();
+        PushVlanActionBuilder vlanBuilder = new PushVlanActionBuilder();
+        vlanBuilder.setEthertype(new EtherType(new EtherType(14)));
+        vlanCaseBuilder.setPushVlanAction(vlanBuilder.build());
+        actionBuilder.setActionChoice(vlanCaseBuilder.build());
+        actions.add(actionBuilder.build());
+        actionBuilder = new ActionBuilder();
+        actionBuilder.setActionChoice(new PopPbbCaseBuilder().build());
+        actions.add(actionBuilder.build());
+        applyActionsBuilder.setAction(actions);
+        applyActionsCaseBuilder.setApplyActions(applyActionsBuilder.build());
+        builderInstruction.setInstructionChoice(applyActionsCaseBuilder.build());
+        instructions.add(builderInstruction.build());
+        builder.setInstruction(instructions);
+        List<FlowStats> list = new ArrayList<FlowStats>();
+        list.add(builder.build());
+        return list;
+    }
+
+    private static MultipartRequestFlags createMultipartRequestFlags(int input) {
+        final Boolean one = ((input) & (1 << 0)) > 0;
+        return new MultipartRequestFlags(one);
+    }
+
+    private static MultipartReplyDescCase decodeDescBody(ByteBuf output) {
+        MultipartReplyDescCaseBuilder descCase = new MultipartReplyDescCaseBuilder();
+        MultipartReplyDescBuilder desc = new MultipartReplyDescBuilder();
+        byte[] mfrDesc = new byte[256];
+        output.readBytes(mfrDesc);
+        desc.setMfrDesc(new String(mfrDesc).trim());
+        byte[] hwDesc = new byte[256];
+        output.readBytes(hwDesc);
+        desc.setHwDesc(new String(hwDesc).trim());
+        byte[] swDesc = new byte[256];
+        output.readBytes(swDesc);
+        desc.setSwDesc(new String(swDesc).trim());
+        byte[] serialNumber = new byte[32];
+        output.readBytes(serialNumber);
+        desc.setSerialNum(new String(serialNumber).trim());
+        byte[] dpDesc = new byte[256];
+        output.readBytes(dpDesc);
+        desc.setDpDesc(new String(dpDesc).trim());
+        descCase.setMultipartReplyDesc(desc.build());
+        return descCase.build();
+    }
+}