diff --git a/pipelines/fabric/impl/src/main/java/org/onosproject/pipelines/fabric/impl/behaviour/pipeliner/FabricPipeliner.java b/pipelines/fabric/impl/src/main/java/org/onosproject/pipelines/fabric/impl/behaviour/pipeliner/FabricPipeliner.java
index eac2116..79045f1 100644
--- a/pipelines/fabric/impl/src/main/java/org/onosproject/pipelines/fabric/impl/behaviour/pipeliner/FabricPipeliner.java
+++ b/pipelines/fabric/impl/src/main/java/org/onosproject/pipelines/fabric/impl/behaviour/pipeliner/FabricPipeliner.java
@@ -50,6 +50,7 @@
 import java.util.stream.Collectors;
 
 import static java.lang.String.format;
+import static org.onosproject.net.flowobjective.NextObjective.Type.SIMPLE;
 import static org.onosproject.pipelines.fabric.impl.behaviour.FabricUtils.outputPort;
 import static org.slf4j.LoggerFactory.getLogger;
 
@@ -128,9 +129,12 @@
             return;
         }
 
-        if (obj.op() == Objective.Operation.MODIFY) {
-            // TODO: support MODIFY operation
-            log.warn("MODIFY operation not yet supported for NextObjective, will return failure :(");
+        if (obj.op() == Objective.Operation.MODIFY && obj.type() != SIMPLE) {
+            log.warn("MODIFY operation not yet supported for NextObjective {}, will return failure :(",
+                    obj.type());
+            if (log.isTraceEnabled()) {
+                log.trace("Objective {}", obj);
+            }
             fail(obj, ObjectiveError.UNSUPPORTED);
             return;
         }
@@ -182,10 +186,16 @@
         if (flowRules.isEmpty()) {
             return;
         }
+
+        if (log.isTraceEnabled()) {
+            log.trace("Objective {} -> Flows {}", objective, flowRules);
+        }
+
         final FlowRuleOperations.Builder ops = FlowRuleOperations.builder();
         switch (objective.op()) {
             case ADD:
             case ADD_TO_EXISTING:
+            case MODIFY:
                 flowRules.forEach(ops::add);
                 break;
             case REMOVE:
@@ -193,7 +203,7 @@
                 flowRules.forEach(ops::remove);
                 break;
             default:
-                log.warn("Unsupported Objective operation '{}'", objective.op());
+                log.warn("Unsupported Objective operation {}", objective.op());
                 return;
         }
         flowRuleService.apply(ops.build());
@@ -203,6 +213,11 @@
         if (groups.isEmpty()) {
             return;
         }
+
+        if (log.isTraceEnabled()) {
+            log.trace("Objective {} -> Groups {}", objective, groups);
+        }
+
         switch (objective.op()) {
             case ADD:
                 groups.forEach(groupService::addGroup);
@@ -223,6 +238,14 @@
                         group.appCookie(), group.appId())
                 );
                 break;
+            case MODIFY:
+                // Modify is only supported for simple next objective
+                // Replace group bucket directly
+                groups.forEach(group -> groupService.setBucketsForGroup(
+                        deviceId, group.appCookie(), group.buckets(),
+                        group.appCookie(), group.appId())
+                );
+                break;
             default:
                 log.warn("Unsupported Objective operation {}", objective.op());
         }
diff --git a/pipelines/fabric/impl/src/main/java/org/onosproject/pipelines/fabric/impl/behaviour/pipeliner/NextObjectiveTranslator.java b/pipelines/fabric/impl/src/main/java/org/onosproject/pipelines/fabric/impl/behaviour/pipeliner/NextObjectiveTranslator.java
index 4e3304d..fb08d07 100644
--- a/pipelines/fabric/impl/src/main/java/org/onosproject/pipelines/fabric/impl/behaviour/pipeliner/NextObjectiveTranslator.java
+++ b/pipelines/fabric/impl/src/main/java/org/onosproject/pipelines/fabric/impl/behaviour/pipeliner/NextObjectiveTranslator.java
@@ -199,7 +199,7 @@
                 obj.nextTreatments(), true);
 
         if (forceSimple && treatments.size() > 1) {
-            log.warn("Forcing SIMPLE behavior for NextObjective with {} treatments []",
+            log.warn("Forcing SIMPLE behavior for NextObjective with {} treatments {}",
                      treatments.size(), obj);
         }
 
@@ -494,10 +494,12 @@
     }
 
     private boolean isGroupModifyOp(NextObjective obj) {
-        // If operation is ADD_TO_EXIST or REMOVE_FROM_EXIST, it means we modify
+        // If operation is ADD_TO_EXIST, REMOVE_FROM_EXIST or MODIFY, it means we modify
         // group buckets only, no changes for flow rules.
+        // FIXME Please note that for MODIFY op this could not apply in future if we extend the scope of MODIFY
         return obj.op() == Objective.Operation.ADD_TO_EXISTING ||
-                obj.op() == Objective.Operation.REMOVE_FROM_EXISTING;
+                obj.op() == Objective.Operation.REMOVE_FROM_EXISTING ||
+                obj.op() == Objective.Operation.MODIFY;
     }
 
     private boolean isXconnect(NextObjective obj) {
