BUG 2661 - sonar issues in openflowplugin artifact - anonymous class. 73/16073/1
authorJozef Gloncak <jgloncak@cisco.com>
Thu, 5 Mar 2015 13:19:31 +0000 (14:19 +0100)
committerJozef Gloncak <jgloncak@cisco.com>
Thu, 5 Mar 2015 13:19:51 +0000 (14:19 +0100)
Annonymous class was replaced with named inner class.

REMARK: it is possible that this commit will be reverted.

Change-Id: Ice30fbe21ae160ec6b1004644d1c1397ac0bec56
Signed-off-by: Jozef Gloncak <jgloncak@cisco.com>
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/OFRpcTaskFactory.java

index 72d14a9e299217225ec01133af5556e656f373a2..88265ffa287ecd55371782fd3d9f6ba1aed1c422 100644 (file)
@@ -178,8 +178,12 @@ import org.slf4j.LoggerFactory;
  *
  */
 public abstract class OFRpcTaskFactory {
-    protected static final Logger logger = LoggerFactory.getLogger(OFRpcTaskFactory.class);
+    protected static final Logger LOG = LoggerFactory.getLogger(OFRpcTaskFactory.class);
 
+    private OFRpcTaskFactory() {
+        // hiding implicit constructor
+    }
+    
     /**
      * @param taskContext
      * @param input
@@ -189,35 +193,36 @@ public abstract class OFRpcTaskFactory {
     public static OFRpcTask<AddFlowInput, RpcResult<UpdateFlowOutput>> createAddFlowTask(
             OFRpcTaskContext taskContext, AddFlowInput input,
             SwitchConnectionDistinguisher cookie) {
-        OFRpcTask<AddFlowInput, RpcResult<UpdateFlowOutput>> task =
-                new OFRpcTask<AddFlowInput, RpcResult<UpdateFlowOutput>>(taskContext, cookie, input) {
-
-                    @Override
-                    public ListenableFuture<RpcResult<UpdateFlowOutput>> call() {
-                        ListenableFuture<RpcResult<UpdateFlowOutput>> result = SettableFuture.create();
 
-                        // Convert the AddFlowInput to FlowModInput
-                        List<FlowModInputBuilder> ofFlowModInputs = FlowConvertor.toFlowModInputs(getInput(),
-                                getVersion(), getSession().getFeatures().getDatapathId());
+        class OFRpcTaskImpl extends OFRpcTask<AddFlowInput, RpcResult<UpdateFlowOutput>> {
 
-                        logger.debug("Number of flows to push to switch: {}", ofFlowModInputs.size());
-
-                        result = chainFlowMods(ofFlowModInputs, 0, getTaskContext(), getCookie());
+            public OFRpcTaskImpl(OFRpcTaskContext taskContext, SwitchConnectionDistinguisher cookie, AddFlowInput input) {
+                super(taskContext, cookie, input);
+            }
 
+            @Override
+            public ListenableFuture<RpcResult<UpdateFlowOutput>> call() {
+                ListenableFuture<RpcResult<UpdateFlowOutput>> result = SettableFuture.create();
+
+                // Convert the AddFlowInput to FlowModInput
+                List<FlowModInputBuilder> ofFlowModInputs = FlowConvertor.toFlowModInputs(getInput(),
+                        getVersion(), getSession().getFeatures().getDatapathId());
+                LOG.debug("Number of flows to push to switch: {}", ofFlowModInputs.size());
+                result = chainFlowMods(ofFlowModInputs, 0, getTaskContext(), getCookie());
+                result = OFRpcTaskUtil.chainFutureBarrier(this, result);
+                OFRpcTaskUtil.hookFutureNotification(this, result,
+                        getRpcNotificationProviderService(),
+                        createFlowAddedNotification(getInput()));
+                return result;
+            }
 
-                        result = OFRpcTaskUtil.chainFutureBarrier(this, result);
-                        OFRpcTaskUtil.hookFutureNotification(this, result,
-                                getRpcNotificationProviderService(),
-                                createFlowAddedNotification(getInput()));
-                        return result;
-                    }
+            @Override
+            public Boolean isBarrier() {
+                return getInput().isBarrier();
+            }
+        }
 
-                    @Override
-                    public Boolean isBarrier() {
-                        return getInput().isBarrier();
-                    }
-                };
-        return task;
+        return new OFRpcTaskImpl(taskContext, cookie, input);
     }
 
     /**
@@ -246,7 +251,7 @@ public abstract class OFRpcTaskFactory {
                             if (input.isSuccessful()) {
                                 return chainFlowMods(ofFlowModInputs, index + 1, taskContext, cookie);
                             } else {
-                                logger.warn("Flowmod failed. Any chained flowmods are ignored. xid:{}",
+                                LOG.warn("Flowmod failed. Any chained flowmods are ignored. xid:{}",
                                         ofFlowModInputs.get(index).getXid());
                                 return Futures.immediateFuture(input);
                             }
@@ -293,55 +298,59 @@ public abstract class OFRpcTaskFactory {
             final OFRpcTaskContext taskContext, UpdateFlowInput input,
             SwitchConnectionDistinguisher cookie) {
 
-        OFRpcTask<UpdateFlowInput, RpcResult<UpdateFlowOutput>> task =
-                new OFRpcTask<UpdateFlowInput, RpcResult<UpdateFlowOutput>>(taskContext, cookie, input) {
-
-                    @Override
-                    public ListenableFuture<RpcResult<UpdateFlowOutput>> call() {
-                        ListenableFuture<RpcResult<UpdateFlowOutput>> result = null;
-
-                        UpdateFlowInput in = getInput();
-                        UpdatedFlow updated = in.getUpdatedFlow();
-                        OriginalFlow original = in.getOriginalFlow();
-                        Short version = getVersion();
-
-                        List<FlowModInputBuilder> allFlowMods = new ArrayList<>();
-                        List<FlowModInputBuilder> ofFlowModInputs;
-
-                        if (!FlowCreatorUtil.canModifyFlow(original, updated, version)) {
-                            // We would need to remove original and add updated.
-
-                            //remove flow
-                            RemoveFlowInputBuilder removeflow = new RemoveFlowInputBuilder(original);
-                            List<FlowModInputBuilder> ofFlowRemoveInput = FlowConvertor.toFlowModInputs(removeflow.build(),
-                                    version, getSession().getFeatures().getDatapathId());
-                            // remove flow should be the first
-                            allFlowMods.addAll(ofFlowRemoveInput);
-                            AddFlowInputBuilder addFlowInputBuilder = new AddFlowInputBuilder(updated);
-                            ofFlowModInputs = FlowConvertor.toFlowModInputs(addFlowInputBuilder.build(),
-                                    version, getSession().getFeatures().getDatapathId());
-                        } else {
-                            ofFlowModInputs = FlowConvertor.toFlowModInputs(updated,
-                                    version, getSession().getFeatures().getDatapathId());
-                        }
+        class OFRpcTaskImpl extends OFRpcTask<UpdateFlowInput, RpcResult<UpdateFlowOutput>> {
 
-                        allFlowMods.addAll(ofFlowModInputs);
-                        logger.debug("Number of flows to push to switch: {}", allFlowMods.size());
-                        result = chainFlowMods(allFlowMods, 0, getTaskContext(), getCookie());
+            public OFRpcTaskImpl(OFRpcTaskContext taskContext, SwitchConnectionDistinguisher cookie,
+                    UpdateFlowInput input) {
+                super(taskContext, cookie, input);
+            }
 
-                        result = OFRpcTaskUtil.chainFutureBarrier(this, result);
-                        OFRpcTaskUtil.hookFutureNotification(this, result,
-                                getRpcNotificationProviderService(),
-                                createFlowUpdatedNotification(in));
-                        return result;
-                    }
+            @Override
+            public ListenableFuture<RpcResult<UpdateFlowOutput>> call() {
+                ListenableFuture<RpcResult<UpdateFlowOutput>> result = null;
+
+                UpdateFlowInput in = getInput();
+                UpdatedFlow updated = in.getUpdatedFlow();
+                OriginalFlow original = in.getOriginalFlow();
+                Short version = getVersion();
+
+                List<FlowModInputBuilder> allFlowMods = new ArrayList<>();
+                List<FlowModInputBuilder> ofFlowModInputs;
+
+                if (!FlowCreatorUtil.canModifyFlow(original, updated, version)) {
+                    // We would need to remove original and add updated.
+
+                    //remove flow
+                    RemoveFlowInputBuilder removeflow = new RemoveFlowInputBuilder(original);
+                    List<FlowModInputBuilder> ofFlowRemoveInput = FlowConvertor.toFlowModInputs(removeflow.build(),
+                            version, getSession().getFeatures().getDatapathId());
+                    // remove flow should be the first
+                    allFlowMods.addAll(ofFlowRemoveInput);
+                    AddFlowInputBuilder addFlowInputBuilder = new AddFlowInputBuilder(updated);
+                    ofFlowModInputs = FlowConvertor.toFlowModInputs(addFlowInputBuilder.build(),
+                            version, getSession().getFeatures().getDatapathId());
+                } else {
+                    ofFlowModInputs = FlowConvertor.toFlowModInputs(updated,
+                            version, getSession().getFeatures().getDatapathId());
+                }
+
+                allFlowMods.addAll(ofFlowModInputs);
+                LOG.debug("Number of flows to push to switch: {}", allFlowMods.size());
+                result = chainFlowMods(allFlowMods, 0, getTaskContext(), getCookie());
+
+                result = OFRpcTaskUtil.chainFutureBarrier(this, result);
+                OFRpcTaskUtil.hookFutureNotification(this, result,
+                        getRpcNotificationProviderService(),
+                        createFlowUpdatedNotification(in));
+                return result;
+            }
 
-                    @Override
-                    public Boolean isBarrier() {
-                        return getInput().getUpdatedFlow().isBarrier();
-                    }
-                };
-        return task;
+            @Override
+            public Boolean isBarrier() {
+                return getInput().getUpdatedFlow().isBarrier();
+            }
+        }
+        return new OFRpcTaskImpl(taskContext, cookie, input);
     }
 
 
@@ -371,37 +380,40 @@ public abstract class OFRpcTaskFactory {
     public static OFRpcTask<AddGroupInput, RpcResult<UpdateGroupOutput>> createAddGroupTask(
             final OFRpcTaskContext taskContext, AddGroupInput input,
             final SwitchConnectionDistinguisher cookie) {
-        OFRpcTask<AddGroupInput, RpcResult<UpdateGroupOutput>> task =
-                new OFRpcTask<AddGroupInput, RpcResult<UpdateGroupOutput>>(taskContext, cookie, input) {
+        class OFRpcTaskImpl extends OFRpcTask<AddGroupInput, RpcResult<UpdateGroupOutput>> {
 
-                    @Override
-                    public ListenableFuture<RpcResult<UpdateGroupOutput>> call() {
-                        ListenableFuture<RpcResult<UpdateGroupOutput>> result = SettableFuture.create();
+            public OFRpcTaskImpl(OFRpcTaskContext taskContext, SwitchConnectionDistinguisher cookie, AddGroupInput input) {
+                super(taskContext, cookie, input);
+            }
 
-                        // Convert the AddGroupInput to GroupModInput
-                        GroupModInputBuilder ofGroupModInput = GroupConvertor.toGroupModInput(getInput(),
-                                getVersion(), getSession().getFeatures().getDatapathId());
-                        final Long xId = getSession().getNextXid();
-                        ofGroupModInput.setXid(xId);
+            @Override
+            public ListenableFuture<RpcResult<UpdateGroupOutput>> call() {
+                ListenableFuture<RpcResult<UpdateGroupOutput>> result = SettableFuture.create();
 
-                        Future<RpcResult<UpdateGroupOutput>> resultFromOFLib = getMessageService()
-                                .groupMod(ofGroupModInput.build(), getCookie());
-                        result = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
+                // Convert the AddGroupInput to GroupModInput
+                GroupModInputBuilder ofGroupModInput = GroupConvertor.toGroupModInput(getInput(),
+                        getVersion(), getSession().getFeatures().getDatapathId());
+                final Long xId = getSession().getNextXid();
+                ofGroupModInput.setXid(xId);
 
-                        result = OFRpcTaskUtil.chainFutureBarrier(this, result);
-                        OFRpcTaskUtil.hookFutureNotification(this, result,
-                                getRpcNotificationProviderService(), createGroupAddedNotification(getInput()));
+                Future<RpcResult<UpdateGroupOutput>> resultFromOFLib = getMessageService()
+                        .groupMod(ofGroupModInput.build(), getCookie());
+                result = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
 
-                        return result;
-                    }
+                result = OFRpcTaskUtil.chainFutureBarrier(this, result);
+                OFRpcTaskUtil.hookFutureNotification(this, result,
+                        getRpcNotificationProviderService(), createGroupAddedNotification(getInput()));
 
-                    @Override
-                    public Boolean isBarrier() {
-                        return getInput().isBarrier();
-                    }
-                };
+                return result;
+            }
+
+            @Override
+            public Boolean isBarrier() {
+                return getInput().isBarrier();
+            }
+        };
 
-        return task;
+        return new OFRpcTaskImpl(taskContext, cookie, input);
     }
 
 
@@ -431,37 +443,39 @@ public abstract class OFRpcTaskFactory {
     public static OFRpcTask<AddMeterInput, RpcResult<UpdateMeterOutput>> createAddMeterTask(
             OFRpcTaskContext taskContext, AddMeterInput input,
             SwitchConnectionDistinguisher cookie) {
-        OFRpcTask<AddMeterInput, RpcResult<UpdateMeterOutput>> task =
-                new OFRpcTask<AddMeterInput, RpcResult<UpdateMeterOutput>>(taskContext, cookie, input) {
+        class OFRpcTaskImpl extends OFRpcTask<AddMeterInput, RpcResult<UpdateMeterOutput>> {
 
-                    @Override
-                    public ListenableFuture<RpcResult<UpdateMeterOutput>> call() {
-                        ListenableFuture<RpcResult<UpdateMeterOutput>> result = SettableFuture.create();
+            public OFRpcTaskImpl(OFRpcTaskContext taskContext, SwitchConnectionDistinguisher cookie, AddMeterInput input) {
+                super(taskContext, cookie, input);
+            }
 
-                        // Convert the AddGroupInput to GroupModInput
-                        MeterModInputBuilder ofMeterModInput = MeterConvertor.toMeterModInput(getInput(), getVersion());
-                        final Long xId = getSession().getNextXid();
-                        ofMeterModInput.setXid(xId);
+            @Override
+            public ListenableFuture<RpcResult<UpdateMeterOutput>> call() {
+                ListenableFuture<RpcResult<UpdateMeterOutput>> result = SettableFuture.create();
 
-                        Future<RpcResult<UpdateMeterOutput>> resultFromOFLib = getMessageService()
-                                .meterMod(ofMeterModInput.build(), getCookie());
-                        result = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
+                // Convert the AddGroupInput to GroupModInput
+                MeterModInputBuilder ofMeterModInput = MeterConvertor.toMeterModInput(getInput(), getVersion());
+                final Long xId = getSession().getNextXid();
+                ofMeterModInput.setXid(xId);
 
-                        result = OFRpcTaskUtil.chainFutureBarrier(this, result);
-                        OFRpcTaskUtil.hookFutureNotification(this, result,
-                                getRpcNotificationProviderService(), createMeterAddedNotification(getInput()));
+                Future<RpcResult<UpdateMeterOutput>> resultFromOFLib = getMessageService()
+                        .meterMod(ofMeterModInput.build(), getCookie());
+                result = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
 
-                        return result;
-                    }
+                result = OFRpcTaskUtil.chainFutureBarrier(this, result);
+                OFRpcTaskUtil.hookFutureNotification(this, result,
+                        getRpcNotificationProviderService(), createMeterAddedNotification(getInput()));
 
-                    @Override
-                    public Boolean isBarrier() {
-                        return getInput().isBarrier();
-                    }
-                };
+                return result;
+            }
 
-        return task;
+            @Override
+            public Boolean isBarrier() {
+                return getInput().isBarrier();
+            }
+        };
 
+        return new OFRpcTaskImpl(taskContext, cookie, input);
     }
 
     /**
@@ -490,32 +504,37 @@ public abstract class OFRpcTaskFactory {
     public static OFRpcTask<UpdateGroupInput, RpcResult<UpdateGroupOutput>> createUpdateGroupTask(
             OFRpcTaskContext taskContext, UpdateGroupInput input,
             SwitchConnectionDistinguisher cookie) {
-        OFRpcTask<UpdateGroupInput, RpcResult<UpdateGroupOutput>> task =
-                new OFRpcTask<UpdateGroupInput, RpcResult<UpdateGroupOutput>>(taskContext, cookie, input) {
+        class OFRpcTaskImpl extends OFRpcTask<UpdateGroupInput, RpcResult<UpdateGroupOutput>> {
 
-                    @Override
-                    public ListenableFuture<RpcResult<UpdateGroupOutput>> call() {
-                        ListenableFuture<RpcResult<UpdateGroupOutput>> result = null;
+            public OFRpcTaskImpl(OFRpcTaskContext taskContext, SwitchConnectionDistinguisher cookie,
+                    UpdateGroupInput input) {
+                super(taskContext, cookie, input);
+            }
 
-                        // Convert the UpdateGroupInput to GroupModInput
-                        GroupModInputBuilder ofGroupModInput = GroupConvertor.toGroupModInput(
-                                getInput().getUpdatedGroup(), getVersion(),
-                                getSession().getFeatures().getDatapathId());
-                        final Long xId = getSession().getNextXid();
-                        ofGroupModInput.setXid(xId);
+            @Override
+            public ListenableFuture<RpcResult<UpdateGroupOutput>> call() {
+                ListenableFuture<RpcResult<UpdateGroupOutput>> result = null;
 
-                        Future<RpcResult<UpdateGroupOutput>> resultFromOFLib =
-                                getMessageService().groupMod(ofGroupModInput.build(), getCookie());
-                        result = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
+                // Convert the UpdateGroupInput to GroupModInput
+                GroupModInputBuilder ofGroupModInput = GroupConvertor.toGroupModInput(
+                        getInput().getUpdatedGroup(), getVersion(),
+                        getSession().getFeatures().getDatapathId());
+                final Long xId = getSession().getNextXid();
+                ofGroupModInput.setXid(xId);
 
-                        result = OFRpcTaskUtil.chainFutureBarrier(this, result);
-                        OFRpcTaskUtil.hookFutureNotification(this, result,
-                                getRpcNotificationProviderService(), createGroupUpdatedNotification(getInput()));
+                Future<RpcResult<UpdateGroupOutput>> resultFromOFLib =
+                        getMessageService().groupMod(ofGroupModInput.build(), getCookie());
+                result = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
 
-                        return result;
-                    }
-                };
-        return task;
+                result = OFRpcTaskUtil.chainFutureBarrier(this, result);
+                OFRpcTaskUtil.hookFutureNotification(this, result,
+                        getRpcNotificationProviderService(), createGroupUpdatedNotification(getInput()));
+
+                return result;
+            }
+        }
+
+        return new OFRpcTaskImpl(taskContext, cookie, input);
     }
 
     /**
@@ -544,30 +563,35 @@ public abstract class OFRpcTaskFactory {
     public static OFRpcTask<UpdateMeterInput, RpcResult<UpdateMeterOutput>> createUpdateMeterTask(
             OFRpcTaskContext taskContext, UpdateMeterInput input,
             SwitchConnectionDistinguisher cookie) {
-        OFRpcTask<UpdateMeterInput, RpcResult<UpdateMeterOutput>> task =
-                new OFRpcTask<UpdateMeterInput, RpcResult<UpdateMeterOutput>>(taskContext, cookie, input) {
+        class OFRpcTaskImpl extends OFRpcTask<UpdateMeterInput, RpcResult<UpdateMeterOutput>> {
 
-                    @Override
-                    public ListenableFuture<RpcResult<UpdateMeterOutput>> call() {
-                        ListenableFuture<RpcResult<UpdateMeterOutput>> result = null;
-
-                        // Convert the UpdateMeterInput to MeterModInput
-                        MeterModInputBuilder ofMeterModInput = MeterConvertor.toMeterModInput(
-                                getInput().getUpdatedMeter(), getVersion());
-                        final Long xId = getSession().getNextXid();
-                        ofMeterModInput.setXid(xId);
-
-                        Future<RpcResult<UpdateMeterOutput>> resultFromOFLib =
-                                getMessageService().meterMod(ofMeterModInput.build(), getCookie());
-                        result = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
-
-                        result = OFRpcTaskUtil.chainFutureBarrier(this, result);
-                        OFRpcTaskUtil.hookFutureNotification(this, result,
-                                getRpcNotificationProviderService(), createMeterUpdatedNotification(getInput()));
-                        return result;
-                    }
-                };
-        return task;
+            public OFRpcTaskImpl(OFRpcTaskContext taskContext, SwitchConnectionDistinguisher cookie,
+                    UpdateMeterInput input) {
+                super(taskContext, cookie, input);
+            }
+
+            @Override
+            public ListenableFuture<RpcResult<UpdateMeterOutput>> call() {
+                ListenableFuture<RpcResult<UpdateMeterOutput>> result = null;
+
+                // Convert the UpdateMeterInput to MeterModInput
+                MeterModInputBuilder ofMeterModInput = MeterConvertor.toMeterModInput(
+                        getInput().getUpdatedMeter(), getVersion());
+                final Long xId = getSession().getNextXid();
+                ofMeterModInput.setXid(xId);
+
+                Future<RpcResult<UpdateMeterOutput>> resultFromOFLib =
+                        getMessageService().meterMod(ofMeterModInput.build(), getCookie());
+                result = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
+
+                result = OFRpcTaskUtil.chainFutureBarrier(this, result);
+                OFRpcTaskUtil.hookFutureNotification(this, result,
+                        getRpcNotificationProviderService(), createMeterUpdatedNotification(getInput()));
+                return result;
+            }
+        }
+
+        return new OFRpcTaskImpl(taskContext, cookie, input);
     }
 
     /**
@@ -597,32 +621,36 @@ public abstract class OFRpcTaskFactory {
     public static OFRpcTask<RemoveFlowInput, RpcResult<UpdateFlowOutput>> createRemoveFlowTask(
             OFRpcTaskContext taskContext, RemoveFlowInput input,
             SwitchConnectionDistinguisher cookie) {
-        OFRpcTask<RemoveFlowInput, RpcResult<UpdateFlowOutput>> task =
-                new OFRpcTask<RemoveFlowInput, RpcResult<UpdateFlowOutput>>(taskContext, cookie, input) {
+        class OFRpcTaskImpl extends OFRpcTask<RemoveFlowInput, RpcResult<UpdateFlowOutput>> {
 
-                    @Override
-                    public ListenableFuture<RpcResult<UpdateFlowOutput>> call() {
-                        ListenableFuture<RpcResult<UpdateFlowOutput>> result = SettableFuture.create();
+            public OFRpcTaskImpl(OFRpcTaskContext taskContext, SwitchConnectionDistinguisher cookie,
+                    RemoveFlowInput input) {
+                super(taskContext, cookie, input);
+            }
 
-                        // Convert the AddFlowInput to FlowModInput
-                        FlowModInputBuilder ofFlowModInput = FlowConvertor.toFlowModInput(getInput(),
-                                getVersion(), getSession().getFeatures().getDatapathId());
-                        final Long xId = getSession().getNextXid();
-                        ofFlowModInput.setXid(xId);
+            @Override
+            public ListenableFuture<RpcResult<UpdateFlowOutput>> call() {
+                ListenableFuture<RpcResult<UpdateFlowOutput>> result = SettableFuture.create();
 
-                        Future<RpcResult<UpdateFlowOutput>> resultFromOFLib =
-                                getMessageService().flowMod(ofFlowModInput.build(), getCookie());
-                        result = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
+                // Convert the AddFlowInput to FlowModInput
+                FlowModInputBuilder ofFlowModInput = FlowConvertor.toFlowModInput(getInput(),
+                        getVersion(), getSession().getFeatures().getDatapathId());
+                final Long xId = getSession().getNextXid();
+                ofFlowModInput.setXid(xId);
 
-                        result = OFRpcTaskUtil.chainFutureBarrier(this, result);
-                        OFRpcTaskUtil.hookFutureNotification(this, result,
-                                getRpcNotificationProviderService(), createFlowRemovedNotification(getInput()));
+                Future<RpcResult<UpdateFlowOutput>> resultFromOFLib =
+                        getMessageService().flowMod(ofFlowModInput.build(), getCookie());
+                result = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
 
-                        return result;
-                    }
-                };
+                result = OFRpcTaskUtil.chainFutureBarrier(this, result);
+                OFRpcTaskUtil.hookFutureNotification(this, result,
+                        getRpcNotificationProviderService(), createFlowRemovedNotification(getInput()));
 
-        return task;
+                return result;
+            }
+        }
+
+        return new OFRpcTaskImpl(taskContext, cookie, input);
     }
 
     /**
@@ -652,32 +680,36 @@ public abstract class OFRpcTaskFactory {
     public static OFRpcTask<RemoveGroupInput, RpcResult<UpdateGroupOutput>> createRemoveGroupTask(
             final OFRpcTaskContext taskContext, RemoveGroupInput input,
             final SwitchConnectionDistinguisher cookie) {
-        OFRpcTask<RemoveGroupInput, RpcResult<UpdateGroupOutput>> task =
-                new OFRpcTask<RemoveGroupInput, RpcResult<UpdateGroupOutput>>(taskContext, cookie, input) {
+        class OFRpcTaskImpl extends OFRpcTask<RemoveGroupInput, RpcResult<UpdateGroupOutput>> {
 
-                    @Override
-                    public ListenableFuture<RpcResult<UpdateGroupOutput>> call() {
-                        ListenableFuture<RpcResult<UpdateGroupOutput>> result = SettableFuture.create();
+            public OFRpcTaskImpl(OFRpcTaskContext taskContext, SwitchConnectionDistinguisher cookie,
+                    RemoveGroupInput input) {
+                super(taskContext, cookie, input);
+            }
 
-                        // Convert the AddGroupInput to GroupModInput
-                        GroupModInputBuilder ofGroupModInput = GroupConvertor.toGroupModInput(getInput(),
-                                getVersion(), getSession().getFeatures().getDatapathId());
-                        final Long xId = getSession().getNextXid();
-                        ofGroupModInput.setXid(xId);
+            @Override
+            public ListenableFuture<RpcResult<UpdateGroupOutput>> call() {
+                ListenableFuture<RpcResult<UpdateGroupOutput>> result = SettableFuture.create();
 
-                        Future<RpcResult<UpdateGroupOutput>> resultFromOFLib = getMessageService()
-                                .groupMod(ofGroupModInput.build(), getCookie());
-                        result = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
+                // Convert the AddGroupInput to GroupModInput
+                GroupModInputBuilder ofGroupModInput = GroupConvertor.toGroupModInput(getInput(),
+                        getVersion(), getSession().getFeatures().getDatapathId());
+                final Long xId = getSession().getNextXid();
+                ofGroupModInput.setXid(xId);
 
-                        result = OFRpcTaskUtil.chainFutureBarrier(this, result);
-                        OFRpcTaskUtil.hookFutureNotification(this, result,
-                                getRpcNotificationProviderService(), createGroupRemovedNotification(getInput()));
+                Future<RpcResult<UpdateGroupOutput>> resultFromOFLib = getMessageService()
+                        .groupMod(ofGroupModInput.build(), getCookie());
+                result = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
 
-                        return result;
-                    }
-                };
+                result = OFRpcTaskUtil.chainFutureBarrier(this, result);
+                OFRpcTaskUtil.hookFutureNotification(this, result,
+                        getRpcNotificationProviderService(), createGroupRemovedNotification(getInput()));
+
+                return result;
+            }
+        }
 
-        return task;
+        return new OFRpcTaskImpl(taskContext, cookie, input);
     }
 
     /**
@@ -706,31 +738,36 @@ public abstract class OFRpcTaskFactory {
     public static OFRpcTask<RemoveMeterInput, RpcResult<UpdateMeterOutput>> createRemoveMeterTask(
             OFRpcTaskContext taskContext, RemoveMeterInput input,
             SwitchConnectionDistinguisher cookie) {
-        OFRpcTask<RemoveMeterInput, RpcResult<UpdateMeterOutput>> task =
-                new OFRpcTask<RemoveMeterInput, RpcResult<UpdateMeterOutput>>(taskContext, cookie, input) {
 
-                    @Override
-                    public ListenableFuture<RpcResult<UpdateMeterOutput>> call() {
-                        ListenableFuture<RpcResult<UpdateMeterOutput>> result = SettableFuture.create();
+        class OFRpcTaskImpl extends OFRpcTask<RemoveMeterInput, RpcResult<UpdateMeterOutput>> {
 
-                        // Convert the AddGroupInput to GroupModInput
-                        MeterModInputBuilder ofMeterModInput = MeterConvertor.toMeterModInput(getInput(), getVersion());
-                        final Long xId = getSession().getNextXid();
-                        ofMeterModInput.setXid(xId);
+            public OFRpcTaskImpl(OFRpcTaskContext taskContext, SwitchConnectionDistinguisher cookie,
+                    RemoveMeterInput input) {
+                super(taskContext, cookie, input);
+            }
 
-                        Future<RpcResult<UpdateMeterOutput>> resultFromOFLib = getMessageService()
-                                .meterMod(ofMeterModInput.build(), getCookie());
-                        result = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
+            @Override
+            public ListenableFuture<RpcResult<UpdateMeterOutput>> call() {
+                ListenableFuture<RpcResult<UpdateMeterOutput>> result = SettableFuture.create();
 
-                        result = OFRpcTaskUtil.chainFutureBarrier(this, result);
-                        OFRpcTaskUtil.hookFutureNotification(this, result,
-                                getRpcNotificationProviderService(), createMeterRemovedNotification(getInput()));
+                // Convert the AddGroupInput to GroupModInput
+                MeterModInputBuilder ofMeterModInput = MeterConvertor.toMeterModInput(getInput(), getVersion());
+                final Long xId = getSession().getNextXid();
+                ofMeterModInput.setXid(xId);
 
-                        return result;
-                    }
-                };
+                Future<RpcResult<UpdateMeterOutput>> resultFromOFLib = getMessageService()
+                        .meterMod(ofMeterModInput.build(), getCookie());
+                result = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
+
+                result = OFRpcTaskUtil.chainFutureBarrier(this, result);
+                OFRpcTaskUtil.hookFutureNotification(this, result,
+                        getRpcNotificationProviderService(), createMeterRemovedNotification(getInput()));
 
-        return task;
+                return result;
+            }
+        }
+
+        return new OFRpcTaskImpl(taskContext, cookie, input);
 
     }
 
@@ -760,58 +797,64 @@ public abstract class OFRpcTaskFactory {
     public static OFRpcTask<GetAllGroupStatisticsInput, RpcResult<GetAllGroupStatisticsOutput>> createGetAllGroupStatisticsTask(
             final OFRpcTaskContext taskContext, GetAllGroupStatisticsInput input,
             SwitchConnectionDistinguisher cookie) {
-        OFRpcTask<GetAllGroupStatisticsInput, RpcResult<GetAllGroupStatisticsOutput>> task =
-                new OFRpcTask<GetAllGroupStatisticsInput, RpcResult<GetAllGroupStatisticsOutput>>(taskContext, cookie, input) {
 
-                    @Override
-                    public ListenableFuture<RpcResult<GetAllGroupStatisticsOutput>> call() {
-                        final SettableFuture<RpcResult<GetAllGroupStatisticsOutput>> result = SettableFuture.create();
+        class OFRpcTaskImpl extends OFRpcTask<GetAllGroupStatisticsInput, RpcResult<GetAllGroupStatisticsOutput>> {
+
+            public OFRpcTaskImpl(OFRpcTaskContext taskContext, SwitchConnectionDistinguisher cookie,
+                    GetAllGroupStatisticsInput input) {
+                super(taskContext, cookie, input);
+            }
 
-                        if (taskContext.getSession().getPrimaryConductor().getVersion() == OFConstants.OFP_VERSION_1_0) {
-                            RpcResult<GetAllGroupStatisticsOutput> rpcResult = RpcResultBuilder.success(
-                                    new GetAllGroupStatisticsOutputBuilder().build()).build();
+            @Override
+            public ListenableFuture<RpcResult<GetAllGroupStatisticsOutput>> call() {
+                final SettableFuture<RpcResult<GetAllGroupStatisticsOutput>> result = SettableFuture.create();
 
-                            return Futures.immediateFuture(rpcResult);
-                        } else {
+                if (taskContext.getSession().getPrimaryConductor().getVersion() == OFConstants.OFP_VERSION_1_0) {
+                    RpcResult<GetAllGroupStatisticsOutput> rpcResult = RpcResultBuilder.success(
+                            new GetAllGroupStatisticsOutputBuilder().build()).build();
 
-                            // Generate xid to associate it with the request
-                            final Long xid = taskContext.getSession().getNextXid();
+                    return Futures.immediateFuture(rpcResult);
+                } else {
 
-                            // Create multipart request body for fetch all the group stats
-                            MultipartRequestGroupCaseBuilder caseBuilder = new MultipartRequestGroupCaseBuilder();
-                            MultipartRequestGroupBuilder mprGroupBuild = new MultipartRequestGroupBuilder();
-                            mprGroupBuild.setGroupId(new GroupId(BinContent.intToUnsignedLong(
-                                    org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731
-                                            .Group.OFPGALL.getIntValue())));
-                            caseBuilder.setMultipartRequestGroup(mprGroupBuild.build());
+                    // Generate xid to associate it with the request
+                    final Long xid = taskContext.getSession().getNextXid();
 
-                            // Create multipart request header
-                            MultipartRequestInputBuilder mprInput = createMultipartHeader(MultipartType.OFPMPGROUP,
-                                    taskContext, xid);
+                    // Create multipart request body for fetch all the group stats
+                    MultipartRequestGroupCaseBuilder caseBuilder = new MultipartRequestGroupCaseBuilder();
+                    MultipartRequestGroupBuilder mprGroupBuild = new MultipartRequestGroupBuilder();
+                    mprGroupBuild.setGroupId(new GroupId(BinContent.intToUnsignedLong(
+                            org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731
+                                    .Group.OFPGALL.getIntValue())));
+                    caseBuilder.setMultipartRequestGroup(mprGroupBuild.build());
 
-                            // Set request body to main multipart request
-                            mprInput.setMultipartRequestBody(caseBuilder.build());
+                    // Create multipart request header
+                    MultipartRequestInputBuilder mprInput = createMultipartHeader(MultipartType.OFPMPGROUP,
+                            taskContext, xid);
 
-                            // Send the request, no cookies associated, use any connection
+                    // Set request body to main multipart request
+                    mprInput.setMultipartRequestBody(caseBuilder.build());
 
-                            Future<RpcResult<Void>> resultFromOFLib = getMessageService()
-                                    .multipartRequest(mprInput.build(), getCookie());
-                            ListenableFuture<RpcResult<Void>> resultLib = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
+                    // Send the request, no cookies associated, use any connection
 
-                            Futures.addCallback(resultLib, new ResultCallback<GetAllGroupStatisticsOutput>(result) {
-                                @Override
-                                public GetAllGroupStatisticsOutput createResult() {
-                                    GetAllGroupStatisticsOutputBuilder groupStatBuilder = new GetAllGroupStatisticsOutputBuilder()
-                                            .setTransactionId(new TransactionId(BigInteger.valueOf(xid)));
-                                    return groupStatBuilder.build();
-                                }
-                            });
+                    Future<RpcResult<Void>> resultFromOFLib = getMessageService()
+                            .multipartRequest(mprInput.build(), getCookie());
+                    ListenableFuture<RpcResult<Void>> resultLib = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
 
-                            return result;
+                    Futures.addCallback(resultLib, new ResultCallback<GetAllGroupStatisticsOutput>(result) {
+                        @Override
+                        public GetAllGroupStatisticsOutput createResult() {
+                            GetAllGroupStatisticsOutputBuilder groupStatBuilder = new GetAllGroupStatisticsOutputBuilder()
+                                    .setTransactionId(new TransactionId(BigInteger.valueOf(xid)));
+                            return groupStatBuilder.build();
                         }
-                    }
-                };
-        return task;
+                    });
+
+                    return result;
+                }
+            }
+        }
+
+        return new OFRpcTaskImpl(taskContext, cookie, input);
     }
 
     /**
@@ -823,43 +866,48 @@ public abstract class OFRpcTaskFactory {
     public static OFRpcTask<GetGroupDescriptionInput, RpcResult<GetGroupDescriptionOutput>> createGetGroupDescriptionTask(
             final OFRpcTaskContext taskContext, GetGroupDescriptionInput input,
             SwitchConnectionDistinguisher cookie) {
-        OFRpcTask<GetGroupDescriptionInput, RpcResult<GetGroupDescriptionOutput>> task =
-                new OFRpcTask<GetGroupDescriptionInput, RpcResult<GetGroupDescriptionOutput>>(taskContext, cookie, input) {
+        class OFRpcTaskImpl extends OFRpcTask<GetGroupDescriptionInput, RpcResult<GetGroupDescriptionOutput>> {
 
-                    @Override
-                    public ListenableFuture<RpcResult<GetGroupDescriptionOutput>> call()
-                            throws Exception {
-                        final SettableFuture<RpcResult<GetGroupDescriptionOutput>> result = SettableFuture.create();
-
-                        if (taskContext.getSession().getPrimaryConductor().getVersion() == OFConstants.OFP_VERSION_1_0) {
-                            RpcResult<GetGroupDescriptionOutput> rpcResult = RpcResultBuilder.success(
-                                    new GetGroupDescriptionOutputBuilder().build()).build();
-                            return Futures.immediateFuture(rpcResult);
-                        } else {
-                            final Long xid = taskContext.getSession().getNextXid();
-
-                            MultipartRequestGroupDescCaseBuilder mprGroupDescCaseBuild =
-                                    new MultipartRequestGroupDescCaseBuilder();
-                            MultipartRequestInputBuilder mprInput =
-                                    createMultipartHeader(MultipartType.OFPMPGROUPDESC, taskContext, xid);
-                            mprInput.setMultipartRequestBody(mprGroupDescCaseBuild.build());
-                            Future<RpcResult<Void>> resultFromOFLib = getMessageService()
-                                    .multipartRequest(mprInput.build(), getCookie());
-                            ListenableFuture<RpcResult<Void>> resultLib = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
-
-                            Futures.addCallback(resultLib, new ResultCallback<GetGroupDescriptionOutput>(result) {
-                                @Override
-                                public GetGroupDescriptionOutput createResult() {
-                                    GetGroupDescriptionOutputBuilder groupStatBuilder = new GetGroupDescriptionOutputBuilder()
-                                            .setTransactionId(new TransactionId(BigInteger.valueOf(xid)));
-                                    return groupStatBuilder.build();
-                                }
-                            });
-                            return result;
+            public OFRpcTaskImpl(OFRpcTaskContext taskContext, SwitchConnectionDistinguisher cookie,
+                    GetGroupDescriptionInput input) {
+                super(taskContext, cookie, input);
+            }
+
+            @Override
+            public ListenableFuture<RpcResult<GetGroupDescriptionOutput>> call()
+                    throws Exception {
+                final SettableFuture<RpcResult<GetGroupDescriptionOutput>> result = SettableFuture.create();
+
+                if (taskContext.getSession().getPrimaryConductor().getVersion() == OFConstants.OFP_VERSION_1_0) {
+                    RpcResult<GetGroupDescriptionOutput> rpcResult = RpcResultBuilder.success(
+                            new GetGroupDescriptionOutputBuilder().build()).build();
+                    return Futures.immediateFuture(rpcResult);
+                } else {
+                    final Long xid = taskContext.getSession().getNextXid();
+
+                    MultipartRequestGroupDescCaseBuilder mprGroupDescCaseBuild =
+                            new MultipartRequestGroupDescCaseBuilder();
+                    MultipartRequestInputBuilder mprInput =
+                            createMultipartHeader(MultipartType.OFPMPGROUPDESC, taskContext, xid);
+                    mprInput.setMultipartRequestBody(mprGroupDescCaseBuild.build());
+                    Future<RpcResult<Void>> resultFromOFLib = getMessageService()
+                            .multipartRequest(mprInput.build(), getCookie());
+                    ListenableFuture<RpcResult<Void>> resultLib = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
+
+                    Futures.addCallback(resultLib, new ResultCallback<GetGroupDescriptionOutput>(result) {
+                        @Override
+                        public GetGroupDescriptionOutput createResult() {
+                            GetGroupDescriptionOutputBuilder groupStatBuilder = new GetGroupDescriptionOutputBuilder()
+                                    .setTransactionId(new TransactionId(BigInteger.valueOf(xid)));
+                            return groupStatBuilder.build();
                         }
-                    }
-                };
-        return task;
+                    });
+                    return result;
+                }
+            }
+        }
+
+        return new OFRpcTaskImpl(taskContext, cookie, input);
     }
 
     /**
@@ -871,43 +919,49 @@ public abstract class OFRpcTaskFactory {
     public static OFRpcTask<GetGroupFeaturesInput, RpcResult<GetGroupFeaturesOutput>> createGetGroupFeaturesTask(
             final OFRpcTaskContext taskContext, GetGroupFeaturesInput input,
             SwitchConnectionDistinguisher cookie) {
-        OFRpcTask<GetGroupFeaturesInput, RpcResult<GetGroupFeaturesOutput>> task =
-                new OFRpcTask<GetGroupFeaturesInput, RpcResult<GetGroupFeaturesOutput>>(taskContext, cookie, input) {
+        class OFRpcTaskImpl extends OFRpcTask<GetGroupFeaturesInput, RpcResult<GetGroupFeaturesOutput>> {
 
-                    @Override
-                    public ListenableFuture<RpcResult<GetGroupFeaturesOutput>> call()
-                            throws Exception {
-                        final SettableFuture<RpcResult<GetGroupFeaturesOutput>> result = SettableFuture.create();
-
-                        if (taskContext.getSession().getPrimaryConductor().getVersion() == OFConstants.OFP_VERSION_1_0) {
-                            RpcResult<GetGroupFeaturesOutput> rpcResult = RpcResultBuilder.success(
-                                    new GetGroupFeaturesOutputBuilder().build()).build();
-                            return Futures.immediateFuture(rpcResult);
-                        } else {
-                            final Long xid = taskContext.getSession().getNextXid();
-
-                            MultipartRequestGroupFeaturesCaseBuilder mprGroupFeaturesBuild =
-                                    new MultipartRequestGroupFeaturesCaseBuilder();
-                            MultipartRequestInputBuilder mprInput =
-                                    createMultipartHeader(MultipartType.OFPMPGROUPFEATURES, taskContext, xid);
-                            mprInput.setMultipartRequestBody(mprGroupFeaturesBuild.build());
-                            Future<RpcResult<Void>> resultFromOFLib = getMessageService()
-                                    .multipartRequest(mprInput.build(), getCookie());
-                            ListenableFuture<RpcResult<Void>> resultLib = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
-
-                            Futures.addCallback(resultLib, new ResultCallback<GetGroupFeaturesOutput>(result) {
-                                @Override
-                                public GetGroupFeaturesOutput createResult() {
-                                    GetGroupFeaturesOutputBuilder groupFeatureBuilder = new GetGroupFeaturesOutputBuilder()
-                                            .setTransactionId(new TransactionId(BigInteger.valueOf(xid)));
-                                    return groupFeatureBuilder.build();
-                                }
-                            });
-                            return result;
+            public OFRpcTaskImpl(OFRpcTaskContext taskContext, SwitchConnectionDistinguisher cookie,
+                    GetGroupFeaturesInput input) {
+                super(taskContext, cookie, input);
+                // TODO Auto-generated constructor stub
+            }
+
+            @Override
+            public ListenableFuture<RpcResult<GetGroupFeaturesOutput>> call()
+                    throws Exception {
+                final SettableFuture<RpcResult<GetGroupFeaturesOutput>> result = SettableFuture.create();
+
+                if (taskContext.getSession().getPrimaryConductor().getVersion() == OFConstants.OFP_VERSION_1_0) {
+                    RpcResult<GetGroupFeaturesOutput> rpcResult = RpcResultBuilder.success(
+                            new GetGroupFeaturesOutputBuilder().build()).build();
+                    return Futures.immediateFuture(rpcResult);
+                } else {
+                    final Long xid = taskContext.getSession().getNextXid();
+
+                    MultipartRequestGroupFeaturesCaseBuilder mprGroupFeaturesBuild =
+                            new MultipartRequestGroupFeaturesCaseBuilder();
+                    MultipartRequestInputBuilder mprInput =
+                            createMultipartHeader(MultipartType.OFPMPGROUPFEATURES, taskContext, xid);
+                    mprInput.setMultipartRequestBody(mprGroupFeaturesBuild.build());
+                    Future<RpcResult<Void>> resultFromOFLib = getMessageService()
+                            .multipartRequest(mprInput.build(), getCookie());
+                    ListenableFuture<RpcResult<Void>> resultLib = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
+
+                    Futures.addCallback(resultLib, new ResultCallback<GetGroupFeaturesOutput>(result) {
+                        @Override
+                        public GetGroupFeaturesOutput createResult() {
+                            GetGroupFeaturesOutputBuilder groupFeatureBuilder = new GetGroupFeaturesOutputBuilder()
+                                    .setTransactionId(new TransactionId(BigInteger.valueOf(xid)));
+                            return groupFeatureBuilder.build();
                         }
-                    }
-                };
-        return task;
+                    });
+                    return result;
+                }
+            }
+        }
+
+        return new OFRpcTaskImpl(taskContext, cookie, input);
     }
 
     /**
@@ -919,47 +973,53 @@ public abstract class OFRpcTaskFactory {
     public static OFRpcTask<GetGroupStatisticsInput, RpcResult<GetGroupStatisticsOutput>> createGetGroupStatisticsTask(
             final OFRpcTaskContext taskContext, final GetGroupStatisticsInput input,
             SwitchConnectionDistinguisher cookie) {
-        OFRpcTask<GetGroupStatisticsInput, RpcResult<GetGroupStatisticsOutput>> task =
-                new OFRpcTask<GetGroupStatisticsInput, RpcResult<GetGroupStatisticsOutput>>(taskContext, cookie, input) {
 
-                    @Override
-                    public ListenableFuture<RpcResult<GetGroupStatisticsOutput>> call()
-                            throws Exception {
-                        final SettableFuture<RpcResult<GetGroupStatisticsOutput>> result = SettableFuture.create();
-
-                        if (taskContext.getSession().getPrimaryConductor().getVersion() == OFConstants.OFP_VERSION_1_0) {
-                            RpcResult<GetGroupStatisticsOutput> rpcResult = RpcResultBuilder.success(
-                                    new GetGroupStatisticsOutputBuilder().build()).build();
-                            return Futures.immediateFuture(rpcResult);
-                        } else {
-                            final Long xid = taskContext.getSession().getNextXid();
-
-                            MultipartRequestGroupCaseBuilder caseBuilder = new MultipartRequestGroupCaseBuilder();
-                            MultipartRequestGroupBuilder mprGroupBuild = new MultipartRequestGroupBuilder();
-                            mprGroupBuild.setGroupId(new GroupId(input.getGroupId().getValue()));
-                            caseBuilder.setMultipartRequestGroup(mprGroupBuild.build());
-
-                            MultipartRequestInputBuilder mprInput =
-                                    createMultipartHeader(MultipartType.OFPMPGROUP, taskContext, xid);
-                            mprInput.setMultipartRequestBody(caseBuilder.build());
-                            Future<RpcResult<Void>> resultFromOFLib = getMessageService()
-                                    .multipartRequest(mprInput.build(), getCookie());
-                            ListenableFuture<RpcResult<Void>> resultLib = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
-
-                            Futures.addCallback(resultLib, new ResultCallback<GetGroupStatisticsOutput>(result) {
-                                @Override
-                                public GetGroupStatisticsOutput createResult() {
-                                    GetGroupStatisticsOutputBuilder groupStatisticsBuilder =
-                                            new GetGroupStatisticsOutputBuilder()
-                                                    .setTransactionId(new TransactionId(BigInteger.valueOf(xid)));
-                                    return groupStatisticsBuilder.build();
-                                }
-                            });
-                            return result;
+        class OFRpcTaskImpl extends OFRpcTask<GetGroupStatisticsInput, RpcResult<GetGroupStatisticsOutput>> {
+
+            public OFRpcTaskImpl(OFRpcTaskContext taskContext, SwitchConnectionDistinguisher cookie,
+                    GetGroupStatisticsInput input) {
+                super(taskContext, cookie, input);
+            }
+
+            @Override
+            public ListenableFuture<RpcResult<GetGroupStatisticsOutput>> call()
+                    throws Exception {
+                final SettableFuture<RpcResult<GetGroupStatisticsOutput>> result = SettableFuture.create();
+
+                if (taskContext.getSession().getPrimaryConductor().getVersion() == OFConstants.OFP_VERSION_1_0) {
+                    RpcResult<GetGroupStatisticsOutput> rpcResult = RpcResultBuilder.success(
+                            new GetGroupStatisticsOutputBuilder().build()).build();
+                    return Futures.immediateFuture(rpcResult);
+                } else {
+                    final Long xid = taskContext.getSession().getNextXid();
+
+                    MultipartRequestGroupCaseBuilder caseBuilder = new MultipartRequestGroupCaseBuilder();
+                    MultipartRequestGroupBuilder mprGroupBuild = new MultipartRequestGroupBuilder();
+                    mprGroupBuild.setGroupId(new GroupId(input.getGroupId().getValue()));
+                    caseBuilder.setMultipartRequestGroup(mprGroupBuild.build());
+
+                    MultipartRequestInputBuilder mprInput =
+                            createMultipartHeader(MultipartType.OFPMPGROUP, taskContext, xid);
+                    mprInput.setMultipartRequestBody(caseBuilder.build());
+                    Future<RpcResult<Void>> resultFromOFLib = getMessageService()
+                            .multipartRequest(mprInput.build(), getCookie());
+                    ListenableFuture<RpcResult<Void>> resultLib = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
+
+                    Futures.addCallback(resultLib, new ResultCallback<GetGroupStatisticsOutput>(result) {
+                        @Override
+                        public GetGroupStatisticsOutput createResult() {
+                            GetGroupStatisticsOutputBuilder groupStatisticsBuilder =
+                                    new GetGroupStatisticsOutputBuilder()
+                                            .setTransactionId(new TransactionId(BigInteger.valueOf(xid)));
+                            return groupStatisticsBuilder.build();
                         }
-                    }
-                };
-        return task;
+                    });
+                    return result;
+                }
+            }
+        }
+
+        return new OFRpcTaskImpl(taskContext, cookie, input);
     }
 
     /**
@@ -971,51 +1031,56 @@ public abstract class OFRpcTaskFactory {
     public static OFRpcTask<GetAllMeterConfigStatisticsInput, RpcResult<GetAllMeterConfigStatisticsOutput>> createGetAllMeterConfigStatisticsTask(
             final OFRpcTaskContext taskContext, final GetAllMeterConfigStatisticsInput input,
             SwitchConnectionDistinguisher cookie) {
-        OFRpcTask<GetAllMeterConfigStatisticsInput, RpcResult<GetAllMeterConfigStatisticsOutput>> task =
-                new OFRpcTask<GetAllMeterConfigStatisticsInput, RpcResult<GetAllMeterConfigStatisticsOutput>>(taskContext, cookie, input) {
+        class OFRpcTaskImpl extends OFRpcTask<GetAllMeterConfigStatisticsInput, RpcResult<GetAllMeterConfigStatisticsOutput>> {
 
-                    @Override
-                    public ListenableFuture<RpcResult<GetAllMeterConfigStatisticsOutput>> call()
-                            throws Exception {
-                        final SettableFuture<RpcResult<GetAllMeterConfigStatisticsOutput>> result = SettableFuture.create();
-
-                        if (taskContext.getSession().getPrimaryConductor().getVersion() == OFConstants.OFP_VERSION_1_0) {
-                            RpcResult<GetAllMeterConfigStatisticsOutput> rpcResult = RpcResultBuilder.success(
-                                    new GetAllMeterConfigStatisticsOutputBuilder().build()).build();
-                            return Futures.immediateFuture(rpcResult);
-                        } else {
-                            final Long xid = taskContext.getSession().getNextXid();
-
-                            MultipartRequestMeterConfigCaseBuilder caseBuilder =
-                                    new MultipartRequestMeterConfigCaseBuilder();
-                            MultipartRequestMeterConfigBuilder mprMeterConfigBuild =
-                                    new MultipartRequestMeterConfigBuilder();
-                            mprMeterConfigBuild.setMeterId(new MeterId(BinContent.intToUnsignedLong(
-                                    org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common
-                                            .types.rev130731.Meter.OFPMALL.getIntValue())));
-                            caseBuilder.setMultipartRequestMeterConfig(mprMeterConfigBuild.build());
-
-                            MultipartRequestInputBuilder mprInput =
-                                    createMultipartHeader(MultipartType.OFPMPMETERCONFIG, taskContext, xid);
-                            mprInput.setMultipartRequestBody(caseBuilder.build());
-                            Future<RpcResult<Void>> resultFromOFLib = getMessageService()
-                                    .multipartRequest(mprInput.build(), getCookie());
-                            ListenableFuture<RpcResult<Void>> resultLib = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
-
-                            Futures.addCallback(resultLib, new ResultCallback<GetAllMeterConfigStatisticsOutput>(result) {
-                                @Override
-                                public GetAllMeterConfigStatisticsOutput createResult() {
-                                    GetAllMeterConfigStatisticsOutputBuilder allMeterConfStatBuilder =
-                                            new GetAllMeterConfigStatisticsOutputBuilder()
-                                                    .setTransactionId(new TransactionId(BigInteger.valueOf(xid)));
-                                    return allMeterConfStatBuilder.build();
-                                }
-                            });
-                            return result;
+            public OFRpcTaskImpl(OFRpcTaskContext taskContext, SwitchConnectionDistinguisher cookie,
+                    GetAllMeterConfigStatisticsInput input) {
+                super(taskContext, cookie, input);
+            }
+
+            @Override
+            public ListenableFuture<RpcResult<GetAllMeterConfigStatisticsOutput>> call()
+                    throws Exception {
+                final SettableFuture<RpcResult<GetAllMeterConfigStatisticsOutput>> result = SettableFuture.create();
+
+                if (taskContext.getSession().getPrimaryConductor().getVersion() == OFConstants.OFP_VERSION_1_0) {
+                    RpcResult<GetAllMeterConfigStatisticsOutput> rpcResult = RpcResultBuilder.success(
+                            new GetAllMeterConfigStatisticsOutputBuilder().build()).build();
+                    return Futures.immediateFuture(rpcResult);
+                } else {
+                    final Long xid = taskContext.getSession().getNextXid();
+
+                    MultipartRequestMeterConfigCaseBuilder caseBuilder =
+                            new MultipartRequestMeterConfigCaseBuilder();
+                    MultipartRequestMeterConfigBuilder mprMeterConfigBuild =
+                            new MultipartRequestMeterConfigBuilder();
+                    mprMeterConfigBuild.setMeterId(new MeterId(BinContent.intToUnsignedLong(
+                            org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common
+                                    .types.rev130731.Meter.OFPMALL.getIntValue())));
+                    caseBuilder.setMultipartRequestMeterConfig(mprMeterConfigBuild.build());
+
+                    MultipartRequestInputBuilder mprInput =
+                            createMultipartHeader(MultipartType.OFPMPMETERCONFIG, taskContext, xid);
+                    mprInput.setMultipartRequestBody(caseBuilder.build());
+                    Future<RpcResult<Void>> resultFromOFLib = getMessageService()
+                            .multipartRequest(mprInput.build(), getCookie());
+                    ListenableFuture<RpcResult<Void>> resultLib = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
+
+                    Futures.addCallback(resultLib, new ResultCallback<GetAllMeterConfigStatisticsOutput>(result) {
+                        @Override
+                        public GetAllMeterConfigStatisticsOutput createResult() {
+                            GetAllMeterConfigStatisticsOutputBuilder allMeterConfStatBuilder =
+                                    new GetAllMeterConfigStatisticsOutputBuilder()
+                                            .setTransactionId(new TransactionId(BigInteger.valueOf(xid)));
+                            return allMeterConfStatBuilder.build();
                         }
-                    }
-                };
-        return task;
+                    });
+                    return result;
+                }
+            }
+        }
+
+        return new OFRpcTaskImpl(taskContext, cookie, input);
     }
 
     /**
@@ -1027,51 +1092,57 @@ public abstract class OFRpcTaskFactory {
     public static OFRpcTask<GetAllMeterStatisticsInput, RpcResult<GetAllMeterStatisticsOutput>> createGetAllMeterStatisticsTask(
             final OFRpcTaskContext taskContext, final GetAllMeterStatisticsInput input,
             SwitchConnectionDistinguisher cookie) {
-        OFRpcTask<GetAllMeterStatisticsInput, RpcResult<GetAllMeterStatisticsOutput>> task =
-                new OFRpcTask<GetAllMeterStatisticsInput, RpcResult<GetAllMeterStatisticsOutput>>(taskContext, cookie, input) {
+        class OFRpcTaskImpl extends OFRpcTask<GetAllMeterStatisticsInput, RpcResult<GetAllMeterStatisticsOutput>> {
 
-                    @Override
-                    public ListenableFuture<RpcResult<GetAllMeterStatisticsOutput>> call()
-                            throws Exception {
-                        final SettableFuture<RpcResult<GetAllMeterStatisticsOutput>> result = SettableFuture.create();
-
-                        if (taskContext.getSession().getPrimaryConductor().getVersion() == OFConstants.OFP_VERSION_1_0) {
-                            RpcResult<GetAllMeterStatisticsOutput> rpcResult = RpcResultBuilder.success(
-                                    new GetAllMeterStatisticsOutputBuilder().build()).build();
-                            return Futures.immediateFuture(rpcResult);
-                        } else {
-                            final Long xid = taskContext.getSession().getNextXid();
-
-                            MultipartRequestMeterCaseBuilder caseBuilder =
-                                    new MultipartRequestMeterCaseBuilder();
-                            MultipartRequestMeterBuilder mprMeterBuild =
-                                    new MultipartRequestMeterBuilder();
-                            mprMeterBuild.setMeterId(new MeterId(BinContent.intToUnsignedLong(
-                                    org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common
-                                            .types.rev130731.Meter.OFPMALL.getIntValue())));
-                            caseBuilder.setMultipartRequestMeter(mprMeterBuild.build());
-
-                            MultipartRequestInputBuilder mprInput =
-                                    createMultipartHeader(MultipartType.OFPMPMETER, taskContext, xid);
-                            mprInput.setMultipartRequestBody(caseBuilder.build());
-                            Future<RpcResult<Void>> resultFromOFLib = getMessageService()
-                                    .multipartRequest(mprInput.build(), getCookie());
-                            ListenableFuture<RpcResult<Void>> resultLib = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
-
-                            Futures.addCallback(resultLib, new ResultCallback<GetAllMeterStatisticsOutput>(result) {
-                                @Override
-                                public GetAllMeterStatisticsOutput createResult() {
-                                    GetAllMeterStatisticsOutputBuilder allMeterStatBuilder =
-                                            new GetAllMeterStatisticsOutputBuilder()
-                                                    .setTransactionId(new TransactionId(BigInteger.valueOf(xid)));
-                                    return allMeterStatBuilder.build();
-                                }
-                            });
-                            return result;
+            public OFRpcTaskImpl(OFRpcTaskContext taskContext, SwitchConnectionDistinguisher cookie,
+                    GetAllMeterStatisticsInput input) {
+                super(taskContext, cookie, input);
+                // TODO Auto-generated constructor stub
+            }
+
+            @Override
+            public ListenableFuture<RpcResult<GetAllMeterStatisticsOutput>> call()
+                    throws Exception {
+                final SettableFuture<RpcResult<GetAllMeterStatisticsOutput>> result = SettableFuture.create();
+
+                if (taskContext.getSession().getPrimaryConductor().getVersion() == OFConstants.OFP_VERSION_1_0) {
+                    RpcResult<GetAllMeterStatisticsOutput> rpcResult = RpcResultBuilder.success(
+                            new GetAllMeterStatisticsOutputBuilder().build()).build();
+                    return Futures.immediateFuture(rpcResult);
+                } else {
+                    final Long xid = taskContext.getSession().getNextXid();
+
+                    MultipartRequestMeterCaseBuilder caseBuilder =
+                            new MultipartRequestMeterCaseBuilder();
+                    MultipartRequestMeterBuilder mprMeterBuild =
+                            new MultipartRequestMeterBuilder();
+                    mprMeterBuild.setMeterId(new MeterId(BinContent.intToUnsignedLong(
+                            org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common
+                                    .types.rev130731.Meter.OFPMALL.getIntValue())));
+                    caseBuilder.setMultipartRequestMeter(mprMeterBuild.build());
+
+                    MultipartRequestInputBuilder mprInput =
+                            createMultipartHeader(MultipartType.OFPMPMETER, taskContext, xid);
+                    mprInput.setMultipartRequestBody(caseBuilder.build());
+                    Future<RpcResult<Void>> resultFromOFLib = getMessageService()
+                            .multipartRequest(mprInput.build(), getCookie());
+                    ListenableFuture<RpcResult<Void>> resultLib = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
+
+                    Futures.addCallback(resultLib, new ResultCallback<GetAllMeterStatisticsOutput>(result) {
+                        @Override
+                        public GetAllMeterStatisticsOutput createResult() {
+                            GetAllMeterStatisticsOutputBuilder allMeterStatBuilder =
+                                    new GetAllMeterStatisticsOutputBuilder()
+                                            .setTransactionId(new TransactionId(BigInteger.valueOf(xid)));
+                            return allMeterStatBuilder.build();
                         }
-                    }
-                };
-        return task;
+                    });
+                    return result;
+                }
+            }
+        }
+
+        return new OFRpcTaskImpl(taskContext, cookie, input);
     }
 
     /**
@@ -1083,45 +1154,51 @@ public abstract class OFRpcTaskFactory {
     public static OFRpcTask<GetMeterFeaturesInput, RpcResult<GetMeterFeaturesOutput>> createGetMeterFeaturesTask(
             final OFRpcTaskContext taskContext, final GetMeterFeaturesInput input,
             SwitchConnectionDistinguisher cookie) {
-        OFRpcTask<GetMeterFeaturesInput, RpcResult<GetMeterFeaturesOutput>> task =
-                new OFRpcTask<GetMeterFeaturesInput, RpcResult<GetMeterFeaturesOutput>>(taskContext, cookie, input) {
 
-                    @Override
-                    public ListenableFuture<RpcResult<GetMeterFeaturesOutput>> call()
-                            throws Exception {
-                        final SettableFuture<RpcResult<GetMeterFeaturesOutput>> result = SettableFuture.create();
-
-                        if (taskContext.getSession().getPrimaryConductor().getVersion() == OFConstants.OFP_VERSION_1_0) {
-                            RpcResult<GetMeterFeaturesOutput> rpcResult = RpcResultBuilder.success(
-                                    new GetMeterFeaturesOutputBuilder().build()).build();
-                            return Futures.immediateFuture(rpcResult);
-                        } else {
-                            final Long xid = taskContext.getSession().getNextXid();
-
-                            MultipartRequestMeterFeaturesCaseBuilder mprMeterFeaturesBuild =
-                                    new MultipartRequestMeterFeaturesCaseBuilder();
-
-                            MultipartRequestInputBuilder mprInput =
-                                    createMultipartHeader(MultipartType.OFPMPMETERFEATURES, taskContext, xid);
-                            mprInput.setMultipartRequestBody(mprMeterFeaturesBuild.build());
-                            Future<RpcResult<Void>> resultFromOFLib = getMessageService()
-                                    .multipartRequest(mprInput.build(), getCookie());
-                            ListenableFuture<RpcResult<Void>> resultLib = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
-
-                            Futures.addCallback(resultLib, new ResultCallback<GetMeterFeaturesOutput>(result) {
-                                @Override
-                                public GetMeterFeaturesOutput createResult() {
-                                    GetMeterFeaturesOutputBuilder meterFeaturesBuilder =
-                                            new GetMeterFeaturesOutputBuilder()
-                                                    .setTransactionId(new TransactionId(BigInteger.valueOf(xid)));
-                                    return meterFeaturesBuilder.build();
-                                }
-                            });
-                            return result;
+        class OFRpcTaskImpl extends OFRpcTask<GetMeterFeaturesInput, RpcResult<GetMeterFeaturesOutput>> {
+
+            public OFRpcTaskImpl(OFRpcTaskContext taskContext, SwitchConnectionDistinguisher cookie,
+                    GetMeterFeaturesInput input) {
+                super(taskContext, cookie, input);
+            }
+
+            @Override
+            public ListenableFuture<RpcResult<GetMeterFeaturesOutput>> call()
+                    throws Exception {
+                final SettableFuture<RpcResult<GetMeterFeaturesOutput>> result = SettableFuture.create();
+
+                if (taskContext.getSession().getPrimaryConductor().getVersion() == OFConstants.OFP_VERSION_1_0) {
+                    RpcResult<GetMeterFeaturesOutput> rpcResult = RpcResultBuilder.success(
+                            new GetMeterFeaturesOutputBuilder().build()).build();
+                    return Futures.immediateFuture(rpcResult);
+                } else {
+                    final Long xid = taskContext.getSession().getNextXid();
+
+                    MultipartRequestMeterFeaturesCaseBuilder mprMeterFeaturesBuild =
+                            new MultipartRequestMeterFeaturesCaseBuilder();
+
+                    MultipartRequestInputBuilder mprInput =
+                            createMultipartHeader(MultipartType.OFPMPMETERFEATURES, taskContext, xid);
+                    mprInput.setMultipartRequestBody(mprMeterFeaturesBuild.build());
+                    Future<RpcResult<Void>> resultFromOFLib = getMessageService()
+                            .multipartRequest(mprInput.build(), getCookie());
+                    ListenableFuture<RpcResult<Void>> resultLib = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
+
+                    Futures.addCallback(resultLib, new ResultCallback<GetMeterFeaturesOutput>(result) {
+                        @Override
+                        public GetMeterFeaturesOutput createResult() {
+                            GetMeterFeaturesOutputBuilder meterFeaturesBuilder =
+                                    new GetMeterFeaturesOutputBuilder()
+                                            .setTransactionId(new TransactionId(BigInteger.valueOf(xid)));
+                            return meterFeaturesBuilder.build();
                         }
-                    }
-                };
-        return task;
+                    });
+                    return result;
+                }
+            }
+        }
+
+        return new OFRpcTaskImpl(taskContext, cookie, input);
     }
 
     /**
@@ -1133,49 +1210,55 @@ public abstract class OFRpcTaskFactory {
     public static OFRpcTask<GetMeterStatisticsInput, RpcResult<GetMeterStatisticsOutput>> createGetMeterStatisticsTask(
             final OFRpcTaskContext taskContext, final GetMeterStatisticsInput input,
             SwitchConnectionDistinguisher cookie) {
-        OFRpcTask<GetMeterStatisticsInput, RpcResult<GetMeterStatisticsOutput>> task =
-                new OFRpcTask<GetMeterStatisticsInput, RpcResult<GetMeterStatisticsOutput>>(taskContext, cookie, input) {
 
-                    @Override
-                    public ListenableFuture<RpcResult<GetMeterStatisticsOutput>> call()
-                            throws Exception {
-                        final SettableFuture<RpcResult<GetMeterStatisticsOutput>> result = SettableFuture.create();
-
-                        if (taskContext.getSession().getPrimaryConductor().getVersion() == OFConstants.OFP_VERSION_1_0) {
-                            RpcResult<GetMeterStatisticsOutput> rpcResult = RpcResultBuilder.success(
-                                    new GetMeterStatisticsOutputBuilder().build()).build();
-                            return Futures.immediateFuture(rpcResult);
-                        } else {
-                            final Long xid = taskContext.getSession().getNextXid();
-
-                            MultipartRequestMeterCaseBuilder caseBuilder =
-                                    new MultipartRequestMeterCaseBuilder();
-                            MultipartRequestMeterBuilder mprMeterBuild =
-                                    new MultipartRequestMeterBuilder();
-                            mprMeterBuild.setMeterId(new MeterId(input.getMeterId().getValue()));
-                            caseBuilder.setMultipartRequestMeter(mprMeterBuild.build());
-
-                            MultipartRequestInputBuilder mprInput =
-                                    createMultipartHeader(MultipartType.OFPMPMETER, taskContext, xid);
-                            mprInput.setMultipartRequestBody(caseBuilder.build());
-                            Future<RpcResult<Void>> resultFromOFLib = getMessageService()
-                                    .multipartRequest(mprInput.build(), getCookie());
-                            ListenableFuture<RpcResult<Void>> resultLib = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
-
-                            Futures.addCallback(resultLib, new ResultCallback<GetMeterStatisticsOutput>(result) {
-                                @Override
-                                public GetMeterStatisticsOutput createResult() {
-                                    GetMeterStatisticsOutputBuilder meterStatBuilder =
-                                            new GetMeterStatisticsOutputBuilder()
-                                                    .setTransactionId(new TransactionId(BigInteger.valueOf(xid)));
-                                    return meterStatBuilder.build();
-                                }
-                            });
-                            return result;
+        class OFRpcTaskImpl extends OFRpcTask<GetMeterStatisticsInput, RpcResult<GetMeterStatisticsOutput>> {
+
+            public OFRpcTaskImpl(OFRpcTaskContext taskContext, SwitchConnectionDistinguisher cookie,
+                    GetMeterStatisticsInput input) {
+                super(taskContext, cookie, input);
+            }
+
+            @Override
+            public ListenableFuture<RpcResult<GetMeterStatisticsOutput>> call()
+                    throws Exception {
+                final SettableFuture<RpcResult<GetMeterStatisticsOutput>> result = SettableFuture.create();
+
+                if (taskContext.getSession().getPrimaryConductor().getVersion() == OFConstants.OFP_VERSION_1_0) {
+                    RpcResult<GetMeterStatisticsOutput> rpcResult = RpcResultBuilder.success(
+                            new GetMeterStatisticsOutputBuilder().build()).build();
+                    return Futures.immediateFuture(rpcResult);
+                } else {
+                    final Long xid = taskContext.getSession().getNextXid();
+
+                    MultipartRequestMeterCaseBuilder caseBuilder =
+                            new MultipartRequestMeterCaseBuilder();
+                    MultipartRequestMeterBuilder mprMeterBuild =
+                            new MultipartRequestMeterBuilder();
+                    mprMeterBuild.setMeterId(new MeterId(input.getMeterId().getValue()));
+                    caseBuilder.setMultipartRequestMeter(mprMeterBuild.build());
+
+                    MultipartRequestInputBuilder mprInput =
+                            createMultipartHeader(MultipartType.OFPMPMETER, taskContext, xid);
+                    mprInput.setMultipartRequestBody(caseBuilder.build());
+                    Future<RpcResult<Void>> resultFromOFLib = getMessageService()
+                            .multipartRequest(mprInput.build(), getCookie());
+                    ListenableFuture<RpcResult<Void>> resultLib = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
+
+                    Futures.addCallback(resultLib, new ResultCallback<GetMeterStatisticsOutput>(result) {
+                        @Override
+                        public GetMeterStatisticsOutput createResult() {
+                            GetMeterStatisticsOutputBuilder meterStatBuilder =
+                                    new GetMeterStatisticsOutputBuilder()
+                                            .setTransactionId(new TransactionId(BigInteger.valueOf(xid)));
+                            return meterStatBuilder.build();
                         }
-                    }
-                };
-        return task;
+                    });
+                    return result;
+                }
+            }
+        }
+
+        return new OFRpcTaskImpl(taskContext, cookie, input);
     }
 
     /**
@@ -1188,44 +1271,49 @@ public abstract class OFRpcTaskFactory {
     createGetAllNodeConnectorsStatisticsTask(
             final OFRpcTaskContext taskContext, final GetAllNodeConnectorsStatisticsInput input,
             SwitchConnectionDistinguisher cookie) {
-        OFRpcTask<GetAllNodeConnectorsStatisticsInput, RpcResult<GetAllNodeConnectorsStatisticsOutput>> task =
-                new OFRpcTask<GetAllNodeConnectorsStatisticsInput, RpcResult<GetAllNodeConnectorsStatisticsOutput>>(taskContext, cookie, input) {
+        class OFRpcTaskImpl extends OFRpcTask<GetAllNodeConnectorsStatisticsInput, RpcResult<GetAllNodeConnectorsStatisticsOutput>> { 
 
+            public OFRpcTaskImpl(OFRpcTaskContext taskContext, SwitchConnectionDistinguisher cookie,
+                    GetAllNodeConnectorsStatisticsInput input) {
+                super(taskContext, cookie, input);
+            }
+
+            @Override
+            public ListenableFuture<RpcResult<GetAllNodeConnectorsStatisticsOutput>> call()
+                    throws Exception {
+                final SettableFuture<RpcResult<GetAllNodeConnectorsStatisticsOutput>> result = SettableFuture.create();
+
+                final Long xid = taskContext.getSession().getNextXid();
+
+                MultipartRequestPortStatsCaseBuilder caseBuilder =
+                        new MultipartRequestPortStatsCaseBuilder();
+                MultipartRequestPortStatsBuilder mprPortStatsBuilder =
+                        new MultipartRequestPortStatsBuilder();
+                // Select all ports
+                mprPortStatsBuilder.setPortNo(OFConstants.OFPP_ANY);
+                caseBuilder.setMultipartRequestPortStats(mprPortStatsBuilder.build());
+
+                MultipartRequestInputBuilder mprInput =
+                        createMultipartHeader(MultipartType.OFPMPPORTSTATS, taskContext, xid);
+                mprInput.setMultipartRequestBody(caseBuilder.build());
+                Future<RpcResult<Void>> resultFromOFLib = getMessageService()
+                        .multipartRequest(mprInput.build(), getCookie());
+                ListenableFuture<RpcResult<Void>> resultLib = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
+
+                Futures.addCallback(resultLib, new ResultCallback<GetAllNodeConnectorsStatisticsOutput>(result) {
                     @Override
-                    public ListenableFuture<RpcResult<GetAllNodeConnectorsStatisticsOutput>> call()
-                            throws Exception {
-                        final SettableFuture<RpcResult<GetAllNodeConnectorsStatisticsOutput>> result = SettableFuture.create();
-
-                        final Long xid = taskContext.getSession().getNextXid();
-
-                        MultipartRequestPortStatsCaseBuilder caseBuilder =
-                                new MultipartRequestPortStatsCaseBuilder();
-                        MultipartRequestPortStatsBuilder mprPortStatsBuilder =
-                                new MultipartRequestPortStatsBuilder();
-                        // Select all ports
-                        mprPortStatsBuilder.setPortNo(OFConstants.OFPP_ANY);
-                        caseBuilder.setMultipartRequestPortStats(mprPortStatsBuilder.build());
-
-                        MultipartRequestInputBuilder mprInput =
-                                createMultipartHeader(MultipartType.OFPMPPORTSTATS, taskContext, xid);
-                        mprInput.setMultipartRequestBody(caseBuilder.build());
-                        Future<RpcResult<Void>> resultFromOFLib = getMessageService()
-                                .multipartRequest(mprInput.build(), getCookie());
-                        ListenableFuture<RpcResult<Void>> resultLib = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
-
-                        Futures.addCallback(resultLib, new ResultCallback<GetAllNodeConnectorsStatisticsOutput>(result) {
-                            @Override
-                            public GetAllNodeConnectorsStatisticsOutput createResult() {
-                                GetAllNodeConnectorsStatisticsOutputBuilder allNodeConnectorStatBuilder =
-                                        new GetAllNodeConnectorsStatisticsOutputBuilder()
-                                                .setTransactionId(new TransactionId(BigInteger.valueOf(xid)));
-                                return allNodeConnectorStatBuilder.build();
-                            }
-                        });
-                        return result;
+                    public GetAllNodeConnectorsStatisticsOutput createResult() {
+                        GetAllNodeConnectorsStatisticsOutputBuilder allNodeConnectorStatBuilder =
+                                new GetAllNodeConnectorsStatisticsOutputBuilder()
+                                        .setTransactionId(new TransactionId(BigInteger.valueOf(xid)));
+                        return allNodeConnectorStatBuilder.build();
                     }
-                };
-        return task;
+                });
+                return result;
+            }
+        }
+
+        return new OFRpcTaskImpl(taskContext, cookie, input);
     }
 
     /**
@@ -1238,47 +1326,52 @@ public abstract class OFRpcTaskFactory {
     createGetNodeConnectorStatisticsTask(
             final OFRpcTaskContext taskContext, final GetNodeConnectorStatisticsInput input,
             SwitchConnectionDistinguisher cookie) {
-        OFRpcTask<GetNodeConnectorStatisticsInput, RpcResult<GetNodeConnectorStatisticsOutput>> task =
-                new OFRpcTask<GetNodeConnectorStatisticsInput, RpcResult<GetNodeConnectorStatisticsOutput>>(taskContext, cookie, input) {
+        class OFRpcTaskImpl extends OFRpcTask<GetNodeConnectorStatisticsInput, RpcResult<GetNodeConnectorStatisticsOutput>> {
 
+            public OFRpcTaskImpl(OFRpcTaskContext taskContext, SwitchConnectionDistinguisher cookie,
+                    GetNodeConnectorStatisticsInput input) {
+                super(taskContext, cookie, input);
+            }
+
+            @Override
+            public ListenableFuture<RpcResult<GetNodeConnectorStatisticsOutput>> call()
+                    throws Exception {
+                final SettableFuture<RpcResult<GetNodeConnectorStatisticsOutput>> result = SettableFuture.create();
+
+                final Long xid = taskContext.getSession().getNextXid();
+
+                MultipartRequestPortStatsCaseBuilder caseBuilder =
+                        new MultipartRequestPortStatsCaseBuilder();
+                MultipartRequestPortStatsBuilder mprPortStatsBuilder =
+                        new MultipartRequestPortStatsBuilder();
+                // Set specific port
+                mprPortStatsBuilder
+                        .setPortNo(InventoryDataServiceUtil.portNumberfromNodeConnectorId(
+                                OpenflowVersion.get(taskContext.getSession().getFeatures().getVersion()),
+                                input.getNodeConnectorId()));
+                caseBuilder.setMultipartRequestPortStats(mprPortStatsBuilder.build());
+
+                MultipartRequestInputBuilder mprInput =
+                        createMultipartHeader(MultipartType.OFPMPPORTSTATS, taskContext, xid);
+                mprInput.setMultipartRequestBody(caseBuilder.build());
+                Future<RpcResult<Void>> resultFromOFLib = getMessageService()
+                        .multipartRequest(mprInput.build(), getCookie());
+                ListenableFuture<RpcResult<Void>> resultLib = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
+
+                Futures.addCallback(resultLib, new ResultCallback<GetNodeConnectorStatisticsOutput>(result) {
                     @Override
-                    public ListenableFuture<RpcResult<GetNodeConnectorStatisticsOutput>> call()
-                            throws Exception {
-                        final SettableFuture<RpcResult<GetNodeConnectorStatisticsOutput>> result = SettableFuture.create();
-
-                        final Long xid = taskContext.getSession().getNextXid();
-
-                        MultipartRequestPortStatsCaseBuilder caseBuilder =
-                                new MultipartRequestPortStatsCaseBuilder();
-                        MultipartRequestPortStatsBuilder mprPortStatsBuilder =
-                                new MultipartRequestPortStatsBuilder();
-                        // Set specific port
-                        mprPortStatsBuilder
-                                .setPortNo(InventoryDataServiceUtil.portNumberfromNodeConnectorId(
-                                        OpenflowVersion.get(taskContext.getSession().getFeatures().getVersion()),
-                                        input.getNodeConnectorId()));
-                        caseBuilder.setMultipartRequestPortStats(mprPortStatsBuilder.build());
-
-                        MultipartRequestInputBuilder mprInput =
-                                createMultipartHeader(MultipartType.OFPMPPORTSTATS, taskContext, xid);
-                        mprInput.setMultipartRequestBody(caseBuilder.build());
-                        Future<RpcResult<Void>> resultFromOFLib = getMessageService()
-                                .multipartRequest(mprInput.build(), getCookie());
-                        ListenableFuture<RpcResult<Void>> resultLib = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
-
-                        Futures.addCallback(resultLib, new ResultCallback<GetNodeConnectorStatisticsOutput>(result) {
-                            @Override
-                            public GetNodeConnectorStatisticsOutput createResult() {
-                                GetNodeConnectorStatisticsOutputBuilder allNodeConnectorStatBuilder =
-                                        new GetNodeConnectorStatisticsOutputBuilder()
-                                                .setTransactionId(new TransactionId(BigInteger.valueOf(xid)));
-                                return allNodeConnectorStatBuilder.build();
-                            }
-                        });
-                        return result;
+                    public GetNodeConnectorStatisticsOutput createResult() {
+                        GetNodeConnectorStatisticsOutputBuilder allNodeConnectorStatBuilder =
+                                new GetNodeConnectorStatisticsOutputBuilder()
+                                        .setTransactionId(new TransactionId(BigInteger.valueOf(xid)));
+                        return allNodeConnectorStatBuilder.build();
                     }
-                };
-        return task;
+                });
+                return result;
+            }
+        }
+
+        return new OFRpcTaskImpl(taskContext, cookie, input);
     }
 
     /**
@@ -1292,47 +1385,52 @@ public abstract class OFRpcTaskFactory {
             final OFRpcTaskContext taskContext,
             final GetAllFlowStatisticsFromFlowTableInput input,
             SwitchConnectionDistinguisher cookie) {
-        OFRpcTask<GetAllFlowStatisticsFromFlowTableInput, RpcResult<GetAllFlowStatisticsFromFlowTableOutput>> task =
-                new OFRpcTask<GetAllFlowStatisticsFromFlowTableInput, RpcResult<GetAllFlowStatisticsFromFlowTableOutput>>(taskContext, cookie, input) {
+        class OFRpcTaskImpl extends OFRpcTask<GetAllFlowStatisticsFromFlowTableInput, RpcResult<GetAllFlowStatisticsFromFlowTableOutput>> {
+
+            public OFRpcTaskImpl(OFRpcTaskContext taskContext, SwitchConnectionDistinguisher cookie,
+                    GetAllFlowStatisticsFromFlowTableInput input) {
+                super(taskContext, cookie, input);
+            }
 
+            @Override
+            public ListenableFuture<RpcResult<GetAllFlowStatisticsFromFlowTableOutput>> call() throws Exception {
+                final SettableFuture<RpcResult<GetAllFlowStatisticsFromFlowTableOutput>> result = SettableFuture.create();
+
+                final Long xid = taskContext.getSession().getNextXid();
+
+                MultipartRequestFlowBuilder mprFlowRequestBuilder = new MultipartRequestFlowBuilder();
+                mprFlowRequestBuilder.setTableId(input.getTableId().getValue());
+                mprFlowRequestBuilder.setOutPort(OFConstants.OFPP_ANY);
+                mprFlowRequestBuilder.setOutGroup(OFConstants.OFPG_ANY);
+                mprFlowRequestBuilder.setCookie(OFConstants.DEFAULT_COOKIE);
+                mprFlowRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
+                FlowCreatorUtil.setWildcardedFlowMatch(taskContext.getSession()
+                        .getPrimaryConductor().getVersion(), mprFlowRequestBuilder);
+
+                MultipartRequestFlowCaseBuilder multipartRequestFlowCaseBuilder = new MultipartRequestFlowCaseBuilder();
+                multipartRequestFlowCaseBuilder.setMultipartRequestFlow(mprFlowRequestBuilder.build());
+
+                MultipartRequestInputBuilder mprInput =
+                        createMultipartHeader(MultipartType.OFPMPFLOW, taskContext, xid);
+                mprInput.setMultipartRequestBody(multipartRequestFlowCaseBuilder.build());
+                Future<RpcResult<Void>> resultFromOFLib = getMessageService()
+                        .multipartRequest(mprInput.build(), getCookie());
+                ListenableFuture<RpcResult<Void>> resultLib = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
+
+                Futures.addCallback(resultLib, new ResultCallback<GetAllFlowStatisticsFromFlowTableOutput>(result) {
                     @Override
-                    public ListenableFuture<RpcResult<GetAllFlowStatisticsFromFlowTableOutput>> call() throws Exception {
-                        final SettableFuture<RpcResult<GetAllFlowStatisticsFromFlowTableOutput>> result = SettableFuture.create();
-
-                        final Long xid = taskContext.getSession().getNextXid();
-
-                        MultipartRequestFlowBuilder mprFlowRequestBuilder = new MultipartRequestFlowBuilder();
-                        mprFlowRequestBuilder.setTableId(input.getTableId().getValue());
-                        mprFlowRequestBuilder.setOutPort(OFConstants.OFPP_ANY);
-                        mprFlowRequestBuilder.setOutGroup(OFConstants.OFPG_ANY);
-                        mprFlowRequestBuilder.setCookie(OFConstants.DEFAULT_COOKIE);
-                        mprFlowRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
-                        FlowCreatorUtil.setWildcardedFlowMatch(taskContext.getSession()
-                                .getPrimaryConductor().getVersion(), mprFlowRequestBuilder);
-
-                        MultipartRequestFlowCaseBuilder multipartRequestFlowCaseBuilder = new MultipartRequestFlowCaseBuilder();
-                        multipartRequestFlowCaseBuilder.setMultipartRequestFlow(mprFlowRequestBuilder.build());
-
-                        MultipartRequestInputBuilder mprInput =
-                                createMultipartHeader(MultipartType.OFPMPFLOW, taskContext, xid);
-                        mprInput.setMultipartRequestBody(multipartRequestFlowCaseBuilder.build());
-                        Future<RpcResult<Void>> resultFromOFLib = getMessageService()
-                                .multipartRequest(mprInput.build(), getCookie());
-                        ListenableFuture<RpcResult<Void>> resultLib = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
-
-                        Futures.addCallback(resultLib, new ResultCallback<GetAllFlowStatisticsFromFlowTableOutput>(result) {
-                            @Override
-                            public GetAllFlowStatisticsFromFlowTableOutput createResult() {
-                                GetAllFlowStatisticsFromFlowTableOutputBuilder allFlowStatsFromFlowTableBuilder =
-                                        new GetAllFlowStatisticsFromFlowTableOutputBuilder()
-                                                .setTransactionId(new TransactionId(BigInteger.valueOf(xid)));
-                                return allFlowStatsFromFlowTableBuilder.build();
-                            }
-                        });
-                        return result;
+                    public GetAllFlowStatisticsFromFlowTableOutput createResult() {
+                        GetAllFlowStatisticsFromFlowTableOutputBuilder allFlowStatsFromFlowTableBuilder =
+                                new GetAllFlowStatisticsFromFlowTableOutputBuilder()
+                                        .setTransactionId(new TransactionId(BigInteger.valueOf(xid)));
+                        return allFlowStatsFromFlowTableBuilder.build();
                     }
-                };
-        return task;
+                });
+                return result;
+            }
+        }
+
+        return new OFRpcTaskImpl(taskContext, cookie, input);
     }
 
     /**
@@ -1346,51 +1444,55 @@ public abstract class OFRpcTaskFactory {
             final OFRpcTaskContext taskContext,
             final GetAllFlowsStatisticsFromAllFlowTablesInput input,
             SwitchConnectionDistinguisher cookie) {
-        OFRpcTask<GetAllFlowsStatisticsFromAllFlowTablesInput,
-                RpcResult<GetAllFlowsStatisticsFromAllFlowTablesOutput>> task =
-                new OFRpcTask<GetAllFlowsStatisticsFromAllFlowTablesInput,
-                        RpcResult<GetAllFlowsStatisticsFromAllFlowTablesOutput>>(taskContext, cookie, input) {
+        class OFRpcTaskImpl extends OFRpcTask<GetAllFlowsStatisticsFromAllFlowTablesInput,
+                RpcResult<GetAllFlowsStatisticsFromAllFlowTablesOutput>> {
+
+            public OFRpcTaskImpl(OFRpcTaskContext taskContext, SwitchConnectionDistinguisher cookie,
+                    GetAllFlowsStatisticsFromAllFlowTablesInput input) {
+                super(taskContext, cookie, input);
+            }
+
+            @Override
+            public ListenableFuture<RpcResult<GetAllFlowsStatisticsFromAllFlowTablesOutput>> call() throws Exception {
+                final SettableFuture<RpcResult<GetAllFlowsStatisticsFromAllFlowTablesOutput>> result = SettableFuture.create();
+
+                final Long xid = taskContext.getSession().getNextXid();
 
+                // 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);
+                FlowCreatorUtil.setWildcardedFlowMatch(taskContext.getSession()
+                        .getPrimaryConductor().getVersion(), mprFlowRequestBuilder);
+
+                MultipartRequestInputBuilder mprInput =
+                        createMultipartHeader(MultipartType.OFPMPFLOW, taskContext, xid);
+                multipartRequestFlowCaseBuilder.setMultipartRequestFlow(mprFlowRequestBuilder.build());
+                mprInput.setMultipartRequestBody(multipartRequestFlowCaseBuilder.build());
+                Future<RpcResult<Void>> resultFromOFLib = getMessageService()
+                        .multipartRequest(mprInput.build(), getCookie());
+                ListenableFuture<RpcResult<Void>> resultLib = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
+
+                Futures.addCallback(resultLib, new ResultCallback<GetAllFlowsStatisticsFromAllFlowTablesOutput>(result) {
                     @Override
-                    public ListenableFuture<RpcResult<GetAllFlowsStatisticsFromAllFlowTablesOutput>> call() throws Exception {
-                        final SettableFuture<RpcResult<GetAllFlowsStatisticsFromAllFlowTablesOutput>> result = SettableFuture.create();
-
-                        final Long xid = taskContext.getSession().getNextXid();
-
-                        // 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);
-                        FlowCreatorUtil.setWildcardedFlowMatch(taskContext.getSession()
-                                .getPrimaryConductor().getVersion(), mprFlowRequestBuilder);
-
-                        MultipartRequestInputBuilder mprInput =
-                                createMultipartHeader(MultipartType.OFPMPFLOW, taskContext, xid);
-                        multipartRequestFlowCaseBuilder.setMultipartRequestFlow(mprFlowRequestBuilder.build());
-                        mprInput.setMultipartRequestBody(multipartRequestFlowCaseBuilder.build());
-                        Future<RpcResult<Void>> resultFromOFLib = getMessageService()
-                                .multipartRequest(mprInput.build(), getCookie());
-                        ListenableFuture<RpcResult<Void>> resultLib = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
-
-                        Futures.addCallback(resultLib, new ResultCallback<GetAllFlowsStatisticsFromAllFlowTablesOutput>(result) {
-                            @Override
-                            public GetAllFlowsStatisticsFromAllFlowTablesOutput createResult() {
-                                GetAllFlowsStatisticsFromAllFlowTablesOutputBuilder allFlowStatsFromAllFlowTableBuilder =
-                                        new GetAllFlowsStatisticsFromAllFlowTablesOutputBuilder()
-                                                .setTransactionId(new TransactionId(BigInteger.valueOf(xid)));
-                                return allFlowStatsFromAllFlowTableBuilder.build();
-                            }
-                        });
-                        return result;
+                    public GetAllFlowsStatisticsFromAllFlowTablesOutput createResult() {
+                        GetAllFlowsStatisticsFromAllFlowTablesOutputBuilder allFlowStatsFromAllFlowTableBuilder =
+                                new GetAllFlowsStatisticsFromAllFlowTablesOutputBuilder()
+                                        .setTransactionId(new TransactionId(BigInteger.valueOf(xid)));
+                        return allFlowStatsFromAllFlowTableBuilder.build();
                     }
-                };
-        return task;
+                });
+                return result;
+            }
+        }
+
+        return new OFRpcTaskImpl(taskContext, cookie, input);
     }
 
     /**
@@ -1403,67 +1505,77 @@ public abstract class OFRpcTaskFactory {
     createGetFlowStatisticsFromFlowTableTask(
             final OFRpcTaskContext taskContext,
             final GetFlowStatisticsFromFlowTableInput input, SwitchConnectionDistinguisher cookie) {
-        OFRpcTask<GetFlowStatisticsFromFlowTableInput, RpcResult<GetFlowStatisticsFromFlowTableOutput>> task =
-                new OFRpcTask<GetFlowStatisticsFromFlowTableInput, RpcResult<GetFlowStatisticsFromFlowTableOutput>>(taskContext, cookie, input) {
 
+        class OFRpcTaskImpl extends OFRpcTask<GetFlowStatisticsFromFlowTableInput, RpcResult<GetFlowStatisticsFromFlowTableOutput>> {
+
+            public OFRpcTaskImpl(OFRpcTaskContext taskContext, SwitchConnectionDistinguisher cookie,
+                    GetFlowStatisticsFromFlowTableInput input) {
+                super(taskContext, cookie, input);
+            }
+
+            @Override
+            public ListenableFuture<RpcResult<GetFlowStatisticsFromFlowTableOutput>> call() throws Exception {
+                final SettableFuture<RpcResult<GetFlowStatisticsFromFlowTableOutput>> result = SettableFuture.create();
+
+                final Long xid = taskContext.getSession().getNextXid();
+
+                // Create multipart request body for fetch all the group stats
+                MultipartRequestFlowCaseBuilder multipartRequestFlowCaseBuilder = new MultipartRequestFlowCaseBuilder();
+                MultipartRequestFlowBuilder mprFlowRequestBuilder = new MultipartRequestFlowBuilder();
+                mprFlowRequestBuilder.setTableId(input.getTableId());
+
+                if (input.getOutPort() != null) {
+                    mprFlowRequestBuilder.setOutPort(input.getOutPort().longValue());
+                } else {
+                    mprFlowRequestBuilder.setOutPort(OFConstants.OFPP_ANY);
+                }
+
+                if (input.getOutGroup() != null) {
+                    mprFlowRequestBuilder.setOutGroup(input.getOutGroup());
+                } else {
+                    mprFlowRequestBuilder.setOutGroup(OFConstants.OFPG_ANY);
+                }
+
+                if (input.getCookie() != null) {
+                    mprFlowRequestBuilder.setCookie(input.getCookie().getValue());
+                } else {
+                    mprFlowRequestBuilder.setCookie(OFConstants.DEFAULT_COOKIE);
+                }
+
+                if (input.getCookieMask() != null) {
+                    mprFlowRequestBuilder.setCookieMask(input.getCookieMask().getValue());
+                } else {
+                    mprFlowRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
+                }
+
+                // convert and inject match
+                MatchReactor.getInstance().convert(input.getMatch(), taskContext.getSession()
+                                .getPrimaryConductor().getVersion(), mprFlowRequestBuilder,
+                        taskContext.getSession().getFeatures().getDatapathId());
+
+                // Set request body to main multipart request
+                multipartRequestFlowCaseBuilder.setMultipartRequestFlow(mprFlowRequestBuilder.build());
+                MultipartRequestInputBuilder mprInput =
+                        createMultipartHeader(MultipartType.OFPMPFLOW, taskContext, xid);
+                mprInput.setMultipartRequestBody(multipartRequestFlowCaseBuilder.build());
+                Future<RpcResult<Void>> resultFromOFLib = getMessageService()
+                        .multipartRequest(mprInput.build(), getCookie());
+                ListenableFuture<RpcResult<Void>> resultLib = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
+
+                Futures.addCallback(resultLib, new ResultCallback<GetFlowStatisticsFromFlowTableOutput>(result) {
                     @Override
-                    public ListenableFuture<RpcResult<GetFlowStatisticsFromFlowTableOutput>> call() throws Exception {
-                        final SettableFuture<RpcResult<GetFlowStatisticsFromFlowTableOutput>> result = SettableFuture.create();
-
-                        final Long xid = taskContext.getSession().getNextXid();
-
-                        // Create multipart request body for fetch all the group stats
-                        MultipartRequestFlowCaseBuilder multipartRequestFlowCaseBuilder = new MultipartRequestFlowCaseBuilder();
-                        MultipartRequestFlowBuilder mprFlowRequestBuilder = new MultipartRequestFlowBuilder();
-                        mprFlowRequestBuilder.setTableId(input.getTableId());
-
-                        if (input.getOutPort() != null)
-                            mprFlowRequestBuilder.setOutPort(input.getOutPort().longValue());
-                        else
-                            mprFlowRequestBuilder.setOutPort(OFConstants.OFPP_ANY);
-
-                        if (input.getOutGroup() != null)
-                            mprFlowRequestBuilder.setOutGroup(input.getOutGroup());
-                        else
-                            mprFlowRequestBuilder.setOutGroup(OFConstants.OFPG_ANY);
-
-                        if (input.getCookie() != null)
-                            mprFlowRequestBuilder.setCookie(input.getCookie().getValue());
-                        else
-                            mprFlowRequestBuilder.setCookie(OFConstants.DEFAULT_COOKIE);
-
-                        if (input.getCookieMask() != null)
-                            mprFlowRequestBuilder.setCookieMask(input.getCookieMask().getValue());
-                        else
-                            mprFlowRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
-
-                        // convert and inject match
-                        MatchReactor.getInstance().convert(input.getMatch(), taskContext.getSession()
-                                        .getPrimaryConductor().getVersion(), mprFlowRequestBuilder,
-                                taskContext.getSession().getFeatures().getDatapathId());
-
-                        // Set request body to main multipart request
-                        multipartRequestFlowCaseBuilder.setMultipartRequestFlow(mprFlowRequestBuilder.build());
-                        MultipartRequestInputBuilder mprInput =
-                                createMultipartHeader(MultipartType.OFPMPFLOW, taskContext, xid);
-                        mprInput.setMultipartRequestBody(multipartRequestFlowCaseBuilder.build());
-                        Future<RpcResult<Void>> resultFromOFLib = getMessageService()
-                                .multipartRequest(mprInput.build(), getCookie());
-                        ListenableFuture<RpcResult<Void>> resultLib = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
-
-                        Futures.addCallback(resultLib, new ResultCallback<GetFlowStatisticsFromFlowTableOutput>(result) {
-                            @Override
-                            public GetFlowStatisticsFromFlowTableOutput createResult() {
-                                GetFlowStatisticsFromFlowTableOutputBuilder flowStatsFromFlowTableBuilder =
-                                        new GetFlowStatisticsFromFlowTableOutputBuilder()
-                                                .setTransactionId(new TransactionId(BigInteger.valueOf(xid)));
-                                return flowStatsFromFlowTableBuilder.build();
-                            }
-                        });
-                        return result;
+                    public GetFlowStatisticsFromFlowTableOutput createResult() {
+                        GetFlowStatisticsFromFlowTableOutputBuilder flowStatsFromFlowTableBuilder =
+                                new GetFlowStatisticsFromFlowTableOutputBuilder()
+                                        .setTransactionId(new TransactionId(BigInteger.valueOf(xid)));
+                        return flowStatsFromFlowTableBuilder.build();
                     }
-                };
-        return task;
+                });
+                return result;
+            }
+        }
+
+        return new OFRpcTaskImpl(taskContext, cookie, input);
     }
 
     /**
@@ -1476,49 +1588,54 @@ public abstract class OFRpcTaskFactory {
     createGetAggregateFlowStatisticsFromFlowTableForAllFlowsTask(
             final OFRpcTaskContext taskContext,
             final GetAggregateFlowStatisticsFromFlowTableForAllFlowsInput input, SwitchConnectionDistinguisher cookie) {
-        OFRpcTask<GetAggregateFlowStatisticsFromFlowTableForAllFlowsInput, RpcResult<GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutput>> task =
-                new OFRpcTask<GetAggregateFlowStatisticsFromFlowTableForAllFlowsInput, RpcResult<GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutput>>(taskContext, cookie, input) {
+        class OFRpcTaskImpl extends OFRpcTask<GetAggregateFlowStatisticsFromFlowTableForAllFlowsInput, RpcResult<GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutput>> {
+
+            public OFRpcTaskImpl(OFRpcTaskContext taskContext, SwitchConnectionDistinguisher cookie,
+                    GetAggregateFlowStatisticsFromFlowTableForAllFlowsInput input) {
+                super(taskContext, cookie, input);
+            }
+
+            @Override
+            public ListenableFuture<RpcResult<GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutput>> call() throws Exception {
+                final SettableFuture<RpcResult<GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutput>> result = SettableFuture.create();
+
+                final Long xid = taskContext.getSession().getNextXid();
 
+                // Create multipart request body for fetch all the group stats
+                MultipartRequestAggregateCaseBuilder multipartRequestAggregateCaseBuilder = new MultipartRequestAggregateCaseBuilder();
+                MultipartRequestAggregateBuilder mprAggregateRequestBuilder = new MultipartRequestAggregateBuilder();
+                mprAggregateRequestBuilder.setTableId(input.getTableId().getValue());
+                mprAggregateRequestBuilder.setOutPort(OFConstants.OFPP_ANY);
+                mprAggregateRequestBuilder.setOutGroup(OFConstants.OFPG_ANY);
+                mprAggregateRequestBuilder.setCookie(OFConstants.DEFAULT_COOKIE);
+                mprAggregateRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
+
+                FlowCreatorUtil.setWildcardedFlowMatch(taskContext.getSession()
+                        .getPrimaryConductor().getVersion(), mprAggregateRequestBuilder);
+
+                // Set request body to main multipart request
+                multipartRequestAggregateCaseBuilder.setMultipartRequestAggregate(mprAggregateRequestBuilder.build());
+                MultipartRequestInputBuilder mprInput =
+                        createMultipartHeader(MultipartType.OFPMPAGGREGATE, taskContext, xid);
+                mprInput.setMultipartRequestBody(multipartRequestAggregateCaseBuilder.build());
+                Future<RpcResult<Void>> resultFromOFLib = getMessageService()
+                        .multipartRequest(mprInput.build(), getCookie());
+                ListenableFuture<RpcResult<Void>> resultLib = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
+
+                Futures.addCallback(resultLib, new ResultCallback<GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutput>(result) {
                     @Override
-                    public ListenableFuture<RpcResult<GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutput>> call() throws Exception {
-                        final SettableFuture<RpcResult<GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutput>> result = SettableFuture.create();
-
-                        final Long xid = taskContext.getSession().getNextXid();
-
-                        // Create multipart request body for fetch all the group stats
-                        MultipartRequestAggregateCaseBuilder multipartRequestAggregateCaseBuilder = new MultipartRequestAggregateCaseBuilder();
-                        MultipartRequestAggregateBuilder mprAggregateRequestBuilder = new MultipartRequestAggregateBuilder();
-                        mprAggregateRequestBuilder.setTableId(input.getTableId().getValue());
-                        mprAggregateRequestBuilder.setOutPort(OFConstants.OFPP_ANY);
-                        mprAggregateRequestBuilder.setOutGroup(OFConstants.OFPG_ANY);
-                        mprAggregateRequestBuilder.setCookie(OFConstants.DEFAULT_COOKIE);
-                        mprAggregateRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
-
-                        FlowCreatorUtil.setWildcardedFlowMatch(taskContext.getSession()
-                                .getPrimaryConductor().getVersion(), mprAggregateRequestBuilder);
-
-                        // Set request body to main multipart request
-                        multipartRequestAggregateCaseBuilder.setMultipartRequestAggregate(mprAggregateRequestBuilder.build());
-                        MultipartRequestInputBuilder mprInput =
-                                createMultipartHeader(MultipartType.OFPMPAGGREGATE, taskContext, xid);
-                        mprInput.setMultipartRequestBody(multipartRequestAggregateCaseBuilder.build());
-                        Future<RpcResult<Void>> resultFromOFLib = getMessageService()
-                                .multipartRequest(mprInput.build(), getCookie());
-                        ListenableFuture<RpcResult<Void>> resultLib = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
-
-                        Futures.addCallback(resultLib, new ResultCallback<GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutput>(result) {
-                            @Override
-                            public GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutput createResult() {
-                                GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutputBuilder flowStatsFromFlowTableBuilder =
-                                        new GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutputBuilder()
-                                                .setTransactionId(new TransactionId(BigInteger.valueOf(xid)));
-                                return flowStatsFromFlowTableBuilder.build();
-                            }
-                        });
-                        return result;
+                    public GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutput createResult() {
+                        GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutputBuilder flowStatsFromFlowTableBuilder =
+                                new GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutputBuilder()
+                                        .setTransactionId(new TransactionId(BigInteger.valueOf(xid)));
+                        return flowStatsFromFlowTableBuilder.build();
                     }
-                };
-        return task;
+                });
+                return result;
+            }
+        }
+
+        return new OFRpcTaskImpl(taskContext, cookie, input);
     }
 
     /**
@@ -1531,60 +1648,65 @@ public abstract class OFRpcTaskFactory {
     createGetAggregateFlowStatisticsFromFlowTableForGivenMatchTask(
             final OFRpcTaskContext taskContext,
             final GetAggregateFlowStatisticsFromFlowTableForGivenMatchInput input, SwitchConnectionDistinguisher cookie) {
-        OFRpcTask<GetAggregateFlowStatisticsFromFlowTableForGivenMatchInput, RpcResult<GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutput>> task =
-                new OFRpcTask<GetAggregateFlowStatisticsFromFlowTableForGivenMatchInput, RpcResult<GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutput>>(taskContext, cookie, input) {
+        class OFRpcTaskImpl extends OFRpcTask<GetAggregateFlowStatisticsFromFlowTableForGivenMatchInput, RpcResult<GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutput>> {
 
-                    @Override
-                    public ListenableFuture<RpcResult<GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutput>> call() throws Exception {
-                        final SettableFuture<RpcResult<GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutput>> result = SettableFuture.create();
-
-                        final Long xid = taskContext.getSession().getNextXid();
-
-                        MultipartRequestAggregateCaseBuilder multipartRequestAggregateCaseBuilder = new MultipartRequestAggregateCaseBuilder();
-                        MultipartRequestAggregateBuilder mprAggregateRequestBuilder = new MultipartRequestAggregateBuilder();
-                        mprAggregateRequestBuilder.setTableId(input.getTableId());
-                        mprAggregateRequestBuilder.setOutPort(input.getOutPort().longValue());
-                        // TODO: repeating code
-                        if (taskContext.getSession().getPrimaryConductor().getVersion() ==
-                                OFConstants.OFP_VERSION_1_3) {
-                            mprAggregateRequestBuilder.setCookie(input.getCookie().getValue());
-                            mprAggregateRequestBuilder.setCookieMask(input.getCookieMask().getValue());
-                            mprAggregateRequestBuilder.setOutGroup(input.getOutGroup());
-                        } else {
-                            mprAggregateRequestBuilder.setOutGroup(OFConstants.OFPG_ANY);
-                            mprAggregateRequestBuilder.setCookie(OFConstants.DEFAULT_COOKIE);
-                            mprAggregateRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
-                        }
+            public OFRpcTaskImpl(OFRpcTaskContext taskContext, SwitchConnectionDistinguisher cookie,
+                    GetAggregateFlowStatisticsFromFlowTableForGivenMatchInput input) {
+                super(taskContext, cookie, input);
+            }
 
-                        MatchReactor.getInstance().convert(input.getMatch(), taskContext.getSession()
-                                        .getPrimaryConductor().getVersion(), mprAggregateRequestBuilder,
-                                taskContext.getSession().getFeatures().getDatapathId());
-
-                        FlowCreatorUtil.setWildcardedFlowMatch(taskContext.getSession()
-                                .getPrimaryConductor().getVersion(), mprAggregateRequestBuilder);
-
-                        // Set request body to main multipart request
-                        multipartRequestAggregateCaseBuilder.setMultipartRequestAggregate(mprAggregateRequestBuilder.build());
-                        MultipartRequestInputBuilder mprInput =
-                                createMultipartHeader(MultipartType.OFPMPAGGREGATE, taskContext, xid);
-                        mprInput.setMultipartRequestBody(multipartRequestAggregateCaseBuilder.build());
-                        Future<RpcResult<Void>> resultFromOFLib = getMessageService()
-                                .multipartRequest(mprInput.build(), getCookie());
-                        ListenableFuture<RpcResult<Void>> resultLib = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
-
-                        Futures.addCallback(resultLib, new ResultCallback<GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutput>(result) {
-                            @Override
-                            public GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutput createResult() {
-                                GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutputBuilder aggregFlowStatsFromFlowTableBuilder =
-                                        new GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutputBuilder()
-                                                .setTransactionId(new TransactionId(BigInteger.valueOf(xid)));
-                                return aggregFlowStatsFromFlowTableBuilder.build();
-                            }
-                        });
-                        return result;
+            @Override
+            public ListenableFuture<RpcResult<GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutput>> call() throws Exception {
+                final SettableFuture<RpcResult<GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutput>> result = SettableFuture.create();
+
+                final Long xid = taskContext.getSession().getNextXid();
+
+                MultipartRequestAggregateCaseBuilder multipartRequestAggregateCaseBuilder = new MultipartRequestAggregateCaseBuilder();
+                MultipartRequestAggregateBuilder mprAggregateRequestBuilder = new MultipartRequestAggregateBuilder();
+                mprAggregateRequestBuilder.setTableId(input.getTableId());
+                mprAggregateRequestBuilder.setOutPort(input.getOutPort().longValue());
+                // TODO: repeating code
+                if (taskContext.getSession().getPrimaryConductor().getVersion() ==
+                        OFConstants.OFP_VERSION_1_3) {
+                    mprAggregateRequestBuilder.setCookie(input.getCookie().getValue());
+                    mprAggregateRequestBuilder.setCookieMask(input.getCookieMask().getValue());
+                    mprAggregateRequestBuilder.setOutGroup(input.getOutGroup());
+                } else {
+                    mprAggregateRequestBuilder.setOutGroup(OFConstants.OFPG_ANY);
+                    mprAggregateRequestBuilder.setCookie(OFConstants.DEFAULT_COOKIE);
+                    mprAggregateRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
+                }
+
+                MatchReactor.getInstance().convert(input.getMatch(), taskContext.getSession()
+                                .getPrimaryConductor().getVersion(), mprAggregateRequestBuilder,
+                        taskContext.getSession().getFeatures().getDatapathId());
+
+                FlowCreatorUtil.setWildcardedFlowMatch(taskContext.getSession()
+                        .getPrimaryConductor().getVersion(), mprAggregateRequestBuilder);
+
+                // Set request body to main multipart request
+                multipartRequestAggregateCaseBuilder.setMultipartRequestAggregate(mprAggregateRequestBuilder.build());
+                MultipartRequestInputBuilder mprInput =
+                        createMultipartHeader(MultipartType.OFPMPAGGREGATE, taskContext, xid);
+                mprInput.setMultipartRequestBody(multipartRequestAggregateCaseBuilder.build());
+                Future<RpcResult<Void>> resultFromOFLib = getMessageService()
+                        .multipartRequest(mprInput.build(), getCookie());
+                ListenableFuture<RpcResult<Void>> resultLib = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
+
+                Futures.addCallback(resultLib, new ResultCallback<GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutput>(result) {
+                    @Override
+                    public GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutput createResult() {
+                        GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutputBuilder aggregFlowStatsFromFlowTableBuilder =
+                                new GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutputBuilder()
+                                        .setTransactionId(new TransactionId(BigInteger.valueOf(xid)));
+                        return aggregFlowStatsFromFlowTableBuilder.build();
                     }
-                };
-        return task;
+                });
+                return result;
+            }
+        }
+
+        return new OFRpcTaskImpl(taskContext, cookie, input);
     }
 
     /**
@@ -1595,42 +1717,48 @@ public abstract class OFRpcTaskFactory {
      */
     public static OFRpcTask<GetFlowTablesStatisticsInput, RpcResult<GetFlowTablesStatisticsOutput>> createGetFlowTablesStatisticsTask(
             final OFRpcTaskContext taskContext, final GetFlowTablesStatisticsInput input, SwitchConnectionDistinguisher cookie) {
-        OFRpcTask<GetFlowTablesStatisticsInput, RpcResult<GetFlowTablesStatisticsOutput>> task =
-                new OFRpcTask<GetFlowTablesStatisticsInput, RpcResult<GetFlowTablesStatisticsOutput>>(taskContext, cookie, input) {
 
+        class OFRpcTaskImpl extends OFRpcTask<GetFlowTablesStatisticsInput, RpcResult<GetFlowTablesStatisticsOutput>> {
+
+            public OFRpcTaskImpl(OFRpcTaskContext taskContext, SwitchConnectionDistinguisher cookie,
+                    GetFlowTablesStatisticsInput input) {
+                super(taskContext, cookie, input);
+            }
+
+            @Override
+            public ListenableFuture<RpcResult<GetFlowTablesStatisticsOutput>> call() throws Exception {
+                final SettableFuture<RpcResult<GetFlowTablesStatisticsOutput>> result = SettableFuture.create();
+
+                final Long xid = taskContext.getSession().getNextXid();
+
+                // 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
+                MultipartRequestInputBuilder mprInput =
+                        createMultipartHeader(MultipartType.OFPMPTABLE, taskContext, xid);
+                mprInput.setMultipartRequestBody(multipartRequestTableCaseBuilder.build());
+                Future<RpcResult<Void>> resultFromOFLib = getMessageService()
+                        .multipartRequest(mprInput.build(), getCookie());
+                ListenableFuture<RpcResult<Void>> resultLib = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
+
+                Futures.addCallback(resultLib, new ResultCallback<GetFlowTablesStatisticsOutput>(result) {
                     @Override
-                    public ListenableFuture<RpcResult<GetFlowTablesStatisticsOutput>> call() throws Exception {
-                        final SettableFuture<RpcResult<GetFlowTablesStatisticsOutput>> result = SettableFuture.create();
-
-                        final Long xid = taskContext.getSession().getNextXid();
-
-                        // 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
-                        MultipartRequestInputBuilder mprInput =
-                                createMultipartHeader(MultipartType.OFPMPTABLE, taskContext, xid);
-                        mprInput.setMultipartRequestBody(multipartRequestTableCaseBuilder.build());
-                        Future<RpcResult<Void>> resultFromOFLib = getMessageService()
-                                .multipartRequest(mprInput.build(), getCookie());
-                        ListenableFuture<RpcResult<Void>> resultLib = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
-
-                        Futures.addCallback(resultLib, new ResultCallback<GetFlowTablesStatisticsOutput>(result) {
-                            @Override
-                            public GetFlowTablesStatisticsOutput createResult() {
-                                GetFlowTablesStatisticsOutputBuilder flowTableStatsBuilder =
-                                        new GetFlowTablesStatisticsOutputBuilder()
-                                                .setTransactionId(new TransactionId(BigInteger.valueOf(xid)));
-                                return flowTableStatsBuilder.build();
-                            }
-                        });
-                        return result;
+                    public GetFlowTablesStatisticsOutput createResult() {
+                        GetFlowTablesStatisticsOutputBuilder flowTableStatsBuilder =
+                                new GetFlowTablesStatisticsOutputBuilder()
+                                        .setTransactionId(new TransactionId(BigInteger.valueOf(xid)));
+                        return flowTableStatsBuilder.build();
                     }
-                };
-        return task;
+                });
+                return result;
+            }
+        }
+
+        return new OFRpcTaskImpl(taskContext, cookie, input);
     }
 
     /**
@@ -1641,44 +1769,50 @@ public abstract class OFRpcTaskFactory {
      */
     public static OFRpcTask<GetAllQueuesStatisticsFromAllPortsInput, RpcResult<GetAllQueuesStatisticsFromAllPortsOutput>> createGetAllQueuesStatisticsFromAllPortsTask(
             final OFRpcTaskContext taskContext, final GetAllQueuesStatisticsFromAllPortsInput input, SwitchConnectionDistinguisher cookie) {
-        OFRpcTask<GetAllQueuesStatisticsFromAllPortsInput, RpcResult<GetAllQueuesStatisticsFromAllPortsOutput>> task =
-                new OFRpcTask<GetAllQueuesStatisticsFromAllPortsInput, RpcResult<GetAllQueuesStatisticsFromAllPortsOutput>>(taskContext, cookie, input) {
 
+        class OFRpcTaskImpl extends OFRpcTask<GetAllQueuesStatisticsFromAllPortsInput, RpcResult<GetAllQueuesStatisticsFromAllPortsOutput>> {
+
+            public OFRpcTaskImpl(OFRpcTaskContext taskContext, SwitchConnectionDistinguisher cookie,
+                    GetAllQueuesStatisticsFromAllPortsInput input) {
+                super(taskContext, cookie, input);
+            }
+
+            @Override
+            public ListenableFuture<RpcResult<GetAllQueuesStatisticsFromAllPortsOutput>> call() throws Exception {
+                final SettableFuture<RpcResult<GetAllQueuesStatisticsFromAllPortsOutput>> result = SettableFuture.create();
+
+                final Long xid = taskContext.getSession().getNextXid();
+
+                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
+                MultipartRequestInputBuilder mprInput =
+                        createMultipartHeader(MultipartType.OFPMPQUEUE, taskContext, xid);
+                mprInput.setMultipartRequestBody(caseBuilder.build());
+                Future<RpcResult<Void>> resultFromOFLib = getMessageService()
+                        .multipartRequest(mprInput.build(), getCookie());
+                ListenableFuture<RpcResult<Void>> resultLib = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
+
+                Futures.addCallback(resultLib, new ResultCallback<GetAllQueuesStatisticsFromAllPortsOutput>(result) {
                     @Override
-                    public ListenableFuture<RpcResult<GetAllQueuesStatisticsFromAllPortsOutput>> call() throws Exception {
-                        final SettableFuture<RpcResult<GetAllQueuesStatisticsFromAllPortsOutput>> result = SettableFuture.create();
-
-                        final Long xid = taskContext.getSession().getNextXid();
-
-                        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
-                        MultipartRequestInputBuilder mprInput =
-                                createMultipartHeader(MultipartType.OFPMPQUEUE, taskContext, xid);
-                        mprInput.setMultipartRequestBody(caseBuilder.build());
-                        Future<RpcResult<Void>> resultFromOFLib = getMessageService()
-                                .multipartRequest(mprInput.build(), getCookie());
-                        ListenableFuture<RpcResult<Void>> resultLib = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
-
-                        Futures.addCallback(resultLib, new ResultCallback<GetAllQueuesStatisticsFromAllPortsOutput>(result) {
-                            @Override
-                            public GetAllQueuesStatisticsFromAllPortsOutput createResult() {
-                                GetAllQueuesStatisticsFromAllPortsOutputBuilder allQueueStatsBuilder =
-                                        new GetAllQueuesStatisticsFromAllPortsOutputBuilder()
-                                                .setTransactionId(new TransactionId(BigInteger.valueOf(xid)));
-                                return allQueueStatsBuilder.build();
-                            }
-                        });
-                        return result;
+                    public GetAllQueuesStatisticsFromAllPortsOutput createResult() {
+                        GetAllQueuesStatisticsFromAllPortsOutputBuilder allQueueStatsBuilder =
+                                new GetAllQueuesStatisticsFromAllPortsOutputBuilder()
+                                        .setTransactionId(new TransactionId(BigInteger.valueOf(xid)));
+                        return allQueueStatsBuilder.build();
                     }
-                };
-        return task;
+                });
+                return result;
+            }
+        }
+
+        return new OFRpcTaskImpl(taskContext, cookie, input);
     }
 
     /**
@@ -1689,46 +1823,52 @@ public abstract class OFRpcTaskFactory {
      */
     public static OFRpcTask<GetAllQueuesStatisticsFromGivenPortInput, RpcResult<GetAllQueuesStatisticsFromGivenPortOutput>> createGetAllQueuesStatisticsFromGivenPortTask(
             final OFRpcTaskContext taskContext, final GetAllQueuesStatisticsFromGivenPortInput input, SwitchConnectionDistinguisher cookie) {
-        OFRpcTask<GetAllQueuesStatisticsFromGivenPortInput, RpcResult<GetAllQueuesStatisticsFromGivenPortOutput>> task =
-                new OFRpcTask<GetAllQueuesStatisticsFromGivenPortInput, RpcResult<GetAllQueuesStatisticsFromGivenPortOutput>>(taskContext, cookie, input) {
 
-                    @Override
-                    public ListenableFuture<RpcResult<GetAllQueuesStatisticsFromGivenPortOutput>> call() throws Exception {
-                        final SettableFuture<RpcResult<GetAllQueuesStatisticsFromGivenPortOutput>> result = SettableFuture.create();
+        class OFRpcTaskImpl extends OFRpcTask<GetAllQueuesStatisticsFromGivenPortInput, RpcResult<GetAllQueuesStatisticsFromGivenPortOutput>> {
 
-                        final Long xid = taskContext.getSession().getNextXid();
+            public OFRpcTaskImpl(OFRpcTaskContext taskContext, SwitchConnectionDistinguisher cookie,
+                    GetAllQueuesStatisticsFromGivenPortInput input) {
+                super(taskContext, cookie, input);
+            }
 
-                        MultipartRequestQueueCaseBuilder caseBuilder = new MultipartRequestQueueCaseBuilder();
-                        MultipartRequestQueueBuilder mprQueueBuilder = new MultipartRequestQueueBuilder();
-                        // Select all queues
-                        mprQueueBuilder.setQueueId(OFConstants.OFPQ_ANY);
-                        // Select specific port
-                        mprQueueBuilder.setPortNo(InventoryDataServiceUtil.portNumberfromNodeConnectorId(
-                                OpenflowVersion.get(taskContext.getSession().getFeatures().getVersion()),
-                                input.getNodeConnectorId()));
-                        caseBuilder.setMultipartRequestQueue(mprQueueBuilder.build());
-
-                        // Set request body to main multipart request
-                        MultipartRequestInputBuilder mprInput =
-                                createMultipartHeader(MultipartType.OFPMPQUEUE, taskContext, xid);
-                        mprInput.setMultipartRequestBody(caseBuilder.build());
-                        Future<RpcResult<Void>> resultFromOFLib = getMessageService()
-                                .multipartRequest(mprInput.build(), getCookie());
-                        ListenableFuture<RpcResult<Void>> resultLib = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
-
-                        Futures.addCallback(resultLib, new ResultCallback<GetAllQueuesStatisticsFromGivenPortOutput>(result) {
-                            @Override
-                            public GetAllQueuesStatisticsFromGivenPortOutput createResult() {
-                                GetAllQueuesStatisticsFromGivenPortOutputBuilder allQueueStatsBuilder =
-                                        new GetAllQueuesStatisticsFromGivenPortOutputBuilder()
-                                                .setTransactionId(new TransactionId(BigInteger.valueOf(xid)));
-                                return allQueueStatsBuilder.build();
-                            }
-                        });
-                        return result;
+            @Override
+            public ListenableFuture<RpcResult<GetAllQueuesStatisticsFromGivenPortOutput>> call() throws Exception {
+                final SettableFuture<RpcResult<GetAllQueuesStatisticsFromGivenPortOutput>> result = SettableFuture.create();
+
+                final Long xid = taskContext.getSession().getNextXid();
+
+                MultipartRequestQueueCaseBuilder caseBuilder = new MultipartRequestQueueCaseBuilder();
+                MultipartRequestQueueBuilder mprQueueBuilder = new MultipartRequestQueueBuilder();
+                // Select all queues
+                mprQueueBuilder.setQueueId(OFConstants.OFPQ_ANY);
+                // Select specific port
+                mprQueueBuilder.setPortNo(InventoryDataServiceUtil.portNumberfromNodeConnectorId(
+                        OpenflowVersion.get(taskContext.getSession().getFeatures().getVersion()),
+                        input.getNodeConnectorId()));
+                caseBuilder.setMultipartRequestQueue(mprQueueBuilder.build());
+
+                // Set request body to main multipart request
+                MultipartRequestInputBuilder mprInput =
+                        createMultipartHeader(MultipartType.OFPMPQUEUE, taskContext, xid);
+                mprInput.setMultipartRequestBody(caseBuilder.build());
+                Future<RpcResult<Void>> resultFromOFLib = getMessageService()
+                        .multipartRequest(mprInput.build(), getCookie());
+                ListenableFuture<RpcResult<Void>> resultLib = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
+
+                Futures.addCallback(resultLib, new ResultCallback<GetAllQueuesStatisticsFromGivenPortOutput>(result) {
+                    @Override
+                    public GetAllQueuesStatisticsFromGivenPortOutput createResult() {
+                        GetAllQueuesStatisticsFromGivenPortOutputBuilder allQueueStatsBuilder =
+                                new GetAllQueuesStatisticsFromGivenPortOutputBuilder()
+                                        .setTransactionId(new TransactionId(BigInteger.valueOf(xid)));
+                        return allQueueStatsBuilder.build();
                     }
-                };
-        return task;
+                });
+                return result;
+            }
+        }
+
+        return new OFRpcTaskImpl(taskContext, cookie, input);
     }
 
     /**
@@ -1739,46 +1879,52 @@ public abstract class OFRpcTaskFactory {
      */
     public static OFRpcTask<GetQueueStatisticsFromGivenPortInput, RpcResult<GetQueueStatisticsFromGivenPortOutput>> createGetQueueStatisticsFromGivenPortTask(
             final OFRpcTaskContext taskContext, final GetQueueStatisticsFromGivenPortInput input, SwitchConnectionDistinguisher cookie) {
-        OFRpcTask<GetQueueStatisticsFromGivenPortInput, RpcResult<GetQueueStatisticsFromGivenPortOutput>> task =
-                new OFRpcTask<GetQueueStatisticsFromGivenPortInput, RpcResult<GetQueueStatisticsFromGivenPortOutput>>(taskContext, cookie, input) {
 
-                    @Override
-                    public ListenableFuture<RpcResult<GetQueueStatisticsFromGivenPortOutput>> call() throws Exception {
-                        final SettableFuture<RpcResult<GetQueueStatisticsFromGivenPortOutput>> result = SettableFuture.create();
+        class OFRpcTaskImpl extends OFRpcTask<GetQueueStatisticsFromGivenPortInput, RpcResult<GetQueueStatisticsFromGivenPortOutput>> {
+
+            public OFRpcTaskImpl(OFRpcTaskContext taskContext, SwitchConnectionDistinguisher cookie,
+                    GetQueueStatisticsFromGivenPortInput input) {
+                super(taskContext, cookie, input);
+            }
 
-                        final Long xid = taskContext.getSession().getNextXid();
+            @Override
+            public ListenableFuture<RpcResult<GetQueueStatisticsFromGivenPortOutput>> call() throws Exception {
+                final SettableFuture<RpcResult<GetQueueStatisticsFromGivenPortOutput>> result = SettableFuture.create();
 
-                        MultipartRequestQueueCaseBuilder caseBuilder = new MultipartRequestQueueCaseBuilder();
-                        MultipartRequestQueueBuilder mprQueueBuilder = new MultipartRequestQueueBuilder();
-                        // Select specific queue
-                        mprQueueBuilder.setQueueId(input.getQueueId().getValue());
-                        // Select specific port
-                        mprQueueBuilder.setPortNo(InventoryDataServiceUtil.portNumberfromNodeConnectorId(
-                                OpenflowVersion.get(taskContext.getSession().getFeatures().getVersion()),
-                                input.getNodeConnectorId()));
-                        caseBuilder.setMultipartRequestQueue(mprQueueBuilder.build());
-
-                        // Set request body to main multipart request
-                        MultipartRequestInputBuilder mprInput =
-                                createMultipartHeader(MultipartType.OFPMPQUEUE, taskContext, xid);
-                        mprInput.setMultipartRequestBody(caseBuilder.build());
-                        Future<RpcResult<Void>> resultFromOFLib = getMessageService()
-                                .multipartRequest(mprInput.build(), getCookie());
-                        ListenableFuture<RpcResult<Void>> resultLib = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
-
-                        Futures.addCallback(resultLib, new ResultCallback<GetQueueStatisticsFromGivenPortOutput>(result) {
-                            @Override
-                            public GetQueueStatisticsFromGivenPortOutput createResult() {
-                                GetQueueStatisticsFromGivenPortOutputBuilder queueStatsFromPortBuilder =
-                                        new GetQueueStatisticsFromGivenPortOutputBuilder()
-                                                .setTransactionId(new TransactionId(BigInteger.valueOf(xid)));
-                                return queueStatsFromPortBuilder.build();
-                            }
-                        });
-                        return result;
+                final Long xid = taskContext.getSession().getNextXid();
+
+                MultipartRequestQueueCaseBuilder caseBuilder = new MultipartRequestQueueCaseBuilder();
+                MultipartRequestQueueBuilder mprQueueBuilder = new MultipartRequestQueueBuilder();
+                // Select specific queue
+                mprQueueBuilder.setQueueId(input.getQueueId().getValue());
+                // Select specific port
+                mprQueueBuilder.setPortNo(InventoryDataServiceUtil.portNumberfromNodeConnectorId(
+                        OpenflowVersion.get(taskContext.getSession().getFeatures().getVersion()),
+                        input.getNodeConnectorId()));
+                caseBuilder.setMultipartRequestQueue(mprQueueBuilder.build());
+
+                // Set request body to main multipart request
+                MultipartRequestInputBuilder mprInput =
+                        createMultipartHeader(MultipartType.OFPMPQUEUE, taskContext, xid);
+                mprInput.setMultipartRequestBody(caseBuilder.build());
+                Future<RpcResult<Void>> resultFromOFLib = getMessageService()
+                        .multipartRequest(mprInput.build(), getCookie());
+                ListenableFuture<RpcResult<Void>> resultLib = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
+
+                Futures.addCallback(resultLib, new ResultCallback<GetQueueStatisticsFromGivenPortOutput>(result) {
+                    @Override
+                    public GetQueueStatisticsFromGivenPortOutput createResult() {
+                        GetQueueStatisticsFromGivenPortOutputBuilder queueStatsFromPortBuilder =
+                                new GetQueueStatisticsFromGivenPortOutputBuilder()
+                                        .setTransactionId(new TransactionId(BigInteger.valueOf(xid)));
+                        return queueStatsFromPortBuilder.build();
                     }
-                };
-        return task;
+                });
+                return result;
+            }
+        }
+
+        return new OFRpcTaskImpl(taskContext, cookie, input);
     }
 
     static MultipartRequestInputBuilder createMultipartHeader(MultipartType multipart,
@@ -1791,7 +1937,7 @@ public abstract class OFRpcTaskFactory {
         return mprInput;
     }
 
-    private static abstract class ResultCallback<T> implements FutureCallback<RpcResult<Void>> {
+    private abstract static class ResultCallback<T> implements FutureCallback<RpcResult<Void>> {
 
         private SettableFuture<RpcResult<T>> result;
 
@@ -1829,31 +1975,35 @@ public abstract class OFRpcTaskFactory {
     public static OFRpcTask<UpdatePortInput, RpcResult<UpdatePortOutput>> createUpdatePortTask(
             final OFRpcTaskContext taskContext, final UpdatePortInput input,
             final SwitchConnectionDistinguisher cookie) {
-        OFRpcTask<UpdatePortInput, RpcResult<UpdatePortOutput>> task =
-                new OFRpcTask<UpdatePortInput, RpcResult<UpdatePortOutput>>(taskContext, cookie, input) {
 
-                    @Override
-                    public ListenableFuture<RpcResult<UpdatePortOutput>> call() {
-                        ListenableFuture<RpcResult<UpdatePortOutput>> result = SettableFuture.create();
-                        final Long xid = taskContext.getSession().getNextXid();
-                        Port inputPort = input.getUpdatedPort().getPort().getPort().get(0);
+        class OFRpcTaskImpl extends OFRpcTask<UpdatePortInput, RpcResult<UpdatePortOutput>> {
 
-                        PortModInput ofPortModInput = PortConvertor.toPortModInput(inputPort,
-                                taskContext.getSession().getPrimaryConductor().getVersion());
+            public OFRpcTaskImpl(OFRpcTaskContext taskContext, SwitchConnectionDistinguisher cookie,
+                    UpdatePortInput input) {
+                super(taskContext, cookie, input);
+            }
 
-                        PortModInputBuilder mdInput = new PortModInputBuilder(ofPortModInput);
-                        mdInput.setXid(xid);
+            @Override
+            public ListenableFuture<RpcResult<UpdatePortOutput>> call() {
+                ListenableFuture<RpcResult<UpdatePortOutput>> result = SettableFuture.create();
+                final Long xid = taskContext.getSession().getNextXid();
+                Port inputPort = input.getUpdatedPort().getPort().getPort().get(0);
 
-                        Future<RpcResult<UpdatePortOutput>> resultFromOFLib = getMessageService()
-                                .portMod(mdInput.build(), cookie);
-                        result = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
+                PortModInput ofPortModInput = PortConvertor.toPortModInput(inputPort,
+                        taskContext.getSession().getPrimaryConductor().getVersion());
 
-                        return result;
-                    }
-                };
+                PortModInputBuilder mdInput = new PortModInputBuilder(ofPortModInput);
+                mdInput.setXid(xid);
+
+                Future<RpcResult<UpdatePortOutput>> resultFromOFLib = getMessageService()
+                        .portMod(mdInput.build(), cookie);
+                result = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
 
-        return task;
+                return result;
+            }
+        }
 
+        return new OFRpcTaskImpl(taskContext, cookie, input);
     }
 
     /**
@@ -1865,50 +2015,62 @@ public abstract class OFRpcTaskFactory {
     public static OFRpcTask<UpdateTableInput, RpcResult<UpdateTableOutput>> createUpdateTableTask(
             final OFRpcTaskContext taskContext, final UpdateTableInput input,
             final SwitchConnectionDistinguisher cookie) {
-        OFRpcTask<UpdateTableInput, RpcResult<UpdateTableOutput>> task =
-                new OFRpcTask<UpdateTableInput, RpcResult<UpdateTableOutput>>(taskContext, cookie, input) {
 
+        class OFRpcTaskImpl extends OFRpcTask<UpdateTableInput, RpcResult<UpdateTableOutput>> {
+
+            public OFRpcTaskImpl(OFRpcTaskContext taskContext, SwitchConnectionDistinguisher cookie,
+                    UpdateTableInput input) {
+                super(taskContext, cookie, input);
+            }
+
+            @Override
+            public ListenableFuture<RpcResult<UpdateTableOutput>> call() {
+                final SettableFuture<RpcResult<UpdateTableOutput>> result = SettableFuture.create();
+
+                final Long xid = taskContext.getSession().getNextXid();
+
+                MultipartRequestTableFeaturesCaseBuilder caseBuilder = new MultipartRequestTableFeaturesCaseBuilder();
+                MultipartRequestTableFeaturesBuilder requestBuilder = new MultipartRequestTableFeaturesBuilder();
+                List<TableFeatures> ofTableFeatureList = TableFeaturesConvertor
+                        .toTableFeaturesRequest(input.getUpdatedTable());
+                requestBuilder.setTableFeatures(ofTableFeatureList);
+                caseBuilder.setMultipartRequestTableFeatures(requestBuilder.build());
+
+                // Set request body to main multipart request
+                MultipartRequestInputBuilder mprInput =
+                        createMultipartHeader(MultipartType.OFPMPTABLEFEATURES, taskContext, xid);
+                mprInput.setMultipartRequestBody(caseBuilder.build());
+
+                Future<RpcResult<Void>> resultFromOFLib = getMessageService()
+                        .multipartRequest(mprInput.build(), getCookie());
+                ListenableFuture<RpcResult<Void>> resultLib = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
+
+                Futures.addCallback(resultLib, new ResultCallback<UpdateTableOutput>(result) {
                     @Override
-                    public ListenableFuture<RpcResult<UpdateTableOutput>> call() {
-                        final SettableFuture<RpcResult<UpdateTableOutput>> result = SettableFuture.create();
-
-                        final Long xid = taskContext.getSession().getNextXid();
-
-                        MultipartRequestTableFeaturesCaseBuilder caseBuilder = new MultipartRequestTableFeaturesCaseBuilder();
-                        MultipartRequestTableFeaturesBuilder requestBuilder = new MultipartRequestTableFeaturesBuilder();
-                        List<TableFeatures> ofTableFeatureList = TableFeaturesConvertor
-                                .toTableFeaturesRequest(input.getUpdatedTable());
-                        requestBuilder.setTableFeatures(ofTableFeatureList);
-                        caseBuilder.setMultipartRequestTableFeatures(requestBuilder.build());
-
-                        // Set request body to main multipart request
-                        MultipartRequestInputBuilder mprInput =
-                                createMultipartHeader(MultipartType.OFPMPTABLEFEATURES, taskContext, xid);
-                        mprInput.setMultipartRequestBody(caseBuilder.build());
-
-                        Future<RpcResult<Void>> resultFromOFLib = getMessageService()
-                                .multipartRequest(mprInput.build(), getCookie());
-                        ListenableFuture<RpcResult<Void>> resultLib = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
-
-                        Futures.addCallback(resultLib, new ResultCallback<UpdateTableOutput>(result) {
-                            @Override
-                            public UpdateTableOutput createResult() {
-                                UpdateTableOutputBuilder queueStatsFromPortBuilder =
-                                        new UpdateTableOutputBuilder()
-                                                .setTransactionId(new TransactionId(BigInteger.valueOf(xid)));
-                                return queueStatsFromPortBuilder.build();
-                            }
-                        });
-                        return result;
+                    public UpdateTableOutput createResult() {
+                        UpdateTableOutputBuilder queueStatsFromPortBuilder =
+                                new UpdateTableOutputBuilder()
+                                        .setTransactionId(new TransactionId(BigInteger.valueOf(xid)));
+                        return queueStatsFromPortBuilder.build();
                     }
-                };
-        return task;
+                });
+                return result;
+            }
+        }
+
+        return new OFRpcTaskImpl(taskContext, cookie, input);
     }
 
     public static OFRpcTask<SetConfigInput, RpcResult<SetConfigOutput>> createSetNodeConfigTask(final OFRpcTaskContext taskContext,
                                                                                                 final SetConfigInput input,
                                                                                                 final SwitchConnectionDistinguisher cookie) {
-        OFRpcTask<SetConfigInput, RpcResult<SetConfigOutput>> rpcTask = new OFRpcTask<SetConfigInput, RpcResult<SetConfigOutput>>(taskContext, cookie, input) {
+        class OFRpcTaskImpl extends OFRpcTask<SetConfigInput, RpcResult<SetConfigOutput>> {
+
+            public OFRpcTaskImpl(OFRpcTaskContext taskContext, SwitchConnectionDistinguisher cookie,
+                    SetConfigInput input) {
+                super(taskContext, cookie, input);
+            }
+
             @Override
             public ListenableFuture<RpcResult<SetConfigOutput>> call() throws Exception {
 
@@ -1932,7 +2094,8 @@ public abstract class OFRpcTaskFactory {
                 });
                 return result;
             }
-        };
-        return rpcTask;
+        }
+
+        return new OFRpcTaskImpl(taskContext, cookie, input);
     }
 }