diff --git a/pom.xml b/pom.xml
index fd61991..351aaa9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.intel.jndn.management</groupId>
   <artifactId>jndn-management</artifactId>
-  <version>0.10.1</version>
+  <version>0.10.2</version>
   <name>jndn-management</name>
   <description>Tools for managing an NDN forwarding daemon</description>
   <url>https://github.com/01org/jndn-management</url>
diff --git a/src/main/java/com/intel/jndn/management/NFD.java b/src/main/java/com/intel/jndn/management/NFD.java
index 1a15a9d..4895034 100644
--- a/src/main/java/com/intel/jndn/management/NFD.java
+++ b/src/main/java/com/intel/jndn/management/NFD.java
@@ -67,8 +67,8 @@
    * responding to requests. Note that the name must be served or cached on the
    * forwarder for this to return true.
    *
-   * @param face
-   * @param name
+   * @param face a {@link Face} to ping
+   * @param name a known {@link Name} that the remote node will answer to
    * @return true if successful, false otherwise
    */
   public static boolean ping(Face face, Name name) {
@@ -94,9 +94,10 @@
    * @return the forwarder status object, see
    * <a href="http://redmine.named-data.net/projects/nfd/wiki/ForwarderStatus">
    * http://redmine.named-data.net/projects/nfd/wiki/ForwarderStatus</a>.
-   * @throws java.lang.Exception
+   * @throws IOException if the network request failed
+   * @throws EncodingException if the returned status could not be decoded
    */
-  public static ForwarderStatus getForwarderStatus(Face forwarder) throws Exception {
+  public static ForwarderStatus getForwarderStatus(Face forwarder) throws IOException, EncodingException {
     Data data = retrieveStatus(forwarder);
     ForwarderStatus status = new ForwarderStatus();
     status.wireDecode(data.getContent().buf());
@@ -111,9 +112,10 @@
    * @param forwarder only a localhost Face
    * @return a list of face status objects, see
    * http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt.
-   * @throws java.lang.Exception
+   * @throws IOException if the network request failed
+   * @throws ManagementException if the NFD rejected the request
    */
-  public static List<FaceStatus> getFaceList(Face forwarder) throws Exception {
+  public static List<FaceStatus> getFaceList(Face forwarder) throws IOException, ManagementException {
     Data data = retrieveDataSet(forwarder, new Name("/localhost/nfd/faces/list"));
     return StatusDataset.wireDecode(data.getContent(), FaceStatus.class);
   }
@@ -126,9 +128,10 @@
    * @param forwarder only a localhost Face
    * @return a list of FIB entries, see
    * http://redmine.named-data.net/projects/nfd/wiki/FibMgmt#FIB-Dataset.
-   * @throws java.lang.Exception
+   * @throws IOException if the network request failed
+   * @throws ManagementException if the NFD rejected the request
    */
-  public static List<FibEntry> getFibList(Face forwarder) throws Exception {
+  public static List<FibEntry> getFibList(Face forwarder) throws IOException, ManagementException {
     Data data = retrieveDataSet(forwarder, new Name("/localhost/nfd/fib/list"));
     return StatusDataset.wireDecode(data.getContent(), FibEntry.class);
   }
@@ -141,9 +144,10 @@
    * @param forwarder only a localhost Face
    * @return a list of RIB entries, i.e. routes, see
    * http://redmine.named-data.net/projects/nfd/wiki/RibMgmt#RIB-Dataset.
-   * @throws java.lang.Exception
+   * @throws IOException if the network request failed
+   * @throws ManagementException if the NFD rejected the request
    */
-  public static List<RibEntry> getRouteList(Face forwarder) throws Exception {
+  public static List<RibEntry> getRouteList(Face forwarder) throws IOException, ManagementException {
     Data data = retrieveDataSet(forwarder, new Name("/localhost/nfd/rib/list"));
     return StatusDataset.wireDecode(data.getContent(), RibEntry.class);
   }
@@ -156,9 +160,10 @@
    * @param forwarder only a localhost Face
    * @return a list of strategy choice entries, i.e. routes, see
    * http://redmine.named-data.net/projects/nfd/wiki/StrategyChoice.
-   * @throws java.lang.Exception
+   * @throws IOException if the network request failed
+   * @throws ManagementException if the NFD rejected the request
    */
-  public static List<StrategyChoice> getStrategyList(Face forwarder) throws Exception {
+  public static List<StrategyChoice> getStrategyList(Face forwarder) throws IOException, ManagementException {
     Data data = retrieveDataSet(forwarder, new Name("/localhost/nfd/strategy-choice/list"));
     return StatusDataset.wireDecode(data.getContent(), StrategyChoice.class);
   }
@@ -168,8 +173,9 @@
    *
    * @param forwarder only a localhost {@link Face}
    * @return the {@link KeyLocator} of the NFD's key
-   * @throws ManagementException if the key is not available
-   * @throws IOException if the request fails
+   * @throws IOException if the network request failed
+   * @throws ManagementException if the NFD rejected the request or no
+   * KeyLocator was found
    */
   public static KeyLocator getKeyLocator(Face forwarder) throws ManagementException, IOException {
     Data data = retrieveStatus(forwarder);
@@ -184,12 +190,16 @@
    * <a href="http://named-data.net/doc/NFD/current/manpages/nfdc.html">http://named-data.net/doc/NFD/current/manpages/nfdc.html</a>,
    * this is more for debugging; use 'register' instead
    *
-   * @param forwarder only a localhost Face
-   * @param faceId
-   * @param prefix
-   * @throws java.lang.Exception
+   * @param forwarder only a localhost {@link Face}
+   * @param faceId the ID of the face to add, see
+   * {@link #createFace(net.named_data.jndn.Face, java.lang.String)} for
+   * creating this
+   * @param prefix the {@link Name} of the next-hop prefix
+   * @throws IOException if the network request failed
+   * @throws EncodingException if the NFD response could not be decoded
+   * @throws ManagementException if the NFD rejected the request
    */
-  public static void addNextHop(Face forwarder, int faceId, Name prefix) throws Exception {
+  public static void addNextHop(Face forwarder, int faceId, Name prefix) throws IOException, EncodingException, ManagementException {
     // build command name
     Name command = new Name("/localhost/nfd/fib/add-nexthop");
     ControlParameters parameters = new ControlParameters();
@@ -206,12 +216,15 @@
    * the local machine (management requests are to /localhost/...) and that
    * command signing has been set up (e.g. forwarder.setCommandSigningInfo()).
    *
-   * @param forwarder only a localhost Face
-   * @param uri
-   * @return
-   * @throws java.lang.Exception
+   * @param forwarder only a localhost {@link Face}
+   * @param uri a string like "tcp4://host.name.com" (see nfd-status channels
+   * for more protocol options)
+   * @return the newly created face ID
+   * @throws IOException if the network request failed
+   * @throws EncodingException if the NFD response could not be decoded
+   * @throws ManagementException if the NFD rejected the request
    */
-  public static int createFace(Face forwarder, String uri) throws Exception {
+  public static int createFace(Face forwarder, String uri) throws IOException, EncodingException, ManagementException {
     Name command = new Name("/localhost/nfd/faces/create");
     ControlParameters parameters = new ControlParameters();
     parameters.setUri(uri);
@@ -229,11 +242,13 @@
    * local machine (management requests are to /localhost/...) and that command
    * signing has been set up (e.g. forwarder.setCommandSigningInfo()).
    *
-   * @param forwarder only a localhost Face
-   * @param faceId
-   * @throws java.lang.Exception
+   * @param forwarder only a localhost {@link Face}
+   * @param faceId the ID of the face to destroy
+   * @throws IOException if the network request failed
+   * @throws EncodingException if the NFD response could not be decoded
+   * @throws ManagementException if the NFD rejected the request
    */
-  public static void destroyFace(Face forwarder, int faceId) throws Exception {
+  public static void destroyFace(Face forwarder, int faceId) throws IOException, EncodingException, ManagementException {
     Name command = new Name("/localhost/nfd/faces/destroy");
     ControlParameters parameters = new ControlParameters();
     parameters.setFaceId(faceId);
@@ -247,11 +262,13 @@
    * Enable a local control feature on the given forwarder. See
    * <a href="http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Enable-a-LocalControlHeader-feature">http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Enable-a-LocalControlHeader-feature</a>
    *
-   * @param forwarder
-   * @param header
-   * @throws Exception
+   * @param forwarder only a localhost {@link Face}
+   * @param header the control feature to enable
+   * @throws IOException if the network request failed
+   * @throws EncodingException if the NFD response could not be decoded
+   * @throws ManagementException if the NFD rejected the request
    */
-  public static void enableLocalControlHeader(Face forwarder, LocalControlHeader header) throws Exception {
+  public static void enableLocalControlHeader(Face forwarder, LocalControlHeader header) throws IOException, EncodingException, ManagementException {
     // build command name
     Name command = new Name("/localhost/nfd/faces/enable-local-control");
     ControlParameters parameters = new ControlParameters();
@@ -266,11 +283,13 @@
    * Disable a local control feature on the given forwarder. See
    * <a href="http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Disable-a-LocalControlHeader-feature">http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Disable-a-LocalControlHeader-feature</a>
    *
-   * @param forwarder
-   * @param header
-   * @throws Exception
+   * @param forwarder only a localhost {@link Face}
+   * @param header the control feature to disable
+   * @throws IOException if the network request failed
+   * @throws EncodingException if the NFD response could not be decoded
+   * @throws ManagementException if the NFD rejected the request
    */
-  public static void disableLocalControlHeader(Face forwarder, LocalControlHeader header) throws Exception {
+  public static void disableLocalControlHeader(Face forwarder, LocalControlHeader header) throws IOException, EncodingException, ManagementException {
     // build command name
     Name command = new Name("/localhost/nfd/faces/disable-local-control");
     ControlParameters parameters = new ControlParameters();
@@ -290,11 +309,13 @@
    * machine (management requests are to /localhost/...) and that command
    * signing has been set up (e.g. forwarder.setCommandSigningInfo()).
    *
-   * @param forwarder only a localhost Face
-   * @param controlParameters
-   * @throws Exception
+   * @param forwarder only a localhost {@link Face}
+   * @param controlParameters the {@link ControlParameters} command options
+   * @throws IOException if the network request failed
+   * @throws EncodingException if the NFD response could not be decoded
+   * @throws ManagementException if the NFD rejected the request
    */
-  public static void register(Face forwarder, ControlParameters controlParameters) throws Exception {
+  public static void register(Face forwarder, ControlParameters controlParameters) throws IOException, EncodingException, ManagementException {
     // build command name
     Name command = new Name("/localhost/nfd/rib/register");
     command.append(controlParameters.wireEncode());
@@ -308,13 +329,15 @@
    * forwarder to the given URI/route pair. See register(Face,
    * ControlParameters) for more details documentation.
    *
-   * @param forwarder only a localhost Face
-   * @param uri
-   * @param cost
-   * @param route
-   * @throws java.lang.Exception
+   * @param forwarder only a localhost {@link Face}
+   * @param uri the URI (e.g. "tcp4://some.host.com") of the remote node
+   * @param route the {@link Name} prefix of the route
+   * @param cost the numeric cost of forwarding along the route
+   * @throws IOException if the network request failed
+   * @throws EncodingException if the NFD response could not be decoded
+   * @throws ManagementException if the NFD rejected the request
    */
-  public static void register(Face forwarder, String uri, Name route, int cost) throws Exception {
+  public static void register(Face forwarder, String uri, Name route, int cost) throws IOException, EncodingException, ManagementException {
     // create the new face
     int faceId = createFace(forwarder, uri);
 
@@ -327,13 +350,15 @@
    * is provided a faceId. See register(Face, ControlParameters) for full
    * documentation
    *
-   * @param forwarder only a localhost Face
-   * @param faceId
-   * @param route
-   * @param cost
-   * @throws java.lang.Exception
+   * @param forwarder only a localhost {@link Face}
+   * @param faceId the ID of the {@link Face} to assign to the route
+   * @param route the {@link Name} prefix of the route
+   * @param cost the numeric cost of forwarding along the route
+   * @throws IOException if the network request failed
+   * @throws EncodingException if the NFD response could not be decoded
+   * @throws ManagementException if the NFD rejected the request
    */
-  public static void register(Face forwarder, int faceId, Name route, int cost) throws Exception {
+  public static void register(Face forwarder, int faceId, Name route, int cost) throws IOException, EncodingException, ManagementException {
     // build command name
     ControlParameters parameters = new ControlParameters();
     parameters.setName(route);
@@ -357,11 +382,13 @@
    * machine (management requests are to /localhost/...) and that command
    * signing has been set up (e.g. forwarder.setCommandSigningInfo()
    *
-   * @param forwarder
-   * @param controlParameters
-   * @throws java.lang.Exception
+   * @param forwarder only a localhost {@link Face}
+   * @param controlParameters the {@link ControlParameters} command options
+   * @throws IOException if the network request failed
+   * @throws EncodingException if the NFD response could not be decoded
+   * @throws ManagementException if the NFD rejected the request
    */
-  public static void unregister(Face forwarder, ControlParameters controlParameters) throws Exception {
+  public static void unregister(Face forwarder, ControlParameters controlParameters) throws IOException, EncodingException, ManagementException {
     // build command name
     Name command = new Name("/localhost/nfd/rib/unregister");
     command.append(controlParameters.wireEncode());
@@ -379,11 +406,13 @@
    * machine (management requests are to /localhost/...) and that command
    * signing has been set up (e.g. forwarder.setCommandSigningInfo()
    *
-   * @param forwarder
-   * @param route
-   * @throws java.lang.Exception
+   * @param forwarder only a localhost {@link Face}
+   * @param route the {@link Name} prefix of the route
+   * @throws IOException if the network request failed
+   * @throws EncodingException if the NFD response could not be decoded
+   * @throws ManagementException if the NFD rejected the request
    */
-  public static void unregister(Face forwarder, Name route) throws Exception {
+  public static void unregister(Face forwarder, Name route) throws IOException, EncodingException, ManagementException {
     // build command name
     ControlParameters controlParameters = new ControlParameters();
     controlParameters.setName(route);
@@ -401,12 +430,15 @@
    * machine (management requests are to /localhost/...) and that command
    * signing has been set up (e.g. forwarder.setCommandSigningInfo()
    *
-   * @param forwarder
-   * @param route
-   * @param faceId
-   * @throws java.lang.Exception
+   * @param forwarder only a localhost {@link Face}
+   * @param route the {@link Name} prefix of the route
+   * @param faceId the specific ID of the face to remove (more than one face can
+   * be registered to a route)
+   * @throws IOException if the network request failed
+   * @throws EncodingException if the NFD response could not be decoded
+   * @throws ManagementException if the NFD rejected the request
    */
-  public static void unregister(Face forwarder, Name route, int faceId) throws Exception {
+  public static void unregister(Face forwarder, Name route, int faceId) throws IOException, EncodingException, ManagementException {
     // build command name
     ControlParameters controlParameters = new ControlParameters();
     controlParameters.setName(route);
@@ -425,12 +457,15 @@
    * machine (management requests are to /localhost/...) and that command
    * signing has been set up (e.g. forwarder.setCommandSigningInfo()
    *
-   * @param forwarder
-   * @param route
-   * @param uri
-   * @throws java.lang.Exception
+   * @param forwarder only a localhost {@link Face}
+   * @param route the {@link Name} prefix of the route
+   * @param uri the URI (e.g. "tcp4://some.host.com") of the remote node (more
+   * than one face can be registered to a route)
+   * @throws IOException if the network request failed
+   * @throws EncodingException if the NFD response could not be decoded
+   * @throws ManagementException if the NFD rejected the request
    */
-  public static void unregister(Face forwarder, Name route, String uri) throws Exception {
+  public static void unregister(Face forwarder, Name route, String uri) throws IOException, EncodingException, ManagementException {
     int faceId = -1;
     for (FaceStatus face : getFaceList(forwarder)) {
       if (face.getUri().matches(uri)) {
@@ -456,13 +491,15 @@
    * machine (management requests are to /localhost/...) and that command
    * signing has been set up (e.g. forwarder.setCommandSigningInfo()).
    *
-   * @param forwarder only a localhost Face
+   * @param forwarder only a localhost {@link Face}
    * @param prefix the {@link Name} prefix
    * @param strategy the {@link Name} of the strategy to set, e.g.
    * /localhost/nfd/strategy/broadcast
-   * @throws Exception if the command fails
+   * @throws IOException if the network request failed
+   * @throws EncodingException if the NFD response could not be decoded
+   * @throws ManagementException if the NFD rejected the request
    */
-  public static void setStrategy(Face forwarder, Name prefix, Name strategy) throws Exception {
+  public static void setStrategy(Face forwarder, Name prefix, Name strategy) throws IOException, EncodingException, ManagementException {
     // build command name
     Name command = new Name("/localhost/nfd/strategy-choice/set");
     ControlParameters parameters = new ControlParameters();
@@ -483,9 +520,11 @@
    *
    * @param forwarder only a localhost {@link Face}
    * @param prefix the {@link Name} prefix
-   * @throws Exception if the command fails
+   * @throws IOException if the network request failed
+   * @throws EncodingException if the NFD response could not be decoded
+   * @throws ManagementException if the NFD rejected the request
    */
-  public static void unsetStrategy(Face forwarder, Name prefix) throws Exception {
+  public static void unsetStrategy(Face forwarder, Name prefix) throws IOException, EncodingException, ManagementException {
     // build command name
     Name command = new Name("/localhost/nfd/strategy-choice/unset");
     ControlParameters parameters = new ControlParameters();
