diff --git a/src/main/java/com/intel/jndn/management/ManagementException.java b/src/main/java/com/intel/jndn/management/ManagementException.java
index 89a0b25..8e2edfd 100644
--- a/src/main/java/com/intel/jndn/management/ManagementException.java
+++ b/src/main/java/com/intel/jndn/management/ManagementException.java
@@ -26,23 +26,28 @@
  */
 public class ManagementException extends Exception {
   /**
-   * Constructor from the message
+   * Constructor from the message.
+   * @param message Error message
    */
-  public ManagementException(String message) {
+  public ManagementException(final String message) {
     super(message);
   }
 
   /**
-   * Constructor from the message and the cause
+   * Constructor from the message and the cause.
+   * @param message Error message
+   * @param cause Chained exception
    */
-  public ManagementException(String message, Throwable cause) {
+  public ManagementException(final String message, final Throwable cause) {
     super(message, cause);
   }
 
   /**
-   * Parse an NFD response to create a ManagementException.
+   * Create exception from NFD's ControlResponse.
+   * @param response ControlResponse from which to use status code and status text
+   * @return new instance of ManagementException
    */
-  public static ManagementException fromResponse(ControlResponse response) {
+  public static ManagementException fromResponse(final ControlResponse response) {
     String message = "Action failed, forwarder returned: " + response.getStatusCode() + " " + response.getStatusText();
     return new ManagementException(message);
   }
diff --git a/src/main/java/com/intel/jndn/management/NdnPingClient.java b/src/main/java/com/intel/jndn/management/NdnPingClient.java
index ecdaecc..95dc279 100644
--- a/src/main/java/com/intel/jndn/management/NdnPingClient.java
+++ b/src/main/java/com/intel/jndn/management/NdnPingClient.java
@@ -23,12 +23,15 @@
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
-public class NdnPingClient {
+/**
+ * Simplistic checker for live connection to NFD forwarder.
+ */
+public final class NdnPingClient {
   public static final long DEFAULT_TIMEOUT = 2000;
   private static final Logger LOG = Logger.getLogger(NdnPingClient.class.getName());
 
   /**
-   * Prevent creation of NdnPingClient instances
+   * Prevent creation of NdnPingClient instances.
    */
   private NdnPingClient() {
   }
@@ -42,7 +45,7 @@
    * @param face only a localhost Face
    * @return true if successful, false otherwise
    */
-  public static boolean pingLocal(Face face) {
+  public static boolean pingLocal(final Face face) {
     return ping(face, new Name("/localhost/nfd"));
   }
 
@@ -55,7 +58,7 @@
    * @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) {
+  public static boolean ping(final Face face, final Name name) {
     // build interest
     Interest interest = new Interest(name);
     interest.setInterestLifetimeMilliseconds(DEFAULT_TIMEOUT);
diff --git a/src/main/java/com/intel/jndn/management/Nfdc.java b/src/main/java/com/intel/jndn/management/Nfdc.java
index ca1a52b..807ef90 100644
--- a/src/main/java/com/intel/jndn/management/Nfdc.java
+++ b/src/main/java/com/intel/jndn/management/Nfdc.java
@@ -16,16 +16,24 @@
 import com.intel.jndn.management.enums.RouteOrigin;
 import com.intel.jndn.management.helpers.FetchHelper;
 import com.intel.jndn.management.helpers.StatusDatasetHelper;
-import net.named_data.jndn.*;
 import com.intel.jndn.management.types.FaceStatus;
 import com.intel.jndn.management.types.FibEntry;
 import com.intel.jndn.management.types.ForwarderStatus;
 import com.intel.jndn.management.enums.LocalControlHeader;
 import com.intel.jndn.management.types.RibEntry;
 import com.intel.jndn.management.types.StrategyChoice;
+
 import java.io.IOException;
 import java.util.List;
 
+import net.named_data.jndn.ControlResponse;
+import net.named_data.jndn.Data;
+import net.named_data.jndn.Interest;
+import net.named_data.jndn.Name;
+import net.named_data.jndn.KeyLocator;
+import net.named_data.jndn.Face;
+import net.named_data.jndn.ControlParameters;
+import net.named_data.jndn.ForwardingFlags;
 import net.named_data.jndn.encoding.EncodingException;
 import net.named_data.jndn.security.SecurityException;
 
@@ -36,32 +44,31 @@
  *
  * @author Andrew Brown <andrew.brown@intel.com>
  */
-public class Nfdc {
+public final class Nfdc {
   private static final int OK_STATUS = 200;
 
   /////////////////////////////////////////////////////////////////////////////
 
   /**
-   * Prevent creation of Nfdc instances
+   * Prevent creation of Nfdc instances.
    */
   private Nfdc() {
   }
 
   /**
    * Retrieve the status of the given forwarder; calls /localhost/nfd/status/general
-   * which requires a local Face (all non-local packets are dropped)
+   * which requires a local Face (all non-local packets are dropped).
    *
    * @param face only a localhost Face
    * @return the forwarder status object
-   *
-   * @see <a href="http://redmine.named-data.net/projects/nfd/wiki/ForwarderStatus">ForwarderStatus</a>
    * @throws ManagementException if the network request failed or the returned status could not be decoded
+   * @see <a href="http://redmine.named-data.net/projects/nfd/wiki/ForwarderStatus">ForwarderStatus</a>
    */
-  public static ForwarderStatus getForwarderStatus(Face face) throws ManagementException {
+  public static ForwarderStatus getForwarderStatus(final Face face) throws ManagementException {
     try {
       List<Data> segments = FetchHelper.getSegmentedData(face, new Name("/localhost/nfd/status/general"));
       return new ForwarderStatus(StatusDatasetHelper.combine(segments));
-    } catch (IOException|EncodingException e) {
+    } catch (IOException | EncodingException e) {
       throw new ManagementException(e.getMessage(), e);
     }
   }
@@ -69,15 +76,14 @@
   /**
    * Retrieve a list of faces and their status from the given forwarder; calls
    * /localhost/nfd/faces/list which requires a local Face (all non-local
-   * packets are dropped)
+   * packets are dropped).
    *
    * @param face only a localhost Face
    * @return a list of face status objects
-   *
-   * @see <a href="http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt">FaceManagement</a>
    * @throws ManagementException if the network request failed or if the NFD rejected the request
+   * @see <a href="http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt">FaceManagement</a>
    */
-  public static List<FaceStatus> getFaceList(Face face) throws ManagementException {
+  public static List<FaceStatus> getFaceList(final Face face) throws ManagementException {
     try {
       List<Data> segments = FetchHelper.getSegmentedData(face, new Name("/localhost/nfd/faces/list"));
       return StatusDatasetHelper.wireDecode(segments, FaceStatus.class);
@@ -93,11 +99,10 @@
    *
    * @param face only a localhost Face
    * @return a list of FIB entries
-   *
-   * @see <a href="http://redmine.named-data.net/projects/nfd/wiki/FibMgmt#FIB-Dataset">FIB Dataset</a>
    * @throws ManagementException if the network request failed or if the NFD rejected the request
+   * @see <a href="http://redmine.named-data.net/projects/nfd/wiki/FibMgmt#FIB-Dataset">FIB Dataset</a>
    */
-  public static List<FibEntry> getFibList(Face face) throws ManagementException {
+  public static List<FibEntry> getFibList(final Face face) throws ManagementException {
     try {
       List<Data> segments = FetchHelper.getSegmentedData(face, new Name("/localhost/nfd/fib/list"));
       return StatusDatasetHelper.wireDecode(segments, FibEntry.class);
@@ -113,11 +118,10 @@
    *
    * @param face only a localhost Face
    * @return a list of RIB entries, i.e. routes
-   *
-   * @see <a href="http://redmine.named-data.net/projects/nfd/wiki/RibMgmt#RIB-Dataset">RIB Dataset</a>
    * @throws ManagementException if the network request failed or if the NFD rejected the request
+   * @see <a href="http://redmine.named-data.net/projects/nfd/wiki/RibMgmt#RIB-Dataset">RIB Dataset</a>
    */
-  public static List<RibEntry> getRouteList(Face face) throws ManagementException {
+  public static List<RibEntry> getRouteList(final Face face) throws ManagementException {
     try {
       List<Data> segments = FetchHelper.getSegmentedData(face, new Name("/localhost/nfd/rib/list"));
       return StatusDatasetHelper.wireDecode(segments, RibEntry.class);
@@ -133,12 +137,11 @@
    *
    * @param face only a localhost Face
    * @return a list of strategy choice entries, i.e. routes
-   *
+   * @throws ManagementException if the network request failed, the NFD response could not be decoded, or
+   *                             the NFD rejected the request
    * @see <a href="http://redmine.named-data.net/projects/nfd/wiki/StrategyChoice">StrategyChoice</a>
-   * @throws ManagementException  if the network request failed, the NFD response could not be decoded, or
-   *                              the NFD rejected the request
    */
-  public static List<StrategyChoice> getStrategyList(Face face) throws ManagementException {
+  public static List<StrategyChoice> getStrategyList(final Face face) throws ManagementException {
     try {
       List<Data> segments = FetchHelper.getSegmentedData(face, new Name("/localhost/nfd/strategy-choice/list"));
       return StatusDatasetHelper.wireDecode(segments, StrategyChoice.class);
@@ -155,7 +158,7 @@
    * @throws ManagementException if the network request failed, if the NFD rejected the request, or no
    *                             KeyLocator was found
    */
-  public static KeyLocator getKeyLocator(Face face) throws ManagementException {
+  public static KeyLocator getKeyLocator(final Face face) throws ManagementException {
     try {
       List<Data> segments = FetchHelper.getSegmentedData(face, new Name("/localhost/nfd/status/general"));
       if (segments.isEmpty() || !KeyLocator.canGetFromSignature(segments.get(0).getSignature())) {
@@ -173,13 +176,13 @@
    * command signing has been set up (e.g. forwarder.setCommandSigningInfo()).
    *
    * @param face only a localhost {@link Face}
-   * @param uri       a string like "tcp4://host.name.com" (see nfd-status channels
-   *                  for more protocol options)
+   * @param uri  a string like "tcp4://host.name.com" (see nfd-status channels
+   *             for more protocol options)
    * @return the newly created face ID
    * @throws ManagementException if the network request failed, the NFD response could not be decoded, or
    *                             the NFD rejected the request
    */
-  public static int createFace(Face face, String uri) throws ManagementException {
+  public static int createFace(final Face face, final String uri) throws ManagementException {
     Name command = new Name("/localhost/nfd/faces/create");
     ControlParameters parameters = new ControlParameters();
     parameters.setUri(uri);
@@ -191,8 +194,7 @@
 
       // return
       return response.getBodyAsControlParameters().getFaceId();
-    }
-    catch (IOException|EncodingException e) {
+    } catch (IOException | EncodingException e) {
       throw new ManagementException(e.getMessage(), e);
     }
   }
@@ -202,12 +204,12 @@
    * local machine (management requests are to /localhost/...) and that command
    * signing has been set up (e.g. forwarder.setCommandSigningInfo()).
    *
-   * @param face only a localhost {@link Face}
-   * @param faceId    the ID of the face to destroy
+   * @param face   only a localhost {@link Face}
+   * @param faceId the ID of the face to destroy
    * @throws ManagementException if the network request failed, the NFD response could not be decoded, or
    *                             the NFD rejected the request
    */
-  public static void destroyFace(Face face, int faceId) throws ManagementException {
+  public static void destroyFace(final Face face, final int faceId) throws ManagementException {
     Name command = new Name("/localhost/nfd/faces/destroy");
     ControlParameters parameters = new ControlParameters();
     parameters.setFaceId(faceId);
@@ -215,21 +217,22 @@
 
     try {
       sendCommand(face, command);
-    } catch (IOException|EncodingException|ManagementException e) {
+    } catch (IOException | EncodingException | ManagementException e) {
       throw new ManagementException(e.getMessage(), e);
     }
   }
 
   /**
-   * 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>
+   * Enable a local control feature on the given forwarder.
    *
-   * @param face only a localhost {@link Face}
-   * @param header    the control feature to enable
+   * @param face   only a localhost {@link Face}
+   * @param header the control feature to enable
    * @throws ManagementException if the network request failed, the NFD response could not be decoded, or
    *                             the NFD rejected the request
+   * @see <a href="http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt">Face Management</a>
    */
-  public static void enableLocalControlHeader(Face face, LocalControlHeader header) throws ManagementException {
+  public static void enableLocalControlHeader(final Face face, final LocalControlHeader header) throws
+    ManagementException {
     // build command name
     Name command = new Name("/localhost/nfd/faces/enable-local-control");
     ControlParameters parameters = new ControlParameters();
@@ -238,21 +241,22 @@
 
     try {
       sendCommand(face, command);
-    } catch (IOException|EncodingException|ManagementException e) {
+    } catch (IOException | EncodingException | ManagementException e) {
       throw new ManagementException(e.getMessage(), e);
     }
   }
 
   /**
-   * 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>
+   * Disable a local control feature on the given forwarder.
    *
-   * @param face only a localhost {@link Face}
-   * @param header    the control feature to disable
+   * @param face   only a localhost {@link Face}
+   * @param header the control feature to disable
    * @throws ManagementException if the network request failed, the NFD response could not be decoded, or
    *                             the NFD rejected the request
+   * @see <a href="http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt">Face Management</a>
    */
-  public static void disableLocalControlHeader(Face face, LocalControlHeader header) throws ManagementException {
+  public static void disableLocalControlHeader(final Face face, final LocalControlHeader header) throws
+    ManagementException {
     // build command name
     Name command = new Name("/localhost/nfd/faces/disable-local-control");
     ControlParameters parameters = new ControlParameters();
@@ -261,48 +265,47 @@
 
     try {
       sendCommand(face, command);
-    } catch (IOException|EncodingException|ManagementException e) {
+    } catch (IOException | EncodingException | ManagementException e) {
       throw new ManagementException(e.getMessage(), e);
     }
   }
 
   /**
-   * Register a route on the forwarder; see
-   * <a href="http://named-data.net/doc/NFD/current/manpages/nfdc.html">http://named-data.net/doc/NFD/current/manpages/nfdc.html</a>
-   * for command-line usage and
-   * <a href="http://redmine.named-data.net/projects/nfd/wiki/RibMgmt">http://redmine.named-data.net/projects/nfd/wiki/RibMgmt</a>
-   * for protocol documentation. Ensure the forwarding face is on the local
-   * machine (management requests are to /localhost/...) and that command
+   * Register a route on the forwarder.
+   * <p/>
+   * 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 face         only a localhost {@link Face}
+   * @param face              only a localhost {@link Face}
    * @param controlParameters the {@link ControlParameters} command options
    * @throws ManagementException if the network request failed, the NFD response could not be decoded, or
    *                             the NFD rejected the request
+   * @see <a href="http://named-data.net/doc/NFD/current/manpages/nfdc.html">nfdc</a>
+   * @see <a href="http://redmine.named-data.net/projects/nfd/wiki/RibMgmt">RIB Management</a>
    */
-  public static void register(Face face, ControlParameters controlParameters) throws ManagementException {
+  public static void register(final Face face, final ControlParameters controlParameters) throws ManagementException {
     // build command name
     Name command = new Name("/localhost/nfd/rib/register");
     command.append(controlParameters.wireEncode());
 
     try {
       sendCommand(face, command);
-    } catch (IOException|EncodingException|ManagementException e) {
+    } catch (IOException | EncodingException | ManagementException e) {
       throw new ManagementException(e.getMessage(), e);
     }
   }
 
   /**
    * Register a route on a forwarder; this will create a new face on the
-   * forwarder towards the face (e.g., self registration)
+   * forwarder towards the face (e.g., self registration).
    *
-   * @param face only a localhost {@link Face}
-   * @param route     the {@link Name} prefix of the route
-   * @param cost      the numeric cost of forwarding along the route
+   * @param face  only a localhost {@link Face}
+   * @param route the {@link Name} prefix of the route
+   * @param cost  the numeric cost of forwarding along the route
    * @throws ManagementException if the network request failed, the NFD response could not be decoded, or
    *                             the NFD rejected the request
    */
-  public static void register(Face face, Name route, int cost) throws ManagementException {
+  public static void register(final Face face, final Name route, final int cost) throws ManagementException {
     ForwardingFlags flags = new ForwardingFlags();
     flags.setCapture(false);
     flags.setChildInherit(true);
@@ -313,22 +316,24 @@
       .setOrigin(RouteOrigin.APP.toInteger())
       .setForwardingFlags(flags));
   }
+
   /**
    * Register a route on a forwarder; this will create a new face on the
    * forwarder to the given URI/route pair. See register(Face,
    * ControlParameters) for more detailed documentation.
    *
-   * @param face only a localhost {@link Face}
-   * @param uri       the URI (e.g. "tcp4://10.10.2.2:6363") of the remote node; note
-   *                  that this must be one of the canonical forms described in the wiki
-   *                  (http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#TCP) for NFD to
-   *                  accept the registration--otherwise you will see 400 errors
-   * @param route     the {@link Name} prefix of the route
-   * @param cost      the numeric cost of forwarding along the route
+   * @param face  only a localhost {@link Face}
+   * @param uri   the URI (e.g. "tcp4://10.10.2.2:6363") of the remote node; note
+   *              that this must be one of the canonical forms described in the wiki
+   *              (http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#TCP) for NFD to
+   *              accept the registration--otherwise you will see 400 errors
+   * @param route the {@link Name} prefix of the route
+   * @param cost  the numeric cost of forwarding along the route
    * @throws ManagementException if the network request failed, the NFD response could not be decoded, or
    *                             the NFD rejected the request
    */
-  public static void register(Face face, String uri, Name route, int cost) throws ManagementException {
+  public static void register(final Face face, final String uri, final Name route, final int cost) throws
+    ManagementException {
     // create the new face
     int faceId = createFace(face, uri);
 
@@ -348,7 +353,8 @@
    * @throws ManagementException if the network request failed, the NFD response could not be decoded, or
    *                             the NFD rejected the request
    */
-  public static void register(Face forwarder, int faceId, Name route, int cost) throws ManagementException {
+  public static void register(final Face forwarder, final int faceId, final Name route, final int cost) throws
+    ManagementException {
     // build command name
     ControlParameters parameters = new ControlParameters();
     parameters.setName(route);
@@ -365,46 +371,44 @@
   }
 
   /**
-   * Unregister a route on a forwarder; see
-   * <a href="http://named-data.net/doc/NFD/current/manpages/nfdc.html">http://named-data.net/doc/NFD/current/manpages/nfdc.html</a>
-   * for command-line usage and
-   * <a href="http://redmine.named-data.net/projects/nfd/wiki/RibMgmt">http://redmine.named-data.net/projects/nfd/wiki/RibMgmt</a>
-   * 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()).
+   * Unregister a route on a forwarder
+   * <p/>
+   * 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 face         only a localhost {@link Face}
+   * @param face              only a localhost {@link Face}
    * @param controlParameters the {@link ControlParameters} command options
    * @throws ManagementException if the network request failed, the NFD response could not be decoded, or
    *                             the NFD rejected the request
+   * @see <a href="http://named-data.net/doc/NFD/current/manpages/nfdc.html">nfdc</a>
+   * @see <a href="http://redmine.named-data.net/projects/nfd/wiki/RibMgmt">RIB Management</a>
    */
-  public static void unregister(Face face, ControlParameters controlParameters) throws ManagementException {
+  public static void unregister(final Face face, final ControlParameters controlParameters) throws ManagementException {
     // build command name
     Name command = new Name("/localhost/nfd/rib/unregister");
     command.append(controlParameters.wireEncode());
 
     try {
       sendCommand(face, command);
-    } catch (IOException|EncodingException|ManagementException e) {
+    } catch (IOException | EncodingException | ManagementException e) {
       throw new ManagementException(e.getMessage(), e);
     }
   }
 
   /**
-   * Unregister a route on a forwarder; see
-   * <a href="http://named-data.net/doc/NFD/current/manpages/nfdc.html">http://named-data.net/doc/NFD/current/manpages/nfdc.html</a>
-   * for command-line usage and
-   * <a href="http://redmine.named-data.net/projects/nfd/wiki/RibMgmt">http://redmine.named-data.net/projects/nfd/wiki/RibMgmt</a>
-   * for protocol documentation. Ensure the forwarding face is on the local
-   * machine (management requests are to /localhost/...) and that command
+   * Unregister a route on a forwarder.
+   * <p/>
+   * 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 face only a localhost {@link Face}
-   * @param route     the {@link Name} prefix of the route
+   * @param face  only a localhost {@link Face}
+   * @param route the {@link Name} prefix of the route
    * @throws ManagementException if the network request failed, the NFD response could not be decoded, or
    *                             the NFD rejected the request
+   * @see <a href="http://named-data.net/doc/NFD/current/manpages/nfdc.html">nfdc</a>
+   * @see <a href="http://redmine.named-data.net/projects/nfd/wiki/RibMgmt">RIB Management</a>
    */
-  public static void unregister(Face face, Name route) throws ManagementException {
+  public static void unregister(final Face face, final Name route) throws ManagementException {
     // build command name
     ControlParameters controlParameters = new ControlParameters();
     controlParameters.setName(route);
@@ -415,21 +419,20 @@
 
   /**
    * Unregister a route on a forwarder; see
-   * <a href="http://named-data.net/doc/NFD/current/manpages/nfdc.html">http://named-data.net/doc/NFD/current/manpages/nfdc.html</a>
-   * for command-line usage and
-   * <a href="http://redmine.named-data.net/projects/nfd/wiki/RibMgmt">http://redmine.named-data.net/projects/nfd/wiki/RibMgmt</a>
-   * for protocol documentation. Ensure the forwarding face is on the local
-   * machine (management requests are to /localhost/...) and that command
+   * <p/>
+   * 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 face 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)
+   * @param face   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 ManagementException if the network request failed, the NFD response could not be decoded, or
    *                             the NFD rejected the request
+   * @see <a href="http://named-data.net/doc/NFD/current/manpages/nfdc.html">nfdc</a>
+   * @see <a href="http://redmine.named-data.net/projects/nfd/wiki/RibMgmt">RIB Management</a>
    */
-  public static void unregister(Face face, Name route, int faceId) throws ManagementException {
+  public static void unregister(final Face face, final Name route, final int faceId) throws ManagementException {
     // build command name
     ControlParameters controlParameters = new ControlParameters();
     controlParameters.setName(route);
@@ -441,20 +444,20 @@
 
   /**
    * Unregister a route on a forwarder
-   *
+   * <p/>
    * Ensure the forwarding face is on the local machine (management requests are to /localhost/...) and that command
    * signing has been set up using forwarder.setCommandSigningInfo().
    *
-   * @param face 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)
+   * @param face  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 ManagementException if the network request failed, the NFD response could not be decoded, or
    *                             the NFD rejected the request
    * @see <a href="http://named-data.net/doc/NFD/current/manpages/nfdc.html">nfdc command-line usage</a>
    * @see <a href="http://redmine.named-data.net/projects/nfd/wiki/RibMgmt">RibMgmt</a>
    */
-  public static void unregister(Face face, Name route, String uri) throws ManagementException {
+  public static void unregister(final Face face, final Name route, final String uri) throws ManagementException {
     int faceId = -1;
     for (FaceStatus faceStatus : getFaceList(face)) {
       if (faceStatus.getRemoteUri().matches(uri)) {
@@ -473,20 +476,20 @@
 
   /**
    * Set a strategy on the forwarder
-   *
+   * <p/>
    * Ensure the forwarding face is on the local machine (management requests are to /localhost/...) and that command
    * signing has been set up using forwarder.setCommandSigningInfo().
    *
-   * @param face 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
+   * @param face     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 ManagementException if the network request failed, the NFD response could not be decoded, or
    *                             the NFD rejected the request
    * @see <a href="http://named-data.net/doc/NFD/current/manpages/nfdc.html">nfdc command-line usage</a>
    * @see <a href="http://redmine.named-data.net/projects/nfd/wiki/StrategyChoice">StrategyChoice</a>
    */
-  public static void setStrategy(Face face, Name prefix, Name strategy) throws ManagementException {
+  public static void setStrategy(final Face face, final Name prefix, final Name strategy) throws ManagementException {
     // build command name
     Name command = new Name("/localhost/nfd/strategy-choice/set");
     ControlParameters parameters = new ControlParameters();
@@ -496,7 +499,7 @@
 
     try {
       sendCommand(face, command);
-    } catch (IOException|EncodingException|ManagementException e) {
+    } catch (IOException | EncodingException | ManagementException e) {
       throw new ManagementException(e.getMessage(), e);
     }
   }
@@ -508,12 +511,12 @@
    * (management requests are to /localhost/...) and that command signing has
    * been set up (e.g. forwarder.setCommandSigningInfo()).
    *
-   * @param face only a localhost {@link Face}
-   * @param prefix    the {@link Name} prefix
+   * @param face   only a localhost {@link Face}
+   * @param prefix the {@link Name} prefix
    * @throws ManagementException if the network request failed, the NFD response could not be decoded, or
    *                             the NFD rejected the request
    */
-  public static void unsetStrategy(Face face, Name prefix) throws ManagementException {
+  public static void unsetStrategy(final Face face, final Name prefix) throws ManagementException {
     // build command name
     Name command = new Name("/localhost/nfd/strategy-choice/unset");
     ControlParameters parameters = new ControlParameters();
@@ -522,7 +525,7 @@
 
     try {
       sendCommand(face, command);
-    } catch (IOException|EncodingException|ManagementException e) {
+    } catch (IOException | EncodingException | ManagementException e) {
       throw new ManagementException(e.getMessage(), e);
     }
   }
@@ -536,23 +539,24 @@
    *
    * @param face only a localhost Face, command signing info must be set
    * @param name As described at
-   *             <a href="http://redmine.named-data.net/projects/nfd/wiki/ControlCommand,">http://redmine.named-data.net/projects/nfd/wiki/ControlCommand,</a>
+   *             <a href="http://redmine.named-data.net/projects/nfd/wiki/ControlCommand">ControlCommand</a>,
    *             the requested interest must have encoded ControlParameters appended to the
    *             interest name
    * @return a {@link ControlResponse}
-   * @throws java.io.IOException
-   * @throws net.named_data.jndn.encoding.EncodingException
-   * @throws ManagementException
+   * @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
    */
-  private static ControlResponse
-  sendCommand(Face face, Name name) throws IOException, EncodingException, ManagementException {
+  private static ControlResponse sendCommand(final Face face, final Name name) throws IOException, EncodingException,
+    ManagementException {
     Interest interest = new Interest(name);
 
     // forwarder must have command signing info set
     try {
       face.makeCommandInterest(interest);
     } catch (SecurityException e) {
-      throw new IllegalArgumentException("Failed to make command interest; ensure command signing info is set on the face.", e);
+      throw new IllegalArgumentException("Failed to make command interest; ensure command signing info is set on the " +
+        "face.", e);
     }
 
     // send command packet
diff --git a/src/main/java/com/intel/jndn/management/enums/FacePersistency.java b/src/main/java/com/intel/jndn/management/enums/FacePersistency.java
index 08630b8..678b1a2 100644
--- a/src/main/java/com/intel/jndn/management/enums/FacePersistency.java
+++ b/src/main/java/com/intel/jndn/management/enums/FacePersistency.java
@@ -14,10 +14,10 @@
 package com.intel.jndn.management.enums;
 
 /**
- * Indicate whether the face is persistent; used by FaceStatus
+ * Indicate whether the face is persistent; used by FaceStatus.
  *
- * @see <a href="http://redmine.named-data.net/projects/nfd/widi/FaceMgmt">FaceMgmt</a>
  * @author Andrew Brown <andrew.brown@intel.com>
+ * @see <a href="http://redmine.named-data.net/projects/nfd/widi/FaceMgmt">Face Management</a>
  */
 public enum FacePersistency {
   NONE(-1), // invalid value
@@ -30,16 +30,32 @@
 
   /////////////////////////////////////////////////////////////////////////////
 
-  FacePersistency(int value) {
+  /**
+   * Create enum using NFD's FacePersistency code.
+   *
+   * @param value NFD's FacePersistency code
+   */
+  FacePersistency(final int value) {
     this.value = value;
   }
 
+  /**
+   * Convert FacePersistency to the NFD code.
+   *
+   * @return NFD's FacePersistency code
+   */
   public final int toInteger() {
     return value;
   }
 
+  /**
+   * Convert NFD code to FacePersistency enum.
+   *
+   * @param value NFD's FacePersistency code
+   * @return enum value
+   */
   public static FacePersistency
-  fromInteger(int value) {
+  fromInteger(final int value) {
     switch (value) {
       case 0:
         return PERSISTENT;
diff --git a/src/main/java/com/intel/jndn/management/enums/FaceScope.java b/src/main/java/com/intel/jndn/management/enums/FaceScope.java
index d32621e..9b6796b 100644
--- a/src/main/java/com/intel/jndn/management/enums/FaceScope.java
+++ b/src/main/java/com/intel/jndn/management/enums/FaceScope.java
@@ -15,10 +15,10 @@
 
 /**
  * Indicate whether the face is local for scope control purposes; used by
- * FaceStatus
+ * FaceStatus.
  *
- * @see <a href="http://redmine.named-data.net/projects/nfd/widi/FaceMgmt">FaceMgmt</a>
  * @author Andrew Brown <andrew.brown@intel.com>
+ * @see <a href="http://redmine.named-data.net/projects/nfd/widi/FaceMgmt">Face Management</a>
  */
 public enum FaceScope {
 
@@ -31,16 +31,31 @@
 
   /////////////////////////////////////////////////////////////////////////////
 
-  FaceScope(int value) {
+  /**
+   * Create enum using NFD's FaceScope code.
+   *
+   * @param value NFD's FaceScope code
+   */
+  FaceScope(final int value) {
     this.value = value;
   }
 
+  /**
+   * Convert FaceScope to the NFD code.
+   *
+   * @return NFD's FaceScope code
+   */
   public final int toInteger() {
     return value;
   }
 
-  public static FaceScope
-  fromInteger(int value) {
+  /**
+   * Convert NFD code to FaceScope enum.
+   *
+   * @param value NFD's FaceScope code
+   * @return enum value
+   */
+  public static FaceScope fromInteger(final int value) {
     switch (value) {
       case 0:
         return NON_LOCAL;
diff --git a/src/main/java/com/intel/jndn/management/enums/LinkType.java b/src/main/java/com/intel/jndn/management/enums/LinkType.java
index 99da791..8d4a1c8 100644
--- a/src/main/java/com/intel/jndn/management/enums/LinkType.java
+++ b/src/main/java/com/intel/jndn/management/enums/LinkType.java
@@ -14,37 +14,46 @@
 package com.intel.jndn.management.enums;
 
 /**
- * NFD face link type
- * @see <a href="http://redmine.named-data.net/projects/nfd/widi/FaceMgmt">FaceMgmt</a>
+ * NFD face link type.
+ *
+ * @see <a href="http://redmine.named-data.net/projects/nfd/widi/FaceMgmt">Face Management</a>
  */
 public enum LinkType {
 
-  NONE(-1), // invalid value
-
-  /**
-   * Link is point-to-point
-   */
+  NONE(-1),
   POINT_TO_POINT(0),
-
-  /**
-   * Link is multi-access
-   */
   MULTI_ACCESS(1);
 
   private final int value;
 
   /////////////////////////////////////////////////////////////////////////////
 
-  LinkType(int value) {
+  /**
+   * Create enum using NFD's LinkType code.
+   *
+   * @param value NFD's LinkType code
+   */
+  LinkType(final int value) {
     this.value = value;
   }
 
+  /**
+   * Convert LinkType to the NFD code.
+   *
+   * @return NFD's LinkType code
+   */
   public final int toInteger() {
     return value;
   }
 
+  /**
+   * Convert NFD code to LinkType enum.
+   *
+   * @param value NFD's LinkType code
+   * @return enum value
+   */
   public static LinkType
-  fromInteger(int value) {
+  fromInteger(final int value) {
     switch (value) {
       case 0:
         return POINT_TO_POINT;
diff --git a/src/main/java/com/intel/jndn/management/enums/LocalControlHeader.java b/src/main/java/com/intel/jndn/management/enums/LocalControlHeader.java
index 86a205d..426be64 100644
--- a/src/main/java/com/intel/jndn/management/enums/LocalControlHeader.java
+++ b/src/main/java/com/intel/jndn/management/enums/LocalControlHeader.java
@@ -14,10 +14,10 @@
 package com.intel.jndn.management.enums;
 
 /**
- * Define constants for local control header options. 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>
+ * Define constants for local control header options.
  *
  * @author Andrew Brown <andrew.brown@intel.com>
+ * @see <a href="http://redmine.named-data.net/projects/nfd/widi/FaceMgmt">Face Management</a>
  */
 public enum LocalControlHeader {
 
@@ -29,10 +29,20 @@
 
   /////////////////////////////////////////////////////////////////////////////
 
-  LocalControlHeader(int value) {
+  /**
+   * Create enum using NFD's LocalControlHeader code.
+   *
+   * @param value NFD's LocalControlHeader code
+   */
+  LocalControlHeader(final int value) {
     this.value = value;
   }
 
+  /**
+   * Convert LocalControlHeader to the NFD code.
+   *
+   * @return NFD's LocalControlHeader code
+   */
   public final int toInteger() {
     return value;
   }
diff --git a/src/main/java/com/intel/jndn/management/enums/NfdTlv.java b/src/main/java/com/intel/jndn/management/enums/NfdTlv.java
index d414ad2..8f7b536 100644
--- a/src/main/java/com/intel/jndn/management/enums/NfdTlv.java
+++ b/src/main/java/com/intel/jndn/management/enums/NfdTlv.java
@@ -15,9 +15,12 @@
 package com.intel.jndn.management.enums;
 
 /**
- * NFD Management protocol TLV codes
+ * NFD Management protocol TLV codes.
+ *
+ * @see <a href="http://redmine.named-data.net/projects/nfd/widi/FaceMgmt">Face Management</a>
  */
-public class NfdTlv {
+@SuppressWarnings("CheckStyle")
+public final class NfdTlv {
   /**
    * Prevent creation of NfdTlv instances
    */
@@ -26,61 +29,61 @@
 
   // ControlParameters
   // http://redmine.named-data.net/projects/nfd/wiki/ControlCommand
-  public static final int ControlParameters   = 104;
-  public static final int FaceId              = 105;
-  public static final int Uri                 = 114;
+  public static final int ControlParameters = 104;
+  public static final int FaceId = 105;
+  public static final int Uri = 114;
   public static final int LocalControlFeature = 110;
-  public static final int Origin              = 111;
-  public static final int Cost                = 106;
-  public static final int Flags               = 108;
-  public static final int Strategy            = 107;
-  public static final int ExpirationPeriod    = 109;
+  public static final int Origin = 111;
+  public static final int Cost = 106;
+  public static final int Flags = 108;
+  public static final int Strategy = 107;
+  public static final int ExpirationPeriod = 109;
 
   // ControlResponse
   // http://redmine.named-data.net/projects/nfd/wiki/ControlCommand
   public static final int ControlResponse = 101;
-  public static final int StatusCode      = 102;
-  public static final int StatusText      = 103;
+  public static final int StatusCode = 102;
+  public static final int StatusText = 103;
 
   // ForwarderStatus
   // http://redmine.named-data.net/projects/nfd/wiki/ForwarderStatus
-  public static final int NfdVersion           = 128;
-  public static final int StartTimestamp       = 129;
-  public static final int CurrentTimestamp     = 130;
-  public static final int NNameTreeEntries     = 131;
-  public static final int NFibEntries          = 132;
-  public static final int NPitEntries          = 133;
+  public static final int NfdVersion = 128;
+  public static final int StartTimestamp = 129;
+  public static final int CurrentTimestamp = 130;
+  public static final int NNameTreeEntries = 131;
+  public static final int NFibEntries = 132;
+  public static final int NPitEntries = 133;
   public static final int NMeasurementsEntries = 134;
-  public static final int NCsEntries           = 135;
+  public static final int NCsEntries = 135;
 
   // Face Management
   // http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt
-  public static final int FaceStatus            = 128;
-  public static final int LocalUri              = 129;
-  public static final int ChannelStatus         = 130;
-  public static final int UriScheme             = 131;
-  public static final int FaceScope             = 132;
-  public static final int FacePersistency       = 133;
-  public static final int LinkType              = 134;
-  public static final int FaceQueryFilter       = 150;
+  public static final int FaceStatus = 128;
+  public static final int LocalUri = 129;
+  public static final int ChannelStatus = 130;
+  public static final int UriScheme = 131;
+  public static final int FaceScope = 132;
+  public static final int FacePersistency = 133;
+  public static final int LinkType = 134;
+  public static final int FaceQueryFilter = 150;
   public static final int FaceEventNotification = 192;
-  public static final int FaceEventKind         = 193;
+  public static final int FaceEventKind = 193;
 
   // ForwarderStatus and FaceStatus counters
   // http://redmine.named-data.net/projects/nfd/wiki/ForwarderStatus
   // http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt
-  public static final int NInInterests  = 144;
-  public static final int NInDatas      = 145;
-  public static final int NInNacks      = 151;
+  public static final int NInInterests = 144;
+  public static final int NInDatas = 145;
+  public static final int NInNacks = 151;
   public static final int NOutInterests = 146;
-  public static final int NOutDatas     = 147;
-  public static final int NOutNacks     = 152;
-  public static final int NInBytes      = 148;
-  public static final int NOutBytes     = 149;
+  public static final int NOutDatas = 147;
+  public static final int NOutNacks = 152;
+  public static final int NInBytes = 148;
+  public static final int NOutBytes = 149;
 
   // FIB Management
   // http://redmine.named-data.net/projects/nfd/wiki/FibMgmt
-  public static final int FibEntry      = 128;
+  public static final int FibEntry = 128;
   public static final int NextHopRecord = 129;
 
   // Strategy Choice Management
@@ -90,5 +93,5 @@
   // RIB Management
   // http://redmine.named-data.net/projects/nfd/wiki/RibMgmt
   public static final int RibEntry = 128;
-  public static final int Route    = 129;
+  public static final int Route = 129;
 }
diff --git a/src/main/java/com/intel/jndn/management/enums/RouteFlags.java b/src/main/java/com/intel/jndn/management/enums/RouteFlags.java
index 334a726..86c41f6 100644
--- a/src/main/java/com/intel/jndn/management/enums/RouteFlags.java
+++ b/src/main/java/com/intel/jndn/management/enums/RouteFlags.java
@@ -14,22 +14,33 @@
 package com.intel.jndn.management.enums;
 
 /**
- * NFD route flags
- * @see <a href="http://redmine.named-data.net/projects/nfd/wiki/RibMgmt">RibMgmt</a>
+ * NFD route flags.
+ *
+ * @see <a href="http://redmine.named-data.net/projects/nfd/wiki/RibMgmt">RIB Management</a>
  */
 public enum RouteFlags {
-  NONE          (0),
-  CHILD_INHERIT (1),
-  CAPTURE       (2);
+  NONE(0),
+  CHILD_INHERIT(1),
+  CAPTURE(2);
 
   private final int value;
 
   /////////////////////////////////////////////////////////////////////////////
 
-  RouteFlags(int value) {
+  /**
+   * Create enum using NFD's RouteFlags code.
+   *
+   * @param value NFD's RouteFlags code
+   */
+  RouteFlags(final int value) {
     this.value = value;
   }
 
+  /**
+   * Convert RouteFlags to the NFD code.
+   *
+   * @return NFD's RouteFlags code
+   */
   public final int toInteger() {
     return value;
   }
diff --git a/src/main/java/com/intel/jndn/management/enums/RouteOrigin.java b/src/main/java/com/intel/jndn/management/enums/RouteOrigin.java
index 6156276..20666c0 100644
--- a/src/main/java/com/intel/jndn/management/enums/RouteOrigin.java
+++ b/src/main/java/com/intel/jndn/management/enums/RouteOrigin.java
@@ -14,47 +14,63 @@
 package com.intel.jndn.management.enums;
 
 /**
- * NFD route origin
- * @see <a href="http://redmine.named-data.net/projects/nfd/wiki/RibMgmt">RibMgmt</a>
+ * NFD route origin.
+ *
+ * @see <a href="http://redmine.named-data.net/projects/nfd/wiki/RibMgmt">RIB Management</a>
  */
 public enum RouteOrigin {
-  UNKNOWN  (-1),
-  APP      (0),
-  AUTOREG  (64),
-  CLIENT   (65),
-  AUTOCONF (66),
-  NLSR     (128),
-  STATIC   (255);
+  UNKNOWN(-1),
+  APP(0),
+  AUTOREG(64),
+  CLIENT(65),
+  AUTOCONF(66),
+  NLSR(128),
+  STATIC(255);
 
   private final int value;
 
   /////////////////////////////////////////////////////////////////////////////
 
-  RouteOrigin(int value) {
+  /**
+   * Create enum using NFD's RouteOrigin code.
+   *
+   * @param value NFD's RouteOrigin code
+   */
+  RouteOrigin(final int value) {
     this.value = value;
   }
 
+  /**
+   * Convert RouteOrigin to the NFD code.
+   *
+   * @return NFD's RouteOrigin code
+   */
   public final int toInteger() {
     return value;
   }
 
+  /**
+   * Convert NFD code to RouteOrigin enum.
+   *
+   * @param value NFD's RouteOrigin code
+   * @return enum value
+   */
   public static RouteOrigin
-  fromInteger(int value) {
-    switch (value) {
-      case 0:
-        return APP;
-      case 64:
-        return AUTOREG;
-      case 65:
-        return CLIENT;
-      case 66:
-        return AUTOCONF;
-      case 128:
-        return NLSR;
-      case 255:
-        return STATIC;
-      default:
-        return UNKNOWN;
+  fromInteger(final int value) {
+    if (value == APP.toInteger()) {
+      return APP;
+    } else if (value == AUTOREG.toInteger()) {
+      return AUTOREG;
+    } else if (value == CLIENT.toInteger()) {
+      return CLIENT;
+    } else if (value == AUTOCONF.toInteger()) {
+      return AUTOCONF;
+    } else if (value == NLSR.toInteger()) {
+      return NLSR;
+    } else if (value == STATIC.toInteger()) {
+      return STATIC;
+    } else {
+      return UNKNOWN;
     }
   }
 }
diff --git a/src/main/java/com/intel/jndn/management/enums/Strategies.java b/src/main/java/com/intel/jndn/management/enums/Strategies.java
index f1a9908..bfb1fed 100644
--- a/src/main/java/com/intel/jndn/management/enums/Strategies.java
+++ b/src/main/java/com/intel/jndn/management/enums/Strategies.java
@@ -16,15 +16,20 @@
 import net.named_data.jndn.Name;
 
 /**
- * A reference list of the strategies available in NFD; should match
- * <a href="http://redmine.named-data.net/projects/nfd/wiki/StrategyChoice#Strategy">
- * http://redmine.named-data.net/projects/nfd/wiki/StrategyChoice#Strategy</a>
+ * A reference list of the strategies available in NFD.
  *
  * @author Andrew Brown <andrew.brown@intel.com>
+ * @see <a href="http://redmine.named-data.net/projects/nfd/wiki/StrategyChoice#Strategy">Strategies</a>
  */
-public class Strategies {
+public final class Strategies {
   public static final Name BEST_ROUTE = new Name("/localhost/nfd/strategy/best-route");
   public static final Name BROADCAST = new Name("/localhost/nfd/strategy/broadcast");
   public static final Name CLIENT_CONTROL = new Name("/localhost/nfd/strategy/client-control");
   public static final Name NCC = new Name("/localhost/nfd/strategy/ncc");
+
+  /**
+   * Prevent instances of Strategies.
+   */
+  private Strategies() {
+  }
 }
diff --git a/src/main/java/com/intel/jndn/management/enums/package-info.java b/src/main/java/com/intel/jndn/management/enums/package-info.java
new file mode 100644
index 0000000..2d340a5
--- /dev/null
+++ b/src/main/java/com/intel/jndn/management/enums/package-info.java
@@ -0,0 +1,5 @@
+/**
+ * NFD constants and enumerations.
+ * @see <a href="http://redmine.named-data.net/projects/nfd/wiki/Management">NFD Management</a>
+ */
+package com.intel.jndn.management.enums;
diff --git a/src/main/java/com/intel/jndn/management/helpers/EncodingHelper.java b/src/main/java/com/intel/jndn/management/helpers/EncodingHelper.java
index 66e2c80..3a59a4a 100644
--- a/src/main/java/com/intel/jndn/management/helpers/EncodingHelper.java
+++ b/src/main/java/com/intel/jndn/management/helpers/EncodingHelper.java
@@ -13,9 +13,6 @@
  */
 package com.intel.jndn.management.helpers;
 
-import java.nio.ByteBuffer;
-import java.nio.charset.Charset;
-
 import net.named_data.jndn.ControlParameters;
 import net.named_data.jndn.ForwardingFlags;
 import net.named_data.jndn.Name;
@@ -25,6 +22,9 @@
 import net.named_data.jndn.encoding.tlv.TlvEncoder;
 import net.named_data.jndn.util.Blob;
 
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+
 /**
  * Provide helper methods to cover areas too protected in Tlv0_1_1WireFormat;
  * this class can be deprecated if WireFormats allow passing in an existing
@@ -32,7 +32,13 @@
  *
  * @author Andrew Brown <andrew.brown@intel.com>
  */
-public class EncodingHelper {
+public final class EncodingHelper {
+
+  /**
+   * Prevent instances of EncodingHelper.
+   */
+  private EncodingHelper() {
+  }
 
   /**
    * Helper to decode names since Tlv0_1_1WireFormat.java uses its own internal,
@@ -40,9 +46,9 @@
    *
    * @param input the bytes to decode
    * @return a decoded {@link Name}
-   * @throws EncodingException
+   * @throws EncodingException when decoding fails
    */
-  public static Name decodeName(ByteBuffer input) throws EncodingException {
+  public static Name decodeName(final ByteBuffer input) throws EncodingException {
     TlvDecoder decoder = new TlvDecoder(input);
     return decodeName(decoder);
   }
@@ -53,9 +59,9 @@
    *
    * @param decoder a current decoder context to use for decoding
    * @return a decoded {@link Name}
-   * @throws EncodingException
+   * @throws EncodingException when decoding fails
    */
-  public static Name decodeName(TlvDecoder decoder) throws EncodingException {
+  public static Name decodeName(final TlvDecoder decoder) throws EncodingException {
     Name name = new Name();
     int endOffset = decoder.readNestedTlvsStart(Tlv.Name);
     while (decoder.getOffset() < endOffset) {
@@ -73,7 +79,7 @@
    * @param name the {@link Name} to encode
    * @return an encoded {@link Blob}
    */
-  public static Blob encodeName(Name name) {
+  public static Blob encodeName(final Name name) {
     TlvEncoder encoder = new TlvEncoder();
     encodeName(name, encoder);
     return new Blob(encoder.getOutput(), false);
@@ -83,10 +89,10 @@
    * Helper to encode names using an existing encoding context; could be merged
    * to Tlv0_1_1WireFormat.java.
    *
-   * @param name the {@link Name} to encode
+   * @param name    the {@link Name} to encode
    * @param encoder the current {@link TlvEncoder} context to encode with
    */
-  public static final void encodeName(Name name, TlvEncoder encoder) {
+  public static void encodeName(final Name name, final TlvEncoder encoder) {
     int saveLength = encoder.getLength();
     for (int i = name.size() - 1; i >= 0; --i) {
       encoder.writeBlobTlv(Tlv.NameComponent, name.get(i).getValue().buf());
@@ -100,9 +106,9 @@
    *
    * @param input the bytes to decode
    * @return a decoded {@link Name}
-   * @throws EncodingException
+   * @throws EncodingException when decoding fails
    */
-  public static Name decodeStrategy(ByteBuffer input) throws EncodingException {
+  public static Name decodeStrategy(final ByteBuffer input) throws EncodingException {
     TlvDecoder decoder = new TlvDecoder(input);
     return decodeStrategy(decoder);
   }
@@ -113,9 +119,9 @@
    *
    * @param decoder the current {@link TlvDecoder} context to decode with
    * @return a decoded strategy (e.g. {@link Name})
-   * @throws EncodingException
+   * @throws EncodingException when decoding fails
    */
-  public static Name decodeStrategy(TlvDecoder decoder) throws EncodingException {
+  public static Name decodeStrategy(final TlvDecoder decoder) throws EncodingException {
     int strategyEndOffset = decoder.readNestedTlvsStart(Tlv.ControlParameters_Strategy);
     Name strategy = decodeName(decoder);
     decoder.finishNestedTlvs(strategyEndOffset);
@@ -129,7 +135,7 @@
    * @param strategy the {@link Name} to encode
    * @return an encoded {@link Blob}
    */
-  public static Blob encodeStrategy(Name strategy) {
+  public static Blob encodeStrategy(final Name strategy) {
     TlvEncoder encoder = new TlvEncoder();
     encodeName(strategy, encoder);
     return new Blob(encoder.getOutput(), false);
@@ -140,53 +146,52 @@
    * merged to Tlv0_1_1WireFormat.java.
    *
    * @param strategy the {@link Name} to encode
-   * @param encoder the current {@link TlvEncoder} context to use
+   * @param encoder  the current {@link TlvEncoder} context to use
    */
-  public static final void encodeStrategy(Name strategy, TlvEncoder encoder) {
+  public static void encodeStrategy(final Name strategy, final TlvEncoder encoder) {
     int strategySaveLength = encoder.getLength();
     encodeName(strategy, encoder);
     encoder.writeTypeAndLength(Tlv.ControlParameters_Strategy,
-            encoder.getLength() - strategySaveLength);
+      encoder.getLength() - strategySaveLength);
   }
 
   /**
    * Helper to encode control parameters using an existing encoding context;
    * could be merged to Tlv0_1_1WireFormat.java.
    *
-   * @param controlParameters
-   * @param encoder
+   * @param controlParameters control parameters
+   * @param encoder           TlvEncoder instance
    */
-  public static final void encodeControlParameters(ControlParameters controlParameters, TlvEncoder encoder) {
+  public static void encodeControlParameters(final ControlParameters controlParameters, final TlvEncoder encoder) {
     int saveLength = encoder.getLength();
 
     // Encode backwards.
     encoder.writeOptionalNonNegativeIntegerTlvFromDouble(Tlv.ControlParameters_ExpirationPeriod,
-            controlParameters.getExpirationPeriod());
+      controlParameters.getExpirationPeriod());
 
     // Encode strategy
     if (controlParameters.getStrategy().size() != 0) {
       int strategySaveLength = encoder.getLength();
       encodeName(controlParameters.getStrategy(), encoder);
       encoder.writeTypeAndLength(Tlv.ControlParameters_Strategy,
-              encoder.getLength() - strategySaveLength);
+        encoder.getLength() - strategySaveLength);
     }
 
     // Encode ForwardingFlags
     int flags = controlParameters.getForwardingFlags().getNfdForwardingFlags();
-    if (flags != new ForwardingFlags().getNfdForwardingFlags()) // The flags are not the default value.
-    {
+    if (flags != new ForwardingFlags().getNfdForwardingFlags()) { // The flags are not the default value.
       encoder.writeNonNegativeIntegerTlv(Tlv.ControlParameters_Flags, flags);
     }
 
     encoder.writeOptionalNonNegativeIntegerTlv(Tlv.ControlParameters_Cost, controlParameters.getCost());
     encoder.writeOptionalNonNegativeIntegerTlv(Tlv.ControlParameters_Origin, controlParameters.getOrigin());
     encoder.writeOptionalNonNegativeIntegerTlv(Tlv.ControlParameters_LocalControlFeature,
-            controlParameters.getLocalControlFeature());
+      controlParameters.getLocalControlFeature());
 
     // Encode URI
     if (!controlParameters.getUri().isEmpty()) {
       encoder.writeBlobTlv(Tlv.ControlParameters_Uri,
-              new Blob(controlParameters.getUri()).buf());
+        new Blob(controlParameters.getUri()).buf());
     }
 
     encoder.writeOptionalNonNegativeIntegerTlv(Tlv.ControlParameters_FaceId, controlParameters.getFaceId());
@@ -200,10 +205,13 @@
   }
 
   /**
-   * Convert ByteBuffer to string, assuming UTF-8 encoding in the buffer
+   * Convert ByteBuffer to string, assuming UTF-8 encoding in the buffer.
+   *
+   * @param buffer buffer to convert
+   * @return String representation of ByteBuffer (UTF-8 encoding)
    */
   public static String
-  toString(ByteBuffer buffer) {
+  toString(final ByteBuffer buffer) {
     byte[] array = new byte[buffer.remaining()];
     buffer.get(array);
     return new String(array, Charset.forName("UTF-8"));
diff --git a/src/main/java/com/intel/jndn/management/helpers/FetchHelper.java b/src/main/java/com/intel/jndn/management/helpers/FetchHelper.java
index 94e6863..7670771 100644
--- a/src/main/java/com/intel/jndn/management/helpers/FetchHelper.java
+++ b/src/main/java/com/intel/jndn/management/helpers/FetchHelper.java
@@ -13,7 +13,12 @@
  */
 package com.intel.jndn.management.helpers;
 
-import net.named_data.jndn.*;
+import net.named_data.jndn.Data;
+import net.named_data.jndn.Face;
+import net.named_data.jndn.Interest;
+import net.named_data.jndn.Name;
+import net.named_data.jndn.OnData;
+import net.named_data.jndn.OnTimeout;
 import net.named_data.jndn.encoding.EncodingException;
 
 import java.io.IOException;
@@ -22,10 +27,16 @@
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
-public class FetchHelper implements OnData, OnTimeout {
+/**
+ * Trival NDN client to fetch one or multiple Data packets.
+ */
+public final class FetchHelper implements OnData, OnTimeout {
   public static final long DEFAULT_TIMEOUT = 2000;
 
   private static final Logger LOG = Logger.getLogger(FetchHelper.class.getName());
+  private static final int SLEEP_TIMEOUT = 20;
+  private static final int SEGMENT_NAME_COMPONENT_OFFSET = -1;
+  private static final int VERSION_NAME_COMPONENT_OFFSET = -2;
 
   private State state;
   private Face face;
@@ -33,42 +44,44 @@
   /////////////////////////////////////////////////////////////////////////////
 
   /**
-   * Prevent creation of FetchHelper instances: use getData or getSegmentedData
+   * Prevent creation of FetchHelper instances: use getData or getSegmentedData.
    */
-  private FetchHelper()
-  {
+  private FetchHelper() {
   }
 
   /**
-   * Private constructor: use getData or getSegmentedData
+   * Private constructor: use getData or getSegmentedData.
    */
-  private FetchHelper(Face face)
-  {
+  private FetchHelper(final Face face) {
     this.face = face;
   }
 
   /**
-   * Get a single Data packet
-   * @param face Face instance
+   * Get a single Data packet.
+   *
+   * @param face     Face instance
    * @param interest Interest to retrieve Data
    * @return Data packet
    * @throws IOException if failed to retrieve packet, e.g., timeout occured
    */
   public static Data
-  getData(Face face, Interest interest) throws IOException {
+  getData(final Face face, final Interest interest) throws IOException {
     FetchHelper fetcher = new FetchHelper(face);
     return fetcher.getData(interest);
   }
 
   /**
-   * Get data using the exact name (without implicit digest)
+   * Get data using the exact name (without implicit digest).
+   * <p/>
+   * TODO: Allow authentication of retrieved data packets
+   *
    * @param face Face instance
    * @param name Exact name of the data packet to retrieve
-   *
-   * TODO: Allow authentication of retrieved data packets
+   * @return retrieved Data packet
+   * @throws IOException when communication with NFD fails
    */
   public static Data
-  getData(Face face, Name name) throws IOException {
+  getData(final Face face, final Name name) throws IOException {
     FetchHelper fetcher = new FetchHelper(face);
 
     Interest interest = new Interest(name);
@@ -80,18 +93,21 @@
   }
 
   /**
-   * Get concatenated data from the segmented
-   * @param face Face instance
+   * Get concatenated data from the segmented.
+   * <p/>
+   * Note that this method will first send interest with MustBeFresh selector to discover "latest" version of the
+   * stream and then retrieve the rest of the stream
+   * <p/>
+   * TODO: Allow authentication of retrieved data packets
+   *
+   * @param face   Face instance
    * @param prefix Prefix of the retrieved data. The retrieved data must have version and segment numbers after this
    *               prefix
-   *
-   * Note that this method will first send interest with MustBeFresh selector to discover "latest" version of the
-   *               stream and then retrieve the rest of the stream
-   *
-   * TODO: Allow authentication of retrieved data packets
+   * @return list of retrieved Data packets
+   * @throws IOException when communication with NFD fails
    */
   public static List<Data>
-  getSegmentedData(Face face, Name prefix) throws IOException {
+  getSegmentedData(final Face face, final Name prefix) throws IOException {
     FetchHelper fetcher = new FetchHelper(face);
 
     Interest interest = new Interest(new Name(prefix));
@@ -104,9 +120,8 @@
     Data data = fetcher.getData(interest);
 
     try {
-      data.getName().get(-1).toSegment();
-    }
-    catch (EncodingException e) {
+      data.getName().get(SEGMENT_NAME_COMPONENT_OFFSET).toSegment();
+    } catch (EncodingException e) {
       throw new IOException("Retrieved data does not have segment number as the last name component", e);
     }
     if (data.getName().size() != prefix.size() + 2) {
@@ -116,15 +131,14 @@
     long finalBlockId = 0;
     try {
       finalBlockId = data.getMetaInfo().getFinalBlockId().toSegment();
-    }
-    catch (EncodingException e) {
+    } catch (EncodingException e) {
       throw new IOException("Requested segmented stream is unbounded", e);
     }
 
     List<Data> segments = new ArrayList<>();
     segments.add(data);
 
-    prefix.append(data.getName().get(-2));
+    prefix.append(data.getName().get(VERSION_NAME_COMPONENT_OFFSET));
     for (int i = 0; i < finalBlockId; i++) {
       interest = new Interest(new Name(prefix).appendSegment(i));
       interest.setInterestLifetimeMilliseconds(DEFAULT_TIMEOUT);
@@ -140,7 +154,7 @@
 
   /////////////////////////////////////////////////////////////////////////////
 
-  private Data getData(Interest interest) throws IOException {
+  private Data getData(final Interest interest) throws IOException {
     this.state = new State();
     this.face.expressInterest(interest, this, this);
 
@@ -151,7 +165,7 @@
         LOG.log(Level.INFO, "Decoding error: " + e.getMessage(), e);
       }
       try {
-        Thread.sleep(20);
+        Thread.sleep(SLEEP_TIMEOUT);
       } catch (InterruptedException e) {
         // ok
       }
@@ -165,13 +179,13 @@
   }
 
   @Override
-  public void onData(Interest interest, Data data) {
+  public void onData(final Interest interest, final Data data) {
     state.response = data;
     state.isDone = true;
   }
 
   @Override
-  public void onTimeout(Interest interest) {
+  public void onTimeout(final Interest interest) {
     state.nRetries--;
     if (state.nRetries > 0) {
       try {
@@ -179,8 +193,7 @@
       } catch (IOException e) {
         LOG.log(Level.INFO, "Error while expressing interest: " + e.toString(), e);
       }
-    }
-    else {
+    } else {
       state.isDone = true;
     }
   }
@@ -188,8 +201,10 @@
   /////////////////////////////////////////////////////////////////////////////
 
   private static class State {
-    public int nRetries = 3;
-    public Data response = null;
-    public boolean isDone = false;
+    private static final int DEFAULT_NUMBER_OF_RETRIES = 3;
+
+    private int nRetries = DEFAULT_NUMBER_OF_RETRIES;
+    private Data response = null;
+    private boolean isDone = false;
   }
 }
diff --git a/src/main/java/com/intel/jndn/management/helpers/StatusDatasetHelper.java b/src/main/java/com/intel/jndn/management/helpers/StatusDatasetHelper.java
index 0db8341..863d918 100644
--- a/src/main/java/com/intel/jndn/management/helpers/StatusDatasetHelper.java
+++ b/src/main/java/com/intel/jndn/management/helpers/StatusDatasetHelper.java
@@ -15,32 +15,36 @@
 
 import com.intel.jndn.management.ManagementException;
 import com.intel.jndn.management.types.Decodable;
-
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.List;
-
 import net.named_data.jndn.Data;
 import net.named_data.jndn.encoding.EncodingException;
 import net.named_data.jndn.encoding.tlv.TlvDecoder;
 import net.named_data.jndn.util.Blob;
 
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+
 /**
- * Helper class to handle StatusDatasets, see
- * <a href="http://redmine.named-data.net/projects/nfd/wiki/StatusDataset">http://redmine.named-data.net/projects/nfd/wiki/StatusDataset</a>
+ * Helper class to handle StatusDatasets.
  *
  * @author Andrew Brown <andrew.brown@intel.com>
+ * @see <a href="http://redmine.named-data.net/projects/nfd/wiki/StatusDataset">StatusDataset</a>
  */
-public class StatusDatasetHelper {
-
+public final class StatusDatasetHelper {
   /**
-   * Prevent instances of StatusDatasetHelper
+   * Prevent instances of StatusDatasetHelper.
    */
   private StatusDatasetHelper() {
   }
 
+  /**
+   * Combine payload of Data packet segments into a single buffer.
+   *
+   * @param segments list of Data packets
+   * @return single buffer containing combined payload
+   */
   public static ByteBuffer
-  combine(List<Data> segments) {
+  combine(final List<Data> segments) {
     int size = 0;
     for (Data segment : segments) {
       size += segment.getContent().size();
@@ -55,11 +59,17 @@
   }
 
   /**
-   * Decode multiple status entries as part of a StatusDatasetHelper, see
-   * <a href="http://redmine.named-data.net/projects/nfd/wiki/StatusDataset">http://redmine.named-data.net/projects/nfd/wiki/StatusDataset</a>
+   * Decode multiple status entries as part of a StatusDatasetHelper.
+   *
+   * @param <T>      Class implementing Decodable interface
+   * @param segments list of Data packets
+   * @param type     class implementing Decodable interface
+   * @return List decoded status entries
+   * @throws ManagementException when decoding fails
+   * @see <a href="http://redmine.named-data.net/projects/nfd/wiki/StatusDataset">StatusDataset</a>
    */
-  public static final <T extends Decodable> List<T>
-  wireDecode(List<Data> segments, Class<T> type) throws ManagementException {
+  public static <T extends Decodable> List<T>
+  wireDecode(final List<Data> segments, final Class<T> type) throws ManagementException {
     Blob payload = new Blob(combine(segments), false);
 
     List<T> entries = new ArrayList<>();
@@ -70,7 +80,7 @@
         T entry = type.newInstance();
         entry.wireDecode(decoder);
         entries.add(entry);
-      } catch (IllegalAccessException|InstantiationException|EncodingException e) {
+      } catch (IllegalAccessException | InstantiationException | EncodingException e) {
         throw new ManagementException("Failed to read status dataset.", e);
       }
     }
diff --git a/src/main/java/com/intel/jndn/management/helpers/package-info.java b/src/main/java/com/intel/jndn/management/helpers/package-info.java
new file mode 100644
index 0000000..fcfcb02
--- /dev/null
+++ b/src/main/java/com/intel/jndn/management/helpers/package-info.java
@@ -0,0 +1,4 @@
+/**
+ * Various helpers.
+ */
+package com.intel.jndn.management.helpers;
diff --git a/src/main/java/com/intel/jndn/management/package-info.java b/src/main/java/com/intel/jndn/management/package-info.java
new file mode 100644
index 0000000..79be44a
--- /dev/null
+++ b/src/main/java/com/intel/jndn/management/package-info.java
@@ -0,0 +1,5 @@
+/**
+ * Classes implementing NFD management protocol.
+ * @see <a href="http://redmine.named-data.net/projects/nfd/wiki/Management">NFD Management</a>
+ */
+package com.intel.jndn.management;
diff --git a/src/main/java/com/intel/jndn/management/types/Decodable.java b/src/main/java/com/intel/jndn/management/types/Decodable.java
index 05797aa..7d5ae11 100644
--- a/src/main/java/com/intel/jndn/management/types/Decodable.java
+++ b/src/main/java/com/intel/jndn/management/types/Decodable.java
@@ -23,5 +23,11 @@
  * @author Andrew Brown <andrew.brown@intel.com>
  */
 public interface Decodable {
-  void wireDecode(TlvDecoder decoder) throws EncodingException;
+  /**
+   * Decode data structure from TLV wire format.
+   *
+   * @param decoder Instance of TlvDecoder
+   * @throws EncodingException when decoding fails
+   */
+  void wireDecode(final TlvDecoder decoder) throws EncodingException;
 }
diff --git a/src/main/java/com/intel/jndn/management/types/FaceStatus.java b/src/main/java/com/intel/jndn/management/types/FaceStatus.java
index abceaca..d7550cc 100644
--- a/src/main/java/com/intel/jndn/management/types/FaceStatus.java
+++ b/src/main/java/com/intel/jndn/management/types/FaceStatus.java
@@ -13,22 +13,23 @@
  */
 package com.intel.jndn.management.types;
 
-import java.nio.ByteBuffer;
-import com.intel.jndn.management.enums.NfdTlv;
 import com.intel.jndn.management.enums.FacePersistency;
 import com.intel.jndn.management.enums.FaceScope;
 import com.intel.jndn.management.enums.LinkType;
+import com.intel.jndn.management.enums.NfdTlv;
 import com.intel.jndn.management.helpers.EncodingHelper;
 import net.named_data.jndn.encoding.EncodingException;
 import net.named_data.jndn.encoding.tlv.TlvDecoder;
 import net.named_data.jndn.encoding.tlv.TlvEncoder;
 import net.named_data.jndn.util.Blob;
 
+import java.nio.ByteBuffer;
+
 /**
- * Represent a FaceStatus object from /localhost/nfd/faces/list
- * @see <a href="http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt">Face Management</a>
+ * Represent a FaceStatus object from /localhost/nfd/faces/list.
  *
  * @author Andrew Brown <andrew.brown@intel.com>
+ * @see <a href="http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt">Face Management</a>
  */
 public class FaceStatus implements Decodable {
   private int faceId = 0;
@@ -53,25 +54,26 @@
   /////////////////////////////////////////////////////////////////////////////
 
   /**
-   * Default constructor
+   * Default constructor.
    */
   public FaceStatus() {
     // nothing to do
   }
 
   /**
-   * Constructor from wire format
+   * Constructor from wire format.
+   *
    * @param input wire format
-   * @throws EncodingException
+   * @throws EncodingException when decoding fails
    */
-  public FaceStatus(ByteBuffer input) throws EncodingException {
+  public FaceStatus(final ByteBuffer input) throws EncodingException {
     wireDecode(input);
   }
 
   /**
    * Encode using a new TLV encoder.
    *
-   * @return The encoded buffer.
+   * @return The encoded buffer
    */
   public final Blob wireEncode() {
     TlvEncoder encoder = new TlvEncoder();
@@ -80,9 +82,11 @@
   }
 
   /**
-   * Encode as part of an existing encode context
+   * Encode as part of an existing encode context.
+   *
+   * @param encoder TlvEncoder instance
    */
-  public final void wireEncode(TlvEncoder encoder) {
+  public final void wireEncode(final TlvEncoder encoder) {
     int saveLength = encoder.getLength();
     encoder.writeNonNegativeIntegerTlv(NfdTlv.NOutBytes, outBytes);
     encoder.writeNonNegativeIntegerTlv(NfdTlv.NInBytes, inBytes);
@@ -112,18 +116,18 @@
    *
    * @param input The input buffer to decode. This reads from position() to
    *              limit(), but does not change the position.
-   * @throws net.named_data.jndn.encoding.EncodingException
+   * @throws EncodingException when decoding fails
    */
-  public final void wireDecode(ByteBuffer input) throws EncodingException {
+  public final void wireDecode(final ByteBuffer input) throws EncodingException {
     TlvDecoder decoder = new TlvDecoder(input);
     wireDecode(decoder);
   }
 
   /**
-   * Decode as part of an existing decode context
+   * {@inheritDoc}
    */
   @Override
-  public void wireDecode(TlvDecoder decoder) throws EncodingException {
+  public void wireDecode(final TlvDecoder decoder) throws EncodingException {
     int endOffset = decoder.readNestedTlvsStart(NfdTlv.FaceStatus);
     // parse
     this.faceId = (int) decoder.readNonNegativeIntegerTlv(NfdTlv.FaceId);
@@ -151,234 +155,279 @@
   }
 
   /**
-   * Get face ID
+   * @return face ID
    */
   public int getFaceId() {
     return faceId;
   }
 
   /**
-   * Set face ID
+   * Set face ID.
+   *
+   * @param faceId face ID
+   * @return this
    */
-  public FaceStatus setFaceId(int faceId) {
+  public FaceStatus setFaceId(final int faceId) {
     this.faceId = faceId;
     return this;
   }
 
   /**
-   * Get face ID
+   * @return remote face URI
    */
   public String getRemoteUri() {
     return remoteUri;
   }
 
   /**
-   * Set URI
+   * Set remote face URI.
+   *
+   * @param uri remote face URI
+   * @return this
    */
-  public FaceStatus setRemoteUri(String uri) {
+  public FaceStatus setRemoteUri(final String uri) {
     this.remoteUri = uri;
     return this;
   }
 
   /**
-   * Get face ID
+   * @return remote face URI
    */
   public String getLocalUri() {
     return localUri;
   }
 
   /**
-   * Set local URI
+   * Set local face URI.
+   *
+   * @param localUri local face URI
+   * @return this
    */
-  public FaceStatus setLocalUri(String localUri) {
+  public FaceStatus setLocalUri(final String localUri) {
     this.localUri = localUri;
     return this;
   }
 
   /**
-   * Check if Face has expiration period set
+   * Check if Face has expiration period set.
+   * @return true if Face has expiration period set, false otherwise
    */
   public boolean hasExpirationPeriod() {
     return expirationPeriod > 0;
   }
 
   /**
-   * Get expiration period
+   * @return expiration period
    */
   public int getExpirationPeriod() {
     return expirationPeriod;
   }
 
   /**
-   * Set expiration period
+   * Set expiration period.
+   *
+   * @param expirationPeriod expiration period
+   * @return this
    */
-  public FaceStatus setExpirationPeriod(int expirationPeriod) {
+  public FaceStatus setExpirationPeriod(final int expirationPeriod) {
     this.expirationPeriod = expirationPeriod;
     return this;
   }
 
   /**
-   * Get face scope value
+   * @return face scope
    */
   public FaceScope getFaceScope() {
     return faceScope;
   }
 
   /**
-   * Set face scope value
+   * Set face scope value.
+   *
+   * @param faceScope face scope
+   * @return this
    */
-  public FaceStatus setFaceScope(FaceScope faceScope) {
+  public FaceStatus setFaceScope(final FaceScope faceScope) {
     this.faceScope = faceScope;
     return this;
   }
 
   /**
-   * Get face persistency value
+   * @return face persistency
    */
   public FacePersistency getFacePersistency() {
     return facePersistency;
   }
 
   /**
-   * Set face persistency value
+   * Set face persistency.
+   *
+   * @param facePersistency face persistency
+   * @return this
    */
-  public FaceStatus setFacePersistency(FacePersistency facePersistency) {
+  public FaceStatus setFacePersistency(final FacePersistency facePersistency) {
     this.facePersistency = facePersistency;
     return this;
   }
 
   /**
-   * Get link type
+   * @return link type
    */
   public LinkType getLinkType() {
     return linkType;
   }
 
   /**
-   * Set link type
+   * Set link type.
+   *
+   * @param linkType link type
+   * @return this
    */
-  public FaceStatus setLinkType(LinkType linkType) {
+  public FaceStatus setLinkType(final LinkType linkType) {
     this.linkType = linkType;
     return this;
   }
 
   /**
-   * Get number of received Interest packets
+   * @return number of received Interest packets
    */
   public int getNInInterests() {
     return inInterests;
   }
 
   /**
-   * Set number of received Interest packets
+   * Set number of received Interest packets.
+   *
+   * @param inInterests number of received Interest packets
+   * @return this
    */
-  public FaceStatus setNInInterests(int inInterests) {
+  public FaceStatus setNInInterests(final int inInterests) {
     this.inInterests = inInterests;
     return this;
   }
 
   /**
-   * Get number of sent Interest packets
+   * @return number of sent Interest packets
    */
   public int getNOutInterests() {
     return outInterests;
   }
 
   /**
-   * Set number of sent Interest packets
+   * Set number of sent Interest packets.
+   *
+   * @param outInterests number of sent Interest packets
+   * @return this
    */
-  public FaceStatus setNOutInterests(int outInterests) {
+  public FaceStatus setNOutInterests(final int outInterests) {
     this.outInterests = outInterests;
     return this;
   }
 
   /**
-   * Get number of received Data packets
+   * @return number of received Data packets
    */
   public int getNInDatas() {
     return inDatas;
   }
 
   /**
-   * Set number of received Data packets
+   * Set number of received Data packets.
+   *
+   * @param inDatas number of received Data packets
+   * @return this
    */
-  public FaceStatus setNInDatas(int inDatas) {
+  public FaceStatus setNInDatas(final int inDatas) {
     this.inDatas = inDatas;
     return this;
   }
 
   /**
-   * Get number of sent Data packets
+   * @return number of sent Data packets
    */
   public int getNOutDatas() {
     return outDatas;
   }
 
   /**
-   * Set number of sent Data packets
+   * Set number of sent Data packets.
+   *
+   * @param outDatas number of sent Data packets
+   * @return this
    */
-  public FaceStatus setNOutDatas(int outDatas) {
+  public FaceStatus setNOutDatas(final int outDatas) {
     this.outDatas = outDatas;
     return this;
   }
 
   /**
-   * Get number of received Data packets
+   * @return number of received Data packets
    */
   public int getNInNacks() {
     return inNacks;
   }
 
   /**
-   * Set number of received Data packets
+   * Set number of received Data packets.
+   *
+   * @param inNacks number of received Data packets
+   * @return this
    */
-  public FaceStatus setNInNacks(int inNacks) {
+  public FaceStatus setNInNacks(final int inNacks) {
     this.inNacks = inNacks;
     return this;
   }
 
   /**
-   * Get number of sent Data packets
+   * @return number of sent Data packets
    */
   public int getNOutNacks() {
     return outNacks;
   }
 
   /**
-   * Set number of sent Data packets
+   * Set number of sent Data packets.
+   *
+   * @param outNacks number of sent Data packets
+   * @return this
    */
-  public FaceStatus setNOutNacks(int outNacks) {
+  public FaceStatus setNOutNacks(final int outNacks) {
     this.outNacks = outNacks;
     return this;
   }
 
-
   /**
-   * Get number of input bytes
+   * @return number of input bytes
    */
   public int getNInBytes() {
     return inBytes;
   }
 
   /**
-   * Set number of input bytes
+   * Set number of input bytes.
+   *
+   * @param inBytes number of input bytes
+   * @return this
    */
-  public FaceStatus setNInBytes(int inBytes) {
+  public FaceStatus setNInBytes(final int inBytes) {
     this.inBytes = inBytes;
     return this;
   }
 
   /**
-   * Get number of output bytes
+   * @return number of output bytes
    */
   public int getNOutBytes() {
     return outBytes;
   }
 
   /**
-   * Set number of output bytes
+   * Set number of output bytes.
+   *
+   * @param outBytes number of output bytes
+   * @return this
    */
-  public FaceStatus setNOutBytes(int outBytes) {
+  public FaceStatus setNOutBytes(final int outBytes) {
     this.outBytes = outBytes;
     return this;
   }
diff --git a/src/main/java/com/intel/jndn/management/types/FibEntry.java b/src/main/java/com/intel/jndn/management/types/FibEntry.java
index e30e9a9..f43cbf5 100644
--- a/src/main/java/com/intel/jndn/management/types/FibEntry.java
+++ b/src/main/java/com/intel/jndn/management/types/FibEntry.java
@@ -13,24 +13,24 @@
  */
 package com.intel.jndn.management.types;
 
-import com.intel.jndn.management.helpers.EncodingHelper;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.ListIterator;
-
 import com.intel.jndn.management.enums.NfdTlv;
+import com.intel.jndn.management.helpers.EncodingHelper;
 import net.named_data.jndn.Name;
 import net.named_data.jndn.encoding.EncodingException;
 import net.named_data.jndn.encoding.tlv.TlvDecoder;
 import net.named_data.jndn.encoding.tlv.TlvEncoder;
 import net.named_data.jndn.util.Blob;
 
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.ListIterator;
+
 /**
- * Represent a FibEntry returned from /localhost/nfd/fib/list
- * @see <a href="http://redmine.named-data.net/projects/nfd/wiki/FibMgmt#FIB-Dataset">FIB Dataset</a>
+ * Represent a FibEntry returned from /localhost/nfd/fib/list.
  *
  * @author Andrew Brown <andrew.brown@intel.com>
+ * @see <a href="http://redmine.named-data.net/projects/nfd/wiki/FibMgmt#FIB-Dataset">FIB Dataset</a>
  */
 public class FibEntry implements Decodable {
   private Name name = new Name();
@@ -39,18 +39,19 @@
   /////////////////////////////////////////////////////////////////////////////
 
   /**
-   * Default constructor
+   * Default constructor.
    */
   public FibEntry() {
     // nothing to do
   }
 
   /**
-   * Constructor from wire format
+   * Constructor from wire format.
+   *
    * @param input wire format
-   * @throws EncodingException
+   * @throws EncodingException when decoding fails
    */
-  public FibEntry(ByteBuffer input) throws EncodingException {
+  public FibEntry(final ByteBuffer input) throws EncodingException {
     wireDecode(input);
   }
 
@@ -66,9 +67,11 @@
   }
 
   /**
-   * Encode as part of an existing encode context
+   * Encode as part of an existing encode context.
+   *
+   * @param encoder TlvEncoder instance
    */
-  public final void wireEncode(TlvEncoder encoder) {
+  public final void wireEncode(final TlvEncoder encoder) {
     int saveLength = encoder.getLength();
     ListIterator<NextHopRecord> nh = records.listIterator(records.size());
     while (nh.hasPrevious()) {
@@ -85,16 +88,16 @@
    *              limit(), but does not change the position.
    * @throws EncodingException For invalid encoding.
    */
-  public final void wireDecode(ByteBuffer input) throws EncodingException {
+  public final void wireDecode(final ByteBuffer input) throws EncodingException {
     TlvDecoder decoder = new TlvDecoder(input);
     wireDecode(decoder);
   }
 
   /**
-   * Decode as part of an existing decode context
+   * {@inheritDoc}
    */
   @Override
-  public final void wireDecode(TlvDecoder decoder) throws EncodingException {
+  public void wireDecode(final TlvDecoder decoder) throws EncodingException {
     int endOffset = decoder.readNestedTlvsStart(NfdTlv.FibEntry);
     name = EncodingHelper.decodeName(decoder);
     while (decoder.getOffset() < endOffset) {
@@ -106,36 +109,48 @@
   }
 
   /**
-   * Get name
+   * @return FIB entry name
    */
   public Name getPrefix() {
     return name;
   }
 
   /**
-   * Set name
+   * Set FIB entry name.
+   *
+   * @param name New name for the FIB entry
+   * @return this
    */
-  public FibEntry setPrefix(Name name) {
+  public FibEntry setPrefix(final Name name) {
     this.name = name;
     return this;
   }
 
   /**
-   * Get records
+   * @return List of NextHop records.
    */
   public List<NextHopRecord> getNextHopRecords() {
     return records;
   }
 
   /**
-   * Set records
+   * Set NextHop records.
+   *
+   * @param records List of NextHop records. Previously associated records will be replaced.
+   * @return this
    */
-  public FibEntry setNextHopRecords(List<NextHopRecord> records) {
+  public FibEntry setNextHopRecords(final List<NextHopRecord> records) {
     this.records = records;
     return this;
   }
 
-  public FibEntry addNextHopRecord(NextHopRecord record) {
+  /**
+   * Add NextHop records.
+   *
+   * @param record NextHopRecord instance
+   * @return this
+   */
+  public FibEntry addNextHopRecord(final NextHopRecord record) {
     this.records.add(record);
     return this;
   }
diff --git a/src/main/java/com/intel/jndn/management/types/ForwarderStatus.java b/src/main/java/com/intel/jndn/management/types/ForwarderStatus.java
index 7ad4712..d0854d7 100644
--- a/src/main/java/com/intel/jndn/management/types/ForwarderStatus.java
+++ b/src/main/java/com/intel/jndn/management/types/ForwarderStatus.java
@@ -13,19 +13,19 @@
  */
 package com.intel.jndn.management.types;
 
-import java.nio.ByteBuffer;
-
 import com.intel.jndn.management.enums.NfdTlv;
 import net.named_data.jndn.encoding.EncodingException;
 import net.named_data.jndn.encoding.tlv.TlvDecoder;
 import net.named_data.jndn.encoding.tlv.TlvEncoder;
 import net.named_data.jndn.util.Blob;
 
+import java.nio.ByteBuffer;
+
 /**
- * Represent a ForwarderStatus object
- * @see <a href="http://redmine.named-data.net/projects/nfd/wiki/ForwarderStatus">ForwarderStatus</a>
+ * Represent a ForwarderStatus object.
  *
  * @author Andrew Brown <andrew.brown@intel.com>
+ * @see <a href="http://redmine.named-data.net/projects/nfd/wiki/ForwarderStatus">ForwarderStatus</a>
  */
 public class ForwarderStatus implements Decodable {
   private String nfdVersion = "";
@@ -46,18 +46,19 @@
   /////////////////////////////////////////////////////////////////////////////
 
   /**
-   * Default constructor
+   * Default constructor.
    */
   public ForwarderStatus() {
     // nothing to do
   }
 
   /**
-   * Constructor from wire format
+   * Constructor from wire format.
+   *
    * @param input wire format
-   * @throws EncodingException
+   * @throws EncodingException when decoding fails
    */
-  public ForwarderStatus(ByteBuffer input) throws EncodingException {
+  public ForwarderStatus(final ByteBuffer input) throws EncodingException {
     wireDecode(input);
   }
 
@@ -74,8 +75,10 @@
 
   /**
    * Encode as part of an existing encode context.
+   *
+   * @param encoder TlvEncoder instance
    */
-  public final void wireEncode(TlvEncoder encoder) {
+  public final void wireEncode(final TlvEncoder encoder) {
     encoder.writeNonNegativeIntegerTlv(NfdTlv.NOutNacks, nOutNacks);
     encoder.writeNonNegativeIntegerTlv(NfdTlv.NOutDatas, nOutDatas);
     encoder.writeNonNegativeIntegerTlv(NfdTlv.NOutInterests, nOutInterests);
@@ -96,19 +99,19 @@
    * Decode the input from its TLV format.
    *
    * @param input The input buffer to decode. This reads from position() to
-   * limit(), but does not change the position.
+   *              limit(), but does not change the position.
    * @throws EncodingException For invalid encoding.
    */
-  public final void wireDecode(ByteBuffer input) throws EncodingException {
+  public final void wireDecode(final ByteBuffer input) throws EncodingException {
     TlvDecoder decoder = new TlvDecoder(input);
     wireDecode(decoder);
   }
 
   /**
-   * Decode as part of an existing decode context
+   * {@inheritDoc}
    */
   @Override
-  public void wireDecode(TlvDecoder decoder) throws EncodingException {
+  public void wireDecode(final TlvDecoder decoder) throws EncodingException {
     this.nfdVersion = new Blob(decoder.readBlobTlv(NfdTlv.NfdVersion), true).toString();
     this.startTimestamp = decoder.readNonNegativeIntegerTlv(NfdTlv.StartTimestamp);
     this.currentTimestamp = decoder.readNonNegativeIntegerTlv(NfdTlv.CurrentTimestamp);
@@ -125,115 +128,255 @@
     this.nOutNacks = decoder.readNonNegativeIntegerTlv(NfdTlv.NOutNacks);
   }
 
+  /**
+   * @return NFD version string
+   */
   public String getNfdVersion() {
     return nfdVersion;
   }
 
-  public void setNfdVersion(String nfdVersion) {
+  /**
+   * Set NFD version string.
+   *
+   * @param nfdVersion NFD version string
+   * @return this
+   */
+  public ForwarderStatus setNfdVersion(final String nfdVersion) {
     this.nfdVersion = nfdVersion;
+    return this;
   }
 
+  /**
+   * @return NFD start timestamp (number of seconds since January 1, 1970)
+   */
   public long getStartTimestamp() {
     return startTimestamp;
   }
 
-  public void setStartTimestamp(long startTimestamp) {
+  /**
+   * Set NFD start timestamp (number of seconds since January 1, 1970).
+   *
+   * @param startTimestamp NFD start timestamp (number of seconds since January 1, 1970)
+   * @return this
+   */
+  public ForwarderStatus setStartTimestamp(final long startTimestamp) {
     this.startTimestamp = startTimestamp;
+    return this;
   }
 
+  /**
+   * @return NFD current timestamp (number of seconds since January 1, 1970)
+   */
   public long getCurrentTimestamp() {
     return currentTimestamp;
   }
 
-  public void setCurrentTimestamp(long currentTimestamp) {
+  /**
+   * Set NFD current timestamp (number of seconds since January 1, 1970).
+   *
+   * @param currentTimestamp NFD current timestamp (number of seconds since January 1, 1970)
+   * @return this
+   */
+  public ForwarderStatus setCurrentTimestamp(final long currentTimestamp) {
     this.currentTimestamp = currentTimestamp;
+    return this;
   }
 
+  /**
+   * @return Number of NameTree entries
+   */
   public long getNNameTreeEntries() {
     return nNameTreeEntries;
   }
 
-  public void setNNameTreeEntries(long nNameTreeEntries) {
+  /**
+   * Set the number of NameTree entries.
+   *
+   * @param nNameTreeEntries the number of NameTree entries.
+   * @return this
+   */
+  public ForwarderStatus setNNameTreeEntries(final long nNameTreeEntries) {
     this.nNameTreeEntries = nNameTreeEntries;
+    return this;
   }
 
+  /**
+   * @return Number of FIB entries
+   */
   public long getNFibEntries() {
     return nFibEntries;
   }
 
-  public void setNFibEntries(long nFibEntries) {
+  /**
+   * Set the number of FIB entries.
+   *
+   * @param nFibEntries the number of FIB entries.
+   * @return this
+   */
+  public ForwarderStatus setNFibEntries(final long nFibEntries) {
     this.nFibEntries = nFibEntries;
+    return this;
   }
 
+  /**
+   * @return Number of PIT entries
+   */
   public long getNPitEntries() {
     return nPitEntries;
   }
 
-  public void setNPitEntries(long nPitEntries) {
+  /**
+   * Set the number of PIT entries.
+   *
+   * @param nPitEntries the number of PIT entries.
+   * @return this
+   */
+  public ForwarderStatus setNPitEntries(final long nPitEntries) {
     this.nPitEntries = nPitEntries;
+    return this;
   }
 
+  /**
+   * @return Number of Measurement entries
+   */
   public long getNMeasurementsEntries() {
     return nMeasurementEntries;
   }
 
-  public void setNMeasurementsEntries(long nMeasurementEntries) {
+  /**
+   * Set the number of Measurement entries.
+   *
+   * @param nMeasurementEntries the number of Measurement entries.
+   * @return this
+   */
+  public ForwarderStatus setNMeasurementsEntries(final long nMeasurementEntries) {
     this.nMeasurementEntries = nMeasurementEntries;
+    return this;
   }
 
+  /**
+   * @return Number of CS entries
+   */
   public long getNCsEntries() {
     return nCsEntries;
   }
 
-  public void setNCsEntries(long nCsEntries) {
+  /**
+   * Set the number of CS entries.
+   *
+   * @param nCsEntries the number of CS entries.
+   * @return this
+   */
+  public ForwarderStatus setNCsEntries(final long nCsEntries) {
     this.nCsEntries = nCsEntries;
+    return this;
   }
 
+  /**
+   * @return The number of incoming Interests since NFD start
+   */
   public long getNInInterests() {
     return nInInterests;
   }
 
-  public void setNInInterests(long nInInterests) {
+  /**
+   * Set the number of incoming Interests since NFD start.
+   *
+   * @param nInInterests the number of incoming Interests since NFD start
+   * @return this
+   */
+  public ForwarderStatus setNInInterests(final long nInInterests) {
     this.nInInterests = nInInterests;
+    return this;
   }
 
+  /**
+   * @return Number of incoming Data since NFD start
+   */
   public long getNInDatas() {
     return nInDatas;
   }
 
-  public void setNInDatas(long nInDatas) {
+  /**
+   * Set the number of incoming Data since NFD start.
+   *
+   * @param nInDatas the number of incoming Interests since NFD start
+   * @return this
+   */
+  public ForwarderStatus setNInDatas(final long nInDatas) {
     this.nInDatas = nInDatas;
+    return this;
   }
 
+  /**
+   * @return Number of outgoing Interests since NFD start
+   */
   public long getNOutInterests() {
     return nOutInterests;
   }
 
-  public void setNOutInterests(long nOutInterests) {
+  /**
+   * Set the number of outgoing Interests since NFD start.
+   *
+   * @param nOutInterests the number of outgoing Interests since NFD start
+   * @return this
+   */
+  public ForwarderStatus setNOutInterests(final long nOutInterests) {
     this.nOutInterests = nOutInterests;
+    return this;
   }
 
+  /**
+   * @return Number of outgoing Data since NFD start
+   */
   public long getNOutDatas() {
     return nOutDatas;
   }
 
-  public void setNOutDatas(long nOutDatas) {
+  /**
+   * Set the number of outgoing Data since NFD start.
+   *
+   * @param nOutDatas the number of outgoing Data since NFD start
+   * @return this
+   */
+  public ForwarderStatus setNOutDatas(final long nOutDatas) {
     this.nOutDatas = nOutDatas;
+    return this;
   }
 
+  /**
+   * @return Number of incoming NACKs since NFD start
+   */
   public long getNInNacks() {
     return nInNacks;
   }
 
-  public void setNInNacks(long nInNacks) {
+  /**
+   * Set the number of incoming NACKs since NFD start.
+   *
+   * @param nInNacks the number of incoming NACKs since NFD start
+   * @return this
+   */
+  public ForwarderStatus setNInNacks(final long nInNacks) {
     this.nInNacks = nInNacks;
+    return this;
   }
 
+  /**
+   * @return Number of outgoing NACKs since NFD start
+   */
   public long getNOutNacks() {
     return nOutNacks;
   }
 
-  public void setNOutNacks(long nOutNacks) {
+  /**
+   * Set the number of outgoing NACKs since NFD start.
+   *
+   * @param nOutNacks the number of outgoing NACKs since NFD start
+   * @return this
+   */
+  public ForwarderStatus setNOutNacks(final long nOutNacks) {
     this.nOutNacks = nOutNacks;
+    return this;
   }
 }
diff --git a/src/main/java/com/intel/jndn/management/types/NextHopRecord.java b/src/main/java/com/intel/jndn/management/types/NextHopRecord.java
index 84756e5..8c75edc 100644
--- a/src/main/java/com/intel/jndn/management/types/NextHopRecord.java
+++ b/src/main/java/com/intel/jndn/management/types/NextHopRecord.java
@@ -13,8 +13,6 @@
  */
 package com.intel.jndn.management.types;
 
-import java.nio.ByteBuffer;
-
 import com.intel.jndn.management.enums.NfdTlv;
 import net.named_data.jndn.encoding.EncodingException;
 import net.named_data.jndn.encoding.tlv.Tlv;
@@ -22,36 +20,39 @@
 import net.named_data.jndn.encoding.tlv.TlvEncoder;
 import net.named_data.jndn.util.Blob;
 
+import java.nio.ByteBuffer;
+
 /**
- * Represent a NextHopRecord in a FibEntry
- * @see <a href="http://redmine.named-data.net/projects/nfd/wiki/FibMgmt#FIB-Dataset">FIB Dataset</a>
+ * Represent a NextHopRecord in a FibEntry.
  *
  * @author Andrew Brown <andrew.brown@intel.com>
+ * @see <a href="http://redmine.named-data.net/projects/nfd/wiki/FibMgmt#FIB-Dataset">FIB Dataset</a>
  */
-public class NextHopRecord {
+public class NextHopRecord implements Decodable {
   private int faceId;
   private int cost;
 
   /////////////////////////////////////////////////////////////////////////////
 
   /**
-   * Default constructor
+   * Default constructor.
    */
   public NextHopRecord() {
     // nothing to do
   }
 
   /**
-   * Constructor from wire format
+   * Constructor from wire format.
+   *
    * @param input wire format
-   * @throws EncodingException
+   * @throws EncodingException when decoding fails
    */
-  public NextHopRecord(ByteBuffer input) throws EncodingException {
+  public NextHopRecord(final ByteBuffer input) throws EncodingException {
     wireDecode(input);
   }
 
   /**
-   * Encode using a new TLV encoder
+   * Encode using a new TLV encoder.
    *
    * @return The encoded buffer
    */
@@ -62,9 +63,11 @@
   }
 
   /**
-   * Encode as part of an existing encode context
+   * Encode as part of an existing encode context.
+   *
+   * @param encoder TlvEncoder instance
    */
-  public final void wireEncode(TlvEncoder encoder) {
+  public final void wireEncode(final TlvEncoder encoder) {
     int saveLength = encoder.getLength();
     encoder.writeNonNegativeIntegerTlv(Tlv.ControlParameters_Cost, cost);
     encoder.writeNonNegativeIntegerTlv(Tlv.ControlParameters_FaceId, faceId);
@@ -75,18 +78,19 @@
    * Decode the input from its TLV format.
    *
    * @param input The input buffer to decode. This reads from position() to
-   * limit(), but does not change the position.
+   *              limit(), but does not change the position.
    * @throws EncodingException For invalid encoding.
    */
-  public final void wireDecode(ByteBuffer input) throws EncodingException {
+  public final void wireDecode(final ByteBuffer input) throws EncodingException {
     TlvDecoder decoder = new TlvDecoder(input);
     wireDecode(decoder);
   }
 
   /**
-   * Decode as part of an existing decode context
+   * {@inheritDoc}
    */
-  public final void wireDecode(TlvDecoder decoder) throws EncodingException {
+  @Override
+  public void wireDecode(final TlvDecoder decoder) throws EncodingException {
     int endOffset = decoder.readNestedTlvsStart(NfdTlv.NextHopRecord);
     this.faceId = (int) decoder.readNonNegativeIntegerTlv(Tlv.ControlParameters_FaceId);
     this.cost = (int) decoder.readNonNegativeIntegerTlv(Tlv.ControlParameters_Cost);
@@ -94,30 +98,38 @@
   }
 
   /**
-   * Get face ID
+   * @return face ID
    */
   public int getFaceId() {
     return faceId;
   }
 
   /**
-   * Set face ID
+   * Set face ID.
+   *
+   * @param faceId face ID
+   * @return this
    */
-  public void setFaceId(int faceId) {
+  public NextHopRecord setFaceId(final int faceId) {
     this.faceId = faceId;
+    return this;
   }
 
   /**
-   * Get cost
+   * @return next hop record cost
    */
   public int getCost() {
     return cost;
   }
 
   /**
-   * Set cost
+   * Set next hop record cost.
+   *
+   * @param cost next hop record cost
+   * @return this
    */
-  public void setCost(int cost) {
+  public NextHopRecord setCost(final int cost) {
     this.cost = cost;
+    return this;
   }
 }
diff --git a/src/main/java/com/intel/jndn/management/types/RibEntry.java b/src/main/java/com/intel/jndn/management/types/RibEntry.java
index a5c0380..2608198 100644
--- a/src/main/java/com/intel/jndn/management/types/RibEntry.java
+++ b/src/main/java/com/intel/jndn/management/types/RibEntry.java
@@ -15,40 +15,41 @@
 
 import com.intel.jndn.management.enums.NfdTlv;
 import com.intel.jndn.management.helpers.EncodingHelper;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.ListIterator;
-
 import net.named_data.jndn.Name;
 import net.named_data.jndn.encoding.EncodingException;
 import net.named_data.jndn.encoding.tlv.TlvDecoder;
 import net.named_data.jndn.encoding.tlv.TlvEncoder;
 import net.named_data.jndn.util.Blob;
 
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.ListIterator;
+
 /**
- * Represent a entry in the RIB
- * @see <a href="http://redmine.named-data.net/projects/nfd/wiki/RibMgmt#RIB-Dataset">RIB Dataset</a>
+ * Represent a entry in the RIB.
  *
  * @author Andrew Brown <andrew.brown@intel.com>
+ * @see <a href="http://redmine.named-data.net/projects/nfd/wiki/RibMgmt#RIB-Dataset">RIB Dataset</a>
  */
 public class RibEntry implements Decodable {
   private Name name = new Name();
   private List<Route> routes = new ArrayList<>();
 
   /**
-   * Default constructor
+   * Default constructor.
    */
   public RibEntry() {
     // nothing to do
   }
 
   /**
-   * Constructor from wire format
+   * Constructor from wire format.
+   *
    * @param input wire format
-   * @throws EncodingException
+   * @throws EncodingException when decoding fails
    */
-  public RibEntry(ByteBuffer input) throws EncodingException {
+  public RibEntry(final ByteBuffer input) throws EncodingException {
     wireDecode(input);
   }
 
@@ -65,8 +66,10 @@
 
   /**
    * Encode as part of an existing encode context.
+   *
+   * @param encoder TlvEncoder instance
    */
-  public final void wireEncode(TlvEncoder encoder) {
+  public final void wireEncode(final TlvEncoder encoder) {
     int saveLength = encoder.getLength();
     ListIterator<Route> route = routes.listIterator(routes.size());
     while (route.hasPrevious()) {
@@ -80,19 +83,19 @@
    * Decode the input from its TLV format.
    *
    * @param input The input buffer to decode. This reads from position() to
-   * limit(), but does not change the position.
+   *              limit(), but does not change the position.
    * @throws EncodingException For invalid encoding.
    */
-  public final void wireDecode(ByteBuffer input) throws EncodingException {
+  public final void wireDecode(final ByteBuffer input) throws EncodingException {
     TlvDecoder decoder = new TlvDecoder(input);
     wireDecode(decoder);
   }
 
   /**
-   * Decode as part of an existing decode context.
+   * {@inheritDoc}
    */
   @Override
-  public final void wireDecode(TlvDecoder decoder) throws EncodingException {
+  public void wireDecode(final TlvDecoder decoder) throws EncodingException {
     int endOffset = decoder.readNestedTlvsStart(NfdTlv.RibEntry);
     name = EncodingHelper.decodeName(decoder);
     while (decoder.getOffset() < endOffset) {
@@ -104,50 +107,59 @@
   }
 
   /**
-   * Get name
+   * @return RIB entry name.
    */
   public Name getName() {
     return name;
   }
 
   /**
-   * Set name
+   * Set RIB entry name.
+   *
+   * @param name New name for the RIB entry
+   * @return this
    */
-  public void setName(Name name) {
+  public RibEntry setName(final Name name) {
     this.name = name;
+    return this;
   }
 
   /**
-   * Get routes
+   * @return List of associated routes to the RIB entry
    */
   public List<Route> getRoutes() {
     return routes;
   }
 
   /**
-   * Add route
+   * Add route.
+   *
+   * @param route Route to add to the RIB entry
+   * @return this
    */
-  public RibEntry addRoute(Route route) {
+  public RibEntry addRoute(final Route route) {
     getRoutes().add(route);
     return this;
   }
 
   /**
-   * Clear all routes
+   * Clear all routes.
    */
   public void clearRoutes() {
     getRoutes().clear();
   }
 
   /**
-   * Set routes
+   * Set routes.
+   *
+   * @param routes List of routes to associate with RIB entry.  Will replace previously associated routes.
    */
-  public void setRoutes(List<Route> routes) {
+  public void setRoutes(final List<Route> routes) {
     this.routes = routes;
   }
 
   /**
-   * Get human-readable representation of RibEntry
+   * @return Human-readable representation of RibEntry
    */
   @Override
   public String toString() {
diff --git a/src/main/java/com/intel/jndn/management/types/Route.java b/src/main/java/com/intel/jndn/management/types/Route.java
index 0b9acb4..b134a6f 100644
--- a/src/main/java/com/intel/jndn/management/types/Route.java
+++ b/src/main/java/com/intel/jndn/management/types/Route.java
@@ -13,8 +13,6 @@
  */
 package com.intel.jndn.management.types;
 
-import java.nio.ByteBuffer;
-
 import com.intel.jndn.management.enums.NfdTlv;
 import com.intel.jndn.management.enums.RouteFlags;
 import net.named_data.jndn.encoding.EncodingException;
@@ -22,13 +20,15 @@
 import net.named_data.jndn.encoding.tlv.TlvEncoder;
 import net.named_data.jndn.util.Blob;
 
+import java.nio.ByteBuffer;
+
 /**
- * Represent a Route object from /localhost/nfd/rib/list
- * @see <a href="http://redmine.named-data.net/projects/nfd/wiki/RibMgmt#RIB-Dataset">RIB Dataset</a>
+ * Represent a Route object from /localhost/nfd/rib/list.
  *
  * @author Andrew Brown <andrew.brown@intel.com>
+ * @see <a href="http://redmine.named-data.net/projects/nfd/wiki/RibMgmt#RIB-Dataset">RIB Dataset</a>
  */
-public class Route {
+public class Route implements Decodable {
   public static final int INFINITE_EXPIRATION_PERIOD = -1;
 
   private int faceId = -1;
@@ -40,18 +40,19 @@
   /////////////////////////////////////////////////////////////////////////////
 
   /**
-   * Default constructor
+   * Default constructor.
    */
   public Route() {
     // nothing to do
   }
 
   /**
-   * Constructor from wire format
+   * Constructor from wire format.
+   *
    * @param input wire format
-   * @throws EncodingException
+   * @throws EncodingException when decoding fails
    */
-  public Route(ByteBuffer input) throws EncodingException {
+  public Route(final ByteBuffer input) throws EncodingException {
     wireDecode(input);
   }
 
@@ -69,9 +70,9 @@
   /**
    * Encode as part of an existing encode context.
    *
-   * @param encoder
+   * @param encoder TlvEncoder instance
    */
-  public final void wireEncode(TlvEncoder encoder) {
+  public final void wireEncode(final TlvEncoder encoder) {
     int saveLength = encoder.getLength();
     encoder.writeOptionalNonNegativeIntegerTlv(NfdTlv.ExpirationPeriod, expirationPeriod);
     encoder.writeNonNegativeIntegerTlv(NfdTlv.Flags, flags);
@@ -86,20 +87,18 @@
    *
    * @param input The input buffer to decode. This reads from position() to
    *              limit(), but does not change the position.
-   * @throws net.named_data.jndn.encoding.EncodingException
+   * @throws EncodingException when decoding fails
    */
-  public final void wireDecode(ByteBuffer input) throws EncodingException {
+  public final void wireDecode(final ByteBuffer input) throws EncodingException {
     TlvDecoder decoder = new TlvDecoder(input);
     wireDecode(decoder);
   }
 
   /**
-   * Decode as part of an existing decode context.
-   *
-   * @param decoder
-   * @throws EncodingException
+   * {@inheritDoc}
    */
-  public final void wireDecode(TlvDecoder decoder) throws EncodingException {
+  @Override
+  public final void wireDecode(final TlvDecoder decoder) throws EncodingException {
     int endOffset = decoder.readNestedTlvsStart(NfdTlv.Route);
     this.faceId = (int) decoder.readNonNegativeIntegerTlv(NfdTlv.FaceId);
     this.origin = (int) decoder.readNonNegativeIntegerTlv(NfdTlv.Origin);
@@ -110,103 +109,144 @@
   }
 
   /**
-   * Get Face ID
+   * Get Face ID.
+   *
+   * @return Face ID
    */
   public int getFaceId() {
     return faceId;
   }
 
   /**
-   * Set Face ID
+   * Set Face ID.
+   *
+   * @param faceId Face ID
+   * @return this
    */
-  public Route setFaceId(int faceId) {
+  public Route setFaceId(final int faceId) {
     this.faceId = faceId;
     return this;
   }
 
   /**
-   * Get origin
+   * Get route origin.
+   *
+   * @return origin code
+   * @see com.intel.jndn.management.enums.RouteOrigin
    */
   public int getOrigin() {
     return origin;
   }
 
   /**
-   * Set origin
+   * Set route origin.
+   *
+   * @param origin Route origin code
+   * @return this
+   * @see com.intel.jndn.management.enums.RouteOrigin
    */
-  public Route setOrigin(int origin) {
+  public Route setOrigin(final int origin) {
     this.origin = origin;
     return this;
   }
 
   /**
-   * Get cost
+   * Get route cost.
+   *
+   * @return route cost
    */
   public int getCost() {
     return cost;
   }
 
   /**
-   * Set cost
+   * Set cost.
+   *
+   * @param cost Route cost
+   * @return this
    */
-  public Route setCost(int cost) {
+  public Route setCost(final int cost) {
     this.cost = cost;
     return this;
   }
 
   /**
-   * Get flags
+   * Get flags.
+   *
+   * @return route flags
    */
   public int getFlags() {
     return flags;
   }
 
   /**
-   * Set flags
+   * Set flags.
+   *
+   * @param flags NFD Route flags
+   * @return this
+   * @see RouteFlags
    */
-  public void setFlags(int flags) {
+  public Route setFlags(final int flags) {
     this.flags = flags;
+    return this;
   }
 
   /**
-   * Get expiration period (in milliseconds)
+   * Get expiration period (in milliseconds).
+   *
+   * @return expiration period (in milliseconds)
    */
   public int getExpirationPeriod() {
     return expirationPeriod;
   }
 
   /**
-   * Check if route should not expire
+   * Check if route should not expire.
+   *
+   * @return true if route has associated expiration period, false otherwise
    */
   public boolean hasInfiniteExpirationPeriod() {
     return expirationPeriod < 0;
   }
 
   /**
-   * Set expiration period
+   * Set expiration period.
    *
-   * @param expirationPeriod
+   * @param expirationPeriod Expiration period in milliseconds
+   * @return this
    */
-  public void setExpirationPeriod(int expirationPeriod) {
+  public Route setExpirationPeriod(final int expirationPeriod) {
     this.expirationPeriod = expirationPeriod;
+    return this;
   }
 
   /**
-   * Get human-readable representation of Route
+   * Get a human-readable representation of the Route.
+   *
+   * @return Human-readable representation of the Route
    */
   @Override
   public String toString() {
     StringBuilder out = new StringBuilder();
     out.append("Route(");
-    out.append("FaceId: "); out.append(getFaceId()); out.append(", ");
-    out.append("Origin: "); out.append(getOrigin()); out.append(", ");
-    out.append("Cost: "); out.append(getCost()); out.append(", ");
-    out.append("Flags: "); out.append(getFlags()); out.append(", ");
+    out.append("FaceId: ");
+    out.append(getFaceId());
+    out.append(", ");
+    out.append("Origin: ");
+    out.append(getOrigin());
+    out.append(", ");
+    out.append("Cost: ");
+    out.append(getCost());
+    out.append(", ");
+    out.append("Flags: ");
+    out.append(getFlags());
+    out.append(", ");
 
     if (!hasInfiniteExpirationPeriod()) {
-      out.append("ExpirationPeriod: "); out.append(getExpirationPeriod()); out.append(" milliseconds");
-    }
-    else {
+      out.append("ExpirationPeriod: ");
+      out.append(getExpirationPeriod());
+      out.append(" milliseconds");
+    } else {
       out.append("ExpirationPeriod: Infinity");
     }
     out.append(")");
diff --git a/src/main/java/com/intel/jndn/management/types/StrategyChoice.java b/src/main/java/com/intel/jndn/management/types/StrategyChoice.java
index 7e092b2..7c1f8a4 100644
--- a/src/main/java/com/intel/jndn/management/types/StrategyChoice.java
+++ b/src/main/java/com/intel/jndn/management/types/StrategyChoice.java
@@ -13,21 +13,21 @@
  */
 package com.intel.jndn.management.types;
 
-import com.intel.jndn.management.helpers.EncodingHelper;
-import java.nio.ByteBuffer;
-
 import com.intel.jndn.management.enums.NfdTlv;
+import com.intel.jndn.management.helpers.EncodingHelper;
 import net.named_data.jndn.Name;
 import net.named_data.jndn.encoding.EncodingException;
 import net.named_data.jndn.encoding.tlv.TlvDecoder;
 import net.named_data.jndn.encoding.tlv.TlvEncoder;
 import net.named_data.jndn.util.Blob;
 
+import java.nio.ByteBuffer;
+
 /**
  * Represent a strategy choice entry.
- * @see <a href="http://redmine.named-data.net/projects/nfd/wiki/StrategyChoice">StrategyChoice</a>
-
+ *
  * @author Andrew Brown <andrew.brown@intel.com>
+ * @see <a href="http://redmine.named-data.net/projects/nfd/wiki/StrategyChoice">StrategyChoice</a>
  */
 public class StrategyChoice implements Decodable {
   private Name name;
@@ -36,18 +36,19 @@
   /////////////////////////////////////////////////////////////////////////////
 
   /**
-   * Default constructor
+   * Default constructor.
    */
   public StrategyChoice() {
     // nothing to do
   }
 
   /**
-   * Constructor from wire format
+   * Constructor from wire format.
+   *
    * @param input wire format
-   * @throws EncodingException
+   * @throws EncodingException when decoding fails
    */
-  public StrategyChoice(ByteBuffer input) throws EncodingException {
+  public StrategyChoice(final ByteBuffer input) throws EncodingException {
     wireDecode(input);
   }
 
@@ -65,9 +66,9 @@
   /**
    * Encode as part of an existing encode context.
    *
-   * @param encoder
+   * @param encoder TlvEncoder instance
    */
-  public final void wireEncode(TlvEncoder encoder) {
+  public final void wireEncode(final TlvEncoder encoder) {
     int saveLength = encoder.getLength();
     EncodingHelper.encodeStrategy(strategy, encoder);
     EncodingHelper.encodeName(name, encoder);
@@ -78,22 +79,19 @@
    * Decode the input from its TLV format.
    *
    * @param input The input buffer to decode. This reads from position() to
-   * limit(), but does not change the position.
+   *              limit(), but does not change the position.
    * @throws EncodingException For invalid encoding.
    */
-  public final void wireDecode(ByteBuffer input) throws EncodingException {
+  public final void wireDecode(final ByteBuffer input) throws EncodingException {
     TlvDecoder decoder = new TlvDecoder(input);
     wireDecode(decoder);
   }
 
   /**
-   * Decode as part of an existing decode context.
-   *
-   * @param decoder
-   * @throws EncodingException
+   * {@inheritDoc}
    */
   @Override
-  public final void wireDecode(TlvDecoder decoder) throws EncodingException {
+  public void wireDecode(final TlvDecoder decoder) throws EncodingException {
     int endOffset = decoder.readNestedTlvsStart(NfdTlv.StrategyChoice);
     name = EncodingHelper.decodeName(decoder);
     strategy = EncodingHelper.decodeStrategy(decoder);
@@ -116,16 +114,18 @@
 
   /**
    * @param name the {@link Name} to set
+   * @return this
    */
-  public StrategyChoice setName(Name name) {
+  public StrategyChoice setName(final Name name) {
     this.name = name;
     return this;
   }
 
   /**
    * @param strategy the {@link Name} to set
+   * @return this
    */
-  public StrategyChoice setStrategy(Name strategy) {
+  public StrategyChoice setStrategy(final Name strategy) {
     this.strategy = strategy;
     return this;
   }
diff --git a/src/main/java/com/intel/jndn/management/types/package-info.java b/src/main/java/com/intel/jndn/management/types/package-info.java
new file mode 100644
index 0000000..5a4c84b
--- /dev/null
+++ b/src/main/java/com/intel/jndn/management/types/package-info.java
@@ -0,0 +1,5 @@
+/**
+ * NFD management types.
+ * @see <a href="http://redmine.named-data.net/projects/nfd/wiki/Management">NFD Management</a>
+ */
+package com.intel.jndn.management.types;
