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
