diff --git a/tests/chunks/consumer.t.cpp b/tests/chunks/consumer.t.cpp
index ebedd61..f6d3e8a 100644
--- a/tests/chunks/consumer.t.cpp
+++ b/tests/chunks/consumer.t.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2016-2018, Regents of the University of California,
+ * Copyright (c) 2016-2019, Regents of the University of California,
  *                          Colorado State University,
  *                          University Pierre & Marie Curie, Sorbonne University.
  *
@@ -157,7 +157,10 @@
   void
   handleData(const Interest& interest, const Data& data) final
   {
-    this->emitSignal(onDiscoverySuccess, data);
+    if (!data.getName().empty() && data.getName()[-1].isVersion())
+      this->emitSignal(onDiscoverySuccess, data.getName());
+    else
+      this->emitSignal(onDiscoveryFailure, "Invalid versioned name");
   }
 
 public:
@@ -210,7 +213,8 @@
   this->advanceClocks(io, time::nanoseconds(1));
   BOOST_REQUIRE_EQUAL(face.sentInterests.size(), 1);
 
-  auto data = makeData(prefix.appendSegment(0));
+  // this Data packet answers the discovery Interest, so it must end with a version number
+  auto data = makeData(prefix.appendVersion(0));
   face.receive(*data);
 
   this->advanceClocks(io, time::nanoseconds(1));
diff --git a/tests/chunks/discover-version-fixture.hpp b/tests/chunks/discover-version-fixture.hpp
index 8d49537..ed18235 100644
--- a/tests/chunks/discover-version-fixture.hpp
+++ b/tests/chunks/discover-version-fixture.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2016-2018, Regents of the University of California,
+ * Copyright (c) 2016-2019, Regents of the University of California,
  *                          Colorado State University,
  *                          University Pierre & Marie Curie, Sorbonne University.
  *
@@ -80,12 +80,12 @@
   }
 
   virtual void
-  onSuccess(const Data& data)
+  onSuccess(const Name& versionedName)
   {
     isDiscoveryFinished = true;
 
-    if (data.getName()[name.size()].isVersion())
-      discoveredVersion = data.getName()[name.size()].toVersion();
+    BOOST_REQUIRE(!versionedName.empty() && versionedName[-1].isVersion());
+    discoveredVersion = versionedName[-1].toVersion();
   }
 
   virtual void
diff --git a/tests/chunks/pipeline-interests-aimd.t.cpp b/tests/chunks/pipeline-interests-aimd.t.cpp
index 1335d67..0e6341e 100644
--- a/tests/chunks/pipeline-interests-aimd.t.cpp
+++ b/tests/chunks/pipeline-interests-aimd.t.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2016-2018, Regents of the University of California,
+ * Copyright (c) 2016-2019, Regents of the University of California,
  *                          Colorado State University,
  *                          University Pierre & Marie Curie, Sorbonne University.
  *
@@ -102,11 +102,11 @@
   BOOST_REQUIRE_CLOSE(aimdPipeline->m_cwnd, 1, MARGIN);
 
   double preCwnd = aimdPipeline->m_cwnd;
-  runWithData(*makeDataWithSegment(0));
+  run(name);
   advanceClocks(io, time::nanoseconds(1));
   BOOST_CHECK_EQUAL(face.sentInterests.size(), 1);
 
-  for (uint64_t i = 1; i < nDataSegments - 1; ++i) {
+  for (uint64_t i = 0; i < nDataSegments - 1; ++i) {
     face.receive(*makeDataWithSegment(i));
     advanceClocks(io, time::nanoseconds(1));
     BOOST_CHECK_CLOSE(aimdPipeline->m_cwnd - preCwnd, 1, MARGIN);
@@ -118,22 +118,22 @@
 
 BOOST_AUTO_TEST_CASE(CongestionAvoidance)
 {
-  nDataSegments = 8;
+  nDataSegments = 7;
   aimdPipeline->m_ssthresh = 4.0;
   BOOST_REQUIRE_CLOSE(aimdPipeline->m_cwnd, 1, MARGIN);
 
   double preCwnd = aimdPipeline->m_cwnd;
-  runWithData(*makeDataWithSegment(0));
+  run(name);
   advanceClocks(io, time::nanoseconds(1));
   BOOST_CHECK_EQUAL(face.sentInterests.size(), 1);
 
-  for (uint64_t i = 1; i < aimdPipeline->m_ssthresh; ++i) { // slow start
+  for (uint64_t i = 0; i < aimdPipeline->m_ssthresh; ++i) { // slow start
     face.receive(*makeDataWithSegment(i));
     advanceClocks(io, time::nanoseconds(1));
     preCwnd = aimdPipeline->m_cwnd;
   }
 
-  BOOST_CHECK_CLOSE(preCwnd, aimdPipeline->m_ssthresh, MARGIN);
+  BOOST_CHECK_CLOSE(preCwnd, 4.25, MARGIN);
 
   for (uint64_t i = aimdPipeline->m_ssthresh; i < nDataSegments - 1; ++i) { // congestion avoidance
     face.receive(*makeDataWithSegment(i));
@@ -151,19 +151,19 @@
   aimdPipeline->m_ssthresh = 4.0;
   BOOST_REQUIRE_CLOSE(aimdPipeline->m_cwnd, 1, MARGIN);
 
-  runWithData(*makeDataWithSegment(0));
+  run(name);
   advanceClocks(io, time::nanoseconds(1));
   BOOST_CHECK_EQUAL(face.sentInterests.size(), 1);
 
-  // receive segment 1 and segment 2
-  for (uint64_t i = 1; i < 3; ++i) {
+  // receive segment 0, 1, and 2
+  for (uint64_t i = 0; i < 3; ++i) {
     face.receive(*makeDataWithSegment(i));
     advanceClocks(io, time::nanoseconds(1));
   }
 
   BOOST_CHECK_EQUAL(pipeline->m_nReceived, 3);
-  BOOST_CHECK_CLOSE(aimdPipeline->m_cwnd, 3, MARGIN);
-  BOOST_CHECK_EQUAL(face.sentInterests.size(), 5); // request for segment 5 has been sent
+  BOOST_CHECK_CLOSE(aimdPipeline->m_cwnd, 4, MARGIN);
+  BOOST_CHECK_EQUAL(face.sentInterests.size(), 7); // request for segment 7 has been sent
 
   advanceClocks(io, time::milliseconds(100));
 
@@ -176,14 +176,14 @@
   advanceClocks(io, time::nanoseconds(1));
 
   BOOST_CHECK_EQUAL(pipeline->m_nReceived, 5);
-  BOOST_CHECK_CLOSE(aimdPipeline->m_cwnd, 4.25, MARGIN);
-  BOOST_CHECK_EQUAL(face.sentInterests.size(), nDataSegments - 1); // all the segment requests have been sent
+  BOOST_CHECK_CLOSE(aimdPipeline->m_cwnd, 4.5, MARGIN);
+  BOOST_CHECK_EQUAL(face.sentInterests.size(), nDataSegments); // all the segment requests have been sent
 
   // timeout segment 3
   advanceClocks(io, time::milliseconds(150));
 
   BOOST_CHECK_EQUAL(pipeline->m_nReceived, 5);
-  BOOST_CHECK_CLOSE(aimdPipeline->m_cwnd, 2.125, MARGIN); // window size drop to 1/2 of previous size
+  BOOST_CHECK_CLOSE(aimdPipeline->m_cwnd, 2.25, MARGIN); // window size drop to 1/2 of previous size
   BOOST_CHECK_EQUAL(aimdPipeline->m_retxQueue.size(), 1);
 
   // receive segment 6, retransmit 3
@@ -191,7 +191,7 @@
   advanceClocks(io, time::nanoseconds(1));
 
   BOOST_CHECK_EQUAL(pipeline->m_nReceived, 6);
-  BOOST_CHECK_CLOSE(aimdPipeline->m_cwnd, 2.625, MARGIN); // congestion avoidance
+  BOOST_CHECK_CLOSE(aimdPipeline->m_cwnd, 2.75, MARGIN); // congestion avoidance
   BOOST_CHECK_EQUAL(aimdPipeline->m_retxQueue.size(), 0);
   BOOST_CHECK_EQUAL(aimdPipeline->m_retxCount[3], 1);
 }
@@ -202,33 +202,33 @@
   aimdPipeline->m_ssthresh = 4.0;
   BOOST_REQUIRE_CLOSE(aimdPipeline->m_cwnd, 1, MARGIN);
 
-  runWithData(*makeDataWithSegment(0));
+  run(name);
   advanceClocks(io, time::nanoseconds(1));
   BOOST_CHECK_EQUAL(face.sentInterests.size(), 1);
 
-  // receive segments 1 to 4
-  for (uint64_t i = 1; i < 5; ++i) {
+  // receive segments 0 to 4
+  for (uint64_t i = 0; i < 5; ++i) {
     face.receive(*makeDataWithSegment(i));
     advanceClocks(io, time::nanoseconds(1));
   }
 
   BOOST_CHECK_EQUAL(pipeline->m_nReceived, 5);
-  BOOST_CHECK_CLOSE(aimdPipeline->m_cwnd, 4.25, MARGIN);
+  BOOST_CHECK_CLOSE(aimdPipeline->m_cwnd, 4.5, MARGIN);
 
   // receive segment 5 with congestion mark
   face.receive(*makeDataWithSegmentAndCongMark(5));
   advanceClocks(io, time::nanoseconds(1));
 
   BOOST_CHECK_EQUAL(pipeline->m_nReceived, 6);
-  BOOST_CHECK_CLOSE(aimdPipeline->m_cwnd, 2.125, MARGIN); // window size drops to 1/2 of previous size
-  BOOST_CHECK_EQUAL(face.sentInterests.size(), nDataSegments - 1); // all interests have been sent
+  BOOST_CHECK_CLOSE(aimdPipeline->m_cwnd, 2.25, MARGIN); // window size drops to 1/2 of previous size
+  BOOST_CHECK_EQUAL(face.sentInterests.size(), nDataSegments); // all interests have been sent
 
   // receive the last segment with congestion mark
   face.receive(*makeDataWithSegmentAndCongMark(nDataSegments - 1));
   advanceClocks(io, time::nanoseconds(1));
 
   BOOST_CHECK_EQUAL(pipeline->m_nReceived, nDataSegments);
-  BOOST_CHECK_CLOSE(aimdPipeline->m_cwnd, 2.125, MARGIN); // conservative window adaption (window size should not decrease)
+  BOOST_CHECK_CLOSE(aimdPipeline->m_cwnd, 2.25, MARGIN); // conservative window adaption (window size should not decrease)
   BOOST_CHECK_EQUAL(aimdPipeline->m_retxQueue.size(), 0);
 
   // make sure no interest is retransmitted for marked data packets
@@ -248,26 +248,26 @@
   aimdPipeline->m_ssthresh = 4.0;
   BOOST_REQUIRE_CLOSE(aimdPipeline->m_cwnd, 1, MARGIN);
 
-  runWithData(*makeDataWithSegment(0));
+  run(name);
   advanceClocks(io, time::nanoseconds(1));
   BOOST_CHECK_EQUAL(face.sentInterests.size(), 1);
 
-  // receive segments 1 to 4
-  for (uint64_t i = 1; i < 5; ++i) {
+  // receive segments 0 to 4
+  for (uint64_t i = 0; i < 5; ++i) {
     face.receive(*makeDataWithSegment(i));
     advanceClocks(io, time::nanoseconds(1));
   }
 
   BOOST_CHECK_EQUAL(pipeline->m_nReceived, 5);
-  BOOST_CHECK_CLOSE(aimdPipeline->m_cwnd, 4.25, MARGIN);
+  BOOST_CHECK_CLOSE(aimdPipeline->m_cwnd, 4.5, MARGIN);
 
   // receive segment 5 with congestion mark
   face.receive(*makeDataWithSegmentAndCongMark(5));
   advanceClocks(io, time::nanoseconds(1));
 
   BOOST_CHECK_EQUAL(pipeline->m_nReceived, 6);
-  BOOST_CHECK_CLOSE(aimdPipeline->m_cwnd, 2.125, MARGIN); // window size drops to 1/2 of previous size
-  BOOST_CHECK_EQUAL(face.sentInterests.size(), nDataSegments - 1); // all interests have been sent
+  BOOST_CHECK_CLOSE(aimdPipeline->m_cwnd, 2.25, MARGIN); // window size drops to 1/2 of previous size
+  BOOST_CHECK_EQUAL(face.sentInterests.size(), nDataSegments); // all interests have been sent
 
   // receive the last segment with congestion mark
   face.receive(*makeDataWithSegmentAndCongMark(nDataSegments - 1));
@@ -295,26 +295,26 @@
   aimdPipeline->m_ssthresh = 4.0;
   BOOST_REQUIRE_CLOSE(aimdPipeline->m_cwnd, 1, MARGIN);
 
-  runWithData(*makeDataWithSegment(0));
+  run(name);
   advanceClocks(io, time::nanoseconds(1));
   BOOST_CHECK_EQUAL(face.sentInterests.size(), 1);
 
-  // receive segments 1 to 5
-  for (uint64_t i = 1; i < 6; ++i) {
+  // receive segments 0 to 5
+  for (uint64_t i = 0; i < 6; ++i) {
     face.receive(*makeDataWithSegment(i));
     advanceClocks(io, time::nanoseconds(1));
   }
 
   BOOST_CHECK_EQUAL(pipeline->m_nReceived, 6);
-  BOOST_CHECK_CLOSE(aimdPipeline->m_cwnd, 4.5, MARGIN);
-  BOOST_CHECK_EQUAL(face.sentInterests.size(), nDataSegments - 1); // all interests have been sent
+  BOOST_CHECK_CLOSE(aimdPipeline->m_cwnd, 4.75, MARGIN);
+  BOOST_CHECK_EQUAL(face.sentInterests.size(), nDataSegments); // all interests have been sent
 
   // receive the last segment with congestion mark
   face.receive(*makeDataWithSegmentAndCongMark(nDataSegments - 1));
   advanceClocks(io, time::nanoseconds(1));
 
   BOOST_CHECK_EQUAL(pipeline->m_nReceived, nDataSegments);
-  BOOST_CHECK_CLOSE(aimdPipeline->m_cwnd, 4.75, MARGIN); // window size increases
+  BOOST_CHECK_CLOSE(aimdPipeline->m_cwnd, 5.0, MARGIN); // window size increases
   BOOST_CHECK_EQUAL(aimdPipeline->m_retxQueue.size(), 0);
 
   // make sure no interest is retransmitted for marked data packet
@@ -328,16 +328,19 @@
 {
   nDataSegments = 5;
   aimdPipeline->m_cwnd = 10.0;
-  runWithData(*makeDataWithSegment(0));
+  run(name);
+  advanceClocks(io, time::nanoseconds(1));
+
+  face.receive(*makeDataWithSegment(0));
   advanceClocks(io, time::nanoseconds(1));
 
   face.receive(*makeDataWithSegment(1));
   advanceClocks(io, time::nanoseconds(1));
 
   BOOST_CHECK_EQUAL(pipeline->m_nReceived, 2);
-  BOOST_REQUIRE_EQUAL(face.sentInterests.size(), 4);
+  BOOST_REQUIRE_EQUAL(face.sentInterests.size(), 10);
 
-  // receive a nack with NackReason::DUPLICATE for segment 2
+  // receive a nack with NackReason::DUPLICATE for segment 1
   auto nack1 = makeNack(face.sentInterests[1], lp::NackReason::DUPLICATE);
   face.receive(nack1);
   advanceClocks(io, time::nanoseconds(1));
@@ -347,15 +350,15 @@
   BOOST_CHECK_EQUAL(pipeline->m_nReceived, 2);
   BOOST_CHECK_EQUAL(aimdPipeline->m_retxQueue.size(), 0);
 
-  // receive a nack with NackReason::CONGESTION for segment 3
+  // receive a nack with NackReason::CONGESTION for segment 2
   auto nack2 = makeNack(face.sentInterests[2], lp::NackReason::CONGESTION);
   face.receive(nack2);
   advanceClocks(io, time::nanoseconds(1));
 
-  // segment 3 is retransmitted
-  BOOST_CHECK_EQUAL(aimdPipeline->m_retxCount[3], 1);
+  // segment 2 is retransmitted
+  BOOST_CHECK_EQUAL(aimdPipeline->m_retxCount[2], 1);
 
-  // receive a nack with NackReason::NONE for segment 4
+  // receive a nack with NackReason::NONE for segment 3
   auto nack3 = makeNack(face.sentInterests[3], lp::NackReason::NONE);
   face.receive(nack3);
   advanceClocks(io, time::nanoseconds(1));
@@ -369,28 +372,28 @@
 {
   nDataSegments = 4;
   aimdPipeline->m_cwnd = 4;
-  runWithData(*makeDataWithSegment(0, false));
+  run(name);
   advanceClocks(io, time::nanoseconds(1));
 
-  // receive segment 1 without FinalBlockId
-  face.receive(*makeDataWithSegment(1, false));
+  // receive segment 0 without FinalBlockId
+  face.receive(*makeDataWithSegment(0, false));
   advanceClocks(io, time::nanoseconds(1));
 
-  // interests for segment 1 - 6 have been sent
+  // interests for segment 0 - 5 have been sent
   BOOST_CHECK_EQUAL(face.sentInterests.size(), 6);
-  BOOST_CHECK_EQUAL(pipeline->m_nReceived, 2);
+  BOOST_CHECK_EQUAL(pipeline->m_nReceived, 1);
   BOOST_CHECK_EQUAL(aimdPipeline->m_hasFinalBlockId, false);
-  // pending interests: segment 2, 3, 4, 5, 6
+  // pending interests: segment 1, 2, 3, 4, 5
   BOOST_CHECK_EQUAL(face.getNPendingInterests(), 5);
 
-  // receive segment 2 with FinalBlockId
-  face.receive(*makeDataWithSegment(2));
+  // receive segment 1 with FinalBlockId
+  face.receive(*makeDataWithSegment(1));
   advanceClocks(io, time::nanoseconds(1));
-  BOOST_CHECK_EQUAL(pipeline->m_nReceived, 3);
+  BOOST_CHECK_EQUAL(pipeline->m_nReceived, 2);
   BOOST_CHECK_EQUAL(aimdPipeline->m_hasFinalBlockId, true);
 
-  // pending interests for segment 2, 4, 5, 6 haven been removed
-  BOOST_CHECK_EQUAL(face.getNPendingInterests(), 1);
+  // pending interests for segment 1, 4, 5 haven been removed
+  BOOST_CHECK_EQUAL(face.getNPendingInterests(), 2);
 }
 
 BOOST_AUTO_TEST_CASE(FailureBeforeFinalBlockIdReceived)
@@ -401,17 +404,22 @@
 
   nDataSegments = 4;
   aimdPipeline->m_cwnd = 4;
-  runWithData(*makeDataWithSegment(0, false));
+  run(name);
+  advanceClocks(io, time::nanoseconds(1));
+
+  // receive segment 0 without FinalBlockId
+  face.receive(*makeDataWithSegment(0, false));
   advanceClocks(io, time::nanoseconds(1));
 
   // receive segment 1 without FinalBlockId
   face.receive(*makeDataWithSegment(1, false));
   advanceClocks(io, time::nanoseconds(1));
-  // interests for segment 1 - 6 have been sent
-  BOOST_REQUIRE_EQUAL(face.sentInterests.size(), 6);
+
+  // interests for segment 0 - 7 have been sent
+  BOOST_REQUIRE_EQUAL(face.sentInterests.size(), 8);
 
   // receive nack with NackReason::NONE for segment 3
-  auto nack = makeNack(face.sentInterests[2], lp::NackReason::NONE);
+  auto nack = makeNack(face.sentInterests[3], lp::NackReason::NONE);
   face.receive(nack);
   advanceClocks(io, time::nanoseconds(1));
 
@@ -436,22 +444,27 @@
 
   nDataSegments = 4;
   aimdPipeline->m_cwnd = 4;
-  runWithData(*makeDataWithSegment(0, false));
+  run(name);
+  advanceClocks(io, time::nanoseconds(1));
+
+  // receive segment 0 without FinalBlockId
+  face.receive(*makeDataWithSegment(0, false));
   advanceClocks(io, time::nanoseconds(1));
 
   // receive segment 1 without FinalBlockId
   face.receive(*makeDataWithSegment(1, false));
   advanceClocks(io, time::nanoseconds(1));
-  // interests for segment 1 - 6 have been sent
-  BOOST_REQUIRE_EQUAL(face.sentInterests.size(), 6);
+
+  // interests for segment 0 - 7 have been sent
+  BOOST_REQUIRE_EQUAL(face.sentInterests.size(), 8);
 
   // receive nack with NackReason::NONE for segment 4
-  auto nack = makeNack(face.sentInterests[3], lp::NackReason::NONE);
+  auto nack = makeNack(face.sentInterests[4], lp::NackReason::NONE);
   face.receive(nack);
   advanceClocks(io, time::nanoseconds(1));
 
   // error not triggered
-  // pending interests for segment > 4 have been removed
+  // pending interests for segment > 3 have been removed
   BOOST_CHECK_EQUAL(hasFailed, false);
   BOOST_CHECK_EQUAL(face.getNPendingInterests(), 2);
 
@@ -479,14 +492,18 @@
 
   nDataSegments = 3;
 
-  runWithData(*makeDataWithSegment(0));
+  run(name);
+  advanceClocks(io, time::nanoseconds(1));
+
+  // receive segment 0
+  face.receive(*makeDataWithSegment(0));
   advanceClocks(io, time::nanoseconds(1));
 
   // receive segment 1
   face.receive(*makeDataWithSegment(1));
   advanceClocks(io, time::nanoseconds(1));
 
-  BOOST_CHECK_EQUAL(face.sentInterests.size(), 2);
+  BOOST_CHECK_EQUAL(face.sentInterests.size(), 3);
 
   // check if segment 2's state is FirstTimeSent
   auto it = aimdPipeline->m_segmentInfo.find(2);
@@ -496,7 +513,7 @@
   // timeout segment 2 twice
   advanceClocks(io, time::milliseconds(400), 3);
 
-  BOOST_CHECK_EQUAL(face.sentInterests.size(), 4);
+  BOOST_CHECK_EQUAL(face.sentInterests.size(), 5);
 
   // check if segment 2's state is Retransmitted
   it = aimdPipeline->m_segmentInfo.find(2);
@@ -524,7 +541,7 @@
   // nothing changed
   it = aimdPipeline->m_segmentInfo.find(2);
   BOOST_CHECK(it == aimdPipeline->m_segmentInfo.end());
-  BOOST_CHECK_EQUAL(face.sentInterests.size(), 4);
+  BOOST_CHECK_EQUAL(face.sentInterests.size(), 5);
   BOOST_CHECK_EQUAL(rttEstimator.getAvgRtt(), prevRtt);
   BOOST_CHECK_EQUAL(rttEstimator.getEstimatedRto(), prevRto);
 }
@@ -562,10 +579,10 @@
   createPipeline();
   nDataSegments = 1;
 
-  runWithData(*makeDataWithSegment(0));
+  run(name);
   advanceClocks(io, time::nanoseconds(1));
 
-  face.receive(*makeDataWithSegment(1));
+  face.receive(*makeDataWithSegment(0));
   advanceClocks(io, time::nanoseconds(1));
 
   BOOST_CHECK_EQUAL(aimdPipeline->m_hasFinalBlockId, true);
diff --git a/tests/chunks/pipeline-interests-fixed-window.t.cpp b/tests/chunks/pipeline-interests-fixed-window.t.cpp
index c4d4aad..e75b4a2 100644
--- a/tests/chunks/pipeline-interests-fixed-window.t.cpp
+++ b/tests/chunks/pipeline-interests-fixed-window.t.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2016-2018, Regents of the University of California,
+ * Copyright (c) 2016-2019, Regents of the University of California,
  *                          Colorado State University,
  *                          University Pierre & Marie Curie, Sorbonne University.
  *
@@ -21,6 +21,7 @@
  * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
  *
  * @author Andrea Tosatto
+ * @author Chavoosh Ghasemi
  */
 
 #include "tools/chunks/catchunks/pipeline-interests-fixed-window.hpp"
@@ -61,53 +62,23 @@
 BOOST_AUTO_TEST_SUITE(Chunks)
 BOOST_FIXTURE_TEST_SUITE(TestPipelineInterestsFixedWindow, PipelineInterestFixedWindowFixture)
 
-BOOST_AUTO_TEST_CASE(FewerSegmentsThanPipelineCapacity)
-{
-  nDataSegments = 3;
-  BOOST_ASSERT(nDataSegments <= opt.maxPipelineSize);
-
-  runWithData(*makeDataWithSegment(0));
-  advanceClocks(io, time::nanoseconds(1), 1);
-  BOOST_REQUIRE_EQUAL(face.sentInterests.size(), nDataSegments - 1);
-
-  for (uint64_t i = 1; i < nDataSegments - 1; ++i) {
-    face.receive(*makeDataWithSegment(i));
-    advanceClocks(io, time::nanoseconds(1), 1);
-
-    BOOST_CHECK_EQUAL(pipeline->m_nReceived, i + 1);
-    BOOST_REQUIRE_EQUAL(face.sentInterests.size(), nDataSegments - 1);
-    // check if the interest for the segment i+1 is well formed
-    const auto& sentInterest = face.sentInterests[i];
-    BOOST_CHECK_EQUAL(sentInterest.getExclude().size(), 0);
-    BOOST_CHECK_EQUAL(sentInterest.getMaxSuffixComponents(), 1);
-    BOOST_CHECK_EQUAL(sentInterest.getMustBeFresh(), opt.mustBeFresh);
-    BOOST_CHECK_EQUAL(Name(name).isPrefixOf(sentInterest.getName()), true);
-    BOOST_CHECK_EQUAL(getSegmentFromPacket(sentInterest), i + 1);
-  }
-
-  BOOST_CHECK_EQUAL(hasFailed, false);
-
-  advanceClocks(io, ndn::DEFAULT_INTEREST_LIFETIME, opt.maxRetriesOnTimeoutOrNack + 1);
-  BOOST_CHECK_EQUAL(hasFailed, true);
-}
-
 BOOST_AUTO_TEST_CASE(FullPipeline)
 {
   nDataSegments = 13;
   BOOST_ASSERT(nDataSegments > opt.maxPipelineSize);
 
-  runWithData(*makeDataWithSegment(nDataSegments - 1));
+  run(name);
   advanceClocks(io, time::nanoseconds(1), 1);
   BOOST_REQUIRE_EQUAL(face.sentInterests.size(), opt.maxPipelineSize);
 
   for (uint64_t i = 0; i < nDataSegments - 1; ++i) {
     face.receive(*makeDataWithSegment(i));
     advanceClocks(io, time::nanoseconds(1), 1);
-    BOOST_CHECK_EQUAL(pipeline->m_nReceived, i + 2);
+    BOOST_CHECK_EQUAL(pipeline->m_nReceived, i + 1);
 
-    if (i < nDataSegments - opt.maxPipelineSize - 1) {
+    if (i < nDataSegments - opt.maxPipelineSize) {
       BOOST_REQUIRE_EQUAL(face.sentInterests.size(), opt.maxPipelineSize + i + 1);
-      // check if the interest for the segment i+1 is well formed
+      // check if the interest for the segment i is well formed
       const auto& sentInterest = face.sentInterests[i];
       BOOST_CHECK_EQUAL(sentInterest.getExclude().size(), 0);
       BOOST_CHECK_EQUAL(sentInterest.getMaxSuffixComponents(), 1);
@@ -117,11 +88,14 @@
     }
     else {
       // all the interests have been sent for all the segments
-      BOOST_CHECK_EQUAL(face.sentInterests.size(), nDataSegments - 1);
+      BOOST_CHECK_EQUAL(face.sentInterests.size(), nDataSegments);
     }
   }
 
   BOOST_CHECK_EQUAL(hasFailed, false);
+
+  advanceClocks(io, ndn::DEFAULT_INTEREST_LIFETIME, opt.maxRetriesOnTimeoutOrNack + 1);
+  BOOST_CHECK_EQUAL(hasFailed, true);
 }
 
 BOOST_AUTO_TEST_CASE(TimeoutAllSegments)
@@ -129,14 +103,14 @@
   nDataSegments = 13;
   BOOST_ASSERT(nDataSegments > opt.maxPipelineSize);
 
-  runWithData(*makeDataWithSegment(nDataSegments - 1));
+  run(name);
   advanceClocks(io, time::nanoseconds(1), 1);
   BOOST_REQUIRE_EQUAL(face.sentInterests.size(), opt.maxPipelineSize);
 
   for (int i = 0; i < opt.maxRetriesOnTimeoutOrNack; ++i) {
     advanceClocks(io, opt.interestLifetime, 1);
     BOOST_REQUIRE_EQUAL(face.sentInterests.size(), opt.maxPipelineSize * (i + 2));
-    BOOST_CHECK_EQUAL(pipeline->m_nReceived, 1);
+    BOOST_CHECK_EQUAL(pipeline->m_nReceived, 0);
 
     // A single retry for every pipeline element
     for (size_t j = 0; j < opt.maxPipelineSize; ++j) {
@@ -157,7 +131,7 @@
   nDataSegments = 18;
   BOOST_ASSERT(nDataSegments > opt.maxPipelineSize);
 
-  runWithData(*makeDataWithSegment(nDataSegments - 1));
+  run(name);
   advanceClocks(io, time::nanoseconds(1), 1);
   BOOST_REQUIRE_EQUAL(face.sentInterests.size(), opt.maxPipelineSize);
 
@@ -170,7 +144,7 @@
 
   // send a single data packet for each pipeline element
   advanceClocks(io, opt.interestLifetime, opt.maxRetriesOnTimeoutOrNack - 1);
-  for (uint64_t i = 0; i < opt.maxPipelineSize - 1; ++i) {
+  for (uint64_t i = 0; i < opt.maxPipelineSize; ++i) {
     face.receive(*makeDataWithSegment(opt.maxPipelineSize + i));
     advanceClocks(io, time::nanoseconds(1), 1);
   }
@@ -183,7 +157,7 @@
 
   // these new segments should not generate new interests
   advanceClocks(io, opt.interestLifetime, 1);
-  for (uint64_t i = 0; i < opt.maxPipelineSize - 1; ++i) {
+  for (uint64_t i = 0; i < opt.maxPipelineSize; ++i) {
     face.receive(*makeDataWithSegment(opt.maxPipelineSize * 2 + i - 1));
     advanceClocks(io, time::nanoseconds(1), 1);
   }
@@ -202,7 +176,7 @@
   nDataSegments = 22;
   BOOST_ASSERT(nDataSegments > opt.maxPipelineSize);
 
-  runWithData(*makeDataWithSegment(nDataSegments - 1, false));
+  run(name);
   advanceClocks(io, time::nanoseconds(1), 1);
   BOOST_REQUIRE_EQUAL(face.sentInterests.size(), opt.maxPipelineSize);
 
@@ -231,8 +205,8 @@
   BOOST_CHECK_EQUAL(hasFailed, false);
 
   // data for all the pipeline element, but not the second (segment #1)
-  for (uint64_t i = opt.maxPipelineSize; i < nDataSegments - 1; ++i) {
-    if (i == nDataSegments - 2) {
+  for (uint64_t i = opt.maxPipelineSize; i < nDataSegments; ++i) {
+    if (i == nDataSegments - 1) {
       face.receive(*makeDataWithSegment(i, true));
     }
     else {
@@ -255,7 +229,7 @@
   nDataSegments = 22;
   BOOST_ASSERT(nDataSegments > opt.maxPipelineSize);
 
-  runWithData(*makeDataWithSegment(nDataSegments - 1, false));
+  run(name);
   advanceClocks(io, time::nanoseconds(1), 1);
   BOOST_REQUIRE_EQUAL(face.sentInterests.size(), opt.maxPipelineSize);
 
@@ -272,11 +246,11 @@
   BOOST_CHECK_EQUAL(hasFailed, false);
 
   // data for the first pipeline element (segment #0), this should trigger an error because the
-  // others pipeline elements failed
+  // other pipeline elements failed
   face.receive(*makeDataWithSegment(0, false));
   advanceClocks(io, time::nanoseconds(1), 1);
 
-  BOOST_CHECK_EQUAL(pipeline->m_nReceived, 2);
+  BOOST_CHECK_EQUAL(pipeline->m_nReceived, 1);
   BOOST_CHECK_EQUAL(hasFailed, true);
 }
 
@@ -285,13 +259,13 @@
   nDataSegments = 13;
   BOOST_ASSERT(nDataSegments > opt.maxPipelineSize);
 
-  runWithData(*makeDataWithSegment(nDataSegments - 1));
+  run(name);
   advanceClocks(io, time::nanoseconds(1), 1);
   BOOST_REQUIRE_EQUAL(face.sentInterests.size(), opt.maxPipelineSize);
 
   // send nack for all the pipeline elements first interest
-  for (size_t j = 0; j < opt.maxPipelineSize; j++) {
-    auto nack = make_shared<lp::Nack>(face.sentInterests[j]);
+  for (size_t i = 0; i < opt.maxPipelineSize; i++) {
+    auto nack = make_shared<lp::Nack>(face.sentInterests[i]);
     nack->setReason(lp::NackReason::CONGESTION);
     face.receive(*nack);
     advanceClocks(io, time::nanoseconds(1), 1);
diff --git a/tests/chunks/pipeline-interests-fixture.hpp b/tests/chunks/pipeline-interests-fixture.hpp
index c9979fd..0d456c3 100644
--- a/tests/chunks/pipeline-interests-fixture.hpp
+++ b/tests/chunks/pipeline-interests-fixture.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2016-2018, Regents of the University of California,
+ * Copyright (c) 2016-2019, Regents of the University of California,
  *                          Colorado State University,
  *                          University Pierre & Marie Curie, Sorbonne University.
  *
@@ -70,9 +70,9 @@
   }
 
   void
-  runWithData(const Data& data)
+  run(const Name& name, uint64_t version = 0)
   {
-    pipeline->run(data,
+    pipeline->run(Name(name).appendVersion(version),
                   [] (const Data&) {},
                   [this] (const std::string&) { hasFailed = true; });
   }
diff --git a/tools/chunks/catchunks/consumer.cpp b/tools/chunks/catchunks/consumer.cpp
index 0106629..e7f751e 100644
--- a/tools/chunks/catchunks/consumer.cpp
+++ b/tools/chunks/catchunks/consumer.cpp
@@ -45,8 +45,8 @@
   m_nextToPrint = 0;
   m_bufferedData.clear();
 
-  m_discover->onDiscoverySuccess.connect([this] (const Data& data) {
-    m_pipeline->run(data,
+  m_discover->onDiscoverySuccess.connect([this] (const Name& versionedName) {
+    m_pipeline->run(versionedName,
       [this] (const Data& data) { handleData(data); },
       [] (const std::string& msg) { NDN_THROW(std::runtime_error(msg)); });
   });
diff --git a/tools/chunks/catchunks/discover-version-fixed.cpp b/tools/chunks/catchunks/discover-version-fixed.cpp
index 5d434f0..c122d2f 100644
--- a/tools/chunks/catchunks/discover-version-fixed.cpp
+++ b/tools/chunks/catchunks/discover-version-fixed.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2016-2017, Regents of the University of California,
+ * Copyright (c) 2016-2019, Regents of the University of California,
  *                          Colorado State University,
  *                          University Pierre & Marie Curie, Sorbonne University.
  *
@@ -52,16 +52,18 @@
   if (isVerbose)
     std::cerr << "Data: " << data << std::endl;
 
-  size_t segmentIndex = interest.getName().size();
-  if (data.getName()[segmentIndex].isSegment()) {
+  // data name must end with a segment number, preceded by a version number
+  if (data.getName().size() >= 2 &&
+      data.getName()[-1].isSegment() &&
+      data.getName()[-2].isVersion()) {
     if (isVerbose)
-      std::cerr << "Found data with the requested version: " << m_prefix[-1] << std::endl;
+      std::cerr << "Found data with the requested version: " << data.getName()[-2] << std::endl;
 
-    this->emitSignal(onDiscoverySuccess, data);
+    this->emitSignal(onDiscoverySuccess, data.getName().getPrefix(-1));
   }
   else {
     // data isn't a valid segment, add to the exclude list
-    m_strayExcludes.excludeOne(data.getName()[segmentIndex]);
+    m_strayExcludes.excludeOne(data.getName()[-1]);
     Interest newInterest(interest);
     newInterest.refreshNonce();
     newInterest.setExclude(m_strayExcludes);
diff --git a/tools/chunks/catchunks/discover-version-iterative.cpp b/tools/chunks/catchunks/discover-version-iterative.cpp
index fddf08e..adeb48e 100644
--- a/tools/chunks/catchunks/discover-version-iterative.cpp
+++ b/tools/chunks/catchunks/discover-version-iterative.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2016-2017, Regents of the University of California,
+ * Copyright (c) 2016-2019, Regents of the University of California,
  *                          Colorado State University,
  *                          University Pierre & Marie Curie, Sorbonne University.
  *
@@ -109,12 +109,28 @@
       std::cerr << "Found data with the latest version: " << m_latestVersion << std::endl;
 
     // we discovered at least one version. assume what we have is the latest.
-    this->emitSignal(onDiscoverySuccess, *m_latestVersionData);
+    this->emitSignal(onDiscoverySuccess, Name(interest.getName()).appendVersion(m_latestVersion));
   }
   else {
     DiscoverVersion::handleTimeout(interest, reason);
   }
 }
 
+void
+DiscoverVersionIterative::handleNack(const Interest& interest, const std::string& reason)
+{
+  if (m_foundVersion) {
+    // a version has been found and after a nack this version can be used as the latest.
+    if (isVerbose)
+      std::cerr << "Found data with the latest version: " << m_latestVersion << std::endl;
+
+    // we discovered at least one version. assume what we have is the latest.
+    this->emitSignal(onDiscoverySuccess, Name(interest.getName()).appendVersion(m_latestVersion));
+  }
+  else {
+    DiscoverVersion::handleNack(interest, reason);
+  }
+}
+
 } // namespace chunks
 } // namespace ndn
diff --git a/tools/chunks/catchunks/discover-version-iterative.hpp b/tools/chunks/catchunks/discover-version-iterative.hpp
index e76ff17..8880a6d 100644
--- a/tools/chunks/catchunks/discover-version-iterative.hpp
+++ b/tools/chunks/catchunks/discover-version-iterative.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2016-2017, Regents of the University of California,
+ * Copyright (c) 2016-2019, Regents of the University of California,
  *                          Colorado State University,
  *                          University Pierre & Marie Curie, Sorbonne University.
  *
@@ -95,6 +95,9 @@
   void
   handleTimeout(const Interest& interest, const std::string& reason) final;
 
+  void
+  handleNack(const Interest& interest, const std::string& reason) final;
+
 private:
   uint64_t m_latestVersion;
   shared_ptr<const Data> m_latestVersionData;
diff --git a/tools/chunks/catchunks/discover-version.cpp b/tools/chunks/catchunks/discover-version.cpp
index 78b7c41..3a4309c 100644
--- a/tools/chunks/catchunks/discover-version.cpp
+++ b/tools/chunks/catchunks/discover-version.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2016-2017, Regents of the University of California,
+ * Copyright (c) 2016-2019, Regents of the University of California,
  *                          Colorado State University,
  *                          University Pierre & Marie Curie, Sorbonne University.
  *
@@ -50,12 +50,6 @@
 }
 
 void
-DiscoverVersion::handleData(const Interest& interest, const Data& data)
-{
-  onDiscoverySuccess(data);
-}
-
-void
 DiscoverVersion::handleNack(const Interest& interest, const std::string& reason)
 {
   onDiscoveryFailure(reason);
diff --git a/tools/chunks/catchunks/discover-version.hpp b/tools/chunks/catchunks/discover-version.hpp
index 464b28e..d29f94a 100644
--- a/tools/chunks/catchunks/discover-version.hpp
+++ b/tools/chunks/catchunks/discover-version.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2016-2017, Regents of the University of California,
+ * Copyright (c) 2016-2019, Regents of the University of California,
  *                          Colorado State University,
  *                          University Pierre & Marie Curie, Sorbonne University.
  *
@@ -46,9 +46,9 @@
 {
 public: // signals
   /**
-   * @brief Signal emited when the first segment of a specific version is found.
+   * @brief Signal emitted when the versioned name of Data is found.
    */
-  signal::Signal<DiscoverVersion, const Data&> onDiscoverySuccess;
+  signal::Signal<DiscoverVersion, Name> onDiscoverySuccess;
 
   /**
    * @brief Signal emitted when a failure occurs.
@@ -78,7 +78,7 @@
   expressInterest(const Interest& interest, int maxRetriesNack, int maxRetriesTimeout);
 
   virtual void
-  handleData(const Interest& interest, const Data& data);
+  handleData(const Interest& interest, const Data& data) = 0;
 
   virtual void
   handleNack(const Interest& interest, const std::string& reason);
diff --git a/tools/chunks/catchunks/pipeline-interests.cpp b/tools/chunks/catchunks/pipeline-interests.cpp
index 2318378..a6c7c21 100644
--- a/tools/chunks/catchunks/pipeline-interests.cpp
+++ b/tools/chunks/catchunks/pipeline-interests.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2016-2018, Regents of the University of California,
+ * Copyright (c) 2016-2019, Regents of the University of California,
  *                          Colorado State University,
  *                          University Pierre & Marie Curie, Sorbonne University.
  *
@@ -40,7 +40,6 @@
   , m_nReceived(0)
   , m_receivedSize(0)
   , m_nextSegmentNo(0)
-  , m_excludedSegmentNo(0)
   , m_isStopping(false)
 {
 }
@@ -48,20 +47,13 @@
 PipelineInterests::~PipelineInterests() = default;
 
 void
-PipelineInterests::run(const Data& data, DataCallback dataCb, FailureCallback failureCb)
+PipelineInterests::run(const Name& versionedName, DataCallback dataCb, FailureCallback failureCb)
 {
+  BOOST_ASSERT(!versionedName.empty() && versionedName[-1].isVersion());
   BOOST_ASSERT(dataCb != nullptr);
+  m_prefix = versionedName;
   m_onData = std::move(dataCb);
   m_onFailure = std::move(failureCb);
-  m_prefix = data.getName().getPrefix(-1);
-  m_excludedSegmentNo = getSegmentFromPacket(data);
-
-  if (data.getFinalBlock()) {
-    m_lastSegmentNo = data.getFinalBlock()->toSegment();
-    m_hasFinalBlockId = true;
-  }
-
-  onData(data);
 
   // record the start time of the pipeline
   m_startTime = time::steady_clock::now();
@@ -82,17 +74,14 @@
 bool
 PipelineInterests::allSegmentsReceived() const
 {
-  BOOST_ASSERT(m_nReceived > 0);
-  return m_hasFinalBlockId && static_cast<uint64_t>(m_nReceived - 1) >= m_lastSegmentNo;
+  return m_nReceived > 0 &&
+         m_hasFinalBlockId &&
+         static_cast<uint64_t>(m_nReceived - 1) >= m_lastSegmentNo;
 }
 
 uint64_t
 PipelineInterests::getNextSegmentNo()
 {
-  // skip the excluded segment
-  if (m_nextSegmentNo == m_excludedSegmentNo)
-    m_nextSegmentNo++;
-
   return m_nextSegmentNo++;
 }
 
diff --git a/tools/chunks/catchunks/pipeline-interests.hpp b/tools/chunks/catchunks/pipeline-interests.hpp
index 20fec04..fc17392 100644
--- a/tools/chunks/catchunks/pipeline-interests.hpp
+++ b/tools/chunks/catchunks/pipeline-interests.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2016-2018, Regents of the University of California,
+ * Copyright (c) 2016-2019, Regents of the University of California,
  *                          Colorado State University,
  *                          University Pierre & Marie Curie, Sorbonne University.
  *
@@ -67,12 +67,12 @@
   /**
    * @brief start fetching all the segments of the specified prefix
    *
-   * @param data a segment of the segmented Data to fetch; the Data name must end with a segment number
+   * @param versionedName the name of the segmented Data ending with a version number
    * @param onData callback for every segment correctly received, must not be empty
    * @param onFailure callback if an error occurs, may be empty
    */
   void
-  run(const Data& data, DataCallback onData, FailureCallback onFailure);
+  run(const Name& versionedName, DataCallback onData, FailureCallback onFailure);
 
   /**
    * @brief stop all fetch operations
@@ -163,7 +163,6 @@
   DataCallback m_onData;
   FailureCallback m_onFailure;
   uint64_t m_nextSegmentNo;
-  uint64_t m_excludedSegmentNo;
   time::steady_clock::TimePoint m_startTime;
   bool m_isStopping;
 };
