Upgrade the underlying NFD and ndn-cxx to version 0.6.0

Compilation is currently broken and is fixed in the following commit

Change-Id: Ic0dba06a9afd66a810172d4a512f35f6df6b25a2
Refs: #4306
diff --git a/NFD b/NFD
index 38111cd..9253fad 160000
--- a/NFD
+++ b/NFD
@@ -1 +1 @@
-Subproject commit 38111cde9bab698f6eaf1a9d430130c2cbb3eca4
+Subproject commit 9253fad76a7d90670d9822b7dca655e45c99b70e
diff --git a/README.md b/README.md
index 01c7a7c..883b7ae 100644
--- a/README.md
+++ b/README.md
@@ -12,12 +12,12 @@
 - ndnSIM uses implementation of basic NDN primitives from
   [ndn-cxx library (NDN C++ library with eXperimental eXtensions)](http://named-data.net/doc/ndn-cxx/)
 
-  Based on version `0.4.1`
+  Based on version `0.6.0`
 
 - All NDN forwarding and management is implemented directly using source code of
   [Named Data Networking Forwarding Daemon (NFD)](http://named-data.net/doc/NFD/)
 
-  Based on version `0.4.1-1-g704430c`
+  Based on version `0.6.0`
 
 - Allows [simulation of real applications](http://ndnsim.net/guide-to-simulate-real-apps.html)
   written against ndn-cxx library
diff --git a/bindings/modulegen__gcc_ILP32.py b/bindings/modulegen__gcc_ILP32.py
index e0df60e..6d139d2 100644
--- a/bindings/modulegen__gcc_ILP32.py
+++ b/bindings/modulegen__gcc_ILP32.py
@@ -159,7 +159,6 @@
     reg_GlobalRoutingHelper(root_module['ns3::ndn::GlobalRoutingHelper'])
 
     def reg_Name(root_module, cls):
-        cls.implicitly_converts_to(root_module['ns3::ndn::Interest'])
         cls.add_output_stream_operator()
         for op in ['==', '!=', '<', '<=', '>', '>=']:
             cls.add_binary_comparison_operator(op)
diff --git a/bindings/modulegen__gcc_LP64.py b/bindings/modulegen__gcc_LP64.py
index e0df60e..6d139d2 100644
--- a/bindings/modulegen__gcc_LP64.py
+++ b/bindings/modulegen__gcc_LP64.py
@@ -159,7 +159,6 @@
     reg_GlobalRoutingHelper(root_module['ns3::ndn::GlobalRoutingHelper'])
 
     def reg_Name(root_module, cls):
-        cls.implicitly_converts_to(root_module['ns3::ndn::Interest'])
         cls.add_output_stream_operator()
         for op in ['==', '!=', '<', '<=', '>', '>=']:
             cls.add_binary_comparison_operator(op)
diff --git a/examples/ndn-cxx-simple/real-app.hpp b/examples/ndn-cxx-simple/real-app.hpp
index 0aa2f38..b7b2a87 100644
--- a/examples/ndn-cxx-simple/real-app.hpp
+++ b/examples/ndn-cxx-simple/real-app.hpp
@@ -45,6 +45,7 @@
     m_scheduler.scheduleEvent(ndn::time::seconds(2), [this] {
         m_faceConsumer.expressInterest(ndn::Interest("/hello/world"),
                                        std::bind([] { std::cout << "Hello!" << std::endl; }),
+                                       std::bind([] { std::cout << "NACK!" << std::endl; }),
                                        std::bind([] { std::cout << "Bye!.." << std::endl; }));
       });
   }
diff --git a/examples/ndn-load-balancer/random-load-balancer-strategy.cpp b/examples/ndn-load-balancer/random-load-balancer-strategy.cpp
index ac4eff4..4f61162 100644
--- a/examples/ndn-load-balancer/random-load-balancer-strategy.cpp
+++ b/examples/ndn-load-balancer/random-load-balancer-strategy.cpp
@@ -36,12 +36,10 @@
 namespace nfd {
 namespace fw {
 
-const Name
-  RandomLoadBalancerStrategy::STRATEGY_NAME("ndn:/localhost/nfd/strategy/random-load-balancer");
-
 RandomLoadBalancerStrategy::RandomLoadBalancerStrategy(Forwarder& forwarder, const Name& name)
-  : Strategy(forwarder, name)
+  : Strategy(forwarder)
 {
+  this->setInstanceName(makeInstanceName(name, getStrategyName()));
 }
 
 RandomLoadBalancerStrategy::~RandomLoadBalancerStrategy()
@@ -97,5 +95,12 @@
   this->sendInterest(pitEntry, selected->getFace(), interest);
 }
 
+const Name&
+RandomLoadBalancerStrategy::getStrategyName()
+{
+  static Name strategyName("ndn:/localhost/nfd/strategy/random-load-balancer/%FD%01");
+  return strategyName;
+}
+
 } // namespace fw
 } // namespace nfd
diff --git a/examples/ndn-load-balancer/random-load-balancer-strategy.hpp b/examples/ndn-load-balancer/random-load-balancer-strategy.hpp
index 997bb56..ef11ae8 100644
--- a/examples/ndn-load-balancer/random-load-balancer-strategy.hpp
+++ b/examples/ndn-load-balancer/random-load-balancer-strategy.hpp
@@ -36,7 +36,7 @@
 
 class RandomLoadBalancerStrategy : public Strategy {
 public:
-  RandomLoadBalancerStrategy(Forwarder& forwarder, const Name& name = STRATEGY_NAME);
+  RandomLoadBalancerStrategy(Forwarder& forwarder, const Name& name = getStrategyName());
 
   virtual ~RandomLoadBalancerStrategy() override;
 
@@ -44,8 +44,8 @@
   afterReceiveInterest(const Face& inFace, const Interest& interest,
                        const shared_ptr<pit::Entry>& pitEntry) override;
 
-public:
-  static const Name STRATEGY_NAME;
+  static const Name&
+  getStrategyName();
 
 protected:
   boost::random::mt19937 m_randomGenerator;
diff --git a/examples/ndn-simple-for-nrt-helper/requester-app.cpp b/examples/ndn-simple-for-nrt-helper/requester-app.cpp
index 6eee63c..4a5d2ff 100644
--- a/examples/ndn-simple-for-nrt-helper/requester-app.cpp
+++ b/examples/ndn-simple-for-nrt-helper/requester-app.cpp
@@ -90,7 +90,7 @@
     auto interest = make_shared<Interest>(m_name);
     interest->setInterestLifetime(time::seconds(1));
     if (m_delegation.size() > 0) {
-      interest->setLink(m_link.wireEncode());
+      interest->setForwardingHint(m_link.getDelegationList());
     }
 
     NS_LOG_DEBUG("Sending an Interest for "<< *interest);
diff --git a/helper/ndn-fib-helper.hpp b/helper/ndn-fib-helper.hpp
index c231be9..381ee2d 100644
--- a/helper/ndn-fib-helper.hpp
+++ b/helper/ndn-fib-helper.hpp
@@ -26,7 +26,7 @@
 #include "ns3/object-vector.h"
 #include "ns3/pointer.h"
 
-#include <ndn-cxx/management/nfd-control-parameters.hpp>
+#include <ndn-cxx/mgmt/nfd/control-parameters.hpp>
 
 namespace ns3 {
 namespace ndn {
diff --git a/helper/ndn-strategy-choice-helper.hpp b/helper/ndn-strategy-choice-helper.hpp
index 302682a..39f9b87 100644
--- a/helper/ndn-strategy-choice-helper.hpp
+++ b/helper/ndn-strategy-choice-helper.hpp
@@ -116,14 +116,11 @@
   NS_ASSERT(l3Protocol != nullptr);
   NS_ASSERT(l3Protocol->getForwarder() != nullptr);
 
-  nfd::Forwarder& forwarder = *l3Protocol->getForwarder();
-  nfd::StrategyChoice& strategyChoice = forwarder.getStrategyChoice();
-
-  if (!strategyChoice.hasStrategy(Strategy::STRATEGY_NAME)) {
-    strategyChoice.install(make_unique<Strategy>(ref(forwarder)));
+  if (!Strategy::canCreate(Strategy::getStrategyName())) {
+    Strategy::template registerType<Strategy>();
   }
 
-  Install(node, namePrefix, Strategy::STRATEGY_NAME);
+  Install(node, namePrefix, Strategy::getStrategyName());
 }
 
 template<class Strategy>
diff --git a/model/ndn-common.hpp b/model/ndn-common.hpp
index 7397de3..a678f5d 100644
--- a/model/ndn-common.hpp
+++ b/model/ndn-common.hpp
@@ -70,7 +70,7 @@
 using ::ndn::KeyChain;
 
 using ::nfd::Face;
-using ::ndn::util::FaceUri;
+using ::ndn::FaceUri;
 
 #ifndef DOXYGEN
 // For python bindings
diff --git a/model/ndn-l3-protocol.cpp b/model/ndn-l3-protocol.cpp
index 74f18ca..83081b5 100644
--- a/model/ndn-l3-protocol.cpp
+++ b/model/ndn-l3-protocol.cpp
@@ -184,6 +184,8 @@
   std::shared_ptr<nfd::ForwarderStatusManager> m_forwarderStatusManager;
   std::shared_ptr<nfd::rib::RibManager> m_ribManager;
 
+  std::shared_ptr<nfd::face::FaceSystem> m_faceSystem;
+
   nfd::ConfigSection m_config;
 
   Ptr<ContentStore> m_csFromNdnSim;
@@ -210,7 +212,6 @@
 
   nfd::FaceTable& faceTable = m_impl->m_forwarder->getFaceTable();
   faceTable.addReserved(nfd::face::makeNullFace(), nfd::face::FACEID_NULL);
-  faceTable.addReserved(nfd::face::makeNullFace(FaceUri("contentstore://")), nfd::face::FACEID_CONTENT_STORE);
 
   if (!this->getConfig().get<bool>("ndnSIM.disable_rib_manager", false)) {
     Simulator::ScheduleWithContext(m_node->GetId(), Seconds(0), &L3Protocol::initializeRibManager, this);
@@ -259,6 +260,8 @@
   auto& forwarder = m_impl->m_forwarder;
   using namespace nfd;
 
+  m_impl->m_faceSystem = make_shared<nfd::face::FaceSystem>(forwarder->getFaceTable(), nullptr);
+
   std::tie(m_impl->m_internalFace, m_impl->m_internalClientFace) = face::makeInternalFace(StackHelper::getKeyChain());
   forwarder->getFaceTable().addReserved(m_impl->m_internalFace, face::FACEID_INTERNAL_FACE);
   m_impl->m_dispatcher.reset(new ::ndn::mgmt::Dispatcher(*m_impl->m_internalClientFace, StackHelper::getKeyChain()));
@@ -271,8 +274,9 @@
                                             *m_impl->m_authenticator));
 
   // Cannot be disabled for now
-  // if (!this->getConfig().get<bool>("ndnSIM.disable_face_manager", false)) {
-  m_impl->m_faceManager.reset(new FaceManager(forwarder->getFaceTable(),
+  // if (!this->getConfig().get<bool>("ndnSIM.disable_face_manager", false))
+
+  m_impl->m_faceManager.reset(new FaceManager(*m_impl->m_faceSystem,
                                               *m_impl->m_dispatcher,
                                               *m_impl->m_authenticator));
   // }
diff --git a/model/ndn-net-device-transport.cpp b/model/ndn-net-device-transport.cpp
index 85684af..2d946c8 100644
--- a/model/ndn-net-device-transport.cpp
+++ b/model/ndn-net-device-transport.cpp
@@ -65,14 +65,6 @@
 }
 
 void
-NetDeviceTransport::beforeChangePersistency(::ndn::nfd::FacePersistency newPersistency)
-{
-  NS_LOG_FUNCTION(this << "Changing persistency for netDevice with URI"
-                  << this->getLocalUri() << "currently does nothing");
-  // do nothing for now
-}
-
-void
 NetDeviceTransport::doClose()
 {
   NS_LOG_FUNCTION(this << "Closing transport for netDevice with URI"
diff --git a/model/ndn-net-device-transport.hpp b/model/ndn-net-device-transport.hpp
index b502d4f..09a08ed 100644
--- a/model/ndn-net-device-transport.hpp
+++ b/model/ndn-net-device-transport.hpp
@@ -56,9 +56,6 @@
 
 private:
   virtual void
-  beforeChangePersistency(::ndn::nfd::FacePersistency newPersistency) override;
-
-  virtual void
   doClose() override;
 
   virtual void
diff --git a/ndn-cxx b/ndn-cxx
index 4692ba8..0d8a562 160000
--- a/ndn-cxx
+++ b/ndn-cxx
@@ -1 +1 @@
-Subproject commit 4692ba80cf1dcf07acbbaba8a134ea22481dd457
+Subproject commit 0d8a5627859e6c5bef4d1c05d4a7a934770fdc0b
diff --git a/tests/unit-tests/helper/ndn-network-region-table-helper.t.cpp b/tests/unit-tests/helper/ndn-network-region-table-helper.t.cpp
index c683ae4..41f2057 100644
--- a/tests/unit-tests/helper/ndn-network-region-table-helper.t.cpp
+++ b/tests/unit-tests/helper/ndn-network-region-table-helper.t.cpp
@@ -19,12 +19,16 @@
 
 #include "helper/ndn-network-region-table-helper.hpp"
 #include "helper/ndn-app-helper.hpp"
+#include <ndn-cxx/link.hpp>
 
 #include "../tests-common.hpp"
 
 namespace ns3 {
 namespace ndn {
 
+using ::ndn::Delegation;
+using ::ndn::DelegationList;
+
 BOOST_AUTO_TEST_SUITE(HelperNdnNetworkRegionTableHelper)
 
 class BasicFixture : public ScenarioHelperWithCleanupFixture
@@ -91,13 +95,14 @@
   ::ndn::Face m_face;
 };
 
-Block
-makeLink(const Name& delegation)
+DelegationList
+makeHint(const Name& delegation)
 {
-  ::ndn::Link link("/LINK");
-  link.addDelegation(1, delegation);
-  ndn::StackHelper::getKeyChain().sign(link, ::ndn::security::SigningInfo(::ndn::security::SigningInfo::SIGNER_TYPE_SHA256));
-  return link.wireEncode();
+  Delegation del;
+  del.name = Name(delegation);
+  del.preference = 1;
+  DelegationList list({del});
+  return list;
 }
 
 class MultiNodeWithAppFixture : public ScenarioHelperWithCleanupFixture
@@ -136,10 +141,10 @@
                              ++fixture->m_nData;
                            }),
                          std::bind([fixture] {
-                             ++fixture->m_nTimeouts;
+                             ++fixture->m_nNacks;
                            }),
                          std::bind([fixture] {
-                             ++fixture->m_nNacks;
+                             ++fixture->m_nTimeouts;
                            }));
 }
 
@@ -150,7 +155,7 @@
 {
   FactoryCallbackApp::Install(getNode("1"), [this] () -> shared_ptr<void> {
       Interest i("/prefix/someData");
-      i.setLink(makeLink("/otherPrefix"));
+      i.setForwardingHint(makeHint(Name("/otherPrefix")));
       return make_shared<TesterApp>(i, this);
     })
     .Start(Seconds(0.01));
@@ -169,7 +174,7 @@
 
   FactoryCallbackApp::Install(getNode("1"), [this] () -> shared_ptr<void> {
       Interest i("/prefix/someData");
-      i.setLink(makeLink("/otherPrefix"));
+      i.setForwardingHint(makeHint(Name("/otherPrefix")));
       return make_shared<TesterApp>(i, this);
     })
     .Start(Seconds(0.01));
@@ -188,7 +193,7 @@
 
   FactoryCallbackApp::Install(getNode("1"), [this] () -> shared_ptr<void> {
       Interest i("/prefix/someData");
-      i.setLink(makeLink("/otherPrefix"));
+      i.setForwardingHint(makeHint(Name("/otherPrefix")));
       return make_shared<TesterApp>(i, this);
     })
     .Start(Seconds(0.01));
@@ -207,7 +212,7 @@
 
   FactoryCallbackApp::Install(getNode("1"), [this] () -> shared_ptr<void> {
       Interest i("/prefix/someData");
-      i.setLink(makeLink("/otherPrefix/moreSpecific"));
+      i.setForwardingHint(makeHint(Name("/otherPrefix/moreSpecific")));
       return make_shared<TesterApp>(i, this);
     })
     .Start(Seconds(0.01));
diff --git a/tests/unit-tests/helper/ndn-strategy-choice-helper.t.cpp b/tests/unit-tests/helper/ndn-strategy-choice-helper.t.cpp
index d8f9f4e..e06a93d 100644
--- a/tests/unit-tests/helper/ndn-strategy-choice-helper.t.cpp
+++ b/tests/unit-tests/helper/ndn-strategy-choice-helper.t.cpp
@@ -143,9 +143,10 @@
 
 class NullStrategy : public nfd::fw::Strategy {
 public:
-  NullStrategy(nfd::Forwarder& forwarder)
-    : Strategy(forwarder, STRATEGY_NAME)
+  NullStrategy(nfd::Forwarder& forwarder, const Name& name = getStrategyName())
+    : Strategy(forwarder)
   {
+    this->setInstanceName(name);
   }
 
   virtual void
@@ -156,11 +157,13 @@
   }
 
 public:
-  static const Name STRATEGY_NAME;
+  static const Name& getStrategyName()
+  {
+    static Name strategyName("ndn:/localhost/nfd/strategy/unit-tests/null-strategy/%FD%00");
+    return strategyName;
+  }
 };
 
-const Name NullStrategy::STRATEGY_NAME = "ndn:/localhost/nfd/strategy/unit-tests/null-strategy";
-
 // template<class Strategy>
 // static void
 // Install(Ptr<Node> node, const Name& namePrefix);
diff --git a/tests/unit-tests/model/ndn-block-header.t.cpp b/tests/unit-tests/model/ndn-block-header.t.cpp
index 2027d41..a8e10a9 100644
--- a/tests/unit-tests/model/ndn-block-header.t.cpp
+++ b/tests/unit-tests/model/ndn-block-header.t.cpp
@@ -76,7 +76,7 @@
   nfd::face::Transport::Packet packet(lpPacket.wireEncode());
   BlockHeader header(packet);
 
-  BOOST_CHECK_EQUAL(header.GetSerializedSize(), 1369);
+  BOOST_CHECK_EQUAL(header.GetSerializedSize(), 1350);
 
   {
     Ptr<Packet> packet = Create<Packet>();
diff --git a/tests/unit-tests/model/ndn-l3-protocol.t.cpp b/tests/unit-tests/model/ndn-l3-protocol.t.cpp
index b2d77ca..b8e51b8 100644
--- a/tests/unit-tests/model/ndn-l3-protocol.t.cpp
+++ b/tests/unit-tests/model/ndn-l3-protocol.t.cpp
@@ -61,10 +61,12 @@
     FactoryCallbackApp::Install(getNode("1"), [this] () -> shared_ptr<void> {
         return make_shared<TesterApp>([this] (::ndn::Face& face) {
             for (const Name& dataset : requestedDatasets) {
-              face.expressInterest(dataset, [&] (const Interest& i, Data& data) {
+              Interest i(dataset);
+              face.expressInterest(i, [&] (const Interest& i, const Data& data) {
                   BOOST_TEST_MESSAGE(data.getName());
                   receivedDatasets.insert(data.getName().getPrefix(-2));
                 },
+                std::bind([]{}),
                 std::bind([]{}));
             }
           });
diff --git a/tests/unit-tests/ndn-cxx/face.t.cpp b/tests/unit-tests/ndn-cxx/face.t.cpp
index 324043d..67f3333 100644
--- a/tests/unit-tests/ndn-cxx/face.t.cpp
+++ b/tests/unit-tests/ndn-cxx/face.t.cpp
@@ -109,11 +109,13 @@
 class SingleInterest : public BaseTesterApp
 {
 public:
-  SingleInterest(const Name& name, const std::function<void(const Data&)>& onData, const VoidCallback& onTimeout)
+  SingleInterest(const Name& name, const std::function<void(const Data&)>& onData,
+                 const VoidCallback& onNack, const VoidCallback& onTimeout)
   {
-    m_face.expressInterest(name, std::bind([onData] (const Data& data) {
+    m_face.expressInterest(Interest(name), std::bind([onData] (const Data& data) {
           onData(data);
         }, _2),
+      std::bind(onNack),
       std::bind(onTimeout));
   }
 };
@@ -128,6 +130,9 @@
           BOOST_CHECK_LE(Simulator::Now().ToDouble(Time::S), 1.01);
         },
         [] {
+          BOOST_ERROR("Unexpected NACK");
+        },
+        [] {
           BOOST_ERROR("Unexpected timeout");
         });
     })
@@ -153,6 +158,9 @@
           BOOST_CHECK_LE(Simulator::Now().ToDouble(Time::S), 2.0);
         },
         [] {
+          BOOST_ERROR("Unexpected NACK");
+        },
+        [] {
           BOOST_ERROR("Unexpected timeout");
         });
     })
@@ -167,9 +175,12 @@
 BOOST_AUTO_TEST_CASE(ExpressInterestTimeout)
 {
   FactoryCallbackApp::Install(getNode("A"), [this] () -> shared_ptr<void> {
-      return make_shared<SingleInterest>("/test/prefix", [] (const Data&) {
+      return make_shared<SingleInterest>(Name("/test/prefix"), [] (const Data&) {
           BOOST_ERROR("Unexpected data");
         },
+        [] {
+          BOOST_ERROR("Unexpected NACK");
+        },
         [this] {
           BOOST_CHECK_GT(Simulator::Now().ToDouble(Time::S), 6.0);
           this->hasFired = true;
@@ -188,31 +199,6 @@
   BOOST_CHECK(hasFired);
 }
 
-// Expected failure until issue #3121 is resolved
-BOOST_AUTO_TEST_CASE_EXPECTED_FAILURES(ExpressInterestWithRib, 2);
-BOOST_AUTO_TEST_CASE(ExpressInterestWithRib)
-{
-  addApps({{"A", "ns3::ndn::Producer", {{"Prefix", "/"}}, "0s", "100s"}});
-
-  // Retrieve data from remote
-  FactoryCallbackApp::Install(getNode("A"), [this] () -> shared_ptr<void> {
-      return make_shared<SingleInterest>("/test/prefix", [this] (const Data& data) {
-          BOOST_CHECK_EQUAL(data.getName(), "/test/prefix");
-          this->hasFired = true;
-          BOOST_CHECK_LE(Simulator::Now().ToDouble(Time::S), 2.0);
-        },
-        [] {
-          BOOST_ERROR("Unexpected timeout");
-        });
-    })
-    .Start(Seconds(1.01));
-
-  Simulator::Stop(Seconds(20));
-  Simulator::Run();
-
-  BOOST_CHECK(hasFired);
-}
-
 /////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////
@@ -220,24 +206,27 @@
 class MultipleInterest : public BaseTesterApp
 {
 public:
-  MultipleInterest(const Name& name, const NameCallback& onData, const VoidCallback& onTimeout)
+  MultipleInterest(const Name& name, const NameCallback& onData, const VoidCallback& onTimeout,
+                   const VoidCallback& onNack)
     : m_scheduler(m_face.getIoService())
     , m_event(m_scheduler)
   {
-    expressNextInterest(name, 0, onData, onTimeout);
+    expressNextInterest(name, 0, onData, onTimeout, onNack);
   }
 
 private:
   void
-  expressNextInterest(const Name& name, uint32_t seqNo, const NameCallback& onData, const VoidCallback& onTimeout)
+  expressNextInterest(const Name& name, uint32_t seqNo, const NameCallback& onData,
+                      const VoidCallback& onTimeout, const VoidCallback& onNack)
   {
-    m_face.expressInterest(Name(name).appendSegment(seqNo), std::bind([=] (const Data& data) {
+    m_face.expressInterest(Interest(Name(name).appendSegment(seqNo)), std::bind([=] (const Data& data) {
           onData(data.getName());
 
           m_event = m_scheduler.scheduleEvent(time::seconds(1),
                                               std::bind(&MultipleInterest::expressNextInterest, this,
-                                                        name, seqNo + 1, onData, onTimeout));
+                                                        name, seqNo + 1, onData, onTimeout, onNack));
         }, _2),
+      std::bind(onNack),
       std::bind(onTimeout));
   }
 
@@ -260,6 +249,9 @@
         },
         [] {
           BOOST_ERROR("Unexpected timeout");
+        },
+        [] {
+          BOOST_ERROR("Unexpected NACK");
         });
     })
     .Start(Seconds(1.01));
@@ -275,12 +267,15 @@
 public:
   SingleInterestWithFaceShutdown()
   {
-    m_face.expressInterest(Name("/interest/to/timeout"),
+    m_face.expressInterest(Interest(Name("/interest/to/timeout")),
                            std::bind([] {
                                BOOST_ERROR("Unexpected response");
                              }),
                            std::bind([this] {
                                m_face.shutdown();
+                             }),
+                           std::bind([this] {
+                               m_face.shutdown();
                              }));
   }
 };
@@ -288,7 +283,6 @@
 BOOST_AUTO_TEST_CASE(FaceShutdownFromTimeoutCallback)
 {
   // This test case to check if Face.shutdown from an onTimeout callback doesn't cause segfaults
-
   FactoryCallbackApp::Install(getNode("A"), [this] () -> shared_ptr<void> {
       return make_shared<SingleInterestWithFaceShutdown>();
     })
diff --git a/tests/unit-tests/utils/tracers/ndn-app-delay-tracer.t.cpp b/tests/unit-tests/utils/tracers/ndn-app-delay-tracer.t.cpp
index 0f24b80..9336fd8 100644
--- a/tests/unit-tests/utils/tracers/ndn-app-delay-tracer.t.cpp
+++ b/tests/unit-tests/utils/tracers/ndn-app-delay-tracer.t.cpp
@@ -89,12 +89,12 @@
 
   BOOST_CHECK_EQUAL(buffer.str(),
     "Time	Node	AppId	SeqNo	Type	DelayS	DelayUS	RetxCount	HopCount\n"
-    "0.0417712	1	0	0	LastDelay	0.0417712	41771.2	1	2\n"
-    "0.0417712	1	0	0	FullDelay	0.0417712	41771.2	1	2\n"
+    "0.0417664	1	0	0	LastDelay	0.0417664	41766.4	1	2\n"
+    "0.0417664	1	0	0	FullDelay	0.0417664	41766.4	1	2\n"
     "2	2	0	0	LastDelay	0	0	1	0\n"
     "2	2	0	0	FullDelay	0	0	1	0\n"
-    "3.02089	2	0	1	LastDelay	0.0208856	20885.6	1	1\n"
-    "3.02089	2	0	1	FullDelay	0.0208856	20885.6	1	1\n");
+    "3.02088	2	0	1	LastDelay	0.0208832	20883.2	1	1\n"
+    "3.02088	2	0	1	FullDelay	0.0208832	20883.2	1	1\n");
 }
 
 BOOST_AUTO_TEST_CASE(InstallNodeContainer)
@@ -115,8 +115,8 @@
 
   BOOST_CHECK_EQUAL(buffer.str(),
     "Time	Node	AppId	SeqNo	Type	DelayS	DelayUS	RetxCount	HopCount\n"
-    "0.0417712	1	0	0	LastDelay	0.0417712	41771.2	1	2\n"
-    "0.0417712	1	0	0	FullDelay	0.0417712	41771.2	1	2\n");
+    "0.0417664	1	0	0	LastDelay	0.0417664	41766.4	1	2\n"
+    "0.0417664	1	0	0	FullDelay	0.0417664	41766.4	1	2\n");
 }
 
 BOOST_AUTO_TEST_CASE(InstallNode)
@@ -136,8 +136,8 @@
     "Time	Node	AppId	SeqNo	Type	DelayS	DelayUS	RetxCount	HopCount\n"
     "2	2	0	0	LastDelay	0	0	1	0\n"
     "2	2	0	0	FullDelay	0	0	1	0\n"
-    "3.02089	2	0	1	LastDelay	0.0208856	20885.6	1	1\n"
-    "3.02089	2	0	1	FullDelay	0.0208856	20885.6	1	1\n");
+    "3.02088	2	0	1	LastDelay	0.0208832	20883.2	1	1\n"
+    "3.02088	2	0	1	FullDelay	0.0208832	20883.2	1	1\n");
 }
 
 BOOST_AUTO_TEST_CASE(InstallNodeDumpStream)
@@ -153,8 +153,8 @@
   BOOST_CHECK(output->is_equal(
     "2	2	0	0	LastDelay	0	0	1	0\n"
     "2	2	0	0	FullDelay	0	0	1	0\n"
-    "3.02089	2	0	1	LastDelay	0.0208856	20885.6	1	1\n"
-    "3.02089	2	0	1	FullDelay	0.0208856	20885.6	1	1\n"));
+    "3.02088	2	0	1	LastDelay	0.0208832	20883.2	1	1\n"
+    "3.02088	2	0	1	FullDelay	0.0208832	20883.2	1	1\n"));
 }
 
 BOOST_AUTO_TEST_SUITE_END()
diff --git a/utils/batches.cpp b/utils/batches.cpp
index b8a9e69..354d4cd 100644
--- a/utils/batches.cpp
+++ b/utils/batches.cpp
@@ -47,7 +47,6 @@
     // std::cout << time << ", " << amount << ". \n";
   }
 
-  is.clear();
   return is;
 }
 }
diff --git a/utils/tracers/ndn-l3-tracer.hpp b/utils/tracers/ndn-l3-tracer.hpp
index 15dd41f..6b0fafe 100644
--- a/utils/tracers/ndn-l3-tracer.hpp
+++ b/utils/tracers/ndn-l3-tracer.hpp
@@ -21,16 +21,11 @@
 #define NDN_L3_TRACER_H
 
 #include "ns3/ndnSIM/model/ndn-common.hpp"
+#include "ns3/ndnSIM/NFD/daemon/table/pit-entry.hpp"
 
 #include "ns3/ptr.h"
 #include "ns3/simple-ref-count.h"
 
-namespace nfd {
-namespace pit {
-class Entry;
-} // namespace pit
-} // namespace nfd
-
 namespace ns3 {
 
 class Node;
diff --git a/wscript b/wscript
index 210b79c..1a1dd5d 100644
--- a/wscript
+++ b/wscript
@@ -15,11 +15,11 @@
 
 def options(opt):
     opt.load(['version'], tooldir=['%s/.waf-tools' % opt.path.abspath()])
-    opt.load(['doxygen', 'sphinx_build', 'type_traits', 'compiler-features', 'cryptopp', 'sqlite3', 'openssl'],
+    opt.load(['doxygen', 'sphinx_build', 'type_traits', 'compiler-features', 'sqlite3', 'openssl'],
              tooldir=['%s/ndn-cxx/.waf-tools' % opt.path.abspath()])
 
 def configure(conf):
-    conf.load(['doxygen', 'sphinx_build', 'type_traits', 'compiler-features', 'version', 'cryptopp', 'sqlite3', 'openssl'])
+    conf.load(['doxygen', 'sphinx_build', 'type_traits', 'compiler-features', 'version', 'sqlite3', 'openssl'])
 
     conf.env['ENABLE_NDNSIM']=False
 
@@ -32,13 +32,12 @@
 
     conf.check_cxx(lib='pthread', uselib_store='PTHREAD', define_name='HAVE_PTHREAD', mandatory=False)
     conf.check_sqlite3(mandatory=True)
-    conf.check_cryptopp(mandatory=True, use='PTHREAD')
     conf.check_openssl(mandatory=True, use='OPENSSL', atleast_version=0x10001000)
 
     if not conf.env['LIB_BOOST']:
         conf.report_optional_feature("ndnSIM", "ndnSIM", False,
                                      "Required boost libraries not found")
-        Logs.error ("ndnSIM will not be build as it requires boost libraries of version at least 1.54.0")
+        Logs.error ("ndnSIM will not be built as it requires boost libraries of version at least 1.54.0")
         conf.env['MODULES_NOT_BUILT'].append('ndnSIM')
         return
     else:
@@ -108,14 +107,17 @@
         deps += ['point-to-point-layout', 'csma', 'applications', 'wifi']
 
     ndnCxxSrc = bld.path.ant_glob('ndn-cxx/src/**/*.cpp',
-                                  excl=['ndn-cxx/src/**/*-osx.cpp',
-                                        'ndn-cxx/src/util/dummy-client-face.cpp'])
+                                  excl=['ndn-cxx/src/net/detail/*.cpp',
+                                        'ndn-cxx/src/net/network-monitor*.cpp',
+                                        'ndn-cxx/src/util/dummy-client-face.cpp',
+                                        'ndn-cxx/src/security/tpm/*osx.cpp',
+                                        'ndn-cxx/src/net/network-interface.cpp'])
 
     nfdSrc = bld.path.ant_glob(['%s/**/*.cpp' % dir for dir in ['NFD/core', 'NFD/daemon', 'NFD/rib']],
                                excl=['NFD/daemon/main.cpp',
                                      'NFD/daemon/nfd.cpp',
-                                     'NFD/daemon/face/ethernet*',
-                                     'NFD/daemon/face/multicast-udp*',
+                                     'NFD/daemon/face/*ethernet*',
+                                     'NFD/daemon/face/*pcap*.cpp',
                                      'NFD/daemon/face/tcp*',
                                      'NFD/daemon/face/*udp*',
                                      'NFD/daemon/face/unix-stream*',
@@ -125,7 +127,7 @@
     module = bld.create_ns3_module('ndnSIM', deps)
     module.module = 'ndnSIM'
     module.features += ' ns3fullmoduleheaders ndncxxheaders'
-    module.use += ['version-ndn-cxx', 'version-NFD', 'BOOST', 'CRYPTOPP', 'SQLITE3', 'RT', 'PTHREAD', 'OPENSSL']
+    module.use += ['version-ndn-cxx', 'version-NFD', 'BOOST', 'SQLITE3', 'RT', 'PTHREAD', 'OPENSSL']
     module.includes = ['../..', '../../ns3/ndnSIM/NFD', './NFD/core', './NFD/daemon', './NFD/rib', '../../ns3/ndnSIM', '../../ns3/ndnSIM/ndn-cxx']
     module.export_includes = ['../../ns3/ndnSIM/NFD', './NFD/core', './NFD/daemon', './NFD/rib', '../../ns3/ndnSIM']
 
@@ -148,6 +150,7 @@
 
     module.ndncxx_headers = bld.path.ant_glob(['ndn-cxx/src/**/*.hpp'],
                                               excl=['src/**/*-osx.hpp', 'src/detail/**/*'])
+
     if bld.env.ENABLE_EXAMPLES:
         bld.recurse('examples')