diff --git a/apps/t3/src/main/java/org/onosproject/t3/api/StaticPacketTrace.java b/apps/t3/src/main/java/org/onosproject/t3/api/StaticPacketTrace.java
index 084b25e..22db007 100644
--- a/apps/t3/src/main/java/org/onosproject/t3/api/StaticPacketTrace.java
+++ b/apps/t3/src/main/java/org/onosproject/t3/api/StaticPacketTrace.java
@@ -43,7 +43,7 @@
     private Map<DeviceId, List<FlowEntry>> flowsForDevice;
     private StringBuilder resultMessage;
     private Pair<Host, Host> hosts;
-    private boolean success = false;
+    private List<Boolean> success = new ArrayList<>();
 
     /**
      * Builds the trace with a given packet and a connect point.
@@ -197,21 +197,21 @@
     }
 
     /**
-     * Return if this trace is successful.
+     * Return if all the possible paths of this trace are successful.
      *
-     * @return true if successful
+     * @return true if all paths are successful
      */
     public boolean isSuccess() {
-        return success;
+        return !success.contains(false);
     }
 
     /**
-     * Sets if this trace is successful.
+     * Sets if a path from this trace is successful.
      *
-     * @param success true if trace is successful.
+     * @param success true if a path of trace is successful.
      */
     public void setSuccess(boolean success) {
-        this.success = success;
+        this.success.add(success);
     }
 
 
diff --git a/apps/t3/src/main/java/org/onosproject/t3/cli/TroubleshootPingAllCommand.java b/apps/t3/src/main/java/org/onosproject/t3/cli/TroubleshootPingAllCommand.java
index f8648d0..f9d7376 100644
--- a/apps/t3/src/main/java/org/onosproject/t3/cli/TroubleshootPingAllCommand.java
+++ b/apps/t3/src/main/java/org/onosproject/t3/cli/TroubleshootPingAllCommand.java
@@ -28,6 +28,8 @@
 import org.onosproject.t3.api.TroubleshootService;
 import org.onosproject.t3.impl.Generator;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Set;
 
 import static java.lang.Thread.sleep;
@@ -69,39 +71,27 @@
             //Create the generator for the list of traces.
             Generator<Set<StaticPacketTrace>> generator = service.pingAllGenerator(type);
             Host previousHost = null;
+            int totalTraces = 0;
+            List<StaticPacketTrace> failedTraces = new ArrayList<>();
+            boolean ipv4 = type.equals(EtherType.IPV4);
             while (generator.iterator().hasNext()) {
                 Set<StaticPacketTrace> traces = generator.iterator().next();
+                totalTraces++;
                 for (StaticPacketTrace trace : traces) {
-                    boolean ipv4 = type.equals(EtherType.IPV4);
                     //no verbosity is mininet style output
                     if (!verbosity1 && !verbosity2) {
                         if (trace.getEndpointHosts().isPresent()) {
                             Host src = trace.getEndpointHosts().get().getLeft();
                             if (previousHost == null || !previousHost.equals(src)) {
                                 print("%s", StringUtils.rightPad("", 125, '-'));
-                                IpAddress ipAddress = getIpAddress(trace, ipv4, src, true);
-                                if (ipAddress == null) {
-                                    print("%s", src.id() + " -->");
-                                } else {
-                                    print("%s (%s) -->", src.id(), ipAddress);
-                                }
-                                previousHost = src;
-                            } else {
-                                String host;
-                                IpAddress ipAddress = getIpAddress(trace, ipv4, src, false);
-                                if (ipAddress == null) {
-                                    host = String.format("       %s %s", trace.getEndpointHosts().get().getRight().id(),
-                                            trace.isSuccess());
-                                } else {
-                                    host = String.format("       %s (%s) %s",
-                                            trace.getEndpointHosts().get().getRight().id(), ipAddress,
-                                            trace.isSuccess());
-                                }
-                                if (!trace.isSuccess()) {
-                                    host = host + " " + trace.resultMessage();
-                                }
-                                print("%s", host);
+                                previousHost = printSrc(trace, ipv4, src);
                             }
+                            String host = getDstString(trace, ipv4, src);
+                            if (!trace.isSuccess()) {
+                                host = host + " " + trace.resultMessage();
+                                failedTraces.add(trace);
+                            }
+                            print("%s", host);
                         }
                     } else {
                         print("%s", StringUtils.leftPad("", 125, '-'));
@@ -129,9 +119,48 @@
                 }
             }
             print("%s", StringUtils.rightPad("", 125, '-'));
+            print("Failed Traces: %s", failedTraces.size());
+            print("%s", StringUtils.rightPad("", 125, '-'));
+            failedTraces.forEach(t -> {
+                if (t.getEndpointHosts().isPresent()) {
+                    printSrc(t, ipv4, t.getEndpointHosts().get().getLeft());
+                    String dst = getDstString(t, ipv4, t.getEndpointHosts().get().getRight());
+                    dst = dst + " " + t.resultMessage();
+                    print("%s", dst);
+                    print("%s", StringUtils.rightPad("", 125, '-'));
+                }
+            });
+            print("Summary");
+            print("Total Traces %s, errors %s", totalTraces, failedTraces.size());
         }
     }
 
+    private String getDstString(StaticPacketTrace trace, boolean ipv4, Host src) {
+        String host;
+        IpAddress ipAddress = getIpAddress(trace, ipv4, src, false);
+        if (ipAddress == null) {
+            host = String.format("       %s %s", trace.getEndpointHosts().get().getRight().id(),
+                    trace.isSuccess());
+        } else {
+            host = String.format("       %s (%s) %s",
+                    trace.getEndpointHosts().get().getRight().id(), ipAddress,
+                    trace.isSuccess());
+        }
+        return host;
+    }
+
+    private Host printSrc(StaticPacketTrace trace, boolean ipv4, Host src) {
+        Host previousHost;
+        IpAddress ipAddress = getIpAddress(trace, ipv4, src, true);
+        if (ipAddress == null) {
+            print("%s", src.id() + " -->");
+        } else {
+            print("%s (%s) -->", src.id(), ipAddress);
+        }
+        previousHost = src;
+        return previousHost;
+    }
+
     private IpAddress getIpAddress(StaticPacketTrace trace, boolean ipv4, Host host, boolean src) {
         IpAddress ipAddress;
         if (ipv4) {
diff --git a/apps/t3/src/main/java/org/onosproject/t3/impl/TroubleshootManager.java b/apps/t3/src/main/java/org/onosproject/t3/impl/TroubleshootManager.java
index 3564750..b6934ad 100644
--- a/apps/t3/src/main/java/org/onosproject/t3/impl/TroubleshootManager.java
+++ b/apps/t3/src/main/java/org/onosproject/t3/impl/TroubleshootManager.java
@@ -180,11 +180,14 @@
 
         if (source == null) {
             failTrace.addResultMessage("Source Host " + sourceHost + " does not exist");
+            failTrace.setSuccess(false);
+
             return ImmutableSet.of(failTrace);
         }
 
         if (destination == null) {
             failTrace.addResultMessage("Destination Host " + destinationHost + " does not exist");
+            failTrace.setSuccess(false);
             return ImmutableSet.of(failTrace);
         }
 
@@ -225,6 +228,7 @@
             } else {
                 failTrace.addResultMessage("Host based trace supports only IPv4 or IPv6 as EtherType, " +
                         "please use packet based");
+                failTrace.setSuccess(false);
                 return ImmutableSet.of(failTrace);
             }
 
@@ -236,6 +240,7 @@
             } else {
                 failTrace.addResultMessage("Can't get " + source.location().deviceId() +
                         " router MAC from segment routing config can't perform L3 tracing.");
+                failTrace.setSuccess(false);
             }
             ImmutableSet.Builder<StaticPacketTrace> traces = ImmutableSet.builder();
             source.locations().forEach(hostLocation -> {
@@ -282,6 +287,7 @@
             }
         } else {
             failTrace.addResultMessage("Host " + host + " has no " + etherType + " address");
+            failTrace.setSuccess(false);
             return false;
         }
         return true;
@@ -393,6 +399,7 @@
             trace.addResultMessage("Loop encountered in device " + in.deviceId());
             completePath.add(in);
             trace.addCompletePath(completePath);
+            trace.setSuccess(false);
             return trace;
         }
 
@@ -403,6 +410,7 @@
         if (trace.getGroupOuputs(in.deviceId()) == null) {
             computePath(completePath, trace, null);
             trace.addResultMessage("No output out of device " + in.deviceId() + ". Packet is dropped");
+            trace.setSuccess(false);
             return trace;
         }
 
@@ -424,14 +432,13 @@
                     && ((VlanIdCriterion) trace.getInitialPacket().getCriterion(Criterion.Type.VLAN_VID)).vlanId()
                     .equals(((VlanIdCriterion) outputPath.getFinalPacket().getCriterion(Criterion.Type.VLAN_VID))
                             .vlanId())) {
-                if (computePath(completePath, trace, outputPath.getOutput())) {
+                if (trace.getGroupOuputs(in.deviceId()).size() == 1 &&
+                        computePath(completePath, trace, outputPath.getOutput())) {
                     trace.addResultMessage("Connect point out " + cp + " is same as initial input " + in);
+                    trace.setSuccess(false);
                 }
-                break;
-            }
-
-            //If the two host collections contain the same item it means we reached the proper output
-            if (!Collections.disjoint(hostsList, hosts)) {
+            } else if  (!Collections.disjoint(hostsList, hosts)) {
+                //If the two host collections contain the same item it means we reached the proper output
                 log.debug("Stopping here because host is expected destination {}, reached through", completePath);
                 if (computePath(completePath, trace, outputPath.getOutput())) {
                     trace.addResultMessage("Reached required destination Host " + cp);
@@ -536,6 +543,7 @@
                                 } else {
                                     trace.addResultMessage("Wrong output " + cp + " for required destination ip " +
                                             ipAddress);
+                                    trace.setSuccess(false);
                                 }
                             } else {
                                 trace.addResultMessage("Packet is " + ((EthTypeCriterion) outputPath.getFinalPacket()
@@ -552,6 +560,7 @@
                 log.warn("No links out of {}", cp);
                 computePath(completePath, trace, cp);
                 trace.addResultMessage("No links depart from " + cp + ". Packet is dropped");
+                trace.setSuccess(false);
             }
         }
         return trace;
@@ -712,6 +721,7 @@
         FlowEntry nextTableIdEntry = findNextTableIdEntry(in.deviceId(), -1);
         if (nextTableIdEntry == null) {
             trace.addResultMessage("No flow rules for device " + in.deviceId() + ". Aborting");
+            trace.setSuccess(false);
             return trace;
         }
         TableId tableId = nextTableIdEntry.table();
@@ -743,6 +753,7 @@
                 //(another possibility is max tableId)
                 if (nextTableIdEntry == null && flows.size() == 0) {
                     trace.addResultMessage("No matching flow rules for device " + in.deviceId() + ". Aborting");
+                    trace.setSuccess(false);
                     return trace;
 
                 } else if (nextTableIdEntry == null) {
@@ -761,6 +772,7 @@
             } else if (flowEntry == null) {
                 trace.addResultMessage("Packet has no match on table " + tableId + " in device " +
                         in.deviceId() + ". Dropping");
+                trace.setSuccess(false);
                 return trace;
             } else {
 
@@ -1091,10 +1103,12 @@
             }).findAny().orElse(null);
             if (group == null) {
                 trace.addResultMessage("Null group for Instruction " + instr);
+                trace.setSuccess(false);
                 break;
             }
             if (group.buckets().buckets().size() == 0) {
                 trace.addResultMessage("Group " + group.id() + "has no buckets");
+                trace.setSuccess(false);
                 break;
             }
 
