diff --git a/pom.xml b/pom.xml
index f6806e3..6b5ff01 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
 	<modelVersion>4.0.0</modelVersion>
 	<groupId>com.intel.jndn.utils</groupId>
 	<artifactId>jndn-utils</artifactId>
-	<version>0.10.0</version>
+	<version>0.10.1</version>
 	<name>jndn-utils</name>
 	<description>Collection of tools to simplify synchronous and asynchronous data transfer over the NDN network</description>
 	<url>https://github.com/01org/jndn-utils</url>
diff --git a/src/main/java/com/intel/jndn/utils/SegmentedClient.java b/src/main/java/com/intel/jndn/utils/SegmentedClient.java
index d9deb3e..9c9d61f 100644
--- a/src/main/java/com/intel/jndn/utils/SegmentedClient.java
+++ b/src/main/java/com/intel/jndn/utils/SegmentedClient.java
@@ -16,16 +16,17 @@
 import com.intel.jndn.utils.client.FutureData;
 import com.intel.jndn.utils.client.SegmentedFutureData;
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
+import java.util.concurrent.TimeoutException;
 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.OnData;
+import net.named_data.jndn.OnTimeout;
 import net.named_data.jndn.encoding.EncodingException;
 
 /**
@@ -57,11 +58,12 @@
   }
 
   /**
-   * Asynchronously send Interest packets for a segmented result; will block
-   * until the first packet is received and then send remaining interests until
-   * the specified FinalBlockId.
+   * Asynchronously send Interest packets for a segmented result; will not
+   * block, but will wait for the first packet to return before sending
+   * remaining interests until using the specified FinalBlockId. Will retrieve
+   * non-segmented packets as well.
    *
-   * @param face
+   * @param face the {@link Face} on which to retrieve the packets
    * @param interest should include either a ChildSelector or an initial segment
    * number; the initial segment number will be cut off in the de-segmented
    * packet.
@@ -69,19 +71,95 @@
    * will contain one FutureData with the failure exception
    */
   @Override
-  public Future<Data> getAsync(Face face, Interest interest) {
-    List<Future<Data>> segments = getAsyncList(face, interest);
-    return new SegmentedFutureData(interest.getName(), segments);
+  public Future<Data> getAsync(final Face face, Interest interest) {
+    final long firstSegmentId = parseFirstSegmentId(interest);
+    final SegmentedFutureData segmentedData = new SegmentedFutureData(face, interest.getName());
+    final FutureData firstData = new FutureData(face, interest.getName());
+    segmentedData.add(0, firstData);
+
+    // send first interest
+    logger.log(Level.FINER, "Sending first interest for: " + interest.getName().toUri());
+    try {
+      face.expressInterest(interest, new OnData() {
+        @Override
+        public void onData(Interest interest, Data data) {
+          firstData.resolve(data);
+          // now request subsequent segments using FinalBlockId and the Interest template
+          try {
+            long lastSegmentId = parseLastSegmentId(data);
+            Interest template = new Interest(interest);
+            template.setName(removeSegment(data.getName()));
+            requestRemainingSegments(face, segmentedData, template, firstSegmentId + 1, lastSegmentId);
+          } catch (EncodingException ex) {
+            Logger.getLogger(SegmentedClient.class.getName()).log(Level.SEVERE, null, ex);
+          }
+        }
+      }, new OnTimeout() {
+        @Override
+        public void onTimeout(Interest interest) {
+          segmentedData.reject(new TimeoutException());
+        }
+      });
+    } catch (IOException e) {
+      logger.log(Level.FINE, "IO failure while sending interest: ", e);
+      segmentedData.reject(e);
+    }
+
+    return segmentedData;
   }
 
   /**
-   * Asynchronously send Interest packets for a segmented result; will block
-   * until the first packet is received and then send remaining interests until
-   * the specified FinalBlockId.
+   * @param interest the request {@link Interest}
+   * @return the first segment the interest is requesting, or 0 if none found
+   */
+  private long parseFirstSegmentId(Interest interest) {
+    try {
+      return interest.getName().get(-1).toSegment();
+    } catch (EncodingException e) {
+      if (interest.getChildSelector() == -1) {
+        logger.log(Level.WARNING, "No child selector set for a segmented Interest; this may result in incorrect retrieval.");
+        // allow this interest to pass without a segment marker since it may still succeed
+      }
+      return 0;
+    }
+  }
+
+  /**
+   * @param firstData the first returned {@link Data}
+   * @return the last segment number available as specified in the FinalBlockId
+   * @throws EncodingException
+   */
+  private long parseLastSegmentId(Data firstData) throws EncodingException {
+    return firstData.getMetaInfo().getFinalBlockId().toSegment();
+  }
+
+  /**
+   * Send interests for remaining segments; adding them to the segmented future
    *
    * @param face
+   * @param segmentedData
+   * @param template
+   * @param fromSegment
+   * @param toSegment
+   */
+  private void requestRemainingSegments(Face face, SegmentedFutureData segmentedData, Interest template, long fromSegment, long toSegment) {
+    // send interests in remaining segments
+    for (long i = fromSegment; i <= toSegment; i++) {
+      Interest segmentedInterest = new Interest(template);
+      segmentedInterest.getName().appendSegment(i);
+      Future<Data> futureData = SimpleClient.getDefault().getAsync(face, segmentedInterest);
+      segmentedData.add((int) i, futureData);
+    }
+  }
+
+  /**
+   * Asynchronously send Interest packets for a segmented result; see {@link #getAsync(net.named_data.jndn.Face, net.named_data.jndn.Interest)
+   * } for more information.
+   *
+   * @param face the {@link Face} on which to retrieve the packets
    * @param name the {@link Name} of the packet to retrieve using a default
-   * interest
+   * interest; may optionally end with the segment component of the first
+   * segment to retrieve
    * @return an aggregated data packet from all received segments
    */
   public Future<Data> getAsync(Face face, Name name) {
@@ -89,85 +167,10 @@
   }
 
   /**
-   * Asynchronously send Interest packets for a segmented result; will block
-   * until the first packet is received and then send remaining interests until
-   * the specified FinalBlockId.
-   *
-   * @param face
-   * @param interest should include either a ChildSelector or an initial segment
-   * number
-   * @return a list of FutureData packets; if the first segment fails, the list
-   * will contain one FutureData with the failure exception
-   */
-  public List<Future<Data>> getAsyncList(Face face, Interest interest) {
-    // get first segment; default 0 or use a specified start segment
-    long firstSegment = 0;
-    try {
-      firstSegment = interest.getName().get(-1).toSegment();
-    } catch (EncodingException e) {
-      // check for interest selector if no initial segment found
-      if (interest.getChildSelector() == -1) {
-        logger.log(Level.WARNING, "No child selector set for a segmented Interest; this may result in incorrect retrieval.");
-        // allow this interest to pass without a segment marker since it may still succeed
-      }
-    }
-
-    // setup segments
-    final List<Future<Data>> segments = new ArrayList<>();
-    segments.add(SimpleClient.getDefault().getAsync(face, interest));
-
-    // retrieve first packet and find the FinalBlockId
-    Data firstData;
-    long lastSegment;
-    try {
-      firstData = segments.get(0).get();
-      lastSegment = firstData.getMetaInfo().getFinalBlockId().toSegment();
-    } catch (ExecutionException | InterruptedException e) {
-      logger.log(Level.FINE, "Failed to retrieve first segment: " + interest.toUri(), e);
-      ((FutureData) segments.get(0)).reject(e); // TODO implies knowledge of underlying data structure
-      return segments;
-    } catch (EncodingException e) {
-      logger.log(Level.FINER, "No FinalBlockId, returning first packet: " + interest.toUri());
-      return segments;
-    }
-
-    // set follow-on segment names to match first segment retrieve
-    Interest interestCopy = new Interest(interest);
-    if (hasSegment(firstData.getName())) {
-      interestCopy.setName(firstData.getName().getPrefix(-1)); // cut last segment number if present
-    } else {
-      logger.log(Level.FINER, "First packet retrieved does not have a segment number, continuing on: " + firstData.getName().toUri());
-      interestCopy.setName(firstData.getName());
-    }
-
-    // send interests in remaining segments
-    for (long i = firstSegment + 1; i <= lastSegment; i++) {
-      Interest segmentedInterest = new Interest(interestCopy);
-      segmentedInterest.getName().appendSegment(i);
-      Future<Data> futureData = SimpleClient.getDefault().getAsync(face, segmentedInterest);
-      segments.add((int) i, futureData);
-    }
-
-    return segments;
-  }
-
-  /**
-   * Asynchronously send Interests for a segmented Data packet using a default
-   * interest (e.g. 2 second timeout); this will block until complete (i.e.
-   * either data is received or the interest times out). See getAsync(Face face)
-   * for more information.
-   *
-   * @param face
-   * @param name
-   * @return
-   */
-  public List<Future<Data>> getAsyncList(Face face, Name name) {
-    return getAsyncList(face, SimpleClient.getDefaultInterest(name));
-  }
-
-  /**
-   * Retrieve a segmented Data packet; will block until all segments are
-   * received and will re-assemble these.
+   * Retrieve a segmented Data packet; see {@link #getAsync(net.named_data.jndn.Face, net.named_data.jndn.Interest)
+   * } for more information. This method will block and call
+   * {@link Face#processEvents()} until the sent interests timeout or the
+   * corresponding data packets are retrieved.
    *
    * @param face
    * @param interest should include either a ChildSelector or an initial segment
@@ -190,9 +193,9 @@
 
   /**
    * Synchronously retrieve the Data for a Name using a default interest (e.g. 2
-   * second timeout); this will block until complete (i.e. either data is
-   * received or the interest times out). See getSync(Face face) for more
-   * information.
+   * second timeout). This method will block and call
+   * {@link Face#processEvents()} until the sent interests timeout or the
+   * corresponding data packets are retrieved.
    *
    * @param face
    * @param name
@@ -214,4 +217,12 @@
   public static boolean hasSegment(Name name) {
     return name.get(-1).getValue().buf().get(0) == 0x00;
   }
+
+  /**
+   * @param name the {@link Name} to check
+   * @return a new instance of {@link Name} with no segment component appended
+   */
+  public static Name removeSegment(Name name) {
+    return hasSegment(name) ? name.getPrefix(-1) : new Name(name);
+  }
 }
diff --git a/src/main/java/com/intel/jndn/utils/client/FutureData.java b/src/main/java/com/intel/jndn/utils/client/FutureData.java
index 55c001e..663db81 100644
--- a/src/main/java/com/intel/jndn/utils/client/FutureData.java
+++ b/src/main/java/com/intel/jndn/utils/client/FutureData.java
@@ -13,15 +13,10 @@
  */
 package com.intel.jndn.utils.client;
 
-import java.io.IOException;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
 import net.named_data.jndn.Data;
 import net.named_data.jndn.Face;
 import net.named_data.jndn.Name;
-import net.named_data.jndn.encoding.EncodingException;
+import net.named_data.jndn.OnData;
 
 /**
  * Reference to a Packet that has yet to be returned from the network. Usage:
@@ -38,160 +33,51 @@
  *
  * @author Andrew Brown <andrew.brown@intel.com>
  */
-public class FutureData implements Future<Data> {
+public class FutureData extends FutureDataBase {
 
-  protected final Face face;
-  private final Name name;
   private Data data;
-  private boolean cancelled = false;
-  private Throwable error;
 
   /**
    * Constructor
    *
-   * @param face
-   * @param name
+   * @param face the {@link Face} to use for processing events
+   * @param name the {@link Name} of the interest sent
    */
   public FutureData(Face face, Name name) {
-    this.face = face;
-    this.name = new Name(name);
+    super(face, name);
   }
 
   /**
-   * Get the Interest name.
-   *
-   * @return
-   */
-  public Name getName() {
-    return name;
-  }
-
-  /**
-   * Cancel the current request.
-   *
-   * @param mayInterruptIfRunning
-   * @return
-   */
-  @Override
-  public boolean cancel(boolean mayInterruptIfRunning) {
-    cancelled = true;
-    return cancelled;
-  }
-
-  /**
-   * Determine if this request is cancelled.
-   *
-   * @return
-   */
-  @Override
-  public boolean isCancelled() {
-    return cancelled;
-  }
-
-  /**
-   * Determine if the request has completed (successfully or not).
-   *
-   * @return
+   * @return true if the request has completed (successfully or not)
    */
   @Override
   public boolean isDone() {
-    return data != null || error != null || isCancelled();
+    return isResolved() || isRejected() || isCancelled();
   }
 
   /**
-   * Set the packet when successfully retrieved; unblocks get().
+   * Set the packet when successfully retrieved; unblocks {@link #get()}. Use
+   * this method inside an {@link OnData} callback to resolve this future.
    *
-   * @param d
+   * @param returnedData the {@link Data} returned from the network
    */
-  public void resolve(Data d) {
-    data = d;
+  public void resolve(Data returnedData) {
+    data = returnedData;
   }
 
   /**
-   * Set the exception when request failed; unblocks get().
-   *
-   * @param e
+   * @return true if the {@link Data} has returned and been resolved with
+   * {@link #resolve(net.named_data.jndn.Data)}.
    */
-  public void reject(Throwable e) {
-    error = e;
+  public boolean isResolved() {
+    return data != null;
   }
 
   /**
-   * Block until packet is retrieved.
-   *
-   * @return
-   * @throws InterruptedException
-   * @throws ExecutionException
+   * {@inheritDoc}
    */
   @Override
-  public Data get() throws InterruptedException, ExecutionException {
-    while (!isDone()) {
-      // process face events
-      try {
-        synchronized (face) {
-          face.processEvents();
-        }
-      } catch (EncodingException | IOException e) {
-        throw new ExecutionException("Failed to retrieve packet while processing events: " + name.toUri(), e);
-      }
-    }
-
-    // case: cancelled
-    if (cancelled) {
-      throw new InterruptedException("Interrupted by user while retrieving packet: " + name.toUri());
-    }
-
-    // case: error
-    if (error != null) {
-      throw new ExecutionException("Error while retrieving packet: " + name.toUri(), error);
-    }
-
-    return data;
-  }
-
-  /**
-   * Block until packet is retrieved or timeout is reached.
-   *
-   * @param timeout
-   * @param unit
-   * @return
-   * @throws InterruptedException
-   * @throws ExecutionException
-   * @throws TimeoutException
-   */
-  @Override
-  public Data get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException {
-    long interval = TimeUnit.MILLISECONDS.convert(timeout, unit);
-    long endTime = System.currentTimeMillis() + interval;
-    long currentTime = System.currentTimeMillis();
-    while (!isDone() && !isCancelled() && currentTime <= endTime) {
-      // process face events
-      try {
-        synchronized (face) {
-          face.processEvents();
-        }
-      } catch (EncodingException | IOException e) {
-        throw new ExecutionException("Failed to retrieve packet while processing events: " + name.toUri(), e);
-      }
-
-      currentTime = System.currentTimeMillis();
-    }
-
-    // case: cancelled
-    if (cancelled) {
-      throw new InterruptedException("Interrupted by user while retrieving packet: " + name.toUri());
-    }
-
-    // case: error
-    if (error != null) {
-      throw new ExecutionException("Error while retrieving packet: " + name.toUri(), error);
-    }
-
-    // case: timed out
-    if (currentTime > endTime) {
-      throw new TimeoutException("Timed out while retrieving packet: " + name.toUri());
-    }
-
+  public Data getData() {
     return data;
   }
 }
diff --git a/src/main/java/com/intel/jndn/utils/client/FutureDataBase.java b/src/main/java/com/intel/jndn/utils/client/FutureDataBase.java
new file mode 100644
index 0000000..a398cb3
--- /dev/null
+++ b/src/main/java/com/intel/jndn/utils/client/FutureDataBase.java
@@ -0,0 +1,184 @@
+/*
+ * 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;
+
+import java.io.IOException;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import net.named_data.jndn.Data;
+import net.named_data.jndn.Face;
+import net.named_data.jndn.Name;
+import net.named_data.jndn.OnTimeout;
+import net.named_data.jndn.encoding.EncodingException;
+
+/**
+ * Implement common functionality for re-use in NDN futures
+ *
+ * @author Andrew Brown <andrew.brown@intel.com>
+ */
+public abstract class FutureDataBase implements Future<Data> {
+
+  private final Face face;
+  private final Name name;
+  private boolean cancelled = false;
+  private Throwable error;
+
+  /**
+   * Constructor
+   *
+   * @param face the {@link Face} to use for processing events
+   * @param name the {@link Name} of the interest sent
+   */
+  public FutureDataBase(Face face, Name name) {
+    this.face = face;
+    this.name = new Name(name);
+  }
+
+  /**
+   * Block until packet is retrieved; will call face.processEvents() until the
+   * future is resolved or rejected.
+   *
+   * @return the {@link Data} when the packet is retrieved
+   * @throws InterruptedException
+   * @throws ExecutionException
+   */
+  @Override
+  public final Data get() throws InterruptedException, ExecutionException {
+    while (!isDone()) {
+      // process face events
+      try {
+        synchronized (face) {
+          face.processEvents();
+        }
+      } catch (EncodingException | IOException e) {
+        throw new ExecutionException("Failed to retrieve packet while processing events: " + name.toUri(), e);
+      }
+    }
+
+    // case: cancelled
+    if (isCancelled()) {
+      throw new InterruptedException("Interrupted by user while retrieving packet: " + name.toUri());
+    }
+
+    // case: error
+    if (isRejected()) {
+      throw new ExecutionException("Error while retrieving packet: " + name.toUri(), error);
+    }
+
+    return getData();
+  }
+
+  /**
+   * Block until packet is retrieved or timeout is reached.
+   *
+   * @param timeout
+   * @param unit
+   * @return
+   * @throws InterruptedException
+   * @throws ExecutionException
+   * @throws TimeoutException
+   */
+  @Override
+  public final Data get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException {
+    long interval = TimeUnit.MILLISECONDS.convert(timeout, unit);
+    long endTime = System.currentTimeMillis() + interval;
+    long currentTime = System.currentTimeMillis();
+    while (!isDone() && currentTime <= endTime) {
+      // process face events
+      try {
+        synchronized (face) {
+          face.processEvents();
+        }
+      } catch (EncodingException | IOException e) {
+        throw new ExecutionException("Failed to retrieve packet while processing events: " + name.toUri(), e);
+      }
+
+      currentTime = System.currentTimeMillis();
+    }
+
+    // case: cancelled
+    if (isCancelled()) {
+      throw new InterruptedException("Interrupted by user while retrieving packet: " + name.toUri());
+    }
+
+    // case: error
+    if (isRejected()) {
+      throw new ExecutionException("Error while retrieving packet: " + name.toUri(), error);
+    }
+
+    // case: timed out
+    if (currentTime > endTime) {
+      throw new TimeoutException("Timed out while retrieving packet: " + name.toUri());
+    }
+
+    return getData();
+  }
+
+  /**
+   * @return true if the request has completed (successfully or not)
+   */
+  @Override
+  public boolean isDone() {
+    return isRejected() || isCancelled();
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public final boolean cancel(boolean mayInterruptIfRunning) {
+    cancelled = true;
+    return cancelled;
+  }
+
+  /**
+   * @return true if this request is cancelled
+   */
+  @Override
+  public final boolean isCancelled() {
+    return cancelled;
+  }
+
+  /**
+   * @return true if the future has been rejected with an error
+   */
+  public final boolean isRejected() {
+    return error != null;
+  }
+
+  /**
+   * Set the exception when request failed; unblocks {@link #get()}. Use this
+   * method inside an {@link OnTimeout} callback to resolve this future.
+   *
+   * @param failureCause the error that causes this future to fail
+   */
+  public final void reject(Throwable failureCause) {
+    error = failureCause;
+  }
+
+  /**
+   * @return the {@link Data} retrieved by this future
+   */
+  public abstract Data getData() throws InterruptedException, ExecutionException;
+
+  /**
+   * @return the {@link Name} used for this future; this is currently only used
+   * for debugging purposes, not retrieval
+   */
+  public Name getName() {
+    return name;
+  }
+}
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 252f72c..4d58ee4 100644
--- a/src/main/java/com/intel/jndn/utils/client/SegmentedFutureData.java
+++ b/src/main/java/com/intel/jndn/utils/client/SegmentedFutureData.java
@@ -16,17 +16,17 @@
 import com.intel.jndn.utils.SegmentedClient;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
 import net.named_data.jndn.Data;
+import net.named_data.jndn.Face;
 import net.named_data.jndn.Name;
 import net.named_data.jndn.util.Blob;
 
 /**
- * Represents a list of Packets that have been requested asynchronously and have
+ * Represents a list of packets that have been requested asynchronously and have
  * yet to be returned from the network. Usage:
  *
  * <pre><code>
@@ -36,135 +36,106 @@
  *
  * @author Andrew Brown <andrew.brown@intel.com>
  */
-public class SegmentedFutureData implements Future<Data> {
+public class SegmentedFutureData extends FutureDataBase {
 
-  private final Name interestName;
-  List<Future<Data>> segments;
-  private boolean cancelled = false;
+  List<Future<Data>> segments = new ArrayList<>();
 
-  /**
-   * Constructor
-   *
-   * @param interestName the {@link Name} of the original interest, for debugging purposes
-   * @param segments the list of future segments to retrieve
-   */
-  public SegmentedFutureData(Name interestName, List<Future<Data>> segments) {
-    this.interestName = interestName;
-    this.segments = segments;
-  }
-  
-  /**
-   * Cancel the current request.
-   *
-   * @param mayInterruptIfRunning
-   * @return
-   */
-  @Override
-  public boolean cancel(boolean mayInterruptIfRunning) {
-    cancelled = true;
-    return cancelled;
+  public SegmentedFutureData(Face face, Name name) {
+    super(face, name);
   }
 
   /**
-   * Determine if this request is cancelled.
+   * Add a future data to the list of segments
    *
-   * @return
+   * @param index the numeric index in the list, see
+   * {@link List#add(int, java.lang.Object)} for more details.
+   * @param futureData the {@link Future} to add
    */
-  @Override
-  public boolean isCancelled() {
-    return cancelled;
+  public void add(int index, Future<Data> futureData) {
+    segments.add(index, futureData);
   }
 
   /**
-   * Determine if the request has completed (successfully or not).
+   * Add a future data to the end of the list of segments
    *
-   * @return
+   * @param futureData the {@link Future} to add
+   */
+  public void add(FutureData futureData) {
+    segments.add(futureData);
+  }
+
+  /**
+   * @return true if the request has completed (successfully or not)
    */
   @Override
   public boolean isDone() {
-    // check for errors, cancellation
-    if (isCancelled()) {
-      return true;
-    }
-
-    // check each segment for completion
+    return isRejected() || isCancelled() || allSegmentsDone();
+  }
+  
+  /**
+   * @return true if all segments are done
+   */
+  private boolean allSegmentsDone(){
     for (Future<Data> futureData : segments) {
       if (!futureData.isDone()) {
         return false;
       }
     }
-
     return true;
   }
 
   /**
-   * Block until packet is retrieved.
-   *
-   * @return
-   * @throws InterruptedException
-   * @throws ExecutionException
+   * {@inheritDoc}
    */
   @Override
-  public Data get() throws InterruptedException, ExecutionException {
+  public Data getData() throws ExecutionException, InterruptedException {
+    byte[] content = aggregateBytes();
+    Data data = buildAggregatePacket();
+    data.setContent(new Blob(content));
+    return data;
+  }
+  
+  /**
+   * @return the array of aggregated bytes for all of the segments retrieved
+   * @throws ExecutionException
+   */
+  private byte[] aggregateBytes() throws ExecutionException {
     // aggregate bytes
     ByteArrayOutputStream content = new ByteArrayOutputStream();
     for (Future<Data> futureData : segments) {
       try {
         content.write(futureData.get().getContent().getImmutableArray());
       } catch (ExecutionException | IOException | InterruptedException e) {
-        throw new ExecutionException("Failed while aggregating retrieved packets: " + interestName.toUri(), e);
+        throw new ExecutionException("Failed while aggregating retrieved packets: " + getName().toUri(), e);
       }
     }
-
-    // build aggregated packet (copy first packet)
-    Data firstData = segments.get(0).get();
-    Data data = new Data(firstData);
-    data.setName(getNameFromFirstData(firstData));
-    data.setContent(new Blob(content.toByteArray()));
-    return data;
+    return content.toByteArray();
   }
 
   /**
-   * Block until packet is retrieved or timeout is reached.
-   *
-   * @param timeout
-   * @param unit
-   * @return
+   * @return an aggregated {@link Data} packet with no content set
    * @throws InterruptedException
    * @throws ExecutionException
-   * @throws TimeoutException
    */
-  @Override
-  public Data get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException {
-    long interval = TimeUnit.MILLISECONDS.convert(timeout, unit);
-    long endTime = System.currentTimeMillis() + interval;
-
-    // aggregate bytes
-    ByteArrayOutputStream content = new ByteArrayOutputStream();
-    for (Future<Data> futureData : segments) {
-      try {
-        content.write(futureData.get(timeout, unit).getContent().getImmutableArray());
-      } catch (ExecutionException | IOException | InterruptedException e) {
-        throw new ExecutionException("Failed while aggregating retrieved packets: " + interestName.toUri(), e);
-      }
-
-      // check for timeout
-      if (System.currentTimeMillis() > endTime) {
-        throw new TimeoutException("Timed out while retrieving packets: " + interestName.toUri());
-      }
+  private Data buildAggregatePacket() throws InterruptedException, ExecutionException {
+    if (segments.isEmpty()) {
+      throw new IllegalStateException("Unable to aggregate packets; no segments added with SegmentedFutureData.add().");
     }
-    
-    // build aggregated packet (copy first packet)
     Data firstData = segments.get(0).get();
-    Data data = new Data(firstData);
-    data.setName(getNameFromFirstData(firstData));
-    data.setContent(new Blob(content.toByteArray()));
-    return data;
+    Data aggregatedData = new Data(firstData);
+    aggregatedData.setName(parseName(firstData));
+    return aggregatedData;
   }
-  
-  private Name getNameFromFirstData(Data firstPacket) throws InterruptedException, ExecutionException{
-    Name firstPacketName = segments.get(0).get().getName();
-    if(SegmentedClient.hasSegment(firstPacketName)){
+
+  /**
+   * @return parse the name of the segmented packet from the first packet; this
+   * will remove the segment number if it is the last name component
+   * @throws InterruptedException
+   * @throws ExecutionException
+   */
+  private Name parseName(Data data) throws InterruptedException, ExecutionException {
+    Name firstPacketName = data.getName();
+    if (SegmentedClient.hasSegment(firstPacketName)) {
       firstPacketName = firstPacketName.getPrefix(-1);
     }
     return firstPacketName;
diff --git a/src/test/java/com/intel/jndn/utils/SegmentedClientTest.java b/src/test/java/com/intel/jndn/utils/SegmentedClientTest.java
index df6d056..823223d 100644
--- a/src/test/java/com/intel/jndn/utils/SegmentedClientTest.java
+++ b/src/test/java/com/intel/jndn/utils/SegmentedClientTest.java
@@ -87,14 +87,8 @@
   public void testFailureToRetrieve() throws Exception {
     // retrieve non-existent data, should timeout
     logger.info("Client expressing interest asynchronously: /test/no-data");
-    List<Future<Data>> futureSegments = SegmentedClient.getDefault().getAsyncList(face, new Name("/test/no-data"));
-
-    // the list of future packets should be initialized
-    assertEquals(1, futureSegments.size());
-    assertTrue(futureSegments.get(0).isDone());
-
-    // should throw error
-    futureSegments.get(0).get();
+    Future<Data> futureData = SegmentedClient.getDefault().getAsync(face, new Name("/test/no-data"));
+    futureData.get();
   }
 
   /**
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 b97104d..e030083 100644
--- a/src/test/java/com/intel/jndn/utils/client/SegmentedFutureDataTest.java
+++ b/src/test/java/com/intel/jndn/utils/client/SegmentedFutureDataTest.java
@@ -36,15 +36,14 @@
 
   public SegmentedFutureDataTest() {
     Face face = new MockFace();
-    List<Future<Data>> segments = new ArrayList<>();
+    instance = new SegmentedFutureData(face, new Name("/test/packet"));
     for (int i = 0; i < 10; i++) {
       Data data = new Data(new Name("/test/packet").appendSegment(i));
       data.setContent(new Blob("."));
       FutureData future = new FutureData(face, data.getName());
       future.resolve(data);
-      segments.add(future);
+      instance.add(future);
     }
-    instance = new SegmentedFutureData(new Name("/test/packet"), segments);
   }
 
   @Test
@@ -75,9 +74,8 @@
     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);
+    SegmentedFutureData segmentedFuture = new SegmentedFutureData(face, new Name("/test/packet"));
+    segmentedFuture.add(future);
     
     segmentedFuture.get(10, TimeUnit.MILLISECONDS);
   }
