Remove Path Intent
diff --git a/cli/src/main/java/org/onlab/onos/cli/net/IntentsListCommand.java b/cli/src/main/java/org/onlab/onos/cli/net/IntentsListCommand.java
index ad17290..a7d260d 100644
--- a/cli/src/main/java/org/onlab/onos/cli/net/IntentsListCommand.java
+++ b/cli/src/main/java/org/onlab/onos/cli/net/IntentsListCommand.java
@@ -4,6 +4,7 @@
 import org.onlab.onos.cli.AbstractShellCommand;
 import org.onlab.onos.net.intent.Intent;
 import org.onlab.onos.net.intent.IntentService;
+import org.onlab.onos.net.intent.IntentState;
 
 /**
  * Lists the inventory of intents and their states.
@@ -16,7 +17,8 @@
     protected void execute() {
         IntentService service = get(IntentService.class);
         for (Intent intent : service.getIntents()) {
-            print("%s", intent);
+            IntentState state = service.getIntentState(intent.getId());
+            print("%s %s %s", intent.getId(), state, intent);
         }
     }
 
diff --git a/cli/src/main/java/org/onlab/onos/cli/net/RemoveHostToHostIntentCommand.java b/cli/src/main/java/org/onlab/onos/cli/net/RemoveHostToHostIntentCommand.java
new file mode 100644
index 0000000..1840c0d
--- /dev/null
+++ b/cli/src/main/java/org/onlab/onos/cli/net/RemoveHostToHostIntentCommand.java
@@ -0,0 +1,37 @@
+package org.onlab.onos.cli.net;
+
+import org.apache.karaf.shell.commands.Argument;
+import org.apache.karaf.shell.commands.Command;
+import org.onlab.onos.cli.AbstractShellCommand;
+import org.onlab.onos.net.intent.Intent;
+import org.onlab.onos.net.intent.IntentId;
+import org.onlab.onos.net.intent.IntentService;
+
+/**
+ * Removes host-to-host connectivity intent.
+ */
+@Command(scope = "onos", name = "remove-host-intent",
+         description = "Removes host-to-host connectivity intent")
+public class RemoveHostToHostIntentCommand extends AbstractShellCommand {
+
+    @Argument(index = 0, name = "id", description = "Intent ID",
+              required = true, multiValued = false)
+    String id = null;
+
+    @Override
+    protected void execute() {
+        IntentService service = get(IntentService.class);
+
+        int radix = id.startsWith("0x") ? 16 : 10;
+        if (radix == 16) {
+            id = id.replaceFirst("0x", "");
+        }
+        IntentId intentId = new IntentId(Long.parseLong(id, radix));
+
+
+        Intent intent = service.getIntent(intentId);
+        if (intent != null) {
+            service.withdraw(intent);
+        }
+    }
+}
diff --git a/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
index f0516f7..17a9e29 100644
--- a/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ b/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
@@ -64,6 +64,9 @@
             </completers>
         </command>
         <command>
+            <action class="org.onlab.onos.cli.net.RemoveHostToHostIntentCommand"/>
+        </command>
+        <command>
             <action class="org.onlab.onos.cli.net.IntentsListCommand"/>
         </command>
 
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 ec7841c..f9cfa67 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,5 +1,9 @@
 package org.onlab.onos.net.intent.impl;
 
+import static org.onlab.onos.net.flow.DefaultTrafficTreatment.builder;
+
+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;
@@ -18,10 +22,6 @@
 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}.
  */
@@ -59,8 +59,8 @@
             TrafficTreatment treatment = builder()
                     .setOutput(link.src().port()).build();
             FlowRule rule = new DefaultFlowRule(link.src().deviceId(),
-                                                builder.build(), treatment,
-                                                123, appId, 600);
+                    builder.build(), treatment,
+                    123, appId, 600);
             flowRuleService.applyFlowRules(rule);
             prev = link.dst();
         }
@@ -69,6 +69,21 @@
 
     @Override
     public void uninstall(PathIntent intent) {
-        //TODO
+        TrafficSelector.Builder builder =
+                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 treatment = builder()
+                    .setOutput(link.src().port()).build();
+            FlowRule rule = new DefaultFlowRule(link.src().deviceId(),
+                    builder.build(), treatment,
+                    123, appId, 600);
+            flowRuleService.removeFlowRules(rule);
+            prev = link.dst();
+        }
     }
 }