Added bi-directional nature to HostToHost intent.
diff --git a/core/api/src/main/java/org/onlab/onos/net/ConnectPoint.java b/core/api/src/main/java/org/onlab/onos/net/ConnectPoint.java
index 35adde9..17f9348 100644
--- a/core/api/src/main/java/org/onlab/onos/net/ConnectPoint.java
+++ b/core/api/src/main/java/org/onlab/onos/net/ConnectPoint.java
@@ -47,7 +47,23 @@
             return (DeviceId) elementId;
         }
         throw new IllegalStateException("Connection point not associated " +
-                "with an infrastructure device");
+                                                "with an infrastructure device");
+    }
+
+    /**
+     * Returns the identifier of the infrastructure device if the connection
+     * point belongs to a network element which is indeed an end-station host.
+     *
+     * @return network element identifier as a host identifier
+     * @throws java.lang.IllegalStateException if connection point is not
+     *                                         associated with a host
+     */
+    public HostId hostId() {
+        if (elementId instanceof HostId) {
+            return (HostId) elementId;
+        }
+        throw new IllegalStateException("Connection point not associated " +
+                                                "with an end-station host");
     }
 
     /**
diff --git a/core/api/src/main/java/org/onlab/onos/net/intent/HostToHostIntent.java b/core/api/src/main/java/org/onlab/onos/net/intent/HostToHostIntent.java
index 08063f0..7cef3da 100644
--- a/core/api/src/main/java/org/onlab/onos/net/intent/HostToHostIntent.java
+++ b/core/api/src/main/java/org/onlab/onos/net/intent/HostToHostIntent.java
@@ -10,47 +10,49 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
- * Abstraction of end-station to end-station connectivity.
+ * Abstraction of end-station to end-station bidirectional connectivity.
  */
 public class HostToHostIntent extends ConnectivityIntent {
 
-    private final HostId src;
-    private final HostId dst;
+    private final HostId one;
+    private final HostId two;
 
     /**
      * Creates a new point-to-point intent with the supplied ingress/egress
      * ports.
      *
      * @param intentId  intent identifier
+     * @param one       first host
+     * @param two       second host
      * @param selector  action
      * @param treatment ingress port
      * @throws NullPointerException if {@code ingressPort} or {@code egressPort}
      *                              is null.
      */
-    public HostToHostIntent(IntentId intentId, HostId src, HostId dst,
-                            TrafficSelector selector, TrafficTreatment treatment) {
+    public HostToHostIntent(IntentId intentId, HostId one, HostId two,
+                            TrafficSelector selector,
+                            TrafficTreatment treatment) {
         super(intentId, selector, treatment);
-        this.src = checkNotNull(src);
-        this.dst = checkNotNull(dst);
+        this.one = checkNotNull(one);
+        this.two = checkNotNull(two);
     }
 
     /**
-     * Returns the port on which the ingress traffic should be connected to the
-     * egress.
+     * Returns identifier of the first host.
      *
-     * @return ingress port
+     * @return first host identifier
      */
-    public HostId getSrc() {
-        return src;
+    public HostId one() {
+        return one;
     }
 
     /**
-     * Returns the port on which the traffic should egress.
+     * Returns identifier of the second host.
      *
-     * @return egress port
+     * @return second host identifier
      */
-    public HostId getDst() {
-        return dst;
+    public HostId two() {
+        return two;
     }
 
     @Override
@@ -66,13 +68,13 @@
         }
 
         HostToHostIntent that = (HostToHostIntent) o;
-        return Objects.equals(this.src, that.src)
-                && Objects.equals(this.dst, that.dst);
+        return Objects.equals(this.one, that.one)
+                && Objects.equals(this.two, that.two);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(super.hashCode(), src, dst);
+        return Objects.hash(super.hashCode(), one, two);
     }
 
     @Override
@@ -80,9 +82,9 @@
         return MoreObjects.toStringHelper(getClass())
                 .add("id", getId())
                 .add("selector", getTrafficSelector())
-                .add("treatmetn", getTrafficTreatment())
-                .add("src", src)
-                .add("dst", dst)
+                .add("treatment", getTrafficTreatment())
+                .add("one", one)
+                .add("two", two)
                 .toString();
     }
 
diff --git a/core/net/src/main/java/org/onlab/onos/net/intent/impl/HostToHostIntentCompiler.java b/core/net/src/main/java/org/onlab/onos/net/intent/impl/HostToHostIntentCompiler.java
index a8bea2e..541a702 100644
--- a/core/net/src/main/java/org/onlab/onos/net/intent/impl/HostToHostIntentCompiler.java
+++ b/core/net/src/main/java/org/onlab/onos/net/intent/impl/HostToHostIntentCompiler.java
@@ -1,17 +1,15 @@
 package org.onlab.onos.net.intent.impl;
 
-import java.util.Arrays;
-import java.util.List;
-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;
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.onlab.onos.net.ConnectPoint;
+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.TrafficSelector;
+import org.onlab.onos.net.host.HostService;
 import org.onlab.onos.net.intent.HostToHostIntent;
 import org.onlab.onos.net.intent.IdGenerator;
 import org.onlab.onos.net.intent.Intent;
@@ -21,6 +19,12 @@
 import org.onlab.onos.net.intent.PathIntent;
 import org.onlab.onos.net.topology.PathService;
 
+import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
+
+import static org.onlab.onos.net.flow.DefaultTrafficSelector.builder;
+
 /**
  * A intent compiler for {@link HostToHostIntent}.
  */
@@ -34,6 +38,9 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected PathService pathService;
 
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected HostService hostService;
+
     private IdGenerator<IntentId> intentIdGenerator;
 
     @Activate
@@ -50,18 +57,34 @@
 
     @Override
     public List<Intent> compile(HostToHostIntent intent) {
-        Set<Path> paths = pathService.getPaths(intent.getSrc(), intent.getDst());
-        if (paths.isEmpty()) {
-            throw new PathNotFoundException();
-        }
-        Path path = paths.iterator().next();
+        Path pathOne = getPath(intent.one(), intent.two());
+        Path pathTwo = getPath(intent.two(), intent.one());
 
-        return Arrays.asList((Intent) new PathIntent(
-                intentIdGenerator.getNewId(),
-                intent.getTrafficSelector(),
-                intent.getTrafficTreatment(),
-                new ConnectPoint(intent.getSrc(), PortNumber.ALL),
-                new ConnectPoint(intent.getDst(), PortNumber.ALL),
-                path));
+        Host one = hostService.getHost(intent.one());
+        Host two = hostService.getHost(intent.two());
+
+        return Arrays.asList(createPathIntent(pathOne, one, two, intent),
+                             createPathIntent(pathTwo, two, one, intent));
+    }
+
+    // Creates a path intent from the specified path and original connectivity intent.
+    private Intent createPathIntent(Path path, Host src, Host dst,
+                                    HostToHostIntent intent) {
+
+        TrafficSelector selector = builder(intent.getTrafficSelector())
+                .matchEthSrc(src.mac()).matchEthDst(dst.mac()).build();
+
+        return new PathIntent(intentIdGenerator.getNewId(),
+                              selector, intent.getTrafficTreatment(),
+                              path.src(), path.dst(), path);
+    }
+
+    private Path getPath(HostId one, HostId two) {
+        Set<Path> paths = pathService.getPaths(one, two);
+        if (paths.isEmpty()) {
+            throw new PathNotFoundException("No path from host " + one + " to " + two);
+        }
+        // TODO: let's be more intelligent about this eventually
+        return paths.iterator().next();
     }
 }
diff --git a/core/net/src/main/java/org/onlab/onos/net/intent/impl/IntentManager.java b/core/net/src/main/java/org/onlab/onos/net/intent/impl/IntentManager.java
index f1c9de3..769e4c7 100644
--- a/core/net/src/main/java/org/onlab/onos/net/intent/impl/IntentManager.java
+++ b/core/net/src/main/java/org/onlab/onos/net/intent/impl/IntentManager.java
@@ -355,8 +355,8 @@
     private class InternalStoreDelegate implements IntentStoreDelegate {
         @Override
         public void notify(IntentEvent event) {
-            processStoreEvent(event);
             eventDispatcher.post(event);
+            processStoreEvent(event);
         }
     }
 
diff --git a/core/net/src/main/java/org/onlab/onos/net/intent/impl/PathIntentInstaller.java b/core/net/src/main/java/org/onlab/onos/net/intent/impl/PathIntentInstaller.java
index 84e8c79..ec7841c 100644
--- a/core/net/src/main/java/org/onlab/onos/net/intent/impl/PathIntentInstaller.java
+++ b/core/net/src/main/java/org/onlab/onos/net/intent/impl/PathIntentInstaller.java
@@ -1,7 +1,5 @@
 package org.onlab.onos.net.intent.impl;
 
-import java.util.Iterator;
-
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
@@ -12,7 +10,6 @@
 import org.onlab.onos.net.Link;
 import org.onlab.onos.net.flow.DefaultFlowRule;
 import org.onlab.onos.net.flow.DefaultTrafficSelector;
-import org.onlab.onos.net.flow.DefaultTrafficTreatment;
 import org.onlab.onos.net.flow.FlowRule;
 import org.onlab.onos.net.flow.FlowRuleService;
 import org.onlab.onos.net.flow.TrafficSelector;
@@ -21,6 +18,10 @@
 import org.onlab.onos.net.intent.IntentInstaller;
 import org.onlab.onos.net.intent.PathIntent;
 
+import java.util.Iterator;
+
+import static org.onlab.onos.net.flow.DefaultTrafficTreatment.builder;
+
 /**
  * Installer for {@link PathIntent path connectivity intents}.
  */
@@ -51,18 +52,16 @@
                 DefaultTrafficSelector.builder(intent.getTrafficSelector());
         Iterator<Link> links = intent.getPath().links().iterator();
         ConnectPoint prev = links.next().dst();
+
         while (links.hasNext()) {
             builder.matchInport(prev.port());
             Link link = links.next();
-
-            TrafficTreatment.Builder treat = DefaultTrafficTreatment.builder();
-            treat.setOutput(link.src().port());
-
+            TrafficTreatment treatment = builder()
+                    .setOutput(link.src().port()).build();
             FlowRule rule = new DefaultFlowRule(link.src().deviceId(),
-                                                builder.build(), treat.build(),
-                                                10, appId, 30);
+                                                builder.build(), treatment,
+                                                123, appId, 600);
             flowRuleService.applyFlowRules(rule);
-
             prev = link.dst();
         }