diff --git a/src/test/java/com/intel/jndn/utils/ClientTest.java b/src/test/java/com/intel/jndn/utils/ClientTest.java
index 787a395..a294817 100644
--- a/src/test/java/com/intel/jndn/utils/ClientTest.java
+++ b/src/test/java/com/intel/jndn/utils/ClientTest.java
@@ -20,7 +20,7 @@
 import org.apache.logging.log4j.Logger;
 
 /**
- *
+ * Test Client.java
  * @author Andrew Brown <andrew.brown@intel.com>
  */
 public class ClientTest {
@@ -40,14 +40,14 @@
     Face face = new Face(transport, null);
 
     // setup return data
-    Data response = new Data(new Name("/a/b/c"));
+    Data response = new Data(new Name("/test/sync"));
     response.setContent(new Blob("..."));
     transport.respondWith(response);
 
     // retrieve data
-    logger.info("Client expressing interest synchronously: /a/b/c");
+    logger.info("Client expressing interest synchronously: /test/sync");
     Client client = new Client();
-    Data data = client.getSync(face, new Name("/a/b/c"));
+    Data data = client.getSync(face, new Name("/test/sync"));
     assertEquals(new Blob("...").buf(), data.getContent().buf());
   }
 
@@ -63,20 +63,77 @@
     Face face = new Face(transport, null);
 
     // setup return data
-    Data response = new Data(new Name("/a/b/c"));
+    Data response = new Data(new Name("/test/async"));
     response.setContent(new Blob("..."));
     transport.respondWith(response);
 
     // retrieve data
-    logger.info("Client expressing interest asynchronously: /a/b/c");
+    logger.info("Client expressing interest asynchronously: /test/async");
     Client client = new Client();
-    ClientObserver observer = client.get(face, new Name("/a/b/c"));
+    ClientObserver observer = client.get(face, new Name("/test/async"));
 
     // wait 
-    while (observer.responses() == 0) {
+    while (observer.eventCount() == 0) {
       Thread.sleep(10);
     }
+    assertEquals(1, observer.eventCount());
+    assertEquals(1, observer.dataCount());
     Data data = (Data) observer.getFirst().getPacket();
     assertEquals(new Blob("...").buf(), data.getContent().buf());
   }
+
+  /**
+   * Test that asynchronous client times out correctly
+   * 
+   * @throws InterruptedException 
+   */
+  @Test
+  public void testTimeout() throws InterruptedException {
+    // setup face
+    MockTransport transport = new MockTransport();
+    Face face = new Face(transport, null);
+
+    // retrieve non-existent data, should timeout
+    logger.info("Client expressing interest asynchronously: /test/timeout");
+    ClientObserver observer = Client.getDefault().get(face, new Name("/test/timeout"));
+
+    // wait 
+    while (observer.errorCount() == 0) {
+      Thread.sleep(100);
+    }
+    Exception e = (Exception) observer.getFirst().getPacket();
+    assertEquals(1, observer.errorCount());
+  }
+  
+  /**
+   * Test that callback is called on event
+   * @throws InterruptedException 
+   */
+  @Test
+  public void testCallback() throws InterruptedException {
+    // setup face
+    MockTransport transport = new MockTransport();
+    Face face = new Face(transport, null);
+    
+    // setup return data
+    Data response = new Data(new Name("/test/callback"));
+    response.setContent(new Blob("..."));
+    transport.respondWith(response);
+
+    // retrieve non-existent data, should timeout
+    logger.info("Client expressing interest asynchronously: /test/callback");
+    ClientObserver observer = Client.getDefault().get(face, new Name("/test/callback"));
+    observer.then(new OnEvent(){
+      @Override
+      public void onEvent(ClientEvent event) {
+        assertEquals(new Blob("...").buf(), ((Data) event.getPacket()).getContent().buf());
+      }
+    });
+
+    // wait 
+    while (observer.eventCount() == 0) {
+      Thread.sleep(100);
+    }
+    assertEquals(1, observer.eventCount());
+  }
 }
