diff --git a/src/main/java/com/intel/jndn/mock/MockFace.java b/src/main/java/com/intel/jndn/mock/MockFace.java
index f47959c..442e453 100644
--- a/src/main/java/com/intel/jndn/mock/MockFace.java
+++ b/src/main/java/com/intel/jndn/mock/MockFace.java
@@ -34,68 +34,124 @@
 import java.util.logging.Logger;
 
 /**
- * A client-side face for unit testing
+ * A client-side face for unit testing.
  *
  * @author Alexander Afanasyev, <aa@cs.ucla.edu>
  * @author Andrew Brown <andrew.brown@intel.com>
  */
 public class MockFace extends Face {
+  /**
+   * Interests sent out of this MockFace.
+   * <p/>
+   * Sent Interests are appended to this container if options.enablePacketLogger
+   * is true. User of this class is responsible for cleaning up the container,
+   * if necessary. After .expressInterest, .processEvents must be called before
+   * the Interest would show up here.
+   */
+  public final List<Interest> sentInterests = new ArrayList<>();
 
   /**
-   * API for handling {@link Interest}s
+   * Data sent out of this MockFace.
+   * <p/>
+   * Sent Data are appended to this container if options.enablePacketLogger is
+   * true. User of this class is responsible for cleaning up the container, if
+   * necessary. After .put, .processEvents must be called before the Data would
+   * show up here.
+   */
+  public final List<Data> sentData = new ArrayList<>();
+
+  /**
+   * Emits whenever an Interest is sent.
+   * <p/>
+   * After .expressInterest, .processEvents must be called before this signal
+   * would be emitted.
+   */
+  public final List<SignalOnSendInterest> onSendInterest = new ArrayList<>();
+
+  /**
+   * Emits whenever a Data packet is sent.
+   * <p/>
+   * After .putData, .processEvents must be called before this signal would be
+   * emitted.
+   */
+  public final List<SignalOnSendData> onSendData = new ArrayList<>();
+
+  private static final Logger LOGGER = Logger.getLogger(MockFace.class.getName());
+  private MockFaceTransport transport;
+  private KeyChain keyChain;
+
+  /////////////////////////////////////////////////////////////////////////////
+
+  /**
+   * API for handling {@link Interest}s.
    */
   public interface SignalOnSendInterest {
-    void emit(Interest interest) throws EncodingException, SecurityException;
+    /**
+     * Callback called when an Interest is sent out through face (towards NFD).
+     * @param interest interest being sent out
+     */
+    void emit(final Interest interest);
   }
 
   /**
-   * API for handling {@link Data}s
+   * API for handling {@link Data}s.
    */
   public interface SignalOnSendData {
-    void emit(Data data);
+    /**
+     * Callback called when a Data is sent out through face (towards NFD).
+     *
+     * @param data data being sent out
+     */
+    void emit(final Data data);
   }
 
   /**
-   * Options for MockFace
+   * Options for MockFace.
    */
   public static class Options {
     private boolean enablePacketLogging = false;
     private boolean enableRegistrationReply = false;
 
+    /**
+     * @return true if packet logging is enabled
+     */
     public boolean isEnablePacketLogging() {
       return enablePacketLogging;
     }
 
     /**
-     * Enable/disable packet logging
+     * Enable/disable packet logging.
      *
      * @param enablePacketLogging If true, packets sent out of MockFace will be appended to a container
      * @return this
      */
-    public Options setEnablePacketLogging(boolean enablePacketLogging) {
+    public Options setEnablePacketLogging(final boolean enablePacketLogging) {
       this.enablePacketLogging = enablePacketLogging;
       return this;
     }
 
+    /**
+     * @return true if prefix registration mocking is enabled
+     */
     public boolean isEnableRegistrationReply() {
       return enableRegistrationReply;
     }
 
     /**
-     * Enable/disable prefix registration mocking
+     * Enable/disable prefix registration mocking.
      *
      * @param enableRegistrationReply If true, prefix registration command will be automatically replied with a
      *                                successful response
      * @return this
      */
-    public Options setEnableRegistrationReply(boolean enableRegistrationReply) {
+    public Options setEnableRegistrationReply(final boolean enableRegistrationReply) {
       this.enableRegistrationReply = enableRegistrationReply;
       return this;
     }
   }
 
   /**
-   * Default options
+   * Default options.
    */
   public static final Options DEFAULT_OPTIONS = new Options()
                                                   .setEnablePacketLogging(true)
@@ -103,7 +159,7 @@
 
   /**
    * Create MockFace that logs packets in {@link #sentInterests} and
-   * {@link #sentData} and emulates NFD prefix registration
+   * {@link #sentData} and emulates NFD prefix registration.
    *
    * @throws SecurityException should not be thrown by this test class
    */
@@ -112,7 +168,7 @@
   }
 
   /**
-   * Create MockFace with the specified options
+   * Create MockFace with the specified options.
    * <p>
    * To create Face that does not log packets:
    * <pre>
@@ -129,7 +185,7 @@
    *
    * @param options see {@link Options}
    */
-  public MockFace(Options options) {
+  public MockFace(final Options options) {
     super(new MockFaceTransport(), null);
     transport = (MockFaceTransport) node_.getTransport();
     transport.setOnSendBlock(new OnIncomingPacket());
@@ -145,14 +201,14 @@
     if (options.enablePacketLogging) {
       onSendInterest.add(new SignalOnSendInterest() {
         @Override
-        public void emit(Interest interest) {
+        public void emit(final Interest interest) {
           sentInterests.add(interest);
         }
       });
 
       onSendData.add(new SignalOnSendData() {
         @Override
-        public void emit(Data data) {
+        public void emit(final Data data) {
           sentData.add(data);
         }
       });
@@ -164,89 +220,111 @@
   }
 
   /**
-   * Route incoming packets to the correct callbacks
+   * Route incoming packets to the correct callbacks.
    */
   private class OnIncomingPacket implements MockFaceTransport.OnSendBlockSignal {
-
+    /**
+     * {@inheritDoc}
+     */
     @Override
-    public void emit(ByteBuffer buffer) throws EncodingException, SecurityException {
+    public void emit(final ByteBuffer buffer) {
       // @todo Implement NDNLP processing
 
-      if (buffer.get(0) == Tlv.Interest || buffer.get(0) == Tlv.Data) {
-        TlvDecoder decoder = new TlvDecoder(buffer);
-        if (decoder.peekType(Tlv.Interest, buffer.remaining())) {
-          Interest interest = new Interest();
-          interest.wireDecode(buffer, TlvWireFormat.get());
+      try {
+        if (buffer.get(0) == Tlv.Interest || buffer.get(0) == Tlv.Data) {
+          TlvDecoder decoder = new TlvDecoder(buffer);
+          if (decoder.peekType(Tlv.Interest, buffer.remaining())) {
+            Interest interest = new Interest();
+            interest.wireDecode(buffer, TlvWireFormat.get());
 
-          for (SignalOnSendInterest signal : onSendInterest) {
-            signal.emit(interest);
-          }
-        } else if (decoder.peekType(Tlv.Data, buffer.remaining())) {
-          Data data = new Data();
-          data.wireDecode(buffer, TlvWireFormat.get());
+            for (SignalOnSendInterest signal : onSendInterest) {
+              signal.emit(interest);
+            }
+          } else if (decoder.peekType(Tlv.Data, buffer.remaining())) {
+            Data data = new Data();
+            data.wireDecode(buffer, TlvWireFormat.get());
 
-          for (SignalOnSendData signal : onSendData) {
-            signal.emit(data);
+            for (SignalOnSendData signal : onSendData) {
+              signal.emit(data);
+            }
           }
+        } else {
+          LOGGER.info("Received an unknown packet");
         }
-      } else {
-        LOGGER.info("Received an unknown packet");
+      } catch (EncodingException e) {
+        LOGGER.log(Level.INFO, "Failed to decode incoming packet", e);
       }
     }
   }
 
   /**
-   * Handle prefix registration requests
+   * Handle prefix registration requests.
    */
   private class OnPrefixRegistration implements SignalOnSendInterest {
+    private static final int STATUS_CODE_OK = 200;
+    private static final int CONTROL_PARAMETERS_NAME_OFFSET = -5;
+    private static final int CONTROL_COMMAND_NAME_OFFSET = 3;
 
+    /**
+     * {@inheritDoc}
+     */
     @Override
-    public void emit(Interest interest) throws EncodingException, SecurityException {
+    public void emit(final Interest interest) {
       final Name localhostRegistration = new Name("/localhost/nfd/rib");
-      if (!interest.getName().getPrefix(3).equals(localhostRegistration)) {
+      if (!interest.getName().getPrefix(localhostRegistration.size()).equals(localhostRegistration) ||
+          interest.getName().get(CONTROL_COMMAND_NAME_OFFSET).toString().equals("register")) {
         return;
       }
 
       ControlParameters params = new ControlParameters();
-      params.wireDecode(interest.getName().get(-5).getValue());
-      params.setFaceId(1);
-      params.setOrigin(0);
-
-      if ("register".equals(interest.getName().get(3).toString())) {
+      try {
+        params.wireDecode(interest.getName().get(CONTROL_PARAMETERS_NAME_OFFSET).getValue());
+        params.setFaceId(1);
+        params.setOrigin(0);
         params.setCost(0);
+      } catch (EncodingException e) {
+        throw new IllegalArgumentException("", e);
       }
 
       ControlResponse response = new ControlResponse();
-      response.setStatusCode(200);
+      response.setStatusCode(STATUS_CODE_OK);
       response.setStatusText("OK");
       response.setBodyAsControlParameters(params);
 
       Data data = new Data();
       data.setName(interest.getName());
       data.setContent(response.wireEncode());
-      keyChain.sign(data);
+      try {
+        keyChain.sign(data);
+      } catch (SecurityException e) {
+        LOGGER.log(Level.FINE, "MockKeyChain signing failed", e);
+      }
 
-      receive(data);
+      try {
+        receive(data);
+      } catch (EncodingException e) {
+        LOGGER.log(Level.INFO, "Failed to encode ControlReposnse data", e);
+      }
     }
   }
 
   /**
-   * Mock reception of the Interest packet on the Face (from transport)
+   * Mock reception of the Interest packet on the Face (from transport).
    *
    * @param interest the mock-remote interest to add to the PIT
    * @throws EncodingException if packet encoding fails (it should not)
    */
-  public void receive(Interest interest) throws EncodingException {
+  public void receive(final Interest interest) throws EncodingException {
     transport.receive(interest.wireEncode().buf());
   }
 
   /**
-   * Mock reception of the Data packet on the Face (from transport)
+   * Mock reception of the Data packet on the Face (from transport).
    *
    * @param data the mock-remote data to add to the CS
    * @throws EncodingException if packet encoding fails (it should not)
    */
-  public void receive(Data data) throws EncodingException {
+  public void receive(final Data data) throws EncodingException {
     transport.receive(data.wireEncode().buf());
   }
 
@@ -256,44 +334,4 @@
   public Transport getTransport() {
     return transport;
   }
-
-  /**
-   * Interests sent out of this MockFace
-   * <p>
-   * Sent Interests are appended to this container if options.enablePacketLogger
-   * is true. User of this class is responsible for cleaning up the container,
-   * if necessary. After .expressInterest, .processEvents must be called before
-   * the Interest would show up here.
-   */
-  public final List<Interest> sentInterests = new ArrayList<>();
-
-  /**
-   * Data sent out of this MockFace
-   * <p>
-   * Sent Data are appended to this container if options.enablePacketLogger is
-   * true. User of this class is responsible for cleaning up the container, if
-   * necessary. After .put, .processEvents must be called before the Data would
-   * show up here.
-   */
-  public final List<Data> sentData = new ArrayList<>();
-
-  /**
-   * Emits whenever an Interest is sent
-   * <p>
-   * After .expressInterest, .processEvents must be called before this signal
-   * would be emitted.
-   */
-  public final List<SignalOnSendInterest> onSendInterest = new ArrayList<>();
-
-  /**
-   * Emits whenever a Data packet is sent
-   * <p>
-   * After .putData, .processEvents must be called before this signal would be
-   * emitted.
-   */
-  public final List<SignalOnSendData> onSendData = new ArrayList<>();
-
-  private static final Logger LOGGER = Logger.getLogger(MockFace.class.getName());
-  private MockFaceTransport transport;
-  private KeyChain keyChain;
 }
diff --git a/src/main/java/com/intel/jndn/mock/MockKeyChain.java b/src/main/java/com/intel/jndn/mock/MockKeyChain.java
index b367808..1a0bafb 100644
--- a/src/main/java/com/intel/jndn/mock/MockKeyChain.java
+++ b/src/main/java/com/intel/jndn/mock/MockKeyChain.java
@@ -21,16 +21,18 @@
 import net.named_data.jndn.security.identity.MemoryPrivateKeyStorage;
 import net.named_data.jndn.security.identity.PrivateKeyStorage;
 import net.named_data.jndn.security.policy.SelfVerifyPolicyManager;
+import net.named_data.jndn.security.SecurityException;
 
 /**
- * Create an in-memory key chain for use in NDN-related tests
+ * Create an in-memory key chain for use in NDN-related tests.
  *
  * @author Andrew Brown <andrew.brown@intel.com>
  */
-public class MockKeyChain {
-
+public final class MockKeyChain {
+  /**
+   * Do not allow instances of this key chain.
+   */
   private MockKeyChain() {
-    // do not allow instances of this key chain
   }
 
   /**
@@ -39,9 +41,9 @@
    * @param name the name of the default identity to create
    * @return an in-memory {@link KeyChain} configured with the name as the
    * default identity
-   * @throws net.named_data.jndn.security.SecurityException
+   * @throws SecurityException if failed to create mock identity
    */
-  public static KeyChain configure(Name name) throws net.named_data.jndn.security.SecurityException {
+  public static KeyChain configure(final Name name) throws SecurityException {
     PrivateKeyStorage keyStorage = new MemoryPrivateKeyStorage();
     IdentityStorage identityStorage = new MemoryIdentityStorage();
     KeyChain keyChain = new KeyChain(new IdentityManager(identityStorage, keyStorage),
diff --git a/src/main/java/com/intel/jndn/mock/MockTransport.java b/src/main/java/com/intel/jndn/mock/MockTransport.java
index 1fd935d..df437e0 100644
--- a/src/main/java/com/intel/jndn/mock/MockTransport.java
+++ b/src/main/java/com/intel/jndn/mock/MockTransport.java
@@ -22,7 +22,6 @@
 import net.named_data.jndn.encoding.ElementListener;
 import net.named_data.jndn.encoding.ElementReader;
 import net.named_data.jndn.encoding.EncodingException;
-import net.named_data.jndn.security.SecurityException;
 import net.named_data.jndn.transport.Transport;
 
 /**
@@ -33,21 +32,32 @@
  * @author Andrew Brown <andrew.brown@intel.com>
  */
 class MockFaceTransport extends Transport {
+  private OnSendBlockSignal onSendBlock;
+  private static final Logger LOGGER = Logger.getLogger(MockFaceTransport.class.getName());
+  private boolean connected;
+  private ElementReader elementReader;
+  private final List<ByteBuffer> receiveBuffer = new LinkedList<>();
+
+  /////////////////////////////////////////////////////////////////////////////
 
   /**
-   * API for buffer handling
+   * API for buffer handling.
    */
   public interface OnSendBlockSignal {
-    void emit(ByteBuffer buffer) throws EncodingException, SecurityException;
+    /**
+     * Callback called when an ByteBuffer is sent (from NFD towards app).
+     *
+     * @param buffer buffer being sent thourgh face (from NFD towards app)
+     */
+    void emit(ByteBuffer buffer);
   }
 
   /**
-   * Receive some bytes to add to the mock socket
+   * Receive some bytes to add to the mock socket.
    *
    * @param block the byte buffer
-   * @throws EncodingException
    */
-  public void receive(ByteBuffer block) throws EncodingException {
+  public void receive(final ByteBuffer block) {
     synchronized (receiveBuffer) {
       receiveBuffer.add(block.duplicate());
     }
@@ -57,7 +67,7 @@
    * {@inheritDoc}
    */
   @Override
-  public boolean isLocal(Transport.ConnectionInfo connectionInfo) {
+  public boolean isLocal(final Transport.ConnectionInfo connectionInfo) {
     return true;
   }
 
@@ -73,8 +83,8 @@
    * {@inheritDoc}
    */
   @Override
-  public void connect(Transport.ConnectionInfo connectionInfo,
-          ElementListener elementListener, Runnable onConnected) {
+  public void connect(final Transport.ConnectionInfo connectionInfo,
+                      final ElementListener elementListener, final Runnable onConnected) {
     LOGGER.fine("Connecting...");
     connected = true;
     elementReader = new ElementReader(elementListener);
@@ -87,16 +97,10 @@
    * {@inheritDoc}
    */
   @Override
-  public void send(ByteBuffer data) throws IOException {
-    LOGGER.log(Level.FINE, "Sending {0} bytes", data.capacity() - data.position());
+  public void send(final ByteBuffer buffer) throws IOException {
+    LOGGER.log(Level.FINE, "Sending {0} bytes", buffer.capacity() - buffer.position());
 
-    try {
-      onSendBlock.emit(data);
-    } catch (EncodingException e) {
-      LOGGER.log(Level.WARNING, "Failed to decode packet", e);
-    } catch (SecurityException e) {
-      LOGGER.log(Level.WARNING, "Failed signature", e);
-    }
+    onSendBlock.emit(buffer);
   }
 
   /**
@@ -144,13 +148,7 @@
    * ideally this would be hidden completely but the super() call in MockFace
    * requires this callback to be set after the parent constructor is called
    */
-  public void setOnSendBlock(OnSendBlockSignal onSendBlock) {
+  public void setOnSendBlock(final OnSendBlockSignal onSendBlock) {
     this.onSendBlock = onSendBlock;
   }
-
-  private OnSendBlockSignal onSendBlock;
-  private static final Logger LOGGER = Logger.getLogger(MockFaceTransport.class.getName());
-  private boolean connected;
-  private ElementReader elementReader;
-  private final List<ByteBuffer> receiveBuffer = new LinkedList<>();
 }
diff --git a/src/main/java/com/intel/jndn/mock/package-info.java b/src/main/java/com/intel/jndn/mock/package-info.java
new file mode 100644
index 0000000..21dcda2
--- /dev/null
+++ b/src/main/java/com/intel/jndn/mock/package-info.java
@@ -0,0 +1,4 @@
+/**
+ * NDN Face mocking classes.
+ */
+package com.intel.jndn.mock;
