diff --git a/model/content-store/ccnx-content-store-impl.h b/model/content-store/ndn-content-store-impl.h
similarity index 68%
rename from model/content-store/ccnx-content-store-impl.h
rename to model/content-store/ndn-content-store-impl.h
index b3275da..0140f58 100644
--- a/model/content-store/ccnx-content-store-impl.h
+++ b/model/content-store/ndn-content-store-impl.h
@@ -18,33 +18,33 @@
  * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
  */
 
-#ifndef CCNX_CONTENT_STORE_IMPL_H_
-#define CCNX_CONTENT_STORE_IMPL_H_
+#ifndef NDN_CONTENT_STORE_IMPL_H_
+#define NDN_CONTENT_STORE_IMPL_H_
 
-#include "ccnx-content-store.h"
+#include "ndn-content-store.h"
 #include "ns3/packet.h"
-#include "ns3/ccnx-interest-header.h"
-#include "ns3/ccnx-content-object-header.h"
+#include "ns3/ndn-interest-header.h"
+#include "ns3/ndn-content-object-header.h"
 #include <boost/foreach.hpp>
 
 namespace ns3
 {
 
 template<class Container>
-class CcnxContentStoreImpl : public CcnxContentStore,
+class NdnContentStoreImpl : public NdnContentStore,
                              protected Container
 {
 public:
-  // from CcnxContentStore
+  // from NdnContentStore
   
-  virtual inline boost::tuple<Ptr<Packet>, Ptr<const CcnxContentObjectHeader>, Ptr<const Packet> >
-  Lookup (Ptr<const CcnxInterestHeader> interest);
+  virtual inline boost::tuple<Ptr<Packet>, Ptr<const NdnContentObjectHeader>, Ptr<const Packet> >
+  Lookup (Ptr<const NdnInterestHeader> interest);
             
   virtual inline bool
-  Add (Ptr<const CcnxContentObjectHeader> header, Ptr<const Packet> packet);
+  Add (Ptr<const NdnContentObjectHeader> header, Ptr<const Packet> packet);
 
   // virtual bool
-  // Remove (Ptr<CcnxInterestHeader> header);
+  // Remove (Ptr<NdnInterestHeader> header);
   
   virtual inline void
   Print (std::ostream &os) const;  
@@ -52,8 +52,8 @@
 
 
 template<class Container>
-boost::tuple<Ptr<Packet>, Ptr<const CcnxContentObjectHeader>, Ptr<const Packet> >
-CcnxContentStoreImpl<Container>::Lookup (Ptr<const CcnxInterestHeader> interest)
+boost::tuple<Ptr<Packet>, Ptr<const NdnContentObjectHeader>, Ptr<const Packet> >
+NdnContentStoreImpl<Container>::Lookup (Ptr<const NdnInterestHeader> interest)
 {
   // NS_LOG_FUNCTION (this << interest->GetName ());
 
@@ -65,7 +65,7 @@
       this->m_cacheHitsTrace (interest, node->payload ()->GetHeader ());
 
       // NS_LOG_DEBUG ("cache hit with " << node->payload ()->GetHeader ()->GetName ());
-      return boost::make_tuple (node->payload ()->GetFullyFormedCcnxPacket (),
+      return boost::make_tuple (node->payload ()->GetFullyFormedNdnPacket (),
                                 node->payload ()->GetHeader (),
                                 node->payload ()->GetPacket ());
     }
@@ -73,24 +73,24 @@
     {
       // NS_LOG_DEBUG ("cache miss for " << interest->GetName ());
       this->m_cacheMissesTrace (interest);
-      return boost::tuple<Ptr<Packet>, Ptr<CcnxContentObjectHeader>, Ptr<Packet> > (0, 0, 0);
+      return boost::tuple<Ptr<Packet>, Ptr<NdnContentObjectHeader>, Ptr<Packet> > (0, 0, 0);
     }
 }   
     
 template<class Container>
 bool 
-CcnxContentStoreImpl<Container>::Add (Ptr<const CcnxContentObjectHeader> header, Ptr<const Packet> packet)
+NdnContentStoreImpl<Container>::Add (Ptr<const NdnContentObjectHeader> header, Ptr<const Packet> packet)
 {
   // NS_LOG_FUNCTION (this << header->GetName ());
 
   return
-    this->insert (header->GetName (), Create<CcnxContentStoreEntry> (header, packet))
+    this->insert (header->GetName (), Create<NdnContentStoreEntry> (header, packet))
     .second;
 }
     
 template<class Container>
 void 
-CcnxContentStoreImpl<Container>::Print (std::ostream &os) const
+NdnContentStoreImpl<Container>::Print (std::ostream &os) const
 {
   for (typename Container::policy_container::const_iterator item = this->getPolicy ().begin ();
        item != this->getPolicy ().end ();
@@ -104,4 +104,4 @@
 
 } // namespace ns3
 
-#endif // CCNX_CONTENT_STORE_IMPL_H_
+#endif // NDN_CONTENT_STORE_IMPL_H_
diff --git a/model/content-store/ccnx-content-store-policies.cc b/model/content-store/ndn-content-store-policies.cc
similarity index 62%
rename from model/content-store/ccnx-content-store-policies.cc
rename to model/content-store/ndn-content-store-policies.cc
index e9a23e1..a474461 100644
--- a/model/content-store/ccnx-content-store-policies.cc
+++ b/model/content-store/ndn-content-store-policies.cc
@@ -18,11 +18,11 @@
  * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
  */
 
-#include "ccnx-content-store-policies.h"
+#include "ndn-content-store-policies.h"
 #include "ns3/log.h"
 #include "ns3/uinteger.h"
 
-NS_LOG_COMPONENT_DEFINE ("CcnxContentStorePolicies");
+NS_LOG_COMPONENT_DEFINE ("NdnContentStorePolicies");
 
 namespace ns3
 {
@@ -33,20 +33,20 @@
 ////////////////////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////////////////////
 
-NS_OBJECT_ENSURE_REGISTERED (CcnxContentStoreLru);
+NS_OBJECT_ENSURE_REGISTERED (NdnContentStoreLru);
 
 TypeId 
-CcnxContentStoreLru::GetTypeId (void)
+NdnContentStoreLru::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::CcnxContentStoreLru")
-    .SetGroupName ("Ccnx")
-    .SetParent< CcnxContentStore > ()
-    .AddConstructor<CcnxContentStoreLru> ()
+  static TypeId tid = TypeId ("ns3::NdnContentStoreLru")
+    .SetGroupName ("Ndn")
+    .SetParent< NdnContentStore > ()
+    .AddConstructor<NdnContentStoreLru> ()
     .AddAttribute ("Size",
                    "Maximum number of packets that content storage can hold",
                    UintegerValue (100),
-                   MakeUintegerAccessor (&CcnxContentStoreLru::SetMaxSize,
-                                         &CcnxContentStoreLru::GetMaxSize),
+                   MakeUintegerAccessor (&NdnContentStoreLru::SetMaxSize,
+                                         &NdnContentStoreLru::GetMaxSize),
                    MakeUintegerChecker<uint32_t> ())
     ;
 
@@ -54,22 +54,22 @@
 }
 
 void
-CcnxContentStoreLru::SetMaxSize (uint32_t maxSize)
+NdnContentStoreLru::SetMaxSize (uint32_t maxSize)
 {
   getPolicy ().set_max_size (maxSize);
 }
 
 uint32_t
-CcnxContentStoreLru::GetMaxSize () const
+NdnContentStoreLru::GetMaxSize () const
 {
   return getPolicy ().get_max_size ();
 }
 
-CcnxContentStoreLru::CcnxContentStoreLru ()
+NdnContentStoreLru::NdnContentStoreLru ()
 {
 }
         
-CcnxContentStoreLru::~CcnxContentStoreLru () 
+NdnContentStoreLru::~NdnContentStoreLru () 
 {
 }
 
@@ -79,21 +79,21 @@
 ////////////////////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////////////////////
 
-NS_OBJECT_ENSURE_REGISTERED (CcnxContentStoreRandom);
+NS_OBJECT_ENSURE_REGISTERED (NdnContentStoreRandom);
 
 TypeId 
-CcnxContentStoreRandom::GetTypeId (void)
+NdnContentStoreRandom::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::CcnxContentStoreRandom")
-    .SetGroupName ("Ccnx")
-    .SetParent< CcnxContentStore > ()
-    .AddConstructor<CcnxContentStoreRandom> ()
+  static TypeId tid = TypeId ("ns3::NdnContentStoreRandom")
+    .SetGroupName ("Ndn")
+    .SetParent< NdnContentStore > ()
+    .AddConstructor<NdnContentStoreRandom> ()
     
     .AddAttribute ("Size",
                    "Maximum number of packets that content storage can hold",
                    UintegerValue (100),
-                   MakeUintegerAccessor (&CcnxContentStoreRandom::SetMaxSize,
-                                         &CcnxContentStoreRandom::GetMaxSize),
+                   MakeUintegerAccessor (&NdnContentStoreRandom::SetMaxSize,
+                                         &NdnContentStoreRandom::GetMaxSize),
                    MakeUintegerChecker<uint32_t> ())
     ;
 
@@ -101,22 +101,22 @@
 }
 
 void
-CcnxContentStoreRandom::SetMaxSize (uint32_t maxSize)
+NdnContentStoreRandom::SetMaxSize (uint32_t maxSize)
 {
   getPolicy ().set_max_size (maxSize);
 }
 
 uint32_t
-CcnxContentStoreRandom::GetMaxSize () const
+NdnContentStoreRandom::GetMaxSize () const
 {
   return getPolicy ().get_max_size ();
 }
 
-CcnxContentStoreRandom::CcnxContentStoreRandom ()
+NdnContentStoreRandom::NdnContentStoreRandom ()
 {
 }
         
-CcnxContentStoreRandom::~CcnxContentStoreRandom () 
+NdnContentStoreRandom::~NdnContentStoreRandom () 
 {
 }
 
@@ -127,21 +127,21 @@
 ////////////////////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////////////////////
 
-NS_OBJECT_ENSURE_REGISTERED (CcnxContentStoreFifo);
+NS_OBJECT_ENSURE_REGISTERED (NdnContentStoreFifo);
 
 TypeId 
-CcnxContentStoreFifo::GetTypeId (void)
+NdnContentStoreFifo::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::CcnxContentStoreFifo")
-    .SetGroupName ("Ccnx")
-    .SetParent< CcnxContentStore > ()
-    .AddConstructor<CcnxContentStoreFifo> ()
+  static TypeId tid = TypeId ("ns3::NdnContentStoreFifo")
+    .SetGroupName ("Ndn")
+    .SetParent< NdnContentStore > ()
+    .AddConstructor<NdnContentStoreFifo> ()
     
     .AddAttribute ("Size",
                    "Maximum number of packets that content storage can hold",
                    UintegerValue (100),
-                   MakeUintegerAccessor (&CcnxContentStoreFifo::SetMaxSize,
-                                         &CcnxContentStoreFifo::GetMaxSize),
+                   MakeUintegerAccessor (&NdnContentStoreFifo::SetMaxSize,
+                                         &NdnContentStoreFifo::GetMaxSize),
                    MakeUintegerChecker<uint32_t> ())
     ;
 
@@ -149,22 +149,22 @@
 }
 
 void
-CcnxContentStoreFifo::SetMaxSize (uint32_t maxSize)
+NdnContentStoreFifo::SetMaxSize (uint32_t maxSize)
 {
   getPolicy ().set_max_size (maxSize);
 }
 
 uint32_t
-CcnxContentStoreFifo::GetMaxSize () const
+NdnContentStoreFifo::GetMaxSize () const
 {
   return getPolicy ().get_max_size ();
 }
 
-CcnxContentStoreFifo::CcnxContentStoreFifo ()
+NdnContentStoreFifo::NdnContentStoreFifo ()
 {
 }
         
-CcnxContentStoreFifo::~CcnxContentStoreFifo () 
+NdnContentStoreFifo::~NdnContentStoreFifo () 
 {
 }
 
diff --git a/model/content-store/ccnx-content-store-policies.h b/model/content-store/ndn-content-store-policies.h
similarity index 70%
rename from model/content-store/ccnx-content-store-policies.h
rename to model/content-store/ndn-content-store-policies.h
index cb8ee10..506dc72 100644
--- a/model/content-store/ccnx-content-store-policies.h
+++ b/model/content-store/ndn-content-store-policies.h
@@ -19,12 +19,12 @@
  *         Ilya Moiseenko <iliamo@cs.ucla.edu>
  */
 
-#ifndef CCNX_CONTENT_STORE_POLICIES_H
-#define	CCNX_CONTENT_STORE_POLICIES_H
+#ifndef NDN_CONTENT_STORE_POLICIES_H
+#define	NDN_CONTENT_STORE_POLICIES_H
 
-// #include "ns3/ccnx.h"
+// #include "ns3/ndn.h"
 
-#include "ccnx-content-store-impl.h"
+#include "ndn-content-store-impl.h"
 
 #include "../../utils/trie.h"
 #include "../../utils/trie-with-policy.h"
@@ -37,13 +37,13 @@
 {
 
 /**
- * \ingroup ccnx
+ * \ingroup ndn
  * \brief Content Store with LRU replacement policy
  */
-class CcnxContentStoreLru :
-    public CcnxContentStoreImpl<
-       ndnSIM::trie_with_policy<CcnxNameComponents,
-                                ndnSIM::smart_pointer_payload_traits<CcnxContentStoreEntry>,
+class NdnContentStoreLru :
+    public NdnContentStoreImpl<
+       ndnSIM::trie_with_policy<NdnNameComponents,
+                                ndnSIM::smart_pointer_payload_traits<NdnContentStoreEntry>,
                                 ndnSIM::lru_policy_traits >
       >
 {
@@ -58,8 +58,8 @@
   /**
    * Default constructor
    */
-  CcnxContentStoreLru ();
-  virtual ~CcnxContentStoreLru ();
+  NdnContentStoreLru ();
+  virtual ~NdnContentStoreLru ();
 
 private:
   void
@@ -71,13 +71,13 @@
 
 
 /**
- * \ingroup ccnx
+ * \ingroup ndn
  * \brief Content Store with RANDOM replacement policy
  */
-class CcnxContentStoreRandom :
-    public CcnxContentStoreImpl<
-      ndnSIM::trie_with_policy<CcnxNameComponents,
-                       ndnSIM::smart_pointer_payload_traits<CcnxContentStoreEntry>,
+class NdnContentStoreRandom :
+    public NdnContentStoreImpl<
+      ndnSIM::trie_with_policy<NdnNameComponents,
+                       ndnSIM::smart_pointer_payload_traits<NdnContentStoreEntry>,
                        ndnSIM::random_policy_traits >
       >
 {
@@ -92,8 +92,8 @@
   /**
    * Default constructor
    */
-  CcnxContentStoreRandom ();
-  virtual ~CcnxContentStoreRandom ();
+  NdnContentStoreRandom ();
+  virtual ~NdnContentStoreRandom ();
 
 private:
   void
@@ -104,13 +104,13 @@
 };
 
 /**
- * \ingroup ccnx
+ * \ingroup ndn
  * \brief Content Store with FIFO replacement policy
  */
-class CcnxContentStoreFifo :
-    public CcnxContentStoreImpl<
-      ndnSIM::trie_with_policy<CcnxNameComponents,
-                       ndnSIM::smart_pointer_payload_traits<CcnxContentStoreEntry>,
+class NdnContentStoreFifo :
+    public NdnContentStoreImpl<
+      ndnSIM::trie_with_policy<NdnNameComponents,
+                       ndnSIM::smart_pointer_payload_traits<NdnContentStoreEntry>,
                        ndnSIM::fifo_policy_traits >
       >
 {
@@ -125,8 +125,8 @@
   /**
    * Default constructor
    */
-  CcnxContentStoreFifo ();
-  virtual ~CcnxContentStoreFifo ();
+  NdnContentStoreFifo ();
+  virtual ~NdnContentStoreFifo ();
 
 private:
   void
@@ -139,4 +139,4 @@
 
 } //namespace ns3
 
-#endif // CCNX_CONTENT_STORE_POLICIES_H
+#endif // NDN_CONTENT_STORE_POLICIES_H
diff --git a/model/content-store/ccnx-content-store.cc b/model/content-store/ndn-content-store.cc
similarity index 61%
rename from model/content-store/ccnx-content-store.cc
rename to model/content-store/ndn-content-store.cc
index abbf9c3..75e9373 100644
--- a/model/content-store/ccnx-content-store.cc
+++ b/model/content-store/ndn-content-store.cc
@@ -20,54 +20,54 @@
  *         
  */
 
-#include "ccnx-content-store.h"
+#include "ndn-content-store.h"
 #include "ns3/log.h"
 #include "ns3/packet.h"
-#include "ns3/ccnx-name-components.h"
-#include "ns3/ccnx-interest-header.h"
-#include "ns3/ccnx-content-object-header.h"
+#include "ns3/ndn-name-components.h"
+#include "ns3/ndn-interest-header.h"
+#include "ns3/ndn-content-object-header.h"
 
-NS_LOG_COMPONENT_DEFINE ("CcnxContentStore");
+NS_LOG_COMPONENT_DEFINE ("NdnContentStore");
 
 namespace ns3
 {
 
-NS_OBJECT_ENSURE_REGISTERED (CcnxContentStore);
+NS_OBJECT_ENSURE_REGISTERED (NdnContentStore);
 
 TypeId 
-CcnxContentStore::GetTypeId (void)
+NdnContentStore::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::CcnxContentStore")
-    .SetGroupName ("Ccnx")
+  static TypeId tid = TypeId ("ns3::NdnContentStore")
+    .SetGroupName ("Ndn")
     .SetParent<Object> ()
 
     .AddTraceSource ("CacheHits", "Trace called every time there is a cache hit",
-                     MakeTraceSourceAccessor (&CcnxContentStore::m_cacheHitsTrace))
+                     MakeTraceSourceAccessor (&NdnContentStore::m_cacheHitsTrace))
 
     .AddTraceSource ("CacheMisses", "Trace called every time there is a cache miss",
-                     MakeTraceSourceAccessor (&CcnxContentStore::m_cacheMissesTrace))
+                     MakeTraceSourceAccessor (&NdnContentStore::m_cacheMissesTrace))
     ;
 
   return tid;
 }
 
 
-CcnxContentStore::~CcnxContentStore () 
+NdnContentStore::~NdnContentStore () 
 {
 }
 
 //////////////////////////////////////////////////////////////////////
 
-CcnxContentStoreEntry::CcnxContentStoreEntry (Ptr<const CcnxContentObjectHeader> header, Ptr<const Packet> packet)
+NdnContentStoreEntry::NdnContentStoreEntry (Ptr<const NdnContentObjectHeader> header, Ptr<const Packet> packet)
   : m_header (header)
   , m_packet (packet->Copy ())
 {
 }
 
 Ptr<Packet>
-CcnxContentStoreEntry::GetFullyFormedCcnxPacket () const
+NdnContentStoreEntry::GetFullyFormedNdnPacket () const
 {
-  static CcnxContentObjectTail tail; ///< \internal for optimization purposes
+  static NdnContentObjectTail tail; ///< \internal for optimization purposes
 
   Ptr<Packet> packet = m_packet->Copy ();
   packet->AddHeader (*m_header);
@@ -75,20 +75,20 @@
   return packet;
 }
 
-const CcnxNameComponents&
-CcnxContentStoreEntry::GetName () const
+const NdnNameComponents&
+NdnContentStoreEntry::GetName () const
 {
   return m_header->GetName ();
 }
 
-Ptr<const CcnxContentObjectHeader>
-CcnxContentStoreEntry::GetHeader () const
+Ptr<const NdnContentObjectHeader>
+NdnContentStoreEntry::GetHeader () const
 {
   return m_header;
 }
 
 Ptr<const Packet>
-CcnxContentStoreEntry::GetPacket () const
+NdnContentStoreEntry::GetPacket () const
 {
   return m_packet;
 }
diff --git a/model/content-store/ccnx-content-store.h b/model/content-store/ndn-content-store.h
similarity index 62%
rename from model/content-store/ccnx-content-store.h
rename to model/content-store/ndn-content-store.h
index f0abd61..2d4ada6 100644
--- a/model/content-store/ccnx-content-store.h
+++ b/model/content-store/ndn-content-store.h
@@ -19,8 +19,8 @@
  *         Ilya Moiseenko <iliamo@cs.ucla.edu>
  */
 
-#ifndef CCNX_CONTENT_STORE_H
-#define	CCNX_CONTENT_STORE_H
+#ifndef NDN_CONTENT_STORE_H
+#define	NDN_CONTENT_STORE_H
 
 #include "ns3/object.h"
 #include "ns3/ptr.h"
@@ -32,47 +32,47 @@
 {
 
 class Packet;
-class CcnxContentObjectHeader;
-class CcnxInterestHeader;
-class CcnxNameComponents;
+class NdnContentObjectHeader;
+class NdnInterestHeader;
+class NdnNameComponents;
 
 /**
- * \ingroup ccnx
+ * \ingroup ndn
  * \brief NDN content store entry
  *
  * Content store entry stores separately pseudo header and content of
  * ContentObject packet.  It is responsibility of the caller to
- * construct a fully formed CcnxPacket by calling Copy(), AddHeader(),
+ * construct a fully formed NdnPacket by calling Copy(), AddHeader(),
  * AddTail() on the packet received by GetPacket() method.
  *
- * GetFullyFormedCcnxPacket method provided as a convenience
+ * GetFullyFormedNdnPacket method provided as a convenience
  */
-class CcnxContentStoreEntry : public SimpleRefCount<CcnxContentStoreEntry>
+class NdnContentStoreEntry : public SimpleRefCount<NdnContentStoreEntry>
 {
 public:
   /**
    * \brief Construct content store entry
    *
-   * \param header Parsed CcnxContentObject header
-   * \param packet Original CCNx packet
+   * \param header Parsed NdnContentObject header
+   * \param packet Original Ndn packet
    *
    * The constructor will make a copy of the supplied packet and calls
    * RemoveHeader and RemoveTail on the copy.
    */
-  CcnxContentStoreEntry (Ptr<const CcnxContentObjectHeader> header, Ptr<const Packet> packet);
+  NdnContentStoreEntry (Ptr<const NdnContentObjectHeader> header, Ptr<const Packet> packet);
 
   /**
    * \brief Get prefix of the stored entry
    * \returns prefix of the stored entry
    */
-  const CcnxNameComponents&
+  const NdnNameComponents&
   GetName () const;
 
   /**
-   * \brief Get CcnxContentObjectHeader of the stored entry
-   * \returns CcnxContentObjectHeader of the stored entry
+   * \brief Get NdnContentObjectHeader of the stored entry
+   * \returns NdnContentObjectHeader of the stored entry
    */
-  Ptr<const CcnxContentObjectHeader>
+  Ptr<const NdnContentObjectHeader>
   GetHeader () const;
 
   /**
@@ -83,25 +83,25 @@
   GetPacket () const;
 
   /**
-   * \brief Convenience method to create a fully formed CCNx packet from stored header and content
-   * \returns A read-write copy of the packet with CcnxContentObjectHeader and CcxnContentObjectTail
+   * \brief Convenience method to create a fully formed Ndn packet from stored header and content
+   * \returns A read-write copy of the packet with NdnContentObjectHeader and CcxnContentObjectTail
    */
   Ptr<Packet>
-  GetFullyFormedCcnxPacket () const;
+  GetFullyFormedNdnPacket () const;
 
 private:
-  Ptr<const CcnxContentObjectHeader> m_header; ///< \brief non-modifiable CcnxContentObjectHeader
+  Ptr<const NdnContentObjectHeader> m_header; ///< \brief non-modifiable NdnContentObjectHeader
   Ptr<Packet> m_packet; ///< \brief non-modifiable content of the ContentObject packet
 };
 
 
 /**
- * \ingroup ccnx
+ * \ingroup ndn
  * \brief Base class for NDN content store
  *
  * Particular implementations should implement Lookup, Add, and Print methods
  */
-class CcnxContentStore : public Object
+class NdnContentStore : public Object
 {
 public:
   /**
@@ -115,7 +115,7 @@
   /**
    * @brief Virtual destructor
    */
-  virtual ~CcnxContentStore ();
+  virtual ~NdnContentStore ();
             
   /**
    * \brief Find corresponding CS entry for the given interest
@@ -126,19 +126,19 @@
    * If an entry is found, it is promoted to the top of most recent
    * used entries index, \see m_contentStore
    */
-  virtual boost::tuple<Ptr<Packet>, Ptr<const CcnxContentObjectHeader>, Ptr<const Packet> >
-  Lookup (Ptr<const CcnxInterestHeader> interest) = 0;
+  virtual boost::tuple<Ptr<Packet>, Ptr<const NdnContentObjectHeader>, Ptr<const Packet> >
+  Lookup (Ptr<const NdnInterestHeader> interest) = 0;
             
   /**
    * \brief Add a new content to the content store.
    *
-   * \param header Fully parsed CcnxContentObjectHeader
-   * \param packet Fully formed CCNx packet to add to content store
+   * \param header Fully parsed NdnContentObjectHeader
+   * \param packet Fully formed Ndn packet to add to content store
    * (will be copied and stripped down of headers)
    * @returns true if an existing entry was updated, false otherwise
    */
   virtual bool
-  Add (Ptr<const CcnxContentObjectHeader> header, Ptr<const Packet> packet) = 0;
+  Add (Ptr<const NdnContentObjectHeader> header, Ptr<const Packet> packet) = 0;
 
   // /**
   //  * \brief Add a new content to the content store.
@@ -147,7 +147,7 @@
   //  * @returns true if an existing entry was removed, false otherwise
   //  */
   // virtual bool
-  // Remove (Ptr<CcnxInterestHeader> header) = 0;
+  // Remove (Ptr<NdnInterestHeader> header) = 0;
   
   /**
    * \brief Print out content store entries
@@ -156,14 +156,14 @@
   Print (std::ostream &os) const = 0;
 
 protected:
-  TracedCallback<Ptr<const CcnxInterestHeader>,
-                 Ptr<const CcnxContentObjectHeader> > m_cacheHitsTrace; ///< @brief trace of cache hits
+  TracedCallback<Ptr<const NdnInterestHeader>,
+                 Ptr<const NdnContentObjectHeader> > m_cacheHitsTrace; ///< @brief trace of cache hits
     
-  TracedCallback<Ptr<const CcnxInterestHeader> > m_cacheMissesTrace; ///< @brief trace of cache misses
+  TracedCallback<Ptr<const NdnInterestHeader> > m_cacheMissesTrace; ///< @brief trace of cache misses
 };
 
 inline std::ostream&
-operator<< (std::ostream &os, const CcnxContentStore &cs)
+operator<< (std::ostream &os, const NdnContentStore &cs)
 {
   cs.Print (os);
   return os;
@@ -171,4 +171,4 @@
 
 } // namespace ns3
 
-#endif // CCNX_CONTENT_STORE_H
+#endif // NDN_CONTENT_STORE_H
