diff --git a/src/test/java/com/intel/jndn/utils/TestHelper.java b/src/test/java/com/intel/jndn/utils/TestHelper.java
index a73aba4..fbf931e 100644
--- a/src/test/java/com/intel/jndn/utils/TestHelper.java
+++ b/src/test/java/com/intel/jndn/utils/TestHelper.java
@@ -24,8 +24,6 @@
 import java.util.concurrent.TimeUnit;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import java.util.stream.Collectors;
-import java.util.stream.IntStream;
 import net.named_data.jndn.Data;
 import net.named_data.jndn.Face;
 import net.named_data.jndn.Name;
@@ -51,15 +49,19 @@
   }
 
   public static List<CompletableFuture<Data>> buildFutureSegments(Name name, int from, int to) {
-    return buildSegments(name, from, to).stream()
-            .map((d) -> CompletableFuture.completedFuture(d))
-            .collect(Collectors.toList());
+    List<CompletableFuture<Data>> list = new ArrayList<>();
+    for (Data d : buildSegments(name, from, to)) {
+      list.add(CompletableFuture.completedFuture(d));
+    }
+    return list;
   }
 
   public static List<Data> buildSegments(Name name, int from, int to) {
-    return IntStream.range(from, to).boxed()
-            .map((i) -> buildData(new Name(name).appendSegment(i), i.toString(), to - 1))
-            .collect(Collectors.toList());
+    List<Data> list = new ArrayList<>();
+    for (Integer i = from; i < to; i++) {
+      list.add(buildData(new Name(name).appendSegment(i), i.toString(), to - 1));
+    }
+    return list;
   }
 
   public static Data buildData(Name name, String content) {
diff --git a/src/test/java/com/intel/jndn/utils/client/impl/AdvancedClientFileTestIT.java b/src/test/java/com/intel/jndn/utils/client/impl/AdvancedClientFileTestIT.java
deleted file mode 100644
index 45572a7..0000000
--- a/src/test/java/com/intel/jndn/utils/client/impl/AdvancedClientFileTestIT.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * jndn-utils
- * Copyright (c) 2015, Intel Corporation.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU Lesser General Public License,
- * version 3, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
- * more details.
- */
-package com.intel.jndn.utils.client.impl;
-
-import com.intel.jndn.utils.Client;
-import com.intel.jndn.utils.TestHelper;
-import com.intel.jndn.utils.server.impl.SegmentedServerHelper;
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.util.List;
-import java.util.Random;
-import java.util.concurrent.CompletableFuture;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import java.util.stream.Collectors;
-import java.util.stream.IntStream;
-import net.named_data.jndn.Data;
-import net.named_data.jndn.Face;
-import net.named_data.jndn.Interest;
-import net.named_data.jndn.InterestFilter;
-import net.named_data.jndn.Name;
-import net.named_data.jndn.OnInterestCallback;
-import net.named_data.jndn.security.SecurityException;
-import org.junit.Test;
-
-/**
- * Test AdvancedClient.java; requires a hostname to an NFD accepting a generated
- * key to register prefixes, e.g. mvn test -Dnfd.ip=10.10.10.1
- *
- * @author Andrew Brown <andrew.brown@intel.com>
- */
-public class AdvancedClientFileTestIT {
-
-  private static final Logger logger = Logger.getLogger(AdvancedClientFileTestIT.class.getName());
-  private static final Name PREFIX = new Name("/test/advanced-client").append(TestHelper.buildRandomString(10));
-  private static final int NUM_MESSAGES = 100;
-  private static final int MESSAGE_SIZE_BYTES = 10000;
-  private static final int SEGMENT_SIZE_BYTES = 5000;
-  private final TestHelper.NdnEnvironment environment;
-
-  public AdvancedClientFileTestIT() throws SecurityException {
-    String ip = System.getProperty("nfd.ip");
-    logger.info("Testing on NFD at: " + ip);
-    environment = TestHelper.buildTestEnvironment(ip, 2);
-  }
-
-  @Test
-  public void stressTest() throws Exception {
-    Face producer = environment.faces.get(0);
-    Face consumer = environment.faces.get(1);
-
-    producer.registerPrefix(PREFIX, new AdvancedDataServer(MESSAGE_SIZE_BYTES, SEGMENT_SIZE_BYTES), null);
-
-    // TODO this must be here until the prefix registration callback is complete
-    Thread.sleep(500);
-
-    long startTime = System.currentTimeMillis();
-    AdvancedClient client = new AdvancedClient();
-    List<CompletableFuture<Data>> requests = expressInterests(client, consumer, PREFIX, NUM_MESSAGES);
-    List<Data> datas = requests.stream().map((f) -> TestHelper.retrieve(f)).collect(Collectors.toList());
-    long endTime = System.currentTimeMillis();
-
-    logger.info(String.format("Transfered %d bytes in %d ms", MESSAGE_SIZE_BYTES * NUM_MESSAGES, endTime - startTime));
-  }
-
-  private List<CompletableFuture<Data>> expressInterests(Client client, Face face, Name name, int count) {
-    return IntStream.range(0, count).boxed().map((i) -> client.getAsync(face, name)).collect(Collectors.toList());
-  }
-
-  private class AdvancedDataServer implements OnInterestCallback {
-
-    private final int contentSize;
-    private final int segmentSize;
-
-    public AdvancedDataServer(int contentSize, int segmentSize) {
-      this.contentSize = contentSize;
-      this.segmentSize = segmentSize;
-    }
-
-    @Override
-    public void onInterest(Name prefix, Interest interest, Face face, long interestFilterId, InterestFilter filter) {
-      // ignore segmented requests, the data has already been put below
-      if (SegmentationHelper.isSegmented(interest.getName(), (byte) 0x00)) {
-        return;
-      }
-      
-      // randomly ignore 10% of requests
-      if (new Random().nextInt(10) < 2){
-        logger.info("Skipping an interest: " + interest.toUri());
-        return;
-      }
-
-      ByteArrayInputStream bytes = new ByteArrayInputStream(TestHelper.buildRandomString(contentSize).getBytes());
-      Data data = TestHelper.buildData(interest.getName(), "");
-      data.getMetaInfo().setFreshnessPeriod(0);
-
-      try {
-        for (Data segment : SegmentedServerHelper.segment(data, bytes, segmentSize)) {
-          logger.log(Level.INFO, "Put data: " + segment.getName().toUri());
-          face.putData(segment);
-        }
-      } catch (IOException ex) {
-        logger.log(Level.SEVERE, "Failed to put data.", ex);
-      }
-    }
-  }
-}
diff --git a/src/test/java/com/intel/jndn/utils/client/impl/AdvancedClientStressTestIT.java b/src/test/java/com/intel/jndn/utils/client/impl/AdvancedClientStressTestIT.java
deleted file mode 100644
index 6a99599..0000000
--- a/src/test/java/com/intel/jndn/utils/client/impl/AdvancedClientStressTestIT.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * jndn-utils
- * Copyright (c) 2015, Intel Corporation.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU Lesser General Public License,
- * version 3, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
- * more details.
- */
-package com.intel.jndn.utils.client.impl;
-
-import com.intel.jndn.utils.Client;
-import com.intel.jndn.utils.TestHelper;
-import com.intel.jndn.utils.server.impl.SegmentedServerHelper;
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.util.List;
-import java.util.Random;
-import java.util.concurrent.CompletableFuture;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import java.util.stream.Collectors;
-import java.util.stream.IntStream;
-import net.named_data.jndn.Data;
-import net.named_data.jndn.Face;
-import net.named_data.jndn.Interest;
-import net.named_data.jndn.InterestFilter;
-import net.named_data.jndn.Name;
-import net.named_data.jndn.OnInterestCallback;
-import net.named_data.jndn.security.SecurityException;
-import org.junit.Test;
-
-/**
- * Test AdvancedClient.java; requires a hostname to an NFD accepting a generated
- * key to register prefixes, e.g. mvn test -Dnfd.ip=10.10.10.1
- *
- * @author Andrew Brown <andrew.brown@intel.com>
- */
-public class AdvancedClientStressTestIT {
-
-  private static final Logger logger = Logger.getLogger(AdvancedClientStressTestIT.class.getName());
-  private static final Name PREFIX = new Name("/test/advanced-client").append(TestHelper.buildRandomString(10));
-  private static final int NUM_MESSAGES = 100;
-  private static final int MESSAGE_SIZE_BYTES = 10000;
-  private static final int SEGMENT_SIZE_BYTES = 5000;
-  private final TestHelper.NdnEnvironment environment;
-
-  public AdvancedClientStressTestIT() throws SecurityException {
-    String ip = System.getProperty("nfd.ip");
-    logger.info("Testing on NFD at: " + ip);
-    environment = TestHelper.buildTestEnvironment(ip, 2);
-  }
-
-  @Test
-  public void stressTest() throws Exception {
-    Face producer = environment.faces.get(0);
-    Face consumer = environment.faces.get(1);
-
-    producer.registerPrefix(PREFIX, new RandomDataServer(MESSAGE_SIZE_BYTES, SEGMENT_SIZE_BYTES), null);
-
-    // TODO this must be here until the prefix registration callback is complete
-    Thread.sleep(500);
-
-    long startTime = System.currentTimeMillis();
-    AdvancedClient client = new AdvancedClient();
-    List<CompletableFuture<Data>> requests = expressInterests(client, consumer, PREFIX, NUM_MESSAGES);
-    List<Data> datas = requests.stream().map((f) -> TestHelper.retrieve(f)).collect(Collectors.toList());
-    long endTime = System.currentTimeMillis();
-
-    logger.info(String.format("Transfered %d bytes in %d ms", MESSAGE_SIZE_BYTES * NUM_MESSAGES, endTime - startTime));
-  }
-
-  private List<CompletableFuture<Data>> expressInterests(Client client, Face face, Name name, int count) {
-    return IntStream.range(0, count).boxed().map((i) -> client.getAsync(face, name)).collect(Collectors.toList());
-  }
-
-  private class RandomDataServer implements OnInterestCallback {
-
-    private final int contentSize;
-    private final int segmentSize;
-
-    public RandomDataServer(int contentSize, int segmentSize) {
-      this.contentSize = contentSize;
-      this.segmentSize = segmentSize;
-    }
-
-    @Override
-    public void onInterest(Name prefix, Interest interest, Face face, long interestFilterId, InterestFilter filter) {
-      // ignore segmented requests, the data has already been put below
-      if (SegmentationHelper.isSegmented(interest.getName(), (byte) 0x00)) {
-        return;
-      }
-      
-      // randomly ignore 10% of requests
-      if (new Random().nextInt(10) < 2){
-        logger.info("Skipping an interest: " + interest.toUri());
-        return;
-      }
-
-      ByteArrayInputStream bytes = new ByteArrayInputStream(TestHelper.buildRandomString(contentSize).getBytes());
-      Data data = TestHelper.buildData(interest.getName(), "");
-      data.getMetaInfo().setFreshnessPeriod(0);
-
-      try {
-        for (Data segment : SegmentedServerHelper.segment(data, bytes, segmentSize)) {
-          logger.log(Level.INFO, "Put data: " + segment.getName().toUri());
-          face.putData(segment);
-        }
-      } catch (IOException ex) {
-        logger.log(Level.SEVERE, "Failed to put data.", ex);
-      }
-    }
-  }
-}
diff --git a/src/test/java/com/intel/jndn/utils/client/impl/DefaultSegmentedClientTest.java b/src/test/java/com/intel/jndn/utils/client/impl/DefaultSegmentedClientTest.java
index 2d65724..7ed72d4 100644
--- a/src/test/java/com/intel/jndn/utils/client/impl/DefaultSegmentedClientTest.java
+++ b/src/test/java/com/intel/jndn/utils/client/impl/DefaultSegmentedClientTest.java
@@ -22,6 +22,8 @@
 import net.named_data.jndn.Interest;
 import net.named_data.jndn.Name;
 import static org.junit.Assert.assertEquals;
+
+import net.named_data.jndn.OnData;
 import org.junit.Test;
 
 /**
@@ -40,9 +42,12 @@
     Interest interest = new Interest(name);
     DataStream stream = instance.getSegmentsAsync(face, interest);
 
-    TestCounter counter = new TestCounter();
-    stream.observe((i, d) -> {
-      counter.count++;
+    final TestCounter counter = new TestCounter();
+    stream.observe(new OnData() {
+      @Override
+      public void onData(Interest interest, Data data) {
+        counter.count++;
+      }
     });
 
     for (Data segment : TestHelper.buildSegments(name, 0, 5)) {
@@ -77,9 +82,12 @@
     Interest interest = new Interest(name);
     DataStream stream = instance.getSegmentsAsync(face, interest);
 
-    TestCounter counter = new TestCounter();
-    stream.observe((i, d) -> {
-      counter.count++;
+    final TestCounter counter = new TestCounter();
+    stream.observe(new OnData() {
+      @Override
+      public void onData(Interest interest, Data data) {
+        counter.count++;
+      }
     });
 
     for (Data segment : TestHelper.buildSegments(name, 0, 5)) {
diff --git a/src/test/java/com/intel/jndn/utils/client/impl/SegmentedDataStreamTest.java b/src/test/java/com/intel/jndn/utils/client/impl/SegmentedDataStreamTest.java
index 2f165b9..9407cfc 100644
--- a/src/test/java/com/intel/jndn/utils/client/impl/SegmentedDataStreamTest.java
+++ b/src/test/java/com/intel/jndn/utils/client/impl/SegmentedDataStreamTest.java
@@ -20,6 +20,7 @@
 import net.named_data.jndn.Interest;
 import net.named_data.jndn.Name;
 import net.named_data.jndn.Name.Component;
+import net.named_data.jndn.OnData;
 import net.named_data.jndn.encoding.EncodingException;
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
@@ -50,13 +51,16 @@
   public void testAddingUnorderedData() throws StreamException {
     Name name = new Name("/test/segmented/data/stream");
     Interest interest = new Interest(name);
-    ArrayList<Long> segments = new ArrayList<>();
+    final ArrayList<Long> segments = new ArrayList<>();
 
-    instance.observe((i, d) -> {
-      try {
-        segments.add(d.getName().get(-1).toSegment());
-      } catch (EncodingException ex) {
-        throw new RuntimeException(ex);
+    instance.observe(new OnData() {
+      @Override
+      public void onData(Interest i, Data d) {
+        try {
+          segments.add(d.getName().get(-1).toSegment());
+        } catch (EncodingException ex) {
+          throw new RuntimeException(ex);
+        }
       }
     });
 
@@ -99,10 +103,10 @@
   @Test
   public void testOrderedPackets() {
     int end = 10;
-    IntStream.range(0, end).forEach((i) -> {
+    for (int i = 0; i < end; i++) {
       addPacketToInstance(i);
       assertEquals(i, instance.current());
-    });
+    };
 
     assertEquals(end, instance.list().length);
   }
diff --git a/src/test/java/com/intel/jndn/utils/client/impl/SimpleClientTestIT.java b/src/test/java/com/intel/jndn/utils/client/impl/SimpleClientTestIT.java
deleted file mode 100644
index f49525b..0000000
--- a/src/test/java/com/intel/jndn/utils/client/impl/SimpleClientTestIT.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * jndn-utils
- * Copyright (c) 2015, Intel Corporation.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU Lesser General Public License,
- * version 3, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
- * more details.
- */
-package com.intel.jndn.utils.client.impl;
-
-import com.intel.jndn.utils.client.impl.SimpleClient;
-import com.intel.jndn.utils.TestHelper;
-import java.io.IOException;
-import java.util.concurrent.CompletableFuture;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import java.util.stream.IntStream;
-import java.util.stream.Stream;
-import net.named_data.jndn.Data;
-import net.named_data.jndn.Face;
-import net.named_data.jndn.Interest;
-import net.named_data.jndn.InterestFilter;
-import net.named_data.jndn.Name;
-import net.named_data.jndn.OnInterestCallback;
-import net.named_data.jndn.security.SecurityException;
-import net.named_data.jndn.util.Blob;
-import org.junit.Assert;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import org.junit.Test;
-
-/**
- * Test SimpleClient.java; requires a hostname to an NFD accepting a generated
- * key to register prefixes, e.g. mvn test -Dnfd.ip=10.10.10.1
- *
- * @author Andrew Brown <andrew.brown@intel.com>
- */
-public class SimpleClientTestIT {
-
-  private static final Logger logger = Logger.getLogger(SimpleClientTestIT.class.getName());
-  private static final Name PREFIX_RETRIEVE = new Name("/test/simple-client/retrieve-one").append(TestHelper.buildRandomString(10));
-  private static final Name PREFIX_RETRIEVE_MULTIPLE = new Name("/test/simple-client/retrieve-multiple").append(TestHelper.buildRandomString(10));
-
-  SimpleClient instance;
-  private final TestHelper.NdnEnvironment environment;
-
-  public SimpleClientTestIT() throws SecurityException {
-    String ip = System.getProperty("nfd.ip");
-    environment = TestHelper.buildTestEnvironment(ip, 2);
-    instance = SimpleClient.getDefault();
-  }
-
-  @Test
-  public void testRetrieval() throws Exception {
-    // setup faces
-    Face producerFace = environment.faces.get(0);
-    Face consumerFace = environment.faces.get(1);
-
-    // setup server
-    Data servedData = new Data();
-    servedData.setContent(new Blob("....."));
-    servedData.getMetaInfo().setFreshnessPeriod(0);
-    producerFace.registerPrefix(PREFIX_RETRIEVE, new DataServer(servedData), null);
-
-    // TODO this must be here until the prefix registration callback is complete
-    Thread.sleep(500);
-
-    // send interest
-    CompletableFuture<Data> future = instance.getAsync(consumerFace, PREFIX_RETRIEVE);
-    Data retrievedData = future.get();
-
-    // verify
-    Assert.assertEquals(servedData.getContent().toString(), retrievedData.getContent().toString());
-  }
-
-  @Test
-  public void testSyncRetrieval() throws Exception {
-    String ip = System.getProperty("nfd.ip");
-    Face face = new Face(ip);
-    Interest interest = new Interest(new Name("/localhop/nfd/rib")); // this query should return some data if NFD is running locally
-    interest.setInterestLifetimeMilliseconds(2000);
-    Data data = SimpleClient.getDefault().getSync(face, interest);
-    assertNotNull(data);
-  }
-
-  @Test
-  public void testMultipleRetrieval() throws Exception {
-    int numInterests = 100;
-
-    // setup faces
-    Face producerFace = environment.faces.get(0);
-    Face consumerFace = environment.faces.get(1);
-
-    // setup server
-    Data servedData = new Data();
-    servedData.setContent(new Blob("0123456789"));
-    servedData.getMetaInfo().setFreshnessPeriod(0);
-    producerFace.registerPrefix(PREFIX_RETRIEVE_MULTIPLE, new DataServer(servedData), null);
-
-    // this must be here until the prefix registration callback is complete
-    Thread.sleep(500);
-
-    // request all packets
-    Stream<CompletableFuture<Data>> futures = IntStream.range(0, numInterests)
-            .boxed().map((i) -> instance.getAsync(consumerFace, PREFIX_RETRIEVE_MULTIPLE));
-
-    // check all returned packets
-    futures.map((f) -> TestHelper.retrieve(f))
-            .forEach((d) -> assertEquals(servedData.getContent().toString(), d.getContent().toString()));
-  }
-
-  private class DataServer implements OnInterestCallback {
-
-    private Data data;
-
-    public DataServer(Data data) {
-      this.data = data;
-    }
-
-    @Override
-    public void onInterest(Name prefix, Interest interest, Face face, long interestFilterId, InterestFilter filter) {
-      data.setName(interest.getName());
-      try {
-        face.putData(data);
-      } catch (IOException ex) {
-        logger.log(Level.SEVERE, "Failed to put data.", ex);
-      }
-    }
-  }
-}
diff --git a/src/test/java/com/intel/jndn/utils/server/impl/SegmentedServerTestIT.java b/src/test/java/com/intel/jndn/utils/server/impl/SegmentedServerTestIT.java
deleted file mode 100644
index a3409a3..0000000
--- a/src/test/java/com/intel/jndn/utils/server/impl/SegmentedServerTestIT.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * jndn-utils
- * Copyright (c) 2015, Intel Corporation.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU Lesser General Public License,
- * version 3, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
- * more details.
- */
-package com.intel.jndn.utils.server.impl;
-
-import com.intel.jndn.mock.MockKeyChain;
-import com.intel.jndn.utils.TestHelper;
-import com.intel.jndn.utils.client.impl.AdvancedClient;
-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;
-import net.named_data.jndn.Name;
-import net.named_data.jndn.encoding.EncodingException;
-import net.named_data.jndn.security.KeyChain;
-import net.named_data.jndn.security.SecurityException;
-import net.named_data.jndn.util.Blob;
-import static org.junit.Assert.*;
-import org.junit.Test;
-
-/**
- * Test the {@link SegmentedServer} on an actual NFD; to run this, pass the NFD
- * IP/host name as a parameter like <code>-Dnfd.ip=10.1.1.1</code>.
- *
- * @author Andrew Brown <andrew.brown@intel.com>
- */
-public class SegmentedServerTestIT {
-
-  private static final Logger logger = Logger.getLogger(SegmentedServerTestIT.class.getName());
-  private static final Name PREFIX = new Name("/test/for/segmented-server");
-  protected static final int DATA_SIZE_BYTES = 10000;
-  Face face;
-  SegmentedServer instance;
-  private String ip;
-
-  public SegmentedServerTestIT() throws SecurityException {
-    this.ip = System.getProperty("nfd.ip");
-    this.face = new Face(ip);
-    this.instance = new SegmentedServer(face, PREFIX);
-    KeyChain mockKeyChain = MockKeyChain.configure(new Name("/test/server"));
-    face.setCommandSigningInfo(mockKeyChain, mockKeyChain.getDefaultCertificateName());
-  }
-
-  @Test
-  public void testRegisterAndRetrieval() throws Exception {
-    final Name dataName = new Name(PREFIX).append("1");
-
-    // why a new thread? The server will only operate if someone turns the crank,
-    // i.e. someone calls face.processEvents() every so often. 
-    new Thread(new Runnable() {
-      @Override
-      public void run() {
-        try {
-          instance.serve(buildDataPacket(dataName));
-        } catch (IOException ex) {
-          logger.info("Failed to serve data.");
-        }
-
-        while (true) {
-          try {
-            face.processEvents();
-          } catch (IOException | EncodingException ex) {
-            logger.info("Failed while processing events.");
-          }
-        }
-      }
-    }).start();
-
-    // TODO why wait? we want to make sure the thread is running and that the prefix
-    // registration has succeeded on the NFD before we send interests
-    Thread.sleep(1000);
-
-    // why a different face? because we don't want the abover face.processEvents()
-    // to interfere with the SimpleClient's processEvents().
-    logger.info("Retrieving data: " + dataName.toUri());
-    Interest interest = new Interest(dataName);
-    interest.setInterestLifetimeMilliseconds(2000);
-    interest.setMustBeFresh(true);
-    interest.setChildSelector(Interest.CHILD_SELECTOR_RIGHT);
-
-    Data retrieved = AdvancedClient.getDefault().getSync(new Face(ip), interest);
-    assertNotNull(retrieved);
-    assertEquals(DATA_SIZE_BYTES, retrieved.getContent().size());
-    logger.info("Retrieved data: " + retrieved.getName().toUri());
-  }
-
-  Data buildDataPacket(Name name) {
-    Data data = new Data(new Name(name).appendSegment(0));
-    data.setContent(new Blob(TestHelper.buildRandomBytes(DATA_SIZE_BYTES)));
-    data.getMetaInfo().setFreshnessPeriod(30000);
-    return data;
-  }
-}
