diff --git a/model/cs/content-store-impl.hpp b/model/cs/content-store-impl.hpp
index b35fdb4..4692486 100644
--- a/model/cs/content-store-impl.hpp
+++ b/model/cs/content-store-impl.hpp
@@ -21,11 +21,11 @@
 #ifndef NDN_CONTENT_STORE_IMPL_H_
 #define NDN_CONTENT_STORE_IMPL_H_
 
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
 #include "ndn-content-store.hpp"
 
 #include "ns3/packet.h"
-#include "ns3/ndn-interest.h"
-#include "ns3/ndn-data.h"
 #include <boost/foreach.hpp>
 
 #include "ns3/log.h"
@@ -48,7 +48,7 @@
   typedef Entry base_type;
 
 public:
-  EntryImpl(Ptr<ContentStore> cs, Ptr<const Data> data)
+  EntryImpl(Ptr<ContentStore> cs, shared_ptr<const Data> data)
     : Entry(cs, data)
     , item_(0)
   {
@@ -103,14 +103,14 @@
 
   // from ContentStore
 
-  virtual inline Ptr<Data>
-  Lookup(Ptr<const Interest> interest);
+  virtual inline shared_ptr<Data>
+  Lookup(shared_ptr<const Interest> interest);
 
   virtual inline bool
-  Add(Ptr<const Data> data);
+  Add(shared_ptr<const Data> data);
 
   // virtual bool
-  // Remove (Ptr<Interest> header);
+  // Remove (shared_ptr<Interest> header);
 
   virtual inline void
   Print(std::ostream& os) const;
@@ -200,8 +200,8 @@
 };
 
 template<class Policy>
-Ptr<Data>
-ContentStoreImpl<Policy>::Lookup(Ptr<const Interest> interest)
+shared_ptr<Data>
+ContentStoreImpl<Policy>::Lookup(shared_ptr<const Interest> interest)
 {
   NS_LOG_FUNCTION(this << interest->GetName());
 
@@ -217,7 +217,7 @@
   if (node != this->end()) {
     this->m_cacheHitsTrace(interest, node->payload()->GetData());
 
-    Ptr<Data> copy = Create<Data>(*node->payload()->GetData());
+    shared_ptr<Data> copy = make_shared<Data>(*node->payload()->GetData());
     ConstCast<Packet>(copy->GetPayload())->RemoveAllPacketTags();
     return copy;
   }
@@ -229,7 +229,7 @@
 
 template<class Policy>
 bool
-ContentStoreImpl<Policy>::Add(Ptr<const Data> data)
+ContentStoreImpl<Policy>::Add(shared_ptr<const Data> data)
 {
   NS_LOG_FUNCTION(this << data->GetName());
 
diff --git a/model/cs/content-store-nocache.cpp b/model/cs/content-store-nocache.cpp
index 85505d1..9aef87b 100644
--- a/model/cs/content-store-nocache.cpp
+++ b/model/cs/content-store-nocache.cpp
@@ -52,15 +52,15 @@
 {
 }
 
-Ptr<Data>
-Nocache::Lookup(Ptr<const Interest> interest)
+shared_ptr<Data>
+Nocache::Lookup(shared_ptr<const Interest> interest)
 {
   this->m_cacheMissesTrace(interest);
   return 0;
 }
 
 bool
-Nocache::Add(Ptr<const Data> data)
+Nocache::Add(shared_ptr<const Data> data)
 {
   return false;
 }
diff --git a/model/cs/content-store-nocache.hpp b/model/cs/content-store-nocache.hpp
index 5745821..bf271cb 100644
--- a/model/cs/content-store-nocache.hpp
+++ b/model/cs/content-store-nocache.hpp
@@ -22,6 +22,8 @@
 #ifndef NDN_CONTENT_STORE_NOCACHE_H
 #define NDN_CONTENT_STORE_NOCACHE_H
 
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
 #include "ns3/ndnSIM/model/cs/ndn-content-store.hpp"
 
 namespace ns3 {
@@ -52,11 +54,11 @@
    */
   virtual ~Nocache();
 
-  virtual Ptr<Data>
-  Lookup(Ptr<const Interest> interest);
+  virtual shared_ptr<Data>
+  Lookup(shared_ptr<const Interest> interest);
 
   virtual bool
-  Add(Ptr<const Data> data);
+  Add(shared_ptr<const Data> data);
 
   virtual void
   Print(std::ostream& os) const;
diff --git a/model/cs/content-store-with-freshness.hpp b/model/cs/content-store-with-freshness.hpp
index 07aa56f..836a94f 100644
--- a/model/cs/content-store-with-freshness.hpp
+++ b/model/cs/content-store-with-freshness.hpp
@@ -21,7 +21,7 @@
 #ifndef NDN_CONTENT_STORE_WITH_FRESHNESS_H_
 #define NDN_CONTENT_STORE_WITH_FRESHNESS_H_
 
-#include "content-store-impl.h"
+#include "ns3/ndnSIM/model/ndn-common.hpp"
 
 #include "content-store-impl.hpp"
 
@@ -57,7 +57,7 @@
   Print(std::ostream& os) const;
 
   virtual inline bool
-  Add(Ptr<const Data> data);
+  Add(shared_ptr<const Data> data);
 
 private:
   inline void
@@ -98,7 +98,7 @@
 
 template<class Policy>
 inline bool
-ContentStoreWithFreshness<Policy>::Add(Ptr<const Data> data)
+ContentStoreWithFreshness<Policy>::Add(shared_ptr<const Data> data)
 {
   bool ok = super::Add(data);
   if (!ok)
diff --git a/model/cs/content-store-with-probability.hpp b/model/cs/content-store-with-probability.hpp
index cca50c1..b442e4a 100644
--- a/model/cs/content-store-with-probability.hpp
+++ b/model/cs/content-store-with-probability.hpp
@@ -21,7 +21,7 @@
 #ifndef NDN_CONTENT_STORE_WITH_PROBABILITY_H_
 #define NDN_CONTENT_STORE_WITH_PROBABILITY_H_
 
-#include "content-store-impl.h"
+#include "ns3/ndnSIM/model/ndn-common.hpp"
 
 #include "content-store-impl.hpp"
 
diff --git a/model/cs/content-store-with-stats.hpp b/model/cs/content-store-with-stats.hpp
index b5f7540..f1ba5b2 100644
--- a/model/cs/content-store-with-stats.hpp
+++ b/model/cs/content-store-with-stats.hpp
@@ -21,7 +21,7 @@
 #ifndef NDN_CONTENT_STORE_WITH_STATS_H_
 #define NDN_CONTENT_STORE_WITH_STATS_H_
 
-#include "content-store-impl.h"
+#include "ns3/ndnSIM/model/ndn-common.hpp"
 
 #include "content-store-impl.hpp"
 
diff --git a/model/cs/custom-policies/freshness-policy.hpp b/model/cs/custom-policies/freshness-policy.hpp
index 999c61d..9d66c66 100644
--- a/model/cs/custom-policies/freshness-policy.hpp
+++ b/model/cs/custom-policies/freshness-policy.hpp
@@ -21,6 +21,8 @@
 #ifndef FRESHNESS_POLICY_H_
 #define FRESHNESS_POLICY_H_
 
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
 #include <boost/intrusive/options.hpp>
 #include <boost/intrusive/list.hpp>
 
diff --git a/model/cs/custom-policies/lifetime-stats-policy.hpp b/model/cs/custom-policies/lifetime-stats-policy.hpp
index 1102ef1..1abf39d 100644
--- a/model/cs/custom-policies/lifetime-stats-policy.hpp
+++ b/model/cs/custom-policies/lifetime-stats-policy.hpp
@@ -21,6 +21,8 @@
 #ifndef LIFETIME_STATS_POLICY_H_
 #define LIFETIME_STATS_POLICY_H_
 
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
 #include <boost/intrusive/options.hpp>
 #include <boost/intrusive/list.hpp>
 
diff --git a/model/cs/custom-policies/probability-policy.hpp b/model/cs/custom-policies/probability-policy.hpp
index 57d6835..8638c0a 100644
--- a/model/cs/custom-policies/probability-policy.hpp
+++ b/model/cs/custom-policies/probability-policy.hpp
@@ -21,6 +21,8 @@
 #ifndef PROBABILITY_POLICY_H_
 #define PROBABILITY_POLICY_H_
 
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
 #include <boost/intrusive/options.hpp>
 #include <boost/intrusive/list.hpp>
 
diff --git a/model/cs/ndn-content-store.cpp b/model/cs/ndn-content-store.cpp
index 3588eb9..8df04c6 100644
--- a/model/cs/ndn-content-store.cpp
+++ b/model/cs/ndn-content-store.cpp
@@ -57,7 +57,7 @@
 
 //////////////////////////////////////////////////////////////////////
 
-Entry::Entry(Ptr<ContentStore> cs, Ptr<const Data> data)
+Entry::Entry(Ptr<ContentStore> cs, shared_ptr<const Data> data)
   : m_cs(cs)
   , m_data(data)
 {
@@ -69,7 +69,7 @@
   return m_data->GetName();
 }
 
-Ptr<const Data>
+shared_ptr<const Data>
 Entry::GetData() const
 {
   return m_data;
diff --git a/model/cs/ndn-content-store.hpp b/model/cs/ndn-content-store.hpp
index 23266c4..e28eea0 100644
--- a/model/cs/ndn-content-store.hpp
+++ b/model/cs/ndn-content-store.hpp
@@ -22,6 +22,8 @@
 #ifndef NDN_CONTENT_STORE_H
 #define NDN_CONTENT_STORE_H
 
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
 #include "ns3/object.h"
 #include "ns3/ptr.h"
 #include "ns3/traced-callback.h"
@@ -65,7 +67,7 @@
    * The constructor will make a copy of the supplied packet and calls
    * RemoveHeader and RemoveTail on the copy.
    */
-  Entry(Ptr<ContentStore> cs, Ptr<const Data> data);
+  Entry(Ptr<ContentStore> cs, shared_ptr<const Data> data);
 
   /**
    * \brief Get prefix of the stored entry
@@ -78,7 +80,7 @@
    * \brief Get Data of the stored entry
    * \returns Data of the stored entry
    */
-  Ptr<const Data>
+  shared_ptr<const Data>
   GetData() const;
 
   /**
@@ -89,7 +91,7 @@
 
 private:
   Ptr<ContentStore> m_cs; ///< \brief content store to which entry is added
-  Ptr<const Data> m_data; ///< \brief non-modifiable Data
+  shared_ptr<const Data> m_data; ///< \brief non-modifiable Data
 };
 
 } // namespace cs
@@ -124,8 +126,8 @@
    * If an entry is found, it is promoted to the top of most recent
    * used entries index, \see m_contentStore
    */
-  virtual Ptr<Data>
-  Lookup(Ptr<const Interest> interest) = 0;
+  virtual shared_ptr<Data>
+  Lookup(shared_ptr<const Interest> interest) = 0;
 
   /**
    * \brief Add a new content to the content store.
@@ -136,7 +138,7 @@
    * @returns true if an existing entry was updated, false otherwise
    */
   virtual bool
-  Add(Ptr<const Data> data) = 0;
+  Add(shared_ptr<const Data> data) = 0;
 
   // /*
   //  * \brief Add a new content to the content store.
@@ -145,7 +147,7 @@
   //  * @returns true if an existing entry was removed, false otherwise
   //  */
   // virtual bool
-  // Remove (Ptr<Interest> header) = 0;
+  // Remove (shared_ptr<Interest> header) = 0;
 
   /**
    * \brief Print out content store entries
@@ -187,10 +189,10 @@
   GetContentStore(Ptr<Object> node);
 
 protected:
-  TracedCallback<Ptr<const Interest>,
-                 Ptr<const Data>> m_cacheHitsTrace; ///< @brief trace of cache hits
+  TracedCallback<shared_ptr<const Interest>,
+                 shared_ptr<const Data>> m_cacheHitsTrace; ///< @brief trace of cache hits
 
-  TracedCallback<Ptr<const Interest>> m_cacheMissesTrace; ///< @brief trace of cache misses
+  TracedCallback<shared_ptr<const Interest>> m_cacheMissesTrace; ///< @brief trace of cache misses
 };
 
 inline std::ostream&
diff --git a/model/ip-faces/ndn-ip-face-stack.hpp b/model/ip-faces/ndn-ip-face-stack.hpp
index a9322c6..577ad5a 100644
--- a/model/ip-faces/ndn-ip-face-stack.hpp
+++ b/model/ip-faces/ndn-ip-face-stack.hpp
@@ -22,11 +22,12 @@
 #ifndef NDN_IP_FACE_STACK_H
 #define NDN_IP_FACE_STACK_H
 
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
 #include "ns3/application.h"
 #include "ns3/socket.h"
 #include "ns3/inet-socket-address.h"
 #include "ns3/ptr.h"
-#include "ns3/ndn-name.hpp"
 
 #include <map>
 
diff --git a/model/ip-faces/ndn-ip-faces-helper.hpp b/model/ip-faces/ndn-ip-faces-helper.hpp
index 928a766..b167437 100644
--- a/model/ip-faces/ndn-ip-faces-helper.hpp
+++ b/model/ip-faces/ndn-ip-faces-helper.hpp
@@ -22,6 +22,8 @@
 #ifndef NDN_IP_FACES_HELPER_H
 #define NDN_IP_FACES_HELPER_H
 
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
 #include "ns3/ptr.h"
 #include "ns3/nstime.h"
 #include "ns3/ipv4-address.h"
diff --git a/model/ip-faces/ndn-tcp-face.cpp b/model/ip-faces/ndn-tcp-face.cpp
index 701ad64..9f24986 100644
--- a/model/ip-faces/ndn-tcp-face.cpp
+++ b/model/ip-faces/ndn-tcp-face.cpp
@@ -30,8 +30,6 @@
 #include "ns3/pointer.h"
 #include "ns3/tcp-socket-factory.h"
 
-#include "ns3/ndn-name.hpp"
-
 using namespace std;
 
 NS_LOG_COMPONENT_DEFINE("ndn.TcpFace");
diff --git a/model/ip-faces/ndn-tcp-face.hpp b/model/ip-faces/ndn-tcp-face.hpp
index 0543bd5..9f1ad88 100644
--- a/model/ip-faces/ndn-tcp-face.hpp
+++ b/model/ip-faces/ndn-tcp-face.hpp
@@ -21,6 +21,8 @@
 #ifndef NDN_TCP_FACE_H
 #define NDN_TCP_FACE_H
 
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
 #include "ns3/ndn-face.hpp"
 #include "ns3/socket.h"
 #include "ns3/ptr.h"
diff --git a/model/ip-faces/ndn-udp-face.cpp b/model/ip-faces/ndn-udp-face.cpp
index fed972c..414ccd8 100644
--- a/model/ip-faces/ndn-udp-face.cpp
+++ b/model/ip-faces/ndn-udp-face.cpp
@@ -28,8 +28,6 @@
 #include "ns3/pointer.h"
 #include "ns3/udp-socket-factory.h"
 
-#include "ns3/ndn-name.hpp"
-
 using namespace std;
 
 NS_LOG_COMPONENT_DEFINE("ndn.UdpFace");
diff --git a/model/ip-faces/ndn-udp-face.hpp b/model/ip-faces/ndn-udp-face.hpp
index f0c3293..ec97c99 100644
--- a/model/ip-faces/ndn-udp-face.hpp
+++ b/model/ip-faces/ndn-udp-face.hpp
@@ -21,6 +21,8 @@
 #ifndef NDN_UDP_FACE_H
 #define NDN_UDP_FACE_H
 
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
 #include "ns3/ndn-face.hpp"
 #include "ns3/socket.h"
 #include "ns3/ptr.h"
diff --git a/model/ndn-app-face.cpp b/model/ndn-app-face.cpp
index d267f6b..bc788e9 100644
--- a/model/ndn-app-face.cpp
+++ b/model/ndn-app-face.cpp
@@ -31,9 +31,6 @@
 #include "ns3/ndn-header-helper.hpp"
 #include "ns3/ndn-app.hpp"
 
-#include "ndn-interest.hpp"
-#include "ndn-data.hpp"
-
 NS_LOG_COMPONENT_DEFINE("ndn.AppFace");
 
 namespace ns3 {
@@ -80,7 +77,7 @@
 }
 
 bool
-AppFace::SendInterest(Ptr<const Interest> interest)
+AppFace::SendInterest(shared_ptr<const Interest> interest)
 {
   NS_LOG_FUNCTION(this << interest);
 
@@ -88,16 +85,13 @@
     return false;
   }
 
-  if (interest->GetNack() > 0)
-    m_app->OnNack(interest);
-  else
-    m_app->OnInterest(interest);
+  m_app->OnInterest(interest);
 
   return true;
 }
 
 bool
-AppFace::SendData(Ptr<const Data> data)
+AppFace::SendData(shared_ptr<const Data> data)
 {
   NS_LOG_FUNCTION(this << data);
 
diff --git a/model/ndn-app-face.hpp b/model/ndn-app-face.hpp
index 6d8be19..3e06597 100644
--- a/model/ndn-app-face.hpp
+++ b/model/ndn-app-face.hpp
@@ -22,6 +22,8 @@
 #ifndef NDN_APP_FACE_H
 #define NDN_APP_FACE_H
 
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
 #include "ndn-face.hpp"
 #include "ns3/traced-callback.h"
 
@@ -31,12 +33,6 @@
 
 namespace ndn {
 
-class Interest;
-class Data;
-
-typedef Interest InterestHeader;
-typedef Data DataHeader;
-
 class App;
 
 /**
@@ -63,10 +59,10 @@
   ////////////////////////////////////////////////////////////////////
   // methods overloaded from Face
   virtual bool
-  SendInterest(Ptr<const Interest> interest);
+  SendInterest(shared_ptr<const Interest> interest);
 
   virtual bool
-  SendData(Ptr<const Data> data);
+  SendData(shared_ptr<const Data> data);
 
 public:
   virtual std::ostream&
@@ -76,6 +72,7 @@
 private:
   AppFace();
   AppFace(const AppFace&); ///< \brief Disabled copy constructor
+
   AppFace&
   operator=(const AppFace&); ///< \brief Disabled copy operator
 
diff --git a/model/ndn-common.hpp b/model/ndn-common.hpp
index f5da38b..32fd44f 100644
--- a/model/ndn-common.hpp
+++ b/model/ndn-common.hpp
@@ -1,12 +1,21 @@
-/** -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2013, Regents of the University of California
- *                     Alexander Afanasyev
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2011-2014  Regents of the University of California.
  *
- * BSD license, See the doc/LICENSE file for more information
+ * This file is part of ndnSIM. See AUTHORS for complete list of ndnSIM authors and
+ * contributors.
  *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
+ * 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/>.
+ **/
 
 #ifndef NDN_COMMON_H
 #define NDN_COMMON_H
@@ -14,40 +23,34 @@
 #include "ns3/nstime.h"
 #include "ns3/simulator.h"
 
-#define NDNSIM_MODE 1
+#include "ndn-ns3.hpp"
 
-#define NDN_NAMESPACE_BEGIN                                                                        \
-  namespace ns3 {                                                                                  \
-  namespace ndn {
-#define NDN_NAMESPACE_END                                                                          \
-  } /*ndn*/                                                                                        \
-  } /*ns3*/
+#include <ndn-cxx/interest.hpp>
+#include <ndn-cxx/encoding/block.hpp>
+#include <ndn-cxx/signature.hpp>
+#include <ndn-cxx/signature-info.hpp>
+#include <ndn-cxx/name.hpp>
+#include <ndn-cxx/data.hpp>
+#include <ndn-cxx/security/key-chain.hpp>
 
-/**
- * @brief NS-3 namespace
- */
 namespace ns3 {
-
-/**
- * @brief ndnSIM namespace
- */
 namespace ndn {
-}
-}
 
-NDN_NAMESPACE_BEGIN
+using ::ndn::Name;
+namespace name = ::ndn::name;
 
-typedef Time TimeInterval;
+using std::shared_ptr;
+using std::make_shared;
 
-namespace time {
+using ::ndn::Interest;
+using ::ndn::Data;
+using ::ndn::KeyLocator;
+using ::ndn::Signature;
+using ::ndn::SignatureInfo;
+using ::ndn::Block;
+using ::ndn::KeyChain;
 
-inline Time
-NowUnixTimestamp()
-{
-  return Simulator::Now();
-}
-}
-
-NDN_NAMESPACE_END
+} // namespace ndn
+} // namespace ns3
 
 #endif // NDN_COMMON_H
diff --git a/model/ndn-face.cpp b/model/ndn-face.cpp
deleted file mode 100644
index 505c2b4..0000000
--- a/model/ndn-face.cpp
+++ /dev/null
@@ -1,276 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2011 University of California, Los Angeles
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program 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 this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- *
- */
-
-#include "ndn-face.hpp"
-
-#include "ns3/packet.h"
-#include "ns3/log.h"
-#include "ns3/node.h"
-#include "ns3/assert.h"
-#include "ns3/uinteger.h"
-#include "ns3/double.h"
-#include "ns3/boolean.h"
-#include "ns3/simulator.h"
-#include "ns3/random-variable.h"
-#include "ns3/pointer.h"
-
-#include "ns3/ndn-header-helper.hpp"
-#include "ns3/ndnSIM/utils/ndn-fw-hop-count-tag.hpp"
-
-#include "ns3/ndn-wire.h"
-
-#include <boost/ref.hpp>
-
-NS_LOG_COMPONENT_DEFINE("ndn.Face");
-
-namespace ns3 {
-namespace ndn {
-
-NS_OBJECT_ENSURE_REGISTERED(Face);
-
-TypeId
-Face::GetTypeId()
-{
-  static TypeId tid =
-    TypeId("ns3::ndn::Face")
-      .SetParent<Object>()
-      .SetGroupName("Ndn")
-      .AddAttribute("Id", "Face id (unique integer for the Ndn stack on this node)",
-                    TypeId::ATTR_GET, // allow only getting it.
-                    UintegerValue(0), MakeUintegerAccessor(&Face::m_id),
-                    MakeUintegerChecker<uint32_t>());
-  return tid;
-}
-
-/**
- * By default, Ndn face are created in the "down" state
- *  with no IP addresses.  Before becoming useable, the user must
- * invoke SetUp on them once an Ndn address and mask have been set.
- */
-Face::Face(Ptr<Node> node)
-  : m_node(node)
-  , m_upstreamInterestHandler(MakeNullCallback<void, Ptr<Face>, Ptr<Interest>>())
-  , m_upstreamDataHandler(MakeNullCallback<void, Ptr<Face>, Ptr<Data>>())
-  , m_ifup(false)
-  , m_id((uint32_t)-1)
-  , m_metric(0)
-  , m_flags(0)
-{
-  NS_LOG_FUNCTION(this << node);
-
-  NS_ASSERT_MSG(node != 0, "node cannot be NULL. Check the code");
-}
-
-Face::~Face()
-{
-  NS_LOG_FUNCTION_NOARGS();
-}
-
-Face::Face(const Face&)
-{
-}
-
-Face& Face::operator= (const Face &)
-{
-  return *this;
-}
-
-Ptr<Node>
-Face::GetNode() const
-{
-  return m_node;
-}
-
-void
-Face::RegisterProtocolHandlers(const InterestHandler& interestHandler,
-                               const DataHandler& dataHandler)
-{
-  NS_LOG_FUNCTION_NOARGS();
-
-  m_upstreamInterestHandler = interestHandler;
-  m_upstreamDataHandler = dataHandler;
-}
-
-void
-Face::UnRegisterProtocolHandlers()
-{
-  NS_LOG_FUNCTION_NOARGS();
-
-  m_upstreamInterestHandler = MakeNullCallback<void, Ptr<Face>, Ptr<Interest>>();
-  m_upstreamDataHandler = MakeNullCallback<void, Ptr<Face>, Ptr<Data>>();
-}
-
-bool
-Face::SendInterest(Ptr<const Interest> interest)
-{
-  NS_LOG_FUNCTION(this << boost::cref(*this) << interest->GetName());
-
-  if (!IsUp()) {
-    return false;
-  }
-
-  return Send(Wire::FromInterest(interest));
-}
-
-bool
-Face::SendData(Ptr<const Data> data)
-{
-  NS_LOG_FUNCTION(this << data);
-
-  if (!IsUp()) {
-    return false;
-  }
-
-  return Send(Wire::FromData(data));
-}
-
-bool
-Face::Send(Ptr<Packet> packet)
-{
-  FwHopCountTag hopCount;
-  bool tagExists = packet->RemovePacketTag(hopCount);
-  if (tagExists) {
-    hopCount.Increment();
-    packet->AddPacketTag(hopCount);
-  }
-
-  return true;
-}
-
-bool
-Face::Receive(Ptr<const Packet> p)
-{
-  NS_LOG_FUNCTION(this << p << p->GetSize());
-
-  if (!IsUp()) {
-    // no tracing here. If we were off while receiving, we shouldn't even know that something was
-    // there
-    return false;
-  }
-
-  Ptr<Packet> packet = p->Copy(); // give upper layers a rw copy of the packet
-  try {
-    HeaderHelper::Type type = HeaderHelper::GetNdnHeaderType(packet);
-    switch (type) {
-    case HeaderHelper::INTEREST_NDNSIM:
-      return ReceiveInterest(Wire::ToInterest(packet, Wire::WIRE_FORMAT_NDNSIM));
-    case HeaderHelper::INTEREST_CCNB:
-      return ReceiveInterest(Wire::ToInterest(packet, Wire::WIRE_FORMAT_CCNB));
-    case HeaderHelper::CONTENT_OBJECT_NDNSIM:
-      return ReceiveData(Wire::ToData(packet, Wire::WIRE_FORMAT_NDNSIM));
-    case HeaderHelper::CONTENT_OBJECT_CCNB:
-      return ReceiveData(Wire::ToData(packet, Wire::WIRE_FORMAT_CCNB));
-    default:
-      NS_FATAL_ERROR("Not supported NDN header");
-      return false;
-    }
-
-    // exception will be thrown if packet is not recognized
-  }
-  catch (UnknownHeaderException) {
-    NS_FATAL_ERROR("Unknown NDN header. Should not happen");
-    return false;
-  }
-
-  return false;
-}
-
-bool
-Face::ReceiveInterest(Ptr<Interest> interest)
-{
-  if (!IsUp()) {
-    // no tracing here. If we were off while receiving, we shouldn't even know that something was
-    // there
-    return false;
-  }
-
-  m_upstreamInterestHandler(this, interest);
-  return true;
-}
-
-bool
-Face::ReceiveData(Ptr<Data> data)
-{
-  if (!IsUp()) {
-    // no tracing here. If we were off while receiving, we shouldn't even know that something was
-    // there
-    return false;
-  }
-
-  m_upstreamDataHandler(this, data);
-  return true;
-}
-
-void
-Face::SetMetric(uint16_t metric)
-{
-  NS_LOG_FUNCTION(metric);
-  m_metric = metric;
-}
-
-uint16_t
-Face::GetMetric(void) const
-{
-  return m_metric;
-}
-
-void
-Face::SetFlags(uint32_t flags)
-{
-  m_flags = flags;
-}
-
-bool
-Face::operator== (const Face &face) const
-{
-  NS_ASSERT_MSG(m_node->GetId() == face.m_node->GetId(),
-                "Faces of different nodes should not be compared to each other: " << *this << " == "
-                                                                                  << face);
-
-  return (m_id == face.m_id);
-}
-
-bool
-Face::operator< (const Face &face) const
-{
-  NS_ASSERT_MSG(m_node->GetId() == face.m_node->GetId(),
-                "Faces of different nodes should not be compared to each other: " << *this << " == "
-                                                                                  << face);
-
-  return (m_id < face.m_id);
-}
-
-std::ostream&
-Face::Print(std::ostream& os) const
-{
-  os << "id=" << GetId();
-  return os;
-}
-
-std::ostream&
-operator<<(std::ostream& os, const Face& face)
-{
-  face.Print(os);
-  return os;
-}
-
-} // namespace ndn
-} // namespace ns3
diff --git a/model/ndn-face.hpp b/model/ndn-face.hpp
index b8cd098..2eeb969 100644
--- a/model/ndn-face.hpp
+++ b/model/ndn-face.hpp
@@ -1,327 +1,32 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2011 University of California, Los Angeles
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2011-2014  Regents of the University of California.
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
+ * This file is part of ndnSIM. See AUTHORS for complete list of ndnSIM authors and
+ * contributors.
  *
- * This program 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.
+ * 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.
  *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * 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.
  *
- * Authors: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
+ * 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/>.
+ **/
 
-#ifndef NDN_FACE_H
-#define NDN_FACE_H
-
-#include <ostream>
-#include <algorithm>
-
-#include "ns3/ptr.h"
-#include "ns3/object.h"
-#include "ns3/nstime.h"
-#include "ns3/type-id.h"
-#include "ns3/traced-callback.h"
-#include "ns3/ndn-name.hpp"
+#ifndef NDNSIM_NDN_FACE_HPP
+#define NDNSIM_NDN_FACE_HPP
 
 namespace ns3 {
-
-class Packet;
-class Node;
-
 namespace ndn {
 
-class Interest;
-class Data;
-
-/**
- * \ingroup ndn
- * \defgroup ndn-face Faces
- */
-/**
- * \ingroup ndn-face
- * \brief Virtual class defining NDN face
- *
- * This class defines basic functionality of NDN face. Face is core
- * component responsible for actual delivery of data packet to and
- * from NDN stack
- *
- * \see ndn::AppFace, ndn::NetDeviceFace
- */
-class Face : public Object {
-public:
-  static TypeId
-  GetTypeId();
-
-  /**
-   * \brief NDN protocol handlers
-   *
-   * \param face Face from which packet has been received
-   * \param packet Original packet
-   */
-  typedef Callback<void, Ptr<Face>, Ptr<Interest>> InterestHandler;
-  typedef Callback<void, Ptr<Face>, Ptr<Data>> DataHandler;
-
-  /**
-   * \brief Default constructor
-   */
-  Face(Ptr<Node> node);
-  virtual ~Face();
-
-  /**
-   * @brief Get node to which this face is associated
-   */
-  Ptr<Node>
-  GetNode() const;
-
-  ////////////////////////////////////////////////////////////////////
-
-  /**
-   * \brief Register callback to call when new packet arrives on the face
-   *
-   * This method should call protocol-dependent registration function
-   */
-  virtual void
-  RegisterProtocolHandlers(const InterestHandler& interestHandler, const DataHandler& dataHandler);
-
-  /**
-   * \brief Un-Register callback to call when new packet arrives on the face
-   *
-   * This method should call protocol-dependent registration function
-   */
-  virtual void
-  UnRegisterProtocolHandlers();
-
-  /**
-   * @brief Send out interest through the face
-   * @param interest Interest to send out
-   * @param packet "payload" that is attached to the interest (can carry some packet tags)
-   *
-   * @returns true if interest is considered to be send out (enqueued)
-   */
-  virtual bool
-  SendInterest(Ptr<const Interest> interest);
-
-  /**
-   * @brief Send out Dat packet through the face
-   * @param data Data packet to send out
-   * @param packet Data packet payload, can also carry packet tags
-   *
-   * @returns true if Data packet is considered to be send out (enqueued)
-   */
-  virtual bool
-  SendData(Ptr<const Data> data);
-
-  /**
-   * \brief Receive interest from application or another node and forward it up to the NDN stack
-   *
-   * By default it is called from inside Receive method, but can be used directly, if appropriate
-   */
-  virtual bool
-  ReceiveInterest(Ptr<Interest> interest);
-
-  /**
-   * \brief Receive Data packet from application or another node and forward it up to the NDN stack
-   *
-   * By default it is called from inside Receive method, but can be used directly, if appropriate
-   */
-  virtual bool
-  ReceiveData(Ptr<Data> data);
-  ////////////////////////////////////////////////////////////////////
-
-  /**
-   * \brief Assign routing/forwarding metric with face
-   *
-   * \param metric configured routing metric (cost) of this face
-   */
-  virtual void
-  SetMetric(uint16_t metric);
-
-  /**
-   * \brief Get routing/forwarding metric assigned to the face
-   *
-   * \returns configured routing/forwarding metric (cost) of this face
-   */
-  virtual uint16_t
-  GetMetric(void) const;
-
-  /**
-   * These are face states and may be distinct from actual lower-layer
-   * device states, such as found in real implementations (where the
-   * device may be down but ndn face state is still up).
-   */
-
-  /**
-   * \brief Enable or disable this face
-   */
-  inline void
-  SetUp(bool up = true);
-
-  /**
-   * \brief Returns true if this face is enabled, false otherwise.
-   */
-  inline bool
-  IsUp() const;
-
-  /**
-   * @brief Get face flags
-   *
-   * Face flags may indicate various properties of the face.  For example, if the face is an
-   *application face,
-   * than the returned flags have Face::APPLICATION bit set.
-   *
-   * @see ndn::Face::Flags for the list of currently defined face flags
-   */
-  inline uint32_t
-  GetFlags() const;
-
-  /**
-   * @brief List of currently defined face flags
-   */
-  enum Flags {
-    APPLICATION = 1 ///< @brief An application face
-  };
-
-  /**
-   * @brief Print information about the face into the stream
-   * @param os stream to write information to
-   */
-  virtual std::ostream&
-  Print(std::ostream& os) const;
-
-  /**
-   * \brief Set face Id
-   *
-   * Id is purely informative and should not be used for any other purpose
-   *
-   * \param id id to set
-   */
-  inline void
-  SetId(uint32_t id);
-
-  /**
-   * \brief Get face Id
-   *
-   * Id is purely informative and should not be used for any other purpose
-   *
-   * \returns id id to set
-   */
-  inline uint32_t
-  GetId() const;
-
-  /**
-   * \brief Compare two faces. Only two faces on the same node could be compared.
-   *
-   * Internal index is used for comparison.
-   */
-  bool
-  operator==(const Face& face) const;
-
-  /**
-   * \brief Compare two faces. Only two faces on the same node could be compared.
-   *
-   * Internal index is used for comparison.
-   */
-  inline bool
-  operator!=(const Face& face) const;
-
-  /**
-   * \brief Compare two faces. Only two faces on the same node could be compared.
-   *
-   * Internal index is used for comparison.
-   */
-  bool
-  operator<(const Face& face) const;
-
-protected:
-  /**
-   * @brief Send packet down to the stack (towards app or network)
-   */
-  virtual bool
-  Send(Ptr<Packet> packet);
-
-  /**
-   * @brief Send packet up to the stack (towards forwarding strategy)
-   */
-  virtual bool
-  Receive(Ptr<const Packet> p);
-
-  /**
-   * @brief Set face flags
-   */
-  void
-  SetFlags(uint32_t flags);
-
-private:
-  Face(const Face&); ///< \brief Disabled copy constructor
-  Face&
-  operator=(const Face&); ///< \brief Disabled copy operator
-
-protected:
-  Ptr<Node> m_node; ///< \brief Smart pointer to Node
-
-private:
-  InterestHandler m_upstreamInterestHandler;
-  DataHandler m_upstreamDataHandler;
-  bool m_ifup;
-  uint32_t m_id;     ///< \brief id of the interface in NDN stack (per-node uniqueness)
-  uint16_t m_metric; ///< \brief metric of the face
-  uint32_t m_flags;  ///< @brief faces flags (e.g., APPLICATION)
+class Face {
 };
 
-std::ostream&
-operator<<(std::ostream& os, const Face& face);
-
-inline bool
-Face::IsUp(void) const
-{
-  return m_ifup;
-}
-
-inline void
-Face::SetUp(bool up /* = true*/)
-{
-  m_ifup = up;
-}
-
-inline uint32_t
-Face::GetFlags() const
-{
-  return m_flags;
-}
-
-inline bool
-operator<(const Ptr<Face>& lhs, const Ptr<Face>& rhs)
-{
-  return *lhs < *rhs;
-}
-
-void
-Face::SetId(uint32_t id)
-{
-  m_id = id;
-}
-
-uint32_t
-Face::GetId() const
-{
-  return m_id;
-}
-
-inline bool
-Face::operator!= (const Face &face) const
-{
-  return !(*this == face);
-}
-
 } // namespace ndn
 } // namespace ns3
 
-#endif // NDN_FACE_H
+#endif // NDNSIM_NDN_FACE_HPP
diff --git a/model/ndn-global-router.cpp b/model/ndn-global-router.cpp
index f44a088..19d5654 100644
--- a/model/ndn-global-router.cpp
+++ b/model/ndn-global-router.cpp
@@ -22,12 +22,9 @@
 
 #include "ns3/ndn-l3-protocol.hpp"
 #include "ns3/ndn-face.hpp"
-#include "ns3/ndn-name.hpp"
 
 #include "ns3/channel.h"
 
-using namespace boost;
-
 namespace ns3 {
 namespace ndn {
 
@@ -70,7 +67,7 @@
 }
 
 void
-GlobalRouter::AddLocalPrefix(Ptr<Name> prefix)
+GlobalRouter::AddLocalPrefix(shared_ptr<Name> prefix)
 {
   m_localPrefixes.push_back(prefix);
 }
@@ -78,7 +75,7 @@
 void
 GlobalRouter::AddIncidency(Ptr<Face> face, Ptr<GlobalRouter> gr)
 {
-  m_incidencies.push_back(make_tuple(this, face, gr));
+  m_incidencies.push_back(boost::make_tuple(this, face, gr));
 }
 
 GlobalRouter::IncidencyList&
diff --git a/model/ndn-global-router.hpp b/model/ndn-global-router.hpp
index f680db7..f742656 100644
--- a/model/ndn-global-router.hpp
+++ b/model/ndn-global-router.hpp
@@ -21,6 +21,8 @@
 #ifndef NDN_GLOBAL_ROUTER_H
 #define NDN_GLOBAL_ROUTER_H
 
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
 #include "ns3/object.h"
 #include "ns3/ptr.h"
 
@@ -35,9 +37,6 @@
 
 class L3Protocol;
 class Face;
-class Name;
-
-typedef Name NameComponents;
 
 /**
  * @ingroup ndn
@@ -56,7 +55,7 @@
   /**
    * @brief List of locally exported prefixes
    */
-  typedef std::list<Ptr<Name>> LocalPrefixList;
+  typedef std::list<shared_ptr<Name>> LocalPrefixList;
 
   /**
    * \brief Interface ID
@@ -88,7 +87,7 @@
    * @param prefix Prefix
    */
   void
-  AddLocalPrefix(Ptr<Name> prefix);
+  AddLocalPrefix(shared_ptr<Name> prefix);
 
   /**
    * @brief Add edge to the node
diff --git a/model/ndn-l3-protocol.cpp b/model/ndn-l3-protocol.cpp
index d7505e7..07d38f3 100644
--- a/model/ndn-l3-protocol.cpp
+++ b/model/ndn-l3-protocol.cpp
@@ -33,8 +33,6 @@
 #include "ns3/random-variable.h"
 
 #include "ns3/ndn-pit.hpp"
-#include "ns3/ndn-interest.hpp"
-#include "ns3/ndn-data.hpp"
 
 #include "ns3/ndn-face.hpp"
 #include "ns3/ndn-forwarding-strategy.hpp"
diff --git a/model/ndn-l3-protocol.hpp b/model/ndn-l3-protocol.hpp
index 5b71e3a..cf3d19a 100644
--- a/model/ndn-l3-protocol.hpp
+++ b/model/ndn-l3-protocol.hpp
@@ -21,6 +21,8 @@
 #ifndef NDN_L3_PROTOCOL_H
 #define NDN_L3_PROTOCOL_H
 
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
 #include <list>
 #include <vector>
 
diff --git a/model/ndn-net-device-face.cpp b/model/ndn-net-device-face.cpp
index 31d57fc..71c23ce 100644
--- a/model/ndn-net-device-face.cpp
+++ b/model/ndn-net-device-face.cpp
@@ -31,7 +31,6 @@
 // #include "ns3/address.h"
 #include "ns3/point-to-point-net-device.h"
 #include "ns3/channel.h"
-#include "ns3/ndn-name.hpp"
 
 NS_LOG_COMPONENT_DEFINE("ndn.NetDeviceFace");
 
diff --git a/model/ndn-net-device-face.hpp b/model/ndn-net-device-face.hpp
index 5bc8e3a..05acb60 100644
--- a/model/ndn-net-device-face.hpp
+++ b/model/ndn-net-device-face.hpp
@@ -21,6 +21,8 @@
 #ifndef NDN_NET_DEVICE_FACE_H
 #define NDN_NET_DEVICE_FACE_H
 
+#include "ns3/ndnSIM/model/ndn-common.hpp"
+
 #include "ndn-face.hpp"
 #include "ns3/net-device.h"
 
