diff --git a/tests/unit-tests/model/ndn-block-header.t.cpp b/tests/unit-tests/model/ndn-block-header.t.cpp
new file mode 100644
index 0000000..2027d41
--- /dev/null
+++ b/tests/unit-tests/model/ndn-block-header.t.cpp
@@ -0,0 +1,161 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2011-2015  Regents of the University of California.
+ *
+ * This file is part of ndnSIM. See AUTHORS for complete list of ndnSIM authors and
+ * contributors.
+ *
+ * ndnSIM 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.
+ *
+ * ndnSIM 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
+ * ndnSIM, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ **/
+
+#include "model/ndn-block-header.hpp"
+#include "helper/ndn-stack-helper.hpp"
+
+#include <ndn-cxx/lp/packet.hpp>
+
+#include "ns3/ndnSIM/NFD/daemon/face/transport.hpp"
+#include "ns3/packet.h"
+
+#include "../tests-common.hpp"
+
+namespace ns3 {
+namespace ndn {
+
+BOOST_FIXTURE_TEST_SUITE(ModelNdnBlockHeader, CleanupFixture)
+
+class EnablePacketPrintingFixture
+{
+public:
+  EnablePacketPrintingFixture()
+  {
+    Packet::EnablePrinting();
+  }
+};
+
+BOOST_GLOBAL_FIXTURE(EnablePacketPrintingFixture)
+#if BOOST_VERSION >= 105900
+;
+#endif // BOOST_VERSION >= 105900
+
+
+BOOST_AUTO_TEST_CASE(EncodePrintInterest)
+{
+  Interest interest("/prefix");
+  interest.setNonce(10);
+  lp::Packet lpPacket(interest.wireEncode());
+  nfd::face::Transport::Packet packet(lpPacket.wireEncode());
+  BlockHeader header(packet);
+
+  BOOST_CHECK_EQUAL(header.GetSerializedSize(), 18); // 18
+
+  {
+    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_AUTO_TEST_CASE(EncodePrintData)
+{
+  Data data("/other/prefix");
+  data.setFreshnessPeriod(ndn::time::milliseconds(1000));
+  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());
+  BlockHeader header(packet);
+
+  BOOST_CHECK_EQUAL(header.GetSerializedSize(), 1369);
+
+  {
+    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 (Data: /other/prefix)"));
+  }
+}
+
+BOOST_AUTO_TEST_CASE(PrintLpPacket)
+{
+  Interest interest("/prefix");
+  interest.setNonce(10);
+
+  lp::Packet lpPacket;
+  lpPacket.add<::ndn::lp::SequenceField>(0); // to make sure that the NDNLP header is added
+  lpPacket.add<::ndn::lp::FragmentField>(std::make_pair(interest.wireEncode().begin(), interest.wireEncode().end()));
+
+  {
+    BlockHeader header(nfd::face::Transport::Packet(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))"));
+  }
+
+  lpPacket.add<::ndn::lp::NackField>(::ndn::lp::NackHeader().setReason(::ndn::lp::NackReason::NO_ROUTE));
+
+  {
+    BlockHeader header(nfd::face::Transport::Packet(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))"));
+  }
+
+  lpPacket.remove<::ndn::lp::NackField>();
+  lpPacket.add<::ndn::lp::FragIndexField>(0);
+  lpPacket.add<::ndn::lp::FragCountField>(1);
+
+  {
+    BlockHeader header(nfd::face::Transport::Packet(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))"));
+  }
+
+  lpPacket.set<::ndn::lp::FragCountField>(2);
+
+  {
+    BlockHeader header(nfd::face::Transport::Packet(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(fragment 1 out of 2))"));
+  }
+
+  ::ndn::Buffer buf(10);
+  lpPacket.set<::ndn::lp::FragmentField>(std::make_pair(buf.begin(), buf.end()));
+  lpPacket.remove<::ndn::lp::FragCountField>();
+  lpPacket.remove<::ndn::lp::FragIndexField>();
+
+  {
+    BlockHeader header(nfd::face::Transport::Packet(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(Unrecognized))"));
+  }
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
+} // namespace ndn
+} // namespace ns3
diff --git a/tests/unit-tests/model/ndn-header.t.cpp b/tests/unit-tests/model/ndn-header.t.cpp
deleted file mode 100644
index 3776c8a..0000000
--- a/tests/unit-tests/model/ndn-header.t.cpp
+++ /dev/null
@@ -1,53 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2011-2015  Regents of the University of California.
- *
- * This file is part of ndnSIM. See AUTHORS for complete list of ndnSIM authors and
- * contributors.
- *
- * ndnSIM 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.
- *
- * ndnSIM 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
- * ndnSIM, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
-
-#include "model/ndn-header.hpp"
-#include "model/ndn-ns3.hpp"
-#include "helper/ndn-stack-helper.hpp"
-
-#include <ndn-cxx/interest.hpp>
-#include <ndn-cxx/data.hpp>
-
-#include "../tests-common.hpp"
-
-namespace ns3 {
-namespace ndn {
-
-BOOST_FIXTURE_TEST_SUITE(ModelNdnHeader, CleanupFixture)
-
-BOOST_AUTO_TEST_CASE(TypeId)
-{
- auto interest = make_shared<ndn::Interest>("/prefix");
- PacketHeader<Interest> interestPktHeader(*interest);
- BOOST_CHECK_EQUAL(interestPktHeader.GetTypeId().GetName().c_str(), "ns3::ndn::Interest");
-
- auto data = make_shared<ndn::Data>();
- data->setFreshnessPeriod(ndn::time::milliseconds(1000));
- data->setContent(std::make_shared< ::ndn::Buffer>(1024));
- ndn::StackHelper::getKeyChain().sign(*data);
- PacketHeader<Data> dataPktHeader(*data);
-
- BOOST_CHECK_EQUAL(dataPktHeader.GetTypeId().GetName().c_str(), "ns3::ndn::Data");
- BOOST_CHECK_EQUAL(dataPktHeader.GetSerializedSize(), 1354); // 328 + 1024
-}
-
-BOOST_AUTO_TEST_SUITE_END()
-
-} // namespace ndn
-} // namespace ns3
diff --git a/tests/unit-tests/model/ndn-net-device-face.t.cpp b/tests/unit-tests/model/ndn-net-device-face.t.cpp
deleted file mode 100644
index c33afdb..0000000
--- a/tests/unit-tests/model/ndn-net-device-face.t.cpp
+++ /dev/null
@@ -1,145 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2011-2015  Regents of the University of California.
- *
- * This file is part of ndnSIM. See AUTHORS for complete list of ndnSIM authors and
- * contributors.
- *
- * ndnSIM 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.
- *
- * ndnSIM 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
- * ndnSIM, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
-
-
-#include "model/ndn-net-device-link-service.hpp"
-
-#include "../tests-common.hpp"
-
-namespace ns3 {
-namespace ndn {
-
-BOOST_FIXTURE_TEST_SUITE(ModelNdnNetDeviceFace, ScenarioHelperWithCleanupFixture)
-
-class FixtureWithTracers : public ScenarioHelperWithCleanupFixture
-{
-public:
-  void
-  InInterests(const Interest&, const Face& face)
-  {
-    nInInterests[boost::lexical_cast<std::string>(face)] += 1;
-  }
-
-  void
-  OutInterests(const Interest&, const Face& face)
-  {
-    nOutInterests[boost::lexical_cast<std::string>(face)] += 1;
-  }
-
-  void
-  InData(const Data&, const Face& face)
-  {
-    nInData[boost::lexical_cast<std::string>(face)] += 1;
-  }
-
-  void
-  OutData(const Data&, const Face& face)
-  {
-    nOutData[boost::lexical_cast<std::string>(face)] += 1;
-  }
-
-public:
-  std::map<std::string, uint32_t> nInInterests;
-  std::map<std::string, uint32_t> nOutInterests;
-  std::map<std::string, uint32_t> nInData;
-  std::map<std::string, uint32_t> nOutData;
-
-  // TODO add NACKs
-};
-
-BOOST_FIXTURE_TEST_CASE(Basic, FixtureWithTracers)
-{
-  Config::SetDefault("ns3::PointToPointNetDevice::DataRate", StringValue("10Mbps"));
-  Config::SetDefault("ns3::PointToPointChannel::Delay", StringValue("10ms"));
-  Config::SetDefault("ns3::DropTailQueue::MaxPackets", StringValue("20"));
-
-  createTopology({
-      {"1", "2"},
-    }, false);
-
-  getNetDevice("1", "2")->SetAttribute("Address", StringValue("00:00:00:ff:ff:01"));
-  getNetDevice("2", "1")->SetAttribute("Address", StringValue("00:00:00:ff:ff:02"));
-
-  getStackHelper().InstallAll();
-
-  addRoutes({
-      {"1", "2", "/prefix", 1},
-    });
-
-  addApps({
-      {"1", "ns3::ndn::ConsumerCbr",
-          {{"Prefix", "/prefix"}, {"Frequency", "10"}},
-          "0s", "9.99s"},
-      {"2", "ns3::ndn::Producer",
-          {{"Prefix", "/prefix"}, {"PayloadSize", "1024"}},
-          "0s", "100s"}
-    });
-
-  Config::ConnectWithoutContext("/NodeList/*/$ns3::ndn::L3Protocol/InInterests", MakeCallback(&FixtureWithTracers::InInterests, this));
-  Config::ConnectWithoutContext("/NodeList/*/$ns3::ndn::L3Protocol/OutInterests", MakeCallback(&FixtureWithTracers::OutInterests, this));
-
-  Config::ConnectWithoutContext("/NodeList/*/$ns3::ndn::L3Protocol/InData", MakeCallback(&FixtureWithTracers::InData, this));
-  Config::ConnectWithoutContext("/NodeList/*/$ns3::ndn::L3Protocol/OutData", MakeCallback(&FixtureWithTracers::OutData, this));
-
-  // TODO: implement Nack testing
-  // Config::Connect("/NodeList/*/InNacks", ...);
-  // Config::Connect("/NodeList/*/OutNacks", ...);
-
-  Simulator::Stop(Seconds(20.001));
-  Simulator::Run();
-
-  BOOST_CHECK_EQUAL(getFace("1", "2")->getCounters().nInInterests, 0);
-  BOOST_CHECK_EQUAL(getFace("1", "2")->getCounters().nOutInterests, 100);
-  BOOST_CHECK_EQUAL(getFace("1", "2")->getCounters().nInData, 100);
-  BOOST_CHECK_EQUAL(getFace("1", "2")->getCounters().nOutData, 0);
-  BOOST_CHECK_EQUAL(getFace("1", "2")->getCounters().nInNacks, 0);
-  BOOST_CHECK_EQUAL(getFace("1", "2")->getCounters().nOutNacks, 0);
-
-  BOOST_CHECK_EQUAL(nInInterests [boost::lexical_cast<std::string>(*getFace("1", "2"))], 0);
-  BOOST_CHECK_EQUAL(nOutInterests[boost::lexical_cast<std::string>(*getFace("1", "2"))], 100);
-  BOOST_CHECK_EQUAL(nInData      [boost::lexical_cast<std::string>(*getFace("1", "2"))], 100);
-  BOOST_CHECK_EQUAL(nOutData     [boost::lexical_cast<std::string>(*getFace("1", "2"))], 0);
-  // TODO add nacks
-
-  BOOST_CHECK_EQUAL(getFace("2", "1")->getCounters().nInInterests, 100);
-  BOOST_CHECK_EQUAL(getFace("2", "1")->getCounters().nOutInterests, 0);
-  BOOST_CHECK_EQUAL(getFace("2", "1")->getCounters().nInData, 0);
-  BOOST_CHECK_EQUAL(getFace("2", "1")->getCounters().nOutData, 100);
-  BOOST_CHECK_EQUAL(getFace("2", "1")->getCounters().nInNacks, 0);
-  BOOST_CHECK_EQUAL(getFace("2", "1")->getCounters().nOutNacks, 0);
-
-  BOOST_CHECK_EQUAL(nInInterests [boost::lexical_cast<std::string>(*getFace("2", "1"))], 100);
-  BOOST_CHECK_EQUAL(nOutInterests[boost::lexical_cast<std::string>(*getFace("2", "1"))], 0);
-  BOOST_CHECK_EQUAL(nInData      [boost::lexical_cast<std::string>(*getFace("2", "1"))], 0);
-  BOOST_CHECK_EQUAL(nOutData     [boost::lexical_cast<std::string>(*getFace("2", "1"))], 100);
-  // TODO add nacks
-
-  BOOST_CHECK_EQUAL(boost::lexical_cast<std::string>(*getFace("1", "2")), "netdev://[00:00:00:ff:ff:01]");
-  BOOST_CHECK_EQUAL(boost::lexical_cast<std::string>(*getFace("2", "1")), "netdev://[00:00:00:ff:ff:02]");
-
-  BOOST_CHECK_EQUAL(boost::lexical_cast<std::string>(getFace("1", "2")->getLocalUri()),  "netdev://[00:00:00:ff:ff:01]");
-  BOOST_CHECK_EQUAL(boost::lexical_cast<std::string>(getFace("1", "2")->getRemoteUri()), "netdev://[00:00:00:ff:ff:02]");
-  BOOST_CHECK_EQUAL(boost::lexical_cast<std::string>(getFace("2", "1")->getLocalUri()),  "netdev://[00:00:00:ff:ff:02]");
-  BOOST_CHECK_EQUAL(boost::lexical_cast<std::string>(getFace("2", "1")->getRemoteUri()), "netdev://[00:00:00:ff:ff:01]");
-}
-
-BOOST_AUTO_TEST_SUITE_END()
-
-} // namespace ndn
-} // namespace ns3
diff --git a/tests/unit-tests/model/ndn-ns3.t.cpp b/tests/unit-tests/model/ndn-ns3.t.cpp
deleted file mode 100644
index bd94360..0000000
--- a/tests/unit-tests/model/ndn-ns3.t.cpp
+++ /dev/null
@@ -1,60 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2011-2015  Regents of the University of California.
- *
- * This file is part of ndnSIM. See AUTHORS for complete list of ndnSIM authors and
- * contributors.
- *
- * ndnSIM 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.
- *
- * ndnSIM 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
- * ndnSIM, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
-
-#include "model/ndn-ns3.hpp"
-#include "helper/ndn-stack-helper.hpp"
-#include "model/ndn-header.hpp"
-#include "utils/ndn-ns3-packet-tag.hpp"
-
-#include <ndn-cxx/encoding/block.hpp>
-#include <ndn-cxx/interest.hpp>
-#include <ndn-cxx/data.hpp>
-#include <ndn-cxx/name.hpp>
-
-#include "../tests-common.hpp"
-
-namespace ns3 {
-namespace ndn {
-
-BOOST_FIXTURE_TEST_SUITE(ModelNdnNs3, CleanupFixture)
-
-BOOST_AUTO_TEST_CASE(ToPacket)
-{
-  auto interest = make_shared<ndn::Interest>("/prefix");
-  Ptr<Packet> interestPacket = Convert::ToPacket(*interest);
-  uint32_t type1;
-  type1 = Convert::getPacketType(interestPacket);
-
-  BOOST_CHECK_EQUAL(type1, ::ndn::tlv::Interest);
-
-  auto data = std::make_shared<ndn::Data>(interest->getName());
-  data->setFreshnessPeriod(ndn::time::milliseconds(1000));
-  data->setContent(std::make_shared< ::ndn::Buffer>(1024));
-  ndn::StackHelper::getKeyChain().sign(*data);
-  Ptr<Packet> DataPacket = Convert::ToPacket(*data);
-  uint32_t type2;
-  type2 = Convert::getPacketType(DataPacket);
-
-  BOOST_CHECK_EQUAL(type2, ::ndn::tlv::Data);
-}
-
-BOOST_AUTO_TEST_SUITE_END()
-
-} // namespace ndn
-} // namespace ns3
