diff --git a/tests/daemon/fw/ncc-strategy.t.cpp b/tests/daemon/fw/ncc-strategy.t.cpp
deleted file mode 100644
index 3c3f4d4..0000000
--- a/tests/daemon/fw/ncc-strategy.t.cpp
+++ /dev/null
@@ -1,410 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2014-2019,  Regents of the University of California,
- *                           Arizona Board of Regents,
- *                           Colorado State University,
- *                           University Pierre & Marie Curie, Sorbonne University,
- *                           Washington University in St. Louis,
- *                           Beijing Institute of Technology,
- *                           The University of Memphis.
- *
- * This file is part of NFD (Named Data Networking Forwarding Daemon).
- * See AUTHORS.md for complete list of NFD authors and contributors.
- *
- * NFD is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE.  See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * NFD, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "fw/ncc-strategy.hpp"
-
-#include "tests/daemon/face/dummy-face.hpp"
-#include "strategy-tester.hpp"
-#include "topology-tester.hpp"
-
-namespace nfd {
-namespace fw {
-namespace tests {
-
-using NccStrategyTester = StrategyTester<NccStrategy>;
-NFD_REGISTER_STRATEGY(NccStrategyTester);
-
-BOOST_AUTO_TEST_SUITE(Fw)
-BOOST_FIXTURE_TEST_SUITE(TestNccStrategy, GlobalIoTimeFixture)
-
-BOOST_AUTO_TEST_CASE(FavorRespondingUpstream)
-{
-  // NccStrategy is fairly complex.
-  // The most important property is: it remembers which upstream is the fastest to return Data,
-  // and favors this upstream in subsequent Interests.
-
-  LimitedIo limitedIo(this);
-  FaceTable faceTable;
-  Forwarder forwarder(faceTable);
-  NccStrategyTester& strategy = choose<NccStrategyTester>(forwarder);
-  strategy.afterAction.connect(bind(&LimitedIo::afterOp, &limitedIo));
-
-  shared_ptr<DummyFace> face1 = make_shared<DummyFace>();
-  shared_ptr<DummyFace> face2 = make_shared<DummyFace>();
-  shared_ptr<DummyFace> face3 = make_shared<DummyFace>();
-  faceTable.add(face1);
-  faceTable.add(face2);
-  faceTable.add(face3);
-
-  Fib& fib = forwarder.getFib();
-  fib::Entry& fibEntry = *fib.insert(Name()).first;
-  fib.addOrUpdateNextHop(fibEntry, *face1, 10);
-  fib.addOrUpdateNextHop(fibEntry, *face2, 20);
-
-  Pit& pit = forwarder.getPit();
-
-  // first Interest: strategy knows nothing and follows routing
-  shared_ptr<Interest> interest1p = makeInterest("ndn:/0Jm1ajrW/%00");
-  Interest& interest1 = *interest1p;
-  interest1.setInterestLifetime(8_s);
-  shared_ptr<pit::Entry> pitEntry1 = pit.insert(interest1).first;
-
-  pitEntry1->insertOrUpdateInRecord(*face3, interest1);
-  strategy.afterReceiveInterest(FaceEndpoint(*face3, 0), interest1, pitEntry1);
-
-  // forwards to face1 because routing says it's best
-  // (no io run here: afterReceiveInterest has already sent the Interest)
-  BOOST_REQUIRE_EQUAL(strategy.sendInterestHistory.size(), 1);
-  BOOST_CHECK_EQUAL(strategy.sendInterestHistory[0].outFaceId, face1->getId());
-
-  // forwards to face2 because face1 doesn't respond
-  limitedIo.run(1, 500_ms, 10_ms);
-  BOOST_REQUIRE_EQUAL(strategy.sendInterestHistory.size(), 2);
-  BOOST_CHECK_EQUAL(strategy.sendInterestHistory[1].outFaceId, face2->getId());
-
-  // face2 responds
-  shared_ptr<Data> data1p = makeData("ndn:/0Jm1ajrW/%00");
-  Data& data1 = *data1p;
-  strategy.beforeSatisfyInterest(pitEntry1, FaceEndpoint(*face2, 0), data1);
-  this->advanceClocks(10_ms, 500_ms);
-
-  // second Interest: strategy knows face2 is best
-  shared_ptr<Interest> interest2p = makeInterest("ndn:/0Jm1ajrW/%00%01");
-  Interest& interest2 = *interest2p;
-  interest2.setInterestLifetime(8_s);
-  shared_ptr<pit::Entry> pitEntry2 = pit.insert(interest2).first;
-
-  pitEntry2->insertOrUpdateInRecord(*face3, interest2);
-  strategy.afterReceiveInterest(FaceEndpoint(*face3, 0), interest2, pitEntry2);
-
-  // forwards to face2 because it responds previously
-  this->advanceClocks(1_ms);
-  BOOST_REQUIRE_GE(strategy.sendInterestHistory.size(), 3);
-  BOOST_CHECK_EQUAL(strategy.sendInterestHistory[2].outFaceId, face2->getId());
-}
-
-BOOST_AUTO_TEST_CASE(Bug1853)
-{
-  FaceTable faceTable;
-  Forwarder forwarder(faceTable);
-  NccStrategyTester& strategy = choose<NccStrategyTester>(forwarder);
-
-  shared_ptr<DummyFace> face1 = make_shared<DummyFace>();
-  shared_ptr<DummyFace> face2 = make_shared<DummyFace>();
-  shared_ptr<DummyFace> face3 = make_shared<DummyFace>();
-  faceTable.add(face1);
-  faceTable.add(face2);
-  faceTable.add(face3);
-
-  Fib& fib = forwarder.getFib();
-  fib::Entry& fibEntry = *fib.insert(Name()).first;
-  fib.addOrUpdateNextHop(fibEntry, *face1, 10);
-
-  Pit& pit = forwarder.getPit();
-
-  // first Interest: strategy follows routing and forwards to face1
-  shared_ptr<Interest> interest1 = makeInterest("ndn:/nztwIvHX/%00");
-  interest1->setInterestLifetime(8_s);
-  shared_ptr<pit::Entry> pitEntry1 = pit.insert(*interest1).first;
-
-  pitEntry1->insertOrUpdateInRecord(*face3, *interest1);
-  strategy.afterReceiveInterest(FaceEndpoint(*face3, 0), *interest1, pitEntry1);
-
-  this->advanceClocks(1_ms);
-  BOOST_REQUIRE_EQUAL(strategy.sendInterestHistory.size(), 1);
-  BOOST_CHECK_EQUAL(strategy.sendInterestHistory[0].outFaceId, face1->getId());
-
-  // face1 responds
-  shared_ptr<Data> data1 = makeData("ndn:/nztwIvHX/%00");
-  strategy.beforeSatisfyInterest(pitEntry1, FaceEndpoint(*face1, 0), *data1);
-  this->advanceClocks(10_ms, 500_ms);
-
-  // second Interest: bestFace is face1, nUpstreams becomes 0,
-  // therefore pitEntryInfo->maxInterval cannot be calculated from deferRange and nUpstreams
-  shared_ptr<Interest> interest2 = makeInterest("ndn:/nztwIvHX/%01");
-  interest2->setInterestLifetime(8_s);
-  shared_ptr<pit::Entry> pitEntry2 = pit.insert(*interest2).first;
-
-  pitEntry2->insertOrUpdateInRecord(*face3, *interest2);
-  strategy.afterReceiveInterest(FaceEndpoint(*face3, 0), *interest2, pitEntry2);
-
-  // FIB entry is changed before doPropagate executes
-  fib.addOrUpdateNextHop(fibEntry, *face2, 20);
-  this->advanceClocks(10_ms, 1_s);// should not crash
-}
-
-BOOST_AUTO_TEST_CASE(Bug1961)
-{
-  LimitedIo limitedIo(this);
-  FaceTable faceTable;
-  Forwarder forwarder(faceTable);
-  NccStrategyTester& strategy = choose<NccStrategyTester>(forwarder);
-  strategy.afterAction.connect(bind(&LimitedIo::afterOp, &limitedIo));
-
-  shared_ptr<DummyFace> face1 = make_shared<DummyFace>();
-  shared_ptr<DummyFace> face2 = make_shared<DummyFace>();
-  shared_ptr<DummyFace> face3 = make_shared<DummyFace>();
-  faceTable.add(face1);
-  faceTable.add(face2);
-  faceTable.add(face3);
-
-  Fib& fib = forwarder.getFib();
-  fib::Entry& fibEntry = *fib.insert(Name()).first;
-  fib.addOrUpdateNextHop(fibEntry, *face1, 10);
-  fib.addOrUpdateNextHop(fibEntry, *face2, 20);
-
-  Pit& pit = forwarder.getPit();
-
-  // first Interest: strategy forwards to face1 and face2
-  shared_ptr<Interest> interest1 = makeInterest("ndn:/seRMz5a6/%00");
-  interest1->setInterestLifetime(2_s);
-  shared_ptr<pit::Entry> pitEntry1 = pit.insert(*interest1).first;
-
-  pitEntry1->insertOrUpdateInRecord(*face3, *interest1);
-  strategy.afterReceiveInterest(FaceEndpoint(*face3, 0), *interest1, pitEntry1);
-  limitedIo.run(2 - strategy.sendInterestHistory.size(), 2_s, 10_ms);
-  BOOST_REQUIRE_EQUAL(strategy.sendInterestHistory.size(), 2);
-  BOOST_CHECK_EQUAL(strategy.sendInterestHistory[0].outFaceId, face1->getId());
-  BOOST_CHECK_EQUAL(strategy.sendInterestHistory[1].outFaceId, face2->getId());
-
-  // face1 responds
-  shared_ptr<Data> data1 = makeData("ndn:/seRMz5a6/%00");
-  strategy.beforeSatisfyInterest(pitEntry1, FaceEndpoint(*face1, 0), *data1);
-  pitEntry1->clearInRecords();
-  this->advanceClocks(10_ms);
-  // face2 also responds
-  strategy.beforeSatisfyInterest(pitEntry1, FaceEndpoint(*face2, 0), *data1);
-  this->advanceClocks(10_ms);
-
-  // second Interest: bestFace should be face 1
-  shared_ptr<Interest> interest2 = makeInterest("ndn:/seRMz5a6/%01");
-  interest2->setInterestLifetime(2_s);
-  shared_ptr<pit::Entry> pitEntry2 = pit.insert(*interest2).first;
-
-  pitEntry2->insertOrUpdateInRecord(*face3, *interest2);
-  strategy.afterReceiveInterest(FaceEndpoint(*face3, 0), *interest2, pitEntry2);
-  limitedIo.run(3 - strategy.sendInterestHistory.size(), 2_s, 10_ms);
-
-  BOOST_REQUIRE_GE(strategy.sendInterestHistory.size(), 3);
-  BOOST_CHECK_EQUAL(strategy.sendInterestHistory[2].outFaceId, face1->getId());
-}
-
-BOOST_AUTO_TEST_CASE(Bug1971)
-{
-  LimitedIo limitedIo(this);
-  FaceTable faceTable;
-  Forwarder forwarder(faceTable);
-  NccStrategyTester& strategy = choose<NccStrategyTester>(forwarder);
-  strategy.afterAction.connect(bind(&LimitedIo::afterOp, &limitedIo));
-
-  shared_ptr<DummyFace> face1 = make_shared<DummyFace>();
-  shared_ptr<DummyFace> face2 = make_shared<DummyFace>();
-  faceTable.add(face1);
-  faceTable.add(face2);
-
-  Fib& fib = forwarder.getFib();
-  fib::Entry& fibEntry = *fib.insert(Name()).first;
-  fib.addOrUpdateNextHop(fibEntry, *face2, 10);
-
-  Pit& pit = forwarder.getPit();
-
-  // first Interest: strategy forwards to face2
-  shared_ptr<Interest> interest1 = makeInterest("ndn:/M4mBXCsd");
-  interest1->setInterestLifetime(2_s);
-  shared_ptr<pit::Entry> pitEntry1 = pit.insert(*interest1).first;
-
-  pitEntry1->insertOrUpdateInRecord(*face1, *interest1);
-  strategy.afterReceiveInterest(FaceEndpoint(*face1, 0), *interest1, pitEntry1);
-  limitedIo.run(1 - strategy.sendInterestHistory.size(), 2_s, 10_ms);
-  BOOST_REQUIRE_EQUAL(strategy.sendInterestHistory.size(), 1);
-  BOOST_CHECK_EQUAL(strategy.sendInterestHistory[0].outFaceId, face2->getId());
-
-  // face2 responds
-  shared_ptr<Data> data1 = makeData("ndn:/M4mBXCsd");
-  data1->setFreshnessPeriod(5_ms);
-  strategy.beforeSatisfyInterest(pitEntry1, FaceEndpoint(*face2, 0), *data1);
-  pitEntry1->deleteOutRecord(*face2);
-  pitEntry1->clearInRecords();
-  this->advanceClocks(10_ms);
-
-  // similar Interest: strategy should still forward it
-  pitEntry1->insertOrUpdateInRecord(*face1, *interest1);
-  strategy.afterReceiveInterest(FaceEndpoint(*face1, 0), *interest1, pitEntry1);
-  limitedIo.run(2 - strategy.sendInterestHistory.size(), 2_s, 10_ms);
-  BOOST_REQUIRE_EQUAL(strategy.sendInterestHistory.size(), 2);
-  BOOST_CHECK_EQUAL(strategy.sendInterestHistory[1].outFaceId, face2->getId());
-}
-
-BOOST_AUTO_TEST_CASE(Bug1998)
-{
-  FaceTable faceTable;
-  Forwarder forwarder(faceTable);
-  NccStrategyTester& strategy = choose<NccStrategyTester>(forwarder);
-
-  shared_ptr<DummyFace> face1 = make_shared<DummyFace>();
-  shared_ptr<DummyFace> face2 = make_shared<DummyFace>();
-  faceTable.add(face1);
-  faceTable.add(face2);
-
-  Fib& fib = forwarder.getFib();
-  fib::Entry& fibEntry = *fib.insert(Name()).first;
-  fib.addOrUpdateNextHop(fibEntry, *face1, 10); // face1 is top-ranked nexthop
-  fib.addOrUpdateNextHop(fibEntry, *face2, 20);
-
-  Pit& pit = forwarder.getPit();
-
-  // Interest comes from face1, which is sole downstream
-  shared_ptr<Interest> interest1 = makeInterest("ndn:/tFy5HzUzD4");
-  shared_ptr<pit::Entry> pitEntry1 = pit.insert(*interest1).first;
-  pitEntry1->insertOrUpdateInRecord(*face1, *interest1);
-
-  strategy.afterReceiveInterest(FaceEndpoint(*face1, 0), *interest1, pitEntry1);
-
-  // Interest shall go to face2, not loop back to face1
-  BOOST_REQUIRE_EQUAL(strategy.sendInterestHistory.size(), 1);
-  BOOST_CHECK_EQUAL(strategy.sendInterestHistory[0].outFaceId, face2->getId());
-}
-
-BOOST_AUTO_TEST_CASE_EXPECTED_FAILURES(PredictionAdjustment, 1)
-BOOST_AUTO_TEST_CASE(PredictionAdjustment) // Bug 3411
-{
-  /*
-   * /----------\
-   * | consumer |
-   * \----------/
-   *     |
-   *     |
-   *   +---+  5ms  +---+
-   *   | A |-------| B |
-   *   +---+       +---+
-   *     |           |
-   *     | 5ms       | 15ms/5ms
-   *     |           |
-   *   +---+       +---+
-   *   | C |-------| D |
-   *   +---+ 15ms  +---+
-   *         /5ms    |
-   *                 |
-   *         /----------\
-   *         | producer |
-   *         \----------/
-   */
-
-  TopologyTester topo;
-  TopologyNode nodeA = topo.addForwarder("A"),
-               nodeB = topo.addForwarder("B"),
-               nodeC = topo.addForwarder("C"),
-               nodeD = topo.addForwarder("D");
-
-  for (TopologyNode node : {nodeA, nodeB, nodeC, nodeD}) {
-    topo.setStrategy<NccStrategy>(node);
-  }
-
-  shared_ptr<TopologyLink> linkAB = topo.addLink("AB", 5_ms, {nodeA, nodeB}),
-                           linkAC = topo.addLink("AC", 5_ms, {nodeA, nodeC}),
-                           linkBD = topo.addLink("BD", 15_ms, {nodeB, nodeD}),
-                           linkCD = topo.addLink("CD", 15_ms, {nodeC, nodeD});
-
-  topo.registerPrefix(nodeA, linkAB->getFace(nodeA), "ndn:/P");
-  topo.registerPrefix(nodeA, linkAC->getFace(nodeA), "ndn:/P");
-  topo.registerPrefix(nodeB, linkBD->getFace(nodeB), "ndn:/P");
-  topo.registerPrefix(nodeC, linkCD->getFace(nodeC), "ndn:/P");
-
-  shared_ptr<TopologyAppLink> producer = topo.addAppFace("producer", nodeD, "ndn:/P");
-  topo.addEchoProducer(producer->getClientFace());
-
-  shared_ptr<TopologyAppLink> consumer = topo.addAppFace("consumer", nodeA);
-  topo.addIntervalConsumer(consumer->getClientFace(), "ndn:/P",
-                           100_ms, 300);
-
-  auto getMeInfo = [&] () -> NccStrategy::MeasurementsEntryInfo* {
-    Measurements& measurements = topo.getForwarder(nodeA).getMeasurements();
-    measurements::Entry* me = measurements.findExactMatch("ndn:/P");
-    return me == nullptr ? nullptr : me->getStrategyInfo<NccStrategy::MeasurementsEntryInfo>();
-  };
-
-  // NccStrategy starts with an exploration period when the algorithm adjusts
-  // its prediction to converge near the path RTT.
-  bool isExplorationFinished = false;
-  const time::milliseconds TRUE_RTT1(40);
-  bool isLastPredictionUnder = true;
-  int nPredictionCrossings = 0;
-  for (int i = 0; i < 10000; ++i) {
-    this->advanceClocks(5_ms);
-    auto meInfo = getMeInfo();
-    if (meInfo == nullptr) {
-      continue;
-    }
-
-    if ((isLastPredictionUnder && meInfo->prediction > TRUE_RTT1) ||
-        (!isLastPredictionUnder && meInfo->prediction < TRUE_RTT1)) {
-      isLastPredictionUnder = !isLastPredictionUnder;
-      if (++nPredictionCrossings > 6) {
-        isExplorationFinished = true;
-        BOOST_TEST_MESSAGE("exploration finishes after " << (i * 5) << "ms");
-        break;
-      }
-    }
-  }
-  BOOST_REQUIRE_MESSAGE(isExplorationFinished, "exploration did not finish within 50s");
-
-  // NccStrategy has selected one path as the best.
-  // When we reduce the RTT of the other path, ideally it should be selected as the best face.
-  // However, this won't happen due to a weakness in NccStrategy.
-  // See  https://redmine.named-data.net/issues/3411#note-4
-  shared_ptr<Face> bestFace1 = getMeInfo()->bestFace.lock();
-  if (bestFace1.get() == &linkAB->getFace(nodeA)) {
-    linkCD->setDelay(5_ms);
-  }
-  else if (bestFace1.get() == &linkAC->getFace(nodeA)) {
-    linkBD->setDelay(5_ms);
-  }
-  else {
-    BOOST_FAIL("unexpected best face");
-  }
-
-  bool isNewBestChosen = false;
-  for (int i = 0; i < 10000; ++i) {
-    this->advanceClocks(5_ms);
-    auto meInfo = getMeInfo();
-    if (meInfo == nullptr) {
-      continue;
-    }
-
-    if (meInfo->bestFace.lock() != bestFace1) {
-      isNewBestChosen = true;
-      BOOST_TEST_MESSAGE("new best face is found after " << (i * 5) << "ms");
-      break;
-    }
-  }
-  BOOST_CHECK_MESSAGE(isNewBestChosen, "new best face is not found in 50000ms"); // expected failure
-}
-
-BOOST_AUTO_TEST_SUITE_END() // TestNccStrategy
-BOOST_AUTO_TEST_SUITE_END() // Fw
-
-} // namespace tests
-} // namespace fw
-} // namespace nfd
diff --git a/tests/daemon/fw/strategy-instantiation.t.cpp b/tests/daemon/fw/strategy-instantiation.t.cpp
index 4ea9bb3..cd057bc 100644
--- a/tests/daemon/fw/strategy-instantiation.t.cpp
+++ b/tests/daemon/fw/strategy-instantiation.t.cpp
@@ -33,19 +33,17 @@
 #include "fw/best-route-strategy.hpp"
 #include "fw/best-route-strategy2.hpp"
 #include "fw/multicast-strategy.hpp"
-#include "fw/ncc-strategy.hpp"
 #include "fw/self-learning-strategy.hpp"
 #include "fw/random-strategy.hpp"
 
 #include "tests/test-common.hpp"
+
 #include <boost/mpl/vector.hpp>
 
 namespace nfd {
 namespace fw {
 namespace tests {
 
-using namespace nfd::tests;
-
 BOOST_AUTO_TEST_SUITE(Fw)
 BOOST_AUTO_TEST_SUITE(TestStrategyInstantiation)
 
@@ -80,7 +78,6 @@
   Test<BestRouteStrategy, false, 1>,
   Test<BestRouteStrategy2, false, 5>,
   Test<MulticastStrategy, false, 4>,
-  Test<NccStrategy, false, 1>,
   Test<SelfLearningStrategy, false, 1>,
   Test<RandomStrategy, false, 1>
 >;
diff --git a/tests/daemon/fw/strategy-scope-control.t.cpp b/tests/daemon/fw/strategy-scope-control.t.cpp
index 123a4f8..a707a46 100644
--- a/tests/daemon/fw/strategy-scope-control.t.cpp
+++ b/tests/daemon/fw/strategy-scope-control.t.cpp
@@ -33,7 +33,6 @@
 #include "fw/best-route-strategy.hpp"
 #include "fw/best-route-strategy2.hpp"
 #include "fw/multicast-strategy.hpp"
-#include "fw/ncc-strategy.hpp"
 #include "fw/random-strategy.hpp"
 
 #include "tests/test-common.hpp"
@@ -41,7 +40,6 @@
 #include "choose-strategy.hpp"
 #include "strategy-tester.hpp"
 
-#include <boost/mpl/copy_if.hpp>
 #include <boost/mpl/vector.hpp>
 
 namespace nfd {
@@ -87,7 +85,7 @@
 BOOST_AUTO_TEST_SUITE(Fw)
 BOOST_AUTO_TEST_SUITE(TestStrategyScopeControl)
 
-template<typename S, bool WillSendNackNoRoute, bool CanProcessNack, bool WillRejectPitEntry = true>
+template<typename S, bool WillSendNackNoRoute, bool CanProcessNack, bool WillRejectPitEntry>
 class Test
 {
 public:
@@ -113,13 +111,12 @@
 };
 
 using Tests = boost::mpl::vector<
-  Test<AccessStrategy, false, false>,
-  Test<AsfStrategy, true, false>,
-  Test<BestRouteStrategy, false, false>,
-  Test<BestRouteStrategy2, true, true>,
+  Test<AccessStrategy, false, false, true>,
+  Test<AsfStrategy, true, false, true>,
+  Test<BestRouteStrategy, false, false, true>,
+  Test<BestRouteStrategy2, true, true, true>,
   Test<MulticastStrategy, false, false, false>,
-  Test<NccStrategy, false, false>,
-  Test<RandomStrategy, true, true>
+  Test<RandomStrategy, true, true, true>
 >;
 
 BOOST_FIXTURE_TEST_CASE_TEMPLATE(LocalhostInterestToLocal,
@@ -259,7 +256,7 @@
   this->fib.addOrUpdateNextHop(*fibEntry, *this->localFace4, 10);
   this->fib.addOrUpdateNextHop(*fibEntry, *this->nonLocalFace2, 20);
 
-  auto interest = makeInterest("/localhop/A/1", 1377);
+  auto interest = makeInterest("/localhop/A/1", false, nullopt, 1377);
   shared_ptr<pit::Entry> pitEntry = this->pit.insert(*interest).first;
   pitEntry->insertOrUpdateInRecord(*this->nonLocalFace1, *interest);
   lp::Nack nack = makeNack(*interest, lp::NackReason::NO_ROUTE);
