diff --git a/model/cs/content-store-impl.h b/model/cs/content-store-impl.h
index 7058009..48786d7 100644
--- a/model/cs/content-store-impl.h
+++ b/model/cs/content-store-impl.h
@@ -48,7 +48,7 @@
   typedef Entry base_type;
 
 public:
-  EntryImpl (Ptr<ContentStore> cs, Ptr<const ContentObject> data)
+  EntryImpl (Ptr<ContentStore> cs, Ptr<const Data> data)
     : Entry (cs, data)
     , item_ (0)
   {
@@ -94,11 +94,11 @@
 
   // from ContentStore
 
-  virtual inline Ptr<ContentObject>
+  virtual inline Ptr<Data>
   Lookup (Ptr<const Interest> interest);
 
   virtual inline bool
-  Add (Ptr<const ContentObject> data);
+  Add (Ptr<const Data> data);
 
   // virtual bool
   // Remove (Ptr<Interest> header);
@@ -182,7 +182,7 @@
 };
 
 template<class Policy>
-Ptr<ContentObject>
+Ptr<Data>
 ContentStoreImpl<Policy>::Lookup (Ptr<const Interest> interest)
 {
   NS_LOG_FUNCTION (this << interest->GetName ());
@@ -202,7 +202,7 @@
     {
       this->m_cacheHitsTrace (interest, node->payload ()->GetData ());
 
-      Ptr<ContentObject> copy = Create<ContentObject> (*node->payload ()->GetData ());
+      Ptr<Data> copy = Create<Data> (*node->payload ()->GetData ());
       ConstCast<Packet> (copy->GetPayload ())->RemoveAllPacketTags ();
       return copy;
     }
@@ -215,7 +215,7 @@
 
 template<class Policy>
 bool
-ContentStoreImpl<Policy>::Add (Ptr<const ContentObject> data)
+ContentStoreImpl<Policy>::Add (Ptr<const Data> data)
 {
   NS_LOG_FUNCTION (this << data->GetName ());
 
diff --git a/model/cs/content-store-nocache.cc b/model/cs/content-store-nocache.cc
index c5749e2..b2b8fbf 100644
--- a/model/cs/content-store-nocache.cc
+++ b/model/cs/content-store-nocache.cc
@@ -55,7 +55,7 @@
 {
 }
 
-Ptr<ContentObject>
+Ptr<Data>
 Nocache::Lookup (Ptr<const Interest> interest)
 {
   this->m_cacheMissesTrace (interest);
@@ -63,7 +63,7 @@
 }
 
 bool
-Nocache::Add (Ptr<const ContentObject> data)
+Nocache::Add (Ptr<const Data> data)
 {
   return false;
 }
diff --git a/model/cs/content-store-nocache.h b/model/cs/content-store-nocache.h
index 98c1850..ca3afe2 100644
--- a/model/cs/content-store-nocache.h
+++ b/model/cs/content-store-nocache.h
@@ -54,11 +54,11 @@
   virtual
   ~Nocache ();
 
-  virtual Ptr<ContentObject>
+  virtual Ptr<Data>
   Lookup (Ptr<const Interest> interest);
 
   virtual bool
-  Add (Ptr<const ContentObject> data);
+  Add (Ptr<const Data> data);
 
   virtual void
   Print (std::ostream &os) const;
diff --git a/model/cs/content-store-with-freshness.h b/model/cs/content-store-with-freshness.h
index d9fa1ba..e53cbba 100644
--- a/model/cs/content-store-with-freshness.h
+++ b/model/cs/content-store-with-freshness.h
@@ -50,7 +50,7 @@
   Print (std::ostream &os) const;
 
   virtual inline bool
-  Add (Ptr<const ContentObject> data);
+  Add (Ptr<const Data> data);
 
 private:
   inline void
@@ -94,7 +94,7 @@
 
 template<class Policy>
 inline bool
-ContentStoreWithFreshness< Policy >::Add (Ptr<const ContentObject> data)
+ContentStoreWithFreshness< Policy >::Add (Ptr<const Data> data)
 {
   bool ok = super::Add (data);
   if (!ok) return false;
diff --git a/model/cs/ndn-content-store.cc b/model/cs/ndn-content-store.cc
index f1c25b7..38215dc 100644
--- a/model/cs/ndn-content-store.cc
+++ b/model/cs/ndn-content-store.cc
@@ -60,7 +60,7 @@
 
 //////////////////////////////////////////////////////////////////////
 
-Entry::Entry (Ptr<ContentStore> cs, Ptr<const ContentObject> data)
+Entry::Entry (Ptr<ContentStore> cs, Ptr<const Data> data)
   : m_cs (cs)
   , m_data (data)
 {
@@ -72,7 +72,7 @@
   return m_data->GetName ();
 }
 
-Ptr<const ContentObject>
+Ptr<const Data>
 Entry::GetData () const
 {
   return m_data;
diff --git a/model/cs/ndn-content-store.h b/model/cs/ndn-content-store.h
index 10a7bd3..ae7c059 100644
--- a/model/cs/ndn-content-store.h
+++ b/model/cs/ndn-content-store.h
@@ -34,7 +34,7 @@
 
 namespace ndn {
 
-class ContentObject;
+class Data;
 class Interest;
 class Name;
 class ContentStore;
@@ -60,13 +60,13 @@
   /**
    * \brief Construct content store entry
    *
-   * \param header Parsed ContentObject header
+   * \param header Parsed Data header
    * \param packet Original Ndn packet
    *
    * The constructor will make a copy of the supplied packet and calls
    * RemoveHeader and RemoveTail on the copy.
    */
-  Entry (Ptr<ContentStore> cs, Ptr<const ContentObject> data);
+  Entry (Ptr<ContentStore> cs, Ptr<const Data> data);
 
   /**
    * \brief Get prefix of the stored entry
@@ -76,10 +76,10 @@
   GetName () const;
 
   /**
-   * \brief Get ContentObject of the stored entry
-   * \returns ContentObject of the stored entry
+   * \brief Get Data of the stored entry
+   * \returns Data of the stored entry
    */
-  Ptr<const ContentObject>
+  Ptr<const Data>
   GetData () const;
 
   /**
@@ -90,7 +90,7 @@
 
 private:
   Ptr<ContentStore> m_cs; ///< \brief content store to which entry is added
-  Ptr<const ContentObject> m_data; ///< \brief non-modifiable ContentObject
+  Ptr<const Data> m_data; ///< \brief non-modifiable Data
 };
 
 } // namespace cs
@@ -128,19 +128,19 @@
    * If an entry is found, it is promoted to the top of most recent
    * used entries index, \see m_contentStore
    */
-  virtual Ptr<ContentObject>
+  virtual Ptr<Data>
   Lookup (Ptr<const Interest> interest) = 0;
 
   /**
    * \brief Add a new content to the content store.
    *
-   * \param header Fully parsed ContentObject
+   * \param header Fully parsed Data
    * \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 ContentObject> data) = 0;
+  Add (Ptr<const Data> data) = 0;
 
   // /*
   //  * \brief Add a new content to the content store.
@@ -194,7 +194,7 @@
 
 protected:
   TracedCallback<Ptr<const Interest>,
-                 Ptr<const ContentObject> > m_cacheHitsTrace; ///< @brief trace of cache hits
+                 Ptr<const Data> > m_cacheHitsTrace; ///< @brief trace of cache hits
 
   TracedCallback<Ptr<const Interest> > m_cacheMissesTrace; ///< @brief trace of cache misses
 };
diff --git a/model/fw/ndn-forwarding-strategy.cc b/model/fw/ndn-forwarding-strategy.cc
index 2275a8c..f439fd4 100644
--- a/model/fw/ndn-forwarding-strategy.cc
+++ b/model/fw/ndn-forwarding-strategy.cc
@@ -178,7 +178,7 @@
       return;
     }
 
-  Ptr<ContentObject> contentObject;
+  Ptr<Data> contentObject;
   contentObject = m_contentStore->Lookup (interest);
   if (contentObject != 0)
     {
@@ -222,7 +222,7 @@
 
 void
 ForwardingStrategy::OnData (Ptr<Face> inFace,
-                            Ptr<ContentObject> data)
+                            Ptr<Data> data)
 {
   NS_LOG_FUNCTION (inFace << data->GetName ());
   m_inData (data, inFace);
@@ -354,7 +354,7 @@
 
 void
 ForwardingStrategy::SatisfyPendingInterest (Ptr<Face> inFace,
-                                            Ptr<const ContentObject> data,
+                                            Ptr<const Data> data,
                                             Ptr<pit::Entry> pitEntry)
 {
   if (inFace != 0)
@@ -387,7 +387,7 @@
 
 void
 ForwardingStrategy::DidReceiveSolicitedData (Ptr<Face> inFace,
-                                             Ptr<const ContentObject> data,
+                                             Ptr<const Data> data,
                                              bool didCreateCacheEntry)
 {
   // do nothing
@@ -395,7 +395,7 @@
 
 void
 ForwardingStrategy::DidReceiveUnsolicitedData (Ptr<Face> inFace,
-                                               Ptr<const ContentObject> data,
+                                               Ptr<const Data> data,
                                                bool didCreateCacheEntry)
 {
   // do nothing
@@ -556,7 +556,7 @@
 void
 ForwardingStrategy::DidSendOutData (Ptr<Face> inFace,
                                     Ptr<Face> outFace,
-                                    Ptr<const ContentObject> data,
+                                    Ptr<const Data> data,
                                     Ptr<pit::Entry> pitEntry)
 {
   m_outData (data, inFace == 0, outFace);
diff --git a/model/fw/ndn-forwarding-strategy.h b/model/fw/ndn-forwarding-strategy.h
index bfed748..05078d6 100644
--- a/model/fw/ndn-forwarding-strategy.h
+++ b/model/fw/ndn-forwarding-strategy.h
@@ -45,7 +45,7 @@
 class Face;
 
 class Interest;
-class ContentObject;
+class Data;
 
 class Pit;
 namespace pit { class Entry; }
@@ -89,13 +89,13 @@
   /**
    * \brief Actual processing of incoming Ndn content objects
    *
-   * Processing ContentObject packets
+   * Processing Data packets
    * @param face    incoming face
    * @param data    Data packet
    */
   virtual void
   OnData (Ptr<Face> face,
-          Ptr<ContentObject> data);
+          Ptr<Data> data);
 
   /**
    * @brief Event fired just before PIT entry is removed by timeout
@@ -274,13 +274,13 @@
    */
   virtual void
   SatisfyPendingInterest (Ptr<Face> inFace, // 0 allowed (from cache)
-                          Ptr<const ContentObject> data,
+                          Ptr<const Data> data,
                           Ptr<pit::Entry> pitEntry);
 
   /**
    * @brief Event which is fired just after data was send out on the face
    *
-   * @param inFace   incoming face of the ContentObject
+   * @param inFace   incoming face of the Data
    * @param outFace  outgoing face
    * @param data     Data packet
    * @param pitEntry an existing PIT entry, corresponding to the duplicated Interest
@@ -288,7 +288,7 @@
   virtual void
   DidSendOutData (Ptr<Face> inFace,
                   Ptr<Face> outFace,
-                  Ptr<const ContentObject> data,
+                  Ptr<const Data> data,
                   Ptr<pit::Entry> pitEntry);
 
   /**
@@ -300,7 +300,7 @@
    */
   virtual void
   DidReceiveSolicitedData (Ptr<Face> inFace,
-                           Ptr<const ContentObject> data,
+                           Ptr<const Data> data,
                            bool didCreateCacheEntry);
 
   /**
@@ -315,7 +315,7 @@
    */
   virtual void
   DidReceiveUnsolicitedData (Ptr<Face> inFace,
-                             Ptr<const ContentObject> data,
+                             Ptr<const Data> data,
                              bool didCreateCacheEntry);
 
   /**
@@ -328,7 +328,7 @@
    *
    * @param inFace  incoming face
    * @param interest Interest packet
-   * @param payload ContentObject payload
+   * @param payload Data payload
    */
   virtual bool
   ShouldSuppressIncomingInterest (Ptr<Face> inFace,
@@ -455,14 +455,14 @@
   ////////////////////////////////////////////////////////////////////
   ////////////////////////////////////////////////////////////////////
 
-  TracedCallback<Ptr<const ContentObject>,
+  TracedCallback<Ptr<const Data>,
                  bool /*from cache*/,
                  Ptr<const Face> > m_outData; ///< @brief trace of outgoing Data
 
-  TracedCallback<Ptr<const ContentObject>,
+  TracedCallback<Ptr<const Data>,
                  Ptr<const Face> > m_inData; ///< @brief trace of incoming Data
 
-  TracedCallback<Ptr<const ContentObject>,
+  TracedCallback<Ptr<const Data>,
                   Ptr<const Face> > m_dropData;  ///< @brief trace of dropped Data
 
   ////////////////////////////////////////////////////////////////////
diff --git a/model/ndn-app-face.cc b/model/ndn-app-face.cc
index b66fa92..4e5f56e 100644
--- a/model/ndn-app-face.cc
+++ b/model/ndn-app-face.cc
@@ -101,7 +101,7 @@
 }
 
 bool
-AppFace::SendData (Ptr<const ContentObject> data)
+AppFace::SendData (Ptr<const Data> data)
 {
   NS_LOG_FUNCTION (this << data);
 
@@ -110,7 +110,7 @@
       return false;
     }
 
-  m_app->OnContentObject (data);
+  m_app->OnData (data);
   return true;
 }
 
diff --git a/model/ndn-app-face.h b/model/ndn-app-face.h
index 5c88b4e..029dd0a 100644
--- a/model/ndn-app-face.h
+++ b/model/ndn-app-face.h
@@ -32,10 +32,10 @@
 namespace ndn {
 
 class Interest;
-class ContentObject;
+class Data;
 
 typedef Interest InterestHeader;
-typedef ContentObject ContentObjectHeader;
+typedef Data DataHeader;
 
 class App;
 
@@ -67,7 +67,7 @@
   SendInterest (Ptr<const Interest> interest);
 
   virtual bool
-  SendData (Ptr<const ContentObject> data);
+  SendData (Ptr<const Data> data);
 
 public:
   virtual std::ostream&
diff --git a/model/ndn-content-object.cc b/model/ndn-content-object.cc
index 9df1d27..84df61b 100644
--- a/model/ndn-content-object.cc
+++ b/model/ndn-content-object.cc
@@ -25,12 +25,12 @@
 
 #include <boost/foreach.hpp>
 
-NS_LOG_COMPONENT_DEFINE ("ndn.ContentObject");
+NS_LOG_COMPONENT_DEFINE ("ndn.Data");
 
 namespace ns3 {
 namespace ndn {
 
-ContentObject::ContentObject (Ptr<Packet> payload/* = Create<Packet> ()*/)
+Data::Data (Ptr<Packet> payload/* = Create<Packet> ()*/)
   : m_name (Create<Name> ())
   , m_signature (0)
   , m_payload (payload)
@@ -42,7 +42,7 @@
     }
 }
 
-ContentObject::ContentObject (const ContentObject &other)
+Data::Data (const Data &other)
   : m_name (Create<Name> (other.GetName ()))
   , m_freshness (other.GetFreshness ())
   , m_timestamp (other.GetTimestamp ())
@@ -53,48 +53,48 @@
 }
 
 void
-ContentObject::SetName (Ptr<Name> name)
+Data::SetName (Ptr<Name> name)
 {
   m_name = name;
   m_wire = 0;
 }
 
 void
-ContentObject::SetName (const Name &name)
+Data::SetName (const Name &name)
 {
   m_name = Create<Name> (name);
   m_wire = 0;
 }
 
 const Name&
-ContentObject::GetName () const
+Data::GetName () const
 {
-  if (m_name==0) throw ContentObjectException();
+  if (m_name==0) throw DataException();
   return *m_name;
 }
 
 Ptr<const Name>
-ContentObject::GetNamePtr () const
+Data::GetNamePtr () const
 {
   return m_name;
 }
 
 
 void
-ContentObject::SetTimestamp (const Time &timestamp)
+Data::SetTimestamp (const Time &timestamp)
 {
   m_timestamp = timestamp;
   m_wire = 0;
 }
 
 Time
-ContentObject::GetTimestamp () const
+Data::GetTimestamp () const
 {
   return m_timestamp;
 }
     
 void
-ContentObject::SetFreshness (const Time &freshness)
+Data::SetFreshness (const Time &freshness)
 {
   m_freshness = freshness;
   m_wire = 0;
@@ -102,52 +102,52 @@
 
 
 Time
-ContentObject::GetFreshness () const
+Data::GetFreshness () const
 {
   return m_freshness;
 }
 
 void
-ContentObject::SetSignature (uint32_t signature)
+Data::SetSignature (uint32_t signature)
 {
   m_signature = signature;
   m_wire = 0;
 }
 
 uint32_t
-ContentObject::GetSignature () const
+Data::GetSignature () const
 {
   return m_signature;
 }
 
 void
-ContentObject::SetKeyLocator (Ptr<Name> keyLocator)
+Data::SetKeyLocator (Ptr<Name> keyLocator)
 {
   m_keyLocator = keyLocator;
 }
 
 Ptr<const Name>
-ContentObject::GetKeyLocator () const
+Data::GetKeyLocator () const
 {
   return m_keyLocator;
 }
 
 void
-ContentObject::Print (std::ostream &os) const
+Data::Print (std::ostream &os) const
 {
   os << "D: " << GetName ();
-  // os << "<ContentObject><Name>" << GetName () << "</Name><Content>";
+  // os << "<Data><Name>" << GetName () << "</Name><Content>";
 }
 
 void
-ContentObject::SetPayload (Ptr<Packet> payload)
+Data::SetPayload (Ptr<Packet> payload)
 {
   m_payload = payload;
   m_wire = 0;
 }
 
 Ptr<const Packet>
-ContentObject::GetPayload () const
+Data::GetPayload () const
 {
   return m_payload;
 }
diff --git a/model/ndn-content-object.h b/model/ndn-content-object.h
index 859543b..4d51d37 100644
--- a/model/ndn-content-object.h
+++ b/model/ndn-content-object.h
@@ -34,9 +34,9 @@
 
 /**
  * @ingroup ndn
- * @brief ContentObject header
+ * @brief Data header
  */
-class ContentObject : public SimpleRefCount<ContentObject>
+class Data : public SimpleRefCount<Data>
 {
 public:
   /**
@@ -44,12 +44,12 @@
    *
    * Creates a null header
    **/
-  ContentObject (Ptr<Packet> payload = Create<Packet> ());
+  Data (Ptr<Packet> payload = Create<Packet> ());
 
   /**
    * @brief Copy constructor
    */
-  ContentObject (const ContentObject &other);
+  Data (const Data &other);
 
   /**
    * \brief Set content object name
@@ -176,8 +176,8 @@
   
 private:
   // NO_ASSIGN
-  ContentObject &
-  operator = (const ContentObject &other) { return *this; }
+  Data &
+  operator = (const Data &other) { return *this; }
   
 private:
   Ptr<Name> m_name;
@@ -191,25 +191,25 @@
 };
 
 inline std::ostream &
-operator << (std::ostream &os, const ContentObject &d)
+operator << (std::ostream &os, const Data &d)
 {
   d.Print (os);
   return os;
 }
 
 /**
- * @brief Class for ContentObject parsing exception
+ * @brief Class for Data parsing exception
  */
-class ContentObjectException {};
+class DataException {};
 
 inline Ptr<const Packet>
-ContentObject::GetWire () const
+Data::GetWire () const
 {
   return m_wire;
 }
 
 inline void
-ContentObject::SetWire (Ptr<const Packet> packet) const
+Data::SetWire (Ptr<const Packet> packet) const
 {
   m_wire = packet;
 }
diff --git a/model/ndn-face.cc b/model/ndn-face.cc
index 57a8c4d..72b490e 100644
--- a/model/ndn-face.cc
+++ b/model/ndn-face.cc
@@ -69,7 +69,7 @@
 Face::Face (Ptr<Node> node)
   : m_node (node)
   , m_upstreamInterestHandler (MakeNullCallback< void, Ptr<Face>, Ptr<Interest> > ())
-  , m_upstreamDataHandler (MakeNullCallback< void, Ptr<Face>, Ptr<ContentObject> > ())
+  , m_upstreamDataHandler (MakeNullCallback< void, Ptr<Face>, Ptr<Data> > ())
   , m_ifup (false)
   , m_id ((uint32_t)-1)
   , m_metric (0)
@@ -115,7 +115,7 @@
   NS_LOG_FUNCTION_NOARGS ();
 
   m_upstreamInterestHandler = MakeNullCallback< void, Ptr<Face>, Ptr<Interest> > ();
-  m_upstreamDataHandler = MakeNullCallback< void, Ptr<Face>, Ptr<ContentObject> > ();
+  m_upstreamDataHandler = MakeNullCallback< void, Ptr<Face>, Ptr<Data> > ();
 }
 
 
@@ -133,7 +133,7 @@
 }
 
 bool
-Face::SendData (Ptr<const ContentObject> data)
+Face::SendData (Ptr<const Data> data)
 {
   NS_LOG_FUNCTION (this << data);
 
@@ -214,7 +214,7 @@
 }
 
 bool
-Face::ReceiveData (Ptr<ContentObject> data)
+Face::ReceiveData (Ptr<Data> data)
 {
   if (!IsUp ())
     {
diff --git a/model/ndn-face.h b/model/ndn-face.h
index c2e3ca4..a166a7b 100644
--- a/model/ndn-face.h
+++ b/model/ndn-face.h
@@ -39,7 +39,7 @@
 namespace ndn {
 
 class Interest;
-class ContentObject;
+class Data;
 
 /**
  * \ingroup ndn
@@ -69,7 +69,7 @@
    * \param packet Original packet
    */
   typedef Callback<void, Ptr<Face>, Ptr<Interest> > InterestHandler;
-  typedef Callback<void, Ptr<Face>, Ptr<ContentObject> > DataHandler;
+  typedef Callback<void, Ptr<Face>, Ptr<Data> > DataHandler;
 
   /**
    * \brief Default constructor
@@ -119,7 +119,7 @@
    * @returns true if Data packet is considered to be send out (enqueued)
    */
   virtual bool
-  SendData (Ptr<const ContentObject> data);
+  SendData (Ptr<const Data> data);
 
   /**
    * \brief Receive interest from application or another node and forward it up to the NDN stack
@@ -135,7 +135,7 @@
    * By default it is called from inside Receive method, but can be used directly, if appropriate
    */
   virtual bool
-  ReceiveData (Ptr<ContentObject> data);
+  ReceiveData (Ptr<Data> data);
   ////////////////////////////////////////////////////////////////////
 
   /**
diff --git a/model/pit/ndn-pit-impl.h b/model/pit/ndn-pit-impl.h
index 6a8dfcd..85f11c8 100644
--- a/model/pit/ndn-pit-impl.h
+++ b/model/pit/ndn-pit-impl.h
@@ -81,7 +81,7 @@
 
   // inherited from Pit
   virtual Ptr<Entry>
-  Lookup (const ContentObject &header);
+  Lookup (const Data &header);
 
   virtual Ptr<Entry>
   Lookup (const Interest &header);
@@ -300,7 +300,7 @@
 
 template<class Policy>
 Ptr<Entry>
-PitImpl<Policy>::Lookup (const ContentObject &header)
+PitImpl<Policy>::Lookup (const Data &header)
 {
   /// @todo use predicate to search with exclude filters
   typename super::iterator item = super::longest_prefix_match_if (header.GetName (), EntryIsNotEmpty ());
diff --git a/model/pit/ndn-pit.h b/model/pit/ndn-pit.h
index 0699479..1185892 100644
--- a/model/pit/ndn-pit.h
+++ b/model/pit/ndn-pit.h
@@ -44,11 +44,11 @@
 
 class L3Protocol;
 class Face;
-class ContentObject;
+class Data;
 class Interest;
 
 typedef Interest InterestHeader;
-typedef ContentObject ContentObjectHeader;
+typedef Data DataHeader;
 
 ////////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////////
@@ -89,7 +89,7 @@
    *          returns 0
    */
   virtual Ptr<pit::Entry>
-  Lookup (const ContentObject &header) = 0;
+  Lookup (const Data &header) = 0;
 
   /**
    * \brief Find a PIT entry for the given content interest
diff --git a/model/wire/ccnb.h b/model/wire/ccnb.h
index 9b920b9..a561643 100644
--- a/model/wire/ccnb.h
+++ b/model/wire/ccnb.h
@@ -67,15 +67,15 @@
 {
 public:
   Data ();
-  Data (Ptr<ndn::ContentObject> data);
+  Data (Ptr<ndn::Data> data);
 
-  Ptr<ndn::ContentObject>
+  Ptr<ndn::Data>
   GetData ();
 
   static Ptr<Packet>
-  ToWire (Ptr<const ndn::ContentObject> data);
+  ToWire (Ptr<const ndn::Data> data);
 
-  static Ptr<ndn::ContentObject>
+  static Ptr<ndn::Data>
   FromWire (Ptr<Packet> packet);
   
   // from Header
@@ -87,7 +87,7 @@
   virtual uint32_t Deserialize (Buffer::Iterator start);
 
 private:
-  Ptr<ndn::ContentObject> m_data;  
+  Ptr<ndn::Data> m_data;  
 };
 
 } // ccnb
diff --git a/model/wire/ccnb/ccnb-parser/common.h b/model/wire/ccnb/ccnb-parser/common.h
index 531cd87..1485b96 100644
--- a/model/wire/ccnb/ccnb-parser/common.h
+++ b/model/wire/ccnb/ccnb-parser/common.h
@@ -116,7 +116,7 @@
   CCN_DTAG_PublisherCertificateDigest = 61,
   CCN_DTAG_PublisherIssuerKeyDigest = 62,
   CCN_DTAG_PublisherIssuerCertificateDigest = 63,
-  CCN_DTAG_ContentObject = 64,	/* 20090915 */
+  CCN_DTAG_Data = 64,	/* 20090915 */
   CCN_DTAG_WrappedKey = 65,
   CCN_DTAG_WrappingKeyIdentifier = 66,
   CCN_DTAG_WrapAlgorithm = 67,
diff --git a/model/wire/ccnb/ccnb-parser/syntax-tree/dtag.cc b/model/wire/ccnb/ccnb-parser/syntax-tree/dtag.cc
index 3095747..0bf5296 100644
--- a/model/wire/ccnb/ccnb-parser/syntax-tree/dtag.cc
+++ b/model/wire/ccnb/ccnb-parser/syntax-tree/dtag.cc
@@ -62,7 +62,7 @@
   while (!start.IsEnd () && BufferIteratorPeekU8 (start)!=CCN_CLOSE)
     {
       // hack #2. Stop processing nested blocks if last block was <Content>
-      if (m_dtag == CCN_DTAG_ContentObject && // we are in <ContentObject>
+      if (m_dtag == CCN_DTAG_Data && // we are in <Data>
           DynamicCast<Dtag> (m_nestedTags.back())!=0 && // last block is DTAG
           DynamicCast<Dtag> (m_nestedTags.back())->m_dtag == CCN_DTAG_Content) 
         {
@@ -72,8 +72,8 @@
       m_nestedTags.push_back (Block::ParseBlock (start));
     }
 
-  // hack #3. Stop processing when last tag was <ContentObject>
-  if (m_dtag == CCN_DTAG_ContentObject && // we are in <ContentObject>
+  // hack #3. Stop processing when last tag was <Data>
+  if (m_dtag == CCN_DTAG_Data && // we are in <Data>
       DynamicCast<Dtag> (m_nestedTags.back())!=0 && // last block is DTAG
       DynamicCast<Dtag> (m_nestedTags.back())->m_dtag == CCN_DTAG_Content) 
     {
diff --git a/model/wire/ccnb/wire-ccnb-data.cc b/model/wire/ccnb/wire-ccnb-data.cc
index fb87899..6349971 100644
--- a/model/wire/ccnb/wire-ccnb-data.cc
+++ b/model/wire/ccnb/wire-ccnb-data.cc
@@ -85,7 +85,7 @@
     i.Prev (2); // Trailer interface requires us to go backwards
 
     i.WriteU8 (0x00); // </Content>
-    i.WriteU8 (0x00); // </ContentObject>
+    i.WriteU8 (0x00); // </Data>
   }
 
   virtual uint32_t Deserialize (Buffer::Iterator end)
@@ -97,7 +97,7 @@
     NS_ASSERT_MSG (closing_tag_content==0, "Should be a closing tag </Content> (0x00)");
 
     uint8_t closing_tag_content_object = i.ReadU8 ();
-    NS_ASSERT_MSG (closing_tag_content_object==0, "Should be a closing tag </ContentObject> (0x00)");
+    NS_ASSERT_MSG (closing_tag_content_object==0, "Should be a closing tag </Data> (0x00)");
 
     return 2;
   }
@@ -124,23 +124,23 @@
 }
 
 Data::Data ()
-  : m_data (Create<ndn::ContentObject> ())
+  : m_data (Create<ndn::Data> ())
 {
 }
 
-Data::Data (Ptr<ndn::ContentObject> data)
+Data::Data (Ptr<ndn::Data> data)
   : m_data (data)
 {
 }
 
-Ptr<ndn::ContentObject>
+Ptr<ndn::Data>
 Data::GetData ()
 {
   return m_data;
 }
 
 Ptr<Packet>
-Data::ToWire (Ptr<const ndn::ContentObject> data)
+Data::ToWire (Ptr<const ndn::Data> data)
 {
   static DataTrailer trailer;
 
@@ -148,7 +148,7 @@
   if (!p)
     {
       Ptr<Packet> packet = Create<Packet> (*data->GetPayload ());
-      Data wireEncoding (ConstCast<ndn::ContentObject> (data));
+      Data wireEncoding (ConstCast<ndn::Data> (data));
       packet->AddHeader (wireEncoding);
       packet->AddTrailer (trailer);
       data->SetWire (packet);
@@ -159,12 +159,12 @@
   return p->Copy ();
 }
 
-Ptr<ndn::ContentObject>
+Ptr<ndn::Data>
 Data::FromWire (Ptr<Packet> packet)
 {
   static DataTrailer trailer;
 
-  Ptr<ndn::ContentObject> data = Create<ndn::ContentObject> ();
+  Ptr<ndn::Data> data = Create<ndn::Data> ();
   data->SetWire (packet->Copy ());
 
   Data wireEncoding (data);
@@ -179,7 +179,7 @@
 void
 Data::Serialize (Buffer::Iterator start) const
 {
-  Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_ContentObject, CcnbParser::CCN_DTAG); // <ContentObject>
+  Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_Data, CcnbParser::CCN_DTAG); // <Data>
 
   // fake signature
   Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_Signature, CcnbParser::CCN_DTAG); // <Signature>
@@ -252,14 +252,14 @@
     Ccnb::AppendBlockHeader (start, payloadSize, CcnbParser::CCN_BLOB);
 
   // there are no closing tags !!!
-  // The closing tag is handled by ContentObjectTail
+  // The closing tag is handled by DataTail
 }
 
 uint32_t
 Data::GetSerializedSize () const
 {
   size_t written = 0;
-  written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_ContentObject); // <ContentObject>
+  written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_Data); // <Data>
 
   // fake signature
   written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_Signature); // <Signature>
@@ -331,14 +331,14 @@
     written += Ccnb::EstimateBlockHeader (payloadSize);
 
   // there are no closing tags !!!
-  // The closing tag is handled by ContentObjectTail
+  // The closing tag is handled by DataTail
   return written;
 }
 
-class ContentObjectVisitor : public CcnbParser::VoidDepthFirstVisitor
+class DataVisitor : public CcnbParser::VoidDepthFirstVisitor
 {
 public:
-  virtual void visit (CcnbParser::Dtag &n, boost::any param/*should be ContentObject* */)
+  virtual void visit (CcnbParser::Dtag &n, boost::any param/*should be Data* */)
   {
     // uint32_t n.m_dtag;
     // std::list< Ptr<CcnbParser::Block> > n.m_nestedBlocks;
@@ -349,11 +349,11 @@
     static CcnbParser::Uint32tBlobVisitor uint32tBlobVisitor;
     static CcnbParser::ContentTypeVisitor contentTypeVisitor;
 
-    ndn::ContentObject &contentObject = *(boost::any_cast<ndn::ContentObject*> (param));
+    ndn::Data &contentObject = *(boost::any_cast<ndn::Data*> (param));
 
     switch (n.m_dtag)
       {
-      case CcnbParser::CCN_DTAG_ContentObject:
+      case CcnbParser::CCN_DTAG_Data:
         // process nested blocks
         BOOST_FOREACH (Ptr<CcnbParser::Block> block, n.m_nestedTags)
           {
@@ -482,7 +482,7 @@
 uint32_t
 Data::Deserialize (Buffer::Iterator start)
 {
-  static ContentObjectVisitor contentObjectVisitor;
+  static DataVisitor contentObjectVisitor;
 
   Buffer::Iterator i = start;
   Ptr<CcnbParser::Block> root = CcnbParser::Block::ParseBlock (i);
@@ -495,7 +495,7 @@
 Data::Print (std::ostream &os) const
 {
   os << "D: " << m_data->GetName ();
-  // os << "<ContentObject><Name>" << GetName () << "</Name><Content>";
+  // os << "<Data><Name>" << GetName () << "</Name><Content>";
 }
 
 } // ccnb
diff --git a/model/wire/ndn-wire.cc b/model/wire/ndn-wire.cc
index b9164e4..ad8966f 100644
--- a/model/wire/ndn-wire.cc
+++ b/model/wire/ndn-wire.cc
@@ -113,7 +113,7 @@
 }
 
 Ptr<Packet>
-Wire::FromData (Ptr<const ContentObject> data, int8_t wireFormat/* = WIRE_FORMAT_DEFAULT*/)
+Wire::FromData (Ptr<const Data> data, int8_t wireFormat/* = WIRE_FORMAT_DEFAULT*/)
 {
   if (wireFormat == WIRE_FORMAT_DEFAULT)
     wireFormat = GetWireFormat ();
@@ -129,7 +129,7 @@
     }
 }
 
-Ptr<ContentObject>
+Ptr<Data>
 Wire::ToData (Ptr<Packet> packet, int8_t wireFormat/* = WIRE_FORMAT_AUTODETECT*/)
 {
   if (wireFormat == WIRE_FORMAT_AUTODETECT)
@@ -198,7 +198,7 @@
 }
 
 std::string
-Wire::FromDataStr (Ptr<const ContentObject> data, int8_t wireFormat/* = WIRE_FORMAT_DEFAULT*/)
+Wire::FromDataStr (Ptr<const Data> data, int8_t wireFormat/* = WIRE_FORMAT_DEFAULT*/)
 {
   Ptr<Packet> pkt = FromData (data, wireFormat);
   std::string wire;
@@ -208,7 +208,7 @@
   return wire;
 }
 
-Ptr<ContentObject>
+Ptr<Data>
 Wire::ToDataStr (const std::string &wire, int8_t type/* = WIRE_FORMAT_AUTODETECT*/)
 {
   Ptr<Packet> pkt = Create<Packet> (reinterpret_cast<const uint8_t*> (&wire[0]), wire.size ());
diff --git a/model/wire/ndn-wire.h b/model/wire/ndn-wire.h
index 768ccea..1bfba3d 100644
--- a/model/wire/ndn-wire.h
+++ b/model/wire/ndn-wire.h
@@ -38,9 +38,9 @@
   ToInterest (Ptr<Packet> packet, int8_t type = WIRE_FORMAT_AUTODETECT);
 
   static Ptr<Packet>
-  FromData (Ptr<const ContentObject> data, int8_t wireFormat = WIRE_FORMAT_DEFAULT);
+  FromData (Ptr<const Data> data, int8_t wireFormat = WIRE_FORMAT_DEFAULT);
 
-  static Ptr<ContentObject>
+  static Ptr<Data>
   ToData (Ptr<Packet> packet, int8_t type = WIRE_FORMAT_AUTODETECT);
 
 
@@ -52,9 +52,9 @@
   ToInterestStr (const std::string &wire, int8_t type = WIRE_FORMAT_AUTODETECT);
 
   static std::string
-  FromDataStr (Ptr<const ContentObject> data, int8_t wireFormat = WIRE_FORMAT_DEFAULT);
+  FromDataStr (Ptr<const Data> data, int8_t wireFormat = WIRE_FORMAT_DEFAULT);
 
-  static Ptr<ContentObject>
+  static Ptr<Data>
   ToDataStr (const std::string &wire, int8_t type = WIRE_FORMAT_AUTODETECT);
 
   // /*
diff --git a/model/wire/ndnsim.cc b/model/wire/ndnsim.cc
index 1c2d778..f1bbaf5 100644
--- a/model/wire/ndnsim.cc
+++ b/model/wire/ndnsim.cc
@@ -215,29 +215,29 @@
   
 
 Data::Data ()
-  : m_data (Create<ndn::ContentObject> ())
+  : m_data (Create<ndn::Data> ())
 {
 }
 
-Data::Data (Ptr<ndn::ContentObject> data)
+Data::Data (Ptr<ndn::Data> data)
   : m_data (data)
 {
 }
 
-Ptr<ndn::ContentObject>
+Ptr<ndn::Data>
 Data::GetData ()
 {
   return m_data;
 }
 
 Ptr<Packet>
-Data::ToWire (Ptr<const ndn::ContentObject> data)
+Data::ToWire (Ptr<const ndn::Data> data)
 {
   Ptr<const Packet> p = data->GetWire ();
   if (!p)
     {
       Ptr<Packet> packet = Create<Packet> (*data->GetPayload ());
-      Data wireEncoding (ConstCast<ndn::ContentObject> (data));
+      Data wireEncoding (ConstCast<ndn::Data> (data));
       packet->AddHeader (wireEncoding);
       data->SetWire (packet);
 
@@ -247,10 +247,10 @@
   return p->Copy ();
 }
 
-Ptr<ndn::ContentObject>
+Ptr<ndn::Data>
 Data::FromWire (Ptr<Packet> packet)
 {
-  Ptr<ndn::ContentObject> data = Create<ndn::ContentObject> ();
+  Ptr<ndn::Data> data = Create<ndn::Data> ();
   data->SetWire (packet->Copy ());
 
   Data wireEncoding (data);
@@ -315,10 +315,10 @@
   Buffer::Iterator i = start;
 
   if (i.ReadU8 () != 0x80)
-    throw new ContentObjectException ();
+    throw new DataException ();
 
   if (i.ReadU8 () != 0x01)
-    throw new ContentObjectException ();
+    throw new DataException ();
 
   i.ReadU16 (); // length
 
@@ -326,36 +326,36 @@
   if (signatureLength == 6)
     {
       if (i.ReadU16 () != 0xFF00) // signature type
-        throw new ContentObjectException ();
+        throw new DataException ();
       m_data->SetSignature (i.ReadU32 ());
     }
   else if (signatureLength == 2)
     {
       if (i.ReadU16 () != 0) // signature type
-        throw new ContentObjectException ();
+        throw new DataException ();
       m_data->SetSignature (0);
     }
   else
-    throw new ContentObjectException ();
+    throw new DataException ();
 
   m_data->SetName (NdnSim::DeserializeName (i));
 
   if (i.ReadU16 () != (2 + 4 + 2 + 2 + (2 + 0))) // content length
-    throw new ContentObjectException ();
+    throw new DataException ();
 
   if (i.ReadU16 () != (4 + 2 + 2 + (2 + 0))) // Length (content Info)
-    throw new ContentObjectException ();
+    throw new DataException ();
 
   m_data->SetTimestamp (Seconds (i.ReadU32 ()));
   m_data->SetFreshness (Seconds (i.ReadU16 ()));
 
   if (i.ReadU16 () != 0) // Reserved
-    throw new ContentObjectException ();
+    throw new DataException ();
   if (i.ReadU16 () != 0) // Length (ContentInfoOptions)
-    throw new ContentObjectException ();
+    throw new DataException ();
 
   NS_ASSERT_MSG (i.GetDistanceFrom (start) == GetSerializedSize (),
-                 "Something wrong with ContentObject::Deserialize");
+                 "Something wrong with Data::Deserialize");
   
   return i.GetDistanceFrom (start);
 }
diff --git a/model/wire/ndnsim.h b/model/wire/ndnsim.h
index 417edba..f0be388 100644
--- a/model/wire/ndnsim.h
+++ b/model/wire/ndnsim.h
@@ -105,7 +105,7 @@
  *
  * @see http://ndnsim.net/new-packet-formats.html
  *
- *	ContentObject ::= Signature
+ *	Data ::= Signature
  *                	  Name
  *                   	  Content
  *
@@ -136,15 +136,15 @@
 {
 public:
   Data ();
-  Data (Ptr<ndn::ContentObject> data);
+  Data (Ptr<ndn::Data> data);
 
-  Ptr<ndn::ContentObject>
+  Ptr<ndn::Data>
   GetData ();
 
   static Ptr<Packet>
-  ToWire (Ptr<const ndn::ContentObject> data);
+  ToWire (Ptr<const ndn::Data> data);
 
-  static Ptr<ndn::ContentObject>
+  static Ptr<ndn::Data>
   FromWire (Ptr<Packet> packet);
   
   // from Header
@@ -156,7 +156,7 @@
   virtual uint32_t Deserialize (Buffer::Iterator start);
 
 private:
-  Ptr<ndn::ContentObject> m_data;  
+  Ptr<ndn::Data> m_data;  
 };
 
 } // ndnSIM
