sanitize Boolean autoboxing NPE
[openflowplugin.git] / openflowplugin / src / main / java / org / opendaylight / openflowplugin / openflow / md / core / sal / ModelDrivenSwitchImpl.java
index 699aee9ada902c4f44b154b1b762e02560c85b4b..d667d52f0ff8004220280d2a10fd61dff2111163 100644 (file)
@@ -14,16 +14,22 @@ import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.Future;
 
+import org.opendaylight.controller.sal.common.util.Arguments;
 import org.opendaylight.controller.sal.common.util.Rpcs;
 import org.opendaylight.openflowjava.protocol.api.util.BinContent;
+import org.opendaylight.openflowplugin.openflow.md.OFConstants;
 import org.opendaylight.openflowplugin.openflow.md.core.SwitchConnectionDistinguisher;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.FlowConvertor;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.GroupConvertor;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.MeterConvertor;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.PortConvertor;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.TableFeaturesConvertor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchReactor;
 import org.opendaylight.openflowplugin.openflow.md.core.session.IMessageDispatchService;
 import org.opendaylight.openflowplugin.openflow.md.core.session.SessionContext;
+import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.output.action._case.OutputActionBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowOutputBuilder;
@@ -33,11 +39,39 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.Remo
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowOutputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForAllFlowsInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForGivenMatchInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowStatisticsFromFlowTableInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowStatisticsFromFlowTableOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowStatisticsFromFlowTableOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowStatisticsInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowStatisticsOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowsStatisticsFromAllFlowTablesInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowsStatisticsFromAllFlowTablesOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowsStatisticsFromAllFlowTablesOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllNodeConnectorStatisticsInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllNodeConnectorStatisticsOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetFlowStatisticsFromFlowTableInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetFlowStatisticsFromFlowTableOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetFlowStatisticsFromFlowTableOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetFlowStatisticsInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetFlowStatisticsOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetFlowTableStatisticsInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetFlowTableStatisticsOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetNodeConnectorStatisticsInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetNodeConnectorStatisticsOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.GetFlowTablesStatisticsInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.GetFlowTablesStatisticsOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.GetFlowTablesStatisticsOutputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev131103.TransactionId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.port.mod.port.Port;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupOutputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroupInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroupOutput;
@@ -57,7 +91,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupStatisticsInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupStatisticsOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupStatisticsOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeterInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeterOutput;
@@ -80,44 +116,91 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterStatisticsInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterStatisticsOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterStatisticsOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthActionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortActionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.ActionsList;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.ActionsListBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.ActionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowWildcardsV10;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.Group;
 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.Meter;
 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.PortNumber;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OxmMatchType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.match.v10.grouping.MatchV10Builder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.MatchEntries;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortModInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortModInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.match.grouping.Match;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.match.grouping.MatchBuilder;
-//import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table.features.TableFeatures;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupDescBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupFeaturesBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterConfigBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterFeaturesBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableFeaturesBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.table.features.TableFeatures;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestAggregateCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestFlowCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupDescCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupFeaturesCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterConfigCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterFeaturesCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortStatsCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestQueueCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableFeaturesCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.aggregate._case.MultipartRequestAggregateBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.flow._case.MultipartRequestFlowBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.group._case.MultipartRequestGroupBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.meter._case.MultipartRequestMeterBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.meter.config._case.MultipartRequestMeterConfigBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.port.stats._case.MultipartRequestPortStatsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.queue._case.MultipartRequestQueueBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.table._case.MultipartRequestTableBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.table.features._case.MultipartRequestTableFeaturesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.table.features._case.multipart.request.table.features.TableFeatures;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.port.service.rev131107.GetPortOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.port.service.rev131107.UpdatePortInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.port.service.rev131107.UpdatePortOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.port.service.rev131107.UpdatePortOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.GetAllPortsStatisticsInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.GetAllPortsStatisticsOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.GetAllPortsStatisticsOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.GetPortStatisticsInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.GetPortStatisticsOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.GetPortStatisticsOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetAllQueuesStatisticsFromAllPortsInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetAllQueuesStatisticsFromAllPortsOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetAllQueuesStatisticsFromAllPortsOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetAllQueuesStatisticsFromGivenPortInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetAllQueuesStatisticsFromGivenPortOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetAllQueuesStatisticsFromGivenPortOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetQueueStatisticsFromGivenPortInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetQueueStatisticsFromGivenPortOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetQueueStatisticsFromGivenPortOutputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.UpdateTableInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.UpdateTableOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.UpdateTableOutputBuilder;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.common.RpcError;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.slf4j.Logger;
 
+import com.google.common.base.Objects;
 import com.google.common.util.concurrent.Futures;
 
 /**
@@ -139,15 +222,21 @@ public class ModelDrivenSwitchImpl extends AbstractModelDrivenSwitch {
         version = context.getPrimaryConductor().getVersion();
     }
 
+    
     @Override
     public Future<RpcResult<AddFlowOutput>> addFlow(AddFlowInput input) {
        // Convert the AddFlowInput to FlowModInput
         FlowModInput ofFlowModInput = FlowConvertor.toFlowModInput(input, version);
+        BarrierInputBuilder barrierInput = new BarrierInputBuilder();
+        barrierInput.setVersion(version);
 
        // For Flow provisioning, the SwitchConnectionDistinguisher is set to null so
        // the request can be routed through any connection to the switch
 
        SwitchConnectionDistinguisher cookie = null ;
+       if (Objects.firstNonNull(input.isBarrier(), Boolean.FALSE)) {
+           Future<RpcResult<BarrierOutput>> barrierOFLib = messageService.barrier(barrierInput.build(), cookie);
+       }       
 
        LOG.debug("Calling the FlowMod RPC method on MessageDispatchService");
                Future<RpcResult<UpdateFlowOutput>> resultFromOFLib = messageService.flowMod(ofFlowModInput, cookie) ;
@@ -213,7 +302,6 @@ public class ModelDrivenSwitchImpl extends AbstractModelDrivenSwitch {
        // Convert the AddMeterInput to MeterModInput
         MeterModInput ofMeterModInput = MeterConvertor.toMeterModInput(input, version);
 
-
        // For Meter provisioning, the SwitchConnectionDistinguisher is set to null so
        // the request can be routed through any connection to the switch
 
@@ -247,13 +335,17 @@ public class ModelDrivenSwitchImpl extends AbstractModelDrivenSwitch {
     public Future<RpcResult<RemoveFlowOutput>> removeFlow(RemoveFlowInput input) {
        // Convert the RemoveFlowInput to FlowModInput
         FlowModInput ofFlowModInput = FlowConvertor.toFlowModInput(input, version);
-
+        BarrierInputBuilder barrierInput = new BarrierInputBuilder();
+        barrierInput.setVersion(version);
 
        // For Flow provisioning, the SwitchConnectionDistinguisher is set to null so
        // the request can be routed through any connection to the switch
 
        SwitchConnectionDistinguisher cookie = null ;
-
+        if (Objects.firstNonNull(input.isBarrier(), Boolean.FALSE)) {
+           Future<RpcResult<BarrierOutput>> barrierOFLib = messageService.barrier(barrierInput.build(), cookie);
+       }
+        
        LOG.debug("Calling the FlowMod RPC method on MessageDispatchService");
                Future<RpcResult<UpdateFlowOutput>> resultFromOFLib = messageService.flowMod(ofFlowModInput, cookie) ;
 
@@ -352,8 +444,76 @@ public class ModelDrivenSwitchImpl extends AbstractModelDrivenSwitch {
 
     @Override
     public Future<RpcResult<Void>> transmitPacket(TransmitPacketInput input) {
-        // TODO Auto-generated method stub
-        return null;
+        LOG.info("TransmitPacket - {}",input);
+       // Convert TransmitPacket to PacketOutInput
+        
+       // TODO VD create PacketConvertor and move convert logic there
+        
+        // Build Port ID from TransmitPacketInput.Ingress
+        PortNumber inPortNr = null;
+        
+        List<PathArgument> inArgs = input.getIngress().getValue().getPath();
+        if (inArgs.size() >= 3) {
+            InstanceIdentifier.IdentifiableItem item = Arguments.checkInstanceOf(inArgs.get(2), InstanceIdentifier.IdentifiableItem.class);
+            NodeConnectorKey key = Arguments.checkInstanceOf(item.getKey(), NodeConnectorKey.class);
+            String[] split = key.getId().getValue().split(":");
+            Long port = Long.decode(split[split.length-1]);
+            inPortNr = new PortNumber(port);
+        } else {
+            // TODO Ed could by in this way or Exception or something else ?
+            inPortNr = new PortNumber(0xfffffffdL);
+        }
+        
+        // Build Buffer ID from TransmitPacketInput.Ingress
+        // TODO VD P! find how to fix PacketIn to add BufferID to augmetation
+        Long bufferId = OFConstants.OFP_NO_BUFFER;
+        
+        PortNumber outPort = null;
+        NodeConnectorRef outRef = input.getEgress();
+        List<PathArgument> outArgs = outRef.getValue().getPathArguments();
+        if (outArgs.size() >= 3) {
+            InstanceIdentifier.IdentifiableItem item = Arguments.checkInstanceOf(outArgs.get(2), InstanceIdentifier.IdentifiableItem.class);
+            NodeConnectorKey key = Arguments.checkInstanceOf(item.getKey(), NodeConnectorKey.class);
+            String[] split = key.getId().getValue().split(":");
+            Long port = Long.decode(split[split.length-1]);
+            outPort = new PortNumber(port);
+        } else {
+            new Exception("PORT NR not exist in Egress"); //TODO : P4 search for some normal exception
+        }
+        
+        // TODO VD P! wait for way to move Actions (e.g. augmentation)
+        
+        // TODO VD implementation for testing PacketIn (REMOVE IT)
+        List<ActionsList> actions = new ArrayList<ActionsList>();
+        ActionsListBuilder asBuild = new ActionsListBuilder();
+        ActionBuilder aBuild = new ActionBuilder();
+        aBuild.setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Output.class);
+        PortActionBuilder paBuild = new PortActionBuilder();
+        paBuild.setPort(outPort);        
+        aBuild.addAugmentation(PortAction.class, paBuild.build());
+        MaxLengthActionBuilder mlBuild = new MaxLengthActionBuilder();
+        mlBuild.setMaxLength(0xffff);
+        aBuild.addAugmentation(MaxLengthAction.class, mlBuild.build());
+        asBuild.setAction(aBuild.build());
+        actions.add(asBuild.build());
+        
+       PacketOutInputBuilder builder = new PacketOutInputBuilder();
+       builder.setActionsList(actions);
+       builder.setData(input.getPayload());
+        builder.setVersion(version);
+        builder.setXid(sessionContext.getNextXid());
+        builder.setInPort(inPortNr);
+        builder.setBufferId(bufferId);
+        // --------------------------------------------------------
+        
+        PacketOutInput message = builder.build();
+       
+       // TODO VD NULL for yet  - find how to translate cookie from TransmitPacketInput
+//     SwitchConnectionDistinguisher cookie = ( "what is need to do" ) input.getCookie();
+       SwitchConnectionDistinguisher cookie = null ;
+       
+       LOG.debug("Calling the transmitPacket RPC method");
+       return messageService.packetOut(message, cookie);
     }
 
     private FlowModInputBuilder toFlowModInputBuilder(Flow source) {
@@ -386,14 +546,18 @@ public class ModelDrivenSwitchImpl extends AbstractModelDrivenSwitch {
     public Future<RpcResult<UpdateFlowOutput>> updateFlow(UpdateFlowInput input) {
        // Convert the UpdateFlowInput to FlowModInput
         FlowModInput ofFlowModInput = FlowConvertor.toFlowModInput(input.getUpdatedFlow(), version);
-
+        BarrierInputBuilder barrierInput = new BarrierInputBuilder();
+        barrierInput.setVersion(version);
        // Call the RPC method on MessageDispatchService
 
        // For Flow provisioning, the SwitchConnectionDistinguisher is set to null so
        // the request can be routed through any connection to the switch
 
        SwitchConnectionDistinguisher cookie = null ;
-
+        if (Objects.firstNonNull(input.getUpdatedFlow().isBarrier(), Boolean.FALSE)) {
+           Future<RpcResult<BarrierOutput>> barrierOFLib = messageService.barrier(barrierInput.build(), cookie);
+       }
+        
        LOG.debug("Calling the FlowMod RPC method on MessageDispatchService");
                Future<RpcResult<UpdateFlowOutput>> resultFromOFLib = messageService.flowMod(ofFlowModInput, cookie) ;
 
@@ -514,11 +678,13 @@ public class ModelDrivenSwitchImpl extends AbstractModelDrivenSwitch {
         mprInput.setFlags(new MultipartRequestFlags(false));
 
         // Create multipart request body for fetch all the group stats
+        MultipartRequestGroupCaseBuilder caseBuilder = new MultipartRequestGroupCaseBuilder();
         MultipartRequestGroupBuilder mprGroupBuild = new MultipartRequestGroupBuilder();
         mprGroupBuild.setGroupId(new GroupId(BinContent.intToUnsignedLong(Group.OFPGALL.getIntValue())));
-
+        caseBuilder.setMultipartRequestGroup(mprGroupBuild.build());
+        
         //Set request body to main multipart request
-        mprInput.setMultipartRequestBody(mprGroupBuild.build());
+        mprInput.setMultipartRequestBody(caseBuilder.build());
 
         //Send the request, no cookies associated, use any connection
         LOG.debug("Send group statistics request to the switch :{}",mprGroupBuild);
@@ -552,7 +718,7 @@ public class ModelDrivenSwitchImpl extends AbstractModelDrivenSwitch {
         mprInput.setFlags(new MultipartRequestFlags(false));
 
         // Create multipart request body for fetch all the group description stats
-        MultipartRequestGroupDescBuilder mprGroupDescBuild = new MultipartRequestGroupDescBuilder();
+        MultipartRequestGroupDescCaseBuilder mprGroupDescBuild = new MultipartRequestGroupDescCaseBuilder();
 
         //Set request body to main multipart request
         mprInput.setMultipartRequestBody(mprGroupDescBuild.build());
@@ -589,7 +755,7 @@ public class ModelDrivenSwitchImpl extends AbstractModelDrivenSwitch {
         mprInput.setFlags(new MultipartRequestFlags(false));
 
         // Create multipart request body for fetch all the group description stats
-        MultipartRequestGroupFeaturesBuilder mprGroupFeaturesBuild = new MultipartRequestGroupFeaturesBuilder();
+        MultipartRequestGroupFeaturesCaseBuilder mprGroupFeaturesBuild = new MultipartRequestGroupFeaturesCaseBuilder();
 
         //Set request body to main multipart request
         mprInput.setMultipartRequestBody(mprGroupFeaturesBuild.build());
@@ -624,11 +790,13 @@ public class ModelDrivenSwitchImpl extends AbstractModelDrivenSwitch {
         mprInput.setFlags(new MultipartRequestFlags(false));
 
         // Create multipart request body for fetch all the group stats
+        MultipartRequestGroupCaseBuilder caseBuilder = new MultipartRequestGroupCaseBuilder();
         MultipartRequestGroupBuilder mprGroupBuild = new MultipartRequestGroupBuilder();
         mprGroupBuild.setGroupId(new GroupId(input.getGroupId().getValue()));
-
+        caseBuilder.setMultipartRequestGroup(mprGroupBuild.build());
+        
         //Set request body to main multipart request
-        mprInput.setMultipartRequestBody(mprGroupBuild.build());
+        mprInput.setMultipartRequestBody(caseBuilder.build());
 
         //Send the request, no cookies associated, use any connection
         LOG.debug("Send group statistics request :{}",mprGroupBuild);
@@ -662,11 +830,13 @@ public class ModelDrivenSwitchImpl extends AbstractModelDrivenSwitch {
         mprInput.setFlags(new MultipartRequestFlags(false));
 
         // Create multipart request body for fetch all the meter stats
+        MultipartRequestMeterConfigCaseBuilder caseBuilder = new MultipartRequestMeterConfigCaseBuilder();
         MultipartRequestMeterConfigBuilder mprMeterConfigBuild = new MultipartRequestMeterConfigBuilder();
         mprMeterConfigBuild.setMeterId(new MeterId(BinContent.intToUnsignedLong(Meter.OFPMALL.getIntValue())));
-
+        caseBuilder.setMultipartRequestMeterConfig(mprMeterConfigBuild.build());
+        
         //Set request body to main multipart request
-        mprInput.setMultipartRequestBody(mprMeterConfigBuild.build());
+        mprInput.setMultipartRequestBody(caseBuilder.build());
 
         //Send the request, no cookies associated, use any connection
         LOG.debug("Send meter statistics request :{}",mprMeterConfigBuild);
@@ -699,11 +869,13 @@ public class ModelDrivenSwitchImpl extends AbstractModelDrivenSwitch {
         mprInput.setFlags(new MultipartRequestFlags(false));
 
         // Create multipart request body for fetch all the meter stats
+        MultipartRequestMeterCaseBuilder caseBuilder = new MultipartRequestMeterCaseBuilder();
         MultipartRequestMeterBuilder mprMeterBuild = new MultipartRequestMeterBuilder();
         mprMeterBuild.setMeterId(new MeterId(BinContent.intToUnsignedLong(Meter.OFPMALL.getIntValue())));
-
+        caseBuilder.setMultipartRequestMeter(mprMeterBuild.build());
+        
         //Set request body to main multipart request
-        mprInput.setMultipartRequestBody(mprMeterBuild.build());
+        mprInput.setMultipartRequestBody(caseBuilder.build());
 
         //Send the request, no cookies associated, use any connection
         LOG.debug("Send meter statistics request :{}",mprMeterBuild);
@@ -736,7 +908,7 @@ public class ModelDrivenSwitchImpl extends AbstractModelDrivenSwitch {
         mprInput.setFlags(new MultipartRequestFlags(false));
 
         // Create multipart request body for fetch all the group description stats
-        MultipartRequestMeterFeaturesBuilder mprMeterFeaturesBuild = new MultipartRequestMeterFeaturesBuilder();
+        MultipartRequestMeterFeaturesCaseBuilder mprMeterFeaturesBuild = new MultipartRequestMeterFeaturesCaseBuilder();
 
         //Set request body to main multipart request
         mprInput.setMultipartRequestBody(mprMeterFeaturesBuild.build());
@@ -770,12 +942,14 @@ public class ModelDrivenSwitchImpl extends AbstractModelDrivenSwitch {
         mprInput.setFlags(new MultipartRequestFlags(false));
 
         // Create multipart request body for fetch all the meter stats
+        MultipartRequestMeterCaseBuilder caseBuilder = new MultipartRequestMeterCaseBuilder();
         MultipartRequestMeterBuilder mprMeterBuild = new MultipartRequestMeterBuilder();
         //Select specific meter
         mprMeterBuild.setMeterId(new MeterId(input.getMeterId().getValue()));
-
+        caseBuilder.setMultipartRequestMeter(mprMeterBuild.build());
+        
         //Set request body to main multipart request
-        mprInput.setMultipartRequestBody(mprMeterBuild.build());
+        mprInput.setMultipartRequestBody(caseBuilder.build());
 
         //Send the request, no cookies associated, use any connection
         LOG.debug("Send meter statistics request :{}",mprMeterBuild);
@@ -791,6 +965,82 @@ public class ModelDrivenSwitchImpl extends AbstractModelDrivenSwitch {
         RpcResult<GetMeterStatisticsOutput> rpcResult = Rpcs.getRpcResult(true, output.build(), errors);
         return Futures.immediateFuture(rpcResult);
     }
+    
+    @Override
+    public Future<RpcResult<GetAllPortsStatisticsOutput>> getAllPortsStatistics(GetAllPortsStatisticsInput arg0) {
+
+        //Generate xid to associate it with the request
+        Long xid = this.getSessionContext().getNextXid();
+
+        LOG.info("Prepare port statistics request for all ports of node {} - TrasactionId - {}",arg0.getNode().getValue(),xid);
+
+        // Create multipart request header
+        MultipartRequestInputBuilder mprInput = new MultipartRequestInputBuilder();
+        mprInput.setType(MultipartType.OFPMPPORTSTATS);
+        mprInput.setVersion(version);
+        mprInput.setXid(xid);
+        mprInput.setFlags(new MultipartRequestFlags(false));
+
+        // Create multipart request body to fetch stats for all the port of the node
+        MultipartRequestPortStatsCaseBuilder caseBuilder = new MultipartRequestPortStatsCaseBuilder();
+        MultipartRequestPortStatsBuilder mprPortStatsBuilder = new MultipartRequestPortStatsBuilder();
+        //Select all ports 
+        mprPortStatsBuilder.setPortNo(OFConstants.OFPP_ANY);
+        caseBuilder.setMultipartRequestPortStats(mprPortStatsBuilder.build());
+        
+        //Set request body to main multipart request
+        mprInput.setMultipartRequestBody(caseBuilder.build());
+
+        //Send the request, no cookies associated, use any connection
+        LOG.debug("Send port statistics request :{}",mprPortStatsBuilder.build().toString());
+        this.messageService.multipartRequest(mprInput.build(), null);
+
+        // Prepare rpc return output. Set xid and send it back.
+        GetAllPortsStatisticsOutputBuilder output = new GetAllPortsStatisticsOutputBuilder();
+        output.setTransactionId(generateTransactionId(xid));
+
+        Collection<RpcError> errors = Collections.emptyList();
+        RpcResult<GetAllPortsStatisticsOutput> rpcResult = Rpcs.getRpcResult(true, output.build(), errors);
+        return Futures.immediateFuture(rpcResult);
+    }
+
+    @Override
+    public Future<RpcResult<GetPortStatisticsOutput>> getPortStatistics(GetPortStatisticsInput arg0) {
+        //Generate xid to associate it with the request
+        Long xid = this.getSessionContext().getNextXid();
+
+        LOG.info("Prepare port statistics request for port {} of node {} - TrasactionId - {}",arg0.getNodeConnectorId(), arg0.getNode().getValue(),xid);
+
+        // Create multipart request header
+        MultipartRequestInputBuilder mprInput = new MultipartRequestInputBuilder();
+        mprInput.setType(MultipartType.OFPMPPORTSTATS);
+        mprInput.setVersion(version);
+        mprInput.setXid(xid);
+        mprInput.setFlags(new MultipartRequestFlags(false));
+
+        // Create multipart request body to fetch stats for all the port of the node
+        MultipartRequestPortStatsCaseBuilder caseBuilder = new MultipartRequestPortStatsCaseBuilder();
+        MultipartRequestPortStatsBuilder mprPortStatsBuilder = new MultipartRequestPortStatsBuilder();
+
+        //Set specific port 
+        mprPortStatsBuilder.setPortNo(InventoryDataServiceUtil.portNumberfromNodeConnectorId(arg0.getNodeConnectorId()));
+        caseBuilder.setMultipartRequestPortStats(mprPortStatsBuilder.build());
+        
+        //Set request body to main multipart request
+        mprInput.setMultipartRequestBody(caseBuilder.build());
+
+        //Send the request, no cookies associated, use any connection
+        LOG.debug("Send port statistics request :{}",mprPortStatsBuilder.build().toString());
+        this.messageService.multipartRequest(mprInput.build(), null);
+
+        // Prepare rpc return output. Set xid and send it back.
+        GetPortStatisticsOutputBuilder output = new GetPortStatisticsOutputBuilder();
+        output.setTransactionId(generateTransactionId(xid));
+
+        Collection<RpcError> errors = Collections.emptyList();
+        RpcResult<GetPortStatisticsOutput> rpcResult = Rpcs.getRpcResult(true, output.build(), errors);
+        return Futures.immediateFuture(rpcResult);
+    }
 
     private TransactionId generateTransactionId(Long xid){
         String stringXid =xid.toString();
@@ -799,82 +1049,83 @@ public class ModelDrivenSwitchImpl extends AbstractModelDrivenSwitch {
 
     }
 
-       @Override
-       public Future<RpcResult<GetPortOutput>> getPort() {
-               // TODO Auto-generated method stub
-               return null;
-       }
+    @Override
+    public Future<RpcResult<GetPortOutput>> getPort() {
+       // TODO Auto-generated method stub
+       return null;
+    }
+    
 
-       @Override
-       public Future<RpcResult<UpdatePortOutput>> updatePort(UpdatePortInput input) {
-               PortModInput ofPortModInput = null ;
-               RpcResult<UpdatePortOutput> rpcResultFromOFLib = null ;
+    @Override
+    public Future<RpcResult<UpdatePortOutput>> updatePort(UpdatePortInput input) {
+       PortModInput ofPortModInput = null ;
+       RpcResult<UpdatePortOutput> rpcResultFromOFLib = null ;
                
                                
-               // For Flow provisioning, the SwitchConnectionDistinguisher is set to null so  
+       // For Flow provisioning, the SwitchConnectionDistinguisher is set to null so  
        // the request can be routed through any connection to the switch
        
        SwitchConnectionDistinguisher cookie = null ;
        
-               // NSF sends a list of port and the ModelDrivenSwitch will 
+       // NSF sends a list of port and the ModelDrivenSwitch will 
        // send one port at a time towards the switch ( mutiple RPCs calls)
-               List<Port> inputPorts = input.getUpdatedPort().getPort().getPort() ;
+       List<Port> inputPorts = input.getUpdatedPort().getPort().getPort() ;
                
-               // Get the Xid. The same Xid has to be sent in all the RPCs
-               Long Xid = sessionContext.getNextXid();
+       // Get the Xid. The same Xid has to be sent in all the RPCs
+       Long Xid = sessionContext.getNextXid();
                
-               for( Port inputPort : inputPorts) {
+       for( Port inputPort : inputPorts) {
                   
-                       // Convert the UpdateGroupInput to GroupModInput 
-                               ofPortModInput = PortConvertor.toPortModInput(inputPort, version) ;
+           // Convert the UpdateGroupInput to GroupModInput 
+           ofPortModInput = PortConvertor.toPortModInput(inputPort, version) ;
                                                        
-                               // Insert the Xid ( transaction Id) before calling the RPC on the OFLibrary
-                       
-                       PortModInputBuilder mdInput = new PortModInputBuilder();
-                       mdInput.setXid(Xid);
-                       mdInput.setVersion(ofPortModInput.getVersion()) ;
-                       mdInput.setPortNo(ofPortModInput.getPortNo()) ;
-                       mdInput.setMaskV10(ofPortModInput.getMaskV10()) ;
-                       mdInput.setMask(ofPortModInput.getMask()) ;
-                       mdInput.setHwAddress(ofPortModInput.getHwAddress());
-                       mdInput.setConfigV10(ofPortModInput.getConfigV10()) ;
-                       mdInput.setConfig(ofPortModInput.getConfig()) ;
-                       mdInput.setAdvertiseV10(ofPortModInput.getAdvertiseV10()) ;
-                       mdInput.setAdvertise(ofPortModInput.getAdvertise()) ;
-                       
-                       LOG.debug("Calling the PortMod RPC method on MessageDispatchService");
-                       Future<RpcResult<UpdatePortOutput>> resultFromOFLib = messageService.portMod(ofPortModInput, cookie) ;
-                                       
-                       try { 
-                               rpcResultFromOFLib = resultFromOFLib.get();
-                       } catch( Exception ex ) {
-                               LOG.error( " Error while getting result for updatePort RPC" + ex.getMessage());
-                       }
-                       
-                       // The Future response value for all the RPCs except the last one is ignored
-                       
-               }
-                       
-                               //Extract the Xid only from the Future for the last RPC and
-                               // send it back to the NSF
-                       UpdatePortOutput updatePortOutputOFLib = rpcResultFromOFLib.getResult() ;
+           // Insert the Xid ( transaction Id) before calling the RPC on the OFLibrary
                        
-                       UpdatePortOutputBuilder updatePortOutput = new UpdatePortOutputBuilder() ;
-                       updatePortOutput.setTransactionId(updatePortOutputOFLib.getTransactionId()) ;
-                       UpdatePortOutput result = updatePortOutput.build();
-                       
-                       Collection<RpcError> errors = rpcResultFromOFLib.getErrors() ;
-                       RpcResult<UpdatePortOutput> rpcResult = Rpcs.getRpcResult(true, result, errors); 
-                       
-                       LOG.debug("Returning the Update Group RPC result to MD-SAL");
-                       return Futures.immediateFuture(rpcResult);
-       
+           PortModInputBuilder mdInput = new PortModInputBuilder();
+           mdInput.setXid(Xid);
+           mdInput.setVersion(ofPortModInput.getVersion()) ;
+           mdInput.setPortNo(ofPortModInput.getPortNo()) ;
+           mdInput.setMaskV10(ofPortModInput.getMaskV10()) ;
+           mdInput.setMask(ofPortModInput.getMask()) ;
+           mdInput.setHwAddress(ofPortModInput.getHwAddress());
+           mdInput.setConfigV10(ofPortModInput.getConfigV10()) ;
+           mdInput.setConfig(ofPortModInput.getConfig()) ;
+           mdInput.setAdvertiseV10(ofPortModInput.getAdvertiseV10()) ;
+           mdInput.setAdvertise(ofPortModInput.getAdvertise()) ;
+
+           LOG.debug("Calling the PortMod RPC method on MessageDispatchService");
+           Future<RpcResult<UpdatePortOutput>> resultFromOFLib = messageService.portMod(ofPortModInput, cookie) ;
+
+           try { 
+               rpcResultFromOFLib = resultFromOFLib.get();
+           } catch( Exception ex ) {
+               LOG.error( " Error while getting result for updatePort RPC" + ex.getMessage());
+           }
+
+           // The Future response value for all the RPCs except the last one is ignored
+
        }
-       @Override
-       public Future<RpcResult<UpdateTableOutput>> updateTable(
-                       UpdateTableInput input) {
+       //Extract the Xid only from the Future for the last RPC and
+       // send it back to the NSF
+       UpdatePortOutput updatePortOutputOFLib = rpcResultFromOFLib.getResult() ;
+       
+       UpdatePortOutputBuilder updatePortOutput = new UpdatePortOutputBuilder() ;
+       updatePortOutput.setTransactionId(updatePortOutputOFLib.getTransactionId()) ;
+       UpdatePortOutput result = updatePortOutput.build();
+       
+       Collection<RpcError> errors = rpcResultFromOFLib.getErrors() ;
+       RpcResult<UpdatePortOutput> rpcResult = Rpcs.getRpcResult(true, result, errors); 
+       
+       LOG.debug("Returning the Update Group RPC result to MD-SAL");
+       return Futures.immediateFuture(rpcResult);
+
+    }
+    
+    @Override
+    public Future<RpcResult<UpdateTableOutput>> updateTable(
+                        UpdateTableInput input) {
 
-               // Get the Xid. The same Xid has to be sent in all the Multipart requests
+        // Get the Xid. The same Xid has to be sent in all the Multipart requests
         Long xid = this.getSessionContext().getNextXid();
 
         LOG.debug("Prepare the Multipart Table Mod requests for Transaction Id {} ",xid);
@@ -887,42 +1138,26 @@ public class ModelDrivenSwitchImpl extends AbstractModelDrivenSwitch {
 
         //Convert the list of all MD-SAL table feature object into OF library object
         List<TableFeatures> ofTableFeatureList = TableFeaturesConvertor.toTableFeaturesRequest(input.getUpdatedTable()) ;
-        int totalNoOfTableFeatureEntry = ofTableFeatureList.size();
+        
 
+        MultipartRequestTableFeaturesCaseBuilder caseRequest = new MultipartRequestTableFeaturesCaseBuilder();
         MultipartRequestTableFeaturesBuilder tableFeaturesRequest = new MultipartRequestTableFeaturesBuilder();
 
-         // Slice the multipart request based on the configuration parameter, which is the no. of TableFeatureList element
-        // to be put in one multipart message. Default is 5
-        // This parameter must be set based on switch's Buffer capacity
-
-        List<TableFeatures> tmpOfTableFeatureList = null ;
-        String tableFeatureListCount = System.getProperty( "of.tableFeaturesCountPerMultipart", "5") ;
-        int noOfEntriesInMPR = Integer.parseInt(tableFeatureListCount) ;
-
-        int index = 0 ;
-        while(totalNoOfTableFeatureEntry-index > 0 ) {
-               if( (totalNoOfTableFeatureEntry-index) > noOfEntriesInMPR ) {
-                       mprInput.setFlags(new MultipartRequestFlags(true));
-                       tmpOfTableFeatureList = ofTableFeatureList.subList(index, index + noOfEntriesInMPR);
-               }
-               else {
-                       // Last multipart request
-                       mprInput.setFlags(new MultipartRequestFlags(false));
-                       tmpOfTableFeatureList = ofTableFeatureList.subList(index, totalNoOfTableFeatureEntry );
-               }
-
-        tableFeaturesRequest.setTableFeatures(tmpOfTableFeatureList) ;
+        mprInput.setFlags(new MultipartRequestFlags(true));
+        
+        tableFeaturesRequest.setTableFeatures(ofTableFeatureList) ;
+        
         //Set request body to main multipart request
-        mprInput.setMultipartRequestBody(tableFeaturesRequest.build());
+        caseRequest.setMultipartRequestTableFeatures(tableFeaturesRequest.build());
+        mprInput.setMultipartRequestBody(caseRequest.build());
 
         //Send the request, no cookies associated, use any connection
-        LOG.debug("Send Table Feature request :{}",tmpOfTableFeatureList);
+        LOG.debug("Send Table Feature request :{}",ofTableFeatureList);
         this.messageService.multipartRequest(mprInput.build(), null);
-        index += noOfEntriesInMPR ;
-               tmpOfTableFeatureList = null ; // To avoid any corrupt data
-        }
-      //Extract the Xid only from the Future for the last RPC and
-               // send it back to the NSF
+        
+        
+        //Extract the Xid only from the Future for the last RPC and
+        // send it back to the NSF
         LOG.debug("Returning the result and transaction id to NSF");
         LOG.debug("Return results and transaction id back to caller");
         UpdateTableOutputBuilder output = new UpdateTableOutputBuilder();
@@ -931,6 +1166,475 @@ public class ModelDrivenSwitchImpl extends AbstractModelDrivenSwitch {
         Collection<RpcError> errors = Collections.emptyList();
         RpcResult<UpdateTableOutput> rpcResult = Rpcs.getRpcResult(true, output.build(), errors);
         return Futures.immediateFuture(rpcResult);
+    }
+
+    @Override
+    public Future<RpcResult<GetAllFlowStatisticsFromFlowTableOutput>> getAllFlowStatisticsFromFlowTable(
+            GetAllFlowStatisticsFromFlowTableInput arg0) {
+
+        //Generate xid to associate it with the request
+        Long xid = this.getSessionContext().getNextXid();
+
+        LOG.debug("Prepare statistics request to get flow stats for switch tables {} - Transaction id - {}"
+                ,arg0.getTableId().getValue(),xid);
+
+        // Create multipart request header
+        MultipartRequestInputBuilder mprInput = new MultipartRequestInputBuilder();
+        mprInput.setType(MultipartType.OFPMPFLOW);
+        mprInput.setVersion(version);
+        mprInput.setXid(xid);
+        mprInput.setFlags(new MultipartRequestFlags(false));
+
+        // Create multipart request body for fetch all the group stats
+        MultipartRequestFlowCaseBuilder multipartRequestFlowCaseBuilder  = new MultipartRequestFlowCaseBuilder (); 
+        MultipartRequestFlowBuilder mprFlowRequestBuilder = new MultipartRequestFlowBuilder();
+        mprFlowRequestBuilder.setTableId(arg0.getTableId().getValue());
+        mprFlowRequestBuilder.setOutPort(OFConstants.OFPP_ANY);
+        mprFlowRequestBuilder.setOutGroup(OFConstants.OFPG_ANY);
+        mprFlowRequestBuilder.setCookie(OFConstants.DEFAULT_COOKIE);
+        mprFlowRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
+        
+        if(version == OFConstants.OFP_VERSION_1_0){
+            LOG.info("Target node is running openflow version 1.0");
+            FlowWildcardsV10 wildCard = new FlowWildcardsV10(true,true,true,true,true,true,true,true,true,true);
+            mprFlowRequestBuilder.setMatchV10(new MatchV10Builder().setWildcards(wildCard).build());
+        }
+        if(version == OFConstants.OFP_VERSION_1_3){
+            LOG.info("Target node is running openflow version 1.3+");
+            mprFlowRequestBuilder.setMatch(new MatchBuilder().setType(OxmMatchType.class).build());
+        }
+
+
+        //Set request body to main multipart request
+        multipartRequestFlowCaseBuilder.setMultipartRequestFlow(mprFlowRequestBuilder.build());
+        mprInput.setMultipartRequestBody(multipartRequestFlowCaseBuilder.build());
+
+        //Send the request, no cookies associated, use any connection
+        LOG.debug("Send flow statistics request to the switch :{}",mprFlowRequestBuilder);
+        this.messageService.multipartRequest(mprInput.build(), null);
+
+        // Prepare rpc return output. Set xid and send it back.
+        LOG.debug("Return results and transaction id back to caller");
+        GetAllFlowStatisticsFromFlowTableOutputBuilder output = 
+                new GetAllFlowStatisticsFromFlowTableOutputBuilder();
+        output.setTransactionId(generateTransactionId(xid));
+        output.setFlowAndStatisticsMapList(null);
+
+        Collection<RpcError> errors = Collections.emptyList();
+        RpcResult<GetAllFlowStatisticsFromFlowTableOutput> rpcResult = Rpcs.getRpcResult(true, output.build(), errors);
+        return Futures.immediateFuture(rpcResult);
+    }
+
+    @Override
+    public Future<RpcResult<GetAllFlowsStatisticsFromAllFlowTablesOutput>> getAllFlowsStatisticsFromAllFlowTables(
+            GetAllFlowsStatisticsFromAllFlowTablesInput arg0) {
+        
+        //Generate xid to associate it with the request
+        Long xid = this.getSessionContext().getNextXid();
+
+        LOG.info("Prepare statistics request to get flow stats of all switch tables - Transaction id - {}",xid);
+
+        // Create multipart request header
+        MultipartRequestInputBuilder mprInput = new MultipartRequestInputBuilder();
+        mprInput.setType(MultipartType.OFPMPFLOW);
+        mprInput.setVersion(version);
+        mprInput.setXid(xid);
+        mprInput.setFlags(new MultipartRequestFlags(false));
+
+        // Create multipart request body for fetch all the group stats
+        MultipartRequestFlowCaseBuilder  multipartRequestFlowCaseBuilder = new MultipartRequestFlowCaseBuilder();
+        MultipartRequestFlowBuilder mprFlowRequestBuilder = new MultipartRequestFlowBuilder();
+        mprFlowRequestBuilder.setTableId(OFConstants.OFPTT_ALL);
+        mprFlowRequestBuilder.setOutPort(OFConstants.OFPP_ANY);
+        mprFlowRequestBuilder.setOutGroup(OFConstants.OFPG_ANY);
+        mprFlowRequestBuilder.setCookie(OFConstants.DEFAULT_COOKIE);
+        mprFlowRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
+        mprFlowRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
+        
+        //TODO: repeating code
+        if(version == OFConstants.OFP_VERSION_1_0){
+            FlowWildcardsV10 wildCard = new FlowWildcardsV10(true,true,true,true,true,true,true,true,true,true);
+            mprFlowRequestBuilder.setMatchV10(new MatchV10Builder().setWildcards(wildCard).build());
+        }
+        if(version == OFConstants.OFP_VERSION_1_3){
+            mprFlowRequestBuilder.setMatch(new MatchBuilder().setType(OxmMatchType.class).build());
+        }
+        //Set request body to main multipart request
+        multipartRequestFlowCaseBuilder.setMultipartRequestFlow(mprFlowRequestBuilder.build());
+        mprInput.setMultipartRequestBody(multipartRequestFlowCaseBuilder.build());
+
+        //Send the request, no cookies associated, use any connection
+        LOG.debug("Send flow statistics request to the switch :{}",mprFlowRequestBuilder);
+        this.messageService.multipartRequest(mprInput.build(), null);
+
+        // Prepare rpc return output. Set xid and send it back.
+        GetAllFlowsStatisticsFromAllFlowTablesOutputBuilder output = 
+                new GetAllFlowsStatisticsFromAllFlowTablesOutputBuilder();
+        output.setTransactionId(generateTransactionId(xid));
+        output.setFlowAndStatisticsMapList(null);
+
+        Collection<RpcError> errors = Collections.emptyList();
+        RpcResult<GetAllFlowsStatisticsFromAllFlowTablesOutput> rpcResult = Rpcs.getRpcResult(true, output.build(), errors);
+        return Futures.immediateFuture(rpcResult);
+
+    }
+
+    @Override
+    public Future<RpcResult<GetFlowStatisticsFromFlowTableOutput>> getFlowStatisticsFromFlowTable(
+            GetFlowStatisticsFromFlowTableInput arg0) {
+        //Generate xid to associate it with the request
+        Long xid = this.getSessionContext().getNextXid();
+
+        LOG.info("Prepare statistics request to get stats for flow {} for switch tables {} - Transaction id - {}"
+                ,arg0.getMatch().toString(),arg0.getTableId(),xid);
+
+        // Create multipart request header
+        MultipartRequestInputBuilder mprInput = new MultipartRequestInputBuilder();
+        mprInput.setType(MultipartType.OFPMPFLOW);
+        mprInput.setVersion(version);
+        mprInput.setXid(xid);
+        mprInput.setFlags(new MultipartRequestFlags(false));
+
+        // Create multipart request body for fetch all the group stats
+        MultipartRequestFlowCaseBuilder  multipartRequestFlowCaseBuilder = new MultipartRequestFlowCaseBuilder();
+        MultipartRequestFlowBuilder mprFlowRequestBuilder = new MultipartRequestFlowBuilder();
+        mprFlowRequestBuilder.setTableId(arg0.getTableId());
+        mprFlowRequestBuilder.setOutPort(arg0.getOutPort().longValue());
+        mprFlowRequestBuilder.setOutGroup(OFConstants.OFPG_ANY);
+        mprFlowRequestBuilder.setCookie(OFConstants.DEFAULT_COOKIE);
+        mprFlowRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
+
+        // convert and inject match
+        MatchReactor.getInstance().convert(arg0.getMatch(), version, mprFlowRequestBuilder);
+        //TODO: repeating code
+        if(version == OFConstants.OFP_VERSION_1_3){
+            mprFlowRequestBuilder.setCookie(arg0.getCookie());
+            mprFlowRequestBuilder.setCookieMask(arg0.getCookieMask());
+            mprFlowRequestBuilder.setOutGroup(arg0.getOutGroup());
+        }
+
+        //Set request body to main multipart request
+        multipartRequestFlowCaseBuilder.setMultipartRequestFlow(mprFlowRequestBuilder.build());
+        mprInput.setMultipartRequestBody(multipartRequestFlowCaseBuilder.build());
+
+        //Send the request, no cookies associated, use any connection
+        LOG.debug("Send flow statistics request to the switch :{}",mprFlowRequestBuilder);
+        this.messageService.multipartRequest(mprInput.build(), null);
+
+        // Prepare rpc return output. Set xid and send it back.
+        GetFlowStatisticsFromFlowTableOutputBuilder output = 
+                new GetFlowStatisticsFromFlowTableOutputBuilder();
+        output.setTransactionId(generateTransactionId(xid));
+        output.setFlowAndStatisticsMapList(null);
+
+        Collection<RpcError> errors = Collections.emptyList();
+        RpcResult<GetFlowStatisticsFromFlowTableOutput> rpcResult = Rpcs.getRpcResult(true, output.build(), errors);
+        return Futures.immediateFuture(rpcResult);
+    }
+
+    @Override
+    public Future<RpcResult<GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutput>> getAggregateFlowStatisticsFromFlowTableForAllFlows(
+            GetAggregateFlowStatisticsFromFlowTableForAllFlowsInput arg0) {
+        //Generate xid to associate it with the request
+        Long xid = this.getSessionContext().getNextXid();
+
+        LOG.info("Prepare aggregate flow statistics request to get aggregate flow stats for all the flow installed on switch table {} - Transaction id - {}"
+                ,arg0.getTableId().getValue(),xid);
+
+        // Create multipart request header
+        MultipartRequestInputBuilder mprInput = new MultipartRequestInputBuilder();
+        mprInput.setType(MultipartType.OFPMPAGGREGATE);
+        mprInput.setVersion(version);
+        mprInput.setXid(xid);
+        mprInput.setFlags(new MultipartRequestFlags(false));
+
+        // Create multipart request body for fetch all the group stats
+        MultipartRequestAggregateCaseBuilder multipartRequestAggregateCaseBuilder  = new MultipartRequestAggregateCaseBuilder (); 
+        MultipartRequestAggregateBuilder mprAggregateRequestBuilder = new MultipartRequestAggregateBuilder();
+        mprAggregateRequestBuilder.setTableId(arg0.getTableId().getValue());
+        mprAggregateRequestBuilder.setOutPort(OFConstants.OFPP_ANY);
+        mprAggregateRequestBuilder.setOutGroup(OFConstants.OFPG_ANY);
+        mprAggregateRequestBuilder.setCookie(OFConstants.DEFAULT_COOKIE);
+        mprAggregateRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
+        
+        //TODO: repeating code
+        if(version == OFConstants.OFP_VERSION_1_0){
+            FlowWildcardsV10 wildCard = new FlowWildcardsV10(true,true,true,true,true,true,true,true,true,true);
+            mprAggregateRequestBuilder.setMatchV10(new MatchV10Builder().setWildcards(wildCard).build());
+        }
+        if(version == OFConstants.OFP_VERSION_1_3){
+            mprAggregateRequestBuilder.setMatch(new MatchBuilder().setType(OxmMatchType.class).build());
+        }
+
+
+        //Set request body to main multipart request
+        multipartRequestAggregateCaseBuilder.setMultipartRequestAggregate(mprAggregateRequestBuilder.build());
+        mprInput.setMultipartRequestBody(multipartRequestAggregateCaseBuilder.build());
+
+        //Send the request, no cookies associated, use any connection
+        LOG.debug("Send request to the switch :{}",multipartRequestAggregateCaseBuilder.build().toString());
+        this.messageService.multipartRequest(mprInput.build(), null);
+
+        // Prepare rpc return output. Set xid and send it back.
+        GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutputBuilder output = 
+                new GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutputBuilder();
+        output.setTransactionId(generateTransactionId(xid));
+
+        Collection<RpcError> errors = Collections.emptyList();
+        RpcResult<GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutput> rpcResult = Rpcs.getRpcResult(true, output.build(), errors);
+        return Futures.immediateFuture(rpcResult);
+    }
+
+    @Override
+    public Future<RpcResult<GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutput>> getAggregateFlowStatisticsFromFlowTableForGivenMatch(
+            GetAggregateFlowStatisticsFromFlowTableForGivenMatchInput arg0) {
+
+        //Generate xid to associate it with the request
+        Long xid = this.getSessionContext().getNextXid();
+
+        LOG.debug("Prepare agregate statistics request to get aggregate stats for flows matching {} and installed in flow tables {} - Transaction id - {}"
+                ,arg0.getMatch().toString(),arg0.getTableId(),xid);
+
+        // Create multipart request header
+        MultipartRequestInputBuilder mprInput = new MultipartRequestInputBuilder();
+        mprInput.setType(MultipartType.OFPMPAGGREGATE);
+        mprInput.setVersion(version);
+        mprInput.setXid(xid);
+        mprInput.setFlags(new MultipartRequestFlags(false));
+
+        // Create multipart request body for fetch all the group stats
+        MultipartRequestAggregateCaseBuilder multipartRequestAggregateCaseBuilder  = new MultipartRequestAggregateCaseBuilder (); 
+        MultipartRequestAggregateBuilder mprAggregateRequestBuilder = new MultipartRequestAggregateBuilder();
+        mprAggregateRequestBuilder.setTableId(arg0.getTableId());
+        mprAggregateRequestBuilder.setOutPort(arg0.getOutPort().longValue());
+        mprAggregateRequestBuilder.setOutGroup(OFConstants.OFPG_ANY);
+        mprAggregateRequestBuilder.setCookie(OFConstants.DEFAULT_COOKIE);
+        mprAggregateRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
+
+
+        MatchReactor.getInstance().convert(arg0.getMatch(), version, mprAggregateRequestBuilder);
+        //TODO: repeating code
+        if(version == OFConstants.OFP_VERSION_1_3){
+            mprAggregateRequestBuilder.setCookie(arg0.getCookie());
+            mprAggregateRequestBuilder.setCookieMask(arg0.getCookieMask());
+            mprAggregateRequestBuilder.setOutGroup(arg0.getOutGroup());
+        }
+
+        //Set request body to main multipart request
+        multipartRequestAggregateCaseBuilder.setMultipartRequestAggregate(mprAggregateRequestBuilder.build());
+        mprInput.setMultipartRequestBody(multipartRequestAggregateCaseBuilder.build());
+
+        //Send the request, no cookies associated, use any connection
+        LOG.debug("Send request to the switch :{}",multipartRequestAggregateCaseBuilder.build().toString());
+        this.messageService.multipartRequest(mprInput.build(), null);
+
+        // Prepare rpc return output. Set xid and send it back.
+        GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutputBuilder output = 
+                new GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutputBuilder();
+        output.setTransactionId(generateTransactionId(xid));
+
+        Collection<RpcError> errors = Collections.emptyList();
+        RpcResult<GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutput> rpcResult = Rpcs.getRpcResult(true, output.build(), errors);
+        return Futures.immediateFuture(rpcResult);
+    }
+
+    @Override
+    public Future<RpcResult<GetFlowTablesStatisticsOutput>> getFlowTablesStatistics(GetFlowTablesStatisticsInput arg0) {
+        //Generate xid to associate it with the request
+        Long xid = this.getSessionContext().getNextXid();
+
+        LOG.info("Prepare flow table statistics request to get flow table stats for all tables " +
+                       "from node {}- Transaction id - {}",arg0.getNode(),xid);
+
+        // Create multipart request header
+        MultipartRequestInputBuilder mprInput = new MultipartRequestInputBuilder();
+        mprInput.setType(MultipartType.OFPMPTABLE);
+        mprInput.setVersion(version);
+        mprInput.setXid(xid);
+        mprInput.setFlags(new MultipartRequestFlags(false));
+
+        // Create multipart request body for fetch all the group stats
+        MultipartRequestTableCaseBuilder multipartRequestTableCaseBuilder  = new MultipartRequestTableCaseBuilder (); 
+        MultipartRequestTableBuilder multipartRequestTableBuilder = new MultipartRequestTableBuilder();
+        multipartRequestTableBuilder.setEmpty(true);
+        multipartRequestTableCaseBuilder.setMultipartRequestTable(multipartRequestTableBuilder.build());
+        
+        //Set request body to main multipart request
+        mprInput.setMultipartRequestBody(multipartRequestTableCaseBuilder.build());
+
+        //Send the request, no cookies associated, use any connection
+        LOG.debug("Send request to the switch :{}",multipartRequestTableCaseBuilder.build().toString());
+        this.messageService.multipartRequest(mprInput.build(), null);
+
+        // Prepare rpc return output. Set xid and send it back.
+        GetFlowTablesStatisticsOutputBuilder output = new GetFlowTablesStatisticsOutputBuilder();
+        output.setTransactionId(generateTransactionId(xid));
+
+        Collection<RpcError> errors = Collections.emptyList();
+        RpcResult<GetFlowTablesStatisticsOutput> rpcResult = Rpcs.getRpcResult(true, output.build(), errors);
+        return Futures.immediateFuture(rpcResult);
+    }
+
+    @Override
+    public Future<RpcResult<GetAllQueuesStatisticsFromAllPortsOutput>> getAllQueuesStatisticsFromAllPorts(
+            GetAllQueuesStatisticsFromAllPortsInput arg0) {
+        //Generate xid to associate it with the request
+        Long xid = this.getSessionContext().getNextXid();
+
+        LOG.info("Prepare queue statistics request to collect stats for all queues attached to all the ports of node {} - TrasactionId - {}",arg0.getNode().getValue(),xid);
+
+        // Create multipart request header
+        MultipartRequestInputBuilder mprInput = new MultipartRequestInputBuilder();
+        mprInput.setType(MultipartType.OFPMPQUEUE);
+        mprInput.setVersion(version);
+        mprInput.setXid(xid);
+        mprInput.setFlags(new MultipartRequestFlags(false));
+
+        // Create multipart request body to fetch stats for all the port of the node
+        MultipartRequestQueueCaseBuilder caseBuilder = new MultipartRequestQueueCaseBuilder();
+        MultipartRequestQueueBuilder mprQueueBuilder = new MultipartRequestQueueBuilder();
+        //Select all ports 
+        mprQueueBuilder.setPortNo(OFConstants.OFPP_ANY);
+        //Select all the ports
+        mprQueueBuilder.setQueueId(OFConstants.OFPQ_ANY);
+        
+        caseBuilder.setMultipartRequestQueue(mprQueueBuilder.build());
+        
+        //Set request body to main multipart request
+        mprInput.setMultipartRequestBody(caseBuilder.build());
+
+        //Send the request, no cookies associated, use any connection
+        LOG.debug("Send queue statistics request :{}",mprQueueBuilder.build().toString());
+        this.messageService.multipartRequest(mprInput.build(), null);
+
+        // Prepare rpc return output. Set xid and send it back.
+        GetAllQueuesStatisticsFromAllPortsOutputBuilder output = new GetAllQueuesStatisticsFromAllPortsOutputBuilder();
+        output.setTransactionId(generateTransactionId(xid));
+        output.setQueueIdAndStatisticsMap(null);
+
+        Collection<RpcError> errors = Collections.emptyList();
+        RpcResult<GetAllQueuesStatisticsFromAllPortsOutput> rpcResult = Rpcs.getRpcResult(true, output.build(), errors);
+        return Futures.immediateFuture(rpcResult);
+    }
+
+    @Override
+    public Future<RpcResult<GetAllQueuesStatisticsFromGivenPortOutput>> getAllQueuesStatisticsFromGivenPort(
+            GetAllQueuesStatisticsFromGivenPortInput arg0) {
+        //Generate xid to associate it with the request
+        Long xid = this.getSessionContext().getNextXid();
+
+        LOG.info("Prepare queue statistics request to collect stats for " +
+                       "all queues attached to given port {} of node {} - TrasactionId - {}",arg0.getNodeConnectorId().toString(),arg0.getNode().getValue(),xid);
+
+        // Create multipart request header
+        MultipartRequestInputBuilder mprInput = new MultipartRequestInputBuilder();
+        mprInput.setType(MultipartType.OFPMPQUEUE);
+        mprInput.setVersion(version);
+        mprInput.setXid(xid);
+        mprInput.setFlags(new MultipartRequestFlags(false));
+
+        // Create multipart request body to fetch stats for all the port of the node
+        MultipartRequestQueueCaseBuilder caseBuilder = new MultipartRequestQueueCaseBuilder();
+        MultipartRequestQueueBuilder mprQueueBuilder = new MultipartRequestQueueBuilder();
+        //Select all queues
+        mprQueueBuilder.setQueueId(OFConstants.OFPQ_ANY);
+        //Select specific port
+        mprQueueBuilder.setPortNo(InventoryDataServiceUtil.portNumberfromNodeConnectorId(arg0.getNodeConnectorId()));
+        
+        caseBuilder.setMultipartRequestQueue(mprQueueBuilder.build());
+        
+        //Set request body to main multipart request
+        mprInput.setMultipartRequestBody(caseBuilder.build());
+
+        //Send the request, no cookies associated, use any connection
+        LOG.debug("Send queue statistics request :{}",mprQueueBuilder.build().toString());
+        this.messageService.multipartRequest(mprInput.build(), null);
+
+        // Prepare rpc return output. Set xid and send it back.
+        GetAllQueuesStatisticsFromGivenPortOutputBuilder output = new GetAllQueuesStatisticsFromGivenPortOutputBuilder();
+        output.setTransactionId(generateTransactionId(xid));
+        output.setQueueIdAndStatisticsMap(null);
+
+        Collection<RpcError> errors = Collections.emptyList();
+        RpcResult<GetAllQueuesStatisticsFromGivenPortOutput> rpcResult = Rpcs.getRpcResult(true, output.build(), errors);
+        return Futures.immediateFuture(rpcResult);
+    }
+
+    @Override
+    public Future<RpcResult<GetQueueStatisticsFromGivenPortOutput>> getQueueStatisticsFromGivenPort(
+            GetQueueStatisticsFromGivenPortInput arg0) {
+        //Generate xid to associate it with the request
+        Long xid = this.getSessionContext().getNextXid();
+
+        LOG.info("Prepare queue statistics request to collect stats for " +
+                        "given queue attached to given port {} of node {} - TrasactionId - {}",arg0.getQueueId().toString(),arg0.getNodeConnectorId().toString(),arg0.getNode().getValue(),xid);
+
+        // Create multipart request header
+        MultipartRequestInputBuilder mprInput = new MultipartRequestInputBuilder();
+        mprInput.setType(MultipartType.OFPMPQUEUE);
+        mprInput.setVersion(version);
+        mprInput.setXid(xid);
+        mprInput.setFlags(new MultipartRequestFlags(false));
+
+        // Create multipart request body to fetch stats for all the port of the node
+        MultipartRequestQueueCaseBuilder caseBuilder = new MultipartRequestQueueCaseBuilder();
+        MultipartRequestQueueBuilder mprQueueBuilder = new MultipartRequestQueueBuilder();
+        //Select specific queue
+        mprQueueBuilder.setQueueId(arg0.getQueueId().getValue());
+        //Select specific port 
+        mprQueueBuilder.setPortNo(InventoryDataServiceUtil.portNumberfromNodeConnectorId(arg0.getNodeConnectorId()));
+        
+        caseBuilder.setMultipartRequestQueue(mprQueueBuilder.build());
+        
+        //Set request body to main multipart request
+        mprInput.setMultipartRequestBody(caseBuilder.build());
+
+        //Send the request, no cookies associated, use any connection
+        LOG.debug("Send queue statistics request :{}",mprQueueBuilder.build().toString());
+        this.messageService.multipartRequest(mprInput.build(), null);
+
+        // Prepare rpc return output. Set xid and send it back.
+        GetQueueStatisticsFromGivenPortOutputBuilder output = new GetQueueStatisticsFromGivenPortOutputBuilder();
+        output.setTransactionId(generateTransactionId(xid));
+        output.setQueueIdAndStatisticsMap(null);
+
+        Collection<RpcError> errors = Collections.emptyList();
+        RpcResult<GetQueueStatisticsFromGivenPortOutput> rpcResult = Rpcs.getRpcResult(true, output.build(), errors);
+        return Futures.immediateFuture(rpcResult);
+    }
+
+    @Override
+    public Future<RpcResult<GetAllFlowStatisticsOutput>> getAllFlowStatistics(GetAllFlowStatisticsInput arg0) {
+        //TODO: Depricated, need to clean it up. Sal-Compatibility layes is dependent on it.
+        // Once sal-compatibility layer is fixed this rpc call can be removed from yang file 
+        return null;
+    }
+
+    @Override
+    public Future<RpcResult<GetAllNodeConnectorStatisticsOutput>> getAllNodeConnectorStatistics(
+            GetAllNodeConnectorStatisticsInput arg0) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public Future<RpcResult<GetFlowStatisticsOutput>> getFlowStatistics(GetFlowStatisticsInput arg0) {
+        //TODO: Depricated, need to clean it up. Sal-Compatibility layes is dependent on it.
+        // Once sal-compatibility layer is fixed this rpc call can be removed from yang file 
+        return null;
+    }
+
+    @Override
+    public Future<RpcResult<GetFlowTableStatisticsOutput>> getFlowTableStatistics(GetFlowTableStatisticsInput arg0) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public Future<RpcResult<GetNodeConnectorStatisticsOutput>> getNodeConnectorStatistics(
+            GetNodeConnectorStatisticsInput arg0) {
+        // TODO Auto-generated method stub
+        return null;
+    }
 
-       }
 }