diff --git a/cli/src/main/java/org/onosproject/cli/net/AddTestFlowsCommand.java b/cli/src/main/java/org/onosproject/cli/net/AddTestFlowsCommand.java
index 1f69190..0757dbf 100644
--- a/cli/src/main/java/org/onosproject/cli/net/AddTestFlowsCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/AddTestFlowsCommand.java
@@ -32,6 +32,7 @@
 import org.onosproject.net.flow.DefaultFlowRule;
 import org.onosproject.net.flow.DefaultTrafficSelector;
 import org.onosproject.net.flow.DefaultTrafficTreatment;
+import org.onosproject.net.flow.FlowEntry.FlowEntryState;
 import org.onosproject.net.flow.FlowRule;
 import org.onosproject.net.flow.FlowRuleOperations;
 import org.onosproject.net.flow.FlowRuleOperationsContext;
@@ -43,7 +44,9 @@
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.common.base.Stopwatch;
+import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
+import com.google.common.collect.Streams;
 
 /**
  * Installs bulk flows.
@@ -65,7 +68,6 @@
     String numOfRuns = null;
 
     @Override
-    @java.lang.SuppressWarnings("squid:S1148")
     protected void execute() {
         FlowRuleService flowService = get(FlowRuleService.class);
         DeviceService deviceService = get(DeviceService.class);
@@ -117,9 +119,17 @@
 
             }
         }
+        // close stages
+        rules.newStage();
+        remove.newStage();
 
         for (int i = 0; i < num; i++) {
+            printProgress("Run %d:", i);
             latch = new CountDownLatch(2);
+            final CountDownLatch addSuccess = new CountDownLatch(1);
+            printProgress("..batch add request");
+            Stopwatch add = Stopwatch.createStarted();
+
             flowService.apply(rules.build(new FlowRuleOperationsContext() {
 
                 private final Stopwatch timer = Stopwatch.createStarted();
@@ -128,6 +138,7 @@
                 public void onSuccess(FlowRuleOperations ops) {
 
                     timer.stop();
+                    printProgress("..add success");
                     results.add(timer.elapsed(TimeUnit.MILLISECONDS));
                     if (results.size() == num) {
                         if (outputJson()) {
@@ -137,21 +148,46 @@
                         }
                     }
                     latch.countDown();
+                    addSuccess.countDown();
                 }
             }));
 
+            try {
+                addSuccess.await();
+                // wait until all flows reaches ADDED state
+                while (!Streams.stream(flowService.getFlowEntriesById(appId))
+                        .allMatch(fr -> fr.state() == FlowEntryState.ADDED)) {
+                    Thread.sleep(100);
+                }
+                add.stop();
+                printProgress("..completed %d ± 100 ms", add.elapsed(TimeUnit.MILLISECONDS));
+            } catch (InterruptedException e1) {
+                printProgress("Interrupted");
+                Thread.currentThread().interrupt();
+            }
+
+            printProgress("..cleaning up");
             flowService.apply(remove.build(new FlowRuleOperationsContext() {
                 @Override
                 public void onSuccess(FlowRuleOperations ops) {
                     latch.countDown();
                 }
             }));
+
             try {
                 latch.await();
+                while (!Iterables.isEmpty(flowService.getFlowEntriesById(appId))) {
+                    Thread.sleep(500);
+                }
             } catch (InterruptedException e) {
-                e.printStackTrace();
+                printProgress("Interrupted.");
+                Thread.currentThread().interrupt();
             }
-
+        }
+        if (outputJson()) {
+            print("%s", json(new ObjectMapper(), true, results));
+        } else {
+            printTime(true, results);
         }
     }
 
@@ -165,10 +201,17 @@
         return result;
     }
 
+    private void printProgress(String format, Object... args) {
+        if (!outputJson()) {
+            print(format, args);
+        }
+    }
+
+
     private void printTime(boolean isSuccess, ArrayList<Long> elapsed) {
         print("Run is %s.", isSuccess ? "success" : "failure");
         for (int i = 0; i < elapsed.size(); i++) {
-            print("  Run %s : %s", i, elapsed.get(i));
+            print("  Run %s : %s ms", i, elapsed.get(i));
         }
     }
 }
