diff --git a/pom.xml b/pom.xml
index 18eb2c7..543d720 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
   <artifactId>jndn-mock</artifactId>
   <version>0.9.2</version>
   <packaging>jar</packaging>
-  <description>Tools for testing NDN Java code without using network IO</description>
+  <description>Tools for testing NDN Java code without using network IO.</description>
   <properties>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     <maven.compiler.source>1.7</maven.compiler.source>
@@ -17,16 +17,6 @@
       <artifactId>jndn</artifactId>
       <version>RELEASE</version>
     </dependency>
-    <dependency>
-      <groupId>org.apache.logging.log4j</groupId>
-      <artifactId>log4j-api</artifactId>
-      <version>2.1</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.logging.log4j</groupId>
-      <artifactId>log4j-core</artifactId>
-      <version>2.1</version>
-    </dependency>
     <!-- Test dependencies -->
     <dependency>
       <groupId>junit</groupId>
diff --git a/src/main/java/com/intel/jndn/mock/MockFace.java b/src/main/java/com/intel/jndn/mock/MockFace.java
index 686e15a..3f428d8 100644
--- a/src/main/java/com/intel/jndn/mock/MockFace.java
+++ b/src/main/java/com/intel/jndn/mock/MockFace.java
@@ -12,6 +12,7 @@
 import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map.Entry;
+import java.util.logging.Logger;
 import net.named_data.jndn.Data;
 import net.named_data.jndn.Face;
 import net.named_data.jndn.ForwardingFlags;
@@ -24,8 +25,6 @@
 import net.named_data.jndn.OnTimeout;
 import net.named_data.jndn.encoding.EncodingException;
 import net.named_data.jndn.encoding.WireFormat;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
 
 /**
  * <p>
@@ -49,7 +48,7 @@
  */
 public class MockFace extends Face {
 
-  private static final Logger logger = LogManager.getLogger();
+  private static final Logger logger = Logger.getLogger(MockFace.class.getName());
   private final Node node_;
   HashMap<String, Data> responseMap = new HashMap<>();
   HashMap<Long, MockOnInterestHandler> handlerMap = new HashMap<>();
@@ -73,7 +72,7 @@
    * @param data
    */
   public void addResponse(Name name, Data data) {
-    logger.debug("Added response for: " + name.toUri());
+    logger.fine("Added response for: " + name.toUri());
     responseMap.put(name.toUri(), data);
   }
 
@@ -83,7 +82,7 @@
    * @param name
    */
   public void removeResponse(Name name) {
-    logger.debug("Removed response for: " + name.toUri());
+    logger.fine("Removed response for: " + name.toUri());
     responseMap.remove(name);
   }
 
@@ -101,17 +100,17 @@
     long registeredPrefixId = findRegisteredHandler(interest);
     // check if response registered
     if (responseMap.containsKey(interestName)) {
-      logger.debug("Found response for: " + interestName);
+      logger.fine("Found response for: " + interestName);
       Data data = responseMap.get(interestName);
       ((MockTransport) node_.getTransport()).respondWith(data);
     } // check if handler registered
     else if (registeredPrefixId != -1) {
-      logger.debug("Found handler for: " + interestName);
+      logger.fine("Found handler for: " + interestName);
       MockOnInterestHandler handler = handlerMap.get(findRegisteredHandler(interest));
       handler.onInterest.onInterest(handler.prefix, interest, node_.getTransport(), registeredPrefixId);
     } // log failure
     else {
-      logger.warn("No response found for interest (aborting): " + interestName);
+      logger.warning("No response found for interest (aborting): " + interestName);
     }
   }
 
diff --git a/src/main/java/com/intel/jndn/mock/MockTransport.java b/src/main/java/com/intel/jndn/mock/MockTransport.java
index f7478d7..7e13b51 100644
--- a/src/main/java/com/intel/jndn/mock/MockTransport.java
+++ b/src/main/java/com/intel/jndn/mock/MockTransport.java
@@ -15,14 +15,13 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.logging.Logger;
 import net.named_data.jndn.Data;
 import net.named_data.jndn.Interest;
 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.transport.Transport;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
 
 /**
  * Mock the transport class Example: ...
@@ -32,7 +31,7 @@
 public class MockTransport extends Transport {
 
   public final static int BUFFER_CAPACITY = 8000;
-  private static final Logger logger = LogManager.getLogger();
+  private static final Logger logger = Logger.getLogger(MockTransport.class.getName());
   protected boolean connected;
   protected ElementReader elementReader;
   protected ByteBuffer buffer = ByteBuffer.allocate(BUFFER_CAPACITY);
@@ -119,7 +118,7 @@
   @Override
   public void connect(Transport.ConnectionInfo connectionInfo,
           ElementListener elementListener) throws IOException {
-    logger.debug("Connecting...");
+    logger.fine("Connecting...");
     connected = true;
     elementReader = new ElementReader(elementListener);
   }
@@ -134,7 +133,7 @@
    */
   @Override
   public void send(ByteBuffer data) throws IOException {
-    logger.debug("Sending " + (data.capacity() - data.position()) + " bytes");
+    logger.fine("Sending " + (data.capacity() - data.position()) + " bytes");
 
     // add to sent bytes
     buffer.put(data);
@@ -151,7 +150,7 @@
       data.position(0);
       addSentData(data);
     } else {
-      logger.warn("Unknown TLV packet type; cannot parse.");
+      logger.warning("Unknown TLV packet type; cannot parse.");
     }
   }
 
@@ -166,7 +165,7 @@
       packet.wireDecode(data);
       sentDataPackets.add(packet);
     } catch (EncodingException e) {
-      logger.warn("Failed to parse bytes into a data packet");
+      logger.warning("Failed to parse bytes into a data packet");
     }
   }
 
@@ -181,7 +180,7 @@
       packet.wireDecode(data);
       sentInterestPackets.add(packet);
     } catch (EncodingException e) {
-      logger.warn("Failed to parse bytes into an interest packet");
+      logger.warning("Failed to parse bytes into an interest packet");
     }
   }
 
@@ -195,12 +194,12 @@
   @Override
   public void processEvents() throws IOException, EncodingException {
     if (!getIsConnected()) {
-      logger.warn("Not connnected, aborting...");
+      logger.warning("Not connnected, aborting...");
       return;
     }
 
     // trace data sent
-    logger.trace(String.format("Processing buffer (position: %s, limit: %s, capacity: %s): %s", buffer.position(), buffer.limit(), buffer.capacity(), Arrays.toString(buffer.array())));
+    logger.finer(String.format("Processing buffer (position: %s, limit: %s, capacity: %s): %s", buffer.position(), buffer.limit(), buffer.capacity(), Arrays.toString(buffer.array())));
 
     // pass data up to face
     buffer.limit(buffer.position());
@@ -228,7 +227,7 @@
    */
   @Override
   public void close() throws IOException {
-    logger.debug("Closing...");
+    logger.fine("Closing...");
     connected = false;
   }
 }
diff --git a/src/test/java/com/intel/jndn/mock/MockFaceTest.java b/src/test/java/com/intel/jndn/mock/MockFaceTest.java
index 66db3a2..0646f94 100644
--- a/src/test/java/com/intel/jndn/mock/MockFaceTest.java
+++ b/src/test/java/com/intel/jndn/mock/MockFaceTest.java
@@ -1,11 +1,16 @@
 /*
- * To change this license header, choose License Headers in Project Properties.
- * To change this template file, choose Tools | Templates
- * and open the template in the editor.
+ * File name: MockFaceTest.java
+ * 
+ * Purpose: Test MockFace functionality.
+ * 
+ * © Copyright Intel Corporation. All rights reserved.
+ * Intel Corporation, 2200 Mission College Boulevard,
+ * Santa Clara, CA 95052-8119, USA
  */
 package com.intel.jndn.mock;
 
 import java.io.IOException;
+import java.util.logging.Logger;
 import net.named_data.jndn.Data;
 import net.named_data.jndn.Interest;
 import net.named_data.jndn.Name;
@@ -14,12 +19,11 @@
 import net.named_data.jndn.encoding.EncodingException;
 import net.named_data.jndn.transport.Transport;
 import net.named_data.jndn.util.Blob;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
 import org.junit.Test;
 import static org.junit.Assert.*;
 
 /**
+ * Test MockFace functionality
  *
  * @author Andrew Brown <andrew.brown@intel.com>
  */
@@ -28,10 +32,11 @@
   /**
    * Setup logging
    */
-  private static final Logger logger = LogManager.getLogger();
+  private static final Logger logger = Logger.getLogger(MockFaceTest.class.getName());
 
   /**
    * Test setting responses for specific names
+   *
    * @throws java.io.IOException
    * @throws net.named_data.jndn.encoding.EncodingException
    */
@@ -51,7 +56,7 @@
       @Override
       public void onData(Interest interest, Data data) {
         count.inc();
-        logger.debug("Received data");
+        logger.fine("Received data");
         assertEquals(data.getContent().buf(), new Blob("...").buf());
       }
     });
@@ -67,7 +72,7 @@
 
   /**
    * Test serving data dynamically with OnInterest handlers
-   * 
+   *
    * @throws net.named_data.jndn.encoding.EncodingException
    * @throws java.io.IOException
    * @throws net.named_data.jndn.security.SecurityException
@@ -81,7 +86,7 @@
     face.registerPrefix(new Name("/test/with/handlers"), new OnInterest() {
       @Override
       public void onInterest(Name prefix, Interest interest, Transport transport, long registeredPrefixId) {
-        logger.debug("Received interest, responding: " + interest.getName().toUri());
+        logger.fine("Received interest, responding: " + interest.getName().toUri());
         Data response = new Data(new Name("/test/with/handlers"));
         response.setContent(new Blob("..."));
         try {
@@ -99,7 +104,7 @@
       @Override
       public void onData(Interest interest, Data data) {
         count.inc();
-        logger.debug("Received data");
+        logger.fine("Received data");
         assertEquals(data.getContent().buf(), new Blob("...").buf());
       }
     });
@@ -112,9 +117,8 @@
     }
     assertEquals(1, count.get());
   }
-  
-  // TODO add childInherit test
 
+  // TODO add childInherit test
   /**
    * Count reference
    */
diff --git a/src/test/java/com/intel/jndn/mock/MockTransportTest.java b/src/test/java/com/intel/jndn/mock/MockTransportTest.java
index 44ad258..721b5a4 100644
--- a/src/test/java/com/intel/jndn/mock/MockTransportTest.java
+++ b/src/test/java/com/intel/jndn/mock/MockTransportTest.java
@@ -1,7 +1,7 @@
 /*
  * File name: MockTransportTest.java
  * 
- * Purpose: Test the MockTransport
+ * Purpose: Test the MockTransport functionality.
  * 
  * © Copyright Intel Corporation. All rights reserved.
  * Intel Corporation, 2200 Mission College Boulevard,
@@ -10,6 +10,7 @@
 package com.intel.jndn.mock;
 
 import java.io.IOException;
+import java.util.logging.Logger;
 import net.named_data.jndn.Data;
 import net.named_data.jndn.Face;
 import net.named_data.jndn.Interest;
@@ -18,8 +19,6 @@
 import net.named_data.jndn.OnTimeout;
 import net.named_data.jndn.encoding.EncodingException;
 import net.named_data.jndn.util.Blob;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
 import org.junit.Test;
 import static org.junit.Assert.*;
 
@@ -33,7 +32,7 @@
   /**
    * Setup logging
    */
-  private static final Logger logger = LogManager.getLogger();
+  private static final Logger logger = Logger.getLogger(MockTransportTest.class.getName());
 
   /**
    * Test sending a Data packet.
@@ -57,7 +56,7 @@
       @Override
       public void onData(Interest interest, Data data) {
         count.inc();
-        logger.debug("Received data");
+        logger.fine("Received data");
         assertEquals(data.getContent().buf(), new Blob("...").buf());
       }
     });
@@ -97,7 +96,7 @@
       @Override
       public void onData(Interest interest, Data data) {
         count.inc();
-        logger.debug("Received data");
+        logger.fine("Received data");
         assertEquals(data.getContent().buf(), new Blob("...").buf());
       }
     });
