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')
 
