diff --git a/.gitmodules b/.gitmodules
index e250871..8b3ca32 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,8 +1,8 @@
 [submodule "NFD"]
 	path = NFD
 	url = https://github.com/named-data-ndnSIM/NFD
-	branch = NFD-0.6.5-ndnSIM
+branch = NFD-0.7.0-ndnSIM
 [submodule "ndn-cxx"]
 	path = ndn-cxx
 	url = https://github.com/named-data-ndnSIM/ndn-cxx
-	branch = ndn-cxx-0.6.5-ndnSIM
+	branch = ndn-cxx-0.7.0-ndnSIM
diff --git a/bindings/modulegen__gcc_ILP32.py b/bindings/modulegen__gcc_ILP32.py
index 791a3bc..6814816 100644
--- a/bindings/modulegen__gcc_ILP32.py
+++ b/bindings/modulegen__gcc_ILP32.py
@@ -202,6 +202,7 @@
     def register_L3Protocol(cls):
         cls.add_method('getL3Protocol', 'ns3::Ptr<ns3::ndn::L3Protocol>', [param('ns3::Ptr<ns3::Object>', 'node')], is_static=True)
         cls.add_method('getForwarder', 'std::shared_ptr<ns3::ndn::nfd::Forwarder>', [])
+        cls.add_method('getFaceTable', retval('const ns3::ndn::nfd::FaceTable&', caller_manages_return=False), [], is_const=True)
     register_L3Protocol(root_module['ns3::ndn::L3Protocol'])
 
     # shared_ptr<Face>
@@ -220,7 +221,6 @@
         cls.add_method('getFib', retval('const ns3::ndn::nfd::Fib&', caller_manages_return=False), [], is_const=True)
         cls.add_method('getPit', retval('const ns3::ndn::nfd::Pit&', caller_manages_return=False), [], is_const=True)
         cls.add_method('getCs', retval('const ns3::ndn::nfd::Cs&', caller_manages_return=False), [], is_const=True)
-        cls.add_method('getFaceTable', retval('const ns3::ndn::nfd::FaceTable&', caller_manages_return=False), [], is_const=True)
     reg_NfdForwarder(root_module['ns3::ndn::nfd::Forwarder'])
 
     #############
@@ -252,7 +252,7 @@
         reg_Entry(root_module['ns3::ndn::nfd::fib::Entry'])
 
         def reg_NextHop(cls):
-            cls.add_constructor([param('const ns3::ndn::Face&', 'face'), param('uint64_t', 'endpointId')])
+            cls.add_constructor([param('const ns3::ndn::Face&', 'face')])
 
             cls.add_function_as_method('getFaceFromFibNextHop', 'std::shared_ptr<ns3::ndn::Face>',
                                        [param('const ns3::ndn::nfd::fib::NextHop&', 'obj')],
diff --git a/bindings/modulegen__gcc_LP64.py b/bindings/modulegen__gcc_LP64.py
index 791a3bc..6814816 100644
--- a/bindings/modulegen__gcc_LP64.py
+++ b/bindings/modulegen__gcc_LP64.py
@@ -202,6 +202,7 @@
     def register_L3Protocol(cls):
         cls.add_method('getL3Protocol', 'ns3::Ptr<ns3::ndn::L3Protocol>', [param('ns3::Ptr<ns3::Object>', 'node')], is_static=True)
         cls.add_method('getForwarder', 'std::shared_ptr<ns3::ndn::nfd::Forwarder>', [])
+        cls.add_method('getFaceTable', retval('const ns3::ndn::nfd::FaceTable&', caller_manages_return=False), [], is_const=True)
     register_L3Protocol(root_module['ns3::ndn::L3Protocol'])
 
     # shared_ptr<Face>
@@ -220,7 +221,6 @@
         cls.add_method('getFib', retval('const ns3::ndn::nfd::Fib&', caller_manages_return=False), [], is_const=True)
         cls.add_method('getPit', retval('const ns3::ndn::nfd::Pit&', caller_manages_return=False), [], is_const=True)
         cls.add_method('getCs', retval('const ns3::ndn::nfd::Cs&', caller_manages_return=False), [], is_const=True)
-        cls.add_method('getFaceTable', retval('const ns3::ndn::nfd::FaceTable&', caller_manages_return=False), [], is_const=True)
     reg_NfdForwarder(root_module['ns3::ndn::nfd::Forwarder'])
 
     #############
@@ -252,7 +252,7 @@
         reg_Entry(root_module['ns3::ndn::nfd::fib::Entry'])
 
         def reg_NextHop(cls):
-            cls.add_constructor([param('const ns3::ndn::Face&', 'face'), param('uint64_t', 'endpointId')])
+            cls.add_constructor([param('const ns3::ndn::Face&', 'face')])
 
             cls.add_function_as_method('getFaceFromFibNextHop', 'std::shared_ptr<ns3::ndn::Face>',
                                        [param('const ns3::ndn::nfd::fib::NextHop&', 'obj')],
diff --git a/examples/ndn-cxx-simple/real-app.hpp b/examples/ndn-cxx-simple/real-app.hpp
index b7b2a87..8c9208b 100644
--- a/examples/ndn-cxx-simple/real-app.hpp
+++ b/examples/ndn-cxx-simple/real-app.hpp
@@ -42,7 +42,7 @@
                                      std::bind([]{}), std::bind([]{}));
 
     // use scheduler to send interest later on consumer face
-    m_scheduler.scheduleEvent(ndn::time::seconds(2), [this] {
+    m_scheduler.schedule(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; }),
diff --git a/helper/ndn-global-routing-helper.cpp b/helper/ndn-global-routing-helper.cpp
index 282f784..ebc4617 100644
--- a/helper/ndn-global-routing-helper.cpp
+++ b/helper/ndn-global-routing-helper.cpp
@@ -80,7 +80,7 @@
   gr = CreateObject<GlobalRouter>();
   node->AggregateObject(gr);
 
-  for (auto& face : ndn->getForwarder()->getFaceTable()) {
+  for (auto& face : ndn->getFaceTable()) {
     auto transport = dynamic_cast<NetDeviceTransport*>(face.getTransport());
     if (transport == nullptr) {
       NS_LOG_DEBUG("Skipping non ndnSIM-specific transport face");
@@ -316,7 +316,7 @@
     // remember interface statuses
     std::list<nfd::FaceId> faceIds;
     std::unordered_map<nfd::FaceId, uint16_t> originalMetrics;
-    for (auto& nfdFace : l3->getForwarder()->getFaceTable()) {
+    for (auto& nfdFace : l3->getFaceTable()) {
       faceIds.push_back(nfdFace.getId());
       originalMetrics[nfdFace.getId()] = nfdFace.getMetric();
       nfdFace.setMetric(std::numeric_limits<uint16_t>::max() - 1);
@@ -324,7 +324,7 @@
     }
 
     for (auto& faceId : faceIds) {
-      auto* face = l3->getForwarder()->getFaceTable().get(faceId);
+      auto* face = l3->getFaceTable().get(faceId);
       NS_ASSERT(face != nullptr);
       auto transport = dynamic_cast<NetDeviceTransport*>(face->getTransport());
       if (transport == nullptr) {
@@ -381,7 +381,7 @@
 
     // recover original interface statuses
     for (auto& i : originalMetrics) {
-      l3->getForwarder()->getFaceTable().get(i.first)->setMetric(i.second);
+      l3->getFaceTable().get(i.first)->setMetric(i.second);
     }
   }
 }
diff --git a/helper/ndn-link-control-helper.cpp b/helper/ndn-link-control-helper.cpp
index 2b46946..b0894d5 100644
--- a/helper/ndn-link-control-helper.cpp
+++ b/helper/ndn-link-control-helper.cpp
@@ -56,7 +56,7 @@
   NS_ASSERT(ndn1 != nullptr && ndn2 != nullptr);
 
   // iterate over all faces to find the right one
-  for (const auto& face : ndn1->getForwarder()->getFaceTable()) {
+  for (const auto& face : ndn1->getFaceTable()) {
     auto transport = dynamic_cast<NetDeviceTransport*>(face.getTransport());
     if (transport == nullptr)
       continue;
diff --git a/helper/ndn-stack-helper.cpp b/helper/ndn-stack-helper.cpp
index cf60551..af9c055 100644
--- a/helper/ndn-stack-helper.cpp
+++ b/helper/ndn-stack-helper.cpp
@@ -391,7 +391,7 @@
     if (ndn == nullptr)
       continue;
 
-    for (auto& face : ndn->getForwarder()->getFaceTable()) {
+    for (auto& face : ndn->getFaceTable()) {
       auto transport = dynamic_cast<NetDeviceTransport*>(face.getTransport());
       if (transport == nullptr)
         continue;
diff --git a/model/ndn-app-link-service.cpp b/model/ndn-app-link-service.cpp
index 2dbce52..e5b1ee7 100644
--- a/model/ndn-app-link-service.cpp
+++ b/model/ndn-app-link-service.cpp
@@ -47,7 +47,7 @@
 }
 
 void
-AppLinkService::doSendInterest(const Interest& interest)
+AppLinkService::doSendInterest(const Interest& interest, const nfd::EndpointId& endpoint)
 {
   NS_LOG_FUNCTION(this << &interest);
 
@@ -56,7 +56,7 @@
 }
 
 void
-AppLinkService::doSendData(const Data& data)
+AppLinkService::doSendData(const Data& data, const nfd::EndpointId& endpoint)
 {
   NS_LOG_FUNCTION(this << &data);
 
@@ -65,7 +65,7 @@
 }
 
 void
-AppLinkService::doSendNack(const lp::Nack& nack)
+AppLinkService::doSendNack(const lp::Nack& nack, const nfd::EndpointId& endpoint)
 {
   NS_LOG_FUNCTION(this << &nack);
 
@@ -78,19 +78,19 @@
 void
 AppLinkService::onReceiveInterest(const Interest& interest)
 {
-  this->receiveInterest(interest);
+  this->receiveInterest(interest, 0);
 }
 
 void
 AppLinkService::onReceiveData(const Data& data)
 {
-  this->receiveData(data);
+  this->receiveData(data, 0);
 }
 
 void
 AppLinkService::onReceiveNack(const lp::Nack& nack)
 {
-  this->receiveNack(nack);
+  this->receiveNack(nack, 0);
 }
 
 } // namespace ndn
diff --git a/model/ndn-app-link-service.hpp b/model/ndn-app-link-service.hpp
index 798ac1a..21c50d1 100644
--- a/model/ndn-app-link-service.hpp
+++ b/model/ndn-app-link-service.hpp
@@ -60,16 +60,16 @@
 
 private:
   virtual void
-  doSendInterest(const Interest& interest) override;
+  doSendInterest(const Interest& interest, const nfd::EndpointId& endpoint) override;
 
   virtual void
-  doSendData(const Data& data) override;
+  doSendData(const Data& data, const nfd::EndpointId& endpoint) override;
 
   virtual void
-  doSendNack(const lp::Nack& nack) override;
+  doSendNack(const lp::Nack& nack, const nfd::EndpointId& endpoint) override;
 
   virtual void
-  doReceivePacket(nfd::face::Transport::Packet&& packet) override
+  doReceivePacket(const Block& packet, const nfd::EndpointId& endpoint) override
   {
     // does nothing (all operations for now handled by LinkService)
     BOOST_ASSERT(false);
diff --git a/model/ndn-block-header.cpp b/model/ndn-block-header.cpp
index fbab70f..6665fa4 100644
--- a/model/ndn-block-header.cpp
+++ b/model/ndn-block-header.cpp
@@ -56,8 +56,8 @@
 {
 }
 
-BlockHeader::BlockHeader(const nfdFace::Transport::Packet& packet)
-  : m_block(packet.packet)
+BlockHeader::BlockHeader(const Block& packet)
+  : m_block(packet)
 {
 }
 
diff --git a/model/ndn-block-header.hpp b/model/ndn-block-header.hpp
index f2c73ab..4c9f491 100644
--- a/model/ndn-block-header.hpp
+++ b/model/ndn-block-header.hpp
@@ -39,7 +39,7 @@
 
   BlockHeader();
 
-  BlockHeader(const nfdFace::Transport::Packet& packet);
+  BlockHeader(const Block& packet);
 
   virtual uint32_t
   GetSerializedSize(void) const;
diff --git a/model/ndn-common.hpp b/model/ndn-common.hpp
index a678f5d..b0cfe7a 100644
--- a/model/ndn-common.hpp
+++ b/model/ndn-common.hpp
@@ -56,8 +56,6 @@
 using namespace ::ndn::lp;
 }
 
-using ::ndn::Exclude;
-
 using std::shared_ptr;
 using std::make_shared;
 
diff --git a/model/ndn-l3-protocol.cpp b/model/ndn-l3-protocol.cpp
index f7ad619..8271587 100644
--- a/model/ndn-l3-protocol.cpp
+++ b/model/ndn-l3-protocol.cpp
@@ -171,6 +171,7 @@
   // note that shared_ptr needed for Python bindings
 
   std::shared_ptr<::nfd::Forwarder> m_forwarder;
+  std::unique_ptr<::nfd::FaceTable> m_faceTable;
   std::unique_ptr<::nfd::face::FaceSystem> m_faceSystem;
 
   std::shared_ptr<::nfd::face::Face> m_internalFace;
@@ -209,12 +210,9 @@
 void
 L3Protocol::initialize()
 {
-  m_impl->m_forwarder = make_shared<::nfd::Forwarder>();
-
-  ::nfd::FaceTable& faceTable = m_impl->m_forwarder->getFaceTable();
-  faceTable.addReserved(::nfd::face::makeNullFace(), ::nfd::face::FACEID_NULL);
-  // faceTable.addReserved(face::makeNullFace(FaceUri("contentstore://")), face::FACEID_CONTENT_STORE);
-  m_impl->m_faceSystem = make_unique<::nfd::face::FaceSystem>(faceTable, nullptr);
+  m_impl->m_faceTable = make_unique<::nfd::FaceTable>();
+  m_impl->m_forwarder = make_shared<::nfd::Forwarder>(*m_impl->m_faceTable);
+  m_impl->m_faceSystem = make_unique<::nfd::face::FaceSystem>(*m_impl->m_faceTable, nullptr);
 
   initializeManagement();
   initializeRibManager();
@@ -263,10 +261,10 @@
   using namespace nfd;
 
   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_faceTable->addReserved(m_impl->m_internalFace, face::FACEID_INTERNAL_FACE);
 
   std::tie(m_impl->m_internalFaceForInjects, m_impl->m_internalClientFaceForInjects) = face::makeInternalFace(StackHelper::getKeyChain());
-  forwarder->getFaceTable().addReserved(m_impl->m_internalFaceForInjects, face::FACEID_INTERNAL_FACE + 1);
+  m_impl->m_faceTable->addReserved(m_impl->m_internalFaceForInjects, face::FACEID_INTERNAL_FACE + 1);
 
   m_impl->m_dispatcher = make_unique<::ndn::mgmt::Dispatcher>(*m_impl->m_internalClientFace, StackHelper::getKeyChain());
   m_impl->m_authenticator = ::nfd::CommandAuthenticator::create();
@@ -275,7 +273,7 @@
     m_impl->m_forwarderStatusManager = make_unique<::nfd::ForwarderStatusManager>(*m_impl->m_forwarder, *m_impl->m_dispatcher);
   }
   m_impl->m_faceManager = make_unique<::nfd::FaceManager>(*m_impl->m_faceSystem, *m_impl->m_dispatcher, *m_impl->m_authenticator);
-  m_impl->m_fibManager = make_shared<::nfd::FibManager>(m_impl->m_forwarder->getFib(), m_impl->m_forwarder->getFaceTable(),
+  m_impl->m_fibManager = make_shared<::nfd::FibManager>(m_impl->m_forwarder->getFib(), *m_impl->m_faceTable,
                                                         *m_impl->m_dispatcher, *m_impl->m_authenticator);
   m_impl->m_csManager = make_unique<::nfd::CsManager>(m_impl->m_forwarder->getCs(), m_impl->m_forwarder->getCounters(),
                                                       *m_impl->m_dispatcher, *m_impl->m_authenticator);
@@ -308,7 +306,8 @@
 
   // add FIB entry for NFD Management Protocol
   Name topPrefix("/localhost/nfd");
-  m_impl->m_forwarder->getFib().insert(topPrefix).first->addOrUpdateNextHop(*m_impl->m_internalFace, 0, 0);
+  auto entry = m_impl->m_forwarder->getFib().insert(topPrefix).first;
+  m_impl->m_forwarder->getFib().addOrUpdateNextHop(*entry, *m_impl->m_internalFace, 0);
   m_impl->m_dispatcher->addTopPrefix(topPrefix, false);
 }
 
@@ -318,7 +317,7 @@
   using namespace nfd;
 
   std::tie(m_impl->m_internalRibFace, m_impl->m_internalRibClientFace) = face::makeInternalFace(StackHelper::getKeyChain());
-  m_impl->m_forwarder->getFaceTable().add(m_impl->m_internalRibFace);
+  m_impl->m_faceTable->add(m_impl->m_internalRibFace);
 
   m_impl->m_ribService = make_unique<rib::Service>(m_impl->m_config,
                                                    std::ref(*m_impl->m_internalRibClientFace),
@@ -331,6 +330,12 @@
   return m_impl->m_forwarder;
 }
 
+nfd::FaceTable&
+L3Protocol::getFaceTable()
+{
+  return *m_impl->m_faceTable;
+}
+
 shared_ptr<nfd::FibManager>
 L3Protocol::getFibManager()
 {
@@ -392,26 +397,26 @@
 {
   NS_LOG_FUNCTION(this << face.get());
 
-  m_impl->m_forwarder->addFace(face);
+  m_impl->m_faceTable->add(face);
 
   std::weak_ptr<Face> weakFace = face;
 
   // // Connect Signals to TraceSource
-  face->afterReceiveInterest.connect([this, weakFace](const Interest& interest) {
+  face->afterReceiveInterest.connect([this, weakFace](const Interest& interest, const nfd::EndpointId&) {
       shared_ptr<Face> face = weakFace.lock();
       if (face != nullptr) {
         this->m_inInterests(interest, *face);
       }
     });
 
-  face->afterReceiveData.connect([this, weakFace](const Data& data) {
+  face->afterReceiveData.connect([this, weakFace](const Data& data, const nfd::EndpointId&) {
       shared_ptr<Face> face = weakFace.lock();
       if (face != nullptr) {
         this->m_inData(data, *face);
       }
     });
 
-  face->afterReceiveNack.connect([this, weakFace](const lp::Nack& nack) {
+  face->afterReceiveNack.connect([this, weakFace](const lp::Nack& nack, const nfd::EndpointId&) {
       shared_ptr<Face> face = weakFace.lock();
       if (face != nullptr) {
         this->m_inNack(nack, *face);
@@ -447,13 +452,13 @@
 shared_ptr<Face>
 L3Protocol::getFaceById(nfd::FaceId id) const
 {
-  return m_impl->m_forwarder->getFaceTable().get(id)->shared_from_this();
+  return m_impl->m_faceTable->get(id)->shared_from_this();
 }
 
 shared_ptr<Face>
 L3Protocol::getFaceByNetDevice(Ptr<NetDevice> netDevice) const
 {
-  for (auto& i : m_impl->m_forwarder->getFaceTable()) {
+  for (auto& i : *m_impl->m_faceTable) {
     auto transport = dynamic_cast<NetDeviceTransport*>(i.getTransport());
     if (transport == nullptr)
       continue;
diff --git a/model/ndn-l3-protocol.hpp b/model/ndn-l3-protocol.hpp
index e5169af..3b8c775 100644
--- a/model/ndn-l3-protocol.hpp
+++ b/model/ndn-l3-protocol.hpp
@@ -35,6 +35,7 @@
 namespace nfd {
 class Forwarder;
 class FibManager;
+class FaceTable;
 class StrategyChoiceManager;
 typedef boost::property_tree::ptree ConfigSection;
 namespace pit {
@@ -104,6 +105,9 @@
   shared_ptr<nfd::Forwarder>
   getForwarder();
 
+  nfd::FaceTable&
+  getFaceTable();
+
   /**
    * \brief Get smart pointer to nfd::FibManager, used by node's NFD
    */
diff --git a/model/ndn-net-device-transport.cpp b/model/ndn-net-device-transport.cpp
index a8565fb..e0439f0 100644
--- a/model/ndn-net-device-transport.cpp
+++ b/model/ndn-net-device-transport.cpp
@@ -106,7 +106,7 @@
 }
 
 void
-NetDeviceTransport::doSend(Packet&& packet)
+NetDeviceTransport::doSend(const Block& packet, const nfd::EndpointId& endpoint)
 {
   NS_LOG_FUNCTION(this << "Sending packet from netDevice with URI"
                   << this->getLocalUri());
@@ -125,10 +125,10 @@
 // callback
 void
 NetDeviceTransport::receiveFromNetDevice(Ptr<NetDevice> device,
-                                      Ptr<const ns3::Packet> p,
-                                      uint16_t protocol,
-                                      const Address& from, const Address& to,
-                                      NetDevice::PacketType packetType)
+                                         Ptr<const ns3::Packet> p,
+                                         uint16_t protocol,
+                                         const Address& from, const Address& to,
+                                         NetDevice::PacketType packetType)
 {
   NS_LOG_FUNCTION(device << p << protocol << from << to << packetType);
 
@@ -138,9 +138,7 @@
   BlockHeader header;
   packet->RemoveHeader(header);
 
-  auto nfdPacket = Packet(std::move(header.getBlock()));
-
-  this->receive(std::move(nfdPacket));
+  this->receive(std::move(header.getBlock()));
 }
 
 Ptr<NetDevice>
diff --git a/model/ndn-net-device-transport.hpp b/model/ndn-net-device-transport.hpp
index e68382d..22b07de 100644
--- a/model/ndn-net-device-transport.hpp
+++ b/model/ndn-net-device-transport.hpp
@@ -62,7 +62,7 @@
   doClose() override;
 
   virtual void
-  doSend(Packet&& packet) override;
+  doSend(const Block& packet, const nfd::EndpointId& endpoint) override;
 
   void
   receiveFromNetDevice(Ptr<NetDevice> device,
diff --git a/model/null-transport.hpp b/model/null-transport.hpp
index 42ef9c6..3c27e1f 100644
--- a/model/null-transport.hpp
+++ b/model/null-transport.hpp
@@ -47,19 +47,14 @@
   }
 
 private:
-  virtual void
-  beforeChangePersistency(::ndn::nfd::FacePersistency newPersistency)
-  {
-  }
-
-  virtual void
-  doClose()
+  void
+  doClose() final
   {
     this->setState(nfd::face::TransportState::CLOSED);
   }
 
-  virtual void
-  doSend(Packet&& packet)
+  void
+  doSend(const Block& packet, const nfd::EndpointId& endpoint) final
   {
   }
 };
diff --git a/tests/unit-tests/helper/ndn-fib-helper.t.cpp b/tests/unit-tests/helper/ndn-fib-helper.t.cpp
index 60a5967..7426fda 100644
--- a/tests/unit-tests/helper/ndn-fib-helper.t.cpp
+++ b/tests/unit-tests/helper/ndn-fib-helper.t.cpp
@@ -38,7 +38,7 @@
     addApps({
         {"1", "ns3::ndn::ConsumerCbr",
             {{"Prefix", "/prefix"}, {"Frequency", "1"}},
-            "0s", "9.99s"},
+            "0s", "10.5s"},
         {"2", "ns3::ndn::Producer",
             {{"Prefix", "/prefix"}, {"PayloadSize", "1024"}},
             "0s", "100s"}
@@ -47,7 +47,7 @@
 
   ~AddRouteFixture()
   {
-    Simulator::Stop(Seconds(20.001));
+    Simulator::Stop(Seconds(20.101));
     Simulator::Run();
 
     BOOST_CHECK_EQUAL(getFace("1", "2")->getCounters().nOutInterests, 10);
diff --git a/tests/unit-tests/helper/ndn-link-control-helper.t.cpp b/tests/unit-tests/helper/ndn-link-control-helper.t.cpp
index 3d79ffa..0df5280 100644
--- a/tests/unit-tests/helper/ndn-link-control-helper.t.cpp
+++ b/tests/unit-tests/helper/ndn-link-control-helper.t.cpp
@@ -55,17 +55,17 @@
   Simulator::Schedule(Seconds(10.1), ndn::LinkControlHelper::UpLink, getNode("1"), getNode("2"));
 
   nfd::getScheduler().schedule(time::milliseconds(5200), [&] {
-      BOOST_CHECK_EQUAL(getFace("2", "1")->getCounters().nInInterests, 6);
-      BOOST_CHECK_EQUAL(getFace("1", "2")->getCounters().nInData, 6);
+      BOOST_CHECK_EQUAL(getFace("2", "1")->getCounters().nInInterests, 5);
+      BOOST_CHECK_EQUAL(getFace("1", "2")->getCounters().nInData, 5);
     });
 
   nfd::getScheduler().schedule(time::milliseconds(10200), [&] {
-      BOOST_CHECK_EQUAL(getFace("2", "1")->getCounters().nInInterests, 6);
-      BOOST_CHECK_EQUAL(getFace("1", "2")->getCounters().nInData, 6);
+      BOOST_CHECK_EQUAL(getFace("2", "1")->getCounters().nInInterests, 5);
+      BOOST_CHECK_EQUAL(getFace("1", "2")->getCounters().nInData, 5);
     });
   nfd::getScheduler().schedule(time::milliseconds(15100), [&] {
-      BOOST_CHECK_EQUAL(getFace("2", "1")->getCounters().nInInterests, 11);
-      BOOST_CHECK_EQUAL(getFace("1", "2")->getCounters().nInData, 11);
+      BOOST_CHECK_EQUAL(getFace("2", "1")->getCounters().nInInterests, 10);
+      BOOST_CHECK_EQUAL(getFace("1", "2")->getCounters().nInData, 10);
     });
 
   Simulator::Stop(Seconds(15.2));
diff --git a/tests/unit-tests/model/ndn-block-header.t.cpp b/tests/unit-tests/model/ndn-block-header.t.cpp
index 474f7e5..9360998 100644
--- a/tests/unit-tests/model/ndn-block-header.t.cpp
+++ b/tests/unit-tests/model/ndn-block-header.t.cpp
@@ -56,17 +56,17 @@
   interest.setNonce(10);
   interest.setCanBePrefix(true);
   lp::Packet lpPacket(interest.wireEncode());
-  nfd::face::Transport::Packet packet(lpPacket.wireEncode());
+  auto packet(lpPacket.wireEncode());
   BlockHeader header(packet);
 
-  BOOST_CHECK_EQUAL(header.GetSerializedSize(), 18); // 18
+  BOOST_CHECK_EQUAL(header.GetSerializedSize(), 20); // 20
 
   {
     Ptr<Packet> packet = Create<Packet>();
     packet->AddHeader(header);
     boost::test_tools::output_test_stream output;
     packet->Print(output);
-    BOOST_CHECK(output.is_equal("ns3::ndn::Packet (Interest: /prefix?ndn.Nonce=10)"));
+    BOOST_CHECK(output.is_equal("ns3::ndn::Packet (Interest: /prefix?CanBePrefix&Nonce=10)"));
   }
 }
 
@@ -77,7 +77,7 @@
   data.setContent(std::make_shared< ::ndn::Buffer>(1024));
   ndn::StackHelper::getKeyChain().sign(data);
   lp::Packet lpPacket(data.wireEncode());
-  nfd::face::Transport::Packet packet(lpPacket.wireEncode());
+  auto packet(lpPacket.wireEncode());
   BlockHeader header(packet);
 
   BOOST_CHECK_EQUAL(header.GetSerializedSize(), 1350);
@@ -102,23 +102,23 @@
   lpPacket.add<::ndn::lp::FragmentField>(std::make_pair(interest.wireEncode().begin(), interest.wireEncode().end()));
 
   {
-    BlockHeader header(nfd::face::Transport::Packet(lpPacket.wireEncode()));
+    BlockHeader header(lpPacket.wireEncode());
     Ptr<Packet> packet = Create<Packet>();
     packet->AddHeader(header);
     boost::test_tools::output_test_stream output;
     packet->Print(output);
-    BOOST_CHECK(output.is_equal("ns3::ndn::Packet (NDNLP(Interest: /prefix?ndn.Nonce=10))"));
+    BOOST_CHECK(output.is_equal("ns3::ndn::Packet (NDNLP(Interest: /prefix?CanBePrefix&Nonce=10))"));
   }
 
   lpPacket.add<::ndn::lp::NackField>(::ndn::lp::NackHeader().setReason(::ndn::lp::NackReason::NO_ROUTE));
 
   {
-    BlockHeader header(nfd::face::Transport::Packet(lpPacket.wireEncode()));
+    BlockHeader header(lpPacket.wireEncode());
     Ptr<Packet> packet = Create<Packet>();
     packet->AddHeader(header);
     boost::test_tools::output_test_stream output;
     packet->Print(output);
-    BOOST_CHECK(output.is_equal("ns3::ndn::Packet (NDNLP(NACK(NoRoute) for Interest: /prefix?ndn.Nonce=10))"));
+    BOOST_CHECK(output.is_equal("ns3::ndn::Packet (NDNLP(NACK(NoRoute) for Interest: /prefix?CanBePrefix&Nonce=10))"));
   }
 
   lpPacket.remove<::ndn::lp::NackField>();
@@ -126,18 +126,18 @@
   lpPacket.add<::ndn::lp::FragCountField>(1);
 
   {
-    BlockHeader header(nfd::face::Transport::Packet(lpPacket.wireEncode()));
+    BlockHeader header(lpPacket.wireEncode());
     Ptr<Packet> packet = Create<Packet>();
     packet->AddHeader(header);
     boost::test_tools::output_test_stream output;
     packet->Print(output);
-    BOOST_CHECK(output.is_equal("ns3::ndn::Packet (NDNLP(Interest: /prefix?ndn.Nonce=10))"));
+    BOOST_CHECK(output.is_equal("ns3::ndn::Packet (NDNLP(Interest: /prefix?CanBePrefix&Nonce=10))"));
   }
 
   lpPacket.set<::ndn::lp::FragCountField>(2);
 
   {
-    BlockHeader header(nfd::face::Transport::Packet(lpPacket.wireEncode()));
+    BlockHeader header(lpPacket.wireEncode());
     Ptr<Packet> packet = Create<Packet>();
     packet->AddHeader(header);
     boost::test_tools::output_test_stream output;
@@ -151,7 +151,7 @@
   lpPacket.remove<::ndn::lp::FragIndexField>();
 
   {
-    BlockHeader header(nfd::face::Transport::Packet(lpPacket.wireEncode()));
+    BlockHeader header(lpPacket.wireEncode());
     Ptr<Packet> packet = Create<Packet>();
     packet->AddHeader(header);
     boost::test_tools::output_test_stream output;
diff --git a/tests/unit-tests/ndn-cxx/face.t.cpp b/tests/unit-tests/ndn-cxx/face.t.cpp
index 32a1c1c..98d880b 100644
--- a/tests/unit-tests/ndn-cxx/face.t.cpp
+++ b/tests/unit-tests/ndn-cxx/face.t.cpp
@@ -230,7 +230,7 @@
 
 private:
   ::ndn::Scheduler m_scheduler;
-  ::ndn::util::scheduler::ScopedEventId m_event;
+  ::ndn::scheduler::ScopedEventId m_event;
 };
 
 BOOST_AUTO_TEST_CASE(ExpressMultipleInterests)
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 3e8804c..fe9b380 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
@@ -54,7 +54,7 @@
     addApps({
         {"1", "ns3::ndn::ConsumerCbr",
             {{"Prefix", "/prefix"}, {"Frequency", "1"}},
-            "0s", "0.9s"}, // send just one packet
+            "1s", "1.9s"}, // send just one packet
         // Second consumer will capture effect of the bug #2764
         {"2", "ns3::ndn::ConsumerCbr",
             {{"Prefix", "/prefix"}, {"Frequency", "1"}},
@@ -89,12 +89,12 @@
 
   BOOST_CHECK_EQUAL(buffer.str(),
                     R"STR(Time	Node	AppId	SeqNo	Type	DelayS	DelayUS	RetxCount	HopCount
-0.0417744	1	0	0	LastDelay	0.0417744	41774.4	1	2
-0.0417744	1	0	0	FullDelay	0.0417744	41774.4	1	2
+1.04177	1	0	0	LastDelay	0.0417664	41766.4	1	2
+1.04177	1	0	0	FullDelay	0.0417664	41766.4	1	2
 2	2	0	0	LastDelay	0	0	1	1
 2	2	0	0	FullDelay	0	0	1	1
-3.02089	2	0	1	LastDelay	0.0208872	20887.2	1	1
-3.02089	2	0	1	FullDelay	0.0208872	20887.2	1	1
+3.02088	2	0	1	LastDelay	0.0208832	20883.2	1	1
+3.02088	2	0	1	FullDelay	0.0208832	20883.2	1	1
 )STR");
 }
 
@@ -116,8 +116,8 @@
 
   BOOST_CHECK_EQUAL(buffer.str(),
     R"STR(Time	Node	AppId	SeqNo	Type	DelayS	DelayUS	RetxCount	HopCount
-0.0417744	1	0	0	LastDelay	0.0417744	41774.4	1	2
-0.0417744	1	0	0	FullDelay	0.0417744	41774.4	1	2
+1.04177	1	0	0	LastDelay	0.0417664	41766.4	1	2
+1.04177	1	0	0	FullDelay	0.0417664	41766.4	1	2
 )STR");
 }
 
@@ -138,8 +138,8 @@
     R"STR(Time	Node	AppId	SeqNo	Type	DelayS	DelayUS	RetxCount	HopCount
 2	2	0	0	LastDelay	0	0	1	1
 2	2	0	0	FullDelay	0	0	1	1
-3.02089	2	0	1	LastDelay	0.0208872	20887.2	1	1
-3.02089	2	0	1	FullDelay	0.0208872	20887.2	1	1
+3.02088	2	0	1	LastDelay	0.0208832	20883.2	1	1
+3.02088	2	0	1	FullDelay	0.0208832	20883.2	1	1
 )STR");
 }
 
@@ -156,8 +156,8 @@
   BOOST_CHECK(output->is_equal(
     R"STR(2	2	0	0	LastDelay	0	0	1	1
 2	2	0	0	FullDelay	0	0	1	1
-3.02089	2	0	1	LastDelay	0.0208872	20887.2	1	1
-3.02089	2	0	1	FullDelay	0.0208872	20887.2	1	1
+3.02088	2	0	1	LastDelay	0.0208832	20883.2	1	1
+3.02088	2	0	1	FullDelay	0.0208832	20883.2	1	1
 )STR"));
 }
 
diff --git a/utils/dummy-keychain.cpp b/utils/dummy-keychain.cpp
index 02a3fad..3f62a4e 100644
--- a/utils/dummy-keychain.cpp
+++ b/utils/dummy-keychain.cpp
@@ -251,6 +251,13 @@
   return make_shared<Buffer>(DUMMY_SIGNATURE, sizeof(DUMMY_SIGNATURE));
 }
 
+bool
+DummyKeyHandle::doVerify(DigestAlgorithm digestAlgorithm, const uint8_t* buf, size_t bufLen,
+                         const uint8_t* sig, size_t sigLen) const
+{
+  throw Error("Not supported");
+}
+
 ConstBufferPtr
 DummyKeyHandle::doDecrypt(const uint8_t* cipherText, size_t cipherTextLen) const
 {
@@ -329,6 +336,12 @@
   throw Error("Not supported");
 }
 
+void
+DummyTpm::doImportKey(const Name& keyName, shared_ptr<transform::PrivateKey> key)
+{
+  throw Error("Not supported");
+}
+
 std::string
 DummyTpm::getScheme()
 {
diff --git a/utils/dummy-keychain.hpp b/utils/dummy-keychain.hpp
index e71d083..7f8b0a3 100644
--- a/utils/dummy-keychain.hpp
+++ b/utils/dummy-keychain.hpp
@@ -147,6 +147,10 @@
   ConstBufferPtr
   doSign(DigestAlgorithm digestAlgorithm, const uint8_t* buf, size_t size) const final;
 
+  bool
+  doVerify(DigestAlgorithm digestAlgorithm, const uint8_t* buf, size_t bufLen,
+           const uint8_t* sig, size_t sigLen) const final;
+
   ConstBufferPtr
   doDecrypt(const uint8_t* cipherText, size_t cipherTextLen) const final;
 
@@ -209,6 +213,9 @@
   void
   doImportKey(const Name& keyName, const uint8_t* pkcs8, size_t pkcs8Len, const char* pw, size_t pwLen) final;
 
+  void
+  doImportKey(const Name& keyName, shared_ptr<transform::PrivateKey> key) final;
+
 public:
   static const std::string SCHEME;
 };
diff --git a/utils/topology/annotated-topology-reader.hpp b/utils/topology/annotated-topology-reader.hpp
index 343743d..2f066dc 100644
--- a/utils/topology/annotated-topology-reader.hpp
+++ b/utils/topology/annotated-topology-reader.hpp
@@ -25,6 +25,7 @@
 #include "ns3/topology-reader.h"
 #include "ns3/random-variable-stream.h"
 #include "ns3/object-factory.h"
+#include "ns3/node-container.h"
 
 namespace ns3 {
 
diff --git a/wscript b/wscript
index 09725c6..94206b4 100644
--- a/wscript
+++ b/wscript
@@ -124,8 +124,7 @@
                                   excl=['ndn-cxx/ndn-cxx/net/impl/*.cpp',
                                         'ndn-cxx/ndn-cxx/net/network-monitor*.cpp',
                                         'ndn-cxx/ndn-cxx/util/dummy-client-face.cpp',
-                                        'ndn-cxx/ndn-cxx/security/tpm/*osx.cpp',
-                                        'ndn-cxx/ndn-cxx/detail/*osx.cpp',
+                                        'ndn-cxx/ndn-cxx/**/*osx.cpp',
                                         'ndn-cxx/ndn-cxx/net/network-interface.cpp'])
 
     nfdSrc = bld.path.ant_glob(['%s/**/*.cpp' % dir for dir in ['NFD/core', 'NFD/daemon']],
