diff --git a/tests/unit-tests/model/ndn-header.t.cpp b/tests/unit-tests/model/ndn-header.t.cpp
new file mode 100644
index 0000000..3776c8a
--- /dev/null
+++ b/tests/unit-tests/model/ndn-header.t.cpp
@@ -0,0 +1,53 @@
+/* -*- 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
new file mode 100644
index 0000000..23a6406
--- /dev/null
+++ b/tests/unit-tests/model/ndn-net-device-face.t.cpp
@@ -0,0 +1,138 @@
+/* -*- 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-face.hpp"
+#include "model/ndn-l3-protocol.hpp"
+#include "model/ndn-ns3.hpp"
+#include "NFD/daemon/face/face-counters.hpp"
+
+#include <ndn-cxx/management/nfd-face-status.hpp>
+
+#include "ns3/net-device.h"
+#include "ns3/log.h"
+#include "ns3/packet.h"
+#include "ns3/node.h"
+#include "ns3/pointer.h"
+#include "ns3/point-to-point-net-device.h"
+#include "ns3/channel.h"
+#include "ndn-face-container.hpp"
+#include "ns3/node-container.h"
+
+#include "ns3/core-module.h"
+#include "ns3/network-module.h"
+#include "ns3/point-to-point-module.h"
+#include "ns3/ndnSIM-module.h"
+
+#include "../tests-common.hpp"
+
+namespace ns3 {
+namespace ndn {
+
+BOOST_FIXTURE_TEST_SUITE(ModelNdnNetDeviceFace, CleanupFixture)
+
+BOOST_AUTO_TEST_CASE(SendInterest)
+{
+  NodeContainer nodes;
+  nodes.Create(2);
+  PointToPointHelper p2p;
+  p2p.Install(nodes.Get(0), nodes.Get(1));
+
+  StackHelper ndnHelper;
+  ndnHelper.SetDefaultRoutes(true);
+
+  Ptr<FaceContainer> node0_faceContainer = ndnHelper.InstallAll();
+
+  ndn::AppHelper consumerHelper("ns3::ndn::ConsumerCbr");
+  consumerHelper.SetPrefix("/prefix");
+  consumerHelper.SetAttribute("Frequency", StringValue("100")); // 100 interests a second
+  consumerHelper.Install(nodes.Get(0));
+
+  ndn::AppHelper producerHelper("ns3::ndn::Producer");
+  producerHelper.SetPrefix("/prefix");
+  producerHelper.SetAttribute("PayloadSize", StringValue("1024"));
+  producerHelper.Install(nodes.Get(1));
+
+  FaceContainer::Iterator node1Face_iterator = node0_faceContainer->Begin() + 1;
+
+  auto node1_netDeviceFace = std::dynamic_pointer_cast<NetDeviceFace>(node0_faceContainer->Get(node1Face_iterator));
+
+  Simulator::Stop(Seconds(20.0));
+  Simulator::Run();
+
+  ::ndn::nfd::FaceStatus faceStatus = node1_netDeviceFace->getFaceStatus();
+  BOOST_CHECK_EQUAL(faceStatus.getNInInterests(), 2000);
+  Simulator::Destroy();
+}
+
+BOOST_AUTO_TEST_CASE(SendData)
+{
+
+ NodeContainer nodes;
+ nodes.Create(2);
+ PointToPointHelper p2p;
+ p2p.Install(nodes.Get(0), nodes.Get(1));
+
+
+ StackHelper ndnHelper;
+ ndnHelper.SetDefaultRoutes(true);
+
+ Ptr<FaceContainer> node0_faceContainer = ndnHelper.InstallAll();
+
+ ndn::AppHelper consumerHelper("ns3::ndn::ConsumerCbr");
+ consumerHelper.SetPrefix("/prefix");
+ consumerHelper.SetAttribute("Frequency", StringValue("10"));
+ consumerHelper.Install(nodes.Get(0));
+
+ ndn::AppHelper producerHelper("ns3::ndn::Producer");
+ producerHelper.SetPrefix("/prefix");
+ producerHelper.SetAttribute("PayloadSize", StringValue("1024"));
+ producerHelper.Install(nodes.Get(1));
+
+ FaceContainer::Iterator node0Face_iterator = node0_faceContainer->Begin();
+ FaceContainer::Iterator node1Face_iterator = node0_faceContainer->Begin() + 1;
+
+ auto node0_netDeviceFace = std::dynamic_pointer_cast<NetDeviceFace>(node0_faceContainer->Get(node0Face_iterator));
+ auto node1_netDeviceFace = std::dynamic_pointer_cast<NetDeviceFace>(node0_faceContainer->Get(node1Face_iterator));
+
+ auto interest = std::make_shared<ndn::Interest>("/prefix");
+ UniformVariable rand(0, std::numeric_limits<uint32_t>::max());
+ interest->setNonce(rand.GetValue());
+ interest->setInterestLifetime(ndn::time::seconds(1));
+
+ 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);
+
+ node1_netDeviceFace->sendData(*data);
+
+ Simulator::Stop(Seconds(20.0));
+ Simulator::Run();
+
+ ::ndn::nfd::FaceStatus node0faceStatus = node0_netDeviceFace->getFaceStatus();
+ ::ndn::nfd::FaceStatus node1faceStatus = node1_netDeviceFace->getFaceStatus();
+ BOOST_CHECK_EQUAL(node1faceStatus.getNOutDatas(), 201);
+ Simulator::Destroy();
+}
+
+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
new file mode 100644
index 0000000..bd94360
--- /dev/null
+++ b/tests/unit-tests/model/ndn-ns3.t.cpp
@@ -0,0 +1,60 @@
+/* -*- 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
