diff --git a/src/main/java/com/intel/jndn/management/NFD.java b/src/main/java/com/intel/jndn/management/NFD.java
index e05b2a9..5b7442f 100644
--- a/src/main/java/com/intel/jndn/management/NFD.java
+++ b/src/main/java/com/intel/jndn/management/NFD.java
@@ -17,6 +17,7 @@
 import com.intel.jndn.management.types.FibEntry;
 import com.intel.jndn.management.types.RibEntry;
 import com.intel.jndn.utils.Client;
+import com.intel.jndn.utils.SegmentedClient;
 import java.io.IOException;
 import java.util.List;
 import net.named_data.jndn.ControlParameters;
@@ -90,12 +91,8 @@
     interest.setChildSelector(Interest.CHILD_SELECTOR_RIGHT);
     interest.setInterestLifetimeMilliseconds(DEFAULT_TIMEOUT);
 
-    // TODO verify that all faces are being returned; right now they don't
-    // match up with the results from nfd-status-http-server but no 
-    // additional segments are present;  
-    // see http://redmine.named-data.net/projects/nfd/wiki/StatusDataset
     // send packet
-    Data data = Client.getDefault().getSync(forwarder, interest);
+    Data data = SegmentedClient.getDefault().getSync(forwarder, interest);
     if (data == null) {
       throw new Exception("Failed to retrieve list of faces from the forwarder.");
     }
@@ -125,7 +122,7 @@
     // additional segments are present;  
     // see http://redmine.named-data.net/projects/nfd/wiki/StatusDataset
     // send packet
-    Data data = Client.getDefault().getSync(forwarder, interest);
+    Data data = SegmentedClient.getDefault().getSync(forwarder, interest);
     if (data == null) {
       throw new Exception("Failed to retrieve list of fib entries from the forwarder.");
     }
@@ -151,7 +148,7 @@
     interest.setInterestLifetimeMilliseconds(DEFAULT_TIMEOUT);
 
     // send packet
-    Data data = Client.getDefault().getSync(forwarder, interest);
+    Data data = SegmentedClient.getDefault().getSync(forwarder, interest);
     if (data == null) {
       throw new Exception("Failed to retrieve list of faces from the forwarder.");
     }
@@ -289,14 +286,10 @@
    * been set up (e.g. forwarder.setCommandSigningInfo()
    *
    * @param forwarder
-   * @param route
+   * @param controlParameters
    * @return
    */
-  public static boolean unregister(Face forwarder, Name route) throws Exception{
-     // build command name
-    ControlParameters controlParameters = new ControlParameters();
-    controlParameters.setName(route);
-
+  public static boolean unregister(Face forwarder, ControlParameters controlParameters) throws Exception {
     // build command name
     Name command = new Name("/localhost/nfd/rib/unregister");
     command.append(controlParameters.wireEncode());
@@ -306,6 +299,80 @@
   }
 
   /**
+   * Unregister a route on a forwarder; see
+   * http://named-data.net/doc/NFD/current/manpages/nfdc.html for command-line
+   * usage and http://redmine.named-data.net/projects/nfd/wiki/RibMgmt for
+   * protocol documentation. Ensure the forwarding face is on the local machine
+   * (management requests are to /localhost/...) and that command signing has
+   * been set up (e.g. forwarder.setCommandSigningInfo()
+   *
+   * @param forwarder
+   * @param route
+   * @return
+   */
+  public static boolean unregister(Face forwarder, Name route) throws Exception {
+    // build command name
+    ControlParameters controlParameters = new ControlParameters();
+    controlParameters.setName(route);
+
+    // send the interest
+    return unregister(forwarder, controlParameters);
+  }
+
+  /**
+   * Unregister a route on a forwarder; see
+   * http://named-data.net/doc/NFD/current/manpages/nfdc.html for command-line
+   * usage and http://redmine.named-data.net/projects/nfd/wiki/RibMgmt for
+   * protocol documentation. Ensure the forwarding face is on the local machine
+   * (management requests are to /localhost/...) and that command signing has
+   * been set up (e.g. forwarder.setCommandSigningInfo()
+   *
+   * @param forwarder
+   * @param route
+   * @param faceId
+   * @return
+   */
+  public static boolean unregister(Face forwarder, Name route, int faceId) throws Exception {
+    // build command name
+    ControlParameters controlParameters = new ControlParameters();
+    controlParameters.setName(route);
+    controlParameters.setFaceId(faceId);
+
+    // send the interest
+    return unregister(forwarder, controlParameters);
+  }
+
+  /**
+   * Unregister a route on a forwarder; see
+   * http://named-data.net/doc/NFD/current/manpages/nfdc.html for command-line
+   * usage and http://redmine.named-data.net/projects/nfd/wiki/RibMgmt for
+   * protocol documentation. Ensure the forwarding face is on the local machine
+   * (management requests are to /localhost/...) and that command signing has
+   * been set up (e.g. forwarder.setCommandSigningInfo()
+   *
+   * @param forwarder
+   * @param route
+   * @param uri
+   * @return
+   */
+  public static boolean unregister(Face forwarder, Name route, String uri) throws Exception {
+    int faceId = -1;
+    for(FaceStatus face : getFaceList(forwarder)){
+      if(face.getUri().matches(uri)){
+        faceId = face.getFaceId();
+        break;
+      }
+    }
+    
+    if(faceId == -1){
+      throw new Exception("Face not found: " + uri);
+    }
+
+    // send the interest
+    return unregister(forwarder, route, faceId);
+  }
+
+  /**
    * Set a strategy on the forwarder; see
    * http://named-data.net/doc/NFD/current/manpages/nfdc.html for command-line
    * usage and http://redmine.named-data.net/projects/nfd/wiki/StrategyChoice
diff --git a/src/test/java/com/intel/jndn/management/IntegrationSuite.java b/src/test/java/com/intel/jndn/management/IntegrationSuite.java
index a2263f2..05d59b0 100644
--- a/src/test/java/com/intel/jndn/management/IntegrationSuite.java
+++ b/src/test/java/com/intel/jndn/management/IntegrationSuite.java
@@ -14,6 +14,7 @@
 import junit.framework.Assert;
 import net.named_data.jndn.Face;
 import net.named_data.jndn.Name;
+import net.named_data.jndn.security.KeyChain;
 
 /**
  * Tests to run with a local NFD as part of integration testing; will not run in
@@ -25,19 +26,46 @@
 
   private static final Logger logger = Logger.getLogger(IntegrationSuite.class.getName());
 
+  /**
+   * Test NFD methods
+   *
+   * @param args
+   * @throws Exception
+   */
   public static void main(String[] args) throws Exception {
     Face face = new Face("localhost");
+    KeyChain keyChain = buildTestKeyChain();
+    face.setCommandSigningInfo(keyChain, keyChain.getDefaultCertificateName());
+
     Assert.assertTrue(NFD.pingLocal(face));
-    
+
     // grab datasets
     Assert.assertFalse(NFD.getFaceList(face).isEmpty());
     Assert.assertFalse(NFD.getFibList(face).isEmpty());
     Assert.assertFalse(NFD.getRouteList(face).isEmpty());
-    
+
     // create a new route
-    Assert.assertTrue(NFD.register(face, "contentstore://", new Name("/my/cache/route"), 999));
-    
+    Assert.assertTrue(NFD.register(face, "udp4://127.0.0.1:56363", new Name("/my/test/route"), 999));
+
     // remove the route
-    Assert.assertTrue(NFD.unregister(face, new Name("/my/cache/route")));
+    Assert.assertTrue(NFD.unregister(face, new Name("/my/test/route"), "udp4://127.0.0.1:56363"));
+  }
+
+  /**
+   * Setup the KeyChain with a default identity; TODO move this to
+   * MemoryIdentityStorage once it can handle getting/setting defaults
+   *
+   * @return
+   * @throws net.named_data.jndn.security.SecurityException
+   */
+  public static KeyChain buildTestKeyChain() throws net.named_data.jndn.security.SecurityException {
+    KeyChain keyChain = new KeyChain();
+    try {
+      keyChain.getDefaultCertificateName();
+    } catch (net.named_data.jndn.security.SecurityException e) {
+      keyChain.createIdentity(new Name("/test/identity"));
+      keyChain.getIdentityManager().setDefaultIdentity(new Name("/test/identity"));
+    }
+    return keyChain;
   }
 }
