diff --git a/src/main/java/org/onosproject/t3/api/GroupsInDevice.java b/src/main/java/org/onosproject/t3/api/GroupsInDevice.java
index e63bdca..74203af 100644
--- a/src/main/java/org/onosproject/t3/api/GroupsInDevice.java
+++ b/src/main/java/org/onosproject/t3/api/GroupsInDevice.java
@@ -21,6 +21,7 @@
 import org.onosproject.net.group.Group;
 
 import java.util.List;
+import java.util.Objects;
 
 /**
  * Class to represent the groups in a device for a given output and packet.
@@ -83,8 +84,31 @@
     }
 
     @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+
+        GroupsInDevice that = (GroupsInDevice) o;
+
+        return Objects.equals(output, that.output) &&
+                Objects.equals(groups, that.groups) &&
+                Objects.equals(selector, that.selector);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(output, groups, selector);
+    }
+
+    @Override
     public String toString() {
         return "GroupsInDevice{" +
+
                 "output=" + output +
                 ", groups=" + groups +
                 ", selector=" + selector +
diff --git a/src/main/java/org/onosproject/t3/api/TroubleshootService.java b/src/main/java/org/onosproject/t3/api/TroubleshootService.java
index 028df64..28ff728 100644
--- a/src/main/java/org/onosproject/t3/api/TroubleshootService.java
+++ b/src/main/java/org/onosproject/t3/api/TroubleshootService.java
@@ -22,6 +22,7 @@
 import org.onosproject.net.flow.TrafficSelector;
 
 import java.util.List;
+import java.util.Set;
 
 /**
  * API for troubleshooting services, providing static analysis of installed
@@ -45,7 +46,7 @@
      * @param type            the etherType of the traffic we want to trace.
      * @return a trace result
      */
-    StaticPacketTrace trace(HostId sourceHost, HostId destinationHost, EthType.EtherType type);
+    Set<StaticPacketTrace> trace(HostId sourceHost, HostId destinationHost, EthType.EtherType type);
 
     /**
      * Requests a static trace be performed for the given traffic selector
diff --git a/src/main/java/org/onosproject/t3/cli/TroubleshootSimpleTraceCommand.java b/src/main/java/org/onosproject/t3/cli/TroubleshootSimpleTraceCommand.java
index 971163b..75356dc 100644
--- a/src/main/java/org/onosproject/t3/cli/TroubleshootSimpleTraceCommand.java
+++ b/src/main/java/org/onosproject/t3/cli/TroubleshootSimpleTraceCommand.java
@@ -25,6 +25,8 @@
 import org.onosproject.t3.api.StaticPacketTrace;
 import org.onosproject.t3.api.TroubleshootService;
 
+import java.util.Set;
+
 import static org.onlab.packet.EthType.EtherType;
 
 /**
@@ -62,15 +64,17 @@
         //Printing the traced hosts
         print("Tracing between: %s and %s", srcHost, dstHost);
 
-        //Build the trace
-        StaticPacketTrace trace = service.trace(HostId.hostId(srcHost), HostId.hostId(dstHost), type);
-        if (trace.getInitialPacket() != null) {
-            print("Tracing Packet: %s", trace.getInitialPacket());
-            print("%s", T3CliUtils.printTrace(trace, verbosity1, verbosity2));
-        } else {
-            print("Cannot obtain trace between %s and %s", srcHost, dstHost);
-            print("Reason: %s", trace.resultMessage());
-        }
+        //Build the traces
+        Set<StaticPacketTrace> traces = service.trace(HostId.hostId(srcHost), HostId.hostId(dstHost), type);
+        traces.forEach(trace -> {
+            if (trace.getInitialPacket() != null) {
+                print("Tracing Packet: %s", trace.getInitialPacket());
+                print("%s", T3CliUtils.printTrace(trace, verbosity1, verbosity2));
+            } else {
+                print("Cannot obtain trace between %s and %s", srcHost, dstHost);
+                print("Reason: %s", trace.resultMessage());
+            }
+        });
 
 
     }
diff --git a/src/main/java/org/onosproject/t3/impl/TroubleshootManager.java b/src/main/java/org/onosproject/t3/impl/TroubleshootManager.java
index 00c2335..0f21f06 100644
--- a/src/main/java/org/onosproject/t3/impl/TroubleshootManager.java
+++ b/src/main/java/org/onosproject/t3/impl/TroubleshootManager.java
@@ -18,6 +18,7 @@
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 import org.apache.commons.lang3.tuple.Pair;
@@ -150,7 +151,7 @@
                     if (((sameLocation && onlyLocalDst && onlyLocalSrc) ||
                             (!onlyLocalSrc && !onlyLocalDst && ipAddressesToPing.size() > 0))
                             && !host.equals(hostToPing)) {
-                        tracesBuilder.add(trace(host.id(), hostToPing.id(), type));
+                        tracesBuilder.addAll(trace(host.id(), hostToPing.id(), type));
                     }
                 });
             }
@@ -159,7 +160,7 @@
     }
 
     @Override
-    public StaticPacketTrace trace(HostId sourceHost, HostId destinationHost, EtherType etherType) {
+    public Set<StaticPacketTrace> trace(HostId sourceHost, HostId destinationHost, EtherType etherType) {
         Host source = hostService.getHost(sourceHost);
         Host destination = hostService.getHost(destinationHost);
 
@@ -168,12 +169,12 @@
 
         if (source == null) {
             failTrace.addResultMessage("Source Host " + sourceHost + " does not exist");
-            return failTrace;
+            return ImmutableSet.of(failTrace);
         }
 
         if (destination == null) {
             failTrace.addResultMessage("Destination Host " + destinationHost + " does not exist");
-            return failTrace;
+            return ImmutableSet.of(failTrace);
         }
 
         TrafficSelector.Builder selectorBuilder = DefaultTrafficSelector.builder()
@@ -188,9 +189,13 @@
             // we are under same leaf so it's L2 Unicast.
             if (areBridged(source, destination)) {
                 selectorBuilder.matchEthDst(destination.mac());
-                StaticPacketTrace trace = trace(selectorBuilder.build(), source.location());
-                trace.addEndpointHosts(Pair.of(source, destination));
-                return trace;
+                ImmutableSet.Builder<StaticPacketTrace> traces = ImmutableSet.builder();
+                source.locations().forEach(hostLocation -> {
+                    StaticPacketTrace trace = trace(selectorBuilder.build(), hostLocation);
+                    trace.addEndpointHosts(Pair.of(source, destination));
+                    traces.add(trace);
+                });
+                return traces.build();
             }
 
             //handle the IPs for src and dst in case of L3
@@ -198,18 +203,18 @@
 
                 //Match on the source IP
                 if (!matchIP(source, failTrace, selectorBuilder, etherType, true)) {
-                    return failTrace;
+                    return ImmutableSet.of(failTrace);
                 }
 
                 //Match on destination IP
                 if (!matchIP(destination, failTrace, selectorBuilder, etherType, false)) {
-                    return failTrace;
+                    return ImmutableSet.of(failTrace);
                 }
 
             } else {
                 failTrace.addResultMessage("Host based trace supports only IPv4 or IPv6 as EtherType, " +
                         "please use packet based");
-                return failTrace;
+                return ImmutableSet.of(failTrace);
             }
 
             //l3 unicast, we get the dst mac of the leaf the source is connected to from netcfg
@@ -221,13 +226,17 @@
                 failTrace.addResultMessage("Can't get " + source.location().deviceId() +
                         " router MAC from segment routing config can't perform L3 tracing.");
             }
-            StaticPacketTrace trace = trace(selectorBuilder.build(), source.location());
-            trace.addEndpointHosts(Pair.of(source, destination));
-            return trace;
+            ImmutableSet.Builder<StaticPacketTrace> traces = ImmutableSet.builder();
+            source.locations().forEach(hostLocation -> {
+                StaticPacketTrace trace = trace(selectorBuilder.build(), hostLocation);
+                trace.addEndpointHosts(Pair.of(source, destination));
+                traces.add(trace);
+            });
+            return traces.build();
 
         } catch (ConfigException e) {
             failTrace.addResultMessage("Can't get config " + e.getMessage());
-            return failTrace;
+            return ImmutableSet.of(failTrace);
         }
     }
 
@@ -333,11 +342,12 @@
                 "Device " + in.deviceId() + " must exist in ONOS");
 
         StaticPacketTrace trace = new StaticPacketTrace(packet, in);
+        boolean isDualHomed = getHosts(trace).stream().anyMatch(host -> host.locations().size() > 1);
         //FIXME this can be done recursively
-        trace = traceInDevice(trace, packet, in);
+        trace = traceInDevice(trace, packet, in, isDualHomed);
         //Building output connect Points
         List<ConnectPoint> path = new ArrayList<>();
-        trace = getTrace(path, in, trace);
+        trace = getTrace(path, in, trace, isDualHomed);
         return trace;
     }
 
@@ -347,9 +357,11 @@
      * @param completePath the path traversed by the packet
      * @param in           the input connect point
      * @param trace        the trace to build
+     * @param isDualHomed  true if the trace we are doing starts or ends in a dual homed host
      * @return the build trace for that packet.
      */
-    private StaticPacketTrace getTrace(List<ConnectPoint> completePath, ConnectPoint in, StaticPacketTrace trace) {
+    private StaticPacketTrace getTrace(List<ConnectPoint> completePath, ConnectPoint in, StaticPacketTrace trace,
+                                       boolean isDualHomed) {
 
         log.debug("------------------------------------------------------------");
 
@@ -384,8 +396,9 @@
             //If the two host collections contain the same item it means we reached the proper output
             if (!Collections.disjoint(hostsList, hosts)) {
                 log.debug("Stopping here because host is expected destination {}, reached through", completePath);
-                trace.addResultMessage("Reached required destination Host " + cp);
-                computePath(completePath, trace, outputPath.getOutput());
+                if (computePath(completePath, trace, outputPath.getOutput())) {
+                    trace.addResultMessage("Reached required destination Host " + cp);
+                }
                 break;
             } else if (cp.port().equals(PortNumber.CONTROLLER)) {
 
@@ -434,9 +447,9 @@
                     updatedPacket.add(Criteria.matchInPort(dst.port()));
                     log.debug("DST Connect Point {}", dst);
                     //build the elements for that device
-                    traceInDevice(trace, updatedPacket.build(), dst);
+                    traceInDevice(trace, updatedPacket.build(), dst, isDualHomed);
                     //continue the trace along the path
-                    getTrace(completePath, dst, trace);
+                    getTrace(completePath, dst, trace, isDualHomed);
                 }
             } else if (edgePortService.isEdgePoint(outputPath.getOutput()) &&
                     trace.getInitialPacket().getCriterion(Criterion.Type.ETH_DST) != null &&
@@ -569,7 +582,7 @@
      * @param trace        the trace we are building
      * @param output       the final output connect point
      */
-    private void computePath(List<ConnectPoint> completePath, StaticPacketTrace trace, ConnectPoint output) {
+    private boolean computePath(List<ConnectPoint> completePath, StaticPacketTrace trace, ConnectPoint output) {
         List<ConnectPoint> traverseList = new ArrayList<>();
         if (!completePath.contains(trace.getInitialConnectPoint())) {
             traverseList.add(trace.getInitialConnectPoint());
@@ -578,21 +591,26 @@
         if (output != null && !completePath.contains(output)) {
             traverseList.add(output);
         }
-        trace.addCompletePath(traverseList);
+        if (!trace.getCompletePaths().contains(traverseList)) {
+            trace.addCompletePath(traverseList);
+            return true;
+        }
+        return false;
     }
 
     /**
      * Traces the packet inside a device starting from an input connect point.
      *
-     * @param trace  the trace we are building
-     * @param packet the packet we are tracing
-     * @param in     the input connect point.
+     * @param trace       the trace we are building
+     * @param packet      the packet we are tracing
+     * @param in          the input connect point.
+     * @param isDualHomed true if the trace we are doing starts or ends in a dual homed host
      * @return updated trace
      */
-    private StaticPacketTrace traceInDevice(StaticPacketTrace trace, TrafficSelector packet, ConnectPoint in) {
+    private StaticPacketTrace traceInDevice(StaticPacketTrace trace, TrafficSelector packet, ConnectPoint in,
+                                            boolean isDualHomed) {
 
-        //we already traversed this device.
-        if (trace.getGroupOuputs(in.deviceId()) != null) {
+        if (trace.getGroupOuputs(in.deviceId()) != null && !isDualHomed) {
             log.debug("Trace already contains device and given outputs");
             return trace;
         }
@@ -1018,6 +1036,11 @@
             trace.addResultMessage("Connect point out " + output + " is same as initial input " +
                     trace.getInitialConnectPoint());
         } else {
+            GroupsInDevice device = new GroupsInDevice(output, groupsForDevice, builder.build());
+            if (trace.getGroupOuputs(output.deviceId()) != null
+                    && trace.getGroupOuputs(output.deviceId()).contains(device)) {
+                return;
+            }
             trace.addGroupOutputPath(in.deviceId(),
                     new GroupsInDevice(output, groupsForDevice, builder.build()));
             outputPorts.add(outputInstruction.port());
