diff --git a/drivers/hp/BUILD b/drivers/hp/BUILD
index bba0b3f..2a11d90 100644
--- a/drivers/hp/BUILD
+++ b/drivers/hp/BUILD
@@ -3,6 +3,7 @@
     "//drivers/default:onos-drivers-default",
     "//drivers/utilities:onos-drivers-utilities",
     "//protocols/openflow/api:onos-protocols-openflow-api",
+    "//core/store/serializers:onos-core-serializers",
 ]
 
 osgi_jar_with_tests(
diff --git a/drivers/hp/src/main/java/org/onosproject/drivers/hp/AbstractHPPipeline.java b/drivers/hp/src/main/java/org/onosproject/drivers/hp/AbstractHPPipeline.java
index 51c4f7f..7979ab1 100644
--- a/drivers/hp/src/main/java/org/onosproject/drivers/hp/AbstractHPPipeline.java
+++ b/drivers/hp/src/main/java/org/onosproject/drivers/hp/AbstractHPPipeline.java
@@ -20,7 +20,6 @@
 import com.google.common.cache.CacheBuilder;
 import com.google.common.cache.RemovalCause;
 import com.google.common.cache.RemovalNotification;
-import com.google.common.collect.ImmutableList;
 import org.onlab.osgi.ServiceDirectory;
 import org.onlab.util.KryoNamespace;
 import org.onosproject.core.ApplicationId;
@@ -57,16 +56,17 @@
 import org.onosproject.net.flowobjective.NextObjective;
 import org.onosproject.net.flowobjective.Objective;
 import org.onosproject.net.flowobjective.ObjectiveError;
-import org.onosproject.net.group.DefaultGroupKey;
 import org.onosproject.net.group.Group;
-import org.onosproject.net.group.GroupKey;
 import org.onosproject.net.group.GroupService;
 import org.onosproject.net.meter.MeterService;
+import org.onosproject.store.serializers.KryoNamespaces;
 import org.slf4j.Logger;
 
-import java.util.HashSet;
-import java.util.List;
 import java.util.Set;
+import java.util.HashSet;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
 import java.util.concurrent.TimeUnit;
 
 import static org.onosproject.net.flow.FlowRule.Builder;
@@ -131,6 +131,8 @@
  * - Handling of IP Fragments: OFPC_IP_REASM, OFPC_FRAG_REASM - TODO
  *
  * TODO MINOR: include above actions in the lists of unsupported features
+ * TODO MINOR: check pre-requites in flow match
+ *
  *
  * With current implementation, in case of unsupported features a WARNING message in generated
  * in the ONOS log, but FlowRule is sent anyway to the device.
@@ -163,9 +165,7 @@
     protected Device device;
     protected String deviceHwVersion;
     protected KryoNamespace appKryo = new KryoNamespace.Builder()
-            .register(GroupKey.class)
-            .register(DefaultGroupKey.class)
-            .register(byte[].class)
+            .register(KryoNamespaces.API)
             .build("AbstractHPPipeline");
     private ServiceDirectory serviceDirectory;
     private CoreService coreService;
@@ -213,18 +213,20 @@
      * Table 0 is just a shortcut to table 100
      * Table 100/200 are respectively used for rules processed in HARDWARE/SOFTWARE
      *
-     * @param fwd ForwardingObjective
+     * @param selector TrafficSelector including flow match
+     * @param treatment TrafficTreatment including instructions/actions
      * @return table id
      */
-    protected abstract int tableIdForForwardingObjective(ForwardingObjective fwd);
+    protected abstract int tableIdForForwardingObjective(TrafficSelector selector, TrafficTreatment treatment);
 
     /**
      * Return TRUE if ForwardingObjective fwd includes unsupported features.
      *
-     * @param fwd ForwardingObjective
+     * @param selector TrafficSelector including flow match
+     * @param treatment TrafficTreatment including instructions/actions
      * @return boolean
      */
-    protected abstract boolean checkUnSupportedFeatures(ForwardingObjective fwd);
+    protected abstract boolean checkUnSupportedFeatures(TrafficSelector selector, TrafficTreatment treatment);
 
     @Override
     public void init(DeviceId deviceId, PipelinerContext context) {
@@ -244,7 +246,7 @@
         deviceHwVersion = device.hwVersion();
 
         //Initialization of model specific features
-        log.info("HP Driver - Initializing unsupported features for switch {}", deviceHwVersion);
+        log.debug("HP Driver - Initializing unsupported features for switch {}", deviceHwVersion);
         initUnSupportedFeatures();
 
         log.debug("HP Driver - Initializing features supported in hardware");
@@ -331,15 +333,12 @@
         flowRuleService.apply(ops.build(new FlowRuleOperationsContext() {
             @Override
             public void onSuccess(FlowRuleOperations ops) {
-                log.trace("HP Driver: provisioned " + rule.toString());
-
-                log.debug("HP Driver: - applyRules onSuccess rule {}", rule.toString());
+                log.trace("HP Driver: - applyRules onSuccess rule {}", rule);
             }
 
             @Override
             public void onError(FlowRuleOperations ops) {
-                log.debug("HP Driver: applyRules onError rule: "
-                        + rule.toString() + " in table: " + rule.tableId());
+                log.trace("HP Driver: applyRules onError rule: " + rule);
             }
         }));
     }
@@ -362,18 +361,17 @@
     public void forward(ForwardingObjective fwd) {
 
         if (fwd.treatment() != null) {
-            // Deal with SPECIFIC and VERSATILE in the same manner.
-
-            /** If UNSUPPORTED features included in ForwardingObjective a warning message is generated.
+            /* If UNSUPPORTED features included in ForwardingObjective a warning message is generated.
              * FlowRule is anyway sent to the device, device will reply with an OFP_ERROR.
              * Moreover, checkUnSupportedFeatures function generates further warnings specifying
              * each unsupported feature.
-             * */
-            if (checkUnSupportedFeatures(fwd)) {
+             */
+            if (checkUnSupportedFeatures(fwd.selector(), fwd.treatment())) {
                 log.warn("HP Driver - specified ForwardingObjective contains UNSUPPORTED FEATURES");
             }
 
-            //Create the FlowRule starting from the ForwardingObjective
+            // Deal with SPECIFIC and VERSATILE in the same manner.
+            // Create the FlowRule starting from the ForwardingObjective
             FlowRule.Builder ruleBuilder = DefaultFlowRule.builder()
                     .forDevice(deviceId)
                     .withSelector(fwd.selector())
@@ -381,8 +379,8 @@
                     .withPriority(fwd.priority())
                     .fromApp(fwd.appId());
 
-            //Table to be used depends on the specific switch hardware and ForwardingObjective
-            ruleBuilder.forTable(tableIdForForwardingObjective(fwd));
+            // Determine the table to be used depends on selector, treatment and specific switch hardware
+            ruleBuilder.forTable(tableIdForForwardingObjective(fwd.selector(), fwd.treatment()));
 
             if (fwd.permanent()) {
                 ruleBuilder.makePermanent();
@@ -390,8 +388,7 @@
                 ruleBuilder.makeTemporary(fwd.timeout());
             }
 
-            log.debug("HP Driver - installing fwd.treatment {}", fwd.toString());
-
+            log.debug("HP Driver - installing ForwadingObjective arrived with treatment {}", fwd);
             installObjective(ruleBuilder, fwd);
 
         } else {
@@ -415,18 +412,19 @@
                     treatment = appKryo.deserialize(next.data());
                 } else {
                     pendingAddNext.invalidate(fwd.nextId());
-                    treatment = nextObjective.next().iterator().next();
+                    treatment = getTreatment(nextObjective);
+                    if (treatment == null) {
+                        fwd.context().ifPresent(c -> c.onError(fwd, ObjectiveError.UNSUPPORTED));
+                        return;
+                    }
                 }
             } else {
                 // We get the NextGroup from the remove operation.
                 // Doing an operation on the store seems to be very expensive.
-                next = flowObjectiveStore.removeNextGroup(fwd.nextId());
-                if (next == null) {
-                    fwd.context().ifPresent(c -> c.onError(fwd, ObjectiveError.GROUPMISSING));
-                    return;
-                }
-                treatment = appKryo.deserialize(next.data());
+                next = flowObjectiveStore.getNextGroup(fwd.nextId());
+                treatment = (next != null) ? appKryo.deserialize(next.data()) : null;
             }
+
             // If the treatment is null we cannot re-build the original flow
             if (treatment == null) {
                 fwd.context().ifPresent(c -> c.onError(fwd, ObjectiveError.GROUPMISSING));
@@ -439,11 +437,26 @@
                     .fromApp(fwd.appId())
                     .withPriority(fwd.priority())
                     .withTreatment(treatment);
+
+            /* If UNSUPPORTED features included in ForwardingObjective a warning message is generated.
+             * FlowRule is anyway sent to the device, device will reply with an OFP_ERROR.
+             * Moreover, checkUnSupportedFeatures function generates further warnings specifying
+             * each unsupported feature.
+             */
+            if (checkUnSupportedFeatures(fwd.selector(), treatment)) {
+                log.warn("HP Driver - specified ForwardingObjective contains UNSUPPORTED FEATURES");
+            }
+
+            //Table to be used depends on the specific switch hardware and ForwardingObjective
+            ruleBuilder.forTable(tableIdForForwardingObjective(fwd.selector(), treatment));
+
             if (fwd.permanent()) {
                 ruleBuilder.makePermanent();
             } else {
                 ruleBuilder.makeTemporary(fwd.timeout());
             }
+
+            log.debug("HP Driver - installing ForwadingObjective arrived with NULL treatment (intent)");
             installObjective(ruleBuilder, fwd);
         }
     }
@@ -459,21 +472,15 @@
 
         switch (objective.op()) {
             case ADD:
-                log.trace("HP Driver - Requested ADD of objective " + objective.toString());
-                FlowRule addRule = ruleBuilder.build();
-
-                log.trace("HP Driver - built rule is " + addRule.toString());
-                flowBuilder.add(addRule);
+                log.trace("HP Driver - Requested ADD of objective to device " + deviceId);
+                flowBuilder.add(ruleBuilder.build());
                 break;
             case REMOVE:
-                log.trace("HP Driver - Requested REMOVE of objective " + objective.toString());
-                FlowRule removeRule = ruleBuilder.build();
-
-                log.trace("HP Driver - built rule is " + removeRule.toString());
-                flowBuilder.remove(removeRule);
+                log.trace("HP Driver - Requested REMOVE of objective to device " + deviceId);
+                flowBuilder.remove(ruleBuilder.build());
                 break;
             default:
-                log.warn("HP Driver - Unknown operation {}", objective.op());
+                log.debug("HP Driver - Unknown operation {}", objective.op());
         }
 
         flowRuleService.apply(flowBuilder.build(new FlowRuleOperationsContext() {
@@ -496,6 +503,7 @@
     public void next(NextObjective nextObjective) {
         switch (nextObjective.op()) {
             case ADD:
+                log.debug("HP driver: NextObjective ADDED");
                 // We insert the value in the cache
                 pendingAddNext.put(nextObjective.id(), nextObjective);
                 // Then in the store, this will unblock the queued fwd obj
@@ -505,9 +513,16 @@
                 );
                 break;
             case REMOVE:
+                log.debug("HP driver: NextObjective REMOVED");
+                NextGroup next = flowObjectiveStore.removeNextGroup(nextObjective.id());
+                if (next == null) {
+                    nextObjective.context().ifPresent(context -> context.onError(nextObjective,
+                            ObjectiveError.GROUPMISSING));
+                    return;
+                }
                 break;
             default:
-                log.warn("Unsupported operation {}", nextObjective.op());
+                log.debug("Unsupported operation {}", nextObjective.op());
         }
         nextObjective.context().ifPresent(context -> context.onSuccess(nextObjective));
     }
@@ -515,7 +530,7 @@
     @Override
     public List<String> getNextMappings(NextGroup nextGroup) {
         //TODO: to be implemented
-        return ImmutableList.of();
+        return Collections.emptyList();
     }
 
     @Override
@@ -530,6 +545,37 @@
     }
 
     /**
+     * Gets traffic treatment from a next objective.
+     * Merge traffic treatments from next objective if the next objective is
+     * BROADCAST type and contains multiple traffic treatments.
+     * Returns first treatment from next objective if the next objective is
+     * SIMPLE type and it contains only one treatment.
+     *
+     * @param nextObjective the next objective
+     * @return the treatment from next objective; null if not supported
+     */
+    private TrafficTreatment getTreatment(NextObjective nextObjective) {
+        Collection<TrafficTreatment> treatments = nextObjective.next();
+        switch (nextObjective.type()) {
+            case SIMPLE:
+                if (treatments.size() != 1) {
+                    log.error("Next Objectives of type SIMPLE should have only " +
+                                    "one traffic treatment. NexObjective: {}",
+                            nextObjective.toString());
+                    return null;
+                }
+                return treatments.iterator().next();
+            case BROADCAST:
+                TrafficTreatment.Builder builder = DefaultTrafficTreatment.builder();
+                treatments.forEach(builder::addTreatment);
+                return builder.build();
+            default:
+                log.error("Unsupported next objective type {}.", nextObjective.type());
+                return null;
+        }
+    }
+
+    /**
      * Filter processing and installation.
      * Processes and installs filtering rules.
      *
diff --git a/drivers/hp/src/main/java/org/onosproject/drivers/hp/HPPipelineV1.java b/drivers/hp/src/main/java/org/onosproject/drivers/hp/HPPipelineV1.java
index 27a585b..37b66df 100644
--- a/drivers/hp/src/main/java/org/onosproject/drivers/hp/HPPipelineV1.java
+++ b/drivers/hp/src/main/java/org/onosproject/drivers/hp/HPPipelineV1.java
@@ -19,6 +19,8 @@
 import org.onlab.packet.Ethernet;
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.flow.FlowRule;
+import org.onosproject.net.flow.TrafficSelector;
+import org.onosproject.net.flow.TrafficTreatment;
 import org.onosproject.net.flow.criteria.Criterion;
 import org.onosproject.net.flow.criteria.EthCriterion;
 import org.onosproject.net.flow.criteria.EthTypeCriterion;
@@ -30,7 +32,6 @@
 import org.onosproject.net.flow.instructions.L2ModificationInstruction;
 import org.onosproject.net.flow.instructions.L3ModificationInstruction;
 import org.onosproject.net.flowobjective.FilteringObjective;
-import org.onosproject.net.flowobjective.ForwardingObjective;
 import org.slf4j.Logger;
 
 import static org.slf4j.LoggerFactory.getLogger;
@@ -135,10 +136,10 @@
 
     //Return TRUE if ForwardingObjective fwd includes unsupported features
     @Override
-    protected boolean checkUnSupportedFeatures(ForwardingObjective fwd) {
+    protected boolean checkUnSupportedFeatures(TrafficSelector selector, TrafficTreatment treatment) {
         boolean unsupportedFeatures = false;
 
-        for (Criterion criterion : fwd.selector().criteria()) {
+        for (Criterion criterion : selector.criteria()) {
             if (this.unsupportedCriteria.contains(criterion.type())) {
                 log.warn("HP V1 Driver - unsupported criteria {}", criterion.type());
 
@@ -146,7 +147,7 @@
             }
         }
 
-        for (Instruction instruction : fwd.treatment().allInstructions()) {
+        for (Instruction instruction : treatment.allInstructions()) {
             if (this.unsupportedInstructions.contains(instruction.type())) {
                 log.warn("HP V1 Driver - unsupported instruction {}", instruction.type());
 
@@ -176,13 +177,13 @@
     }
 
     @Override
-    protected int tableIdForForwardingObjective(ForwardingObjective fwd) {
+    protected int tableIdForForwardingObjective(TrafficSelector selector, TrafficTreatment treatment) {
         boolean hardwareProcess = true;
 
         log.debug("HP V1 Driver - Evaluating the ForwardingObjective for proper TableID");
 
         //Check criteria supported in hardware
-        for (Criterion criterion : fwd.selector().criteria()) {
+        for (Criterion criterion : selector.criteria()) {
 
             if (!this.hardwareCriteria.contains(criterion.type())) {
                 log.warn("HP V1 Driver - criterion {} only supported in SOFTWARE", criterion.type());
@@ -206,7 +207,7 @@
             if (criterion.type() == Criterion.Type.IN_PORT) {
                 hardwareProcess = false;
 
-                for (Criterion requiredCriterion : fwd.selector().criteria()) {
+                for (Criterion requiredCriterion : selector.criteria()) {
                     if (requiredCriterion.type() == Criterion.Type.ETH_TYPE) {
                         hardwareProcess = true;
                     }
@@ -222,7 +223,7 @@
         }
 
         //Check if a CLEAR action is included
-        if (fwd.treatment().clearedDeferred()) {
+        if (treatment.clearedDeferred()) {
             log.warn("HP V1 Driver - CLEAR action only supported in SOFTWARE");
 
             hardwareProcess = false;
@@ -231,7 +232,7 @@
         //If criteria can be processed in hardware, then check treatment
         if (hardwareProcess) {
 
-            for (Instruction instruction : fwd.treatment().allInstructions()) {
+            for (Instruction instruction : treatment.allInstructions()) {
 
                 //Check if the instruction type is contained in the hardware instruction
                 if (!this.hardwareInstructions.contains(instruction.type())) {
diff --git a/drivers/hp/src/main/java/org/onosproject/drivers/hp/HPPipelineV2.java b/drivers/hp/src/main/java/org/onosproject/drivers/hp/HPPipelineV2.java
index b82a86d..33e781f 100644
--- a/drivers/hp/src/main/java/org/onosproject/drivers/hp/HPPipelineV2.java
+++ b/drivers/hp/src/main/java/org/onosproject/drivers/hp/HPPipelineV2.java
@@ -19,6 +19,8 @@
 import org.onlab.packet.Ethernet;
 import org.onosproject.core.GroupId;
 import org.onosproject.net.PortNumber;
+import org.onosproject.net.flow.TrafficSelector;
+import org.onosproject.net.flow.TrafficTreatment;
 import org.onosproject.net.flow.FlowRule;
 import org.onosproject.net.flow.criteria.Criterion;
 import org.onosproject.net.flow.criteria.EthCriterion;
@@ -31,7 +33,6 @@
 import org.onosproject.net.flow.instructions.L2ModificationInstruction;
 import org.onosproject.net.flow.instructions.L3ModificationInstruction;
 import org.onosproject.net.flowobjective.FilteringObjective;
-import org.onosproject.net.flowobjective.ForwardingObjective;
 import org.onosproject.net.group.Group;
 
 import org.slf4j.Logger;
@@ -149,10 +150,10 @@
 
     //Return TRUE if ForwardingObjective fwd includes UNSUPPORTED features
     @Override
-    protected boolean checkUnSupportedFeatures(ForwardingObjective fwd) {
+    protected boolean checkUnSupportedFeatures(TrafficSelector selector, TrafficTreatment treatment) {
         boolean unsupportedFeatures = false;
 
-        for (Criterion criterion : fwd.selector().criteria()) {
+        for (Criterion criterion : selector.criteria()) {
             if (this.unsupportedCriteria.contains(criterion.type())) {
                 log.warn("HP V2 Driver - unsupported criteria {}", criterion.type());
 
@@ -160,7 +161,7 @@
             }
         }
 
-        for (Instruction instruction : fwd.treatment().allInstructions()) {
+        for (Instruction instruction : treatment.allInstructions()) {
             if (this.unsupportedInstructions.contains(instruction.type())) {
                 log.warn("HP V2 Driver - unsupported instruction {}", instruction.type());
 
@@ -190,13 +191,13 @@
     }
 
     @Override
-    protected int tableIdForForwardingObjective(ForwardingObjective fwd) {
+    protected int tableIdForForwardingObjective(TrafficSelector selector, TrafficTreatment treatment) {
         boolean hardwareProcess = true;
 
         log.debug("HP V2 Driver - Evaluating the ForwardingObjective for proper TableID");
 
         //Check criteria supported in hardware
-        for (Criterion criterion : fwd.selector().criteria()) {
+        for (Criterion criterion : selector.criteria()) {
 
             if (!this.hardwareCriteria.contains(criterion.type())) {
                 log.warn("HP V2 Driver - criterion {} only supported in SOFTWARE", criterion.type());
@@ -230,7 +231,7 @@
         }
 
         //Check if a CLEAR action is included
-        if (fwd.treatment().clearedDeferred()) {
+        if (treatment.clearedDeferred()) {
             log.warn("HP V2 Driver - CLEAR action only supported in SOFTWARE");
 
             hardwareProcess = false;
@@ -238,7 +239,7 @@
 
         //If criteria can be processed in hardware, then check treatment
         if (hardwareProcess) {
-            for (Instruction instruction : fwd.treatment().allInstructions()) {
+            for (Instruction instruction : treatment.allInstructions()) {
 
                 //Check if the instruction type is contained in the hardware instruction
                 if (!this.hardwareInstructions.contains(instruction.type())) {
@@ -248,7 +249,7 @@
                     break;
                 }
 
-                /** If output is CONTROLLER_PORT the flow entry could be installed in hardware
+                /* If output is CONTROLLER_PORT the flow entry could be installed in hardware
                  * but is anyway processed in software because OPENFLOW header has to be added
                  */
                 if (instruction.type() == Instruction.Type.OUTPUT) {
diff --git a/drivers/hp/src/main/java/org/onosproject/drivers/hp/HPPipelineV3.java b/drivers/hp/src/main/java/org/onosproject/drivers/hp/HPPipelineV3.java
index 9aa4a91..a1012a1 100644
--- a/drivers/hp/src/main/java/org/onosproject/drivers/hp/HPPipelineV3.java
+++ b/drivers/hp/src/main/java/org/onosproject/drivers/hp/HPPipelineV3.java
@@ -20,6 +20,8 @@
 import org.onosproject.core.GroupId;
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.flow.FlowRule;
+import org.onosproject.net.flow.TrafficSelector;
+import org.onosproject.net.flow.TrafficTreatment;
 import org.onosproject.net.flow.criteria.Criterion;
 import org.onosproject.net.flow.criteria.EthCriterion;
 import org.onosproject.net.flow.criteria.EthTypeCriterion;
@@ -32,7 +34,6 @@
 import org.onosproject.net.flow.instructions.L3ModificationInstruction;
 import org.onosproject.net.flow.instructions.L4ModificationInstruction;
 import org.onosproject.net.flowobjective.FilteringObjective;
-import org.onosproject.net.flowobjective.ForwardingObjective;
 import org.onosproject.net.group.Group;
 
 import org.slf4j.Logger;
@@ -158,10 +159,10 @@
 
     //Return TRUE if ForwardingObjective fwd includes UNSUPPORTED features
     @Override
-    protected boolean checkUnSupportedFeatures(ForwardingObjective fwd) {
+    protected boolean checkUnSupportedFeatures(TrafficSelector selector, TrafficTreatment treatment) {
         boolean unsupportedFeatures = false;
 
-        for (Criterion criterion : fwd.selector().criteria()) {
+        for (Criterion criterion : selector.criteria()) {
             if (this.unsupportedCriteria.contains(criterion.type())) {
                 log.warn("HP V3 Driver - unsupported criteria {}", criterion.type());
 
@@ -169,7 +170,7 @@
             }
         }
 
-        for (Instruction instruction : fwd.treatment().allInstructions()) {
+        for (Instruction instruction : treatment.allInstructions()) {
             if (this.unsupportedInstructions.contains(instruction.type())) {
                 log.warn("HP V3 Driver - unsupported instruction {}", instruction.type());
 
@@ -199,13 +200,13 @@
     }
 
     @Override
-    protected int tableIdForForwardingObjective(ForwardingObjective fwd) {
+    protected int tableIdForForwardingObjective(TrafficSelector selector, TrafficTreatment treatment) {
         boolean hardwareProcess = true;
 
         log.debug("HP V3 Driver - Evaluating the ForwardingObjective for proper TableID");
 
         //Check criteria supported in hardware
-        for (Criterion criterion : fwd.selector().criteria()) {
+        for (Criterion criterion : selector.criteria()) {
 
             if (!this.hardwareCriteria.contains(criterion.type())) {
                 log.warn("HP V3 Driver - criterion {} only supported in SOFTWARE", criterion.type());
@@ -237,7 +238,7 @@
 
         //If criteria can be processed in hardware, then check treatment
         if (hardwareProcess) {
-            for (Instruction instruction : fwd.treatment().allInstructions()) {
+            for (Instruction instruction : treatment.allInstructions()) {
 
                 //Check if the instruction type is contained in the hardware instruction
                 if (!this.hardwareInstructions.contains(instruction.type())) {
diff --git a/drivers/hp/src/main/java/org/onosproject/drivers/hp/HPPipelineV3500.java b/drivers/hp/src/main/java/org/onosproject/drivers/hp/HPPipelineV3500.java
index 06e01c1..60a52ab 100644
--- a/drivers/hp/src/main/java/org/onosproject/drivers/hp/HPPipelineV3500.java
+++ b/drivers/hp/src/main/java/org/onosproject/drivers/hp/HPPipelineV3500.java
@@ -19,6 +19,8 @@
 import org.onlab.packet.Ethernet;
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.flow.FlowRule;
+import org.onosproject.net.flow.TrafficSelector;
+import org.onosproject.net.flow.TrafficTreatment;
 import org.onosproject.net.flow.criteria.Criterion;
 import org.onosproject.net.flow.criteria.EthCriterion;
 import org.onosproject.net.flow.criteria.EthTypeCriterion;
@@ -30,7 +32,6 @@
 import org.onosproject.net.flow.instructions.L2ModificationInstruction;
 import org.onosproject.net.flow.instructions.L3ModificationInstruction;
 import org.onosproject.net.flowobjective.FilteringObjective;
-import org.onosproject.net.flowobjective.ForwardingObjective;
 import org.slf4j.Logger;
 
 import static org.slf4j.LoggerFactory.getLogger;
@@ -129,10 +130,10 @@
 
     //Return TRUE if ForwardingObjective fwd includes unsupported features
     @Override
-    protected boolean checkUnSupportedFeatures(ForwardingObjective fwd) {
+    protected boolean checkUnSupportedFeatures(TrafficSelector selector, TrafficTreatment treatment) {
         boolean unsupportedFeatures = false;
 
-        for (Criterion criterion : fwd.selector().criteria()) {
+        for (Criterion criterion : selector.criteria()) {
             if (this.unsupportedCriteria.contains(criterion.type())) {
                 log.warn("HP V3500 Driver - unsupported criteria {}", criterion.type());
 
@@ -140,7 +141,7 @@
             }
         }
 
-        for (Instruction instruction : fwd.treatment().allInstructions()) {
+        for (Instruction instruction : treatment.allInstructions()) {
             if (this.unsupportedInstructions.contains(instruction.type())) {
                 log.warn("HP V3500 Driver - unsupported instruction {}", instruction.type());
 
@@ -170,13 +171,13 @@
     }
 
     @Override
-    protected int tableIdForForwardingObjective(ForwardingObjective fwd) {
+    protected int tableIdForForwardingObjective(TrafficSelector selector, TrafficTreatment treatment) {
         boolean hardwareProcess = true;
 
         log.debug("HP V3500 Driver - Evaluating the ForwardingObjective for proper TableID");
 
         //Check criteria supported in hardware
-        for (Criterion criterion : fwd.selector().criteria()) {
+        for (Criterion criterion : selector.criteria()) {
 
             if (!this.hardwareCriteria.contains(criterion.type())) {
                 log.warn("HP V3500 Driver - criterion {} only supported in SOFTWARE", criterion.type());
@@ -200,7 +201,7 @@
             if (criterion.type() == Criterion.Type.IN_PORT) {
                 hardwareProcess = false;
 
-                for (Criterion requiredCriterion : fwd.selector().criteria()) {
+                for (Criterion requiredCriterion : selector.criteria()) {
                     if (requiredCriterion.type() == Criterion.Type.ETH_TYPE) {
                         hardwareProcess = true;
                     }
@@ -216,7 +217,7 @@
         }
 
         //Check if a CLEAR action is included
-        if (fwd.treatment().clearedDeferred()) {
+        if (treatment.clearedDeferred()) {
             log.warn("HP V3500 Driver - CLEAR action only supported in SOFTWARE");
 
             hardwareProcess = false;
@@ -225,7 +226,7 @@
         //If criteria can be processed in hardware, then check treatment
         if (hardwareProcess) {
 
-            for (Instruction instruction : fwd.treatment().allInstructions()) {
+            for (Instruction instruction : treatment.allInstructions()) {
 
                 //Check if the instruction type is contained in the hardware instruction
                 if (!this.hardwareInstructions.contains(instruction.type())) {
diff --git a/drivers/hp/src/main/java/org/onosproject/drivers/hp/HPPipelineV3800.java b/drivers/hp/src/main/java/org/onosproject/drivers/hp/HPPipelineV3800.java
index fafa06e..15776f5 100644
--- a/drivers/hp/src/main/java/org/onosproject/drivers/hp/HPPipelineV3800.java
+++ b/drivers/hp/src/main/java/org/onosproject/drivers/hp/HPPipelineV3800.java
@@ -20,6 +20,8 @@
 import org.onosproject.core.GroupId;
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.flow.FlowRule;
+import org.onosproject.net.flow.TrafficSelector;
+import org.onosproject.net.flow.TrafficTreatment;
 import org.onosproject.net.flow.criteria.Criterion;
 import org.onosproject.net.flow.criteria.EthCriterion;
 import org.onosproject.net.flow.criteria.EthTypeCriterion;
@@ -31,7 +33,6 @@
 import org.onosproject.net.flow.instructions.L2ModificationInstruction;
 import org.onosproject.net.flow.instructions.L3ModificationInstruction;
 import org.onosproject.net.flowobjective.FilteringObjective;
-import org.onosproject.net.flowobjective.ForwardingObjective;
 import org.onosproject.net.group.Group;
 
 import org.slf4j.Logger;
@@ -143,10 +144,10 @@
 
     //Return TRUE if ForwardingObjective fwd includes UNSUPPORTED features
     @Override
-    protected boolean checkUnSupportedFeatures(ForwardingObjective fwd) {
+    protected boolean checkUnSupportedFeatures(TrafficSelector selector, TrafficTreatment treatment) {
         boolean unsupportedFeatures = false;
 
-        for (Criterion criterion : fwd.selector().criteria()) {
+        for (Criterion criterion : selector.criteria()) {
             if (this.unsupportedCriteria.contains(criterion.type())) {
                 log.warn("HP V3800 Driver - unsupported criteria {}", criterion.type());
 
@@ -154,7 +155,7 @@
             }
         }
 
-        for (Instruction instruction : fwd.treatment().allInstructions()) {
+        for (Instruction instruction : treatment.allInstructions()) {
             if (this.unsupportedInstructions.contains(instruction.type())) {
                 log.warn("HP V3800 Driver - unsupported instruction {}", instruction.type());
 
@@ -184,13 +185,13 @@
     }
 
     @Override
-    protected int tableIdForForwardingObjective(ForwardingObjective fwd) {
+    protected int tableIdForForwardingObjective(TrafficSelector selector, TrafficTreatment treatment) {
         boolean hardwareProcess = true;
 
         log.debug("HP V3800 Driver - Evaluating the ForwardingObjective for proper TableID");
 
         //Check criteria supported in hardware
-        for (Criterion criterion : fwd.selector().criteria()) {
+        for (Criterion criterion : selector.criteria()) {
 
             if (!this.hardwareCriteria.contains(criterion.type())) {
                 log.warn("HP V3800 Driver - criterion {} only supported in SOFTWARE", criterion.type());
@@ -213,7 +214,7 @@
         }
 
         //Check if a CLEAR action is included
-        if (fwd.treatment().clearedDeferred()) {
+        if (treatment.clearedDeferred()) {
             log.warn("HP V3800 Driver - CLEAR action only supported in SOFTWARE");
 
             hardwareProcess = false;
@@ -221,7 +222,7 @@
 
         //If criteria can be processed in hardware, then check treatment
         if (hardwareProcess) {
-            for (Instruction instruction : fwd.treatment().allInstructions()) {
+            for (Instruction instruction : treatment.allInstructions()) {
 
                 //Check if the instruction type is contained in the hardware instruction
                 if (!this.hardwareInstructions.contains(instruction.type())) {
diff --git a/drivers/hp/src/main/java/org/onosproject/drivers/hp/HPSwitchHandshaker.java b/drivers/hp/src/main/java/org/onosproject/drivers/hp/HPSwitchHandshaker.java
index 850a251..0ea05f3 100644
--- a/drivers/hp/src/main/java/org/onosproject/drivers/hp/HPSwitchHandshaker.java
+++ b/drivers/hp/src/main/java/org/onosproject/drivers/hp/HPSwitchHandshaker.java
@@ -16,7 +16,6 @@
 
 package org.onosproject.drivers.hp;
 
-import com.google.common.collect.ImmutableList;
 import org.onosproject.openflow.controller.driver.AbstractOpenFlowSwitch;
 import org.onosproject.openflow.controller.driver.SwitchDriverSubHandshakeAlreadyStarted;
 import org.onosproject.openflow.controller.driver.SwitchDriverSubHandshakeCompleted;
@@ -55,14 +54,14 @@
                 .setOutGroup(OFGroup.ANY)
                 .build();
 
-        sendMsg(ImmutableList.of(fm));
+        sendHandshakeMessage(fm);
 
         OFGroupMod gm = factory().buildGroupDelete()
                 .setGroup(OFGroup.ALL)
                 .setGroupType(OFGroupType.ALL)
                 .build();
 
-        sendMsg(ImmutableList.of(gm));
+        sendHandshakeMessage(gm);
 
         handshakeComplete.set(true);
 
