diff --git a/drivers/src/main/java/org/onosproject/driver/pipeline/SpringOpenTTP.java b/drivers/src/main/java/org/onosproject/driver/pipeline/SpringOpenTTP.java
index bb2315d..68db4ce 100644
--- a/drivers/src/main/java/org/onosproject/driver/pipeline/SpringOpenTTP.java
+++ b/drivers/src/main/java/org/onosproject/driver/pipeline/SpringOpenTTP.java
@@ -49,6 +49,7 @@
 import org.onosproject.net.flow.criteria.EthCriterion;
 import org.onosproject.net.flow.criteria.EthTypeCriterion;
 import org.onosproject.net.flow.criteria.IPCriterion;
+import org.onosproject.net.flow.criteria.IPProtocolCriterion;
 import org.onosproject.net.flow.criteria.MplsCriterion;
 import org.onosproject.net.flow.criteria.PortCriterion;
 import org.onosproject.net.flow.criteria.VlanIdCriterion;
@@ -215,7 +216,7 @@
     public void next(NextObjective nextObjective) {
 
         if (nextObjective.op() == Objective.Operation.REMOVE) {
-            if (nextObjective.next() == null) {
+            if (nextObjective.next().isEmpty()) {
                 removeGroup(nextObjective);
             } else {
                 removeBucketFromGroup(nextObjective);
@@ -369,8 +370,89 @@
     }
 
     private Collection<FlowRule> processVersatile(ForwardingObjective fwd) {
-        fail(fwd, ObjectiveError.UNSUPPORTED);
-        return Collections.emptySet();
+        log.debug("Processing versatile forwarding objective");
+        TrafficSelector selector = fwd.selector();
+
+        EthTypeCriterion ethType =
+                (EthTypeCriterion) selector.getCriterion(Criterion.Type.ETH_TYPE);
+        if (ethType == null) {
+            log.error("Versatile forwarding objective must include ethType");
+            fail(fwd, ObjectiveError.UNKNOWN);
+            return Collections.emptySet();
+        }
+
+        TrafficSelector.Builder filteredSelectorBuilder =
+                DefaultTrafficSelector.builder();
+        if (ethType.ethType() == Ethernet.TYPE_IPV4) {
+            IPCriterion ipSrc = (IPCriterion) selector
+                    .getCriterion(Criterion.Type.IPV4_SRC);
+            IPCriterion ipDst = (IPCriterion) selector
+                    .getCriterion(Criterion.Type.IPV4_DST);
+            IPProtocolCriterion ipProto = (IPProtocolCriterion) selector
+                    .getCriterion(Criterion.Type.IP_PROTO);
+
+            filteredSelectorBuilder
+                    .matchEthType(Ethernet.TYPE_IPV4);
+
+            if (ipSrc != null) {
+                filteredSelectorBuilder.matchIPSrc(ipSrc.ip());
+            }
+            if (ipDst != null) {
+                filteredSelectorBuilder.matchIPDst(ipDst.ip());
+            }
+            if (ipProto != null) {
+                filteredSelectorBuilder.matchIPProtocol(
+                        Short.valueOf(ipProto.protocol()).byteValue());
+            }
+
+            log.debug("processing IPv4 specific forwarding objective");
+        } else {
+            log.warn("VERSATILE forwarding objective does not support {} yet.",
+                    ethType.ethType());
+            return Collections.emptySet();
+        }
+
+        TrafficTreatment.Builder treatmentBuilder = DefaultTrafficTreatment
+                .builder();
+        treatmentBuilder.wipeDeferred();
+
+        if (fwd.nextId() != null) {
+            NextGroup next = flowObjectiveStore.getNextGroup(fwd.nextId());
+
+            if (next != null) {
+                GroupKey key = appKryo.deserialize(next.data());
+
+                Group group = groupService.getGroup(deviceId, key);
+
+                if (group == null) {
+                    log.warn("The group left!");
+                    fail(fwd, ObjectiveError.GROUPMISSING);
+                    return Collections.emptySet();
+                }
+                treatmentBuilder.deferred().group(group.id());
+                log.debug("Adding OUTGROUP action");
+            }
+        } else {
+            log.warn("VERSATILE forwarding objective need next objective ID.");
+            return Collections.emptySet();
+        }
+
+        TrafficSelector filteredSelector = filteredSelectorBuilder.build();
+        TrafficTreatment treatment = treatmentBuilder.build();
+
+        FlowRule.Builder ruleBuilder = DefaultFlowRule.builder()
+                .fromApp(fwd.appId()).withPriority(fwd.priority())
+                .forDevice(deviceId).withSelector(filteredSelector)
+                .withTreatment(treatment);
+
+        if (fwd.permanent()) {
+            ruleBuilder.makePermanent();
+        } else {
+            ruleBuilder.makeTemporary(fwd.timeout());
+        }
+
+        ruleBuilder.forTable(aclTableId);
+        return Collections.singletonList(ruleBuilder.build());
     }
 
     protected Collection<FlowRule> processSpecific(ForwardingObjective fwd) {
@@ -434,7 +516,7 @@
                     fail(fwd, ObjectiveError.GROUPMISSING);
                     return Collections.emptySet();
                 }
-                treatmentBuilder.group(group.id());
+                treatmentBuilder.deferred().group(group.id());
                 log.debug("Adding OUTGROUP action");
             } else {
                 log.warn("processSpecific: No associated next objective object");
