diff --git a/src/main/java/com/intel/jndn/utils/client/SegmentedFutureData.java b/src/main/java/com/intel/jndn/utils/client/SegmentedFutureData.java
index 66d01be..252f72c 100644
--- a/src/main/java/com/intel/jndn/utils/client/SegmentedFutureData.java
+++ b/src/main/java/com/intel/jndn/utils/client/SegmentedFutureData.java
@@ -143,7 +143,7 @@
     ByteArrayOutputStream content = new ByteArrayOutputStream();
     for (Future<Data> futureData : segments) {
       try {
-        content.write(futureData.get().getContent().getImmutableArray());
+        content.write(futureData.get(timeout, unit).getContent().getImmutableArray());
       } catch (ExecutionException | IOException | InterruptedException e) {
         throw new ExecutionException("Failed while aggregating retrieved packets: " + interestName.toUri(), e);
       }
diff --git a/src/main/java/com/intel/jndn/utils/repository/ForLoopRepository.java b/src/main/java/com/intel/jndn/utils/repository/ForLoopRepository.java
index 8f8ed5b..80fedb1 100644
--- a/src/main/java/com/intel/jndn/utils/repository/ForLoopRepository.java
+++ b/src/main/java/com/intel/jndn/utils/repository/ForLoopRepository.java
@@ -50,7 +50,6 @@
       if (interest.matchesName(record.data.getName())) {
         if (hasNoChildSelector(interest) && hasAcceptableFreshness(interest, record)) {
           selectedData = record.data;
-          break;
         } else {
           Name.Component component = getNextComponentAfterLastInterestComponent(record.data, interest);
 
@@ -119,7 +118,7 @@
    */
   private boolean isFresh(Record record) {
     double period = record.data.getMetaInfo().getFreshnessPeriod();
-    return period < 0 || record.addedAt + period > System.currentTimeMillis();
+    return period < 0 || record.addedAt + (long) period > System.currentTimeMillis();
   }
 
   /**
diff --git a/src/test/java/com/intel/jndn/utils/SegmentedServerTestIT.java b/src/test/java/com/intel/jndn/utils/SegmentedServerTestIT.java
index 3b78b74..49d054f 100644
--- a/src/test/java/com/intel/jndn/utils/SegmentedServerTestIT.java
+++ b/src/test/java/com/intel/jndn/utils/SegmentedServerTestIT.java
@@ -15,10 +15,10 @@
 
 import com.intel.jndn.mock.MockKeyChain;
 import java.io.IOException;
-import java.util.logging.Level;
 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;
@@ -52,22 +52,19 @@
 
   @Test
   public void testRegisterAndRetrieval() throws Exception {
-    final Name name = new Name(prefix).append("1");
+    final Name name1 = new Name(prefix).append("1");
+    final Name name2 = new Name(prefix).append("2");
 
     // 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() {
-        Data served = new Data(name);
-        served.setContent(new Blob("..."));
-        served.getMetaInfo().setFreshnessPeriod(30000);
-
         try {
-          instance.serve(served);
-          logger.info("Serving data: " + name.toUri());
+          instance.serve(buildDataPacket(name1));
+          instance.serve(buildDataPacket(name2));
         } catch (IOException ex) {
-          logger.info("Failed to serve data: " + name.toUri());
+          logger.info("Failed to serve data.");
         }
 
         while (true) {
@@ -86,9 +83,22 @@
 
     // why a different face? because we don't want the abover face.processEvents()
     // to interfere with the SimpleClient's processEvents().
-    logger.info("Retrieving data: " + name.toUri());
-    Data retrieved = SegmentedClient.getDefault().getSync(new Face(ip), name);
+    logger.info("Retrieving data: " + prefix.toUri());
+    Interest interest = new Interest(new Name(prefix));
+    interest.setInterestLifetimeMilliseconds(2000);
+    interest.setMustBeFresh(true);
+    interest.setChildSelector(Interest.CHILD_SELECTOR_RIGHT);
+    
+    Data retrieved = SegmentedClient.getDefault().getSync(new Face(ip), interest);
     assertNotNull(retrieved);
     assertEquals("...", retrieved.getContent().toString());
+    logger.info("Retrieved data: " + retrieved.getName().toUri());
+  }
+
+  Data buildDataPacket(Name name) {
+    Data data = new Data(new Name(name).appendSegment(0));
+    data.setContent(new Blob("..."));
+    data.getMetaInfo().setFreshnessPeriod(30000);
+    return data;
   }
 }
diff --git a/src/test/java/com/intel/jndn/utils/client/SegmentedFutureDataTest.java b/src/test/java/com/intel/jndn/utils/client/SegmentedFutureDataTest.java
index 5bc3149..b97104d 100644
--- a/src/test/java/com/intel/jndn/utils/client/SegmentedFutureDataTest.java
+++ b/src/test/java/com/intel/jndn/utils/client/SegmentedFutureDataTest.java
@@ -69,8 +69,16 @@
   /**
    * Test of get method, of class FutureData.
    */
-  @Test
+  @Test(expected = TimeoutException.class)
   public void testGet_long_TimeUnit() throws Exception {
-    instance.get(10, TimeUnit.MILLISECONDS);
+    Face face = new MockFace();
+    Data data = new Data(new Name("/test/packet").appendSegment(0));
+    FutureData future = new FutureData(face, data.getName());
+    
+    List<Future<Data>> segments = new ArrayList<>();
+    segments.add(future);
+    SegmentedFutureData segmentedFuture = new SegmentedFutureData(new Name("/test/packet"), segments);
+    
+    segmentedFuture.get(10, TimeUnit.MILLISECONDS);
   }
 }
