added enhanced reactive forwarding
diff --git a/apps/fwd/src/main/java/org/onlab/onos/fwd/ReactiveForwarding.java b/apps/fwd/src/main/java/org/onlab/onos/fwd/ReactiveForwarding.java
index 24cfe6f..9cb36e0 100644
--- a/apps/fwd/src/main/java/org/onlab/onos/fwd/ReactiveForwarding.java
+++ b/apps/fwd/src/main/java/org/onlab/onos/fwd/ReactiveForwarding.java
@@ -5,6 +5,7 @@
 import org.apache.felix.scr.annotations.Deactivate;
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.onlab.onos.net.host.HostService;
 import org.onlab.onos.net.packet.PacketProcessor;
 import org.onlab.onos.net.packet.PacketService;
 import org.onlab.onos.net.topology.TopologyService;
@@ -18,11 +19,14 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected PacketService packetService;
 
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected HostService hostService;
+
     private ReactivePacketProcessor processor;
 
     @Activate
     public void activate() {
-        processor = new ReactivePacketProcessor(topologyService);
+        processor = new ReactivePacketProcessor(topologyService, hostService);
         packetService.addProcessor(processor, PacketProcessor.ADVISOR_MAX + 1);
     }
 
diff --git a/apps/fwd/src/main/java/org/onlab/onos/fwd/ReactivePacketProcessor.java b/apps/fwd/src/main/java/org/onlab/onos/fwd/ReactivePacketProcessor.java
index f4102ec..4ecb129 100644
--- a/apps/fwd/src/main/java/org/onlab/onos/fwd/ReactivePacketProcessor.java
+++ b/apps/fwd/src/main/java/org/onlab/onos/fwd/ReactivePacketProcessor.java
@@ -2,36 +2,73 @@
 
 import static org.slf4j.LoggerFactory.getLogger;
 
+import java.util.Set;
+
+import org.onlab.onos.net.Host;
+import org.onlab.onos.net.HostId;
+import org.onlab.onos.net.Path;
 import org.onlab.onos.net.PortNumber;
 import org.onlab.onos.net.flow.Instructions;
+import org.onlab.onos.net.host.HostService;
+import org.onlab.onos.net.packet.InboundPacket;
 import org.onlab.onos.net.packet.PacketContext;
 import org.onlab.onos.net.packet.PacketProcessor;
 import org.onlab.onos.net.topology.TopologyService;
+import org.onlab.packet.VLANID;
 import org.slf4j.Logger;
 
 public class ReactivePacketProcessor implements PacketProcessor {
 
     private final Logger log = getLogger(getClass());
     private final TopologyService topologyService;
+    private final HostService hostService;
 
 
-    public ReactivePacketProcessor(TopologyService topologyService) {
+    public ReactivePacketProcessor(TopologyService topologyService, HostService hostService) {
         this.topologyService = topologyService;
+        this.hostService = hostService;
     }
 
 
     @Override
     public void process(PacketContext context) {
+        InboundPacket pkt = context.inPacket();
+        HostId id = HostId.hostId(pkt.parsed().getDestinationMAC(), VLANID.vlanId((short) -1));
+        Host dst = hostService.getHost(id);
+        if (dst == null) {
+            flood(context);
+            return;
+        }
+
+        Set<Path> p = null;
+        if (pkt.receivedFrom().deviceId().equals(dst.location().deviceId())) {
+            context.treatmentBuilder().add(Instructions.createOutput(dst.location().port()));
+            context.send();
+            return;
+        } else {
+            p = topologyService.getPaths(topologyService.currentTopology(),
+                    context.inPacket().receivedFrom().deviceId(), dst.location().deviceId());
+        }
+
+        if (p.isEmpty()) {
+            flood(context);
+        } else {
+            Path p1 = p.iterator().next();
+            context.treatmentBuilder().add(Instructions.createOutput(p1.src().port()));
+            context.send();
+        }
+
+    }
+
+    private void flood(PacketContext context) {
         boolean canBcast = topologyService.isBroadcastPoint(topologyService.currentTopology(),
                 context.inPacket().receivedFrom());
-
         if (canBcast) {
             context.treatmentBuilder().add(Instructions.createOutput(PortNumber.FLOOD));
             context.send();
         } else {
             context.block();
         }
-
     }
 
 }
diff --git a/apps/tvue/pom.xml b/apps/tvue/pom.xml
index 409ee61..cc3d9e1 100644
--- a/apps/tvue/pom.xml
+++ b/apps/tvue/pom.xml
@@ -84,6 +84,7 @@
                             com.sun.jersey.server.impl.container.servlet,
                             com.fasterxml.jackson.databind,
                             com.fasterxml.jackson.databind.node,
+                            org.onlab.packet.*,
                             org.onlab.rest.*,
                             org.onlab.onos.*
                         </Import-Package>
diff --git a/providers/of/host/src/main/java/org/onlab/onos/provider/of/host/impl/OpenFlowHostProvider.java b/providers/of/host/src/main/java/org/onlab/onos/provider/of/host/impl/OpenFlowHostProvider.java
index 6c6a239..8ec8fb1 100644
--- a/providers/of/host/src/main/java/org/onlab/onos/provider/of/host/impl/OpenFlowHostProvider.java
+++ b/providers/of/host/src/main/java/org/onlab/onos/provider/of/host/impl/OpenFlowHostProvider.java
@@ -1,5 +1,12 @@
 package org.onlab.onos.provider.of.host.impl;
 
+import static com.google.common.collect.Sets.newHashSet;
+import static org.onlab.onos.net.DeviceId.deviceId;
+import static org.onlab.onos.net.PortNumber.portNumber;
+import static org.slf4j.LoggerFactory.getLogger;
+
+import java.util.Set;
+
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
@@ -28,13 +35,6 @@
 import org.onlab.packet.VLANID;
 import org.slf4j.Logger;
 
-import java.util.Set;
-
-import static com.google.common.collect.Sets.newHashSet;
-import static org.onlab.onos.net.DeviceId.deviceId;
-import static org.onlab.onos.net.PortNumber.portNumber;
-import static org.slf4j.LoggerFactory.getLogger;
-
 /**
  * Provider which uses an OpenFlow controller to detect network
  * end-station hosts.
@@ -96,7 +96,7 @@
             if (eth.getEtherType() == Ethernet.TYPE_ARP) {
                 VLANID vlan = VLANID.vlanId(eth.getVlanID());
                 ConnectPoint heardOn = new ConnectPoint(deviceId(Dpid.uri(pktCtx.dpid())),
-                                                        portNumber(pktCtx.inPort()));
+                        portNumber(pktCtx.inPort()));
 
                 // If this is not an edge port, bail out.
                 Topology topology = topologyService.currentTopology();
@@ -105,8 +105,8 @@
                 }
 
                 HostLocation hloc = new HostLocation(deviceId(Dpid.uri(pktCtx.dpid())),
-                                                     portNumber(pktCtx.inPort()),
-                                                     System.currentTimeMillis());
+                        portNumber(pktCtx.inPort()),
+                        System.currentTimeMillis());
 
                 HostId hid = HostId.hostId(eth.getSourceMAC(), vlan);
                 ARP arp = (ARP) eth.getPayload();
diff --git a/providers/of/packet/src/main/java/org/onlab/onos/provider/of/packet/impl/OpenFlowPacketProvider.java b/providers/of/packet/src/main/java/org/onlab/onos/provider/of/packet/impl/OpenFlowPacketProvider.java
index 96208fc..eb41c18 100644
--- a/providers/of/packet/src/main/java/org/onlab/onos/provider/of/packet/impl/OpenFlowPacketProvider.java
+++ b/providers/of/packet/src/main/java/org/onlab/onos/provider/of/packet/impl/OpenFlowPacketProvider.java
@@ -54,7 +54,7 @@
     @Activate
     public void activate() {
         providerService = providerRegistry.register(this);
-        controller.addPacketListener(1, listener);
+        controller.addPacketListener(20, listener);
         log.info("Started");
     }